Refactor meshuser - console command obj

Noah Zalev committed Jul 7, 2021 at 21:26 UTC 809f6ab74da44e2461a5c4fa64fc7b6c3227f842
1 file changed +198 -280
meshuser.js
+198 -280
@@ -597,114 +597,100 @@ module.exports.CreateMeshUser = function (parent, db, ws, req, args, domain, use
597 consoleCommands['firebase'] = firebaseConsoleCommand;
598
599
600 - function helpConsoleCommand(cmdargs) {
601 - var r = '', fin = '', f = '', availcommands = 'help,maintenance,info,versions,resetserver,usersessions,closeusersessions,tasklimiter,setmaxtasks,cores,migrationagents,agentstats,agentissues,webstats,trafficstats,trafficdelta,mpsstats,swarmstats,acceleratorsstats,updatecheck,serverupdate,nodeconfig,heapdump,relays,autobackup,backupconfig,dupagents,dispatchtable,badlogins,showpaths,le,lecheck,leevents,dbstats,dbcounters,sms,amtacm,certhashes,watchdog,amtmanager,amtpasswords,certexpire,email';
600 + function helpConsoleCommand(cmdData) {
601 + var fin = '', f = '', availcommands = 'help,maintenance,info,versions,resetserver,usersessions,closeusersessions,tasklimiter,setmaxtasks,cores,migrationagents,agentstats,agentissues,webstats,trafficstats,trafficdelta,mpsstats,swarmstats,acceleratorsstats,updatecheck,serverupdate,nodeconfig,heapdump,relays,autobackup,backupconfig,dupagents,dispatchtable,badlogins,showpaths,le,lecheck,leevents,dbstats,dbcounters,sms,amtacm,certhashes,watchdog,amtmanager,amtpasswords,certexpire,email';
602 if (parent.parent.config.settings.heapdump === true) { availcommands += ',heapdump'; }
603 availcommands = availcommands.split(',').sort();
604 while (availcommands.length > 0) { if (f.length > 80) { fin += (f + ',\r\n'); f = ''; } f += (((f != '') ? ', ' : ' ') + availcommands.shift()); }
605 if (f != '') { fin += f; }
606 - if (cmdargs['_'].length == 0) {
607 - r = 'Available commands: \r\n' + fin + '\r\nType help <command> for details.';
606 + if (cmdData.cmdargs['_'].length == 0) {
607 + cmdData.result = 'Available commands: \r\n' + fin + '\r\nType help <command> for details.';
608 } else {
609 - var cmd2 = cmdargs['_'][0].toLowerCase();
609 + var cmd2 = cmdData.cmdargs['_'][0].toLowerCase();
610 switch (cmd2) {
611 - case 'info': { r = "info: Returns the most immidiatly useful information about this server, including MeshCentral and NodeJS versions. This is often information required to file a bug."; break; }
612 - case 'versions': { r = "versions: Returns all internal versions for NodeJS running this server."; break; }
613 - case 'resetserver': { r = "resetserver: Causes the server to reset, this is sometimes useful is the config.json file was changed."; break; }
614 - case 'usersessions': { r = "usersessions: Returns a list of active sessions grouped by user."; break; }
615 - case 'closeusersessions': { r = "closeusersessions: Disconnects all sessions for a specified user."; break; }
616 - case 'tasklimiter': { r = "tasklimiter: Returns the internal status of the tasklimiter. This is a system used to smooth out work done by the server. It's used by, for example, agent updates so that not all agents are updated at the same time."; break; }
617 - case 'serverupdate': { r = "serverupdate: Updates server to latest version. Optional version argument to install specific version. Example: serverupdate 0.8.49"; break; }
618 - default: { r = 'No help information about this command.'; break; }
611 + case 'info': { cmdData.result = "info: Returns the most immidiatly useful information about this server, including MeshCentral and NodeJS versions. This is often information required to file a bug."; break; }
612 + case 'versions': { cmdData.result = "versions: Returns all internal versions for NodeJS running this server."; break; }
613 + case 'resetserver': { cmdData.result = "resetserver: Causes the server to reset, this is sometimes useful is the config.json file was changed."; break; }
614 + case 'usersessions': { cmdData.result = "usersessions: Returns a list of active sessions grouped by user."; break; }
615 + case 'closeusersessions': { cmdData.result = "closeusersessions: Disconnects all sessions for a specified user."; break; }
616 + case 'tasklimiter': { cmdData.result = "tasklimiter: Returns the internal status of the tasklimiter. This is a system used to smooth out work done by the server. It's used by, for example, agent updates so that not all agents are updated at the same time."; break; }
617 + case 'serverupdate': { cmdData.result = "serverupdate: Updates server to latest version. Optional version argument to install specific version. Example: serverupdate 0.8.49"; break; }
618 + default: { cmdData.result = 'No help information about this command.'; break; }
619 }
620 }
621 - return r;
621 }
622
624 - function certexpireConsoleCommand(command, cmdargs) {
625 - var r = '';
623 + function certexpireConsoleCommand(cmdData) {
624 const now = Date.now();
625 for (var i in parent.webCertificateExpire) {
626 const domainName = (i == '') ? '[Default]' : i;
629 - r += domainName + ', expires in ' + Math.floor((parent.webCertificateExpire[i] - now) / 86400000) + ' day(s)\r\n';
627 + cmdData.result += domainName + ', expires in ' + Math.floor((parent.webCertificateExpire[i] - now) / 86400000) + ' day(s)\r\n';
628 }
631 - return r;
629 }
630
634 - function webpushConsoleCommand(command, cmdargs) {
635 - var r = '';
631 + function webpushConsoleCommand(cmdData) {
632 if (parent.parent.webpush == null) {
637 - r = "Web push not supported.";
633 + cmdData.result = "Web push not supported.";
634 } else {
639 - if (cmdargs['_'].length != 1) {
640 - r = "Usage: WebPush \"Message\"";
635 + if (cmdData.cmdargs['_'].length != 1) {
636 + cmdData.result = "Usage: WebPush \"Message\"";
637 } else {
638 const pushSubscription = { "endpoint": "https://updates.push.services.mozilla.com/wpush/v2/gAAAAABgIkO9hjXHWhMPiuk-ppNRw7r_pUZitddwCEK4ykdzeIxOIjFnYhIt_nr-qUca2mpZziwQsSEhYTUCiuYrhWnVDRweMtiUj16yJJq8V5jneaEaUYjEIe5jp3DOMNpoTm1aHgX74gCR8uTXSITcM97bNi-hRxcQ4f6Ie4WSAmoXpd89B_g", "keys": { "auth": "UB2sbLVK7ALnSHw5P1dahg", "p256dh": "BIoRbcNSxBuTjN39CCCUCHo1f4NxBJ1YDdu_k4MbPW_q3NK1_RufnydUzLPDp8ibBVItSI72-s48QJvOjQ_S8Ok" } }
643 - parent.parent.webpush.sendNotification(pushSubscription, cmdargs['_'][0]).then(
644 - function (value) { try { ws.send(JSON.stringify({ action: 'OK', value: r, tag: command.tag })); } catch (ex) { } },
645 - function (error) { try { ws.send(JSON.stringify({ action: 'Error', value: r, tag: command.tag })); } catch (ex) { } }
639 + parent.parent.webpush.sendNotification(pushSubscription, cmdData.cmdargs['_'][0]).then(
640 + function (value) { try { ws.send(JSON.stringify({ action: 'OK', value: cmdData.result, tag: cmdData.command.tag })); } catch (ex) { } },
641 + function (error) { try { ws.send(JSON.stringify({ action: 'Error', value: cmdData.result, tag: cmdData.command.tag })); } catch (ex) { } }
642 );
643 }
644 }
649 - return r;
645 }
646
652 - function amtmanagerConsoleCommand(command, cmdargs) {
653 - var r = '';
647 + function amtmanagerConsoleCommand(cmdData) {
648 if (parent.parent.amtManager == null) {
655 - r = 'Intel AMT Manager not active.';
649 + cmdData.result = 'Intel AMT Manager not active.';
650 } else {
657 - r = parent.parent.amtManager.getStatusString();
651 + cmdData.result = parent.parent.amtManager.getStatusString();
652 }
659 - return r;
653 }
654
662 - function certhashesConsoleCommand(command, cmdargs) {
663 - var r = '';
664 - r += 'AgentCertHash: ' + parent.agentCertificateHashHex;
665 - for (var i in parent.webCertificateHashs) { r += '\r\nwebCertificateHash (' + i + '): ' + common.rstr2hex(parent.webCertificateHashs[i]); }
666 - for (var i in parent.webCertificateFullHashs) { r += '\r\nwebCertificateFullHash (' + i + '): ' + common.rstr2hex(parent.webCertificateFullHashs[i]); }
667 - r += '\r\ndefaultWebCertificateHash: ' + common.rstr2hex(parent.defaultWebCertificateHash);
668 - r += '\r\ndefaultWebCertificateFullHash: ' + common.rstr2hex(parent.defaultWebCertificateFullHash);
669 - return r;
655 + function certhashesConsoleCommand(cmdData) {
656 + cmdData.result += 'AgentCertHash: ' + parent.agentCertificateHashHex;
657 + for (var i in parent.webCertificateHashs) { cmdData.result += '\r\nwebCertificateHash (' + i + '): ' + common.rstr2hex(parent.webCertificateHashs[i]); }
658 + for (var i in parent.webCertificateFullHashs) { cmdData.result += '\r\nwebCertificateFullHash (' + i + '): ' + common.rstr2hex(parent.webCertificateFullHashs[i]); }
659 + cmdData.result += '\r\ndefaultWebCertificateHash: ' + common.rstr2hex(parent.defaultWebCertificateHash);
660 + cmdData.result += '\r\ndefaultWebCertificateFullHash: ' + common.rstr2hex(parent.defaultWebCertificateFullHash);
661 }
662
672 - function amtacmConsoleCommand(command, cmdargs) {
673 - var r = '';
663 + function amtacmConsoleCommand(cmdData) {
664 if ((domain.amtacmactivation == null) || (domain.amtacmactivation.acmmatch == null) || (domain.amtacmactivation.acmmatch.length == 0)) {
675 - r = 'No Intel AMT activation certificates.';
665 + cmdData.result = 'No Intel AMT activation certificates.';
666 } else {
677 - if (domain.amtacmactivation.log != null) { r += '--- Activation Log ---\r\nFile : ' + domain.amtacmactivation.log + '\r\n'; }
667 + if (domain.amtacmactivation.log != null) { cmdData.result += '--- Activation Log ---\r\nFile : ' + domain.amtacmactivation.log + '\r\n'; }
668 for (var i in domain.amtacmactivation.acmmatch) {
669 var acmcert = domain.amtacmactivation.acmmatch[i];
680 - r += '--- Activation Certificate ' + (parseInt(i) + 1) + ' ---\r\nName : ' + acmcert.cn + '\r\nSHA1 : ' + acmcert.sha1 + '\r\nSHA256: ' + acmcert.sha256 + '\r\n';
670 + cmdData.result += '--- Activation Certificate ' + (parseInt(i) + 1) + ' ---\r\nName : ' + acmcert.cn + '\r\nSHA1 : ' + acmcert.sha1 + '\r\nSHA256: ' + acmcert.sha256 + '\r\n';
671 }
672 }
683 - return r;
673 }
674
686 - function heapdumpConsoleCommand(command, cmdargs) {
687 - var r = '';
675 + function heapdumpConsoleCommand(cmdData) {
676 // Heapdump support, see example at:
677 // https://www.arbazsiddiqui.me/a-practical-guide-to-memory-leaks-in-nodejs/
678 if (parent.parent.config.settings.heapdump === true) {
679 var dumpFileName = parent.path.join(parent.parent.datapath, `heapDump-${Date.now()}.heapsnapshot`);
692 - try { ws.send(JSON.stringify({ action: 'serverconsole', value: "Generating dump file at: " + dumpFileName, tag: command.tag })); } catch (ex) { }
680 + try { ws.send(JSON.stringify({ action: 'serverconsole', value: "Generating dump file at: " + dumpFileName, tag: cmdData.command.tag })); } catch (ex) { }
681 require('heapdump').writeSnapshot(dumpFileName, (err, filename) => {
694 - try { ws.send(JSON.stringify({ action: 'serverconsole', value: "Done.", tag: command.tag })); } catch (ex) { }
682 + try { ws.send(JSON.stringify({ action: 'serverconsole', value: "Done.", tag: cmdData.command.tag })); } catch (ex) { }
683 });
684 } else {
697 - r = "Heapdump not supported, add \"heapdump\":true to settings section of config.json.";
685 + cmdData.result = "Heapdump not supported, add \"heapdump\":true to settings section of config.json.";
686 }
699 - return r;
687 }
688
702 - function heapdump2ConsoleCommand(command, cmdargs) {
703 - var r = '';
689 + function heapdump2ConsoleCommand(cmdData) {
690 var heapdump = null;
691 try { heapdump = require('heapdump'); } catch (ex) { }
692 if (heapdump == null) {
707 - r = 'Heapdump module not installed, run "npm install heapdump".';
693 + cmdData.result = 'Heapdump module not installed, run "npm install heapdump".';
694 } else {
695 heapdump.writeSnapshot(function (err, filename) {
696 if (err != null) {
@@ -714,248 +700,212 @@ module.exports.CreateMeshUser = function (parent, db, ws, req, args, domain, use
700 }
701 });
702 }
717 - return r;
703 }
704
720 - function smsConsoleCommand(command, cmdargs) {
721 - var r = '';
705 + function smsConsoleCommand(cmdData) {
706 if (parent.parent.smsserver == null) {
723 - r = "No SMS gateway in use.";
707 + cmdData.result = "No SMS gateway in use.";
708 } else {
725 - if (cmdargs['_'].length != 2) {
726 - r = "Usage: SMS \"PhoneNumber\" \"Message\".";
709 + if (cmdData.cmdargs['_'].length != 2) {
710 + cmdData.result = "Usage: SMS \"PhoneNumber\" \"Message\".";
711 } else {
728 - parent.parent.smsserver.sendSMS(cmdargs['_'][0], cmdargs['_'][1], function (status, msg) {
712 + parent.parent.smsserver.sendSMS(cmdData.cmdargs['_'][0], cmdData.cmdargs['_'][1], function (status, msg) {
713 if (typeof msg == 'string') {
730 - try { ws.send(JSON.stringify({ action: 'serverconsole', value: status ? ('Success: ' + msg) : ('Failed: ' + msg), tag: command.tag })); } catch (ex) { }
714 + try { ws.send(JSON.stringify({ action: 'serverconsole', value: status ? ('Success: ' + msg) : ('Failed: ' + msg), tag: cmdData.command.tag })); } catch (ex) { }
715 } else {
732 - try { ws.send(JSON.stringify({ action: 'serverconsole', value: status ? 'Success' : 'Failed', tag: command.tag })); } catch (ex) { }
716 + try { ws.send(JSON.stringify({ action: 'serverconsole', value: status ? 'Success' : 'Failed', tag: cmdData.command.tag })); } catch (ex) { }
717 }
718 });
719 }
720 }
737 - return r;
721 }
722
740 - function emailConsoleCommand(command, cmdargs) {
741 - var r = '';
723 + function emailConsoleCommand(cmdData) {
724 if (domain.mailserver == null) {
743 - r = "No email service enabled.";
725 + cmdData.result = "No email service enabled.";
726 } else {
745 - if (cmdargs['_'].length != 3) {
746 - r = "Usage: email \"user@sample.com\" \"Subject\" \"Message\".";
727 + if (cmdData.cmdargs['_'].length != 3) {
728 + cmdData.result = "Usage: email \"user@sample.com\" \"Subject\" \"Message\".";
729 } else {
748 - domain.mailserver.sendMail(cmdargs['_'][0], cmdargs['_'][1], cmdargs['_'][2]);
749 - r = "Done.";
730 + domain.mailserver.sendMail(cmdData.cmdargs['_'][0], cmdData.cmdargs['_'][1], cmdData.cmdargs['_'][2]);
731 + cmdData.result = "Done.";
732 }
733 }
752 - return r;
734 }
735
755 - function leConsoleCommand(command, cmdargs) {
756 - var r = '';
736 + function leConsoleCommand(cmdData) {
737 if (parent.parent.letsencrypt == null) {
758 - r = "Let's Encrypt not in use.";
738 + cmdData.result = "Let's Encrypt not in use.";
739 } else {
760 - r = JSON.stringify(parent.parent.letsencrypt.getStats(), null, 4);
740 + cmdData.result = JSON.stringify(parent.parent.letsencrypt.getStats(), null, 4);
741 }
762 - return r;
742 }
743
765 - function lecheckConsoleCommand(command, cmdargs) {
766 - var r = '';
744 + function lecheckConsoleCommand(cmdData) {
745 if (parent.parent.letsencrypt == null) {
768 - r = "Let's Encrypt not in use.";
746 + cmdData.result = "Let's Encrypt not in use.";
747 } else {
770 - r = ["CertOK", "Request:NoCert", "Request:Expire", "Request:MissingNames"][parent.parent.letsencrypt.checkRkenewCertificate()];
748 + cmdData.result = ["CertOK", "Request:NoCert", "Request:Expire", "Request:MissingNames"][parent.parent.letsencrypt.checkRkenewCertificate()];
749 }
772 - return r;
750 }
751
775 - function leeventsConsoleCommand(command, cmdargs) {
776 - var r = '';
752 + function leeventsConsoleCommand(cmdData) {
753 if (parent.parent.letsencrypt == null) {
778 - r = "Let's Encrypt not in use.";
754 + cmdData.result = "Let's Encrypt not in use.";
755 } else {
780 - r = parent.parent.letsencrypt.events.join('\r\n');
756 + cmdData.result = parent.parent.letsencrypt.events.join('\r\n');
757 }
782 - return r;
758 }
759
785 - function badloginsConsoleCommand(command, cmdargs) {
786 - var r = '';
760 + function badloginsConsoleCommand(cmdData) {
761 if (parent.parent.config.settings.maxinvalidlogin == false) {
788 - r = 'Bad login filter is disabled.';
762 + cmdData.result = 'Bad login filter is disabled.';
763 } else {
790 - if (cmdargs['_'] == 'reset') {
764 + if (cmdData.cmdargs['_'] == 'reset') {
765 // Reset bad login table
766 parent.badLoginTable = {};
767 parent.badLoginTableLastClean = 0;
794 - r = 'Done.'
795 - } else if (cmdargs['_'] == '') {
768 + cmdData.result = 'Done.'
769 + } else if (cmdData.cmdargs['_'] == '') {
770 // Show current bad login table
771 if (typeof parent.parent.config.settings.maxinvalidlogin.coolofftime == 'number') {
798 - r = "Max is " + parent.parent.config.settings.maxinvalidlogin.count + " bad login(s) in " + parent.parent.config.settings.maxinvalidlogin.time + " minute(s), " + parent.parent.config.settings.maxinvalidlogin.coolofftime + " minute(s) cooloff.\r\n";
772 + cmdData.result = "Max is " + parent.parent.config.settings.maxinvalidlogin.count + " bad login(s) in " + parent.parent.config.settings.maxinvalidlogin.time + " minute(s), " + parent.parent.config.settings.maxinvalidlogin.coolofftime + " minute(s) cooloff.\r\n";
773 } else {
800 - r = "Max is " + parent.parent.config.settings.maxinvalidlogin.count + " bad login(s) in " + parent.parent.config.settings.maxinvalidlogin.time + " minute(s).\r\n";
774 + cmdData.result = "Max is " + parent.parent.config.settings.maxinvalidlogin.count + " bad login(s) in " + parent.parent.config.settings.maxinvalidlogin.time + " minute(s).\r\n";
775 }
776 var badLoginCount = 0;
777 parent.cleanBadLoginTable();
778 for (var i in parent.badLoginTable) {
779 badLoginCount++;
780 if (typeof parent.badLoginTable[i] == 'number') {
807 - r += "Cooloff for " + Math.floor((parent.badLoginTable[i] - Date.now()) / 60000) + " minute(s)\r\n";
781 + cmdData.result += "Cooloff for " + Math.floor((parent.badLoginTable[i] - Date.now()) / 60000) + " minute(s)\r\n";
782 } else {
783 if (parent.badLoginTable[i].length > 1) {
810 - r += (i + ' - ' + parent.badLoginTable[i].length + " records\r\n");
784 + cmdData.result += (i + ' - ' + parent.badLoginTable[i].length + " records\r\n");
785 } else {
812 - r += (i + ' - ' + parent.badLoginTable[i].length + " record\r\n");
786 + cmdData.result += (i + ' - ' + parent.badLoginTable[i].length + " record\r\n");
787 }
788 }
789 }
816 - if (badLoginCount == 0) { r += 'No bad logins.'; }
790 + if (badLoginCount == 0) { cmdData.result += 'No bad logins.'; }
791 } else {
818 - r = 'Usage: badlogin [reset]';
792 + cmdData.result = 'Usage: badlogin [reset]';
793 }
794 }
821 - return r;
795 }
796
824 - function dispatchtableConsoleCommand(command, cmdargs) {
825 - var r = '';
797 + function dispatchtableConsoleCommand(cmdData) {
798 for (var i in parent.parent.eventsDispatch) {
827 - r += (i + ', ' + parent.parent.eventsDispatch[i].length + '\r\n');
799 + cmdData.result += (i + ', ' + parent.parent.eventsDispatch[i].length + '\r\n');
800 }
829 - return r;
801 }
802
832 - function dupagentsConsoleCommand(command, cmdargs) {
833 - var r = '';
803 + function dupagentsConsoleCommand(cmdData) {
804 for (var i in parent.duplicateAgentsLog) {
835 - r += JSON.stringify(parent.duplicateAgentsLog[i]) + '\r\n';
805 + cmdData.result += JSON.stringify(parent.duplicateAgentsLog[i]) + '\r\n';
806 }
837 - if (r == '') { r = 'No duplicate agents in log.'; }
838 - return r;
807 + if (cmdData.result == '') { cmdData.result = 'No duplicate agents in log.'; }
808 }
809
841 - function agentstatsConsoleCommand(command, cmdargs) {
842 - var r = '';
810 + function agentstatsConsoleCommand(cmdData) {
811 var stats = parent.getAgentStats();
812 for (var i in stats) {
845 - if (typeof stats[i] == 'object') { r += (i + ': ' + JSON.stringify(stats[i]) + '\r\n'); } else { r += (i + ': ' + stats[i] + '\r\n'); }
813 + if (typeof stats[i] == 'object') { cmdData.result += (i + ': ' + JSON.stringify(stats[i]) + '\r\n'); } else { cmdData.result += (i + ': ' + stats[i] + '\r\n'); }
814 }
847 - return r;
815 }
816
850 - function agentissuesConsoleCommand(command, cmdargs) {
851 - var r = '';
817 + function agentissuesConsoleCommand(cmdData) {
818 var stats = parent.getAgentIssues();
819 if (stats.length == 0) {
854 - r = "No agent issues.";
820 + cmdData.result = "No agent issues.";
821 } else {
856 - for (var i in stats) { r += stats[i].join(', ') + '\r\n'; }
822 + for (var i in stats) { cmdData.result += stats[i].join(', ') + '\r\n'; }
823 }
858 - return r;
824 }
825
861 - function webstatsConsoleCommand(command, cmdargs) {
862 - var r = '';
826 + function webstatsConsoleCommand(cmdData) {
827 var stats = parent.getStats();
828 for (var i in stats) {
865 - if (typeof stats[i] == 'object') { r += (i + ': ' + JSON.stringify(stats[i]) + '\r\n'); } else { r += (i + ': ' + stats[i] + '\r\n'); }
829 + if (typeof stats[i] == 'object') { cmdData.result += (i + ': ' + JSON.stringify(stats[i]) + '\r\n'); } else { cmdData.result += (i + ': ' + stats[i] + '\r\n'); }
830 }
867 - return r;
831 }
832
870 - function trafficstatsConsoleCommand(command, cmdargs) {
871 - var r = '';
833 + function trafficstatsConsoleCommand(cmdData) {
834 var stats = parent.getTrafficStats();
835 for (var i in stats) {
874 - if (typeof stats[i] == 'object') { r += (i + ': ' + JSON.stringify(stats[i]) + '\r\n'); } else { r += (i + ': ' + stats[i] + '\r\n'); }
836 + if (typeof stats[i] == 'object') { cmdData.result += (i + ': ' + JSON.stringify(stats[i]) + '\r\n'); } else { cmdData.result += (i + ': ' + stats[i] + '\r\n'); }
837 }
876 - return r;
838 }
839
879 - function trafficdeltaConsoleCommand(command, cmdargs) {
880 - var r = '';
840 + function trafficdeltaConsoleCommand(cmdData) {
841 const stats = parent.getTrafficDelta(obj.trafficStats);
842 obj.trafficStats = stats.current;
843 for (var i in stats.delta) {
884 - if (typeof stats.delta[i] == 'object') { r += (i + ': ' + JSON.stringify(stats.delta[i]) + '\r\n'); } else { r += (i + ': ' + stats.delta[i] + '\r\n'); }
844 + if (typeof stats.delta[i] == 'object') { cmdData.result += (i + ': ' + JSON.stringify(stats.delta[i]) + '\r\n'); } else { cmdData.result += (i + ': ' + stats.delta[i] + '\r\n'); }
845 }
886 - return r;
846 }
847
889 - function watchdogConsoleCommand(command, cmdargs) {
890 - var r = '';
848 + function watchdogConsoleCommand(cmdData) {
849 if (parent.parent.watchdog == null) {
892 - r = 'Server watchdog not active.';
850 + cmdData.result = 'Server watchdog not active.';
851 } else {
894 - r = 'Server watchdog active.\r\n';
895 - if (parent.parent.watchdogmaxtime != null) { r += 'Largest timeout was ' + parent.parent.watchdogmax + 'ms on ' + parent.parent.watchdogmaxtime + '\r\n'; }
896 - for (var i in parent.parent.watchdogtable) { r += parent.parent.watchdogtable[i] + '\r\n'; }
852 + cmdData.result = 'Server watchdog active.\r\n';
853 + if (parent.parent.watchdogmaxtime != null) { cmdData.result += 'Largest timeout was ' + parent.parent.watchdogmax + 'ms on ' + parent.parent.watchdogmaxtime + '\r\n'; }
854 + for (var i in parent.parent.watchdogtable) { cmdData.result += parent.parent.watchdogtable[i] + '\r\n'; }
855 }
898 - return r;
856 }
857
901 - function acceleratorsstatsConsoleCommand(command, cmdargs) {
902 - var r = '';
858 + function acceleratorsstatsConsoleCommand(cmdData) {
859 var stats = parent.parent.certificateOperations.getAcceleratorStats();
860 for (var i in stats) {
905 - if (typeof stats[i] == 'object') { r += (i + ': ' + JSON.stringify(stats[i]) + '\r\n'); } else { r += (i + ': ' + stats[i] + '\r\n'); }
861 + if (typeof stats[i] == 'object') { cmdData.result += (i + ': ' + JSON.stringify(stats[i]) + '\r\n'); } else { cmdData.result += (i + ': ' + stats[i] + '\r\n'); }
862 }
907 - return r;
863 }
864
910 - function mpsstatsConsoleCommand(command, cmdargs) {
911 - var r = '';
865 + function mpsstatsConsoleCommand(cmdData) {
866 if (parent.parent.mpsserver == null) {
913 - r = 'MPS not enabled.';
867 + cmdData.result = 'MPS not enabled.';
868 } else {
869 var stats = parent.parent.mpsserver.getStats();
870 for (var i in stats) {
917 - if (typeof stats[i] == 'object') { r += (i + ': ' + JSON.stringify(stats[i]) + '\r\n'); } else { r += (i + ': ' + stats[i] + '\r\n'); }
871 + if (typeof stats[i] == 'object') { cmdData.result += (i + ': ' + JSON.stringify(stats[i]) + '\r\n'); } else { cmdData.result += (i + ': ' + stats[i] + '\r\n'); }
872 }
873 }
920 - return r;
874 }
875
923 - function mpsConsoleCommand(command, cmdargs) {
924 - var r = '';
876 + function mpsConsoleCommand(cmdData) {
877 if (parent.parent.mpsserver == null) {
926 - r = 'MPS not enabled.';
878 + cmdData.result = 'MPS not enabled.';
879 } else {
880 const connectionTypes = ['CIRA', 'Relay', 'LMS'];
881 for (var nodeid in parent.parent.mpsserver.ciraConnections) {
930 - r += nodeid;
882 + cmdData.result += nodeid;
883 var connections = parent.parent.mpsserver.ciraConnections[nodeid];
932 - for (var i in connections) { r += ', ' + connectionTypes[connections[i].tag.connType]; }
933 - r += '\r\n';
884 + for (var i in connections) { cmdData.result += ', ' + connectionTypes[connections[i].tag.connType]; }
885 + cmdData.result += '\r\n';
886 }
935 - if (r == '') { r = 'MPS has not connections.'; }
887 + if (cmdData.result == '') { cmdData.result = 'MPS has not connections.'; }
888 }
937 - return r;
889 }
890
940 - function dbstatsConsoleCommand(command, cmdargs) {
891 + function dbstatsConsoleCommand(cmdData) {
892 parent.parent.db.getStats(function (stats) {
893 var r2 = '';
894 for (var i in stats) { r2 += (i + ': ' + stats[i] + '\r\n'); }
944 - try { ws.send(JSON.stringify({ action: 'serverconsole', value: r2, tag: command.tag })); } catch (ex) { }
895 + try { ws.send(JSON.stringify({ action: 'serverconsole', value: r2, tag: cmdData.command.tag })); } catch (ex) { }
896 });
897 }
898
948 - function dbcountersConsoleCommand(command, cmdargs) {
949 - try { ws.send(JSON.stringify({ action: 'serverconsole', value: JSON.stringify(parent.parent.db.dbCounters, null, 2), tag: command.tag })); } catch (ex) { }
899 + function dbcountersConsoleCommand(cmdData) {
900 + try { ws.send(JSON.stringify({ action: 'serverconsole', value: JSON.stringify(parent.parent.db.dbCounters, null, 2), tag: cmdData.command.tag })); } catch (ex) { }
901 }
902
952 - function serverupdateConsoleCommand(command, cmdargs) {
953 - var r = '';
954 - r = 'Performing server update...';
903 + function serverupdateConsoleCommand(cmdData) {
904 + cmdData.result = 'Performing server update...';
905 var version = null;
906
957 - if (cmdargs['_'].length > 0) {
958 - version = cmdargs['_'][0];
907 + if (cmdData.cmdargs['_'].length > 0) {
908 + version = cmdData.cmdargs['_'][0];
909
910 // This call is SLOW. We only want to validate version if we have to
911 if (version != 'stable' && version != 'latest') {
@@ -978,56 +928,48 @@ module.exports.CreateMeshUser = function (parent, db, ws, req, args, domain, use
928 });
929 } else {
930 if (parent.parent.performServerUpdate(version) == false) {
981 - r = 'Server self-update not possible.';
931 + cmdData.result = 'Server self-update not possible.';
932 }
933 }
934 } else {
935 if (parent.parent.performServerUpdate(version) == false) {
986 - r = 'Server self-update not possible.';
936 + cmdData.result = 'Server self-update not possible.';
937 }
938 }
989 - return r;
939 }
940
992 - function printConsoleCommand(command, cmdargs) {
993 - console.log(cmdargs['_'][0]);
941 + function printConsoleCommand(cmdData) {
942 + console.log(cmdData.cmdargs['_'][0]);
943 }
944
996 - function amtpasswordsConsoleCommand(command, cmdargs) {
997 - var r = '';
945 + function amtpasswordsConsoleCommand(cmdData) {
946 if (parent.parent.amtPasswords == null) {
999 - r = "No Intel AMT password table."
947 + cmdData.result = "No Intel AMT password table."
948 } else {
1001 - for (var i in parent.parent.amtPasswords) { r += (i + ' - ' + parent.parent.amtPasswords[i].join(', ') + '\r\n'); }
949 + for (var i in parent.parent.amtPasswords) { cmdData.result += (i + ' - ' + parent.parent.amtPasswords[i].join(', ') + '\r\n'); }
950 }
1003 - return r;
951 }
952
1006 - function updatecheckConsoleCommand(command, cmdargs) {
1007 - var r = '';
953 + function updatecheckConsoleCommand(cmdData) {
954 parent.parent.getServerTags(function (tags, error) {
955 var r2 = '';
956 if (error != null) { r2 += 'Exception: ' + error + '\r\n'; }
957 else { for (var i in tags) { r2 += i + ': ' + tags[i] + '\r\n'; } }
1012 - try { ws.send(JSON.stringify({ action: 'serverconsole', value: r2, tag: command.tag })); } catch (ex) { }
958 + try { ws.send(JSON.stringify({ action: 'serverconsole', value: r2, tag: cmdData.command.tag })); } catch (ex) { }
959 });
1014 - r = "Checking server update...";
1015 - return r;
960 + cmdData.result = "Checking server update...";
961 }
962
1018 - function maintenanceConsoleCommand(command, cmdargs) {
1019 - var r = '';
963 + function maintenanceConsoleCommand(cmdData) {
964 var arg = null, changed = false;
1021 - if ((cmdargs['_'] != null) && (cmdargs['_'][0] != null)) { arg = cmdargs['_'][0].toLowerCase(); }
965 + if ((cmdData.cmdargs['_'] != null) && (cmdData.cmdargs['_'][0] != null)) { arg = cmdData.cmdargs['_'][0].toLowerCase(); }
966 if (arg == 'enabled') { parent.parent.config.settings.maintenancemode = 1; changed = true; }
967 else if (arg == 'disabled') { delete parent.parent.config.settings.maintenancemode; changed = true; }
1024 - r = 'Maintenance mode: ' + ((parent.parent.config.settings.maintenancemode == null) ? 'Disabled' : 'Enabled');
1025 - if (changed == false) { r += '\r\nTo change type: maintenance [enabled|disabled]'; }
1026 - return r;
968 + cmdData.result = 'Maintenance mode: ' + ((parent.parent.config.settings.maintenancemode == null) ? 'Disabled' : 'Enabled');
969 + if (changed == false) { cmdData.result += '\r\nTo change type: maintenance [enabled|disabled]'; }
970 }
971
1029 - function infoConsoleCommand(command, cmdargs) {
1030 - var r = '';
972 + function infoConsoleCommand(cmdData) {
973 var info = process.memoryUsage();
974 info.dbType = ['None', 'NeDB', 'MongoJS', 'MongoDB'][parent.db.databaseType];
975 try { if (parent.parent.multiServer != null) { info.serverId = parent.parent.multiServer.serverid; } } catch (ex) { }
@@ -1044,51 +986,47 @@ module.exports.CreateMeshUser = function (parent, db, ws, req, args, domain, use
986 try { info.database = ["Unknown", "NeDB", "MongoJS", "MongoDB", "MariaDB", "MySQL"][parent.parent.db.databaseType]; } catch (ex) { }
987 try { info.productionMode = ((process.env.NODE_ENV != null) && (process.env.NODE_ENV == 'production')); } catch (ex) { }
988 try { info.allDevGroupManagers = parent.parent.config.settings.managealldevicegroups; } catch (ex) { }
1047 - r = JSON.stringify(info, null, 4);
1048 - return r;
989 + cmdData.result = JSON.stringify(info, null, 4);
990 }
991
1051 - function nodeconfigConsoleCommand(command, cmdargs) {
1052 - return JSON.stringify(process.config, null, 4);
992 + function nodeconfigConsoleCommand(cmdData) {
993 + cmdData.result = JSON.stringify(process.config, null, 4);
994 }
995
1055 - function versionsConsoleCommand(command, cmdargs) {
1056 - return JSON.stringify(process.versions, null, 4);
996 + function versionsConsoleCommand(cmdData) {
997 + cmdData.result = JSON.stringify(process.versions, null, 4);
998 }
999
1059 - function argsConsoleCommand(command, cmdargs) {
1060 - return 'args: ' + JSON.stringify(cmdargs);
1000 + function argsConsoleCommand(cmdData) {
1001 + cmdData.result = 'args: ' + JSON.stringify(cmdData.cmdargs);
1002 }
1003
1063 - function usersessionsConsoleCommand(command, cmdargs) {
1064 - var r = '';
1004 + function usersessionsConsoleCommand(cmdData) {
1005 var userSessionCount = 0;
1006 var filter = null;
1067 - var arg = cmdargs['_'][0];
1007 + var arg = cmdData.cmdargs['_'][0];
1008 if (typeof arg == 'string') { if (arg.indexOf('/') >= 0) { filter = arg; } else { filter = ('user/' + domain.id + '/' + arg); } }
1009 for (var i in parent.wssessions) {
1010 if ((filter == null) || (filter == i)) {
1011 userSessionCount++;
1072 - r += (i + ', ' + parent.wssessions[i].length + ' session' + ((parent.wssessions[i].length > 1) ? 's' : '') + '.\r\n');
1012 + cmdData.result += (i + ', ' + parent.wssessions[i].length + ' session' + ((parent.wssessions[i].length > 1) ? 's' : '') + '.\r\n');
1013 for (var j in parent.wssessions[i]) {
1074 - r += ' ' + parent.wssessions[i][j].clientIp + ' --> ' + parent.wssessions[i][j].sessionId + '\r\n';
1014 + cmdData.result += ' ' + parent.wssessions[i][j].clientIp + ' --> ' + parent.wssessions[i][j].sessionId + '\r\n';
1015 }
1016 }
1017 }
1078 - if (userSessionCount == 0) { r = 'None.'; }
1079 - return r;
1018 + if (userSessionCount == 0) { cmdData.result = 'None.'; }
1019 }
1020
1082 - function closeusersessionsConsoleCommand(command, cmdargs) {
1083 - var r = '';
1021 + function closeusersessionsConsoleCommand(cmdData) {
1022 var userSessionCount = 0;
1023 var filter = null;
1086 - var arg = cmdargs['_'][0];
1024 + var arg = cmdData.cmdargs['_'][0];
1025 if (typeof arg == 'string') { if (arg.indexOf('/') >= 0) { filter = arg; } else { filter = ('user/' + domain.id + '/' + arg); } }
1026 if (filter == null) {
1089 - r += "Usage: closeusersessions <username>";
1027 + cmdData.result += "Usage: closeusersessions <username>";
1028 } else {
1091 - r += "Closing user sessions for: " + filter + '\r\n';
1029 + cmdData.result += "Closing user sessions for: " + filter + '\r\n';
1030 for (var i in parent.wssessions) {
1031 if (filter == i) {
1032 userSessionCount++;
@@ -1098,134 +1036,115 @@ module.exports.CreateMeshUser = function (parent, db, ws, req, args, domain, use
1036 }
1037 }
1038 }
1101 - if (userSessionCount < 2) { r += 'Disconnected ' + userSessionCount + ' session.'; } else { r += 'Disconnected ' + userSessionCount + ' sessions.'; };
1039 + if (userSessionCount < 2) { cmdData.result += 'Disconnected ' + userSessionCount + ' session.'; } else { cmdData.result += 'Disconnected ' + userSessionCount + ' sessions.'; };
1040 }
1103 - return r;
1041 }
1042
1106 - function resetserverConsoleCommand(command, cmdargs) {
1043 + function resetserverConsoleCommand(cmdData) {
1044 console.log("Server restart...");
1045 process.exit(0);
1046 }
1047
1111 - function tasklimiterConsoleCommand(command, cmdargs) {
1112 - var r = '';
1048 + function tasklimiterConsoleCommand(cmdData) {
1049 if (parent.parent.taskLimiter != null) {
1050 //var obj = { maxTasks: maxTasks, maxTaskTime: (maxTaskTime * 1000), nextTaskId: 0, currentCount: 0, current: {}, pending: [[], [], []], timer: null };
1051 const tl = parent.parent.taskLimiter;
1116 - r += 'MaxTasks: ' + tl.maxTasks + ', NextTaskId: ' + tl.nextTaskId + '\r\n';
1117 - r += 'MaxTaskTime: ' + (tl.maxTaskTime / 1000) + ' seconds, Timer: ' + (tl.timer != null) + '\r\n';
1052 + cmdData.result += 'MaxTasks: ' + tl.maxTasks + ', NextTaskId: ' + tl.nextTaskId + '\r\n';
1053 + cmdData.result += 'MaxTaskTime: ' + (tl.maxTaskTime / 1000) + ' seconds, Timer: ' + (tl.timer != null) + '\r\n';
1054 var c = [];
1055 for (var i in tl.current) { c.push(i); }
1120 - r += 'Current (' + tl.currentCount + '): [' + c.join(', ') + ']\r\n';
1121 - r += 'Pending (High/Med/Low): ' + tl.pending[0].length + ', ' + tl.pending[1].length + ', ' + tl.pending[2].length + '\r\n';
1056 + cmdData.result += 'Current (' + tl.currentCount + '): [' + c.join(', ') + ']\r\n';
1057 + cmdData.result += 'Pending (High/Med/Low): ' + tl.pending[0].length + ', ' + tl.pending[1].length + ', ' + tl.pending[2].length + '\r\n';
1058 }
1123 - return r;
1059 }
1060
1126 - function setmaxtasksConsoleCommand(command, cmdargs) {
1127 - var r = '';
1128 - if ((cmdargs["_"].length != 1) || (parseInt(cmdargs["_"][0]) < 1) || (parseInt(cmdargs["_"][0]) > 1000)) {
1129 - r = 'Usage: setmaxtasks [1 to 1000]';
1061 + function setmaxtasksConsoleCommand(cmdData) {
1062 + if ((cmdData.cmdargs["_"].length != 1) || (parseInt(cmdData.cmdargs["_"][0]) < 1) || (parseInt(cmdData.cmdargs["_"][0]) > 1000)) {
1063 + cmdData.result = 'Usage: setmaxtasks [1 to 1000]';
1064 } else {
1131 - parent.parent.taskLimiter.maxTasks = parseInt(cmdargs["_"][0]);
1132 - r = 'MaxTasks set to ' + parent.parent.taskLimiter.maxTasks + '.';
1065 + parent.parent.taskLimiter.maxTasks = parseInt(cmdData.cmdargs["_"][0]);
1066 + cmdData.result = 'MaxTasks set to ' + parent.parent.taskLimiter.maxTasks + '.';
1067 }
1134 - return r;
1068 }
1069
1137 - function coresConsoleCommand(command, cmdargs) {
1138 - var r = '';
1070 + function coresConsoleCommand(cmdData) {
1071 if (parent.parent.defaultMeshCores != null) {
1072 for (var i in parent.parent.defaultMeshCores) {
1141 - r += i + ': ' + parent.parent.defaultMeshCores[i].length + ' bytes\r\n';
1073 + cmdData.result += i + ': ' + parent.parent.defaultMeshCores[i].length + ' bytes\r\n';
1074 }
1075 }
1144 - return r;
1076 }
1077
1147 - function showpathsConsoleCommand(command, cmdargs) {
1148 - var r = '';
1149 - r = 'Parent: ' + parent.parent.parentpath + '\r\n';
1150 - r += 'Data: ' + parent.parent.datapath + '\r\n';
1151 - r += 'Files: ' + parent.parent.filespath + '\r\n';
1152 - r += 'Backup: ' + parent.parent.backuppath + '\r\n';
1153 - r += 'Record: ' + parent.parent.recordpath + '\r\n';
1154 - r += 'WebPublic: ' + parent.parent.webPublicPath + '\r\n';
1155 - r += 'WebViews: ' + parent.parent.webViewsPath + '\r\n';
1156 - if (parent.parent.webViewsOverridePath) { r += 'XWebPublic: ' + parent.parent.webViewsOverridePath + '\r\n'; }
1157 - if (parent.parent.webViewsOverridePath) { r += 'XWebViews: ' + parent.parent.webPublicOverridePath + '\r\n'; }
1158 - return r;
1078 + function showpathsConsoleCommand(cmdData) {
1079 + cmdData.result = 'Parent: ' + parent.parent.parentpath + '\r\n';
1080 + cmdData.result += 'Data: ' + parent.parent.datapath + '\r\n';
1081 + cmdData.result += 'Files: ' + parent.parent.filespath + '\r\n';
1082 + cmdData.result += 'Backup: ' + parent.parent.backuppath + '\r\n';
1083 + cmdData.result += 'Record: ' + parent.parent.recordpath + '\r\n';
1084 + cmdData.result += 'WebPublic: ' + parent.parent.webPublicPath + '\r\n';
1085 + cmdData.result += 'WebViews: ' + parent.parent.webViewsPath + '\r\n';
1086 + if (parent.parent.webViewsOverridePath) { cmdData.result += 'XWebPublic: ' + parent.parent.webViewsOverridePath + '\r\n'; }
1087 + if (parent.parent.webViewsOverridePath) { cmdData.result += 'XWebViews: ' + parent.parent.webPublicOverridePath + '\r\n'; }
1088 }
1089
1161 - function migrationagentsConsoleCommand(command, cmdargs) {
1162 - var r = '';
1090 + function migrationagentsConsoleCommand(cmdData) {
1091 if (parent.parent.swarmserver == null) {
1164 - r = 'Swarm server not running.';
1092 + cmdData.result = 'Swarm server not running.';
1093 } else {
1094 for (var i in parent.parent.swarmserver.migrationAgents) {
1095 var arch = parent.parent.swarmserver.migrationAgents[i];
1168 - for (var j in arch) { var agent = arch[j]; r += 'Arch ' + agent.arch + ', Ver ' + agent.ver + ', Size ' + ((agent.binary == null) ? 0 : agent.binary.length) + '<br />'; }
1096 + for (var j in arch) { var agent = arch[j]; cmdData.result += 'Arch ' + agent.arch + ', Ver ' + agent.ver + ', Size ' + ((agent.binary == null) ? 0 : agent.binary.length) + '<br />'; }
1097 }
1098 }
1171 - return r;
1099 }
1100
1174 - function swarmstatsConsoleCommand(command, cmdargs) {
1175 - var r = '';
1101 + function swarmstatsConsoleCommand(cmdData) {
1102 if (parent.parent.swarmserver == null) {
1177 - r = 'Swarm server not running.';
1103 + cmdData.result = 'Swarm server not running.';
1104 } else {
1105 for (var i in parent.parent.swarmserver.stats) {
1106 if (typeof parent.parent.swarmserver.stats[i] == 'object') {
1181 - r += i + ': ' + JSON.stringify(parent.parent.swarmserver.stats[i]) + '\r\n';
1107 + cmdData.result += i + ': ' + JSON.stringify(parent.parent.swarmserver.stats[i]) + '\r\n';
1108 } else {
1183 - r += i + ': ' + parent.parent.swarmserver.stats[i] + '\r\n';
1109 + cmdData.result += i + ': ' + parent.parent.swarmserver.stats[i] + '\r\n';
1110 }
1111 }
1112 }
1187 - return r;
1113 }
1114
1190 - function relaysConsoleCommand(command, cmdargs) {
1191 - var r = '';
1115 + function relaysConsoleCommand(cmdData) {
1116 for (var i in parent.wsrelays) {
1193 - r += 'id: ' + i + ', ' + ((parent.wsrelays[i].state == 2) ? 'connected' : 'pending');
1117 + cmdData.result += 'id: ' + i + ', ' + ((parent.wsrelays[i].state == 2) ? 'connected' : 'pending');
1118 if (parent.wsrelays[i].peer1 != null) {
1195 - r += ', ' + cleanRemoteAddr(parent.wsrelays[i].peer1.req.clientIp);
1196 - if (parent.wsrelays[i].peer1.user) { r += ' (User:' + parent.wsrelays[i].peer1.user.name + ')' }
1119 + cmdData.result += ', ' + cleanRemoteAddr(parent.wsrelays[i].peer1.req.clientIp);
1120 + if (parent.wsrelays[i].peer1.user) { cmdData.result += ' (User:' + parent.wsrelays[i].peer1.user.name + ')' }
1121 }
1122 if (parent.wsrelays[i].peer2 != null) {
1199 - r += ' to ' + cleanRemoteAddr(parent.wsrelays[i].peer2.req.clientIp);
1200 - if (parent.wsrelays[i].peer2.user) { r += ' (User:' + parent.wsrelays[i].peer2.user.name + ')' }
1123 + cmdData.result += ' to ' + cleanRemoteAddr(parent.wsrelays[i].peer2.req.clientIp);
1124 + if (parent.wsrelays[i].peer2.user) { cmdData.result += ' (User:' + parent.wsrelays[i].peer2.user.name + ')' }
1125 }
1202 - r += '\r\n';
1126 + cmdData.result += '\r\n';
1127 }
1204 - if (r == '') { r = 'No relays.'; }
1205 - return r;
1128 + if (cmdData.result == '') { cmdData.result = 'No relays.'; }
1129 }
1130
1208 - function autobackupConsoleCommand(command, cmdargs) {
1209 - var r = '';
1131 + function autobackupConsoleCommand(cmdData) {
1132 var backupResult = parent.db.performBackup(function (msg) {
1211 - try { ws.send(JSON.stringify({ action: 'serverconsole', value: msg, tag: command.tag })); } catch (ex) { }
1133 + try { ws.send(JSON.stringify({ action: 'serverconsole', value: msg, tag: cmdData.command.tag })); } catch (ex) { }
1134 });
1213 - if (backupResult == 0) { r = 'Starting auto-backup...'; } else { r = 'Backup alreay in progress.'; }
1214 - return r;
1135 + if (backupResult == 0) { cmdData.result = 'Starting auto-backup...'; } else { cmdData.result = 'Backup alreay in progress.'; }
1136 }
1137
1217 - function backupconfigConsoleCommand(command, cmdargs) {
1218 - return parent.db.getBackupConfig();
1138 + function backupconfigConsoleCommand(cmdData) {
1139 + cmdData.result = parent.db.getBackupConfig();
1140 }
1141
1221 - function firebaseConsoleCommand(command, cmdargs) {
1222 - var r = '';
1142 + function firebaseConsoleCommand(cmdData) {
1143 if (parent.parent.firebase == null) {
1224 - r = "Firebase push messaging not supported";
1144 + cmdData.result = "Firebase push messaging not supported";
1145 } else {
1226 - r = JSON.stringify(parent.parent.firebase.stats, null, 2);
1146 + cmdData.result = JSON.stringify(parent.parent.firebase.stats, null, 2);
1147 }
1228 - return r;
1148 }
1149
1150 // Process incoming web socket data from the browser
@@ -1582,29 +1501,28 @@ module.exports.CreateMeshUser = function (parent, db, ws, req, args, domain, use
1501 {
1502 // Do not allow this command when logged in using a login token
1503 if (req.session.loginToken != null) break;
1585 -
1504 // This is a server console message, only process this if full administrator
1505 if (user.siteadmin != SITERIGHT_ADMIN) break;
1588 -
1506 // Only accept if the console is allowed for this domain
1507 if ((domain.myserver === false) || ((domain.myserver != null) && (domain.myserver !== true) && (domain.myserver.console !== true))) break;
1508
1592 - var r = '';
1509 var cmdargs = splitArgs(command.value);
1510 if (cmdargs.length == 0) break;
1511 const cmd = cmdargs[0].toLowerCase();
1512 cmdargs = parseArgs(cmdargs);
1513 + var cmdData = { result: '', command: command, cmdargs: cmdargs };
1514
1515 try {
1599 - r = consoleCommands[cmd](command, cmdargs);
1516 + consoleCommands[cmd](cmdData, command, cmdargs);
1517 } catch (e) {
1518 if (consoleCommands[cmd] == null)
1602 - r = 'Unknown command \"' + cmd + '\", type \"help\" for list of available commands.';
1519 + cmdData.result = 'Unknown command \"' + cmd + '\", type \"help\" for list of available commands.';
1520 else
1521 console.log(e);
1522 }
1523
1607 - if (r != null && r != '') { try { ws.send(JSON.stringify({ action: 'serverconsole', value: r, tag: command.tag })); } catch (ex) { } }
1524 + if (cmdData.result != null && cmdData.result != '') {
1525 + try { ws.send(JSON.stringify({ action: 'serverconsole', value: cmdData.result, tag: command.tag })); } catch (ex) { } }
1526 break;
1527 }
1528 case 'msg':