diff --git a/index.js b/index.js index d51ce4b2..9a0be347 100644 --- a/index.js +++ b/index.js @@ -13,7 +13,6 @@ if (isDev) { if (devEnv.SkipBinariesCheck) process.env.SKIP_BINARIES_CHECK = '1' if (devEnv.AllowIframe) process.env.ALLOW_IFRAME = '1' if (devEnv.BackupPath) process.env.BACKUP_PATH = devEnv.BackupPath - if (devEnv.PluginsPath) process.env.PLUGINS_PATH = devEnv.PluginsPath process.env.SOURCE = 'local' process.env.ROUTER_BASE_PATH = devEnv.RouterBasePath || '' } @@ -22,11 +21,10 @@ const PORT = process.env.PORT || 80 const HOST = process.env.HOST const CONFIG_PATH = process.env.CONFIG_PATH || '/config' const METADATA_PATH = process.env.METADATA_PATH || '/metadata' -const PLUGINS_PATH = process.env.PLUGINS_PATH || '/plugins' const SOURCE = process.env.SOURCE || 'docker' const ROUTER_BASE_PATH = process.env.ROUTER_BASE_PATH || '' console.log('Config', CONFIG_PATH, METADATA_PATH) -const Server = new server(SOURCE, PORT, HOST, CONFIG_PATH, METADATA_PATH, PLUGINS_PATH, ROUTER_BASE_PATH) +const Server = new server(SOURCE, PORT, HOST, CONFIG_PATH, METADATA_PATH, ROUTER_BASE_PATH) Server.start() diff --git a/prod.js b/prod.js index 4d09a4f5..6520d317 100644 --- a/prod.js +++ b/prod.js @@ -1,7 +1,6 @@ const optionDefinitions = [ { name: 'config', alias: 'c', type: String }, { name: 'metadata', alias: 'm', type: String }, - { name: 'plugins', alias: 'l', type: String }, { name: 'port', alias: 'p', type: String }, { name: 'host', alias: 'h', type: String }, { name: 'source', alias: 's', type: String } @@ -19,18 +18,16 @@ global.appRoot = __dirname const inputConfig = options.config ? Path.resolve(options.config) : null const inputMetadata = options.metadata ? Path.resolve(options.metadata) : null -const inputPlugins = options.plugins ? Path.resolve(options.plugins) : null const PORT = options.port || process.env.PORT || 3333 const HOST = options.host || process.env.HOST const CONFIG_PATH = inputConfig || process.env.CONFIG_PATH || Path.resolve('config') const METADATA_PATH = inputMetadata || process.env.METADATA_PATH || Path.resolve('metadata') -const PLUGINS_PATH = inputPlugins || process.env.PLUGINS_PATH || Path.resolve('plugins') const SOURCE = options.source || process.env.SOURCE || 'debian' const ROUTER_BASE_PATH = process.env.ROUTER_BASE_PATH || '' console.log(process.env.NODE_ENV, 'Config', CONFIG_PATH, METADATA_PATH) -const Server = new server(SOURCE, PORT, HOST, CONFIG_PATH, METADATA_PATH, PLUGINS_PATH, ROUTER_BASE_PATH) +const Server = new server(SOURCE, PORT, HOST, CONFIG_PATH, METADATA_PATH, ROUTER_BASE_PATH) Server.start() diff --git a/server/Server.js b/server/Server.js index 837eab20..a707958a 100644 --- a/server/Server.js +++ b/server/Server.js @@ -44,7 +44,7 @@ const expressSession = require('express-session') const MemoryStore = require('./libs/memorystore') class Server { - constructor(SOURCE, PORT, HOST, CONFIG_PATH, METADATA_PATH, PLUGINS_PATH, ROUTER_BASE_PATH) { + constructor(SOURCE, PORT, HOST, CONFIG_PATH, METADATA_PATH, ROUTER_BASE_PATH) { this.Port = PORT this.Host = HOST global.Source = SOURCE @@ -52,7 +52,6 @@ class Server { global.ConfigPath = fileUtils.filePathToPOSIX(Path.normalize(CONFIG_PATH)) global.MetadataPath = fileUtils.filePathToPOSIX(Path.normalize(METADATA_PATH)) global.RouterBasePath = ROUTER_BASE_PATH - global.PluginsPath = fileUtils.filePathToPOSIX(Path.normalize(PLUGINS_PATH)) global.XAccel = process.env.USE_X_ACCEL global.AllowCors = process.env.ALLOW_CORS === '1' global.DisableSsrfRequestFilter = process.env.DISABLE_SSRF_REQUEST_FILTER === '1' diff --git a/server/managers/PluginManager.js b/server/managers/PluginManager.js index 93fd15c4..1999eb83 100644 --- a/server/managers/PluginManager.js +++ b/server/managers/PluginManager.js @@ -3,6 +3,7 @@ const Logger = require('../Logger') const Database = require('../Database') const PluginAbstract = require('../PluginAbstract') const fs = require('fs').promises +const fsExtra = require('../libs/fsExtra') /** * @typedef PluginContext @@ -15,6 +16,10 @@ class PluginManager { this.plugins = [] } + get pluginMetadataPath() { + return Path.posix.join(global.MetadataPath, 'plugins') + } + get pluginData() { return this.plugins.map((plugin) => plugin.manifest) } @@ -35,7 +40,7 @@ class PluginManager { * @returns {Promise<{manifest: Object, contents: PluginAbstract}>} */ async loadPlugin(pluginPath) { - const pluginFiles = await fs.readdir(pluginPath, { withFileTypes: true }).then((files) => files.filter((file) => !file.isDirectory())) + const pluginFiles = await fsExtra.readdir(pluginPath, { withFileTypes: true }).then((files) => files.filter((file) => !file.isDirectory())) if (!pluginFiles.length) { Logger.error(`No files found in plugin ${pluginPath}`) @@ -54,7 +59,7 @@ class PluginManager { let manifestJson = null try { - manifestJson = await fs.readFile(Path.join(pluginPath, manifestFile.name), 'utf8').then((data) => JSON.parse(data)) + manifestJson = await fsExtra.readFile(Path.join(pluginPath, manifestFile.name), 'utf8').then((data) => JSON.parse(data)) } catch (error) { Logger.error(`Error parsing manifest file for plugin ${pluginPath}`, error) return null @@ -82,11 +87,13 @@ class PluginManager { } async loadPlugins() { - const pluginDirs = await fs.readdir(global.PluginsPath, { withFileTypes: true, recursive: true }).then((files) => files.filter((file) => file.isDirectory())) + await fsExtra.ensureDir(this.pluginMetadataPath) + + const pluginDirs = await fsExtra.readdir(this.pluginMetadataPath, { withFileTypes: true, recursive: true }).then((files) => files.filter((file) => file.isDirectory())) for (const pluginDir of pluginDirs) { Logger.info(`[PluginManager] Loading plugin ${pluginDir.name}`) - const plugin = await this.loadPlugin(Path.join(global.PluginsPath, pluginDir.name)) + const plugin = await this.loadPlugin(Path.join(this.pluginMetadataPath, pluginDir.name)) if (plugin) { Logger.info(`[PluginManager] Loaded plugin ${plugin.manifest.name}`) this.plugins.push(plugin) @@ -152,7 +159,7 @@ class PluginManager { try { // Try to load the plugin - const pluginPath = Path.join(global.PluginsPath, plugin.name) + const pluginPath = Path.join(this.pluginMetadataPath, plugin.name) const packageContents = require(pluginPath) console.log('packageContents', packageContents) packageContents.init() diff --git a/test/server/managers/plugins/readme.md b/test/server/managers/plugins/readme.md new file mode 100644 index 00000000..e69de29b