cleaner.js 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  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.debug("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. var skinsdir = config.directories.skins;
  72. var capesdir = config.directories.capes;
  73. var facesdir = config.directories.faces;
  74. var helmsdir = config.directories.helms;
  75. var rendersdir = config.directories.renders;
  76. fs.readdir(skinsdir, function(readerr, files) {
  77. if (!readerr) {
  78. for (var i = 0, l = Math.min(files.length, config.cleaner.amount); i < l; i++) {
  79. var filename = files[i];
  80. if (filename[0] !== ".") {
  81. fs.unlink(path.join(facesdir, filename), nil);
  82. fs.unlink(path.join(helmsdir, filename), nil);
  83. fs.unlink(path.join(skinsdir, filename), nil);
  84. }
  85. }
  86. }
  87. });
  88. fs.readdir(rendersdir, function(readerr, files) {
  89. if (!readerr) {
  90. for (var j = 0, l = Math.min(files.length, config.cleaner.amount); j < l; j++) {
  91. var filename = files[j];
  92. if (filename[0] !== ".") {
  93. fs.unlink(rendersdir + filename, nil);
  94. }
  95. }
  96. }
  97. });
  98. fs.readdir(capesdir, function(readerr, files) {
  99. if (!readerr) {
  100. for (var j = 0, l = Math.min(files.length, config.cleaner.amount); j < l; j++) {
  101. var filename = files[j];
  102. if (filename[0] !== ".") {
  103. fs.unlink(capesdir + filename, nil);
  104. }
  105. }
  106. }
  107. });
  108. } else {
  109. logging.debug("DiskCleaner: Nothing to clean");
  110. }
  111. });
  112. };
  113. module.exports = exp;