cleaner.js 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. var logging = require("./logging");
  2. var config = require("../config");
  3. var cache = require("./cache");
  4. var path = require("path");
  5. var df = require("node-df");
  6. var fs = require("fs");
  7. var redis = cache.get_redis();
  8. var exp = {};
  9. // does nothing
  10. function nil() {}
  11. // compares redis' used_memory with cleaning_redis_limit
  12. // callback: error, true|false
  13. function should_clean_redis(callback) {
  14. cache.info(function(err, info) {
  15. if (err) {
  16. callback(err, false);
  17. } else {
  18. try {
  19. // logging.debug(info.toString());
  20. var used = parseInt(info.used_memory) / 1024;
  21. var result = used >= config.cleaner.redis_limit;
  22. var msg = "RedisCleaner: " + used + "KB used";
  23. (result ? logging.log : logging.debug)(msg);
  24. callback(err, result);
  25. } catch(e) {
  26. callback(e, false);
  27. }
  28. }
  29. });
  30. }
  31. // uses `df` to get the available fisk space
  32. // callback: error, true|false
  33. function should_clean_disk(callback) {
  34. df({
  35. file: config.directories.faces,
  36. prefixMultiplier: "KiB",
  37. isDisplayPrefixMultiplier: false,
  38. precision: 2
  39. }, function(err, response) {
  40. if (err) {
  41. callback(err, false);
  42. } else {
  43. var available = response[0].available;
  44. var result = available < config.cleaner.disk_limit;
  45. var msg = "DiskCleaner: " + available + "KB available";
  46. (result ? logging.log : logging.debug)(msg);
  47. callback(err, result);
  48. }
  49. });
  50. }
  51. // check if redis limit reached, then flush redis
  52. // check if disk limit reached, then delete images
  53. exp.run = function() {
  54. should_clean_redis(function(err, clean) {
  55. if (err) {
  56. logging.error("Failed to run RedisCleaner");
  57. logging.error(err);
  58. } else if (clean) {
  59. logging.warn("RedisCleaner: Redis limit reached! flushing now");
  60. redis.flushall();
  61. } else {
  62. logging.log("RedisCleaner: Nothing to clean");
  63. }
  64. });
  65. should_clean_disk(function(err, clean) {
  66. if (err) {
  67. logging.error("Failed to run DiskCleaner");
  68. logging.error(err);
  69. } else if (clean) {
  70. logging.warn("DiskCleaner: Disk limit reached! Cleaning images now");
  71. // hotfix for #139 | FIXME
  72. logging.warn("DiskCleaner: Flushing Redis to prevent ENOENT");
  73. redis.flushall();
  74. // end hotfix
  75. var skinsdir = config.directories.skins;
  76. var capesdir = config.directories.capes;
  77. var facesdir = config.directories.faces;
  78. var helmsdir = config.directories.helms;
  79. var rendersdir = config.directories.renders;
  80. fs.readdir(skinsdir, function(readerr, files) {
  81. if (!readerr) {
  82. for (var i = 0, l = Math.min(files.length, config.cleaner.amount); i < l; i++) {
  83. var filename = files[i];
  84. if (filename[0] !== ".") {
  85. fs.unlink(path.join(facesdir, filename), nil);
  86. fs.unlink(path.join(helmsdir, filename), nil);
  87. fs.unlink(path.join(skinsdir, filename), nil);
  88. }
  89. }
  90. }
  91. });
  92. fs.readdir(rendersdir, function(readerr, files) {
  93. if (!readerr) {
  94. for (var j = 0, l = Math.min(files.length, config.cleaner.amount); j < l; j++) {
  95. var filename = files[j];
  96. if (filename[0] !== ".") {
  97. fs.unlink(rendersdir + filename, nil);
  98. }
  99. }
  100. }
  101. });
  102. fs.readdir(capesdir, function(readerr, files) {
  103. if (!readerr) {
  104. for (var j = 0, l = Math.min(files.length, config.cleaner.amount); j < l; j++) {
  105. var filename = files[j];
  106. if (filename[0] !== ".") {
  107. fs.unlink(capesdir + filename, nil);
  108. }
  109. }
  110. }
  111. });
  112. } else {
  113. logging.log("DiskCleaner: Nothing to clean");
  114. }
  115. });
  116. };
  117. module.exports = exp;