diff --git a/server/plugins-manager.js b/server/plugins-manager.js new file mode 100644 index 00000000..214c5cca --- /dev/null +++ b/server/plugins-manager.js @@ -0,0 +1,38 @@ +const fs = require("fs"); +const { log } = require("../src/util"); + +class PluginsManager { + + pluginList = []; + + /** + * Plugins Dir + */ + pluginsDir; + + constructor(dir) { + this.pluginsDir = dir; + + if (! fs.existsSync(this.pluginsDir)) { + fs.mkdirSync(this.pluginsDir, { recursive: true }); + } + + let list = fs.readdirSync(this.pluginsDir); + + this.pluginList = []; + for (let item of list) { + let indexFile = this.pluginsDir + item + "/index.js"; + + if (fs.existsSync(indexFile)) { + this.pluginList.push(require(indexFile)); + log.debug("plugin", indexFile); + log.info("plugin", `${item} loaded`); + } + } + } + +} + +module.exports = { + PluginsManager +}; diff --git a/server/server.js b/server/server.js index 2a4a5a4d..36075a93 100644 --- a/server/server.js +++ b/server/server.js @@ -153,6 +153,8 @@ let needSetup = false; Database.init(args); await initDatabase(testMode); + server.loadPlugins(Database.dataDir + "plugins/"); + exports.entryPage = await setting("entryPage"); await StatusPage.loadDomainMappingList(); diff --git a/server/uptime-kuma-server.js b/server/uptime-kuma-server.js index 605ba533..483d7920 100644 --- a/server/uptime-kuma-server.js +++ b/server/uptime-kuma-server.js @@ -7,6 +7,7 @@ const { R } = require("redbean-node"); const { log } = require("../src/util"); const Database = require("./database"); const util = require("util"); +const { PluginsManager } = require("./plugins-manager"); /** * `module.exports` (alias: `server`) should be inside this class, in order to avoid circular dependency issue. @@ -35,6 +36,12 @@ class UptimeKumaServer { */ indexHTML = ""; + /** + * Plugins Manager + * @type {PluginsManager} + */ + pluginsManager = null; + static getInstance(args) { if (UptimeKumaServer.instance == null) { UptimeKumaServer.instance = new UptimeKumaServer(args); @@ -126,6 +133,11 @@ class UptimeKumaServer { errorLogStream.end(); } + + loadPlugins(dir) { + this.pluginsManager = new PluginsManager(dir); + } + } module.exports = {