UNPKG

file-stream-rotator

Version:

Automated stream rotation useful for log files

105 lines (104 loc) 4.32 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const fs = require("fs"); const path = require("path"); const enums_1 = require("./enums"); const helper_1 = require("./helper"); const crypto = require("crypto"); class AuditManager { constructor(config, emitter) { this.config = config; this.emitter = emitter; this.loadLog(); } loadLog() { var _a; if (!this.config.keepSettings || ((_a = this.config.keepSettings) === null || _a === void 0 ? void 0 : _a.amount) == 0 || !this.config.auditFilename || this.config.auditFilename == "") { helper_1.Logger.verbose("no existing audit settings found", this.config); return; } // Logger.debug("loaded audit settings", this.config) try { let full_path = path.resolve(this.config.auditFilename); let savedFile = JSON.parse(fs.readFileSync(full_path, { encoding: 'utf-8' })); this.config.files = savedFile.files; } catch (e) { if (e.code !== "ENOENT") { helper_1.Logger.log("Failed to load config file", e); return; } } } writeLog() { if (!this.config.auditFilename) { return; } try { (0, helper_1.makeDirectory)(this.config.auditFilename); fs.writeFileSync(this.config.auditFilename, JSON.stringify(this.config, null, 4)); } catch (e) { helper_1.Logger.verbose("ERROR: Failed to store log audit", e); } } addLog(name) { var _a; if (!this.config.keepSettings || ((_a = this.config.keepSettings) === null || _a === void 0 ? void 0 : _a.amount) == 0 || !this.config.auditFilename || this.config.auditFilename == "") { helper_1.Logger.verbose("audit log missing"); return; } if (this.config.files.findIndex((file) => { return file.name === name; }) !== -1) { helper_1.Logger.debug("file already in the log", name); return; } var time = Date.now(); this.config.files.push({ date: time, name: name, hash: crypto.createHash(this.config.hashType).update(name + "LOG_FILE" + time).digest("hex") }); helper_1.Logger.debug(`added file ${name} to log`); if (this.config.keepSettings && this.config.keepSettings.amount) { if (this.config.keepSettings.type == enums_1.KeepLogFiles.days) { let date = Date.now() - 86400 * this.config.keepSettings.amount * 1000; let files = this.config.files.filter((logEntry) => { if (logEntry.date >= date) { return true; } this.removeLog(logEntry); }); this.config.files = files; } else if (this.config.files.length > this.config.keepSettings.amount) { var filesToKeep = this.config.files.splice(-this.config.keepSettings.amount); if (this.config.files.length > 0) { this.config.files.filter((logEntry) => { this.removeLog(logEntry); return false; }); } this.config.files = filesToKeep; } } this.writeLog(); } removeLog(logEntry) { if (logEntry.hash === crypto.createHash(this.config.hashType).update(logEntry.name + "LOG_FILE" + logEntry.date).digest("hex")) { try { if (fs.existsSync(logEntry.name)) { helper_1.Logger.debug("removing log file", logEntry.name); fs.unlinkSync(logEntry.name); this.emitter.emit("logRemoved", logEntry.name); } } catch (e) { helper_1.Logger.verbose("Could not remove old log file: ", logEntry.name); } } else { helper_1.Logger.debug("incorrect hash", logEntry.name, logEntry.hash, crypto.createHash(this.config.hashType).update(logEntry.name + "LOG_FILE" + logEntry.date).digest("hex")); } } } exports.default = AuditManager;