diff --git a/installmeshcentral.cmd b/installmeshcentral.cmd new file mode 100644 index 00000000..36ba4d2b --- /dev/null +++ b/installmeshcentral.cmd @@ -0,0 +1,3 @@ +@echo off +cd /D %HOMEPATH% +npm install meshcentral node-7z diff --git a/installmeshcentral.sh b/installmeshcentral.sh new file mode 100644 index 00000000..44a3e786 --- /dev/null +++ b/installmeshcentral.sh @@ -0,0 +1,3 @@ +#!/bin/bash +cd ~ +npm install meshcentral --save node-7z diff --git a/installnodejs_7zip.cmd b/installnodejs_7zip.cmd new file mode 100644 index 00000000..9a928224 --- /dev/null +++ b/installnodejs_7zip.cmd @@ -0,0 +1,15 @@ +@echo off +cd /D %HOMEPATH% +reg Query "HKLM\Hardware\Description\System\CentralProcessor\0" | find /i "x86" > NUL && set OS=x86 || set OS=x64 +powershell (new-object System.Net.WebClient).DownloadFile('http://nodejs.org/dist/v9.3.0/node-v9.3.0-%OS%.msi','node-v9.3.0-%OS%.msi') +rem powershell (new-object System.Net.WebClient).DownloadFile('http://downloads.mongodb.org/win32/mongodb-win32-x86_64-2008plus-ssl-3.6.1-signed.msi','mongodb-win32-x86_64-2008plus-ssl-3.6.1-signed.msi') +msiexec /i node-v9.3.0-%OS%.msi /passive /norestart /qn +rem msiexec /i mongodb-win32-x86_64-2008plus-ssl-3.6.1-signed.msi /passive /norestart /qn +del node-v9.3.0-%OS%.msi +rem del mongodb-win32-x86_64-2008plus-ssl-3.6.1-signed.msi +npm install -g win-7zip rem -g letsencrypt-cli +powershell (new-object System.Net.WebClient).DownloadFile('http://www.7-zip.org/a/lzma1604.7z','lzma1604.7z') +7z x lzma1604.7z -olzma1604 +copy /B /Y /V lzma1604\bin\*.sfx AppData\Roaming\npm\node_modules\win-7zip\7zip-lite\ +del lzma1604.7z +rmdir /S /Q lzma1604 diff --git a/installnodejs_7zip.sh b/installnodejs_7zip.sh new file mode 100644 index 00000000..c29ca013 --- /dev/null +++ b/installnodejs_7zip.sh @@ -0,0 +1,42 @@ +#!/bin/bash +cd ~ +sudo -s +if command -v apt-get &> /dev/null; then + #source /etc/lsb-release + #apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 2930ADAE8CAF5059EE73BB4B58712A2291FA4AD5 + #echo "deb http://repo.mongodb.org/apt/$DISTRIB_ID $DISTRIB_CODENAME/mongodb-org/3.6 main" | sudo tee /etc/apt/sources.list.d/mongodb-org-3.6.list + #apt-get install -y mongodb-org + apt-get install -y python-software-properties + curl -sL https://deb.nodesource.com/setup_9.x | bash - + apt-get install -y nodejs p7zip-full + sfxdirectory='/usr/lib/p7zip/' +elif command -v rpm &> /dev/null; then +# echo '[mongodb-org-3.6] +#name=MongoDB Repository +#baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/3.6/x86_64/ +#gpgcheck=1 +#enabled=1 +#gpgkey=https://www.mongodb.org/static/pgp/server-3.6.asc +#' > /etc/yum.repos.d/mongodb-org-3.6.repo + curl -sL https://rpm.nodesource.com/setup_9.x | bash - + version=$(rpm -qa \*-release | grep -Ei "oracle|redhat|centos" | cut -d"-" -f3) + rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-$version.noarch.rpm + sfxdirectory='/usr/libexec/p7zip/' + if command -v dnf &> /dev/null; then + #dnf install -y mongodb-org + dnf install -y nodejs p7zip p7zip-plugins + else + #yum install -y mongodb-org + yum install -y nodejs p7zip p7zip-plugins + fi +fi + +if [ $sfxdirectory != "" ] && command -v 7z &> /dev/null; then + wget -q http://www.7-zip.org/a/lzma1604.7z + 7z x lzma1604.7z -olzma1604 + cp lzma1604/bin/*.sfx $sfxdirectory + rm -f lzma1604.7z + rm -rf lzma1604 +fi + +npm install -g forever #-g letsencrypt-cli diff --git a/meshuser.js b/meshuser.js index 45052214..79cdb1f1 100644 --- a/meshuser.js +++ b/meshuser.js @@ -12,11 +12,60 @@ module.exports.CreateMeshUser = function (parent, db, ws, req, args, domain) { obj.db = db; obj.ws = ws; obj.fs = parent.fs; + obj.path = parent.path; + obj.certificates = parent.certificates; + obj.certificateOperations = require('./certoperations.js').CertificateOperations(); obj.args = args; obj.parent = parent; obj.domain = domain; - obj.common = parent.common; - + obj.common = parent.common; + var sfx = require('node-7z'); + +// Create windows sfx mesh agent + function createSfxMeshAgent(mesh, sfxmeshfile) { + var sfxmodule = '7zS2.sfx'; + var makesfx = new sfx(); + var sfx_ext = EscapeHtml(mesh.name) + '.exe'; + var sfxagent32bit = obj.path.join(__dirname, 'agents', 'MeshService.exe' ); + var sfxagent64bit = obj.path.join(__dirname, 'agents', 'MeshService64.exe' ); + + var sfxagent = obj.path.join(__dirname, 'sfx', 'meshagent_' + sfx_ext); + var sfxagentext = obj.path.join(__dirname, 'sfx', 'meshagent.bat' ); + //var sfxbatfile = "@echo off\r\nreg Query \"HKLM\Hardware\Description\System\CentralProcessor\0\" | find /i 'x86' > NUL && set OS_bit=x86 || set OS_bit=x64\r\nif %OS_bit%=='x86' (\r\n\t rename MeshService.exe meshagent.exe\r\n) else (\r\n\t rename MeshService64.exe meshagent.exe\r\n)\r\nmeshagent.exe\r\n"; + //obj.fs.writeFileSync(sfxagentext, sfxbatfile, 'utf8'); + makesfx.add( sfxagent , [ sfxagentext ,sfxagent32bit, sfxagent64bit, sfxmeshfile ], { sfx: sfxmodule } ) + .then(function () { + mesh.path1 = sfxagent; + mesh.filename1 = 'meshagent_' + sfx_ext; + sfxagent = obj.path.join(__dirname, 'sfx', 'remotesupport_' + sfx_ext); + sfxagentext = obj.path.join(__dirname, 'sfx', 'meshinstall.bat' ); + makesfx.add( sfxagent , [ sfxagentext ,sfxagent32bit, sfxagent64bit, sfxmeshfile ], { sfx: sfxmodule } ) + .then(function () { + mesh.path2 = sfxagent; + mesh.filename2 = 'remotesupport_' + sfx_ext; + sfxagent = obj.path.join(__dirname, 'sfx', 'uninstallremotesupport_' + sfx_ext); + sfxagentext = obj.path.join(__dirname, 'sfx', 'meshuninstall.bat' ); + makesfx.add( sfxagent , [ sfxagentext ,sfxagent32bit, sfxagent64bit, sfxmeshfile ], { sfx: sfxmodule } ) + .then(function () { + mesh.path3 = sfxagent; + mesh.filename3 = 'uninstallremotesupport_' + sfx_ext; + obj.db.Set(mesh); + obj.fs.unlink(sfxmeshfile, (err) => { if (err) console.log(err); }); + }) + .catch(function (err) { + console.error(err); + }); + }) + .catch(function (err) { + console.error(err); + }); + }) + .catch(function (err) { + console.error(err); + }); + // makesfx.add([ 'mesh_' + EscapeHtml(mesh.name) ], [ 'meshagent.sh','meshagent_x86','meshagent_x86-64', sfxmeshfile ], { sfx: '7zCon.sfx' }); + return; + } // Send a message to the user //obj.send = function (data) { try { if (typeof data == 'string') { obj.ws.send(new Buffer(data, 'binary')); } else { obj.ws.send(data); } } catch (e) { } } @@ -427,10 +476,10 @@ module.exports.CreateMeshUser = function (parent, db, ws, req, args, domain) { if ((command.meshtype == 1) || (command.meshtype == 2)) { // Create a type 1 agent-less Intel AMT mesh. obj.parent.crypto.randomBytes(48, function (err, buf) { - var meshid = 'mesh/' + domain.id + '/' + buf.toString('base64').replace(/\+/g, '@').replace(/\//g, '$');; - var links = {} + var meshid = 'mesh/' + domain.id + '/' + buf.toString('base64').replace(/\+/g, '@').replace(/\//g, '$'); + var links = {}; links[user._id] = { name: user.name, rights: 0xFFFFFFFF }; - var mesh = { type: 'mesh', _id: meshid, name: command.meshname, mtype: command.meshtype, desc: command.desc, domain: domain.id, links: links }; + var mesh = { type: 'mesh', _id: meshid, name: command.meshname, mtype: command.meshtype, desc: command.desc, domain: domain.id, links: links, path1: '', filename1: '', path2: '', filename2: '', path3: '', filename3: '' }; obj.db.Set(mesh); obj.parent.meshes[meshid] = mesh; obj.parent.parent.AddEventDispatch([meshid], ws); @@ -439,7 +488,31 @@ module.exports.CreateMeshUser = function (parent, db, ws, req, args, domain) { user.subscriptions = obj.parent.subscribe(user._id, ws); obj.db.SetUser(user); obj.parent.parent.DispatchEvent(['*', meshid, user._id], obj, { etype: 'mesh', username: user.name, meshid: meshid, name: command.meshname, mtype: command.meshtype, desc: command.desc, action: 'createmesh', links: links, msg: 'Mesh created: ' + command.meshname, domain: domain.id }) - }); + + // Create mesh settings file for mesh sfx agent + obj.agentCertificateHashBase64 = new Buffer(obj.certificateOperations.forge.pki.getPublicKeyFingerprint(obj.certificateOperations.forge.pki.certificateFromPem(obj.certificates.agent.cert).publicKey, { md: obj.certificateOperations.forge.md.sha384.create(), encoding: 'binary' }), 'binary').toString('base64').replace(/\+/g, '@').replace(/\//g, '$'); + + if (domain.dns != null) { + var WebServerName = domain.dns; + } else { + var WebServerName = obj.certificates.CommonName; + } + + var meshidhex = new Buffer(meshid.replace(/\@/g, '+').replace(/\$/g, '/'), 'base64').toString('hex').toUpperCase(); + var serveridhex = new Buffer(obj.agentCertificateHashBase64.replace(/\@/g, '+').replace(/\$/g, '/'), 'base64').toString('hex').toUpperCase(); + var xdomain = (domain.dns == null) ? domain.id : ''; + if (xdomain != '') xdomain += "/"; + var meshsettings = "MeshName=" + mesh.name + "\r\nMeshType=" + mesh.mtype + "\r\nMeshID=0x" + meshidhex + "\r\nServerID=" + serveridhex + "\r\n"; + if (obj.args.lanonly != true) { + meshsettings += "MeshServer=ws" + (obj.args.notls ? '' : 's') + "://" + WebServerName + ":" + obj.args.port + "/" + xdomain + "agent.ashx\r\n"; + } else { + meshsettings += "MeshServer=local"; + } + + var sfxmeshfile = obj.path.join(__dirname, 'agents', 'meshagent.msh' ); + obj.fs.writeFileSync(sfxmeshfile, meshsettings, 'utf8'); + createSfxMeshAgent(mesh, sfxmeshfile); + }); } break; } @@ -453,7 +526,13 @@ module.exports.CreateMeshUser = function (parent, db, ws, req, args, domain) { // Check if this user has rights to do this if (mesh.links[user._id] == null || mesh.links[user._id].rights != 0xFFFFFFFF) return; if ((command.meshid.split('/').length != 3) || (command.meshid.split('/')[1] != domain.id)) return; // Invalid domain, operation only valid for current domain - + + // Delete mesh SFX files, except the uninstall SFX just in case some remote system still have mesh agent running. + if (mesh.path1 != null) + obj.fs.unlink(mesh.path1, (err) => { if (err) console.log(err); }); + if (mesh.path2 != null) + obj.fs.unlink(mesh.path2, (err) => { if (err) console.log(err); }); + // Fire the removal event first, because after this, the event will not route obj.parent.parent.DispatchEvent(['*', command.meshid], obj, { etype: 'mesh', username: user.name, meshid: command.meshid, name: command.meshname, action: 'deletemesh', msg: 'Mesh deleted: ' + command.meshname, domain: domain.id }) @@ -473,10 +552,10 @@ module.exports.CreateMeshUser = function (parent, db, ws, req, args, domain) { var meshpath = getServerRootFilePath(mesh); if (meshpath != null) { deleteFolderRec(meshpath); } } catch (e) { } - + obj.parent.parent.RemoveEventDispatchId(command.meshid); // Remove all subscriptions to this mesh obj.db.RemoveMesh(command.meshid); // Remove mesh from database - delete obj.parent.meshes[command.meshid]; // Remove mesh from memory + delete obj.parent.meshes[command.meshid]; // Remove mesh from memory }); break; } @@ -488,10 +567,44 @@ module.exports.CreateMeshUser = function (parent, db, ws, req, args, domain) { // Check if this user has rights to do this if (mesh.links[user._id] == null || ((mesh.links[user._id].rights & 1) == 0)) return; if ((command.meshid.split('/').length != 3) || (command.meshid.split('/')[1] != domain.id)) return; // Invalid domain, operation only valid for current domain - + var sfxname = mesh.name; if (command.meshname && command.meshname != '' && command.meshname != mesh.name) { change = 'Mesh name changed from "' + mesh.name + '" to "' + command.meshname + '"'; mesh.name = command.meshname; } if (command.desc != null && command.desc != mesh.desc) { if (change != '') change += ' and description changed'; else change += 'Mesh "' + mesh.name + '" description changed'; mesh.desc = command.desc; } - if (change != '') { obj.db.Set(mesh); obj.parent.parent.DispatchEvent(['*', mesh._id, user._id], obj, { etype: 'mesh', username: user.name, meshid: mesh._id, name: mesh.name, mtype: mesh.mtype, desc: mesh.desc, action: 'meshchange', links: mesh.links, msg: change, domain: domain.id }) } + if (change != '') { + + if (sfxname != mesh.name) { + var makesfx = new sfx(); + var tempdir = obj.path.join(__dirname, 'tmp' ); + // extract current mesh policy from Sfx + makesfx.extract( mesh.path1, tempdir ) + .then(function () { + // Delete current mesh SFX files + if (mesh.path1 != null) + obj.fs.unlink(mesh.path1, (err) => { if (err) console.log(err); }); + if (mesh.path2 != null) + obj.fs.unlink(mesh.path2, (err) => { if (err) console.log(err); }); + if (mesh.path3 != null) + obj.fs.unlink(mesh.path3, (err) => { if (err) console.log(err); }); + // change mesh name + var sfxmeshfile = obj.path.join( tempdir, 'meshagent.msh'); + var data = obj.fs.readFileSync(sfxmeshfile, 'utf8'); + var result = data.replace( sfxname , mesh.name ); + obj.fs.writeFileSync(sfxmeshfile, result, 'utf8'); + // recreate sfx + createSfxMeshAgent(mesh, sfxmeshfile); + var tempfile = obj.path.join(tempdir, 'meshagent.bat' ); + obj.fs.unlink(tempfile, (err) => { if (err) console.log(err); }); + var tempfile2 = obj.path.join(tempdir, 'MeshService.exe' ); + obj.fs.unlink(tempfile2, (err) => { if (err) console.log(err); }); + var tempfile3 = obj.path.join(tempdir, 'MeshService64.exe' ); + obj.fs.unlink(tempfile3, (err) => { if (err) console.log(err); }); + obj.fs.rmdir(tempdir, (err) => { if (err) console.log(err); }); + }); + } + + obj.db.Set(mesh); + obj.parent.parent.DispatchEvent(['*', mesh._id, user._id], obj, { etype: 'mesh', username: user.name, meshid: mesh._id, name: mesh.name, mtype: mesh.mtype, desc: mesh.desc, action: 'meshchange', links: mesh.links, msg: change, domain: domain.id }); + } } break; } diff --git a/package.json b/package.json index 98826d00..76e84f35 100644 --- a/package.json +++ b/package.json @@ -1,29 +1,37 @@ { - "name": "meshcentral", - "version": "0.1.2-b", - "keywords": [ - "Remote Management", - "Intel AMT", - "Active Management", - "Remote Desktop" + "_from": "meshcentral", + "_id": "meshcentral@0.1.2-b", + "_inBundle": false, + "_integrity": "sha1-1kyiZmB0h+6WKMPlubpVSGTJ1VA=", + "_location": "/meshcentral", + "_phantomChildren": {}, + "_requested": { + "type": "tag", + "registry": true, + "raw": "meshcentral", + "name": "meshcentral", + "escapedName": "meshcentral", + "rawSpec": "", + "saveSpec": null, + "fetchSpec": "latest" + }, + "_requiredBy": [ + "#USER", + "/", + "/meshcentral" ], - "homepage": "http://meshcommander.com", - "description": "Web based remote computer management and file server", - "author": "Ylian Saint-Hilaire ", - "main": "meshcentral.js", + "_resolved": "https://registry.npmjs.org/meshcentral/-/meshcentral-0.1.2-b.tgz", + "_shasum": "d64ca266607487ee9628c3e5b9ba554864c9d550", + "_spec": "meshcentral", + "_where": "C:\\Users\\Lawrence", + "author": { + "name": "Ylian Saint-Hilaire", + "email": "ysainthilaire@hotmail.com" + }, "bin": { "meshcentral": "./bin/meshcentral" }, - "license": "Apache-2.0", - "files": [ - "*.js", - "license.txt", - "readme.txt", - "agents", - "public", - "views", - "bin" - ], + "bundleDependencies": false, "dependencies": { "archiver": "^1.3.0", "body-parser": "^1.18.2", @@ -35,21 +43,46 @@ "express-ws": "^2.0.0", "meshcentral": "*", "minimist": "^1.2.0", - "mongojs": "^2.4.1", + "mongojs": "^2.4.0", "multiparty": "^4.1.3", "nedb": "^1.8.0", + "node-7z": "^0.4.0", "node-forge": "^0.6.49", + "node-sspi": "^0.2.2", "node-windows": "^0.1.14", "nodemailer": "^4.4.1", "unzip": "^0.1.11", + "win-7zip": "^0.1.1", "ws": "^3.2.0", "xmldom": "^0.1.27" }, + "deprecated": false, + "description": "Web based remote computer management and file server", + "devDependencies": {}, + "files": [ + "*.js", + "license.txt", + "readme.txt", + "agents", + "public", + "views", + "bin" + ], + "homepage": "http://meshcommander.com", + "keywords": [ + "Remote Management", + "Intel AMT", + "Active Management", + "Remote Desktop" + ], + "license": "Apache-2.0", + "main": "meshcentral.js", + "name": "meshcentral", "optionalDependencies": { + "mongojs": "^2.4.0", "node-sspi": "^0.2.2", "node-windows": "^0.1.14", - "mongojs": "^2.4.0" + "win-7zip": "^0.1.1" }, - "devDependencies": {}, - "readme": "readme.txt" + "version": "0.1.2-b" } diff --git a/public/index.html b/public/index.html index 5e3edf4c..17f8ab7a 100644 --- a/public/index.html +++ b/public/index.html @@ -1110,8 +1110,10 @@ var mesh = meshes[meshid]; var meshidx = meshid.substring(5); if (meshidx[0] == '/') meshidx = meshidx.substring(1); - var x = "To add a new computer to mesh " + EscapeHtml(mesh.name) + ", download the mesh agent and configuration file and install the agent on the computer to manage.

"; - x += addHtmlValue('Mesh Agent', 'Windows executable (.exe)'); + var x = "To add a new computer to mesh " + EscapeHtml(mesh.name) + ", download the oneclick SFX application, it has a (.bat) script file, (.exe) mesh agents 32bit & 64bit, and (.msh) configuration file, run the application agent on the computer to manage.

For " + EscapeHtml(mesh.name) + " Mesh Policy:
"; + x += addHtmlValue(' Mesh Agent', 'Windows SFX executable (.exe)'); + x += addHtmlValue(' Oneclick Install', 'Windows SFX Installer
'); + x += addHtmlValue(' Oneclick Uninstall', 'Windows SFX Uninstaller
'); setDialogMode(2, "Add Mesh Agent", 1, null, x); } diff --git a/sfx/meshagent.bat b/sfx/meshagent.bat new file mode 100644 index 00000000..5a8abb52 --- /dev/null +++ b/sfx/meshagent.bat @@ -0,0 +1,8 @@ +@echo off +reg Query "HKLM\Hardware\Description\System\CentralProcessor\0" | find /i "x86" > NUL && set OS_bit=x86 || set OS_bit=x64 +if %OS_bit%=="x86" ( + rename MeshService.exe meshagent.exe +) else ( + rename MeshService64.exe meshagent.exe +) +meshagent.exe diff --git a/sfx/meshinstall.bat b/sfx/meshinstall.bat new file mode 100644 index 00000000..0d8d446a --- /dev/null +++ b/sfx/meshinstall.bat @@ -0,0 +1,8 @@ +@echo off +reg Query "HKLM\Hardware\Description\System\CentralProcessor\0" | find /i "x86" > NUL && set OS_bit=x86 || set OS_bit=x64 +if %OS_bit%=="x86" ( + rename MeshService.exe meshagent.exe +) else ( + rename MeshService64.exe meshagent.exe +) +meshagent.exe -fullinstall diff --git a/sfx/meshuninstall.bat b/sfx/meshuninstall.bat new file mode 100644 index 00000000..1ef557fa --- /dev/null +++ b/sfx/meshuninstall.bat @@ -0,0 +1,8 @@ +@echo off +reg Query "HKLM\Hardware\Description\System\CentralProcessor\0" | find /i "x86" > NUL && set OS_bit=x86 || set OS_bit=x64 +if %OS_bit%=="x86" ( + rename MeshService.exe meshagent.exe +) else ( + rename MeshService64.exe meshagent.exe +) +meshagent.exe -fulluninstall diff --git a/startmeshcentral.cmd b/startmeshcentral.cmd new file mode 100644 index 00000000..e8d8bc6c --- /dev/null +++ b/startmeshcentral.cmd @@ -0,0 +1,17 @@ +@echo off +if "%1"=="" ( + set PORT=443 +) else ( + if not "%1"=="install" set PORT=%1 +) + +if "%2"=="" ( + set RPORT=80 +) else ( + set RPORT=%2 +) + +cd /D %HOMEPATH% +if "%1"=="install" node node_modules/meshcentral/meshcentral.js --install --cert %USERDOMAIN% +if exist meshcentral-data/webserver-cert-private.key if not "%1"=="install" node node_modules/meshcentral/meshcentral.js --port %PORT% --redirport %RPORT% +if not exist meshcentral-data/webserver-cert-private.key if not "%1"=="install" node node_modules/meshcentral/meshcentral.js --cert %USERDOMAIN% --port %PORT% --redirport %RPORT% diff --git a/startmeshcentral.sh b/startmeshcentral.sh new file mode 100644 index 00000000..1f06b2fd --- /dev/null +++ b/startmeshcentral.sh @@ -0,0 +1,32 @@ +#!/bin/sh +if [ $1 == "" ] ; then + PORT=444 +else + PORT=$1 +fi + +if [ $2 == "" ]; then + RPORT=81 +else + RPORT=$2 +fi + +cd ~ +npmbin=$(which node) +$npmbin install meshcentral +foreverbin=$(which forever) +$foreverbin start node_modules/meshcentral/meshcentral.js --cert $HOSTNAME +sleep 10 +$foreverbin stop node_modules/meshcentral/meshcentral.js +if [ -f ssl.key ]; then + ln -sf ssl.key node_modules/.meshcentral-data/agentserver-cert-private.key + ln -sf ssl.cert node_modules/.meshcentral-data/agentserver-cert-public.crt + ln -sf ssl.key node_modules/.meshcentral-data/root-cert-private.key + ln -sf ssl.cert node_modules/.meshcentral-data/root-cert-public.crt + ln -sf ssl.key node_modules/.meshcentral-data/webserver-cert-private.key + ln -sf ssl.cert node_modules/.meshcentral-data/webserver-cert-public.crt + ln -sf ssl.key node_modules/.meshcentral-data/mpsserver-cert-private.key + ln -sf ssl.cert node_modules/.meshcentral-data/mpsserver-cert-public.crt +fi +$foreverbin start node_modules/meshcentral/meshcentral.js --port $PORT --redirport $RPORT + \ No newline at end of file diff --git a/views/default.handlebars b/views/default.handlebars index 054f9040..86a14912 100644 --- a/views/default.handlebars +++ b/views/default.handlebars @@ -1569,12 +1569,13 @@ var meshidx = meshid.substring(5); if (meshidx[0] == '/') meshidx = meshidx.substring(1); var x = ""; - x += addHtmlValue('Operating System', '') + '
'; + x += addHtmlValue('Operating System', '') + '
'; // Windows agent install - x += "
To add a new computer to mesh " + EscapeHtml(mesh.name) + ", download the mesh agent and configuration file and install the agent on the computer to manage.

"; - x += addHtmlValue('Mesh Agent', 'Windows executable (.exe)'); - x += addHtmlValue('Settings File', '' + EscapeHtml(mesh.name) + ' settings (.msh)'); + x += "
To add a new computer to mesh " + EscapeHtml(mesh.name) + ", download the oneclick SFX application, it has a (.bat) script file, (.exe) mesh agents 32bit & 64bit, and (.msh) configuration file, run the application agent on the computer to manage.

For " + EscapeHtml(mesh.name) + " Mesh Policy:
"; + x += addHtmlValue(' Mesh Agent', 'Windows SFX executable (.exe)'); + x += addHtmlValue(' Oneclick Install', 'Windows SFX Installer
'); + x += addHtmlValue(' Oneclick Uninstall', 'Windows SFX Uninstaller
'); x += "
"; // Linux agent install @@ -1582,11 +1583,6 @@ x += ''; x += "
"; - // Windows agent uninstall - x += ""; - // Linux agent uninstall x += "