From 960326ab40754351c5eba386765a01340cbc2b50 Mon Sep 17 00:00:00 2001 From: si458 Date: Tue, 10 Jun 2025 18:01:42 +0100 Subject: [PATCH] remove semver dependency for plugins Signed-off-by: si458 --- docker/Dockerfile | 2 +- docker/README.md | 2 +- meshcentral.js | 1 - pluginHandler.js | 36 ++++++++++++++++++++++++++++++++---- 4 files changed, 34 insertions(+), 7 deletions(-) diff --git a/docker/Dockerfile b/docker/Dockerfile index b5954c4c..cf0dc2ac 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -121,7 +121,7 @@ RUN case "$PREINSTALL_LIBS" in \ true|yes|TRUE|YES) \ cd meshcentral && \ echo -e "----------\nPREINSTALLING LIBRARIES...\n----------"; \ - npm install ssh2@1.16.0 semver@7.7.1 nodemailer@6.10.0 image-size@2.0.1 wildleek@2.0.0 otplib@12.0.1 yubikeyotp@0.2.0;; \ + npm install ssh2@1.16.0 nodemailer@6.10.0 image-size@2.0.1 wildleek@2.0.0 otplib@12.0.1 yubikeyotp@0.2.0;; \ false|no|FALSE|NO) \ echo "Not pre-installing libraries.";; \ *) \ diff --git a/docker/README.md b/docker/README.md index c0e66f8d..8a78ba57 100644 --- a/docker/README.md +++ b/docker/README.md @@ -174,7 +174,7 @@ The following build arguments are available for customizing the build process: - **INCLUDE_MONGODB_TOOLS**: Include MongoDB client and related tools. - **INCLUDE_POSTGRESQL_TOOLS**: Include PostgreSQL client tools. - **INCLUDE_MARIADB_TOOLS**: Include MariaDB/MySQL client tools. -- **PREINSTALL_LIBS**: Pre-install specific libraries like `ssh2`, `semver`, `nodemailer`, etc. +- **PREINSTALL_LIBS**: Pre-install specific libraries like `ssh2`, `nodemailer`, etc. ### Build Commands with Arguments diff --git a/meshcentral.js b/meshcentral.js index 93002666..12a57e41 100644 --- a/meshcentral.js +++ b/meshcentral.js @@ -4311,7 +4311,6 @@ function mainStart() { if (config.settings.acebase != null) { modules.push('acebase@1.29.5'); } // Add AceBase, official driver. if (config.settings.sqlite3 != null) { modules.push('sqlite3@5.1.7'); } // Add sqlite3, official driver. if (config.settings.vault != null) { modules.push('node-vault@0.10.2'); } // Add official HashiCorp's Vault module. - if ((config.settings.plugins != null) && (config.settings.plugins != false) && ((typeof config.settings.plugins != 'object') || (config.settings.plugins.enabled != false))) { modules.push('semver@7.7.1'); } // Required for version compat testing and update checks if ((config.settings.plugins != null) && (config.settings.plugins.proxy != null)) { modules.push('https-proxy-agent@7.0.2'); } // Required for HTTP/HTTPS proxy support else if (config.settings.xmongodb != null) { modules.push('mongojs@3.1.0'); } // Add MongoJS, old driver. if (nodemailer || ((config.smtp != null) && (config.smtp.name != 'console')) || (config.sendmail != null)) { modules.push('nodemailer@6.9.16'); } // Add SMTP support diff --git a/pluginHandler.js b/pluginHandler.js index 52f3753f..25171596 100644 --- a/pluginHandler.js +++ b/pluginHandler.js @@ -286,6 +286,36 @@ module.exports.pluginHandler = function (parent) { return true; } + obj.versionGreater = function(a, b) { + a = obj.versionToNumber(String(a).replace(/^v/, '')); + b = obj.versionToNumber(String(b).replace(/^v/, '')); + const partsA = a.split('.').map(Number); + const partsB = b.split('.').map(Number); + + for (let i = 0; i < Math.max(partsA.length, partsB.length); i++) { + const numA = partsA[i] || 0; + const numB = partsB[i] || 0; + if (numA > numB) return true; + if (numA < numB) return false; + } + return false; + }; + + obj.versionLower = function(a, b) { + a = obj.versionToNumber(String(a).replace(/^v/, '')); + b = obj.versionToNumber(String(b).replace(/^v/, '')); + const partsA = a.split('.').map(Number); + const partsB = b.split('.').map(Number); + + for (let i = 0; i < Math.max(partsA.length, partsB.length); i++) { + const numA = partsA[i] || 0; + const numB = partsB[i] || 0; + if (numA < numB) return true; + if (numA > numB) return false; + } + return false; + }; + obj.getPluginLatest = function () { return new Promise(function (resolve, reject) { parent.db.getPlugins(function (err, plugins) { @@ -305,12 +335,11 @@ module.exports.pluginHandler = function (parent) { if (conf.configUrl == newconf.configUrl) curconf = conf; }); if (curconf == null) reject("Some plugin configs could not be parsed"); - var s = require('semver'); latestRet.push({ 'id': curconf._id, 'installedVersion': curconf.version, 'version': newconf.version, - 'hasUpdate': s.gt(newconf.version, curconf.version), + 'hasUpdate': obj.versionGreater(newconf.version, curconf.version), 'meshCentralCompat': obj.versionCompare(parent.currentVer, newconf.meshCentralCompat), 'changelogUrl': curconf.changelogUrl, 'status': curconf.status @@ -484,9 +513,8 @@ module.exports.pluginHandler = function (parent) { try { var vers = JSON.parse(versStr); var vList = []; - var s = require('semver'); vers.forEach((v) => { - if (s.lt(v.name, plugin.version)) vList.push(v); + if (obj.versionLower(v.name, plugin.version)) vList.push(v); }); if (vers.length == 0) reject("No previous versions available."); resolve({ 'id': plugin._id, 'name': plugin.name, versionList: vList });