cleaner.js 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  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. logging.debug("used mem:" + info.used_memory);
  21. var used = parseInt(info.used_memory) / 1024;
  22. logging.log("RedisCleaner:", used + "KB used");
  23. callback(err, used >= config.cleaning_redis_limit);
  24. } catch(e) {
  25. callback(e, false);
  26. }
  27. }
  28. });
  29. }
  30. // uses `df` to get the available fisk space
  31. // callback: error, true|false
  32. function should_clean_disk(callback) {
  33. df({
  34. file: path.join(__dirname, "..", config.faces_dir),
  35. prefixMultiplier: "KiB",
  36. isDisplayPrefixMultiplier: false,
  37. precision: 2
  38. }, function (err, response) {
  39. if (err) {
  40. callback(err, false);
  41. } else {
  42. var available = response[0].available;
  43. logging.log("DiskCleaner:", available + "KB available");
  44. callback(err, available < config.cleaning_disk_limit);
  45. }
  46. });
  47. }
  48. // check if redis limit reached, then flush redis
  49. // check if disk limit reached, then delete images
  50. exp.run = function() {
  51. should_clean_redis(function(err, clean) {
  52. if (err) {
  53. logging.error("Failed to run RedisCleaner");
  54. logging.error(err);
  55. } else if (clean) {
  56. logging.warn("RedisCleaner: Redis limit reached! flushing now");
  57. redis.flushall();
  58. } else {
  59. logging.log("RedisCleaner: Nothing to clean");
  60. }
  61. });
  62. should_clean_disk(function(err, clean) {
  63. if (err) {
  64. logging.error("Failed to run DiskCleaner");
  65. logging.error(err);
  66. } else if (clean) {
  67. logging.warn("DiskCleaner: Disk limit reached! Cleaning images now");
  68. var facesdir = path.join(__dirname, "..", config.faces_dir);
  69. var helmdir = path.join(__dirname, "..", config.helms_dir);
  70. var renderdir = path.join(__dirname, "..", config.renders_dir);
  71. var skindir = path.join(__dirname, "..", config.skins_dir);
  72. fs.readdir(facesdir, function (readerr, files) {
  73. if (!readerr) {
  74. for (var i = 0, l = Math.min(files.length, config.cleaning_amount); i < l; i++) {
  75. var filename = files[i];
  76. if (filename[0] !== ".") {
  77. fs.unlink(path.join(facesdir, filename), nil);
  78. fs.unlink(path.join(helmdir, filename), nil);
  79. fs.unlink(path.join(skindir, filename), nil);
  80. }
  81. }
  82. }
  83. });
  84. fs.readdir(renderdir, function (readerr, files) {
  85. if (!readerr) {
  86. for (var j = 0, l = Math.min(files.length, config.cleaning_amount); j < l; j++) {
  87. var filename = files[j];
  88. if (filename[0] !== ".") {
  89. fs.unlink(renderdir + filename, nil);
  90. }
  91. }
  92. }
  93. });
  94. } else {
  95. logging.log("DiskCleaner: Nothing to clean");
  96. }
  97. });
  98. };
  99. module.exports = exp;