From d895e400ef3d4c951fe7f19551653ae6d15108fd Mon Sep 17 00:00:00 2001 From: teddit Date: Fri, 26 Nov 2021 21:33:12 +0100 Subject: [PATCH] rewrite the cache control script --- cacheControl.js | 78 ++++++++++++---------------------------------- config.js.template | 3 +- 2 files changed, 21 insertions(+), 60 deletions(-) diff --git a/cacheControl.js b/cacheControl.js index 26362bc..4893a75 100644 --- a/cacheControl.js +++ b/cacheControl.js @@ -1,66 +1,28 @@ module.exports.removeCacheFiles = function() { - const fs = require('fs') - const config = require('./config') - const pics = './static/pics' - const flairs = './static/pics/flairs' - const icons = './static/pics/icons' - const thumbs = './static/pics/thumbs' - const vids = './static/vids' - let util = require('util') - let spawn = require('child_process').spawn - - let usage - const limit = config.cache_max_size - - function getUsage() { - return new Promise((resolve, reject) => { - let size = spawn('du', ['-sBM', './static/']) - size.stdout.on('data', function (data) { - data = data.toString() - let lines = data.split('\n') - if(lines) { - for(let i = lines.length; i >= 0; i--) { - if(lines[i] && lines[i].includes('./static/')) { - usage = parseInt(lines[i]) - } - } - } - resolve(usage) - }) - }) + const config = require('./config'); + + async function deleteStatic() { + const fs = require('fs'); + const pics = './static/pics/'; + const vids = './static/vids/'; + + fs.rmdir(pics, { recursive: true, force: true }, () => { + fs.rmdir(vids, { recursive: true, force: true }, () => { + ['pics/thumbs', 'pics/flairs', 'pics/icons', 'vids'].map((d) => `./static/${d}`) + .filter((d) => !fs.existsSync(d)) + .forEach((d) => fs.mkdirSync(d, { recursive: true })); + + console.log('Cleared cached static media files. You can turn this off by setting the config.cache_control to false.'); + }); + }); } - function deleteFiles() { - return new Promise(async (resolve, reject) => { - usage = await getUsage() - if(usage > limit) { - const { exec } = require('child_process') - exec(`cd ${pics} && ls -1btr -Iflairs -Iicons -Ithumbs -I.gitignore | head -50 | xargs rm -f --`) - exec(`cd ${flairs} && ls -1btr -I.gitignore | head -6 | xargs rm -f --`) - exec(`cd ${icons} && ls -1btr -I.gitignore | head -6 | xargs rm -f --`) - exec(`cd ${thumbs} && ls -1btr -I.gitignore | head -80 | xargs rm -f --`) - exec(`cd ${vids} && ls -1btr -I.gitignore | head -2 | xargs rm -f --`) - } - resolve(1) - }) - } - - async function main() { - usage = await getUsage() - if(usage > limit) { - console.log('Started removeCacheFiles()') - while(usage > limit) { - await deleteFiles() - } - } - } - - if(config.cache_control) { - main() + if(config.cache_control) { + deleteStatic(); const interval_ms = config.cache_control_interval setInterval(() => { - main() - }, interval_ms) + deleteStatic(); + }, interval_ms); } } diff --git a/config.js.template b/config.js.template index 2ab1eff..6c46fba 100644 --- a/config.js.template +++ b/config.js.template @@ -33,8 +33,7 @@ const config = { ? (JSON.parse(process.env.DOMAIN_REPLACEMENTS).map(([p, r]) => [new RegExp(p, 'gm'), r])) : [], // Replacements for domains in outgoing links. Tuples with regular expressions to match, and replacement values. This is in addition to user-level configuration of privacyDomains. cache_control: process.env.CACHE_CONTROL !== 'true' || true, // If true, teddit will automatically try to keep the size of the cache directory (static) under config.cache_max_size. By default this is set to true. - cache_max_size: process.env.CACHE_MAX_SIZE || 3000, // How much can we cache to the disk? Default is 3000 MB (~3 GB). Note: This is not perfectly exact limit. - cache_control_interval: process.env.CACHE_CONTROL_INTERVAL || 1000 * 60 * 30, // How often the size of the cache directory (static/) is checked. Default is every 30 minutes. + cache_control_interval: process.env.CACHE_CONTROL_INTERVAL || 1000 * 60 * 30, // How often the cached static directory is emptied. Default is every 24 hours minutes. post_media_max_heights: { /** * Sets the max-height value for images and videos in posts.