From cbc6071e65dcfa245eba00738e22f82ec439a62d Mon Sep 17 00:00:00 2001 From: Ylian Saint-Hilaire Date: Tue, 4 May 2021 18:35:50 -0700 Subject: [PATCH] AmtManager fix. --- amtmanager.js | 1 + out.txt | 1014 ------------------------------------------------- 2 files changed, 1 insertion(+), 1014 deletions(-) delete mode 100644 out.txt diff --git a/amtmanager.js b/amtmanager.js index 38d08d0a..3ec8e414 100644 --- a/amtmanager.js +++ b/amtmanager.js @@ -314,6 +314,7 @@ module.exports.CreateAmtManager = function (parent) { // If there are any changes, apply them. if (event.node.intelamt != null) { + if (dev.intelamt == null) { dev.intelamt = {}; } if ((typeof event.node.intelamt.version == 'string') && (event.node.intelamt.version != dev.intelamt.ver)) { dev.intelamt.ver = event.node.intelamt.version; } if ((typeof event.node.intelamt.user == 'string') && (event.node.intelamt.user != dev.intelamt.user)) { dev.intelamt.user = event.node.intelamt.user; } if ((typeof event.node.intelamt.pass == 'string') && (event.node.intelamt.pass != dev.intelamt.pass)) { dev.intelamt.pass = event.node.intelamt.pass; } diff --git a/out.txt b/out.txt deleted file mode 100644 index ef217645..00000000 --- a/out.txt +++ /dev/null @@ -1,1014 +0,0 @@ -Server Ctrl-C exit... -MeshCentral HTTP redirection server running on port 80. -MeshCentral v0.8.27, Hybrid (LAN + WAN) mode. -MeshCentral Intel(R) AMT server running on central.mesh.meshcentral.com:4433. -MeshCentral HTTPS server running on central.mesh.meshcentral.com:443. -Server Ctrl-C exit... -MeshCentral HTTP redirection server running on port 80. -MeshCentral v0.8.27, Hybrid (LAN + WAN) mode. -MeshCentral Intel(R) AMT server running on central.mesh.meshcentral.com:4433. -MeshCentral HTTPS server running on central.mesh.meshcentral.com:443. -ERR: {"name":"node-rdpjs","hostname":"Central","pid":11336,"level":40,"msg":"undefined","time":"2021-05-04T21:59:37.526Z","v":0} -ERR: {"name":"node-rdpjs","hostname":"Central","pid":11336,"level":30,"msg":"MCS DISCONNECT_PROVIDER_ULTIMATUM","time":"2021-05-04T21:59:47.488Z","v":0} -TypeError: Cannot read property 'user' of undefined - at Object.obj.HandleEvent (C:\Users\Default.DESKTOP-9CGK2DI\Desktop\AmtWebApp\meshcentral\amtmanager.js:318:123) - at Object.CreateMeshCentralServer.obj.DispatchEvent (C:\Users\Default.DESKTOP-9CGK2DI\Desktop\AmtWebApp\meshcentral\meshcentral.js:1964:57) - at Array. (C:\Users\Default.DESKTOP-9CGK2DI\Desktop\AmtWebApp\meshcentral\amtscanner.js:353:32) - at fileBulkReadCompleted (C:\Users\Default.DESKTOP-9CGK2DI\Desktop\AmtWebApp\meshcentral\db.js:1711:106) - at C:\Users\Default.DESKTOP-9CGK2DI\Desktop\AmtWebApp\meshcentral\node_modules\mongodb\lib\utils.js:697:5 - at handleCallback (C:\Users\Default.DESKTOP-9CGK2DI\Desktop\AmtWebApp\meshcentral\node_modules\mongodb\lib\utils.js:102:55) - at cursor.close (C:\Users\Default.DESKTOP-9CGK2DI\Desktop\AmtWebApp\meshcentral\node_modules\mongodb\lib\cursor.js:840:66) - at C:\Users\Default.DESKTOP-9CGK2DI\Desktop\AmtWebApp\meshcentral\node_modules\mongodb\lib\utils.js:697:5 - at _endSession (C:\Users\Default.DESKTOP-9CGK2DI\Desktop\AmtWebApp\meshcentral\node_modules\mongodb\lib\cursor.js:925:9) - at Cursor._endSession (C:\Users\Default.DESKTOP-9CGK2DI\Desktop\AmtWebApp\meshcentral\node_modules\mongodb\lib\core\cursor.js:397:7) { parent: - { db: - { identifier: 'c20e5eba18c5b617ebc4bea79f7e573396177b25058fb03949591d4f62f6d12107d55f90771e26ba53c8e6e0dd486394', - dbKey: null, - dbRecordsEncryptKey: , - dbRecordsDecryptKey: , - changeStream: false, - pluginsActive: false, - dbCounters: [Object], - filePendingGet: null, - filePendingGets: [Object], - filePendingRemove: null, - filePendingRemoves: null, - filePendingSet: true, - filePendingSets: null, - filePendingCb: null, - filePendingCbs: null, - powerFilePendingSet: false, - powerFilePendingSets: null, - powerFilePendingCb: null, - powerFilePendingCbs: null, - eventsFilePendingSet: true, - eventsFilePendingSets: null, - eventsFilePendingCb: null, - eventsFilePendingCbs: null, - SetupDatabase: [Function], - maintenance: [Function], - cleanup: [Function], - getEncryptDataKey: [Function], - encryptData: [Function], - decryptData: [Function], - getStats: [Function], - getValueOfTheDay: [Function], - escapeBase64: [Function: escapeBase64], - performRecordEncryptionRecode: [Function], - databaseType: 3, - getBackupConfig: [Function], - checkBackupCapability: [Function], - performingBackup: false, - performBackup: [Function], - performCloudBackup: [Function], - nedbtodb: [Function], - file: [Object], - eventsfile: [Object], - powerfile: [Object], - smbiosfile: [Object], - serverstatsfile: [Object], - Set: [Function], - Get: [Function], - GetAll: [Function], - GetHash: [Function], - GetAllTypeNoTypeField: [Function], - GetAllTypeNoTypeFieldMeshFiltered: [Function], - GetAllTypeNodeFiltered: [Function], - GetAllType: [Function], - GetAllIdsOfType: [Function], - GetUserWithEmail: [Function], - GetUserWithVerifiedEmail: [Function], - Remove: [Function], - RemoveAll: [Function], - RemoveAllOfType: [Function], - InsertMany: [Function], - RemoveMeshDocuments: [Function], - MakeSiteAdmin: [Function], - DeleteDomain: [Function], - SetUser: [Function], - dispose: [Function], - getLocalAmtNodes: [Function], - getAmtUuidMeshNode: [Function], - isMaxType: [Function], - GetAllEvents: [Function], - StoreEvent: [Function], - GetEvents: [Function], - GetEventsWithLimit: [Function], - GetUserEvents: [Function], - GetUserEventsWithLimit: [Function], - GetUserLoginEvents: [Function], - GetNodeEventsWithLimit: [Function], - GetNodeEventsSelfWithLimit: [Function], - RemoveAllEvents: [Function], - RemoveAllNodeEvents: [Function], - RemoveAllUserEvents: [Function], - GetFailedLoginCount: [Function], - getAllPower: [Function], - storePowerEvent: [Function], - getPowerTimeline: [Function], - removeAllPowerEvents: [Function], - removeAllPowerEventsForNode: [Function], - GetAllSMBIOS: [Function], - SetSMBIOS: [Function], - RemoveSMBIOS: [Function], - GetSMBIOS: [Function], - SetServerStats: [Function], - GetServerStats: [Function], - getConfigFile: [Function], - setConfigFile: [Function], - listConfigFiles: [Function], - getAllConfigFiles: [Function], - getDbStats: [Function] }, - webserver: - { fs: [Object], - net: [Object], - tls: [Object], - path: [Object], - bodyParser: [Object], - session: [Function: cookieSession], - exphbs: [Object], - crypto: [Object], - common: [Object], - express: [Object], - meshAgentHandler: [Object], - meshRelayHandler: [Object], - meshDeviceFileHandler: [Object], - meshDesktopMultiplexHandler: [Object], - meshIderHandler: [Object], - meshUserHandler: [Object], - interceptor: [Object], - uaparser: [Object], - webauthn: [Object], - args: [Object], - parent: [Circular], - filespath: 'C:\\Users\\Default.DESKTOP-9CGK2DI\\Desktop\\AmtWebApp\\meshcentral-files', - db: [Object], - app: [Object], - tlsServer: [Object], - tcpServer: [Object], - certificates: [Object], - users: [Object], - meshes: [Object], - userGroups: [Object], - userAllowedIp: [Object], - agentAllowedIp: undefined, - agentBlockedIp: undefined, - tlsSniCredentials: null, - dnsDomains: {}, - relaySessionCount: 0, - relaySessionErrorCount: 0, - blockedUsers: 0, - blockedAgents: 0, - renderPages: [Object], - renderLanguages: [Object], - webCertificateHash: '\u0002@4Ïhs$æJAÎ*\u0017F{Íç\u000f²®/\u001c—íÞ\u000bl\u0017d\tm\u0018\u0007¾dû¡)Q\tYÅ»Û ›', - webCertificateHashs: [Object], - webCertificateHashBase64: 'AkA0z2hzJOZKQc4qF0Z7zecPsq4vHJft3gtsF2QJbRgHf75k@6EpUQlZxbuB26Cb', - webCertificateFullHash: '—êötê±1Ów_\u0012Ï©Éxх éʯ:…KðëOùL-lSÊ=ÄVÚ\u0014\u0002€Ffû½®/É', - webCertificateFullHashs: [Object], - webCertificateExpire: [Object], - agentCertificateHashHex: 'd99362d5ed8baea8bf9e743b34b242256370c460fd66cb62373c6cfcb204d6d707403e396cf0ef6dc2b3a42f735135fd', - agentCertificateHashBase64: '2ZNi1e2Lrqi$nnQ7NLJCJWNwxGD9ZstiNzxs$LIE1tcHQD45bPDvbcKzpC9zUTX9', - agentCertificateAsn1: '0‚\u0004’0‚\u0002ú \u0003\u0002\u0001\u0002\u0002\u0003\u0005f“0\r\u0006\t*†H†÷\r\u0001\u0001\f\u0005\u00000E1\u001f0\u001d\u0006\u0003U\u0004\u0003\u0013\u0016MeshCentralRoot-f695371\u00100\u000e\u0006\u0003U\u0004\n\u0013\u0007unknown1\u00100\u000e\u0006\u0003U\u0004\u0006\u0013\u0007unknown0\u001e\u0017\r161014014303Z\u0017\r471014014303Z0(1&0$\u0006\u0003U\u0004\u0003\u0013\u001dMeshCentralAgentServer-3649ee0‚\u0001¢0\r\u0006\t*†H†÷\r\u0001\u0001\u0001\u0005\u0000\u0003‚\u0001\u00000‚\u0001Š\u0002‚\u0001\u0000‰\u00061$e{õ!ë\u0018G×ý‘\u0014÷]E\u001feÝ\u0012ü/ÇÂl ;¨±æjÑD­‡»·¢\u0013"¦¼[ÕÝ_ÖA0˜KÌF6u\u00100¤¯Ÿ|{;ÅZÿµóx·\u0017\u001f|Œ÷=üJ!3ìV‘µKÁFqDe֑ª<|e’ã\u0014ó°ƒ\u0014¿FÀŽMpo\\ä\u001f„º¦ýZ\u0013&\fl„\u0000\fÜ\u001dµ?Ý:\u0003$¤\u0014ªÈ’\u0019Pqt„oT\u0015\r»fÊá\u00182pñ©¿_!\rXO\n½¶£3 @’§ñúÝJ\u0010íO\u0016|\u00119Ã9¡sKzdÉ·v\u001cl¡Ã\u0004GâN:ùµ=ª—\u0011W$tTb–­^Ñ\u0017ÅD+4óŽ\u0000˜’Ën/7úvA\u0010¦¿£•ò\'E-«Ýå눈\u001fm\u0007jÕݲm–\u0005<ð\u0005TMa7gºúêçÀÓ üäöã¸\u001d*ëåjï‡Å¬¸X¬p\u000bZÝ\t̆¸§[¯OÛúJÑ0?‰KÂë¾Ç¤\u0007^\t>dï\u001brS²\u001fòp—–\f`³öÈϗ´ç´|‰nÛæëag\u001e¿\u0011Ž}Yº9\u0019k2¼†²QF±ì²BW‰F“\u0002\u0003\u0001\u0000\u0001£§0¤0\t\u0006\u0003U\u001d\u0013\u0004\u00020\u00000\u000b\u0006\u0003U\u001d\u000f\u0004\u0004\u0003\u0002\u0002ô0\u0013\u0006\u0003U\u001d%\u0004\f0\n\u0006\b+\u0006\u0001\u0005\u0005\u0007\u0003\u00010\u0011\u0006\t`†H\u0001†øB\u0001\u0001\u0004\u0004\u0003\u0002\u0006@0\u001d\u0006\u0003U\u001d\u000e\u0004\u0016\u0004\u00146Iî\u000b\bªDãIÅLa¸è±Í:2÷0C\u0006\u0003U\u001d\u0011\u0004<0:†%http://MeshCentralAgentServer-3649ee/†\u0011http://localhost/0\r\u0006\t*†H†÷\r\u0001\u0001\f\u0005\u0000\u0003‚\u0001\u0000„•m6×\u001bÍymŸ=¯o÷W\u0019º;÷Ï\u0019ÎÊ\bLõŽìr»\u0016•ˆïzå\u0001Q¡y\b¡B“_\u000fñ±Äº£Æ\u0004\u0019çÑQ½U6~ehqw»S6±°céÁLÑ}ó*PÄNëg\b\u0015\u0018±‡É\u001fd¥)\u000fUÍ\u0001þ\\Ø-P÷ÂÀžE.ª\u0012†,Càèe&ZääYRÄ\r†éÕ\u001fÌü4Lc­î3x\u0005Eô‡¾yYÚíŠo\u0012:\u0016XÀìÉD\\íPiÁd¶ñšƒÍ¬OXf[mxºØÞÛ¶\u001eéK‚\u001eÄ\u00147X»Ô3¥/\n”½\u001dɵ\u0015ðÉ(ÇÈ;TŽ.,JI« !ŸûÚ}\u0007қeêüÍïeÜ%èGÖüÀÍõ­+Ãk_Â\u000bƒXÞ\u000eÛÎzۂET‡i咑Îúx)É¢O AìÐZMª|V\u0014+°]D¡É¶\u0002X¾¤c\u0001¼Ç½äÓTÎ5Ÿ.«·oØA݉A¯\r@§X¼rb²D]ú«¶\u000b)€2\u001dR½ô\u0002+kÁ\u000fgUfËN­\u0018e$¤jɓæÆò\u0007Ÿ.m!¾Ÿp0ÒüG x¼Ç×\r¨', - defaultWebCertificateHash: '\u0002@4Ïhs$æJAÎ*\u0017F{Íç\u000f²®/\u001c—íÞ\u000bl\u0017d\tm\u0018\u0007¾dû¡)Q\tYÅ»Û ›', - defaultWebCertificateFullHash: '—êötê±1Ów_\u0012Ï©Éxх éʯ:…KðëOùL-lSÊ=ÄVÚ\u0014\u0002€Ffû½®/É', - swarmCertificateAsn1: '0‚\u0002ù0‚\u0001á \u0003\u0002\u0001\u0002\u0002\b464986690\r\u0006\t*†H†÷\r\u0001\u0001\u000b\u0005\u0000031\u000b0\t\u0006\u0003U\u0004\u0006\u0013\u0002us1\u000f0\r\u0006\u0003U\u0004\n\u0013\u0006sample1\u00130\u0011\u0006\u0003U\u0004\u0003\u0013\nMasterRoot0\u001e\u0017\r120802193045Z\u0017\r391219193045Z0 1\u001e0\u001c\u0006\u0003U\u0004\u0003\u0013\u0015meshcentral.intel.com0‚\u0001"0\r\u0006\t*†H†÷\r\u0001\u0001\u0001\u0005\u0000\u0003‚\u0001\u000f\u00000‚\u0001\n\u0002‚\u0001\u0001\u0000ÓÐ5¼\u0016Ìç¿e”\u00165„\u0018\u0005¡“¢$]„|\b´!$\u001fD|š6«õlórVs\u000fqh\\ò|*ZöƒZÒÈ|xGoEÅEñ\u0018šèéË\u0006\\\nK\u0001ñï¡|ٚ¯hC½;\u001b¬A„\u001e¼ß·\u0019xj„7Æâ¤L«èÃD=øY«A<Éù—ñXˆý=åÓë\u0017\u000et–ágË\u0013H\u0017güÊþѵ·\u001aozkßݶ`ÆfÐÂÃxž?|âÁª›\u0007ŠÈá‹PòàPb·\u0017´éFÀíDH/9º§þÜsÆ^×\u001c"C#•uÁÌiãצœR\u0017\u0015\\°`\u000f×\u0015\u000fV\u00104!YÓjîo*B;DäÜ꧄ë;¯¢—A¤`HCªÒÏöŠ\u0016:¾NÂu¡\u0002\u0003\u0001\u0000\u0001£$0"0\u000b\u0006\u0003U\u001d\u000f\u0004\u0004\u0003\u0002\u0003¨0\u0013\u0006\u0003U\u001d%\u0004\f0\n\u0006\b+\u0006\u0001\u0005\u0005\u0007\u0003\u00010\r\u0006\t*†H†÷\r\u0001\u0001\u000b\u0005\u0000\u0003‚\u0001\u0001\u0000X \u000e_–ŠÒü—\u000b¨­1ƒ\u0019î\u001b†H\u0001’n\u000b\u000es¾\u001fÞ/eÓ¨\tŽÏKÜ¿9V³Ë•“MA6%\u0007haè¡\u001cŠÆÀB’ê—\u0016•Š2ފ)X/®ˆ\u0011¥\u001dà÷¦¡«½\nk|ª6ˆT‘æܘñ)‘X¨˜Káfº æ¹Ý\u0012ÛV°í}}\u0002ê}&\u000b1’óÒ5ªHÇ\u001fl-ß\u001dÍi¤ž›Ü‘=\fÐcˆ®\u0004(yVå«Ëþ¦1¯bۈnðf㢋É\u0017¾lÆ¢Cçö&ψÕOy(}@fk›\u0007€_\r©\u000b¢ÍýÄƉˆ’Ü1f==IÓød ßÂ)?$m[€\u0007ßÛʘûÞݾùR×W—yjê\n¬…͹n/%ù׺ü0Mÿ', - swarmCertificateHash384: 'q`\u0006÷ÇBDÃÿ(û5ÒJ&D7i…‰Uj²‡ÿ‰ pۀ‘iÕÕ$£¥¡äuß\u001e½¯¼', - swarmCertificateHash256: 'J{y´œBÙvßè\u001ax‰Ñ\u001cæfã؈/S§\'\u001a\u001b®9àØä', - wsagents: [Object], - wsagentsWithBadWebCerts: {}, - wsagentsDisconnections: {}, - wsagentsDisconnectionsTimer: [Object], - duplicateAgentsLog: {}, - wssessions: [Object], - wssessions2: [Object], - wsPeerSessions: {}, - wsPeerSessions2: {}, - wsPeerSessions3: {}, - sessionsCount: {}, - wsrelays: {}, - desktoprelays: {}, - wsPeerRelays: {}, - emailLanguages: [Object], - cleanDevice: [Function], - getStats: [Function], - agentStats: [Object], - getAgentStats: [Function], - getAgentIssues: [Function], - setAgentIssue: [Function], - agentIssues: [], - authenticate: [Function], - checkUserPassword: [Function], - checkOldUserPasswords: [Function], - isTrustedCert: [Function], - handleDomainRedirect: [Function], - getServerFilePath: [Function], - getQuota: [Function], - subscribe: [Function], - handleAmtEventRequest: [Function], - handleMeshAgentRequest: [Function], - getWebServerName: [Function], - handleMeshOsxAgentRequest: [Function], - handleMeshSettingsRequest: [Function], - handleDevicePowerEvents: [Function], - forceMeshAgentDisconnect: [Function], - sendMeshAgentCore: [Function], - recountSessions: [Function], - GetNodeWithRights: [Function], - GetAllMeshWithRights: [Function], - GetAllMeshIdWithRights: [Function], - GetMeshRights: [Function], - IsMeshViewable: [Function], - GetNodeRights: [Function], - CreateMeshDispatchTargets: [Function], - CreateNodeDispatchTargets: [Function], - CloneSafeUser: [Function], - CloneSafeNode: [Function], - CloneSafeMesh: [Function], - filterUserWebState: [Function], - routeAgentCommand: [Function], - getLanguageCodes: [Function], - performWebPush: [Function], - removePmtFromAllOtherNodes: [Function], - badLoginTable: {}, - badLoginTableLastClean: 0, - setbadLogin: [Function], - checkAllowLogin: [Function], - cleanBadLoginTable: [Function], - httpAuthRandom: , - httpAuthRealm: '38b4bdd2b5ab9ddb334b4f9034e660c9', - relayRandom: , - expressWs: [Object] }, - redirserver: - { parent: [Circular], - db: [Object], - args: [Object], - certificates: [Object], - express: [Object], - net: [Object], - app: [Object], - tcpServer: [Object], - port: 80, - hookMainWebServer: [Function] }, - mpsserver: - { fs: [Object], - path: [Object], - parent: [Circular], - db: [Object], - args: [Object], - certificates: [Object], - ciraConnections: {}, - httpResponses: [Object], - server: [Object], - getStats: [Function], - onWebSocketConnection: [Function], - close: [Function], - closeAllForNode: [Function], - SendJsonControl: [Function], - GetConnectionToNode: [Function], - SetupChannelToNode: [Function], - SetupChannel: [Function], - changeDeviceMesh: [Function], - addHttpFileResponse: [Function] }, - mqttbroker: null, - swarmserver: null, - mailserver: null, - smsserver: null, - amtEventHandler: { parent: [Circular], handleAmtEvent: [Function] }, - pluginHandler: null, - amtScanner: - { active: true, - parent: [Circular], - net: [Object], - tls: [Object], - dns: [Object], - dgram: [Object], - common: [Object], - servers: [Object], - rserver: {}, - rpacket: null, - tagToId: {}, - scanTable: [Object], - scanTableTags: [Object], - pendingSends: [Object], - pendingSendTimer: [Object], - mainTimer: [Object], - nextTag: 22, - buildRmcpPing: [Function], - start: [Function], - stop: [Function], - performRangeScan: [Function], - parseIpv4Range: [Function], - parseIpv4Addr: [Function], - IPv4NumToStr: [Function], - ResolveName: [Function], - performScan: [Function], - performSpecificScan: [Function], - checkAmtPresence: [Function], - checkAmtPresenceEx: [Function], - sendPendingPacket: [Function], - parseRmcpPacket: [Function], - changeConnectState: [Function], - reportMachineState: [Function], - changeAmtState: [Function], - compareAmtVersionStr: [Function], - checkTcpPresence: [Function], - checkTcpPresenceEx: [Function], - getIntelAmtVersionFromHeaders: [Function] }, - amtManager: [Circular], - meshScanner: - { parent: [Circular], - dgram: [Object], - common: [Object], - servers4: [Object], - servers6: [Object], - mainTimer: [Object], - agentCertificateHashHex: 'D99362D5ED8BAEA8BF9E743B34B242256370C460FD66CB62373C6CFCB204D6D707403E396CF0EF6DC2B3A42F735135FD', - error: 0, - pendingOutboundPackets: [], - pendingOutboundTimer: null, - multicastKey: , - start: [Function], - stop: [Function], - performScan: [Function], - wakeOnLan: [Function], - multicastPacket4: , - multicastPacket4x: , - multicastPacket6: , - multicastPacket6x: }, - letsencrypt: null, - eventsDispatch: - { '*': [Object], - 'user//admin': [Object], - 'server-global': [Object], - 'mesh//7b4b43cdad850135f36ab31124b52e47c167fba055ce800267a4dc89fe0e581c': [Object], - 'mesh//Xa@CUKjtgzRPXcesXj81l91hFBxlu7o8ToDSXSeqvbdtKMyKpKQbOhBwj5z05TLX': [Object], - 'mesh//sjN2rO85LGJCEXxW50TUI1vOCr@9zVpE4A@9jrAcPjA7n531RHZVMGpksK1yWY4O': [Object], - 'mesh//L9IeoqmIQ2OCrXTwt8ZdSLGspsFFAefxE8hcJmdlCiCVETKYDJuARvVewc7oYLXp': [Object], - 'mesh//1QzgjuweFmNiXaGeyqoWIiq0L5sziVb6rYy9SXPZAeGOOSEUHtUk4m1bjViqpeOL': [Object], - 'mesh//QGAj4HwbBlZNke6TJ8ll$$CT8yUMfZAhBmbuAcelswaF9FZ0uqn1BFfscLnvk5BK': [Object] }, - fs: - { Stats: [Function], - F_OK: 0, - R_OK: 4, - W_OK: 2, - X_OK: 1, - access: [Function], - accessSync: [Function], - exists: [Function], - existsSync: [Function], - readFile: [Function], - readFileSync: [Function], - close: [Function: close], - closeSync: [Function: closeSync], - open: [Function], - openSync: [Function], - read: [Function], - readSync: [Function], - write: [Function], - writeSync: [Function], - rename: [Function], - renameSync: [Function], - truncate: [Function], - truncateSync: [Function], - ftruncate: [Function], - ftruncateSync: [Function], - rmdir: [Function], - rmdirSync: [Function], - fdatasync: [Function], - fdatasyncSync: [Function], - fsync: [Function], - fsyncSync: [Function], - mkdir: [Function], - mkdirSync: [Function], - readdir: [Function], - readdirSync: [Function], - fstat: [Function], - lstat: [Function], - stat: [Function], - fstatSync: [Function], - lstatSync: [Function], - statSync: [Function], - readlink: [Function], - readlinkSync: [Function], - symlink: [Function], - symlinkSync: [Function], - link: [Function], - linkSync: [Function], - unlink: [Function], - unlinkSync: [Function], - fchmod: [Function], - fchmodSync: [Function], - chmod: [Function], - chmodSync: [Function], - fchown: [Function], - fchownSync: [Function], - chown: [Function], - chownSync: [Function], - _toUnixTimestamp: [Function: toUnixTimestamp], - utimes: [Function], - utimesSync: [Function], - futimes: [Function], - futimesSync: [Function], - writeFile: [Function], - writeFileSync: [Function], - appendFile: [Function], - appendFileSync: [Function], - watch: [Function], - watchFile: [Function], - unwatchFile: [Function], - realpathSync: [Function: realpathSync], - realpath: [Function: realpath], - createReadStream: [Function], - ReadStream: [Object], - FileReadStream: [Object], - createWriteStream: [Function], - WriteStream: [Object], - FileWriteStream: [Object], - mkdtemp: [Function], - mkdtempSync: [Function] }, - path: - { resolve: [Function: resolve], - normalize: [Function: normalize], - isAbsolute: [Function: isAbsolute], - join: [Function: join], - relative: [Function: relative], - _makeLong: [Function: _makeLong], - dirname: [Function: dirname], - basename: [Function: basename], - extname: [Function: extname], - format: [Function: format], - parse: [Function: parse], - sep: '\\', - delimiter: ';', - win32: [Circular], - posix: [Object] }, - crypto: - { DEFAULT_ENCODING: 'buffer', - _toBuf: [Function: toBuf], - Hash: [Object], - createHash: [Object], - Hmac: [Object], - createHmac: [Object], - Cipher: [Object], - createCipher: [Object], - Cipheriv: [Object], - createCipheriv: [Object], - Decipher: [Object], - createDecipher: [Object], - Decipheriv: [Object], - createDecipheriv: [Object], - Sign: [Object], - createSign: [Object], - Verify: [Object], - createVerify: [Object], - publicEncrypt: [Function], - publicDecrypt: [Function], - privateEncrypt: [Function], - privateDecrypt: [Function], - DiffieHellman: [Function: DiffieHellman], - createDiffieHellman: [Function: DiffieHellman], - getDiffieHellman: [Function: DiffieHellmanGroup], - createDiffieHellmanGroup: [Function: DiffieHellmanGroup], - DiffieHellmanGroup: [Function: DiffieHellmanGroup], - createECDH: [Function: createECDH], - pbkdf2: [Function], - pbkdf2Sync: [Function], - Certificate: [Function: Certificate], - setEngine: [Function: setEngine], - pseudoRandomBytes: [Function: randomBytes], - randomBytes: [Function: randomBytes], - prng: [Function: randomBytes], - rng: [Function: randomBytes], - getCiphers: [Function], - getHashes: [Function], - getCurves: [Function], - createCredentials: [Getter], - Credentials: [Getter] }, - exeHandler: - { streamExeWithJavaScript: [Function], - streamExeWithMeshPolicy: [Function], - parseWindowsExecutable: [Function], - hashExecutableFile: [Function] }, - platform: 'win32', - args: - { _: [], - user: 'admin', - launch: 11360, - _heapdump: true, - _log: 'main,web,webrequest,cert', - _ignoreagenthashcheck: [Object], - _authlog: 'c:\\temp\\auth.log', - _syslog: 'meshcentral', - _syslogauth: 'meshcentral-auth', - _syslogjson: 'meshcentral-json', - _lanonly: true, - _wanonly: true, - _maintenancemode: true, - cert: 'central.mesh.meshcentral.com', - mongodb: 'mongodb://127.0.0.1:27017?replicaSet=rs0', - _mongodbname: 'meshcentral', - _mongodbchangestream: true, - mongodbbulkoperations: true, - publicpushnotifications: true, - _filespath: 'c:\\Servnet_Files', - _dbexpire: [Object], - dbrecordsencryptkey: 'MyReallySecretPassword', - _dbencryptkey: 'MyReallySecretPassword', - _port: 444, - _portbind: '127.0.0.1', - _aliasport: 443, - _redirport: 800, - _redirportbind: '127.0.0.1', - _rediraliasport: 80, - _agentport: 443, - _agentaliasport: 889, - _agentaliasdns: 'agents.mesh.meshcentral.com', - _agentporttls: true, - agentlogdump: true, - agentcoredump: true, - agentcoredumpusers: [Object], - compression: true, - wscompression: true, - agentwscompression: true, - _agentsinram: true, - _cookieipcheck: false, - _cookieencoding: 'hex', - swarmport: 0, - _mesherrorlogpath: 'c:\\tmp', - _noagentupdate: 1, - _no2factorauth: true, - browserping: 5, - _browserpong: 5, - _agentsondisk: true, - _agentidletimeout: 150, - agentping: 5, - _agentpong: 5, - _mqtt: [Object], - _trustedproxy: 'CloudFlare', - __trustedproxy: [Object], - ___trustedproxy: 'central.mesh.meshcentral.com', - _tlsoffload: '127.0.0.1', - __tlsoffload: '192.168.2.164', - _mpsport: 44330, - _mpsportbind: '127.0.0.1', - _mpsaliasport: 4433, - _mpsaliashost: 'mps.mydomain.com', - _mpstlsoffload: true, - desktopmultiplex: true, - _minifycore: false, - _nice404: false, - _sessiontime: 2, - _configkey: 'MyReallySecretPassword', - sessionkey: 'MyReallySecretPassword', - _logincookieencryptionkey: 'aaaaaa', - sessionsamesite: 'strict', - _selfupdate: '0.3.1-a', - _allowlogintoken: true, - allowframing: true, - _allowhighqualitydesktop: false, - webpush: [Object], - _httpsstrict: true, - _amtprovisioningserver: [Object], - watchdog: [Object], - _managealldevicegroups: [Object], - managecrossdomain: [Object], - webrtc: true, - _npmtag: 'test', - _npmpath: '', - _npmproxy: 'http://192.168.2.10:91', - userallowedip: [Object], - _userblockedip: [Object], - _swarmallowedip: [Object], - _agentallowedip: [Object], - __agentallowedip: [Object], - localdiscovery: [Object], - _webrtconfig: [Object], - autobackup: [Object], - __maxinvalidlogin: false, - _maxinvalidlogin: [Object], - npmpath: '"C:\\Program Files\\nodejs\\npm"', - port: 443, - mpsport: 4433, - redirport: 80, - agentidletimeout: 150000, - webrtconfig: [Object] }, - common: - { ReadShort: [Function], - ReadShortX: [Function], - ReadInt: [Function], - ReadIntX: [Function], - ShortToStr: [Function], - ShortToStrX: [Function], - IntToStr: [Function], - IntToStrX: [Function], - MakeToArray: [Function], - SplitArray: [Function], - Clone: [Function], - IsFilenameValid: [Function: isFilenameValid], - makeFilename: [Function], - ArrayElementMove: [Function], - format: [Function], - ObjectToStringEx: [Function], - ObjectToStringEx2: [Function], - gap: [Function], - gap2: [Function], - ObjectToString: [Function], - ObjectToString2: [Function], - hex2rstr: [Function], - char2hex: [Function], - rstr2hex: [Function], - encode_utf8: [Function], - decode_utf8: [Function], - data2blob: [Function], - random: [Function], - quoteSplit: [Function], - parseNameValueList: [Function], - ComputeDigesthash: [Function], - toNumber: [Function], - escapeHtml: [Function], - escapeHtmlBreaks: [Function], - zeroPad: [Function], - objKeysToLower: [Function], - escapeFieldName: [Function], - unEscapeFieldName: [Function], - escapeLinksFieldNameEx: [Function], - escapeLinksFieldName: [Function], - unEscapeLinksFieldName: [Function], - unEscapeAllLinksFieldName: [Function], - validateString: [Function], - validateInt: [Function], - validateArray: [Function], - validateStrArray: [Function], - validateObject: [Function], - validateEmail: [Function], - validateUsername: [Function], - isAlphaNumeric: [Function], - validateAlphaNumericArray: [Function], - checkPasswordRequirements: [Function], - createTaskLimiterQueue: [Function], - translationsToJson: [Function], - copyFile: [Function], - meshServerRightsArrayToNumber: [Function], - sortObj: [Function], - validateObjectForMongo: [Function] }, - configurationFiles: null, - certificates: - { root: [Object], - webdefault: [Object], - web: [Object], - mps: [Object], - agent: [Object], - swarmserver: [Object], - swarmserverroot: [Object], - AmtMpsName: 'central.mesh.meshcentral.com', - WebIssuer: 'MeshCentralRoot-071233', - CommonName: 'central.mesh.meshcentral.com', - CommonNames: [Object], - RootName: 'MeshCentralRoot-071233', - dns: {} }, - connectivityByNode: - { 'node//2CVYFrHQmq6q9a6Lyh0I62q0z4RxX@84zd5WV6YE2KeUaLGtB3lhF@ODKkeIne0h': [Object], - 'node//4QBHyPR0ZkKMnnKZaac7N24IDutPXdc1Sh3$2AM5vebsxjuLbsr$TSdtYRJ6cs0p': [Object], - 'node//8VDrC2pSedqIgAUaMRDyZ1t1H320RvdE36C9mHdHjIB9ar4UvavoMILwfHg3tr$E': [Object], - 'node//oR6CRpgM0YRNQHs$WmBvpmgdZBAASGP8diZncJbF$y4jHrpd6BdWo2kDc3TDWsUd': [Object], - 'node//QOeuqHxFoICOHh3nyPmu2taW4otYs3YpkqREEUX08$73Iq@rSBGYtrJOT4gzUWmt': [Object], - 'node//yGBxJcIzRoFQJ2SuKVqnbAA2GrdxI0KYWj$sCFENHNrfwK0bHtQy1YaGkP5YbFcm': [Object], - 'node//xNzeDZR4d$qeWCTybNudPWnFzX9e8eXlgvm2paRgi@m6WO21F@LE4aCSNqX4Px2m': [Object], - 'node//m7YjMjg2a7A3NIcDdMX$nQNl3gbaBT6VU3XBye4Fvk0uzWUO7CKzkWUnbJuWimP5': [Object], - 'node//U5ffW1D6GeKWjcg@gj5tp$oDgaC5f1HkyyK7ShfM8LyxRiPObcmiOVsOs8rbM7OQ': [Object], - 'node//lUlo61H$cZ@@8z@dl3ihVTXc8rD9k0vbiiTWsWY7T$Eal$pNYyEiFi4JDohISFaV': [Object], - 'node//aY7sM0YjS@1t2$UwaRgKx2x4oQCJp@fVhG5sbcaZUMNS2J$dDV9Jf5irRIAHs7J6': [Object], - 'node//Uqr1kHG7hV22kjOGQULZaoCde93GcAIk6fnwsYZyXAx8hjJlwbubn@$M$FxLPxPh': [Object], - 'node//E@9IJ2YQ9N8SlCDZuep00jM7NxXfY3ltOzcZ7KzO7mB8grU@pVOw$ZI34$FcNf5n': [Object], - 'node//0fWSjlEGZ97uji3c1GHLaKyLHiRfgyG67v39z200$qf2IuwdyEz@Z4uoX@YreTqD': [Object], - 'node//HLZYZn3@8Jv1zURGCpFE41QtGqY6w2mW1wiitB1tRMjFFfq@HgpSfjm8wsO9PsAo': [Object], - 'node//csNXAKlgnhyCa8RmZmS7urv4I5e2RKUUVPIyympuYgRTM46KbiicUa@CBDHKcWA1': [Object], - 'node//4pIUaMC$T7tfPcozYgtDF2$AkxGfS16TA6$K8an0saNkhpwS$OSw6iICT2IUcMVt': [Object] }, - peerConnectivityByNode: {}, - debugSources: [], - debugRemoteSources: null, - config: - { '$schema': 'http://info.meshcentral.com/downloads/meshcentral-config-schema.json', - settings: [Object], - _configfiles: [Object], - _domaindefaults: [Object], - domains: [Object], - _letsencrypt: [Object], - _peers: [Object], - __smtp: [Object], - _smtp: [Object], - ___smtp: [Object], - _sendgrid: [Object], - ____smtp: [Object], - _sms: [Object], - __sms: [Object], - ___sms: [Object], - _firebase: [Object], - _firebaserelay: [Object] }, - dbconfig: - { _id: 'dbconfig', - version: 1, - amtWsEventSecret: '7e8142c1750a688d719d086a84d99921ce0ea76a5add16574b967e47905ac597' }, - certificateOperations: - { parent: [Circular], - fs: [Object], - forge: [Object], - crypto: [Object], - tls: [Object], - pki: [Object], - dirExists: [Function], - getFilesizeInBytes: [Function], - getAcmCertChain: [Function], - signAcmRequest: [Function], - logAmtActivation: [Function], - loadIntelAmtAcmCerts: [Function], - loadGenericCertAndKey: [Function], - GetSetupBinFile: [Function], - GetBareMetalSetupBinFile: [Function], - loadPfxCertificate: [Function], - loadTextFile: [Function], - loadCertificate: [Function], - fileExists: [Function], - fileLoad: [Function], - getPublicKeyHash: [Function], - getCertHashSha1: [Function], - getCertHashSha256: [Function], - getCertHash: [Function], - getPublicKeyHashBinary: [Function], - getCertHashBinary: [Function], - GenerateRootCertificate: [Function], - IssueWebServerCertificate: [Function], - compareCertificateNames: [Function], - checkCertificate: [Function], - GetMeshServerCertificate: [Function], - acceleratorCertStore: [Object], - getAcceleratorStats: [Function], - getAccelerator: [Function], - acceleratorStart: [Function], - acceleratorPerformSignature: [Function], - acceleratorPerformOperation: [Function] }, - defaultMeshCmd: 'var addedModules = [];\r\ntry { addModule("amt-apfclient", "function CreateAPFClient(q,e){if((e.clientuuid==null)||(e.clientuuid.length!=36)){return null}var o={};o.parent=q;o.args=e;o.http=require(\\"http\\");o.net=require(\\"net\\");o.forwardClient=null;o.downlinks={};o.pfwd_idx=0;o.timer=null;function u(L,K){return(L.charCodeAt(K)*16777216)+(L.charCodeAt(K+1)<<16)+(L.charCodeAt(K+2)<<8)+L.charCodeAt(K+3)}function n(K){return String.fromCharCode((K>>24)&255,(K>>16)&255,(K>>8)&255,K&255)}function m(K){var M=\\"\\",L=(\\"\\"+K).match(/../g),N;while(N=L.shift()){M+=String.fromCharCode(\\"0x\\"+N)}return M}function h(K){return(K+256).toString(16).substr(-2).toUpperCase()}function w(L){var M=\\"\\",K;for(K=0;K0){o.forwardClient.tag.accumulator=o.forwardClient.tag.accumulator.slice(P)}if(o.cirastate==i.FAILED){k(\\"APF: in a failed state, destroying socket.\\");o.forwardClient.ws.end()}}while(P>0)}catch(O){k(O)}});o.forwardClient.ws.on(\\"error\\",function(N){k(\\"APF: Connection error, ending connecting.\\");if(o.timer!=null){clearInterval(o.timer);o.timer=null}});o.state=i.INITIAL;if((typeof o.args.conntype==\\"number\\")&&(o.args.conntype!=0)){D(o.forwardClient.ws,{action:\\"connType\\",value:o.args.conntype});if(o.args.meiState!=null){D(o.forwardClient.ws,{action:\\"meiState\\",value:o.args.meiState})}}G(o.forwardClient.ws,o.args.clientuuid);H(o.forwardClient.ws,\\"auth@amt.intel.com\\")};o.updateMeiState=function(K){D(o.forwardClient.ws,{action:\\"meiState\\",value:K})};o.sendMeiDeactivationState=function(K){D(o.forwardClient.ws,{action:\\"deactivate\\",value:K})};o.sendStartTlsHostConfigResponse=function(K){D(o.forwardClient.ws,{action:\\"startTlsHostConfig\\",value:K})};o.sendStopConfigurationResponse=function(K){D(o.forwardClient.ws,{action:\\"stopConfiguration\\",value:K})};function D(M,L){var K=JSON.stringify(L);M.write(String.fromCharCode(d.JSON_CONTROL)+n(K.length)+K);k(\\"APF: Send JSON control: \\"+K)}function G(L,M){var K=String.fromCharCode(d.PROTOCOLVERSION)+n(1)+n(0)+n(0)+m(J(M))+f(64);L.write(K);k(\\"APF: Send protocol version 1 0 \\"+M);o.cirastate=i.PROTOCOL_VERSION_SENT}function H(M,L){var K=String.fromCharCode(d.SERVICE_REQUEST)+n(L.length)+L;M.write(K);k(\\"APF: Send service request \\"+L);if(L==\\"auth@amt.intel.com\\"){o.cirastate=i.AUTH_SERVICE_REQUEST_SENT}else{if(L==\\"pfwd@amt.intel.com\\"){o.cirastate=i.PFWD_SERVICE_REQUEST_SENT}}}function I(N,O,L){var M=\\"pfwd@amt.intel.com\\";var K=String.fromCharCode(d.USERAUTH_REQUEST)+n(O.length)+O+n(M.length)+M;K+=n(8)+\\"password\\";K+=f(1)+n(L.length)+L;N.write(K);k(\\"APF: Send username password authentication to MPS\\");o.cirastate=i.AUTH_REQUEST_SENT}function C(N,K,L){var O=\\"tcpip-forward\\";var M=String.fromCharCode(d.GLOBAL_REQUEST)+n(O.length)+O+f(1,1);M+=n(K.length)+K+n(L);N.write(M);k(\\"APF: Send tcpip-forward \\"+K+\\":\\"+L);o.cirastate=i.GLOBAL_REQUEST_SENT}function F(K){K.write(String.fromCharCode(d.KEEPALIVE_REQUEST)+n(255));k(\\"APF: Send keepalive request\\")}function E(L,K){L.write(String.fromCharCode(d.KEEPALIVE_REPLY)+n(K));k(\\"APF: Send keepalive reply\\")}function t(X){var N=X.tag.accumulator.charCodeAt(0);var Q=X.tag.accumulator.length;var O=X.tag.accumulator;if(Q==0){return 0}switch(N){case d.SERVICE_ACCEPT:var W=u(O,1),V=O.substring(5,6+W);k(\\"APF: Service request to \\"+V+\\" accepted.\\");if(V==\\"auth@amt.intel.com\\"){if(o.cirastate>=i.AUTH_SERVICE_REQUEST_SENT){I(X.ws,o.args.mpsuser,o.args.mpspass)}}else{if(V==\\"pfwd@amt.intel.com\\"){if(o.cirastate>=i.PFWD_SERVICE_REQUEST_SENT){C(X.ws,o.args.clientname,s[o.pfwd_idx++])}}}return 5+W;case d.REQUEST_SUCCESS:if(Q>=5){var T=u(O,1);k(\\"APF: Request to port forward \\"+T+\\" successful.\\");if(o.pfwd_idx=0){var K=o.net.createConnection({host:o.args.clientaddress,port:S.target_port},function(){z(X.ws,S)});K.maxInWindow=S.window_size;K.curInWindow=0;K.on(\\"data\\",function(Y){y(X.ws,S.sender_chan,Y)});K.on(\\"error\\",function(Y){A(X.ws,S)});K.on(\\"end\\",function(){var Y=o.downlinks[S.sender_chan];if(Y!=null){k(\\"Socket ends.\\");try{x(X.ws,S.sender_chan)}catch(Z){}delete o.downlinks[S.sender_chan]}});o.downlinks[S.sender_chan]=K}else{A(X.ws,S)}return S.len;case d.CHANNEL_OPEN_CONFIRMATION:k(\\"APF: CHANNEL_OPEN_CONFIRMATION\\");return 17;case d.CHANNEL_CLOSE:var U=u(O,1);k(\\"APF: CHANNEL_CLOSE: \\"+U);try{o.downlinks[U].end()}catch(P){}return 5;case d.CHANNEL_DATA:k(\\"APF: CHANNEL_DATA: \\"+JSON.stringify(w(O)));var U=u(O,1);var M=u(O,5);var L=O.substring(9,9+M);var K=o.downlinks[U];if(K!=null){K.curInWindow+=M;try{K.write(Buffer.from(L,\\"binary\\"),function(){k(\\"Write completed.\\");if(this.curInWindow>(this.maxInWindow/2)){B(X.ws,U,this.curInWindow);this.curInWindow=0}})}catch(P){k(\\"Cannot forward data to downlink socket.\\")}}return 9+M;case d.CHANNEL_WINDOW_ADJUST:k(\\"APF: CHANNEL_WINDOW_ADJUST\\");return 9;case d.JSON_CONTROL:k(\\"APF: JSON_CONTROL\\");var Q=u(O,1);if(o.onJsonControl){var R=null;try{R=JSON.parse(O.substring(5,5+Q))}catch(P){}if(R!=null){o.onJsonControl(R)}}return 5+Q;default:k(\\"CMD: \\"+N+\\" is not implemented.\\");o.cirastate=i.FAILED;return 0}}function r(M){var O={cmd:d.CHANNEL_OPEN};var L=u(M,1);O.chan_type=M.substring(5,5+L);O.sender_chan=u(M,5+L);O.window_size=u(M,9+L);var K=u(M,17+L);O.target_address=M.substring(21+L,21+L+K);O.target_port=u(M,21+L+K);var N=u(M,25+L+K);O.origin_address=M.substring(29+L+K,29+L+K+N);O.origin_port=u(M,29+L+K+N);O.len=33+L+K+N;return O}function A(L,K){L.write(String.fromCharCode(d.CHANNEL_OPEN_FAILURE)+n(K.sender_chan)+n(2)+n(0)+n(0));k(\\"APF: Send ChannelOpenFailure\\")}function z(L,K){L.write(String.fromCharCode(d.CHANNEL_OPEN_CONFIRMATION)+n(K.sender_chan)+n(K.sender_chan)+n(K.window_size)+n(4294967295));k(\\"APF: Send ChannelOpenConfirmation\\")}function B(M,K,L){M.write(String.fromCharCode(d.CHANNEL_WINDOW_ADJUST)+n(K)+n(L));k(\\"APF: Send ChannelWindowAdjust, channel: \\"+K+\\", size: \\"+L)}function y(M,K,L){M.write(Buffer.concat([Buffer.from(String.fromCharCode(d.CHANNEL_DATA)+n(K)+n(L.length),\\"binary\\"),L]));k(\\"APF: Send ChannelData: \\"+L.toString(\\"hex\\"))}function x(L,K){L.write(String.fromCharCode(d.CHANNEL_CLOSE)+n(K));k(\\"APF: Send ChannelClose \\")}o.connect=function(){if(o.forwardClient!=null){try{o.forwardClient.ws.end()}catch(K){k(K)}}o.cirastate=i.INITIAL;o.pfwd_idx=0;var L=o.http.parseUri(o.args.mpsurl);L.rejectUnauthorized=0;o.forwardClient=o.http.request(L);o.forwardClient.upgrade=o.onSecureConnect;o.forwardClient.end()};o.disconnect=function(){try{o.forwardClient.ws.end()}catch(K){k(K)}};return o}module.exports=CreateAPFClient;"); addedModules.push("amt-apfclient"); } catch (e) { }\r\ntry { addModule("amt-ider", "module.exports=function CreateAmtRemoteIder(){var B={};B.protocol=3;B.bytesToAmt=0;B.bytesFromAmt=0;B.rx_timeout=30000;B.tx_timeout=0;B.heartbeat=20000;B.version=1;B.acc=null;B.inSequence=0;B.outSequence=0;B.iderinfo=null;B.enabled=false;B.iderStart=0;B.floppy=null;B.cdrom=null;B.floppyReady=false;B.cdromReady=false;B.sectorStats=null;B.debug=false;var z=Buffer.from([0,38,49,128,0,0,0,0,5,30,16,169,8,32,2,0,3,195,0,0,0,0,0,0,0,0,0,0,40,0,0,0,0,0,0,0,2,208,0,0]);var s=Buffer.from([0,92,36,128,0,0,0,0,1,10,0,1,0,0,0,0,2,0,0,0,3,22,0,160,0,0,0,0,0,18,2,0,0,0,0,0,0,0,160,0,0,0,5,30,16,169,8,32,2,0,3,195,0,0,0,0,0,0,0,0,0,0,40,0,0,0,0,0,0,0,2,208,0,0,8,10,0,0,0,0,0,0,0,0,0,0,11,6,0,0,0,17,36,49]);var x=Buffer.from([0,38,36,128,0,0,0,0,5,30,4,176,2,18,2,0,0,80,0,0,0,0,0,0,0,0,0,0,40,0,0,0,0,0,0,0,2,208,0,0]);var r=Buffer.from([0,92,36,128,0,0,0,0,1,10,0,1,0,0,0,0,2,0,0,0,3,22,0,160,0,0,0,0,0,18,2,0,0,0,0,0,0,0,160,0,0,0,5,30,4,176,2,18,2,0,0,80,0,0,0,0,0,0,0,0,0,0,40,0,0,0,0,0,0,0,2,208,0,0,8,10,0,0,0,0,0,0,0,0,0,0,11,6,0,0,0,17,36,49]);var t=Buffer.from([0,18,1,128,0,0,0,0,26,10,0,0,0,0,0,0,0,0,0,0]);var u=Buffer.from([0,18,1,128,0,0,0,0,29,10,0,0,0,0,0,0,0,0,0,0]);var v=Buffer.from([0,32,1,128,0,0,0,0,42,24,0,0,0,0,32,0,0,0,0,0,0,128,0,0,0,0,0,0,0,0,0,0,0,0]);var q=Buffer.from([0,40,1,128,0,0,0,0,1,6,0,255,0,0,0,0,42,24,0,0,0,0,2,0,0,0,0,0,0,128,0,0,0,0,0,0,0,0,0,0,0,0]);var i=Buffer.from([0,0,0,40,0,0,0,8]);var j=Buffer.from([0,0,3,4,0,8,1,0]);var h=Buffer.from([0,1,3,4,0,0,0,2]);var m=Buffer.from([0,2,3,4,0,0,0,0]);var l=Buffer.from([0,3,3,4,41,0,0,2]);var k=Buffer.from([0,16,1,8,0,0,8,0,0,1,0,0]);var o=Buffer.from([0,30,3,0]);var n=Buffer.from([1,0,3,0]);var p=Buffer.from([1,5,3,0]);var y=Buffer.from([0,18,36,128,0,0,0,0,1,10,0,1,0,0,0,0,2,0,0,0]);var A=Buffer.from([0,18,49,128,0,0,0,0,1,10,0,1,0,0,0,0,2,0,0,0]);var w=Buffer.from([0,14,1,128,0,0,0,0,1,6,0,255,0,0,0,0]);B.xxStateChange=function(E){if(B.debug){console.log(\\"IDER-StateChange\\",E)}if(E==0){B.Stop()}if(E==3){B.Start()}};B.Start=function(){if(B.debug){console.log(\\"IDER-Start\\");console.log(B.floppy,B.cdrom)}B.bytesToAmt=0;B.bytesFromAmt=0;B.inSequence=0;B.outSequence=0;e=[];B.SendCommand(64,Buffer.concat([ShortToStrX(B.rx_timeout),ShortToStrX(B.tx_timeout),ShortToStrX(B.heartbeat),IntToStrX(B.version)]));if(B.sectorStats){B.sectorStats(0,0,B.floppy?(B.floppy.size>>9):0);B.sectorStats(0,1,B.cdrom?(B.cdrom.size>>11):0)}};B.Stop=function(){if(B.debug){console.log(\\"IDER-Stop\\")}B.parent.Stop()};B.ProcessData=function(E){B.bytesFromAmt+=E.length;if(B.acc==null){B.acc=E}else{B.acc=Buffer.concat(B.acc,E)}if(B.debug){console.log(\\"IDER-ProcessData\\",B.acc.length,B.acc.toString(\\"hex\\"))}while(B.acc!=null){var F=B.ProcessDataEx();if(F==0){return}if(B.inSequence!=ReadIntX(B.acc,4)){if(B.debug){console.log(\\"ERROR: Out of sequence\\",B.inSequence,ReadIntX(B.acc,4))}B.Stop();return}B.inSequence++;if(F==B.acc.length){B.acc=null}else{B.acc=B.acc.slice(F)}}};B.SendCommand=function(F,H,G,I){if(H==null){H=Buffer.alloc(0)}var E=((F>50)&&(G==true))?2:0;if(I){E+=1}var J=Buffer.concat([Buffer([F,0,0,E]),IntToStrX(B.outSequence++),H]);B.parent.xxSend(J);B.bytesToAmt+=J.length};B.SendCommandEndResponse=function(H,I,G,E,F){if(H){B.SendCommand(81,Buffer.from([0,0,0,0,0,0,0,0,0,0,0,0,197,0,3,0,0,0,G,80,0,0,0]),true)}else{B.SendCommand(81,Buffer.from([0,0,0,0,0,0,0,0,0,0,0,0,135,(I<<4),3,0,0,0,G,81,I,E,F]),true)}};B.SendDataToHost=function(G,E,F,H){var I=(H)?0:F.length;if(E==true){B.SendCommand(84,Buffer.concat([Buffer.from([0,(F.length&255),(F.length>>8),0,H?180:181,0,2,0,(I&255),(I>>8),G,88,133,0,3,0,0,0,G,80,0,0,0,0,0,0]),F]),E,H)}else{B.SendCommand(84,Buffer.concat([Buffer.from([0,(F.length&255),(F.length>>8),0,H?180:181,0,2,0,(I&255),(I>>8),G,88,0,0,0,0,0,0,0,0,0,0,0,0,0,0]),F]),E,H)}};B.SendGetDataFromHost=function(F,E){B.SendCommand(82,Buffer.from([0,(E&255),(E>>8),0,181,0,0,0,(E&255),(E>>8),F,88,0,0,0,0,0,0,0,0,0,0,0]),false)};B.SendDisableEnableFeatures=function(F,E){if(E==null){E=\\"\\"}B.SendCommand(72,Buffer.concat([Buffer.from([F]),E]))};B.ProcessDataEx=function(){if(B.acc.length<8){return 0}switch(B.acc[0]){case 65:if(B.acc.length<30){return 0}var I=B.acc[29];if(B.acc.length<(30+I)){return 0}B.iderinfo={};B.iderinfo.major=B.acc[8];B.iderinfo.minor=B.acc[9];B.iderinfo.fwmajor=B.acc[10];B.iderinfo.fwminor=B.acc[11];B.iderinfo.readbfr=ReadShortX(B.acc,16);B.iderinfo.writebfr=ReadShortX(B.acc,18);B.iderinfo.proto=B.acc[21];B.iderinfo.iana=ReadIntX(B.acc,25);if(B.debug){console.log(B.iderinfo)}if(B.iderinfo.proto!=0){if(B.debug){console.log(\\"Unknown proto\\",B.iderinfo.proto)}B.Stop()}if(B.iderinfo.readbfr>8192){if(B.debug){console.log(\\"Illegal read buffer size\\",B.iderinfo.readbfr)}B.Stop()}if(B.iderinfo.writebfr>8192){if(B.debug){console.log(\\"Illegal write buffer size\\",B.iderinfo.writebfr)}B.Stop()}if(B.iderStart==0){B.SendDisableEnableFeatures(3,IntToStrX(1+8))}else{if(B.iderStart==1){B.SendDisableEnableFeatures(3,IntToStrX(1+16))}else{if(B.iderStart==2){B.SendDisableEnableFeatures(3,IntToStrX(1+24))}}}return 30+I;case 67:if(B.debug){console.log(\\"CLOSE\\")}B.Stop();return 8;case 68:B.SendCommand(69);return 8;case 69:if(B.debug){console.log(\\"PONG\\")}return 8;case 70:if(B.acc.length<9){return 0}var J=B.acc[8];if(d===null){B.SendCommand(71);if(B.debug){console.log(\\"RESETOCCURED1\\",J)}}else{f=true;if(B.debug){console.log(\\"RESETOCCURED2\\",J)}}return 9;case 73:if(B.acc.length<13){return 0}var K=B.acc[8];var L=ReadIntX(B.acc,9);if(B.debug){console.log(\\"STATUS_DATA\\",K,L)}switch(K){case 1:if(L&1){if(B.iderStart==0){B.SendDisableEnableFeatures(3,IntToStrX(1+8))}else{if(B.iderStart==1){B.SendDisableEnableFeatures(3,IntToStrX(1+16))}else{if(B.iderStart==2){B.SendDisableEnableFeatures(3,IntToStrX(1+24))}}}}break;case 2:B.enabled=(L&2)?true:false;if(B.debug){console.log(\\"IDER Status: \\"+B.enabled)}break;case 3:if(L!=1){if(B.debug){console.log(\\"Register toggle failure\\")}}break}return 13;case 74:if(B.acc.length<11){return 0}if(B.debug){console.log(\\"IDER: ABORT\\",B.acc[8])}return 11;case 75:return 8;case 80:if(B.acc.length<28){return 0}var F=(B.acc[14]&16)?176:160;var G=B.acc[14];var E=B.acc.slice(16,28);var H=B.acc[9];if(B.debug){console.log(\\"SCSI_CMD\\",F,E.toString(\\"hex\\"),H,G)}g(F,E,H,G);return 28;case 83:if(B.acc.length<14){return 0}var I=ReadShortX(B.acc,9);if(B.acc.length<(14+I)){return 0}if(B.debug){console.log(\\"SCSI_WRITE, len = \\"+(14+I))}B.SendCommand(81,Buffer.from([0,0,0,0,0,0,0,0,0,0,0,0,135,112,3,0,0,0,160,81,7,39,0]),true);return 14+I;default:if(B.debug){console.log(\\"Unknown IDER command\\",B.acc[0])}B.Stop();break}return 0};function g(I,H,K,J){var N;var O;switch(H[0]){case 0:if(B.debug){console.log(\\"SCSI: TEST_UNIT_READY\\",I)}switch(I){case 160:if(B.floppy==null){B.SendCommandEndResponse(1,2,I,58,0);return -1}if(B.floppyReady==false){B.floppyReady=true;B.SendCommandEndResponse(1,6,I,40,0);return -1}break;case 176:if(B.cdrom==null){B.SendCommandEndResponse(1,2,I,58,0);return -1}if(B.cdromReady==false){B.cdromReady=true;B.SendCommandEndResponse(1,6,I,40,0);return -1}break;default:if(B.debug){console.log(\\"SCSI Internal error 3\\",I)}return -1}B.SendCommandEndResponse(1,0,I,0,0);break;case 8:N=((H[1]&31)<<16)+(H[2]<<8)+H[3];O=H[4];if(O==0){O=256}if(B.debug){console.log(\\"SCSI: READ_6\\",I,N,O)}C(I,N,O,K);break;case 10:N=((H[1]&31)<<16)+(H[2]<<8)+H[3];O=H[4];if(O==0){O=256}if(B.debug){console.log(\\"SCSI: WRITE_6\\",I,N,O)}B.SendCommandEndResponse(1,2,I,58,0);return -1;case 26:if(B.debug){console.log(\\"SCSI: MODE_SENSE_6\\",I)}if((H[2]==63)&&(H[3]==0)){var E=0,F=0;switch(I){case 160:if(B.floppy==null){B.SendCommandEndResponse(1,2,I,58,0);return -1}E=0;F=128;break;case 176:if(B.cdrom==null){B.SendCommandEndResponse(1,2,I,58,0);return -1}E=5;F=128;break;default:if(B.debug){console.log(\\"SCSI Internal error 6\\",I)}return -1}B.SendDataToHost(I,true,Buffer.from([0,E,F,0]),K&1);return}B.SendCommandEndResponse(1,5,I,36,0);break;case 27:B.SendCommandEndResponse(1,0,I);break;case 30:if(B.debug){console.log(\\"SCSI: ALLOW_MEDIUM_REMOVAL\\",I)}if((I==160)&&(B.floppy==null)){B.SendCommandEndResponse(1,2,I,58,0);return -1}if((I==176)&&(B.cdrom==null)){B.SendCommandEndResponse(1,2,I,58,0);return -1}B.SendCommandEndResponse(1,0,I,0,0);break;case 35:if(B.debug){console.log(\\"SCSI: READ_FORMAT_CAPACITIES\\",I)}var G=ReadShort(H,7);var Q=0,V;var P=G/8;switch(I){case 160:if((B.floppy==null)||(B.floppy.size==0)){B.SendCommandEndResponse(0,5,I,36,0);return -1}V=(B.floppy.size>>9)-1;break;case 176:if((B.cdrom==null)||(B.cdrom.size==0)){B.SendCommandEndResponse(0,5,I,36,0);return -1}V=(B.cdrom.size>>11)-1;break;default:if(B.debug){console.log(\\"SCSI Internal error 4\\",I)}return -1}B.SendDataToHost(I,true,Buffer.concat([IntToStr(8),Buffer.from([0,0,11,64,2,0,2,0])]),K&1);break;case 37:if(B.debug){console.log(\\"SCSI: READ_CAPACITY\\",I)}var O=0;switch(I){case 160:if((B.floppy==null)||(B.floppy.size==0)){B.SendCommandEndResponse(0,2,I,58,0);return -1}if(B.floppy!=null){O=(B.floppy.size>>9)-1}if(B.debug){console.log(\\"DEV_FLOPPY\\",O)}break;case 176:if((B.cdrom==null)||(B.cdrom.size==0)){B.SendCommandEndResponse(0,2,I,58,0);return -1}if(B.cdrom!=null){O=(B.cdrom.size>>11)-1}if(B.debug){console.log(\\"DEV_CDDVD\\",O)}break;default:if(B.debug){console.log(\\"SCSI Internal error 4\\",I)}return -1}if(B.debug){console.log(\\"SCSI: READ_CAPACITY2\\",I,J)}B.SendDataToHost(J,true,Buffer.concat([IntToStr(O),Buffer.from([0,0,((I==176)?8:2),0])]),K&1);break;case 40:N=ReadInt(H,2);O=ReadShort(H,7);if(B.debug){console.log(\\"SCSI: READ_10\\",I,N,O)}C(I,N,O,K);break;case 42:case 46:N=ReadInt(H,2);O=ReadShort(H,7);if(B.debug){console.log(\\"SCSI: WRITE_10\\",I,N,O)}B.SendGetDataFromHost(I,512*O);break;case 67:var G=ReadShort(H,7);var R=H[1]&2;var M=H[2]&7;if(M==0){M=H[9]>>6}if(B.debug){console.log(\\"SCSI: READ_TOC, dev=\\"+I+\\", buflen=\\"+G+\\", msf=\\"+R+\\", format=\\"+M)}switch(I){case 160:B.SendCommandEndResponse(1,5,I,32,0);return -1;case 176:break;default:if(B.debug){console.log(\\"SCSI Internal error 9\\",I)}return -1}if(M==1){B.SendDataToHost(I,true,Buffer.from([0,10,1,1,0,20,1,0,0,0,0,0]),K&1)}else{if(M==0){if(R){B.SendDataToHost(I,true,Buffer.from([0,18,1,1,0,20,1,0,0,0,2,0,0,20,170,0,0,0,52,19]),K&1)}else{B.SendDataToHost(I,true,Buffer.from([0,18,1,1,0,20,1,0,0,0,0,0,0,20,170,0,0,0,0,0]),K&1)}}}break;case 70:var W=(H[1]!=2);var L=ReadShort(H,2);var G=ReadShort(H,7);if(B.debug){console.log(\\"SCSI: GET_CONFIGURATION\\",I,W,L,G)}if(G==0){B.SendDataToHost(I,true,Buffer.concat([IntToStr(60),IntToStr(8)]),K&1);return -1}var T=null;if(L==0){T=j}if((L==1)||(W&&(L<1))){T=h}if((L==2)||(W&&(L<2))){T=m}if((L==3)||(W&&(L<3))){T=l}if((L==16)||(W&&(L<16))){T=k}if((L==30)||(W&&(L<30))){T=o}if((L==256)||(W&&(L<256))){T=n}if((L==261)||(W&&(L<261))){T=p}if(T==null){T=Buffer.concat([IntToStr(8),IntToStr(4)])}else{T=Buffer.concat([IntToStr(8),IntToStr(T.length+4),T])}if(T.length>G){T=T.slice(0,G)}B.SendDataToHost(I,true,T,K&1);return -1;case 74:if(B.debug){console.log(\\"SCSI: GET_EVENT_STATUS_NOTIFICATION\\",I,H[1],H[4],H[9])}if((H[1]!=1)&&(H[4]!=16)){if(B.debug){console.log(\\"SCSI ERROR\\")}B.SendCommandEndResponse(1,5,I,38,1);break}var S=0;if((I==160)&&(B.floppy!=null)){S=2}else{if((I==176)&&(B.cdrom!=null)){S=2}}B.SendDataToHost(I,true,Buffer.from([0,S,128,0]),K&1);break;case 76:B.SendCommand(81,Buffer.concat([IntToStrX(0),IntToStrX(0),IntToStrX(0),Buffer.from([135,80,3,0,0,0,176,81,5,32,0])]),true);break;case 81:if(B.debug){console.log(\\"SCSI READ_DISC_INFO\\",I)}B.SendCommandEndResponse(0,5,I,32,0);return -1;case 85:if(B.debug){console.log(\\"SCSI ERROR: MODE_SELECT_10\\",I)}B.SendCommandEndResponse(1,5,I,32,0);return -1;case 90:if(B.debug){console.log(\\"SCSI: MODE_SENSE_10\\",I,H[2]&63)}var G=ReadShort(H,7);var T=null;if(G==0){B.SendDataToHost(I,true,Buffer.concat([IntToStr(60),IntToStr(8)]),K&1);return -1}var U=0;if(I==160){if(B.floppy!=null){U=(B.floppy.size>>9)}}else{if(B.cdrom!=null){U=(B.cdrom.size>>11)}}switch(H[2]&63){case 1:if(I==160){T=(U<=2880)?y:A}else{T=w}break;case 5:if(I==160){T=(U<=2880)?x:z}break;case 63:if(I==160){T=(U<=2880)?r:s}else{T=q}break;case 26:if(I==176){T=t}break;case 29:if(I==176){T=u}break;case 42:if(I==176){T=v}break}if(T==null){B.SendCommandEndResponse(0,5,I,32,0)}else{B.SendDataToHost(I,true,T,K&1)}break;default:if(B.debug){console.log(\\"IDER: Unknown SCSI command\\",H[0])}B.SendCommandEndResponse(0,5,I,32,0);return -1}return 0}function C(E,G,H,F){var I=null;var J=0;if(E==160){I=B.floppy;if(B.floppy!=null){J=(B.floppy.size>>9)}}if(E==176){I=B.cdrom;if(B.cdrom!=null){J=(B.cdrom.size>>11)}}if((H<0)||(G+H>J)){B.SendCommandEndResponse(1,5,E,33,0);return 0}if(H==0){B.SendCommandEndResponse(1,0,E,0,0);return 0}if(I!=null){if(B.sectorStats){B.sectorStats(1,(E==160)?0:1,J,G,H)}if(E==160){G<<=9;H<<=9}else{G<<=11;H<<=11}if(d!==null){e.push({media:I,dev:E,lba:G,len:H,fr:F})}else{d=I;a=E;b=G;c=H;D(F)}}}var e=[];var f=false;var d=null;var a;var b;var c;function D(E){var G=c,F=b;if(c>B.iderinfo.readbfr){G=B.iderinfo.readbfr}c-=G;b+=G;var I=Buffer.alloc(G);fs.readSync(d.file,I,0,G,F);B.SendDataToHost(a,(c==0),I,E&1);if((c>0)&&(f==false)){D(E)}else{d=null;if(f){B.SendCommand(71);e=[];f=false}else{if(e.length>0){var H=e.shift();d=H.media;a=H.dev;b=H.lba;c=H.len;D(H.fr)}}}}return B};function ShortToStr(a){return Buffer.from([(a>>8)&255,a&255])}function ShortToStrX(a){return Buffer.from([a&255,(a>>8)&255])}function IntToStr(a){return Buffer.from([(a>>24)&255,(a>>16)&255,(a>>8)&255,a&255])}function IntToStrX(a){return Buffer.from([a&255,(a>>8)&255,(a>>16)&255,(a>>24)&255])}function ReadShort(b,a){return(b[a]<<8)+b[a+1]}function ReadShortX(b,a){return(b[a+1]<<8)+b[a]}function ReadInt(b,a){return(b[a]*16777216)+(b[a+1]<<16)+(b[a+2]<<8)+b[a+3]}function ReadSInt(b,a){return(b[a]<<24)+(b[a+1]<<16)+(b[a+2]<<8)+b[a+3]}function ReadIntX(b,a){return(b[a+3]*16777216)+(b[a+2]<<16)+(b[a+1]<<8)+b[a]};"); addedModules.push("amt-ider"); } catch (e) { }\r\ntry { addModule("amt-lme", "var MemoryStream=require(\\"MemoryStream\\");var lme_id=0;var lme_port_offset=0;var xmlParser=require(\\"amt-xml\\");var APF_DISCONNECT=1;var APF_SERVICE_REQUEST=5;var APF_SERVICE_ACCEPT=6;var APF_USERAUTH_REQUEST=50;var APF_USERAUTH_FAILURE=51;var APF_USERAUTH_SUCCESS=52;var APF_GLOBAL_REQUEST=80;var APF_REQUEST_SUCCESS=81;var APF_REQUEST_FAILURE=82;var APF_CHANNEL_OPEN=90;var APF_CHANNEL_OPEN_CONFIRMATION=91;var APF_CHANNEL_OPEN_FAILURE=92;var APF_CHANNEL_WINDOW_ADJUST=93;var APF_CHANNEL_DATA=94;var APF_CHANNEL_CLOSE=97;var APF_PROTOCOLVERSION=192;function lme_object(){this.ourId=++lme_id;this.amtId=-1;this.LME_CHANNEL_STATUS=\\"LME_CS_FREE\\";this.txWindow=0;this.rxWindow=0;this.localPort=0;this.errorCount=0}function stream_bufferedWrite(){var a=require(\\"events\\").inherits(this);this.buffer=[];this._readCheckImmediate=undefined;this._ObjectID=\\"bufferedWriteStream\\";a.createEvent(\\"close\\");a.createEvent(\\"drain\\");a.createEvent(\\"error\\");a.createEvent(\\"finish\\");a.createEvent(\\"pipe\\");a.createEvent(\\"unpipe\\");a.createEvent(\\"readable\\");this.isEmpty=function(){return(this.buffer.length==0)};this.isWaiting=function(){return(this._readCheckImmediate==undefined)};this.write=function(c){for(var b in arguments){if(typeof(arguments[b])==\\"function\\"){this.once(\\"drain\\",arguments[b]);break}}var d=Buffer.alloc(c.length);c.copy(d);this.buffer.push({offset:0,data:d});this.emit(\\"readable\\");return(this.buffer.length==0?true:false)};this.read=function(){var f=arguments.length==0?undefined:arguments[0];var b=0;var d=[];while((f==undefined||b0){var c=this.buffer[0].data.length-this.buffer[0].offset;var e=this.buffer[0].offset;if(c>(f-b)){d.push(this.buffer[0].data.slice(e,e+f-b));this.buffer[0].offset+=(f-b);b+=(f-b)}else{d.push(this.buffer[0].data.slice(e));b+=c;this.buffer.shift()}}this._readCheckImmediate=setImmediate(function(g){g._readCheckImmediate=undefined;if(g.buffer.length==0){g.emit(\\"drain\\")}else{g.emit(\\"readable\\")}},this);return(Buffer.concat(d))}}function lme_heci(c){var a=require(\\"events\\").inherits(this);a.createEvent(\\"error\\");a.createEvent(\\"connect\\");a.createEvent(\\"notify\\");a.createEvent(\\"bind\\");this.on(\\"newListener\\",function(e,d){if(e==\\"connect\\"&&this._LME._connected==true){d.call(this)}});if((c!=null)&&(c.debug==true)){lme_port_offset=-100}var b=require(\\"heci\\");this.INITIAL_RXWINDOW_SIZE=4096;this._ObjectID=\\"lme\\";this._LME=b.create();this._LME._connected=false;this._LME.descriptorMetadata=\\"amt-lme\\";this._LME._binded={};this._LME.LMS=this;this._LME.on(\\"error\\",function(d){this.LMS.emit(\\"error\\",d)});this._LME.on(\\"connect\\",function(){this._connected=true;this.on(\\"data\\",function(k){var l=k.readUInt8(0);switch(l){default:console.log(\\"Unhandled LME Command \\"+l+\\", \\"+k.length+\\" byte(s).\\");break;case APF_SERVICE_REQUEST:var A=k.readUInt32BE(1);var z=k.slice(5,A+5);if(z==\\"pfwd@amt.intel.com\\"||z==\\"auth@amt.intel.com\\"){var G=Buffer.alloc(5+A);G.writeUInt8(6,0);G.writeUInt32BE(A,1);G.write(z.toString(),5);this.write(G)}else{}break;case APF_GLOBAL_REQUEST:var A=k.readUInt32BE(1);var z=k.slice(5,A+5).toString();switch(z){case\\"tcpip-forward\\":var w=k.readUInt32BE(A+6);var H=k.readUInt32BE(A+10+w);if(this[z]==undefined){this[z]={}}if(this[z][H]!=null){for(var t in this.sockets){var h=this.sockets[t];if(h.localPort==H){this.sockets[t].end();delete this.sockets[t]}}}if(this[z][H]==null){try{this[z][H]=require(\\"net\\").createServer();this[z][H].descriptorMetadata=\\"amt-lme (port: \\"+H+\\")\\";this[z][H].HECI=this;if(lme_port_offset==0){this[z][H].listen({port:H,host:\\"127.0.0.1\\"})}else{this[z][H].listen({port:(H+lme_port_offset)})}this[z][H].on(\\"connection\\",function(e){this.HECI.LMS.bindDuplexStream(e,e.remoteFamily,e.localPort-lme_port_offset)});this._binded[H]=true;this.LMS.emit(\\"bind\\",this._binded)}catch(p){console.log(p,\\"Port \\"+H)}}var G=Buffer.alloc(5);G.writeUInt8(81,0);G.writeUInt32BE(H,1);this.write(G);break;case\\"cancel-tcpip-forward\\":var G=Buffer.alloc(1);G.writeUInt8(APF_REQUEST_SUCCESS,0);this.write(G);break;case\\"udp-send-to@amt.intel.com\\":var G=Buffer.alloc(1);G.writeUInt8(APF_REQUEST_FAILURE,0);this.write(G);break;default:break}break;case APF_CHANNEL_OPEN_CONFIRMATION:var J=k.readUInt32BE(1);var N=k.readUInt32BE(5);var O=k.readUInt32BE(9);if(this.sockets[J]!=undefined){this.sockets[J].lme.amtId=N;this.sockets[J].lme.rxWindow=O;this.sockets[J].lme.txWindow=O;this.sockets[J].lme.LME_CHANNEL_STATUS=\\"LME_CS_CONNECTED\\";this.sockets[J].bufferedStream=new stream_bufferedWrite();this.sockets[J].bufferedStream.socket=this.sockets[J];this.sockets[J].bufferedStream.on(\\"readable\\",function(){if(this.socket.lme.txWindow>0){var e=this.read(this.socket.lme.txWindow);var i=Buffer.alloc(9+e.length);i.writeUInt8(APF_CHANNEL_DATA,0);i.writeUInt32BE(this.socket.lme.amtId,1);i.writeUInt32BE(e.length,5);e.copy(i,9);this.socket.lme.txWindow-=e.length;this.socket.HECI.write(i)}});this.sockets[J].bufferedStream.on(\\"drain\\",function(){this.socket.resume()});this.sockets[J].on(\\"data\\",function(e){if(!this.bufferedStream.write(e)){this.pause()}});this.sockets[J].on(\\"end\\",function(){var e=Buffer.alloc(5);e.writeUInt8(APF_CHANNEL_CLOSE,0);e.writeUInt32BE(this.lme.amtId,1);this.HECI.write(e)});this.sockets[J].resume()}break;case APF_PROTOCOLVERSION:var x=k.readUInt32BE(1);var y=k.readUInt32BE(5);var L=k.readUInt32BE(9);var G=Buffer.alloc(93);G.writeUInt8(192,0);G.writeUInt32BE(1,1);G.writeUInt32BE(0,5);G.writeUInt32BE(L,9);this.write(G);break;case APF_CHANNEL_WINDOW_ADJUST:var K=k.readUInt32BE(1);var g=k.readUInt32BE(5);if(this.sockets[K]!=undefined){this.sockets[K].lme.txWindow+=g;if(!this.sockets[K].bufferedStream.isEmpty()&&this.sockets[K].bufferedStream.isWaiting()){this.sockets[K].bufferedStream.emit(\\"readable\\")}}else{console.log(\\"Unknown Recipient ID/\\"+K+\\" for APF_CHANNEL_WINDOW_ADJUST\\")}break;case APF_CHANNEL_DATA:var K=k.readUInt32BE(1);var n=k.readUInt32BE(5);var m=k.slice(9,9+n);if((this.sockets!=null)&&(this.sockets[K]!=undefined)){this.sockets[K].pendingBytes.push(m.length);this.sockets[K].write(m,function(){var i=this.pendingBytes.shift();var e=Buffer.alloc(9);e.writeUInt8(APF_CHANNEL_WINDOW_ADJUST,0);e.writeUInt32BE(this.lme.amtId,1);e.writeUInt32BE(i,5);this.HECI.write(e)})}else{if((this.insockets!=null)&&(this.insockets[K]!=undefined)){var h=this.insockets[K];if(h.data==null){h.data=m.toString()}else{h.data+=m.toString()}h.rxWindow+=n;var s=parseHttp(h.data);if((s!=null)||(h.data.length>=8000)){var B=null;try{B=xmlParser.ParseWsman(s)}catch(o){}if(B!=null){this.LMS.emit(\\"notify\\",B,h.options,_lmsNotifyToString(B),_lmsNotifyToCode(B))}var f=Buffer.alloc(5);f.writeUInt8(APF_CHANNEL_CLOSE,0);f.writeUInt32BE(d,1);this.write(f)}else{if(h.rxWindow>6000){var f=Buffer.alloc(9);f.writeUInt8(APF_CHANNEL_WINDOW_ADJUST,0);f.writeUInt32BE(h.amtId,1);f.writeUInt32BE(h.rxWindow,5);this.write(f);h.rxWindow=0}}}else{console.log(\\"Unknown Recipient ID/\\"+K+\\" for APF_CHANNEL_DATA\\")}}break;case APF_CHANNEL_OPEN_FAILURE:var K=k.readUInt32BE(1);var M=k.readUInt32BE(5);if((this.sockets!=null)&&(this.sockets[K]!=undefined)){this.sockets[K].end();delete this.sockets[K]}else{if((this.insockets!=null)&&(this.insockets[K]!=undefined)){delete this.insockets[K]}else{console.log(\\"Unknown Recipient ID/\\"+K+\\" for APF_CHANNEL_OPEN_FAILURE\\")}}break;case APF_CHANNEL_CLOSE:var K=k.readUInt32BE(1);if((this.sockets!=null)&&(this.sockets[K]!=undefined)){this.sockets[K].end();var d=this.sockets[K].lme.amtId;var f=Buffer.alloc(5);delete this.sockets[K];f.writeUInt8(APF_CHANNEL_CLOSE,0);f.writeUInt32BE(d,1);this.write(f)}else{if((this.insockets!=null)&&(this.insockets[K]!=undefined)){delete this.insockets[K]}else{console.log(\\"Unknown Recipient ID/\\"+K+\\" for APF_CHANNEL_CLOSE\\")}}break;case APF_CHANNEL_OPEN:var A=k.readUInt32BE(1);var z=k.slice(5,A+5).toString();var j=k.readUInt32BE(A+5);var u=k.readUInt32BE(A+9);var r=k.readUInt32BE(A+17);var q=k.slice(A+21,A+21+r).toString();var I=k.readUInt32BE(A+21+r);var D=k.readUInt32BE(A+25+r);var C=k.slice(A+29+r,A+29+r+D).toString();var E=k.readUInt32BE(A+29+r+D);if(this.insockets==null){this.insockets={}}var F=++lme_id;var v=new lme_object();v.ourId=F;v.amtId=j;v.txWindow=u;v.rxWindow=0;v.options={target:q,targetPort:I,source:C,sourcePort:E};this.insockets[F]=v;var f=Buffer.alloc(17);f.writeUInt8(APF_CHANNEL_OPEN_CONFIRMATION,0);f.writeUInt32BE(j,1);f.writeUInt32BE(F,5);f.writeUInt32BE(4000,9);f.writeUInt32BE(4294967295,13);this.write(f);break}});this.LMS.emit(\\"connect\\");this.resume()});this.bindDuplexStream=function(e,h,g){var j=e;j.pendingBytes=[];j.HECI=this._LME;j.LMS=this;j.lme=new lme_object();j.lme.Socket=j;j.localPort=g;var d=new MemoryStream();d.writeUInt8(90);d.writeUInt32BE(15);d.write(\\"forwarded-tcpip\\");d.writeUInt32BE(j.lme.ourId);d.writeUInt32BE(this.INITIAL_RXWINDOW_SIZE);d.writeUInt32BE(4294967295);for(var f=0;f<2;++f){if(h==\\"IPv6\\"){d.writeUInt32BE(3);d.write(\\"::1\\")}else{d.writeUInt32BE(9);d.write(\\"127.0.0.1\\")}d.writeUInt32BE(g)}this._LME.write(d.buffer);if(this._LME.sockets==undefined){this._LME.sockets={}}this._LME.sockets[j.lme.ourId]=j;j.pause()};this._LME.connect(b.GUIDS.LME,{noPipeline:0})}function parseHttp(c){var d=c.indexOf(\\"\\\\r\\\\n\\\\r\\\\n\\");if((d==-1)||(c.length<(d+2))){return null}var b=require(\\"http-headers\\")(c.substring(0,d),true);var a=parseInt(b[\\"content-length\\"]);if(c.length>=a+d+4){return c.substring(d+4,d+4+a)}return null}function _lmsNotifyToCode(c){if((c==null)||(c.Body==null)||(c.Body.MessageID==null)){return null}var b=c.Body.MessageID;try{b+=\\"-\\"+c.Body.MessageArguments[0]}catch(a){}return b}function _lmsNotifyToString(c){if((c==null)||(c.Body==null)||(c.Body.MessageID==null)){return null}var b=c.Body.MessageID;try{b+=\\"-\\"+c.Body.MessageArguments[0]}catch(a){}if(lmsEvents[b]){return lmsEvents[b]}return null}var lmsEvents={iAMT0001:\\"System Defense Policy %1s triggered.\\",iAMT0002:\\"Agent Presence Agent %1s not started.\\",iAMT0003:\\"Agent Presence Agent %1s stopped.\\",iAMT0004:\\"Agent Presence Agent %1s running.\\",iAMT0005:\\"Agent Presence Agent %1s expired.\\",iAMT0006:\\"Agent Presence Agent %1s suspended.\\",iAMT0007:\\"Host software attempt to disable AMT Network link detected.\\",iAMT0008:\\"Host software attempt to disable AMT Network link detected -- Host Network link blocked.\\",iAMT0009:\\"AMT clock or FLASH wear-out protection disabled.\\",iAMT0010:\\"Intel(R) AMT Network Interface %1s heuristics defense slow threshold trespassed.\\",iAMT0011:\\"Intel(R) AMT Network Interface %1s heuristics defense fast threshold trespassed.\\",iAMT0012:\\"Intel(R) AMT Network Interface %1s heuristics defense factory defined threshold trespassed.\\",iAMT0013:\\"Intel(R) AMT Network Interface %1s heuristics defense Encounter timeout expired.\\",iAMT0014:\\"General certificate error.\\",iAMT0015:\\"Certificate expired.\\",iAMT0016:\\"No trusted root certificate.\\",iAMT0017:\\"Not configured to work with server certificate.\\",iAMT0018:\\"Certificate revoked.\\",iAMT0019:\\"RSA exponent too large.\\",iAMT0020:\\"RSA modulus too large.\\",iAMT0021:\\"Unsupported digest.\\",iAMT0022:\\"Distinguished name too long.\\",iAMT0023:\\"Key usage missing.\\",iAMT0024:\\"General SSL handshake error.\\",iAMT0025:\\"General 802.1x error.\\",iAMT0026:\\"AMT Diagnostic AlertEAC error - General NAC error.\\",iAMT0027:\\"AMT Diagnostic AlertEAC error - attempt to get a NAC posture while AMT NAC is disabled.\\",iAMT0028:\\"AMT Diagnostic AlertEAC error - attempt to get a posture of an unsupported type.\\",iAMT0029:\\"Audit log storage is 50% full.\\",iAMT0030:\\"Audit log storage is 75% full.\\",iAMT0031:\\"Audit log storage is 85% full.\\",iAMT0032:\\"Audit log storage is 95% full.\\",iAMT0033:\\"Audit log storage is full.\\",iAMT0034:\\"Firmware Update Event - Partial.\\",iAMT0035:\\"Firmware Update Event - Failure.\\",iAMT0036:\\"Remote connectivity initiated.\\",iAMT0037:\\"ME Presence event.\\",\\"iAMT0038-0\\":\\"AMT is being unprovisioned using BIOS command.\\",\\"iAMT0038-1\\":\\"AMT is being unprovisioned using Local MEI command.\\",\\"iAMT0038-2\\":\\"AMT is being unprovisioned using Local WS-MAN/SOAP command.\\",\\"iAMT0038-3\\":\\"AMT is being unprovisioned using Remote WS-MAN/SOAP command.\\",iAMT0039:\\"HW Asset Error.\\",iAMT0050:\\"User Notification Alert - General Notification.\\",\\"iAMT0050-16\\":\\"User Notification Alert - Circuit Breaker notification (CB Drop TX filter hit.).\\",\\"iAMT0050-17\\":\\"User Notification Alert - Circuit Breaker notification (CB Rate Limit TX filter hit.).\\",\\"iAMT0050-18\\":\\"User Notification Alert - Circuit Breaker notification (CB Drop RX filter hit.).\\",\\"iAMT0050-19\\":\\"User Notification Alert - Circuit Breaker notification (CB Rate Limit RX filter hit.).\\",\\"iAMT0050-32\\":\\"User Notification Alert - EAC notification.\\",\\"iAMT0050-48\\":\\"User Notification Alert - Remote diagnostics - (Remote Redirection session started - SOL).\\",\\"iAMT0050-49\\":\\"User Notification Alert - Remote diagnostics - (Remote Redirection session stopped - SOL).\\",\\"iAMT0050-50\\":\\"User Notification Alert - Remote diagnostics. (Remote Redirection session started - IDE-R).\\",\\"iAMT0050-51\\":\\"User Notification Alert - Remote diagnostics. (Remote Redirection session stopped - IDE-R).\\",\\"iAMT0050-66\\":\\"User Notification Alert - WLAN notification (Host profile mismatch - Management Interface ignored).\\",\\"iAMT0050-67\\":\\"User Notification Alert - WLAN notification (Management device overrides host radio).\\",\\"iAMT0050-68\\":\\"User Notification Alert - WLAN notification (Host profile security mismatch).\\",\\"iAMT0050-69\\":\\"User Notification Alert - WLAN notification (Management device relinquishes control over host Radio).\\",iAMT0051:\\"User Notification Alert - SecIo event.\\",\\"iAMT0051-0\\":\\"User Notification Alert - SecIo event semaphore at host.\\",\\"iAMT0051-1\\":\\"User Notification Alert - semaphore at ME.\\",\\"iAMT0051-2\\":\\"User Notification Alert - SecIo event - semaphore timeout.\\",iAMT0052:\\"User Notification Alert - KVM session event.\\",\\"iAMT0052-0\\":\\"User Notification Alert - KVM session requested.\\",\\"iAMT0052-1\\":\\"User Notification Alert - KVM session started.\\",\\"iAMT0052-2\\":\\"User Notification Alert - KVM session stopped.\\",\\"iAMT0052-3\\":\\"User Notification Alert - KVM data channel.\\",iAMT0053:\\"User Notification Alert - RCS notification.\\",\\"iAMT0053-50\\":\\"User Notification Alert - RCS notification (HW button pressed. Connection initiated automatically).\\",\\"iAMT0053-52\\":\\"User Notification Alert - RCS notification (HW button pressed. Connection wasn\\\'t initiated automatically).\\",\\"iAMT0053-53\\":\\"User Notification Alert - RCS notification (Contracts updated).\\",iAMT0054:\\"User Notification Alert - WLAN notification. Wireless Profile sync enablement state changed.\\",iAMT0055:\\"User Notification Alert - Provisioning state change notification.\\",\\"iAMT0055-0\\":\\"User Notification Alert - Provisioning state change notification - Pre-configuration.\\",\\"iAMT0055-1\\":\\"User Notification Alert - Provisioning state change notification - In configuration.\\",\\"iAMT0055-2\\":\\"User Notification Alert - Provisioning state change notification - Post-configuration.\\",\\"iAMT0055-3\\":\\"User Notification Alert - Provisioning state change notification - Unprovision process has started.\\",iAMT0056:\\"User Notification Alert - System Defense change notification.\\",iAMT0057:\\"User Notification Alert - Network State change notification.\\",iAMT0058:\\"User Notification Alert - Remote Access change notification.\\",\\"iAMT0058-1\\":\\"User Notification Alert - Remote Access change notification - tunnel is closed.\\",iAMT0059:\\"User Notification Alert - KVM enabled event.\\",\\"iAMT0059-0\\":\\"User Notification Alert - KVM enabled event - KVM disabled.\\",\\"iAMT0059-1\\":\\"User Notification Alert - KVM enabled event - KVM enabled (both from MEBx and PTNI).\\",iAMT0060:\\"User Notification Alert - SecIO configuration event.\\",iAMT0061:\\"ME FW reset occurred.\\",iAMT0062:\\"User Notification Alert - IpSyncEnabled event.\\",\\"iAMT0062-0\\":\\"User Notification Alert - IpSyncEnabled event - IpSync disabled.\\",\\"iAMT0062-1\\":\\"User Notification Alert - IpSyncEnabled event - IpSync enabled.\\",iAMT0063:\\"User Notification Alert - HTTP Proxy sync enabled event.\\",\\"iAMT0063-0\\":\\"User Notification Alert - HTTP Proxy sync enabled event - HTTP Proxy Sync disabled.\\",\\"iAMT0063-1\\":\\"User Notification Alert - HTTP Proxy sync enabled event - HTTP Proxy Sync enabled.\\",iAMT0064:\\"User Notification Alert - User Consent event.\\",\\"iAMT0064-1\\":\\"User Notification Alert - User Consent event - User Consent granted.\\",\\"iAMT0064-2\\":\\"User Notification Alert - User Consent event - User Consent ended.\\",\\"iAMT0067-0\\":\\"Graceful Remote Control Operation - Shutdown.\\",\\"iAMT0067-1\\":\\"Graceful Remote Control Operation - Reset.\\",\\"iAMT0067-2\\":\\"Graceful Remote Control Operation - Hibernate.\\",\\"iAMT0068-0\\":\\"Link Protection Notification - No link protection.\\",\\"iAMT0068-1\\":\\"Link Protection Notification - Passive link protection.\\",\\"iAMT0068-2\\":\\"Link Protection Notification - High link protection.\\",\\"iAMT0069-0\\":\\"Local Time Sync Enablement Notification - Local Time Sync Disabled.\\",\\"iAMT0069-1\\":\\"Local Time Sync Enablement Notification - Local Time Sync Enabled.\\",iAMT0070:\\"Host Reset Triggered by WD Expiration Notification.\\",PLAT0004:\\"The chassis %1s was opened.\\",PLAT0005:\\"The chassis %1s was closed.\\",PLAT0006:\\"The drive bay %1s was opened.\\",PLAT0007:\\"The drive bay %1s was closed.\\",PLAT0008:\\"The I/O card area %1s was opened.\\",PLAT0009:\\"The I/O card area %1s was closed.\\",PLAT0010:\\"The processor area %1s was opened.\\",PLAT0011:\\"The processor area %1s was closed.\\",PLAT0012:\\"The LAN %1s has been disconnected.\\",PLAT0013:\\"The LAN %1s has been connected.\\",PLAT0016:\\"The permission to insert package %1s has been granted.\\",PLAT0017:\\"The permission to insert package %1s has been removed.\\",PLAT0018:\\"The fan card area %1s is open.\\",PLAT0019:\\"The fan card area %1s is closed.\\",PLAT0022:\\"The computer system %1s has detected a secure mode violation.\\",PLAT0024:\\"The computer system %1s has detected a pre-boot user password violation.\\",PLAT0026:\\"The computer system %1s has detected a pre-boot setup password violation.\\",PLAT0028:\\"The computer system %1s has detected a network boot password violation.\\",PLAT0030:\\"The computer system %1s has detected a password violation.\\",PLAT0032:\\"The management controller %1s has detected an out-of-band password violation.\\",PLAT0034:\\"The processor %1s has been added.\\",PLAT0035:\\"The processor %1s has been removed.\\",PLAT0036:\\"An over-temperature condition has been detected on the processor %1s.\\",PLAT0037:\\"An over-temperature condition has been removed on the processor %1s.\\",PLAT0038:\\"The processor %1s is operating in a degraded State.\\",PLAT0039:\\"The processor %1s is no longer operating in a degraded State.\\",PLAT0040:\\"The processor %1s has failed.\\",PLAT0042:\\"The processor %1s has failed.\\",PLAT0044:\\"The processor %1s has failed.\\",PLAT0046:\\"The processor %1s has failed.\\",PLAT0048:\\"The processor %1s has failed.\\",PLAT0060:\\"The processor %1s has been enabled.\\",PLAT0061:\\"The processor %1s has been disabled.\\",PLAT0062:\\"The processor %1s has a configuration mismatch.\\",PLAT0064:\\"A terminator has been detected on the processor %1s.\\",PLAT0084:\\"The Power Supply %1s has been added.\\",PLAT0085:\\"The Power Supply %1s has been removed.\\",PLAT0086:\\"The Power Supply %1s has failed.\\",PLAT0088:\\"Failure predicted on power supply %1s.\\",PLAT0096:\\"The input to power supply %1s has been lost or fallen out of range.\\",PLAT0098:\\"The power supply %1s is operating in an input state that is out of range.\\",PLAT0099:\\"The power supply %1s has returned to a normal input state.\\",PLAT0100:\\"The power supply %1s has lost input.\\",PLAT0104:\\"The power supply %1s has a configuration mismatch.\\",PLAT0106:\\"Power supply %1s has been disabled.\\",PLAT0107:\\"Power supply %1s has been enabled.\\",PLAT0108:\\"Power supply %1s has been power cycled.\\",PLAT0110:\\"Power supply %1s has encountered an error during power down.\\",PLAT0112:\\"Power supply %1s has lost power.\\",PLAT0114:\\"Soft power control has failed for power supply %1s.\\",PLAT0116:\\"Power supply %1s has failed.\\",PLAT0118:\\"Failure predicted on power supply %1s.\\",PLAT0120:\\"Memory subsystem failure.\\",PLAT0122:\\"DIMM missing.\\",PLAT0124:\\"Memory error detected & corrected for DIMM %1s.\\",PLAT0128:\\"Memory DIMM %1s added.\\",PLAT0129:\\"Memory DIMM %1s removed.\\",PLAT0130:\\"Memory DIMM %1s enabled.\\",PLAT0131:\\"Memory DIMM %1s disabled.\\",PLAT0134:\\"Memory parity error for DIMM %1s.\\",PLAT0136:\\"Memory scrub failure for DIMM %1s.\\",PLAT0138:\\"Memory uncorrectable error detected for DIMM %1s.\\",PLAT0140:\\"Memory sparing initiated for DIMM %1s.\\",PLAT0141:\\"Memory sparing concluded for DIMM %1s.\\",PLAT0142:\\"Memory DIMM %1s Throttled.\\",PLAT0144:\\"Memory logging limit reached for DIMM %1s.\\",PLAT0145:\\"Memory logging limit removed for DIMM %1s.\\",PLAT0146:\\"An over-temperature condition has been detected on the Memory DIMM %1s.\\",PLAT0147:\\"An over-temperature condition has been removed on the Memory DIMM %1s.\\",PLAT0162:\\"The drive %1s has been added.\\",PLAT0163:\\"The drive %1s has been removed.\\",PLAT0164:\\"The drive %1s has been disabled due to a detected fault.\\",PLAT0167:\\"The drive %1s has been enabled.\\",PLAT0168:\\"Failure predicted on drive %1s.\\",PLAT0170:\\"Hot spare enabled for %1s.\\",PLAT0171:\\"Hot spare disabled for %1s.\\",PLAT0172:\\"Consistency check has begun for %1s.\\",PLAT0173:\\"Consistency check completed for %1s.\\",PLAT0174:\\"Array %1s is in critical condition.\\",PLAT0176:\\"Array %1s has failed.\\",PLAT0177:\\"Array %1s has been restored.\\",PLAT0178:\\"Rebuild in progress for array %1s.\\",PLAT0179:\\"Rebuild completed for array %1s.\\",PLAT0180:\\"Rebuild Aborted for array %1s.\\",PLAT0184:\\"The system %1s encountered a POST error.\\",PLAT0186:\\"The system %1s encountered a firmware hang.\\",PLAT0188:\\"The system %1s encountered firmware progress.\\",PLAT0192:\\"The log %1s has been disabled.\\",PLAT0193:\\"The log %1s has been enabled.\\",PLAT0194:\\"The log %1s has been disabled.\\",PLAT0195:\\"The log %1s has been enabled.\\",PLAT0196:\\"The log %1s has been disabled.\\",PLAT0198:\\"The log %1s has been enabled.\\",PLAT0200:\\"The log %1s has been cleared.\\",PLAT0202:\\"The log %1s is full.\\",PLAT0203:\\"The log %1s is no longer full.\\",PLAT0204:\\"The log %1s is almost full.\\",PLAT0208:\\"The log %1s has a configuration error.\\",PLAT0210:\\"The system %1s has been reconfigured.\\",PLAT0212:\\"The system %1s has encountered an OEM system boot event.\\",PLAT0214:\\"The system %1s has encountered an unknown system hardware fault.\\",PLAT0216:\\"The system %1s has generated an auxiliary log entry.\\",PLAT0218:\\"The system %1s has executed a PEF action.\\",PLAT0220:\\"The system %1s has synchronized the system clock.\\",PLAT0222:\\"A diagnostic interrupt has occurred on system %1s.\\",PLAT0224:\\"A bus timeout has occurred on system %1s.\\",PLAT0226:\\"An I/O channel check NMI has occurred on system %1s.\\",PLAT0228:\\"A software NMI has occurred on system %1s.\\",PLAT0230:\\"System %1s has recovered from an NMI.\\",PLAT0232:\\"A PCI PERR has occurred on system %1s.\\",PLAT0234:\\"A PCI SERR has occurred on system %1s.\\",PLAT0236:\\"An EISA fail safe timeout occurred on system %1s.\\",PLAT0238:\\"A correctable bus error has occurred on system %1s.\\",PLAT0240:\\"An uncorrectable bus error has occurred on system %1s.\\",PLAT0242:\\"A fatal NMI error has occurred on system %1s.\\",PLAT0244:\\"A fatal bus error has occurred on system %1s.\\",PLAT0246:\\"A bus on system %1s is operating in a degraded state.\\",PLAT0247:\\"A bus on system %1s is no longer operating in a degraded state.\\",PLAT0248:\\"The power button %1s has been pressed.\\",PLAT0249:\\"The power button %1s has been released.\\",PLAT0250:\\"The sleep button %1s has been pressed.\\",PLAT0251:\\"The sleep button %1s has been released.\\",PLAT0252:\\"The reset button %1s has been pressed.\\",PLAT0253:\\"The reset button %1s has been released.\\",PLAT0254:\\"The latch to %1s has been opened.\\",PLAT0255:\\"The latch to %1s has been closed.\\",PLAT0256:\\"The service request %1s has been enabled.\\",PLAT0257:\\"The service request %1s has been completed.\\",PLAT0258:\\"Power control of system %1s has failed.\\",PLAT0262:\\"The network port %1s has been connected.\\",PLAT0263:\\"The network port %1s has been disconnected.\\",PLAT0266:\\"The connector %1s has encountered a configuration error.\\",PLAT0267:\\"The connector %1s configuration error has been repaired.\\",PLAT0272:\\"Power on for system %1s.\\",PLAT0274:\\"Power cycle hard requested for system %1s.\\",PLAT0276:\\"Power cycle soft requested for system %1s.\\",PLAT0278:\\"PXE boot requested for system %1s.\\",PLAT0280:\\"Diagnostics boot requested for system %1s.\\",PLAT0282:\\"System restart requested for system %1s.\\",PLAT0284:\\"System restart begun for system %1s.\\",PLAT0286:\\"No bootable media available for system %1s.\\",PLAT0288:\\"Non-bootable media selected for system %1s.\\",PLAT0290:\\"PXE server not found for system %1s.\\",PLAT0292:\\"User timeout on boot for system %1s.\\",PLAT0296:\\"System %1s boot from floppy initiated.\\",PLAT0298:\\"System %1s boot from local drive initiated.\\",PLAT0300:\\"System %1s boot from PXE on network port initiated.\\",PLAT0302:\\"System %1s boot diagnostics initiated.\\",PLAT0304:\\"System %1s boot from CD initiated.\\",PLAT0306:\\"System %1s boot from ROM initiated.\\",PLAT0312:\\"System %1s boot initiated.\\",PLAT0320:\\"Critical stop during OS load on system %1s.\\",PLAT0322:\\"Run-time critical stop on system %1s.\\",PLAT0324:\\"OS graceful stop on system %1s.\\",PLAT0326:\\"OS graceful shutdown begun on system %1s.\\",PLAT0327:\\"OS graceful shutdown completed on system %1s.\\",PLAT0328:\\"Agent not responding on system %1s.\\",PLAT0329:\\"Agent has begun responding on system %1s.\\",PLAT0330:\\"Fault in slot on system %1s.\\",PLAT0331:\\"Fault condition removed on system %1s.\\",PLAT0332:\\"Identifying slot on system %1s.\\",PLAT0333:\\"Identify stopped on slot for system %1s.\\",PLAT0334:\\"Package installed in slot for system %1s.\\",PLAT0336:\\"Slot empty system %1s.\\",PLAT0338:\\"Slot in system %1s is ready for installation.\\",PLAT0340:\\"Slot in system %1s is ready for removal.\\",PLAT0342:\\"Power is off on slot of system %1s.\\",PLAT0344:\\"Power is on for slot of system %1s.\\",PLAT0346:\\"Removal requested for slot of system %1s.\\",PLAT0348:\\"Interlock activated on slot of system %1s.\\",PLAT0349:\\"Interlock de-asserted on slot of system %1s.\\",PLAT0350:\\"Slot disabled on system %1s.\\",PLAT0351:\\"Slot enabled on system %1s.\\",PLAT0352:\\"Slot of system %1s holds spare.\\",PLAT0353:\\"Slot of system %1s no longer holds spare.\\",PLAT0354:\\"Computer system %1s enabled.\\",PLAT0356:\\"Computer system %1s is in sleep - light mode.\\",PLAT0358:\\"Computer system %1s is in hibernate.\\",PLAT0360:\\"Computer system %1s is in standby.\\",PLAT0362:\\"Computer system %1s is in soft off mode.\\",PLAT0364:\\"Computer system %1s is in hard off mode.\\",PLAT0366:\\"Computer system %1s is sleeping.\\",PLAT0368:\\"Watchdog timer expired for %1s.\\",PLAT0370:\\"Reboot of system initiated by watchdog %1s.\\",PLAT0372:\\"Powering off system initiated by watchdog %1s.\\",PLAT0374:\\"Power cycle of system initiated by watchdog %1s.\\",PLAT0376:\\"Watchdog timer interrupt occurred for %1s.\\",PLAT0378:\\"A page alert has been generated for system %1s.\\",PLAT0380:\\"A LAN alert has been generated for system %1s.\\",PLAT0382:\\"An event trap has been generated for system %1s.\\",PLAT0384:\\"An SNMP trap has been generated for system %1s.\\",PLAT0390:\\"%1s detected as present.\\",PLAT0392:\\"%1s detected as absent.\\",PLAT0394:\\"%1s has been disabled.\\",PLAT0395:\\"%1s has been enabled.\\",PLAT0396:\\"Heartbeat lost for LAN %1s.\\",PLAT0397:\\"Heartbeat detected for LAN %1s.\\",PLAT0398:\\"Sensor %1s is unavailable or degraded on management system.\\",PLAT0399:\\"Sensor %1s has returned to normal on management system.\\",PLAT0400:\\"Controller %1s is unavailable or degraded on management system.\\",PLAT0401:\\"Controller %1s has returned to normal on management system.\\",PLAT0402:\\"Management system %1s is off-line.\\",PLAT0404:\\"Management system %1s is disabled.\\",PLAT0405:\\"Management system %1s is enabled.\\",PLAT0406:\\"Sensor %1s has failed on management system.\\",PLAT0408:\\"FRU %1s has failed on management system.\\",PLAT0424:\\"The battery %1s is critically low.\\",PLAT0427:\\"The battery %1s is no longer critically low.\\",PLAT0430:\\"The battery %1s has been removed from unit.\\",PLAT0431:\\"The battery %1s has been added.\\",PLAT0432:\\"The battery %1s has failed.\\",PLAT0434:\\"Session audit is deactivated on system %1s.\\",PLAT0435:\\"Session audit is activated on system %1s.\\",PLAT0436:\\"A hardware change occurred on system %1s.\\",PLAT0438:\\"A firmware or software change occurred on system %1s.\\",PLAT0440:\\"A hardware incompatibility was detected on system %1s.\\",PLAT0442:\\"A firmware or software incompatibility was detected on system %1s.\\",PLAT0444:\\"Invalid or unsupported hardware was detected on system %1s.\\",PLAT0446:\\"Invalid or unsupported firmware or software was detected on system %1s.\\",PLAT0448:\\"A successful hardware change was detected on system %1s.\\",PLAT0450:\\"A successful software or firmware change was detected on system %1s.\\",PLAT0464:\\"FRU %1s not installed on system.\\",PLAT0465:\\"FRU %1s installed on system.\\",PLAT0466:\\"Activation requested for FRU %1s on system.\\",PLAT0467:\\"FRU %1s on system is active.\\",PLAT0468:\\"Activation in progress for FRU %1s on system.\\",PLAT0470:\\"Deactivation request for FRU %1s on system.\\",PLAT0471:\\\'FRU %1s on system is in standby or \\"hot spare\\" state.\\\',PLAT0472:\\"Deactivation in progress for FRU %1s on system.\\",PLAT0474:\\"Communication lost with FRU %1s on system.\\",PLAT0476:\\"Numeric sensor %1s going low (lower non-critical).\\",PLAT0478:\\"Numeric sensor %1s going high (lower non-critical).\\",PLAT0480:\\"Numeric sensor %1s going low (lower critical).\\",PLAT0482:\\"Numeric sensor %1s going high (lower critical).\\",PLAT0484:\\"Numeric sensor %1s going low (lower non-recoverable).\\",PLAT0486:\\"Numeric sensor %1s going high (lower non-critical).\\",PLAT0488:\\"Numeric sensor %1s going low (upper non-critical).\\",PLAT0490:\\"Numeric sensor %1s going high (upper non-critical).\\",PLAT0492:\\"Numeric sensor %1s going low (upper critical).\\",PLAT0494:\\"Numeric sensor %1s going high (upper critical).\\",PLAT0496:\\"Numeric sensor %1s going low (upper non-recoverable).\\",PLAT0498:\\"Numeric sensor %1s going high (upper non-recoverable).\\",PLAT0500:\\"Sensor %1s has transitioned to idle.\\",PLAT0502:\\"Sensor %1s has transitioned to active.\\",PLAT0504:\\"Sensor %1s has transitioned to busy.\\",PLAT0508:\\"Sensor %1s has asserted.\\",PLAT0509:\\"Sensor %1s has de-asserted.\\",PLAT0510:\\"Sensor %1s is asserting predictive failure.\\",PLAT0511:\\"Sensor %1s is de-asserting predictive failure.\\",PLAT0512:\\"Sensor %1s has indicated limit exceeded.\\",PLAT0513:\\"Sensor %1s has indicated limit no longer exceeded.\\",PLAT0514:\\"Sensor %1s has indicated performance met.\\",PLAT0516:\\"Sensor %1s has indicated performance lags.\\",PLAT0518:\\"Sensor %1s has transitioned to normal state.\\",PLAT0520:\\"Sensor %1s has transitioned from normal to non-critical state.\\",PLAT0522:\\"Sensor %1s has transitioned to critical from a less severe state.\\",PLAT0524:\\"Sensor %1s has transitioned to non-recoverable from a less severe state.\\",PLAT0526:\\"Sensor %1s has transitioned to non-critical from a more severe state.\\",PLAT0528:\\"Sensor %1s has transitioned to critical from a non-recoverable state.\\",PLAT0530:\\"Sensor %1s has transitioned to non-recoverable.\\",PLAT0532:\\"Sensor %1s indicates a monitor state.\\",PLAT0534:\\"Sensor %1s has an informational state.\\",PLAT0536:\\"Device %1s has been added.\\",PLAT0537:\\"Device %1s has been removed from unit.\\",PLAT0538:\\"Device %1s has been enabled.\\",PLAT0539:\\"Device %1s has been disabled.\\",PLAT0540:\\"Sensor %1s has indicated a running state.\\",PLAT0544:\\"Sensor %1s has indicated a power off state.\\",PLAT0546:\\"Sensor %1s has indicated an on-line state.\\",PLAT0548:\\"Sensor %1s has indicated an off-line state.\\",PLAT0550:\\"Sensor %1s has indicated an off-duty state.\\",PLAT0552:\\"Sensor %1s has indicated a degraded state.\\",PLAT0554:\\"Sensor %1s has indicated a power save state.\\",PLAT0556:\\"Sensor %1s has indicated an install error.\\",PLAT0558:\\"Redundancy %1s has been lost.\\",PLAT0560:\\"Redundancy %1s has been reduced.\\",PLAT0561:\\"Redundancy %1s has been restored.\\",PLAT0562:\\"%1s has transitioned to a D0 power state.\\",PLAT0564:\\"%1s has transitioned to a D1 power state.\\",PLAT0566:\\"%1s has transitioned to a D2 power state.\\",PLAT0568:\\"%1s has transitioned to a D3 power state.\\",PLAT0720:\\"The System %1s encountered firmware progress - memory initialization entry.\\",PLAT0721:\\"The System %1s encountered firmware progress - memory initialization exit.\\",PLAT0722:\\"The System %1s encountered firmware progress - hard drive initialization entry.\\",PLAT0723:\\"The System %1s encountered firmware progress - hard drive initialization exit.\\",PLAT0724:\\"The System %1s encountered firmware progress - user authentication.\\",PLAT0728:\\"The System %1s encountered firmware progress - USR resource configuration entry.\\",PLAT0729:\\"The System %1s encountered firmware progress - USR resource configuration exit.\\",PLAT0730:\\"The System %1s encountered firmware progress - PCI recource configuration entry.\\",PLAT0731:\\"The System %1s encountered firmware progress - PCI recource configuration exit.\\",PLAT0732:\\"The System %1s encountered firmware progress - Option ROM initialization entry.\\",PLAT0733:\\"The System %1s encountered firmware progress - Option ROM initialization entry exit.\\",PLAT0734:\\"The System %1s encountered firmware progress -video initialization entry entry.\\",PLAT0735:\\"The System %1s encountered firmware progress - video initialization entry exit.\\",PLAT0736:\\"The System %1s encountered firmware progress - cache initialization entry.\\",PLAT0737:\\"The System %1s encountered firmware progress - cache initialization exit.\\",PLAT0738:\\"The System %1s encountered firmware progress - keyboard controller initialization entry.\\",PLAT0739:\\"The System %1s encountered firmware progress - keyboard controller initialization exit.\\",PLAT0740:\\"The System %1s encountered firmware progress - motherboard initialization entry.\\",PLAT0741:\\"The System %1s encountered firmware progress - motherboard initialization exit.\\",PLAT0742:\\"The System %1s encountered firmware progress - floppy disk initialization entry.\\",PLAT0743:\\"The System %1s encountered firmware progress - floppy disk initialization exit.\\",PLAT0744:\\"The System %1s encountered firmware progress - keyboard test entry.\\",PLAT0745:\\"The System %1s encountered firmware progress - keyboard test exit.\\",PLAT0746:\\"The System %1s encountered firmware progress - pointing device test entry.\\",PLAT0747:\\"The System %1s encountered firmware progress - pointing device test exit.\\",PLAT0750:\\"The System %1s encountered firmware progress - dock enable entry.\\",PLAT0751:\\"The System %1s encountered firmware progress - dock enable exit.\\",PLAT0752:\\"The System %1s encountered firmware progress - dock disable entry.\\",PLAT0753:\\"The System %1s encountered firmware progress - dock disable exit.\\",PLAT0760:\\"The System %1s encountered firmware progress - start OS boot process.\\",PLAT0762:\\"The System %1s encountered firmware progress - call OS wake vector.\\",PLAT0764:\\"The System %1s encountered firmware progress - unrecoverable keyboard failure.\\",PLAT0766:\\"The System %1s encountered firmware progress - no video device detected.\\",PLAT0768:\\"The System %1s encountered firmware progress - SMART alert detected on drive.\\",PLAT0770:\\"The System %1s encountered firmware progress - unrecoverable boot device failure.\\",PLAT0789:\\"Corrupt BIOS detected.\\",PLAT0790:\\"The System %1s encountered PCI configuration failure.\\",PLAT0791:\\"The System %1s encountered a video subsystem failure.\\",PLAT0792:\\"The System %1s encountered a storage subsystem failure.\\",PLAT0793:\\"The System %1s encountered a USB subsystem failure.\\",PLAT0794:\\"The System %1s has detected no memory in the system.\\",PLAT0795:\\"The System %1s encountered a motherboard failure.\\",PLAT0796:\\"The System %1s encountered a memory Regulator Voltage Bad.\\",PLAT0797:\\"%1s PCI reset is not deasserting.\\",PLAT0798:\\"%1s Non-Motherboard Regulator Failure.\\",PLAT0799:\\"%1s Power Supply Cable failure.\\",PLAT0800:\\"%1s Motherboard regulator failure.\\",PLAT0801:\\"%1s System component compatibility mismatch.\\"};module.exports=lme_heci;"); addedModules.push("amt-lme"); } catch (e) { }\r\ntry { addModule("amt-mei", "var Q=require(\\"queue\\");function amt_heci(){var d=require(\\"events\\").inherits(this);d.createEvent(\\"error\\");var u=require(\\"heci\\");var x=function(F){try{require(\\"MeshAgent\\").SendCommand({action:\\"msg\\",type:\\"console\\",value:F})}catch(E){}};this._ObjectID=\\"pthi\\";this._rq=new Q();this._setupPTHI=function b(){this._amt=u.create();this._amt.descriptorMetadata=\\"amt-pthi\\";this._amt.BiosVersionLen=65;this._amt.UnicodeStringLen=20;this._amt.Parent=this;this._amt.on(\\"error\\",function F(H){if(this.Parent._rq.isEmpty()){this.Parent.emit(\\"error\\",H)}else{var J=this.Parent._rq.deQueue();var I=J.optional;var G=J.func;I.unshift({Status:-1});G.apply(this.Parent,I);if(!this.Parent._rq.isEmpty()){this.connect(u.GUIDS.AMT,{noPipeline:1})}}});this._amt.on(\\"connect\\",function E(){this.on(\\"data\\",function G(I){var J=this.Parent.getCommand(I);var L=this.Parent._rq.deQueue();var K=L.optional;var H=L.func;K.unshift(J);H.apply(this.Parent,K);if(this.Parent._rq.isEmpty()){this.Parent._amt.disconnect();this.Parent._amt=null}else{this.write(this.Parent._rq.peekQueue().send)}});this.write(this.Parent._rq.peekQueue().send)})};function B(E){var F=E.indexOf(\\"\\\\0\\");if(F>=0){return E.substring(0,F)}else{return E}}this.getCommand=function g(E){var F=E.length==0?(this._rq.peekQueue().cmd|8388608):E.readUInt32LE(4);var G={IsResponse:(F&8388608)==8388608?true:false,Command:(F&8388607),Status:E.length!=0?E.readUInt32LE(12):-1,Data:E.length!=0?E.slice(16):null};return(G)};this.sendCommand=function w(){if(arguments.length<3||typeof(arguments[0])!=\\"number\\"||typeof(arguments[1])!=\\"object\\"||typeof(arguments[2])!=\\"function\\"){throw (\\"invalid parameters\\")}var E=[];for(var G=3;G0){N.BiosVersion=N.BiosVersion.substring(0,N.BiosVersion.indexOf(\\"\\\\0\\"))}L.unshift(N)}else{L.unshift(null)}I.apply(this,L)},E,G)};function D(G,F){if((F==null)&&(typeof(F)!=\\"number\\")){return null}if(G==null){G=\\"\\"}var H=\\"\\";for(var E=0;E0){J.unshift(I.Data.slice(2,2+K).toString())}else{J.unshift(null)}}else{J.unshift(null)}H.apply(this,J)},E,G)};this.getHashHandles=function k(E){var G=[];for(var F=1;F0){this.getCertHashEntry(G.shift(),this._getHashEntrySink,F,H,E,G)}else{H.unshift(E);F.apply(this,H)}};this.getLocalSystemAccount=function m(E){var G=[];for(var F=1;F>24)&255)+\\".\\"+((K>>16)&255)+\\".\\"+((K>>8)&255)+\\".\\"+(K&255);O.unshift(N);L.apply(this,O)}else{O.unshift(null);L.apply(this,O)}},E,J)};this.unprovision=function C(H,E){var I=[];for(var G=2;G=0){b.xxSend(String.fromCharCode(19,0,0,0,4)+IntToStrX(b.user.length+b.authuri.length+8)+String.fromCharCode(b.user.length)+b.user+String.fromCharCode(0,0)+String.fromCharCode(b.authuri.length)+b.authuri+String.fromCharCode(0,0,0,0))}else{if(d.indexOf(3)>=0){b.xxSend(String.fromCharCode(19,0,0,0,3)+IntToStrX(b.user.length+b.authuri.length+7)+String.fromCharCode(b.user.length)+b.user+String.fromCharCode(0,0)+String.fromCharCode(b.authuri.length)+b.authuri+String.fromCharCode(0,0,0))}else{if(d.indexOf(1)>=0){b.xxSend(String.fromCharCode(19,0,0,0,1)+IntToStrX(b.user.length+b.pass.length+2)+String.fromCharCode(b.user.length)+b.user+String.fromCharCode(b.pass.length)+b.pass)}else{b.Stop()}}}}else{if((g==3||g==4)&&y==1){var m=0;var w=e[m];var v=e.slice(m+1,m+1+w).toString();m+=(w+1);if(b.digestRealmMatch&&(b.digestRealmMatch!=v)){b.Stop();return}var r=e[m];var q=e.slice(m+1,m+1+r).toString();m+=(r+1);var u=0;var t=null;var k=b.xxRandomValueHex(32);var x=\\"00000002\\";var p=\\"\\";if(g==4){u=e[m];t=e.slice(m+1,m+1+u).toString();m+=(u+1);p=x+\\":\\"+k+\\":\\"+t+\\":\\"}var o=hex_md5(hex_md5(b.user+\\":\\"+v+\\":\\"+b.pass)+\\":\\"+q+\\":\\"+p+hex_md5(\\"POST:\\"+b.authuri));var A=b.user.length+v.length+q.length+b.authuri.length+k.length+x.length+o.length+7;if(g==4){A+=(t.length+1)}var h=Buffer.concat([Buffer.from([19,0,0,0,g]),new Buffer([A&255,(A>>8)&255,0,0]),new Buffer([b.user.length]),new Buffer(b.user),new Buffer([v.length]),new Buffer(v),new Buffer([q.length]),new Buffer(q),new Buffer([b.authuri.length]),new Buffer(b.authuri),new Buffer([k.length]),new Buffer(k),new Buffer([x.length]),new Buffer(x),new Buffer([o.length]),new Buffer(o)]);if(g==4){h=Buffer.concat([h,Buffer.from([t.length]),new Buffer(t)])}b.xxSend(h)}else{if(y==0){if(b.protocol==1){}if(b.protocol==2){b.xxSend(Buffer.from([64,0,0,0,0,0,0,0]))}if(b.protocol==3){b.connectstate=1;b.xxStateChange(3)}}else{b.Stop()}}}break;case 33:if(b.amtaccumulator.length<23){break}j=23;b.xxSend(String.fromCharCode(39,0,0,0)+ToIntStr(b.amtsequence++)+String.fromCharCode(0,0,27,0,0,0));if(b.protocol==1){b.amtkeepalivetimer=setInterval(b.xxSendAmtKeepAlive,2000)}b.connectstate=1;b.xxStateChange(3);break;case 41:if(b.amtaccumulator.length<10){break}j=10;break;case 42:if(b.amtaccumulator.length<10){break}var l=(10+((b.amtaccumulator[9]&255)<<8)+(b.amtaccumulator[8]&255));if(b.amtaccumulator.length8){b.m.ProcessData(b.amtaccumulator.substring(8))}j=b.amtaccumulator.length;break;default:console.log(\\"Unknown Intel AMT command: \\"+b.amtaccumulator[0]+\\" acclen=\\"+b.amtaccumulator.length);b.Stop();return}if(j==0){return}if(j==b.amtaccumulator.length){b.amtaccumulator=null}else{b.amtaccumulator=b.amtaccumulator.slice(j)}}};b.xxSend=function(d){if(c&&c.redirtrace){console.log(\\"REDIR-SEND(\\"+d.length+\\"): \\"+rstr2hex(d))}if(typeof d==\\"string\\"){b.socket.write(Buffer.from(d,\\"binary\\"))}else{b.socket.write(d)}};b.Send=function(d){if(b.socket==null||b.connectstate!=1){return}if(b.protocol==1){b.xxSend(String.fromCharCode(40,0,0,0)+ToIntStr(b.amtsequence++)+ToShortStr(d.length)+d)}else{b.xxSend(d)}};b.xxSendAmtKeepAlive=function(){if(b.socket==null){return}b.xxSend(String.fromCharCode(43,0,0,0)+ToIntStr(b.amtsequence++))};b.xxRandomValueHex=function(f){var g=[],e=Math.floor(f/2);for(var d=0;d>8)&255),((a>>16)&255),((a>>24)&255))}function ToShortStr(a){return String.fromCharCode((a&255),((a>>8)&255))}function ShortToStr(a){return String.fromCharCode((a>>8)&255,a&255)}function ShortToStrX(a){return String.fromCharCode(a&255,(a>>8)&255)}function IntToStr(a){return String.fromCharCode((a>>24)&255,(a>>16)&255,(a>>8)&255,a&255)}function IntToStrX(a){return String.fromCharCode(a&255,(a>>8)&255,(a>>16)&255,(a>>24)&255)}var md5hasher=require(\\"MD5Stream\\").create();function hex_md5(b){return md5hasher.syncHash(b).toString(\\"hex\\").toLowerCase()};"); addedModules.push("amt-redir-duk"); } catch (e) { }\r\ntry { addModule("amt-scanner", "function AMTScanner(){var a=require(\\"events\\").inherits(this);a.createEvent(\\"found\\");this.dgram=require(\\"dgram\\");this.buildRmcpPing=function(c){var b=Buffer.from(\\"06000006000011BE80000000\\",\\"hex\\");b[9]=c;return b};this.parseRmcpPacket=function(h,b,g,d){if(b==null||b.length<20){return}var f={};if(((b[12]==0)||(b[13]!=0)||(b[14]!=1)||(b[15]!=87))&&(b[21]&32)){f.servertag=b[9];f.minorVersion=b[18]&15;f.majorVersion=(b[18]>>4)&15;f.provisioningState=b[19]&3;var e=(b[16]*256)+b[17];var c=((b[19]&4)!=0)?true:false;f.openPorts=[e];f.address=g.address;if(c==true){f.openPorts=[16992,16993]}if(d!==undefined){d(h,f)}}};this.parseIPv4Range=function(f){if(f==undefined||f==null){return null}var g=f.split(\\"-\\");if(g.length==2){return{min:this.parseIpv4Addr(g[0]),max:this.parseIpv4Addr(g[1])}}g=f.split(\\"/\\");if(g.length==2){var c=this.parseIpv4Addr(g[0]),e=parseInt(g[1]),d=0;if(e<=16||e>32){return null}e=32-e;for(var b=0;b>24)&255)+\\".\\"+((b>>16)&255)+\\".\\"+((b>>8)&255)+\\".\\"+(b&255)};this.scan=function(e,h,b){var d=this.parseIPv4Range(e);var f=this.buildRmcpPing(0);var g=this.dgram.createSocket({type:\\"udp4\\"});g.parent=this;g.scanResults=[];g.on(\\"error\\",function(j){console.log(\\"Error:\\"+j)});g.on(\\"message\\",function(j,k){if(k.size>4){this.parent.parseRmcpPacket(this,j,k,function(m,l){m.scanResults.push(l)})}});g.on(\\"listening\\",function(){for(var j=d.min;j<=d.max;j++){g.send(f,623,g.parent.IPv4NumToStr(j))}});g.bind({address:\\"0.0.0.0\\",port:0,exclusive:true});var i=setTimeout(function c(){g.close();if(b){b(g.scanResults)}g.parent.emit(\\"found\\",g.scanResults);delete g},h)}}module.exports=AMTScanner;"); addedModules.push("amt-scanner"); } catch (e) { }\r\ntry { addModule("amt-wsman-duk", "function CreateWsmanComm(){var a={};a.PendingAjax=[];a.ActiveAjaxCount=0;a.MaxActiveAjaxCount=1;a.FailAllError=0;a.digest=null;a.RequestCount=0;if(arguments.length==1&&typeof(arguments[0]==\\"object\\")){a.host=arguments[0].host;a.port=arguments[0].port;a.authToken=arguments[0].authToken;a.tls=arguments[0].tls}else{a.host=arguments[0];a.port=arguments[1];a.user=arguments[2];a.pass=arguments[3];a.tls=arguments[4]}a.PerformAjax=function(d,c,f,e,g,b){if((a.ActiveAjaxCount==0||((a.ActiveAjaxCount=a.MaxActiveAjaxCount||a.PendingAjax.length==0){return}var b=a.PendingAjax.shift();a.PerformAjaxEx(b[0],b[1],b[2],b[3],b[4]);a.PerformNextAjax()};a.PerformAjaxEx=function(d,c,g,h,b){if(a.FailAllError!=0){if(a.FailAllError!=999){a.gotNextMessagesError({status:a.FailAllError},\\"error\\",null,[d,c,g])}return}if(!d){d=\\"\\"}if(globalDebugFlags&1){console.log(\\"SEND: \\"+d+\\"\\\\r\\\\n\\\\r\\\\n\\")}if(a.digest==null){if(a.authToken){a.digest=require(\\"http-digest\\").create({authToken:a.authToken})}else{a.digest=require(\\"http-digest\\").create(a.user,a.pass)}a.digest.http=require(\\"http\\")}var f={protocol:(a.tls==1?\\"https:\\":\\"http:\\"),method:\\"POST\\",host:a.host,path:\\"/wsman\\",port:a.port,rejectUnauthorized:false,checkServerIdentity:function(i){console.log(\\"checkServerIdentity\\",JSON.stringify(i))}};var e=a.digest.request(f);e.on(\\"error\\",function(i){a.gotNextMessagesError({status:600},\\"error\\",null,[d,c,g])});e.on(\\"response\\",function(i){if(globalDebugFlags&1){console.log(\\"Response: \\"+i.statusCode)}if(i.statusCode!=200){if(globalDebugFlags&1){console.log(\\"ERR:\\"+JSON.stringify(i))}a.gotNextMessagesError({status:i.statusCode},\\"error\\",null,[d,c,g])}else{i.acc=\\"\\";i.on(\\"data\\",function(j){this.acc+=j});i.on(\\"end\\",function(){a.gotNextMessages(i.acc,\\"success\\",{status:i.statusCode},[d,c,g])})}});e.end(d);a.ActiveAjaxCount++;return e};a.pendingAjaxCall=[];a.gotNextMessages=function(c,e,d,b){a.ActiveAjaxCount--;if(a.FailAllError==999){return}if(globalDebugFlags&1){console.log(\\"RECV: \\"+c+\\"\\\\r\\\\n\\\\r\\\\n\\")}if(a.FailAllError!=0){b[1](null,a.FailAllError,b[2]);return}if(d.status!=200){b[1](null,d.status,b[2]);return}b[1](c,200,b[2]);a.PerformNextAjax()};a.gotNextMessagesError=function(d,e,c,b){a.ActiveAjaxCount--;if(a.FailAllError==999){return}if(a.FailAllError!=0){b[1](null,a.FailAllError,b[2]);return}if(a.FailAllError!=999){b[1]({Header:{HttpError:d.status}},d.status,b[2])}a.PerformNextAjax()};a.CancelAllQueries=function(b){while(a.PendingAjax.length>0){var c=a.PendingAjax.shift();c[1](null,b,c[2])}};return a}module.exports=CreateWsmanComm;"); addedModules.push("amt-wsman-duk"); } catch (e) { }\r\ntry { addModule("amt-wsman", "function WsmanStackCreateService(){var p={_ObjectID:\\"WSMAN\\"};p.NextMessageId=1;p.Address=\\"/wsman\\";p.xmlParser=require(\\"amt-xml\\");if(arguments.length==1&&typeof(arguments[0]==\\"object\\")){var e=arguments[0].transport;if(e){p.comm=new e(arguments[0])}}else{var e=arguments[0];if(e){p.comm=new e(arguments[1],arguments[2],arguments[3],arguments[4],arguments[5],arguments[6])}}p.PerformAjax=function q(t,r,v,u,s){if(s==null){s=\\"\\"}p.comm.PerformAjax(\\\'
\\"+t,function(w,x,y){if(x!=200){r(p,null,{Header:{HttpError:x}},x,y);return}var z=p.xmlParser.ParseWsman(w);if(!z||z==null){r(p,null,{Header:{HttpError:x}},601,y)}else{r(p,z.Header.ResourceURI,z,200,y)}},v,u)};p.CancelAllQueries=function d(r){p.comm.CancelAllQueries(r)};p.GetNameFromUrl=function(r){var s=r.lastIndexOf(\\"/\\");return(s==-1)?r:r.substring(s+1)};p.ExecSubscribe=function n(z,t,C,r,B,y,A,w,D,x){var u=\\"\\",v=\\"\\",w=\\"\\";if(D!=null&&x!=null){u=\\\'http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#UsernameToken\\\'+D+\\\'\\\'+x+\\"\\";v=\\\'\\\'}if(w!=null){w=\\"\\"+w+\\"\\"}if(t==\\"PushWithAck\\"){t=\\"dmtf.org/wbem/wsman/1/wsman/PushWithAck\\"}else{if(t==\\"Push\\"){t=\\"xmlsoap.org/ws/2004/08/eventing/DeliveryModes/Push\\"}}var s=\\"http://schemas.xmlsoap.org/ws/2004/08/eventing/Subscribe\\"+p.Address+\\"\\"+z+\\"\\"+(p.NextMessageId++)+\\"http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous\\"+c(A)+u+\\\'
\\\'+C+\\"\\"+w+\\"\\"+v+\\"\\";p.PerformAjax(s+\\"
\\",r,B,y,\\\'xmlns:e=\\"http://schemas.xmlsoap.org/ws/2004/08/eventing\\" xmlns:m=\\"http://x.com\\"\\\')};p.ExecUnSubscribe=function o(u,r,w,t,v){var s=\\"http://schemas.xmlsoap.org/ws/2004/08/eventing/Unsubscribe\\"+p.Address+\\"\\"+u+\\"\\"+(p.NextMessageId++)+\\"http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous\\"+c(v)+\\"\\";p.PerformAjax(s+\\"\\",r,w,t,\\\'xmlns:e=\\"http://schemas.xmlsoap.org/ws/2004/08/eventing\\"\\\')};p.ExecPut=function m(v,u,r,x,t,w){var s=\\"http://schemas.xmlsoap.org/ws/2004/09/transfer/Put\\"+p.Address+\\"\\"+v+\\"\\"+(p.NextMessageId++)+\\"http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymousPT60.000S\\"+c(w)+\\"\\"+b(v,u);p.PerformAjax(s+\\"\\",r,x,t)};p.ExecCreate=function f(x,w,r,z,v,y){var u=p.GetNameFromUrl(x);var s=\\"http://schemas.xmlsoap.org/ws/2004/09/transfer/Create\\"+p.Address+\\"\\"+x+\\"\\"+(p.NextMessageId++)+\\"http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymousPT60S\\"+c(y)+\\"\\\';for(var t in w){s+=\\"\\"+w[t]+\\"\\"}p.PerformAjax(s+\\"\\",r,z,v)};p.ExecDelete=function g(v,u,r,w,t){var s=\\"http://schemas.xmlsoap.org/ws/2004/09/transfer/Delete\\"+p.Address+\\"\\"+v+\\"\\"+(p.NextMessageId++)+\\"http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymousPT60S\\"+c(u)+\\"\\";p.PerformAjax(s,r,w,t)};p.ExecGet=function i(t,r,u,s){p.PerformAjax(\\"http://schemas.xmlsoap.org/ws/2004/09/transfer/Get\\"+p.Address+\\"\\"+t+\\"\\"+(p.NextMessageId++)+\\"http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymousPT60S\\",r,u,s)};p.ExecMethod=function j(y,v,r,t,A,w,z){var s=\\"\\";for(var u in r){if(r[u]!=null){if(Array.isArray(r[u])){for(var B in r[u]){s+=\\"\\"+r[u][B]+\\"\\"}}else{s+=\\"\\"+r[u]+\\"\\"}}}p.ExecMethodXml(y,v,s,t,A,w,z)};p.ExecMethodXml=function k(v,t,r,s,x,u,w){p.PerformAjax(v+\\"/\\"+t+\\"\\"+p.Address+\\"\\"+v+\\"\\"+(p.NextMessageId++)+\\"http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymousPT60S\\"+c(w)+\\"\\\'+r+\\"\\",s,x,u)};p.ExecEnum=function h(t,r,u,s){p.PerformAjax(\\"http://schemas.xmlsoap.org/ws/2004/09/enumeration/Enumerate\\"+p.Address+\\"\\"+t+\\"\\"+(p.NextMessageId++)+\\\'http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymousPT60S\\\',r,u,s)};p.ExecPull=function l(u,s,r,v,t){p.PerformAjax(\\"http://schemas.xmlsoap.org/ws/2004/09/enumeration/Pull\\"+p.Address+\\"\\"+u+\\"\\"+(p.NextMessageId++)+\\\'http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymousPT60S\\\'+s+\\"99999999\\",r,v,t)};function b(w,u){if(!w||u==null){return\\"\\"}var s=p.GetNameFromUrl(w);var v=\\"\\\';for(var t in u){if(!u.hasOwnProperty(t)||t.indexOf(\\"__\\")===0||t.indexOf(\\"@\\")===0){continue}if(u[t]==null||typeof u[t]===\\"function\\"){continue}if(typeof u[t]===\\"object\\"&&u[t][\\"ReferenceParameters\\"]){v+=\\"\\"+u[t].Address+\\"\\"+u[t][\\"ReferenceParameters\\"][\\"ResourceURI\\"]+\\"\\";var x=u[t][\\"ReferenceParameters\\"][\\"SelectorSet\\"][\\"Selector\\"];if(Array.isArray(x)){for(var r=0;r\\"+x[r][\\"Value\\"]+\\"\\"}}else{v+=\\"\\"+x.Value+\\"\\"}v+=\\"\\"}else{if(Array.isArray(u[t])){for(var r=0;r\\"+u[t][r].toString()+\\"\\"}}else{v+=\\"\\"+u[t].toString()+\\"\\"}}}v+=\\"\\";return v}function a(r){if(!r){return\\"\\"}var t=\\" \\";for(var s in r){if(!r.hasOwnProperty(s)||s.indexOf(\\"@\\")!==0){continue}t+=s.substring(1)+\\\'=\\"\\\'+r[s]+\\\'\\" \\\'}return t}function c(v){if((v==null)||(v==\\"null\\")){return\\"\\"}if(typeof v==\\"string\\"){return v}if(v.InstanceID){return\\\'\\\'+v.InstanceID+\\"\\"}var t=\\"\\";for(var s in v){if(!v.hasOwnProperty(s)){continue}t+=\\\'\\\';if(v[s][\\"ReferenceParameters\\"]){t+=\\"\\";t+=\\"\\"+v[s][\\"Address\\"]+\\"\\"+v[s][\\"ReferenceParameters\\"][\\"ResourceURI\\"]+\\"\\";var u=v[s][\\"ReferenceParameters\\"][\\"SelectorSet\\"][\\"Selector\\"];if(Array.isArray(u)){for(var r=0;r\\"+u[r][\\"Value\\"]+\\"\\"}}else{t+=\\"\\"+u.Value+\\"\\"}t+=\\"\\"}else{t+=v[s]}t+=\\"\\"}t+=\\"\\";return t}return p}module.exports=WsmanStackCreateService;"); addedModules.push("amt-wsman"); } catch (e) { }\r\ntry { addModule("amt-xml", "try{Object.defineProperty(Array.prototype,\\"peek\\",{value:function(){return(this.length>0?this[this.length-1]:undefined)}})}catch(e){}module.exports.ParseWsman=function(k){try{if(!k.childNodes){k=_turnToXml(k)}var g={Header:{}},d=k.getElementsByTagName(\\"Header\\")[0],h;if(!d){d=k.getElementsByTagName(\\"a:Header\\")[0]}if(!d){return null}for(var f=0;f0){h=a.childNodes[0].localName;var j=h.indexOf(\\"_OUTPUT\\");if((j!=-1)&&(j==(h.length-7))){h=h.substring(0,h.length-7)}g.Header.Method=h;g.Body=_ParseWsmanRec(a.childNodes[0])}return g}catch(c){console.error(\\"Unable to parse XML: \\"+k,c);return null}};function _ParseWsmanRec(g){var c,h={};for(var d=0;d0)){b={Value:c};for(var f=0;f\\\';for(var c in d){if(!d.hasOwnProperty(c)||c.indexOf(\\"__\\")===0||c.indexOf(\\"@\\")===0){continue}if(d[c]==null||typeof d[c]===\\"function\\"){continue}if(typeof d[c]===\\"object\\"&&d[c][\\"ReferenceParameters\\"]){f+=\\"\\"+d[c].Address+\\"\\"+d[c][\\"ReferenceParameters\\"][\\"ResourceURI\\"]+\\"\\";var h=d[c][\\"ReferenceParameters\\"][\\"SelectorSet\\"][\\"Selector\\"];if(Array.isArray(h)){for(var a=0;a\\"+h[a][\\"Value\\"]+\\"\\"}}else{f+=\\"\\"+h.Value+\\"\\"}f+=\\"\\"}else{if(Array.isArray(d[c])){for(var a=0;a\\"+d[c][a].toString()+\\"\\"}}else{f+=\\"\\"+d[c].toString()+\\"\\"}}}f+=\\"\\";return f}function _treeBuilder(){this.tree=[];this.push=function(a){this.tree.push(a)};this.pop=function(){var a=this.tree.pop();if(this.tree.length>0){var b=this.tree.peek();b.childNodes.push(a);b.childElementCount=b.childNodes.length}return(a)};this.peek=function(){return(this.tree.peek())};this.addNamespace=function(g,d){this.tree.peek().nsTable[g]=d;if(this.tree.peek().attributes.length>0){for(var c=0;c=0;--a){if(this.tree[a].nsTable[b]!=null){return(this.tree[a].nsTable[b])}}return null}}function _turnToXml(a){if(a==null){return null}return({childNodes:[_turnToXmlRec(a)],getElementsByTagName:_getElementsByTagName,getChildElementsByTagName:_getChildElementsByTagName,getElementsByTagNameNS:_getElementsByTagNameNS})}function _getElementsByTagNameNS(b,a){var c=[];_xmlTraverseAllRec(this.childNodes,function(d){if(d.localName==a&&(d.namespace==b||b==\\"*\\")){c.push(d)}});return c}function _getElementsByTagName(a){var b=[];_xmlTraverseAllRec(this.childNodes,function(c){if(c.localName==a){b.push(c)}});return b}function _getChildElementsByTagName(a){var c=[];if(this.childNodes!=null){for(var b in this.childNodes){if(this.childNodes[b].localName==a){c.push(this.childNodes[b])}}}return(c)}function _getChildElementsByTagNameNS(c,a){var d=[];if(this.childNodes!=null){for(var b in this.childNodes){if(this.childNodes[b].localName==a&&(c==\\"*\\"||this.childNodes[b].namespace==c)){d.push(this.childNodes[b])}}}return(d)}function _xmlTraverseAllRec(c,a){for(var b in c){a(c[b]);if(c[b].childNodes){_xmlTraverseAllRec(c[b].childNodes,a)}}}function _turnToXmlRec(w){try{if(w==null){return null}var m=new _treeBuilder(),r=null,z=w.split(\\"<\\"),u=[],h=null,g=null;for(var o in z){var A=z[o].split(\\">\\"),B=A[0].split(\\" \\"),l=B[0];if((l.length>0)&&(l[0]!=\\"?\\")){if(l[0]!=\\"/\\"){var a=[],s,t=l.split(\\" \\")[0].split(\\":\\"),s=(t.length>1)?t[1]:t[0];Object.defineProperty(a,\\"get\\",{value:function(){if(arguments.length==1){for(var i in this){if(this[i].name==arguments[0]){return(this[i])}}}else{if(arguments.length==2){for(var i in this){if(this[i].name==arguments[1]&&(arguments[0]==\\"*\\"||this[i].namespace==arguments[0])){return(this[i])}}}else{throw (\\"attributes.get(): Invalid number of parameters\\")}}}});m.push({name:l,localName:s,getChildElementsByTagName:_getChildElementsByTagName,getElementsByTagNameNS:_getElementsByTagNameNS,getChildElementsByTagNameNS:_getChildElementsByTagNameNS,attributes:a,childNodes:[],nsTable:{}});if(B.length>0){var v=false;for(var p in B){if(B[p]==\\"/\\"){m.peek().namespace=m.peek().name==m.peek().localName?m.getNamespace(\\"*\\"):m.getNamespace(m.peek().name.substring(0,m.peek().name.indexOf(\\":\\")));m.peek().textContent=\\"\\";r=m.pop();v=true;break}var q=B[p].indexOf(\\"=\\");if(q>0){var b=B[p].substring(0,q);var d=B[p].substring(q+2,B[p].length-1);var c=m.getNamespace(\\"*\\");if(b==\\"xmlns\\"){m.addNamespace(\\"*\\",d);c=d}else{if(b.startsWith(\\"xmlns:\\")){m.addNamespace(b.substring(6),d)}else{var f=b.split(\\":\\");if(f.length==2){b=f[1];c=m.getNamespace(f[0])}}}var y={name:b,value:d};if(c!=null){y.namespace=c}m.peek().attributes.push(y)}}if(v){continue}}m.peek().namespace=m.peek().name==m.peek().localName?m.getNamespace(\\"*\\"):m.getNamespace(m.peek().name.substring(0,m.peek().name.indexOf(\\":\\")));if(A[1]){m.peek().textContent=A[1]}}else{r=m.pop()}}}}catch(n){return null}return r};"); addedModules.push("amt-xml"); } catch (e) { }\r\ntry { addModule("amt", "function AmtStackCreateService(R){var J=new Object();J._ObjectID=\\"AMT\\";J.wsman=R;J.pfx=[\\"http://intel.com/wbem/wscim/1/amt-schema/1/\\",\\"http://schemas.dmtf.org/wbem/wscim/1/cim-schema/2/\\",\\"http://intel.com/wbem/wscim/1/ips-schema/1/\\"];J.PendingEnums=[];J.PendingBatchOperations=0;J.ActiveEnumsCount=0;J.MaxActiveEnumsCount=1;J.onProcessChanged=null;var n=0;var m=0;J.GetPendingActions=function(){return(J.PendingEnums.length*2)+(J.ActiveEnumsCount)+J.wsman.comm.PendingAjax.length+J.wsman.comm.ActiveAjaxCount+J.PendingBatchOperations};function r(){var S=J.GetPendingActions();if(n=J.MaxActiveEnumsCount||J.PendingEnums.length==0){return}var T=J.PendingEnums.shift();J.Enum(T[0],T[1],T[2]);d(0)}J.BatchEnum=function(S,V,T,X,U,W){J.PendingBatchOperations+=(V.length*2);b(S,x(V),T,X,{},U,W);r()};function x(S){return JSON.parse(JSON.stringify(S))}function b(S,X,T,aa,Z,U,Y){J.PendingBatchOperations-=2;var W=X.shift(),V=J.Enum;if(W[0]==\\"*\\"){V=J.Get;W=W.substring(1)}V(W,function(ad,ab,ac,ae,af){af[2][ab]={response:(ac==null?null:ac.Body),responses:ac,status:ae};if(af[1].length==0||ae==401||(U!=true&&ae!=200&&ae!=400)){J.PendingBatchOperations-=(X.length*2);r();T.call(J,J,S,af[2],ae,aa)}else{r();b(S,X,T,aa,af[2],Y)}},[S,X,Z],Y);r()}J.BatchGet=function(S,U,T,W,V){h({name:S,names:U,callback:T,current:0,responses:{},tag:W,pri:V});r()};function h(S){if(S.names.length<=S.current){S.callback.call(J,J,S.name,S.responses,200,S.tag)}else{J.wsman.ExecGet(J.CompleteName(S.names[S.current]),function(V,U,T,W){g(S,T,W)},S.pri);S.current++}r()}function g(S,T,U){if(T==null||U!=200){S.callback.call(J,J,S.name,null,U,S.tag)}else{S.responses[T.Header.Method]=T;h(S)}}J.CompleteName=function(S){if(S.indexOf(\\"AMT_\\")==0){return J.pfx[0]+S}if(S.indexOf(\\"CIM_\\")==0){return J.pfx[1]+S}if(S.indexOf(\\"IPS_\\")==0){return J.pfx[2]+S}};J.CompleteExecResponse=function(S){if(S&&S!=null&&S.Body&&(S.Body.ReturnValue!=undefined)){S.Body.ReturnValueStr=J.AmtStatusToStr(S.Body.ReturnValue)}return S};J.RequestPowerStateChange=function(T,S){J.CIM_PowerManagementService_RequestPowerStateChange(T,\\\'
http://schemas.xmlsoap.org/ws/2004/08/addressing
http://schemas.dmtf.org/wbem/wscim/1/cim-schema/2/CIM_ComputerSystemCIM_ComputerSystemManagedSystem\\\',null,null,S)};J.SetBootConfigRole=function(T,S){J.CIM_BootService_SetBootConfigRole(\\\'
http://schemas.xmlsoap.org/ws/2004/08/addressing
http://schemas.dmtf.org/wbem/wscim/1/cim-schema/2/CIM_BootConfigSettingIntel(r) AMT: Boot Configuration 0\\\',T,S)};J.CancelAllQueries=function(S){J.wsman.CancelAllQueries(S)};J.AMT_AgentPresenceWatchdog_RegisterAgent=function(S,V,T,U){J.Exec(\\"AMT_AgentPresenceWatchdog\\",\\"RegisterAgent\\",{},S,V,T,U)};J.AMT_AgentPresenceWatchdog_AssertPresence=function(V,S,W,T,U){J.Exec(\\"AMT_AgentPresenceWatchdog\\",\\"AssertPresence\\",{SequenceNumber:V},S,W,T,U)};J.AMT_AgentPresenceWatchdog_AssertShutdown=function(V,S,W,T,U){J.Exec(\\"AMT_AgentPresenceWatchdog\\",\\"AssertShutdown\\",{SequenceNumber:V},S,W,T,U)};J.AMT_AgentPresenceWatchdog_AddAction=function(X,W,V,T,S,U,aa,Y,Z){J.Exec(\\"AMT_AgentPresenceWatchdog\\",\\"AddAction\\",{OldState:X,NewState:W,EventOnTransition:V,ActionSd:T,ActionEac:S},U,aa,Y,Z)};J.AMT_AgentPresenceWatchdog_DeleteAllActions=function(S,V,T,U){J.Exec(\\"AMT_AgentPresenceWatchdog\\",\\"DeleteAllActions\\",{},S,V,T,U)};J.AMT_AgentPresenceWatchdogAction_GetActionEac=function(S){J.Exec(\\"AMT_AgentPresenceWatchdogAction\\",\\"GetActionEac\\",{},S)};J.AMT_AgentPresenceWatchdogVA_RegisterAgent=function(S){J.Exec(\\"AMT_AgentPresenceWatchdogVA\\",\\"RegisterAgent\\",{},S)};J.AMT_AgentPresenceWatchdogVA_AssertPresence=function(T,S){J.Exec(\\"AMT_AgentPresenceWatchdogVA\\",\\"AssertPresence\\",{SequenceNumber:T},S)};J.AMT_AgentPresenceWatchdogVA_AssertShutdown=function(T,S){J.Exec(\\"AMT_AgentPresenceWatchdogVA\\",\\"AssertShutdown\\",{SequenceNumber:T},S)};J.AMT_AgentPresenceWatchdogVA_AddAction=function(X,W,V,T,S,U){J.Exec(\\"AMT_AgentPresenceWatchdogVA\\",\\"AddAction\\",{OldState:X,NewState:W,EventOnTransition:V,ActionSd:T,ActionEac:S},U)};J.AMT_AgentPresenceWatchdogVA_DeleteAllActions=function(S,T){J.Exec(\\"AMT_AgentPresenceWatchdogVA\\",\\"DeleteAllActions\\",{_method_dummy:S},T)};J.AMT_AlarmClockService_AddAlarm=function s(S,T){var V=S.InstanceID;var X=S.ElementName;var Y=S.StartTime.Datetime;var W=S.Interval?S.Interval.Datetime:undefined;var U=S.DeleteOnCompletion;var Z=\\\'\\\'+V+\\"\\"+X+\\\'\\\'+Y+\\"\\"+((W!=undefined)?(\\\'\\\'+W+\\"\\"):\\"\\")+\\"\\"+U+\\"\\";J.wsman.ExecMethodXml(J.CompleteName(\\"AMT_AlarmClockService\\"),\\"AddAlarm\\",Z,T)};J.AMT_AuditLog_ClearLog=function(S){J.Exec(\\"AMT_AuditLog\\",\\"ClearLog\\",{},S)};J.AMT_AuditLog_RequestStateChange=function(T,U,S){J.Exec(\\"AMT_AuditLog\\",\\"RequestStateChange\\",{RequestedState:T,TimeoutPeriod:U},S)};J.AMT_AuditLog_ReadRecords=function(T,S,U){J.Exec(\\"AMT_AuditLog\\",\\"ReadRecords\\",{StartIndex:T},S,U)};J.AMT_AuditLog_SetAuditLock=function(V,T,U,S){J.Exec(\\"AMT_AuditLog\\",\\"SetAuditLock\\",{LockTimeoutInSeconds:V,Flag:T,Handle:U},S)};J.AMT_AuditLog_ExportAuditLogSignature=function(T,S){J.Exec(\\"AMT_AuditLog\\",\\"ExportAuditLogSignature\\",{SigningMechanism:T},S)};J.AMT_AuditLog_SetSigningKeyMaterial=function(W,V,U,T,S){J.Exec(\\"AMT_AuditLog\\",\\"SetSigningKeyMaterial\\",{SigningMechanismType:W,SigningKey:V,LengthOfCertificates:U,Certificates:T},S)};J.AMT_AuditPolicyRule_SetAuditPolicy=function(U,S,V,W,T){J.Exec(\\"AMT_AuditPolicyRule\\",\\"SetAuditPolicy\\",{Enable:U,AuditedAppID:S,EventID:V,PolicyType:W},T)};J.AMT_AuditPolicyRule_SetAuditPolicyBulk=function(U,S,V,W,T){J.Exec(\\"AMT_AuditPolicyRule\\",\\"SetAuditPolicyBulk\\",{Enable:U,AuditedAppID:S,EventID:V,PolicyType:W},T)};J.AMT_AuthorizationService_AddUserAclEntryEx=function(V,U,W,S,X,T){J.Exec(\\"AMT_AuthorizationService\\",\\"AddUserAclEntryEx\\",{DigestUsername:V,DigestPassword:U,KerberosUserSid:W,AccessPermission:S,Realms:X},T)};J.AMT_AuthorizationService_EnumerateUserAclEntries=function(T,S){J.Exec(\\"AMT_AuthorizationService\\",\\"EnumerateUserAclEntries\\",{StartIndex:T},S)};J.AMT_AuthorizationService_GetUserAclEntryEx=function(T,S,U){J.Exec(\\"AMT_AuthorizationService\\",\\"GetUserAclEntryEx\\",{Handle:T},S,U)};J.AMT_AuthorizationService_UpdateUserAclEntryEx=function(W,V,U,X,S,Y,T){J.Exec(\\"AMT_AuthorizationService\\",\\"UpdateUserAclEntryEx\\",{Handle:W,DigestUsername:V,DigestPassword:U,KerberosUserSid:X,AccessPermission:S,Realms:Y},T)};J.AMT_AuthorizationService_RemoveUserAclEntry=function(T,S){J.Exec(\\"AMT_AuthorizationService\\",\\"RemoveUserAclEntry\\",{Handle:T},S)};J.AMT_AuthorizationService_SetAdminAclEntryEx=function(U,T,S){J.Exec(\\"AMT_AuthorizationService\\",\\"SetAdminAclEntryEx\\",{Username:U,DigestPassword:T},S)};J.AMT_AuthorizationService_GetAdminAclEntry=function(S){J.Exec(\\"AMT_AuthorizationService\\",\\"GetAdminAclEntry\\",{},S)};J.AMT_AuthorizationService_GetAdminAclEntryStatus=function(S){J.Exec(\\"AMT_AuthorizationService\\",\\"GetAdminAclEntryStatus\\",{},S)};J.AMT_AuthorizationService_GetAdminNetAclEntryStatus=function(S){J.Exec(\\"AMT_AuthorizationService\\",\\"GetAdminNetAclEntryStatus\\",{},S)};J.AMT_AuthorizationService_SetAclEnabledState=function(U,T,S,V){J.Exec(\\"AMT_AuthorizationService\\",\\"SetAclEnabledState\\",{Handle:U,Enabled:T},S,V)};J.AMT_AuthorizationService_GetAclEnabledState=function(T,S,U){J.Exec(\\"AMT_AuthorizationService\\",\\"GetAclEnabledState\\",{Handle:T},S,U)};J.AMT_EndpointAccessControlService_RequestStateChange=function(T,U,S){J.Exec(\\"AMT_EndpointAccessControlService\\",\\"RequestStateChange\\",{RequestedState:T,TimeoutPeriod:U},S)};J.AMT_EndpointAccessControlService_GetPosture=function(T,S){J.Exec(\\"AMT_EndpointAccessControlService\\",\\"GetPosture\\",{PostureType:T},S)};J.AMT_EndpointAccessControlService_GetPostureHash=function(T,S){J.Exec(\\"AMT_EndpointAccessControlService\\",\\"GetPostureHash\\",{PostureType:T},S)};J.AMT_EndpointAccessControlService_UpdatePostureState=function(T,S){J.Exec(\\"AMT_EndpointAccessControlService\\",\\"UpdatePostureState\\",{UpdateType:T},S)};J.AMT_EndpointAccessControlService_GetEacOptions=function(S){J.Exec(\\"AMT_EndpointAccessControlService\\",\\"GetEacOptions\\",{},S)};J.AMT_EndpointAccessControlService_SetEacOptions=function(T,U,S){J.Exec(\\"AMT_EndpointAccessControlService\\",\\"SetEacOptions\\",{EacVendors:T,PostureHashAlgorithm:U},S)};J.AMT_EnvironmentDetectionSettingData_SetSystemDefensePolicy=function(T,S){J.Exec(\\"AMT_EnvironmentDetectionSettingData\\",\\"SetSystemDefensePolicy\\",{Policy:T},S)};J.AMT_EnvironmentDetectionSettingData_EnableVpnRouting=function(T,S){J.Exec(\\"AMT_EnvironmentDetectionSettingData\\",\\"EnableVpnRouting\\",{Enable:T},S)};J.AMT_EthernetPortSettings_SetLinkPreference=function(T,U,S){J.Exec(\\"AMT_EthernetPortSettings\\",\\"SetLinkPreference\\",{LinkPreference:T,Timeout:U},S)};J.AMT_HeuristicPacketFilterStatistics_ResetSelectedStats=function(T,S){J.Exec(\\"AMT_HeuristicPacketFilterStatistics\\",\\"ResetSelectedStats\\",{SelectedStatistics:T},S)};J.AMT_KerberosSettingData_GetCredentialCacheState=function(S){J.Exec(\\"AMT_KerberosSettingData\\",\\"GetCredentialCacheState\\",{},S)};J.AMT_KerberosSettingData_SetCredentialCacheState=function(T,S){J.Exec(\\"AMT_KerberosSettingData\\",\\"SetCredentialCacheState\\",{Enable:T},S)};J.AMT_MessageLog_CancelIteration=function(T,S){J.Exec(\\"AMT_MessageLog\\",\\"CancelIteration\\",{IterationIdentifier:T},S)};J.AMT_MessageLog_RequestStateChange=function(T,U,S){J.Exec(\\"AMT_MessageLog\\",\\"RequestStateChange\\",{RequestedState:T,TimeoutPeriod:U},S)};J.AMT_MessageLog_ClearLog=function(S){J.Exec(\\"AMT_MessageLog\\",\\"ClearLog\\",{},S)};J.AMT_MessageLog_GetRecords=function(T,U,S,V){J.Exec(\\"AMT_MessageLog\\",\\"GetRecords\\",{IterationIdentifier:T,MaxReadRecords:U},S,V)};J.AMT_MessageLog_GetRecord=function(T,U,S){J.Exec(\\"AMT_MessageLog\\",\\"GetRecord\\",{IterationIdentifier:T,PositionToNext:U},S)};J.AMT_MessageLog_PositionAtRecord=function(T,U,V,S){J.Exec(\\"AMT_MessageLog\\",\\"PositionAtRecord\\",{IterationIdentifier:T,MoveAbsolute:U,RecordNumber:V},S)};J.AMT_MessageLog_PositionToFirstRecord=function(S,T){J.Exec(\\"AMT_MessageLog\\",\\"PositionToFirstRecord\\",{},S,T)};J.AMT_MessageLog_FreezeLog=function(T,S){J.Exec(\\"AMT_MessageLog\\",\\"FreezeLog\\",{Freeze:T},S)};J.AMT_PublicKeyManagementService_AddCRL=function(U,T,S){J.Exec(\\"AMT_PublicKeyManagementService\\",\\"AddCRL\\",{Url:U,SerialNumbers:T},S)};J.AMT_PublicKeyManagementService_ResetCRLList=function(S,T){J.Exec(\\"AMT_PublicKeyManagementService\\",\\"ResetCRLList\\",{_method_dummy:S},T)};J.AMT_PublicKeyManagementService_AddCertificate=function(T,S,U){J.Exec(\\"AMT_PublicKeyManagementService\\",\\"AddCertificate\\",{CertificateBlob:T},S,U)};J.AMT_PublicKeyManagementService_AddTrustedRootCertificate=function(T,S){J.Exec(\\"AMT_PublicKeyManagementService\\",\\"AddTrustedRootCertificate\\",{CertificateBlob:T},S)};J.AMT_PublicKeyManagementService_AddKey=function(T,S){J.Exec(\\"AMT_PublicKeyManagementService\\",\\"AddKey\\",{KeyBlob:T},S)};J.AMT_PublicKeyManagementService_GeneratePKCS10Request=function(U,T,V,S){J.Exec(\\"AMT_PublicKeyManagementService\\",\\"GeneratePKCS10Request\\",{KeyPair:U,DNName:T,Usage:V},S)};J.AMT_PublicKeyManagementService_GeneratePKCS10RequestEx=function(T,V,U,S){J.Exec(\\"AMT_PublicKeyManagementService\\",\\"GeneratePKCS10RequestEx\\",{KeyPair:T,SigningAlgorithm:V,NullSignedCertificateRequest:U},S)};J.AMT_PublicKeyManagementService_GenerateKeyPair=function(T,U,S){J.Exec(\\"AMT_PublicKeyManagementService\\",\\"GenerateKeyPair\\",{KeyAlgorithm:T,KeyLength:U},S)};J.AMT_RedirectionService_RequestStateChange=function(T,S){J.Exec(\\"AMT_RedirectionService\\",\\"RequestStateChange\\",{RequestedState:T},S)};J.AMT_RedirectionService_TerminateSession=function(T,S){J.Exec(\\"AMT_RedirectionService\\",\\"TerminateSession\\",{SessionType:T},S)};J.AMT_RemoteAccessService_AddMpServer=function(S,X,Z,T,V,aa,Y,W,U){J.Exec(\\"AMT_RemoteAccessService\\",\\"AddMpServer\\",{AccessInfo:S,InfoFormat:X,Port:Z,AuthMethod:T,Certificate:V,Username:aa,Password:Y,CN:W},U)};J.AMT_RemoteAccessService_AddRemoteAccessPolicyRule=function(V,W,T,U,S){J.Exec(\\"AMT_RemoteAccessService\\",\\"AddRemoteAccessPolicyRule\\",{Trigger:V,TunnelLifeTime:W,ExtendedData:T,MpServer:U},S)};J.AMT_RemoteAccessService_CloseRemoteAccessConnection=function(S,T){J.Exec(\\"AMT_RemoteAccessService\\",\\"CloseRemoteAccessConnection\\",{_method_dummy:S},T)};J.AMT_SetupAndConfigurationService_CommitChanges=function(S,T,U){J.Exec(\\"AMT_SetupAndConfigurationService\\",\\"CommitChanges\\",{_method_dummy:S},T,U)};J.AMT_SetupAndConfigurationService_Unprovision=function(T,S){J.Exec(\\"AMT_SetupAndConfigurationService\\",\\"Unprovision\\",{ProvisioningMode:T},S)};J.AMT_SetupAndConfigurationService_PartialUnprovision=function(S,T){J.Exec(\\"AMT_SetupAndConfigurationService\\",\\"PartialUnprovision\\",{_method_dummy:S},T)};J.AMT_SetupAndConfigurationService_ResetFlashWearOutProtection=function(S,T){J.Exec(\\"AMT_SetupAndConfigurationService\\",\\"ResetFlashWearOutProtection\\",{_method_dummy:S},T)};J.AMT_SetupAndConfigurationService_ExtendProvisioningPeriod=function(T,S){J.Exec(\\"AMT_SetupAndConfigurationService\\",\\"ExtendProvisioningPeriod\\",{Duration:T},S)};J.AMT_SetupAndConfigurationService_SetMEBxPassword=function(T,S){J.Exec(\\"AMT_SetupAndConfigurationService\\",\\"SetMEBxPassword\\",{Password:T},S)};J.AMT_SetupAndConfigurationService_SetTLSPSK=function(T,U,S){J.Exec(\\"AMT_SetupAndConfigurationService\\",\\"SetTLSPSK\\",{PID:T,PPS:U},S)};J.AMT_SetupAndConfigurationService_GetProvisioningAuditRecord=function(S){J.Exec(\\"AMT_SetupAndConfigurationService\\",\\"GetProvisioningAuditRecord\\",{},S)};J.AMT_SetupAndConfigurationService_GetUuid=function(S){J.Exec(\\"AMT_SetupAndConfigurationService\\",\\"GetUuid\\",{},S)};J.AMT_SetupAndConfigurationService_GetUnprovisionBlockingComponents=function(S){J.Exec(\\"AMT_SetupAndConfigurationService\\",\\"GetUnprovisionBlockingComponents\\",{},S)};J.AMT_SetupAndConfigurationService_GetProvisioningAuditRecordV2=function(S){J.Exec(\\"AMT_SetupAndConfigurationService\\",\\"GetProvisioningAuditRecordV2\\",{},S)};J.AMT_SystemDefensePolicy_GetTimeout=function(S){J.Exec(\\"AMT_SystemDefensePolicy\\",\\"GetTimeout\\",{},S)};J.AMT_SystemDefensePolicy_SetTimeout=function(T,S){J.Exec(\\"AMT_SystemDefensePolicy\\",\\"SetTimeout\\",{Timeout:T},S)};J.AMT_SystemDefensePolicy_UpdateStatistics=function(T,V,S,X,U,W){J.Exec(\\"AMT_SystemDefensePolicy\\",\\"UpdateStatistics\\",{NetworkInterface:T,ResetOnRead:V},S,X,U,W)};J.AMT_SystemPowerScheme_SetPowerScheme=function(S,T,U){J.Exec(\\"AMT_SystemPowerScheme\\",\\"SetPowerScheme\\",{},S,U,0,{InstanceID:T})};J.AMT_TimeSynchronizationService_GetLowAccuracyTimeSynch=function(S,T){J.Exec(\\"AMT_TimeSynchronizationService\\",\\"GetLowAccuracyTimeSynch\\",{},S,T)};J.AMT_TimeSynchronizationService_SetHighAccuracyTimeSynch=function(T,V,W,S,U){J.Exec(\\"AMT_TimeSynchronizationService\\",\\"SetHighAccuracyTimeSynch\\",{Ta0:T,Tm1:V,Tm2:W},S,U)};J.AMT_TLSCredentialContext_Create=function t(T,U,S,V){J.Create(\\"AMT_TLSCredentialContext\\",{ElementInContext:T,ElementProvidingContext:U},S,V)};J.AMT_UserInitiatedConnectionService_RequestStateChange=function(T,U,S){J.Exec(\\"AMT_UserInitiatedConnectionService\\",\\"RequestStateChange\\",{RequestedState:T,TimeoutPeriod:U},S)};J.AMT_WebUIService_RequestStateChange=function(T,V,S,U){J.Exec(\\"AMT_WebUIService\\",\\"RequestStateChange\\",{RequestedState:T,TimeoutPeriod:V},S,U)};J.AMT_WiFiPortConfigurationService_AddWiFiSettings=function(W,X,V,U,S,T){J.ExecWithXml(\\"AMT_WiFiPortConfigurationService\\",\\"AddWiFiSettings\\",{WiFiEndpoint:W,WiFiEndpointSettingsInput:X,IEEE8021xSettingsInput:V,ClientCredential:U,CACredential:S},T)};J.AMT_WiFiPortConfigurationService_UpdateWiFiSettings=function(W,X,V,U,S,T){J.ExecWithXml(\\"AMT_WiFiPortConfigurationService\\",\\"UpdateWiFiSettings\\",{WiFiEndpointSettings:W,WiFiEndpointSettingsInput:X,IEEE8021xSettingsInput:V,ClientCredential:U,CACredential:S},T)};J.AMT_WiFiPortConfigurationService_DeleteAllITProfiles=function(S,T){J.Exec(\\"AMT_WiFiPortConfigurationService\\",\\"DeleteAllITProfiles\\",{_method_dummy:S},T)};J.AMT_WiFiPortConfigurationService_DeleteAllUserProfiles=function(S,T){J.Exec(\\"AMT_WiFiPortConfigurationService\\",\\"DeleteAllUserProfiles\\",{_method_dummy:S},T)};J.CIM_Account_RequestStateChange=function(T,U,S){J.Exec(\\"CIM_Account\\",\\"RequestStateChange\\",{RequestedState:T,TimeoutPeriod:U},S)};J.CIM_AccountManagementService_CreateAccount=function(U,S,T){J.Exec(\\"CIM_AccountManagementService\\",\\"CreateAccount\\",{System:U,AccountTemplate:S},T)};J.CIM_BootConfigSetting_ChangeBootOrder=function(T,S){J.Exec(\\"CIM_BootConfigSetting\\",\\"ChangeBootOrder\\",{Source:T},S)};J.CIM_BootService_SetBootConfigRole=function(S,U,T){J.Exec(\\"CIM_BootService\\",\\"SetBootConfigRole\\",{BootConfigSetting:S,Role:U},T,0,1)};J.CIM_Card_ConnectorPower=function(T,U,S){J.Exec(\\"CIM_Card\\",\\"ConnectorPower\\",{Connector:T,PoweredOn:U},S)};J.CIM_Card_IsCompatible=function(T,S){J.Exec(\\"CIM_Card\\",\\"IsCompatible\\",{ElementToCheck:T},S)};J.CIM_Chassis_IsCompatible=function(T,S){J.Exec(\\"CIM_Chassis\\",\\"IsCompatible\\",{ElementToCheck:T},S)};J.CIM_Fan_SetSpeed=function(T,S){J.Exec(\\"CIM_Fan\\",\\"SetSpeed\\",{DesiredSpeed:T},S)};J.CIM_KVMRedirectionSAP_RequestStateChange=function(T,U,S){J.Exec(\\"CIM_KVMRedirectionSAP\\",\\"RequestStateChange\\",{RequestedState:T},S)};J.CIM_MediaAccessDevice_LockMedia=function(T,S){J.Exec(\\"CIM_MediaAccessDevice\\",\\"LockMedia\\",{Lock:T},S)};J.CIM_MediaAccessDevice_SetPowerState=function(T,U,S){J.Exec(\\"CIM_MediaAccessDevice\\",\\"SetPowerState\\",{PowerState:T,Time:U},S)};J.CIM_MediaAccessDevice_Reset=function(S){J.Exec(\\"CIM_MediaAccessDevice\\",\\"Reset\\",{},S)};J.CIM_MediaAccessDevice_EnableDevice=function(T,S){J.Exec(\\"CIM_MediaAccessDevice\\",\\"EnableDevice\\",{Enabled:T},S)};J.CIM_MediaAccessDevice_OnlineDevice=function(T,S){J.Exec(\\"CIM_MediaAccessDevice\\",\\"OnlineDevice\\",{Online:T},S)};J.CIM_MediaAccessDevice_QuiesceDevice=function(T,S){J.Exec(\\"CIM_MediaAccessDevice\\",\\"QuiesceDevice\\",{Quiesce:T},S)};J.CIM_MediaAccessDevice_SaveProperties=function(S){J.Exec(\\"CIM_MediaAccessDevice\\",\\"SaveProperties\\",{},S)};J.CIM_MediaAccessDevice_RestoreProperties=function(S){J.Exec(\\"CIM_MediaAccessDevice\\",\\"RestoreProperties\\",{},S)};J.CIM_MediaAccessDevice_RequestStateChange=function(T,U,S){J.Exec(\\"CIM_MediaAccessDevice\\",\\"RequestStateChange\\",{RequestedState:T,TimeoutPeriod:U},S)};J.CIM_PhysicalFrame_IsCompatible=function(T,S){J.Exec(\\"CIM_PhysicalFrame\\",\\"IsCompatible\\",{ElementToCheck:T},S)};J.CIM_PhysicalPackage_IsCompatible=function(T,S){J.Exec(\\"CIM_PhysicalPackage\\",\\"IsCompatible\\",{ElementToCheck:T},S)};J.CIM_PowerManagementService_RequestPowerStateChange=function(U,T,V,W,S){J.Exec(\\"CIM_PowerManagementService\\",\\"RequestPowerStateChange\\",{PowerState:U,ManagedElement:T,Time:V,TimeoutPeriod:W},S,0,1)};J.CIM_PowerSupply_SetPowerState=function(T,U,S){J.Exec(\\"CIM_PowerSupply\\",\\"SetPowerState\\",{PowerState:T,Time:U},S)};J.CIM_PowerSupply_Reset=function(S){J.Exec(\\"CIM_PowerSupply\\",\\"Reset\\",{},S)};J.CIM_PowerSupply_EnableDevice=function(T,S){J.Exec(\\"CIM_PowerSupply\\",\\"EnableDevice\\",{Enabled:T},S)};J.CIM_PowerSupply_OnlineDevice=function(T,S){J.Exec(\\"CIM_PowerSupply\\",\\"OnlineDevice\\",{Online:T},S)};J.CIM_PowerSupply_QuiesceDevice=function(T,S){J.Exec(\\"CIM_PowerSupply\\",\\"QuiesceDevice\\",{Quiesce:T},S)};J.CIM_PowerSupply_SaveProperties=function(S){J.Exec(\\"CIM_PowerSupply\\",\\"SaveProperties\\",{},S)};J.CIM_PowerSupply_RestoreProperties=function(S){J.Exec(\\"CIM_PowerSupply\\",\\"RestoreProperties\\",{},S)};J.CIM_PowerSupply_RequestStateChange=function(T,U,S){J.Exec(\\"CIM_PowerSupply\\",\\"RequestStateChange\\",{RequestedState:T,TimeoutPeriod:U},S)};J.CIM_Processor_SetPowerState=function(T,U,S){J.Exec(\\"CIM_Processor\\",\\"SetPowerState\\",{PowerState:T,Time:U},S)};J.CIM_Processor_Reset=function(S){J.Exec(\\"CIM_Processor\\",\\"Reset\\",{},S)};J.CIM_Processor_EnableDevice=function(T,S){J.Exec(\\"CIM_Processor\\",\\"EnableDevice\\",{Enabled:T},S)};J.CIM_Processor_OnlineDevice=function(T,S){J.Exec(\\"CIM_Processor\\",\\"OnlineDevice\\",{Online:T},S)};J.CIM_Processor_QuiesceDevice=function(T,S){J.Exec(\\"CIM_Processor\\",\\"QuiesceDevice\\",{Quiesce:T},S)};J.CIM_Processor_SaveProperties=function(S){J.Exec(\\"CIM_Processor\\",\\"SaveProperties\\",{},S)};J.CIM_Processor_RestoreProperties=function(S){J.Exec(\\"CIM_Processor\\",\\"RestoreProperties\\",{},S)};J.CIM_Processor_RequestStateChange=function(T,U,S){J.Exec(\\"CIM_Processor\\",\\"RequestStateChange\\",{RequestedState:T,TimeoutPeriod:U},S)};J.CIM_RecordLog_ClearLog=function(S){J.Exec(\\"CIM_RecordLog\\",\\"ClearLog\\",{},S)};J.CIM_RecordLog_RequestStateChange=function(T,U,S){J.Exec(\\"CIM_RecordLog\\",\\"RequestStateChange\\",{RequestedState:T,TimeoutPeriod:U},S)};J.CIM_RedirectionService_RequestStateChange=function(T,U,S){J.Exec(\\"CIM_RedirectionService\\",\\"RequestStateChange\\",{RequestedState:T,TimeoutPeriod:U},S)};J.CIM_Sensor_SetPowerState=function(T,U,S){J.Exec(\\"CIM_Sensor\\",\\"SetPowerState\\",{PowerState:T,Time:U},S)};J.CIM_Sensor_Reset=function(S){J.Exec(\\"CIM_Sensor\\",\\"Reset\\",{},S)};J.CIM_Sensor_EnableDevice=function(T,S){J.Exec(\\"CIM_Sensor\\",\\"EnableDevice\\",{Enabled:T},S)};J.CIM_Sensor_OnlineDevice=function(T,S){J.Exec(\\"CIM_Sensor\\",\\"OnlineDevice\\",{Online:T},S)};J.CIM_Sensor_QuiesceDevice=function(T,S){J.Exec(\\"CIM_Sensor\\",\\"QuiesceDevice\\",{Quiesce:T},S)};J.CIM_Sensor_SaveProperties=function(S){J.Exec(\\"CIM_Sensor\\",\\"SaveProperties\\",{},S)};J.CIM_Sensor_RestoreProperties=function(S){J.Exec(\\"CIM_Sensor\\",\\"RestoreProperties\\",{},S)};J.CIM_Sensor_RequestStateChange=function(T,U,S){J.Exec(\\"CIM_Sensor\\",\\"RequestStateChange\\",{RequestedState:T,TimeoutPeriod:U},S)};J.CIM_StatisticalData_ResetSelectedStats=function(T,S){J.Exec(\\"CIM_StatisticalData\\",\\"ResetSelectedStats\\",{SelectedStatistics:T},S)};J.CIM_Watchdog_KeepAlive=function(S){J.Exec(\\"CIM_Watchdog\\",\\"KeepAlive\\",{},S)};J.CIM_Watchdog_SetPowerState=function(T,U,S){J.Exec(\\"CIM_Watchdog\\",\\"SetPowerState\\",{PowerState:T,Time:U},S)};J.CIM_Watchdog_Reset=function(S){J.Exec(\\"CIM_Watchdog\\",\\"Reset\\",{},S)};J.CIM_Watchdog_EnableDevice=function(T,S){J.Exec(\\"CIM_Watchdog\\",\\"EnableDevice\\",{Enabled:T},S)};J.CIM_Watchdog_OnlineDevice=function(T,S){J.Exec(\\"CIM_Watchdog\\",\\"OnlineDevice\\",{Online:T},S)};J.CIM_Watchdog_QuiesceDevice=function(T,S){J.Exec(\\"CIM_Watchdog\\",\\"QuiesceDevice\\",{Quiesce:T},S)};J.CIM_Watchdog_SaveProperties=function(S){J.Exec(\\"CIM_Watchdog\\",\\"SaveProperties\\",{},S)};J.CIM_Watchdog_RestoreProperties=function(S){J.Exec(\\"CIM_Watchdog\\",\\"RestoreProperties\\",{},S)};J.CIM_Watchdog_RequestStateChange=function(T,U,S){J.Exec(\\"CIM_Watchdog\\",\\"RequestStateChange\\",{RequestedState:T,TimeoutPeriod:U},S)};J.CIM_WiFiPort_SetPowerState=function(T,U,S){J.Exec(\\"CIM_WiFiPort\\",\\"SetPowerState\\",{PowerState:T,Time:U},S)};J.CIM_WiFiPort_Reset=function(S){J.Exec(\\"CIM_WiFiPort\\",\\"Reset\\",{},S)};J.CIM_WiFiPort_EnableDevice=function(T,S){J.Exec(\\"CIM_WiFiPort\\",\\"EnableDevice\\",{Enabled:T},S)};J.CIM_WiFiPort_OnlineDevice=function(T,S){J.Exec(\\"CIM_WiFiPort\\",\\"OnlineDevice\\",{Online:T},S)};J.CIM_WiFiPort_QuiesceDevice=function(T,S){J.Exec(\\"CIM_WiFiPort\\",\\"QuiesceDevice\\",{Quiesce:T},S)};J.CIM_WiFiPort_SaveProperties=function(S){J.Exec(\\"CIM_WiFiPort\\",\\"SaveProperties\\",{},S)};J.CIM_WiFiPort_RestoreProperties=function(S){J.Exec(\\"CIM_WiFiPort\\",\\"RestoreProperties\\",{},S)};J.CIM_WiFiPort_RequestStateChange=function(T,U,S){J.Exec(\\"CIM_WiFiPort\\",\\"RequestStateChange\\",{RequestedState:T,TimeoutPeriod:U},S)};J.IPS_HostBasedSetupService_Setup=function(W,X,V,T,Y,U,S){J.Exec(\\"IPS_HostBasedSetupService\\",\\"Setup\\",{NetAdminPassEncryptionType:W,NetworkAdminPassword:X,McNonce:V,Certificate:T,SigningAlgorithm:Y,DigitalSignature:U},S)};J.IPS_HostBasedSetupService_AddNextCertInChain=function(V,T,U,S){J.Exec(\\"IPS_HostBasedSetupService\\",\\"AddNextCertInChain\\",{NextCertificate:V,IsLeafCertificate:T,IsRootCertificate:U},S)};J.IPS_HostBasedSetupService_AdminSetup=function(V,W,U,X,T,S){J.Exec(\\"IPS_HostBasedSetupService\\",\\"AdminSetup\\",{NetAdminPassEncryptionType:V,NetworkAdminPassword:W,McNonce:U,SigningAlgorithm:X,DigitalSignature:T},S)};J.IPS_HostBasedSetupService_UpgradeClientToAdmin=function(U,V,T,S){J.Exec(\\"IPS_HostBasedSetupService\\",\\"UpgradeClientToAdmin\\",{McNonce:U,SigningAlgorithm:V,DigitalSignature:T},S)};J.IPS_HostBasedSetupService_DisableClientControlMode=function(S,T){J.Exec(\\"IPS_HostBasedSetupService\\",\\"DisableClientControlMode\\",{_method_dummy:S},T)};J.IPS_KVMRedirectionSettingData_TerminateSession=function(S){J.Exec(\\"IPS_KVMRedirectionSettingData\\",\\"TerminateSession\\",{},S)};J.IPS_KVMRedirectionSettingData_DataChannelRead=function(S){J.Exec(\\"IPS_KVMRedirectionSettingData\\",\\"DataChannelRead\\",{},S)};J.IPS_KVMRedirectionSettingData_DataChannelWrite=function(T,S){J.Exec(\\"IPS_KVMRedirectionSettingData\\",\\"DataChannelWrite\\",{DataMessage:T},S)};J.IPS_OptInService_StartOptIn=function(S){J.Exec(\\"IPS_OptInService\\",\\"StartOptIn\\",{},S)};J.IPS_OptInService_CancelOptIn=function(S){J.Exec(\\"IPS_OptInService\\",\\"CancelOptIn\\",{},S)};J.IPS_OptInService_SendOptInCode=function(T,S){J.Exec(\\"IPS_OptInService\\",\\"SendOptInCode\\",{OptInCode:T},S)};J.IPS_OptInService_StartService=function(S){J.Exec(\\"IPS_OptInService\\",\\"StartService\\",{},S)};J.IPS_OptInService_StopService=function(S){J.Exec(\\"IPS_OptInService\\",\\"StopService\\",{},S)};J.IPS_OptInService_RequestStateChange=function(T,U,S){J.Exec(\\"IPS_OptInService\\",\\"RequestStateChange\\",{RequestedState:T,TimeoutPeriod:U},S)};J.IPS_ProvisioningRecordLog_RequestStateChange=function(T,U,S){J.Exec(\\"IPS_ProvisioningRecordLog\\",\\"RequestStateChange\\",{RequestedState:T,TimeoutPeriod:U},S)};J.IPS_ProvisioningRecordLog_ClearLog=function(S,T){J.Exec(\\"IPS_ProvisioningRecordLog\\",\\"ClearLog\\",{_method_dummy:S},T)};J.IPS_SecIOService_RequestStateChange=function(T,U,S){J.Exec(\\"IPS_SecIOService\\",\\"RequestStateChange\\",{RequestedState:T,TimeoutPeriod:U},S)};J.AmtStatusToStr=function(S){if(J.AmtStatusCodes[S]){return J.AmtStatusCodes[S]}else{return\\"UNKNOWN_ERROR\\"}};J.AmtStatusCodes={0:\\"SUCCESS\\",1:\\"INTERNAL_ERROR\\",2:\\"NOT_READY\\",3:\\"INVALID_PT_MODE\\",4:\\"INVALID_MESSAGE_LENGTH\\",5:\\"TABLE_FINGERPRINT_NOT_AVAILABLE\\",6:\\"INTEGRITY_CHECK_FAILED\\",7:\\"UNSUPPORTED_ISVS_VERSION\\",8:\\"APPLICATION_NOT_REGISTERED\\",9:\\"INVALID_REGISTRATION_DATA\\",10:\\"APPLICATION_DOES_NOT_EXIST\\",11:\\"NOT_ENOUGH_STORAGE\\",12:\\"INVALID_NAME\\",13:\\"BLOCK_DOES_NOT_EXIST\\",14:\\"INVALID_BYTE_OFFSET\\",15:\\"INVALID_BYTE_COUNT\\",16:\\"NOT_PERMITTED\\",17:\\"NOT_OWNER\\",18:\\"BLOCK_LOCKED_BY_OTHER\\",19:\\"BLOCK_NOT_LOCKED\\",20:\\"INVALID_GROUP_PERMISSIONS\\",21:\\"GROUP_DOES_NOT_EXIST\\",22:\\"INVALID_MEMBER_COUNT\\",23:\\"MAX_LIMIT_REACHED\\",24:\\"INVALID_AUTH_TYPE\\",25:\\"AUTHENTICATION_FAILED\\",26:\\"INVALID_DHCP_MODE\\",27:\\"INVALID_IP_ADDRESS\\",28:\\"INVALID_DOMAIN_NAME\\",29:\\"UNSUPPORTED_VERSION\\",30:\\"REQUEST_UNEXPECTED\\",31:\\"INVALID_TABLE_TYPE\\",32:\\"INVALID_PROVISIONING_STATE\\",33:\\"UNSUPPORTED_OBJECT\\",34:\\"INVALID_TIME\\",35:\\"INVALID_INDEX\\",36:\\"INVALID_PARAMETER\\",37:\\"INVALID_NETMASK\\",38:\\"FLASH_WRITE_LIMIT_EXCEEDED\\",39:\\"INVALID_IMAGE_LENGTH\\",40:\\"INVALID_IMAGE_SIGNATURE\\",41:\\"PROPOSE_ANOTHER_VERSION\\",42:\\"INVALID_PID_FORMAT\\",43:\\"INVALID_PPS_FORMAT\\",44:\\"BIST_COMMAND_BLOCKED\\",45:\\"CONNECTION_FAILED\\",46:\\"CONNECTION_TOO_MANY\\",47:\\"RNG_GENERATION_IN_PROGRESS\\",48:\\"RNG_NOT_READY\\",49:\\"CERTIFICATE_NOT_READY\\",1024:\\"DISABLED_BY_POLICY\\",2048:\\"NETWORK_IF_ERROR_BASE\\",2049:\\"UNSUPPORTED_OEM_NUMBER\\",2050:\\"UNSUPPORTED_BOOT_OPTION\\",2051:\\"INVALID_COMMAND\\",2052:\\"INVALID_SPECIAL_COMMAND\\",2053:\\"INVALID_HANDLE\\",2054:\\"INVALID_PASSWORD\\",2055:\\"INVALID_REALM\\",2056:\\"STORAGE_ACL_ENTRY_IN_USE\\",2057:\\"DATA_MISSING\\",2058:\\"DUPLICATE\\",2059:\\"EVENTLOG_FROZEN\\",2060:\\"PKI_MISSING_KEYS\\",2061:\\"PKI_GENERATING_KEYS\\",2062:\\"INVALID_KEY\\",2063:\\"INVALID_CERT\\",2064:\\"CERT_KEY_NOT_MATCH\\",2065:\\"MAX_KERB_DOMAIN_REACHED\\",2066:\\"UNSUPPORTED\\",2067:\\"INVALID_PRIORITY\\",2068:\\"NOT_FOUND\\",2069:\\"INVALID_CREDENTIALS\\",2070:\\"INVALID_PASSPHRASE\\",2072:\\"NO_ASSOCIATION\\",2075:\\"AUDIT_FAIL\\",2076:\\"BLOCKING_COMPONENT\\",2081:\\"USER_CONSENT_REQUIRED\\",4096:\\"APP_INTERNAL_ERROR\\",4097:\\"NOT_INITIALIZED\\",4098:\\"LIB_VERSION_UNSUPPORTED\\",4099:\\"INVALID_PARAM\\",4100:\\"RESOURCES\\",4101:\\"HARDWARE_ACCESS_ERROR\\",4102:\\"REQUESTOR_NOT_REGISTERED\\",4103:\\"NETWORK_ERROR\\",4104:\\"PARAM_BUFFER_TOO_SHORT\\",4105:\\"COM_NOT_INITIALIZED_IN_THREAD\\",4106:\\"URL_REQUIRED\\"};J.GetMessageLog=function(S,T){J.AMT_MessageLog_PositionToFirstRecord(k,[S,T,[]])};function k(U,S,T,V,W){if(V!=200||T.Body.ReturnValue!=\\"0\\"){W[0](J,null,W[2],V);return}J.AMT_MessageLog_GetRecords(T.Body.IterationIdentifier,390,l,W)}function l(Z,W,Y,aa,ac){if(aa!=200||Y.Body.ReturnValue!=\\"0\\"){ac[0](J,null,ac[2],aa);return}var U,V,ae,T,S=ac[2],ab=new Date(),ad,X=Y.Body.RecordArray;if(typeof X===\\"string\\"){Y.Body.RecordArray=[Y.Body.RecordArray]}for(U in X){T=Buffer.from(X[U],\\"base64\\");if(T!=null){ad=M(T,0);if((ad>0)&&(ad<4294967295)){ae={DeviceAddress:T[4],EventSensorType:T[5],EventType:T[6],EventOffset:T[7],EventSourceType:T[8],EventSeverity:T[9],SensorNumber:T[10],Entity:T[11],EntityInstance:T[12],EventData:[],Time:new Date((ad+(ab.getTimezoneOffset()*60))*1000)};for(V=13;V<21;V++){ae.EventData.push(T[V])}ae.EntityStr=o[ae.Entity];ae.Desc=j(ae.EventSensorType,ae.EventOffset,ae.EventData,ae.Entity);if(!ae.EntityStr){ae.EntityStr=\\"Unknown\\"}S.push(ae)}}}if(Y.Body.NoMoreRecords!=true){J.AMT_MessageLog_GetRecords(Y.Body.IterationIdentifier,390,l,[ac[0],S,ac[2]])}else{ac[0](J,S,ac[2])}}var f=\\"Platform firmware (e.g. BIOS)|SMI handler|ISV system management software|Alert ASIC|IPMI|BIOS vendor|System board set vendor|System integrator|Third party add-in|OSV|NIC|System management card\\".split(\\"|\\");var p=\\"Unspecified.|No system memory is physically installed in the system.|No usable system memory, all installed memory has experienced an unrecoverable failure.|Unrecoverable hard-disk/ATAPI/IDE device failure.|Unrecoverable system-board failure.|Unrecoverable diskette subsystem failure.|Unrecoverable hard-disk controller failure.|Unrecoverable PS/2 or USB keyboard failure.|Removable boot media not found.|Unrecoverable video controller failure.|No video device detected.|Firmware (BIOS) ROM corruption detected.|CPU voltage mismatch (processors that share same supply have mismatched voltage requirements)|CPU speed matching failure\\".split(\\"|\\");var q=\\"Unspecified.|Memory initialization.|Starting hard-disk initialization and test|Secondary processor(s) initialization|User authentication|User-initiated system setup|USB resource configuration|PCI resource configuration|Option ROM initialization|Video initialization|Cache initialization|SM Bus initialization|Keyboard controller initialization|Embedded controller/management controller initialization|Docking station attachment|Enabling docking station|Docking station ejection|Disabling docking station|Calling operating system wake-up vector|Starting operating system boot process|Baseboard or motherboard initialization|reserved|Floppy initialization|Keyboard test|Pointing device test|Primary processor initialization\\".split(\\"|\\");var o=\\"Unspecified|Other|Unknown|Processor|Disk|Peripheral|System management module|System board|Memory module|Processor module|Power supply|Add in card|Front panel board|Back panel board|Power system board|Drive backplane|System internal expansion board|Other system board|Processor board|Power unit|Power module|Power management board|Chassis back panel board|System chassis|Sub chassis|Other chassis board|Disk drive bay|Peripheral bay|Device bay|Fan cooling|Cooling unit|Cable interconnect|Memory device|System management software|BIOS|Intel(r) ME|System bus|Group|Intel(r) ME|External environment|Battery|Processing blade|Connectivity switch|Processor/memory module|I/O module|Processor I/O module|Management controller firmware|IPMI channel|PCI bus|PCI express bus|SCSI bus|SATA/SAS bus|Processor front side bus\\".split(\\"|\\");J.RealmNames=\\"||Redirection|PT Administration|Hardware Asset|Remote Control|Storage|Event Manager|Storage Admin|Agent Presence Local|Agent Presence Remote|Circuit Breaker|Network Time|General Information|Firmware Update|EIT|LocalUN|Endpoint Access Control|Endpoint Access Control Admin|Event Log Reader|Audit Log|ACL Realm|||Local System\\".split(\\"|\\");J.WatchdogCurrentStates={1:\\"Not Started\\",2:\\"Stopped\\",4:\\"Running\\",8:\\"Expired\\",16:\\"Suspended\\"};function j(V,U,T,S){if(V==15){if(T[0]==235){return\\"Invalid Data\\"}if(U==0){return p[T[1]]}return q[T[1]]}if(V==18&&T[0]==170){return\\"Agent watchdog \\"+char2hex(T[4])+char2hex(T[3])+char2hex(T[2])+char2hex(T[1])+\\"-\\"+char2hex(T[6])+char2hex(T[5])+\\"-... changed to \\"+J.WatchdogCurrentStates[T[7]]}if(V==6){return\\"Authentication failed \\"+(T[1]+(T[2]<<8))+\\" times. The system may be under attack.\\"}if(V==30){return\\"No bootable media\\"}if(V==32){return\\"Operating system lockup or power interrupt\\"}if(V==35){return\\"System boot failure\\"}if(V==37){return\\"System firmware started (at least one CPU is properly executing).\\"}return\\"Unknown Sensor Type #\\"+V}var a={16:\\"Security Admin\\",17:\\"RCO\\",18:\\"Redirection Manager\\",19:\\"Firmware Update Manager\\",20:\\"Security Audit Log\\",21:\\"Network Time\\",22:\\"Network Administration\\",23:\\"Storage Administration\\",24:\\"Event Manager\\",25:\\"Circuit Breaker Manager\\",26:\\"Agent Presence Manager\\",27:\\"Wireless Configuration\\",28:\\"EAC\\",29:\\"KVM\\",30:\\"User Opt-In Events\\",32:\\"Screen Blanking\\",33:\\"Watchdog Events\\",1600:\\"Provisioning Started\\",1601:\\"Provisioning Completed\\",1602:\\"ACL Entry Added\\",1603:\\"ACL Entry Modified\\",1604:\\"ACL Entry Removed\\",1605:\\"ACL Access with Invalid Credentials\\",1606:\\"ACL Entry State\\",1607:\\"TLS State Changed\\",1608:\\"TLS Server Certificate Set\\",1609:\\"TLS Server Certificate Remove\\",1610:\\"TLS Trusted Root Certificate Added\\",1611:\\"TLS Trusted Root Certificate Removed\\",1612:\\"TLS Preshared Key Set\\",1613:\\"Kerberos Settings Modified\\",1614:\\"Kerberos Main Key Modified\\",1615:\\"Flash Wear out Counters Reset\\",1616:\\"Power Package Modified\\",1617:\\"Set Realm Authentication Mode\\",1618:\\"Upgrade Client to Admin Control Mode\\",1619:\\"Unprovisioning Started\\",1700:\\"Performed Power Up\\",1701:\\"Performed Power Down\\",1702:\\"Performed Power Cycle\\",1703:\\"Performed Reset\\",1704:\\"Set Boot Options\\",1800:\\"IDER Session Opened\\",1801:\\"IDER Session Closed\\",1802:\\"IDER Enabled\\",1803:\\"IDER Disabled\\",1804:\\"SoL Session Opened\\",1805:\\"SoL Session Closed\\",1806:\\"SoL Enabled\\",1807:\\"SoL Disabled\\",1808:\\"KVM Session Started\\",1809:\\"KVM Session Ended\\",1810:\\"KVM Enabled\\",1811:\\"KVM Disabled\\",1812:\\"VNC Password Failed 3 Times\\",1900:\\"Firmware Updated\\",1901:\\"Firmware Update Failed\\",2000:\\"Security Audit Log Cleared\\",2001:\\"Security Audit Policy Modified\\",2002:\\"Security Audit Log Disabled\\",2003:\\"Security Audit Log Enabled\\",2004:\\"Security Audit Log Exported\\",2005:\\"Security Audit Log Recovered\\",2100:\\"Intel(R) ME Time Set\\",2200:\\"TCPIP Parameters Set\\",2201:\\"Host Name Set\\",2202:\\"Domain Name Set\\",2203:\\"VLAN Parameters Set\\",2204:\\"Link Policy Set\\",2205:\\"IPv6 Parameters Set\\",2300:\\"Global Storage Attributes Set\\",2301:\\"Storage EACL Modified\\",2302:\\"Storage FPACL Modified\\",2303:\\"Storage Write Operation\\",2400:\\"Alert Subscribed\\",2401:\\"Alert Unsubscribed\\",2402:\\"Event Log Cleared\\",2403:\\"Event Log Frozen\\",2500:\\"CB Filter Added\\",2501:\\"CB Filter Removed\\",2502:\\"CB Policy Added\\",2503:\\"CB Policy Removed\\",2504:\\"CB Default Policy Set\\",2505:\\"CB Heuristics Option Set\\",2506:\\"CB Heuristics State Cleared\\",2600:\\"Agent Watchdog Added\\",2601:\\"Agent Watchdog Removed\\",2602:\\"Agent Watchdog Action Set\\",2700:\\"Wireless Profile Added\\",2701:\\"Wireless Profile Removed\\",2702:\\"Wireless Profile Updated\\",2800:\\"EAC Posture Signer SET\\",2801:\\"EAC Enabled\\",2802:\\"EAC Disabled\\",2803:\\"EAC Posture State\\",2804:\\"EAC Set Options\\",2900:\\"KVM Opt-in Enabled\\",2901:\\"KVM Opt-in Disabled\\",2902:\\"KVM Password Changed\\",2903:\\"KVM Consent Succeeded\\",2904:\\"KVM Consent Failed\\",3000:\\"Opt-In Policy Change\\",3001:\\"Send Consent Code Event\\",3002:\\"Start Opt-In Blocked Event\\"};J.GetAuditLogExtendedDataStr=function(T,S){if((T==1602||T==1604)&&S[0]==0){return w(S).splice(2,2+S[1]).toString()}if(T==1603){if(S[1]==0){return w(S).splice(3).toString()}return null}if(T==1605){return[\\"Invalid ME access\\",\\"Invalid MEBx access\\"][S[0]]}if(T==1606){var U=[\\"Disabled\\",\\"Enabled\\"][S[0]];if(S[1]==0){U+=\\", \\"+S[3]}return U}if(T==1607){return\\"Remote \\"+[\\"NoAuth\\",\\"ServerAuth\\",\\"MutualAuth\\"][S[0]]+\\", Local \\"+[\\"NoAuth\\",\\"ServerAuth\\",\\"MutualAuth\\"][S[1]]}if(T==1617){return J.RealmNames[L(S,0)]+\\", \\"+[\\"NoAuth\\",\\"Auth\\",\\"Disabled\\"][S[4]]}if(T==1619){return[\\"BIOS\\",\\"MEBx\\",\\"Local MEI\\",\\"Local WSMAN\\",\\"Remote WSAMN\\"][S[0]]}if(T==1900){return\\"From \\"+N(S,0)+\\".\\"+N(S,2)+\\".\\"+N(S,4)+\\".\\"+N(S,6)+\\" to \\"+N(S,8)+\\".\\"+N(S,10)+\\".\\"+N(S,12)+\\".\\"+N(S,14)}if(T==2100){var V=new Date();V.setTime(L(S,0)*1000+(new Date().getTimezoneOffset()*60000));return V.toLocaleString()}if(T==3000){return\\"From \\"+[\\"None\\",\\"KVM\\",\\"All\\"][S[0]]+\\" to \\"+[\\"None\\",\\"KVM\\",\\"All\\"][S[1]]}if(T==3001){return[\\"Success\\",\\"Failed 3 times\\"][S[0]]}return null};J.GetAuditLog=function(S){J.AMT_AuditLog_ReadRecords(1,i,[S,[]])};function I(S){if(!S||S==null||typeof S==\\"object\\"){return S}return[S]}function N(T,S){return(T[S]<<8)+T[S+1]}function L(T,S){return(T[S]*16777216)+(T[S+1]<<16)+(T[S+2]<<8)+T[S+3]}function M(T,S){return(T[S+3]*16777216)+(T[S+2]<<16)+(T[S+1]<<8)+T[S]}function v(S){return Buffer.from(S).toString(\\"base64\\")}function u(T){var U=null;try{U=Buffer.from(T,\\"base64\\").toString()}catch(S){console.log(S)}return U}function w(S){var U=[];for(var T in S){U.push(S[T])}return U}function i(ab,W,aa,ac,ae){if(ac!=200){ae[0](J,[],ac);return}var Y,V,S,ah,Z=ae[1],ad=new Date(),af;if(aa.Body.RecordsReturned>0){aa.Body.EventRecords=I(aa.Body.EventRecords);for(V in aa.Body.EventRecords){S=null;try{S=Buffer.from(aa.Body.EventRecords[V],\\"base64\\")}catch(T){console.log(T+\\" \\"+aa.Body.EventRecords[V])}ah={AuditAppID:N(S,0),EventID:N(S,2),InitiatorType:S[4]};ah.AuditApp=a[ah.AuditAppID];ah.Event=a[(ah.AuditAppID*100)+ah.EventID];if(!ah.Event){ah.Event=\\"#\\"+ah.EventID}if(ah.InitiatorType==0){var ag=S[5];ah.Initiator=S.slice(6,6+ag).toString();Y=6+ag}if(ah.InitiatorType==1){ah.KerberosUserInDomain=L(S,5);var ag=S[9];ah.Initiator=G(S.slice(10,10+ag));Y=10+ag}if(ah.InitiatorType==2){ah.Initiator=\\"Local\\";Y=5}if(ah.InitiatorType==3){ah.Initiator=\\"KVM Default Port\\";Y=5}af=L(S,Y);ah.Time=new Date((af+(ad.getTimezoneOffset()*60))*1000);Y+=4;ah.MCLocationType=S[Y++];var X=S[Y++];ah.NetAddress=S.slice(Y,Y+X).toString();Y+=X;var U=S[Y++];ah.Ex=S.slice(Y,Y+U);ah.ExStr=J.GetAuditLogExtendedDataStr((ah.AuditAppID*100)+ah.EventID,ah.Ex);Z.push(ah)}}if(aa.Body.TotalRecordCount>Z.length){J.AMT_AuditLog_ReadRecords(Z.length+1,i,[ae[0],Z])}else{ae[0](J,Z,ac)}}function C(U){if(U===undefined||U===null){return null}var V=\\"\\";for(var T in U){var S=U[T];if(!S){continue}if(S.__parameterType===\\"reference\\"){V+=O(T,S)}else{V+=H(T,S)}}return V}function H(V,U){if(U===undefined||U===null){return null}var T=!!U.__namespace;var Z=T?\\"\\";for(var X in U){if(!U.hasOwnProperty(X)||X.indexOf(\\"__\\")===0){continue}if(typeof U[X]===\\"function\\"||Array.isArray(U[X])){continue}if(typeof U[X]===\\"object\\"){console.error(\\"only convert one level down...\\")}else{Y+=Z+X+\\">\\"+U[X].toString()+S+X+\\">\\"}}Y+=\\"\\";return Y}function O(T,S){if(S===undefined||S===null){return null}var U=\\"/wsman\\"+S.__resourceUri+\\"\\";for(var V in S){if(!S.hasOwnProperty(V)||V.indexOf(\\"__\\")===0){continue}if(typeof S[V]===\\"function\\"||typeof S[V]===\\"object\\"||Array.isArray(S[V])){continue}U+=\\\'\\\'+S[V].toString()+\\"\\"}U+=\\"\\";return U}function G(U){var T=\\"S-\\"+U.charCodeAt(0)+\\"-\\"+U.charCodeAt(7);for(var S=2;S<(U.length/4);S++){T+=\\"-\\"+M(U,S*4)}return T}function F(V){if(!V||V==null){return null}var U=V.split(\\"-\\");if(U.length<4||(U[0]!=\\"s\\"&&U[0]!=\\"S\\")){return null}for(var S=1;S0?this[this.length-1]:undefined)}})}catch(e){}try{Object.defineProperty(String.prototype,\\"replaceAll\\",{value:function replaceAll(b,a){return(this.split(b).join(a))}})}catch(e){}var RSMB=1381190978;var memoryLocation={1:\\"Other\\",2:\\"Unknown\\",3:\\"System Board\\",4:\\"ISA\\",5:\\"EISA\\",6:\\"PCI\\",7:\\"MCA\\",8:\\"PCMCIA\\",9:\\"Proprietary\\",10:\\"NuBus\\",160:\\"PC-98/C20\\",161:\\"PC-98/C24\\",162:\\"PC-98/E\\",163:\\"PC-98/LB\\"};var wakeReason=[\\"Reserved\\",\\"Other\\",\\"Unknown\\",\\"APM Timer\\",\\"Modem Ring\\",\\"LAN\\",\\"Power Switch\\",\\"PCI\\",\\"AC Power\\"];function zeroLeftPad(c,b){if((b==null)&&(typeof(b)!=\\"number\\")){return null}if(c==null){c=\\"\\"}var d=\\"\\";for(var a=0;a1){var r=v[1].split(\\"\\\\x0A\\\\x0A\\")[0].split(\\"\\\\x0A\\");var s=[];for(var t in r){var u=r[t].trim().replaceAll(\\" \\",\\"\\").replaceAll(\\"\\\\x09\\",\\"\\");if(!(u[0]==\\\'\\"\\\')){s.push(u)}}p.write(Buffer.from(s.join(\\"\\"),\\"hex\\"));p.write(Buffer.from(\\"00\\",\\"hex\\"))}else{p.write(Buffer.from(\\"0000\\",\\"hex\\"))}}var q=p.buffer;q.ms=p;return(q)}}this._parse=function b(o){var n={};var m;var l=0;var o;var s=0;while(o&&l0){var n=l[4].pop();var o=n[20]&64;var s=n[20]&7;if(o){var m={_ObjectID:\\"SMBiosTables.processorInfo\\"};m.Processor=q[n[1]];m.MaxSpeed=n.readUInt16LE(16)+\\" Mhz\\";if(n[31]){m.Cores=n[31]}if(n[33]){m.Threads=n[33]}m.Populated=1;m.Status=t[s];m.Socket=n._strings[n[0]-1];m.Manufacturer=n._strings[n[3]-1];m.Version=n._strings[n[12]-1];r.push(m)}}return(r)};this.memoryInfo=function f(k){if(!k){throw (\\"no data\\")}var n={_ObjectID:\\"SMBiosTables.memoryInfo\\"};if(k[16]){var l=k[16].peek();n.location=memoryLocation[l[0]];if((n.maxCapacityKb=l.readUInt32LE(3))==2147483648){n.maxCapacityKb=\\"A really big number\\"}}return(n)};this.systemInfo=function i(k){if(!k){throw (\\"no data\\")}var l={_ObjectID:\\"SMBiosTables.systemInfo\\"};if(k[1]){var m=k[1].peek();var n=m.slice(4,20);l.uuid=[zeroLeftPad(n.readUInt32LE(0).toString(16),8),zeroLeftPad(n.readUInt16LE(4).toString(16),4),zeroLeftPad(n.readUInt16LE(6).toString(16),4),zeroLeftPad(n.readUInt16BE(8).toString(16),4),zeroLeftPad(n.slice(10).toString(\\"hex\\").toLowerCase(),12)].join(\\"-\\");l.wakeReason=wakeReason[m[20]]}return(l)};this.systemSlots=function j(k){if(!k){throw (\\"no data\\")}var l=[];if(k[9]){while(k[9].length>0){var m=k[9].pop();l.push({name:m._strings[m[0]-1]})}}return(l)};this.amtInfo=function c(l){if(!l){throw (\\"no data\\")}var n={AMT:false};if(l[130]&&l[130].peek().slice(0,4).toString()==\\"$AMT\\"){var k=l[130].peek();n.AMT=k[4]?true:false;if(n.AMT){n.enabled=k[5]?true:false;n.storageRedirection=k[6]?true:false;n.serialOverLan=k[7]?true:false;n.kvm=k[14]?true:false;if(l[131].peek()&&l[131].peek().slice(52,56).toString()==\\"vPro\\"){var o=l[131].peek();if(o[0]&4){n.TXT=(o[0]&8)?true:false}if(o[0]&16){n.VMX=(o[0]&32)?true:false}n.MEBX=o.readUInt16LE(4).toString()+\\".\\"+o.readUInt16LE(6).toString()+\\".\\"+o.readUInt16LE(8).toString()+\\".\\"+o.readUInt16LE(10).toString();var m=o.slice(20,32);n.ManagementEngine=m.readUInt16LE(6).toString()+\\".\\"+m.readUInt16LE(4).toString()+\\".\\"+m.readUInt16LE(10).toString()+\\".\\"+m.readUInt16LE(8).toString()}}}return(n)};this.smTableTypes={0:\\"BIOS information\\",1:\\"System information\\",2:\\"Baseboard (or Module) information\\",4:\\"Processor information\\",5:\\"memory controller information\\",6:\\"Memory module information\\",7:\\"Cache information\\",8:\\"Port connector information\\",9:\\"System slots\\",10:\\"On board devices information\\",11:\\"OEM strings\\",12:\\"System configuration options\\",13:\\"BIOS language information\\",14:\\"Group associations\\",15:\\"System event log\\",16:\\"Physical memory array\\",17:\\"Memory device\\",18:\\"32bit memory error information\\",19:\\"Memory array mapped address\\",20:\\"Memory device mapped address\\",21:\\"Built-in pointing device\\",22:\\"Portable battery\\",23:\\"System reset\\",24:\\"Hardware security\\",25:\\"System power controls\\",26:\\"Voltage probe\\",27:\\"Cooling device\\",28:\\"Temperature probe\\",29:\\"Electrical current probe\\",30:\\"Out-of-band remote access\\",31:\\"Boot integrity services (BIS) entry point\\",32:\\"System boot information\\",33:\\"64bit memory error information\\",34:\\"Management device\\",35:\\"Management device component\\",36:\\"Management device threshold data\\",37:\\"Memory channel\\",38:\\"IPMI device information\\",39:\\"System power supply\\",40:\\"Additional information\\",41:\\"Onboard devices extended information\\",42:\\"Management controller host interface\\",126:\\"Inactive\\",127:\\"End-of-table\\"}}module.exports=new SMBiosTables();"); addedModules.push("smbios"); } catch (e) { }\r\ntry { addModule("sysinfo", "var PDH_FMT_LONG=256;var PDH_FMT_DOUBLE=512;var promise=require(\\"promise\\");if(process.platform==\\"win32\\"){var GM=require(\\"_GenericMarshal\\");GM.kernel32=GM.CreateNativeProxy(\\"kernel32.dll\\");GM.kernel32.CreateMethod(\\"GlobalMemoryStatusEx\\");GM.pdh=GM.CreateNativeProxy(\\"pdh.dll\\");GM.pdh.CreateMethod(\\"PdhAddEnglishCounterA\\");GM.pdh.CreateMethod(\\"PdhCloseQuery\\");GM.pdh.CreateMethod(\\"PdhCollectQueryData\\");GM.pdh.CreateMethod(\\"PdhGetFormattedCounterValue\\");GM.pdh.CreateMethod(\\"PdhGetFormattedCounterArrayA\\");GM.pdh.CreateMethod(\\"PdhOpenQueryA\\");GM.pdh.CreateMethod(\\"PdhRemoveCounter\\")}function windows_cpuUtilization(){var b=new promise(function(d,c){this._res=d;this._rej=c});b.counter=GM.CreateVariable(16);b.cpu=GM.CreatePointer();b.cpuTotal=GM.CreatePointer();var a=0;if((a=GM.pdh.PdhOpenQueryA(0,0,b.cpu).Val)!=0){b._rej(a);return}if((a=GM.pdh.PdhAddEnglishCounterA(b.cpu.Deref(),GM.CreateVariable(\\"\\\\\\\\Processor(*)\\\\\\\\% Processor Time\\"),0,b.cpuTotal).Val)!=0){b._rej(a);return}if((a=GM.pdh.PdhCollectQueryData(b.cpu.Deref()).Val!=0)){b._rej(a);return}b._timeout=setTimeout(function(k){var m={cpus:[]};var d=GM.CreateVariable(4);var j=GM.CreateVariable(4);var c,l,h;var f;if((f=GM.pdh.PdhCollectQueryData(k.cpu.Deref()).Val!=0)){k._rej(f);return}if((f=GM.pdh.PdhGetFormattedCounterArrayA(k.cpuTotal.Deref(),PDH_FMT_DOUBLE,d,j,0).Val)==-2147481646){c=GM.CreateVariable(d.toBuffer().readUInt32LE())}else{k._rej(f);return}if((f=GM.pdh.PdhGetFormattedCounterArrayA(k.cpuTotal.Deref(),PDH_FMT_DOUBLE,d,j,c).Val)!=0){k._rej(f);return}for(var g=0;g0){var f=c[0].split(\\":\\")[1];var a=f.split(\\",\\");var e=parseFloat(a[0].split(\\"%\\")[0].trim())+parseFloat(a[1].split(\\"%\\")[0].trim());d._res({total:e,cpus:[]})}else{d._rej(\\"parse error\\")}return(d)}function macos_memUtilization(){var d={};var e=new promise(function(h,g){this._res=h;this._rej=g});var b=require(\\"child_process\\").execFile(\\"/bin/sh\\",[\\"sh\\"]);b.stdout.str=\\"\\";b.stdout.on(\\"data\\",function(g){this.str+=g.toString()});b.stdin.write(\\\'top -l 1 | grep -E \\"^Phys\\"\\\\nexit\\\\n\\\');b.waitExit();var c=b.stdout.str.split(\\"\\\\n\\");if(c[0].length>0){var f=c[0].split(\\":\\")[1];var a=f.split(\\",\\");d.MemTotal=parseInt(a[0].trim().split(\\" \\")[0]);d.MemFree=parseInt(a[1].trim().split(\\" \\")[0]);d.percentFree=((d.MemFree/d.MemTotal)*100);d.percentConsumed=(((d.MemTotal-d.MemFree)/d.MemTotal)*100);return(d)}else{throw (\\"Parse Error\\")}}function windows_thermals(){var c=[];child=require(\\"child_process\\").execFile(process.env.windir+\\"\\\\\\\\System32\\\\\\\\wbem\\\\\\\\wmic.exe\\",[\\"wmic\\",\\"/namespace:\\\\\\\\\\\\\\\\root\\\\\\\\wmi\\",\\"PATH\\",\\"MSAcpi_ThermalZoneTemperature\\",\\"get\\",\\"CurrentTemperature\\"]);child.stdout.str=\\"\\";child.stdout.on(\\"data\\",function(d){this.str+=d.toString()});child.stderr.str=\\"\\";child.stderr.on(\\"data\\",function(d){this.str+=d.toString()});child.waitExit();if(child.stdout.str.trim!=\\"\\"){var b=child.stdout.str.trim().split(\\"\\\\r\\\\n\\");for(var a=1;a1){b.push(f[e].split(\\" \\")[3]);this.parent.kill()}}});a.stderr.str=\\"\\";a.stderr.on(\\"data\\",function(d){this.str+=d.toString()});a.stdin.write(\\"powermetrics -s smc\\\\n\\");a.waitExit(5000)}return(b)}switch(process.platform){case\\"linux\\":module.exports={cpuUtilization:linux_cpuUtilization,memUtilization:linux_memUtilization,thermals:linux_thermals};break;case\\"win32\\":module.exports={cpuUtilization:windows_cpuUtilization,memUtilization:windows_memUtilization,thermals:windows_thermals};break;case\\"darwin\\":module.exports={cpuUtilization:macos_cpuUtilization,memUtilization:macos_memUtilization,thermals:macos_thermals};break};"); addedModules.push("sysinfo"); } catch (e) { }\r\ntry { addModule("win-securitycenter", "var seccenter=null;var WSC_SECURITY_PROVIDER_FIREWALL=1;var WSC_SECURITY_PROVIDER_AUTOUPDATE_SETTINGS=2;var WSC_SECURITY_PROVIDER_ANTIVIRUS=4;var WSC_SECURITY_PROVIDER_ANTISPYWARE=8;var WSC_SECURITY_PROVIDER_HEALTH_GOOD=0;var WSC_SECURITY_PROVIDER_HEALTH_NOTMONITORED=1;var WSC_SECURITY_PROVIDER_HEALTH_POOR=2;var WSC_SECURITY_PROVIDER_HEALTH_SNOOZE=3;try{seccenter=require(\\"_GenericMarshal\\").CreateNativeProxy(\\"Wscapi.dll\\");seccenter.CreateMethod(\\"WscGetSecurityProviderHealth\\");seccenter.CreateMethod(\\"WscRegisterForChanges\\");seccenter.CreateMethod(\\"WscUnRegisterChanges\\")}catch(e){}function statusString(b){var a=\\"UNKNOWN\\";switch(b){case 0:a=\\"OK\\";break;case 1:case 3:a=\\"WARNING\\";break;case 2:a=\\"PROBLEM\\";break;default:a=\\"UNKNOWN\\";break}return(a)}function getStatus(){var a={firewall:\\"UNKNOWN\\",antiVirus:\\"UNKNOWN\\",autoUpdate:\\"UNKNOWN\\"};if(seccenter!=null){var b=require(\\"_GenericMarshal\\").CreateVariable(4);if(seccenter.WscGetSecurityProviderHealth(WSC_SECURITY_PROVIDER_FIREWALL,b).Val==0){a.firewall=statusString(b.toBuffer().readUInt32LE())}if(seccenter.WscGetSecurityProviderHealth(WSC_SECURITY_PROVIDER_ANTIVIRUS,b).Val==0){a.antiVirus=statusString(b.toBuffer().readUInt32LE())}if(seccenter.WscGetSecurityProviderHealth(WSC_SECURITY_PROVIDER_AUTOUPDATE_SETTINGS,b).Val==0){a.autoUpdate=statusString(b.toBuffer().readUInt32LE())}}return(a)}if(process.platform==\\"win32\\"&&seccenter!=null){var j={status:getStatus};require(\\"events\\").EventEmitter.call(j,true).createEvent(\\"changed\\");j._H=require(\\"_GenericMarshal\\").CreatePointer();j._EV=require(\\"_GenericMarshal\\").GetGenericGlobalCallback(1);j._EV.parent=j;j._EV.on(\\"GlobalCallback\\",function(a){if(!this.ObjectToPtr_Verify(this.parent,a)){return}this.parent.emit(\\"changed\\")});j.on(\\"~\\",function(){if(seccenter.WscUnRegisterChanges(this._H).Val==0){}});if(seccenter.WscRegisterForChanges(0,j._H,j._EV,require(\\"_GenericMarshal\\").ObjectToPtr(j)).Val==0){j._H=j._H.Deref()}module.exports=j}else{throw (\\"win-securitycenter not supported on this platform\\")};"); addedModules.push("win-securitycenter"); } catch (e) { }\r\n/*\r\nCopyright 2018-2021 Intel Corporation\r\n\r\nLicensed under the Apache License, Version 2.0 (the "License");\r\nyou may not use this file except in compliance with the License.\r\nYou may obtain a copy of the License at\r\n\r\n http://www.apache.org/licenses/LICENSE-2.0\r\n\r\nUnless required by applicable law or agreed to in writing, software\r\ndistributed under the License is distributed on an "AS IS" BASIS,\r\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\nSee the License for the specific language governing permissions and\r\nlimitations under the License.\r\n*/\r\n\r\n/** \r\n* @description MeshCmd, command line tool for Intel AMT and MeshCentral.\r\n* @author Ylian Saint-Hilaire\r\n* @version v0.2.0\r\n*/\r\n\r\n// Debug Stuff\r\n//console.displayFinalizerMessages = 1; // Display objects that have event listeners that are disposed.\r\n//console.displayStreamPipeMessages = 1; // Display stream pipe and un-pipes\r\n//var __gc = setInterval(function () { console.log(\'GC\'); _debugGC() }, 2000); //\r\n\r\n\r\nvar fs = require(\'fs\');\r\nvar os = require(\'os\');\r\nvar net = require(\'net\');\r\nvar http = require(\'http\');\r\nvar dgram = require(\'dgram\');\r\nvar httpHeaders = require(\'http-headers\');\r\nvar tcpserver = null;\r\nvar broadcastSockets = {};\r\nvar multicastSockets = {};\r\nvar discoveryInterval = null;\r\nvar membershipIPv4 = \'239.255.255.235\';\r\nvar membershipIPv6 = \'FF02:0:0:0:0:0:0:FE\';\r\nvar settings = null;\r\nvar meshCmdVersion = \'0.8.27\'; // Dynamically replaced with MeshCentral version\r\nvar amtLms = null, amtMei = null, amtMeiState = null;\r\nvar wsstack = null, amtstack = null;\r\nvar oswsstack = null, osamtstack = null;\r\nvar amtMeiTmpState = null;\r\nvar SMBiosTables = null;\r\nvar globalDebugFlags = 0; // 1 = IDER Debug\r\nvar pendingAmtConfigActions = 0;\r\nvar RCSMessageProtocolVersion = 1; // RCS Message Protocol Version. Needs to be less than or equal to RCS server Message Protocol Version\r\n\r\n// MeshCommander for Firmware (GZIP\'ed, Base64) v0.9.0\r\nvar Large_IntelAmtWebApp_etag = "qHjwXzQEHWk8mJCt1CwV";\r\nvar Large_IntelAmtWebApp = "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";\r\nvar Medium_IntelAmtWebApp_etag = "51CThbgkPiwQuw450CTF";\r\nvar Medium_IntelAmtWebApp = "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";\r\nvar Small_IntelAmtWebApp_etag = "KsmoOoCcT5qSSljY6Nv3";\r\nvar Small_IntelAmtWebApp = "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";\r\n\r\n// MeshCommander LMS (GZIP\'ed, Base64) v0.9.0\r\nvar _IntelAmtWebApp_etag = "A2rEfbOagx5Xc9AV3Gmm";\r\nvar _IntelAmtWebApp = "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";\r\n\r\n// MeshCommander Local (GZIP\'ed, Base64) v0.8.3\r\nvar FullSite_IntelAmtLocalWebApp_etag = "xVzv3zwu7TbauOUKmy3r";\r\nvar FullSite_IntelAmtLocalWebApp = "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";\r\n\r\n// Check the server certificate fingerprint\r\nfunction onVerifyServer(clientName, certs) {\r\n if (certs == null) { certs = clientName; } // Temporary thing until we fix duktape\r\n\r\n // If we have the serverid, used delayed server authentication\r\n if (settings.serverid != null) { settings.meshServerTlsHash = certs[certs.length - 1].fingerprint.replace(/:/g, \'\'); return; }\r\n\r\n // Otherwise, use server HTTPS certificate hash\r\n try { for (var i in certs) { if (certs[i].fingerprint.replace(/:/g, \'\') == settings.serverhttpshash) { return; } } } catch (e) { }\r\n if (settings.serverhttpshash != null) {\r\n console.log(\'Error: Failed to verify server certificate.\');\r\n console.log(\'Server TLS hash: \' + certs[i].fingerprint.replace(/:/g, \'\'));\r\n exit(255);\r\n throw \'Invalid server certificate\';\r\n }\r\n}\r\n\r\n// Various utility functions\r\nfunction debug(level, message) { if ((settings.debuglevel != null) && (settings.debuglevel >= level)) { console.log(message); } }\r\nfunction exit(status) { if (status == null) { status = 0; } try { process.exit(status); } catch (e) { } }\r\nfunction getInstance(x, y) { for (var i in x) { if (x[i]["InstanceID"] == y) return x[i]; } return null; }\r\nfunction md5hex(str) { return require(\'MD5Stream\').create().syncHash(str).toString(\'hex\'); }\r\nfunction guidToStr(g) { return g.substring(6, 8) + g.substring(4, 6) + g.substring(2, 4) + g.substring(0, 2) + "-" + g.substring(10, 12) + g.substring(8, 10) + "-" + g.substring(14, 16) + g.substring(12, 14) + "-" + g.substring(16, 20) + "-" + g.substring(20); }\r\nfunction parceArguments(argv) { var r = {}; for (var i in argv) { i = parseInt(i); if (argv[i].startsWith(\'--\') == true) { var key = argv[i].substring(2).toLowerCase(), val = true; if (((i + 1) < argv.length) && (argv[i + 1].startsWith(\'--\') == false)) { val = argv[i + 1]; } r[key] = val; } } return r; }\r\n\r\n// Convert an object to string with all functions\r\nfunction objToString(x, p, ret) {\r\n if (ret == undefined) ret = \'\';\r\n if (p == undefined) p = 0;\r\n if (x == null) { return \'[null]\'; }\r\n if (p > 8) { return \'[...]\'; }\r\n if (x == undefined) { return \'[undefined]\'; }\r\n if (typeof x == \'string\') { if (p == 0) return x; return \'"\' + (x.split(\'\\0\')[0]) + \'"\'; }\r\n if (typeof x == \'buffer\') { return \'[buffer]\'; }\r\n if (typeof x != \'object\') { return x; }\r\n var r = \'{\' + (ret ? \'\\r\\n\' : \' \');\r\n for (var i in x) {\r\n if (i != \'_ObjectID\') { r += (addPad(p + 2, ret) + i + \': \' + objToString(x[i], p + 2, ret) + (ret ? \'\\r\\n\' : \' \')); }\r\n }\r\n return r + addPad(p, ret) + \'}\';\r\n}\r\n\r\n// Return p number of spaces \r\nfunction addPad(p, ret) { var r = \'\'; for (var i = 0; i < p; i++) { r += \' \'; } return r; }\r\n\r\n// Parse the incoming arguments\r\nfunction run(argv) {\r\n if (meshCmdVersion[0] == \'*\') { meshCmdVersion = \'\'; } else { meshCmdVersion = \' v\' + meshCmdVersion; }\r\n var args = parceArguments(argv);\r\n //console.log(JSON.stringify(argv));\r\n //console.log(\'addedModules = \' + JSON.stringify(addedModules));\r\n var actionpath = \'meshaction.txt\';\r\n if (args.actionfile != null) { actionpath = args.actionfile; }\r\n var actions = [\'HELP\', \'ROUTE\', \'MICROLMS\', \'AMTCONFIG\', \'AMTSCAN\', \'AMTPOWER\', \'AMTFEATURES\', \'AMTNETWORK\', \'AMTLOADWEBAPP\', \'AMTLOADSMALLWEBAPP\', \'AMTLOADLARGEWEBAPP\', \'AMTCLEARWEBAPP\', \'AMTSTORAGESTATE\', \'AMTINFO\', \'AMTINFODEBUG\', \'AMTVERSIONS\', \'AMTHASHES\', \'AMTSAVESTATE\', \'AMTUUID\', \'AMTCCM\', \'AMTDEACTIVATE\', \'AMTACMDEACTIVATE\', \'SMBIOS\', \'RAWSMBIOS\', \'MESHCOMMANDER\', \'AMTAUDITLOG\', \'AMTEVENTLOG\', \'AMTPRESENCE\', \'AMTWIFI\', \'AMTWAKE\', \'AMTSTARTCONFIG\', \'AMTSTOPCONFIG\'];\r\n\r\n // Load the action file\r\n var actionfile = null;\r\n try { actionfile = fs.readFileSync(actionpath); } catch (e) { }\r\n if ((actionpath != \'meshaction.txt\') && (actionfile == null)) { console.log(\'Unable to load \\"\' + actionpath + \'\\". Create this file or specify the location using --actionfile [filename].\'); exit(1); return; }\r\n if (actionfile != null) { try { settings = JSON.parse(actionfile); } catch (e) { console.log(actionpath, e); exit(1); return; } } else { if (argv.length >= 2) { settings = { action: argv[1] } } }\r\n if (settings == null) { settings = {}; }\r\n var settings2 = {}; for (var i in settings) { settings2[i.toLowerCase()] = settings[i]; } settings = settings2;\r\n\r\n // Set the arguments\r\n if ((typeof args.action) == \'string\') { settings.action = args.action; }\r\n if ((typeof args.authcookie) == \'string\') { settings.authcookie = args.authcookie; }\r\n if ((typeof args.localport) == \'string\') { settings.localport = parseInt(args.localport); }\r\n if ((typeof args.remotenodeid) == \'string\') { settings.remotenodeid = args.remotenodeid; }\r\n if ((typeof args.name) == \'string\') { settings.name = args.name; }\r\n if ((typeof args.id) == \'string\') { settings.id = args.id; }\r\n if ((typeof args.username) == \'string\') { settings.username = args.username; }\r\n if ((typeof args.password) == \'string\') { settings.password = args.password; }\r\n if ((typeof args.url) == \'string\') { settings.url = args.url; }\r\n if ((typeof args.type) == \'string\') { settings.type = args.type; }\r\n if ((typeof args.user) == \'string\') { settings.username = args.user; }\r\n if ((typeof args.pass) == \'string\') { settings.password = args.pass; }\r\n if ((typeof args.host) == \'string\') { settings.hostname = args.host; }\r\n if ((typeof args.hostname) == \'string\') { settings.hostname = args.hostname; }\r\n if ((typeof args.serverid) == \'string\') { settings.serverid = args.serverid; }\r\n if ((typeof args.serverhttpshash) == \'string\') { settings.serverhttpshash = args.serverhttpshash; }\r\n if ((typeof args.serverurl) == \'string\') { settings.serverurl = args.serverurl; }\r\n if ((typeof args.remoteport) == \'string\') { settings.remoteport = parseInt(args.remoteport); }\r\n if ((typeof args.remotetarget) == \'string\') { settings.remotetarget = args.remotetarget; }\r\n if ((typeof args.out) == \'string\') { settings.output = args.out; }\r\n if ((typeof args.output) == \'string\') { settings.output = args.output; }\r\n if ((typeof args.debug) == \'string\') { settings.debuglevel = parseInt(args.debug); }\r\n if ((typeof args.debugflags) == \'string\') { globalDebugFlags = parseInt(args.debugflags); }\r\n if ((typeof args.script) == \'string\') { settings.script = args.script; }\r\n if ((typeof args.agent) == \'string\') { settings.agent = args.agent; }\r\n if ((typeof args.proxy) == \'string\') { settings.proxy = args.proxy; }\r\n if ((typeof args.floppy) == \'string\') { settings.floppy = args.floppy; }\r\n if ((typeof args.cdrom) == \'string\') { settings.cdrom = args.cdrom; }\r\n if ((typeof args.tag) == \'string\') { settings.tag = args.tag; }\r\n if ((typeof args.scan) == \'string\') { settings.scan = args.scan; }\r\n if ((typeof args.token) == \'string\') { settings.token = args.token; }\r\n if ((typeof args.timeout) == \'string\') { settings.timeout = parseInt(args.timeout); }\r\n if ((typeof args.uuidoutput) == \'string\' || args.uuidoutput) { settings.uuidoutput = args.uuidoutput; }\r\n if ((typeof args.desc) == \'string\') { settings.desc = args.desc; }\r\n if (args.emailtoken) { settings.emailtoken = true; }\r\n if (args.smstoken) { settings.smstoken = true; }\r\n if (args.debug === true) { settings.debuglevel = 1; }\r\n if (args.debug) { try { waitForDebugger(); } catch (e) { } }\r\n if (args.noconsole) { settings.noconsole = true; }\r\n if (args.nocommander) { settings.noconsole = true; }\r\n if (args.lmsdebug) { settings.lmsdebug = true; }\r\n if (args.json) { settings.json = true; }\r\n if (args.tls) { settings.tls = true; }\r\n if ((argv.length > 1) && (actions.indexOf(argv[1].toUpperCase()) >= 0)) { settings.action = argv[1]; }\r\n\r\n // Validate meshaction.txt\r\n if (settings.action == null) {\r\n console.log(\'MeshCentral Command (MeshCmd) \' + meshCmdVersion);\r\n console.log(\'No action specified, use MeshCmd like this:\\r\\n\');\r\n console.log(\' meshcmd [action] [arguments...]\\r\\n\');\r\n console.log(\'Valid MeshCentral actions:\');\r\n console.log(\' Route - Map a local TCP port to a remote computer.\');\r\n console.log(\' AmtConfig - Setup Intel AMT on this computer.\');\r\n console.log(\'\\r\\nValid local actions:\');\r\n console.log(\' SMBios - Display System Management BIOS tables for this computer.\');\r\n console.log(\' RawSMBios - Display RAW System Management BIOS tables for this computer.\');\r\n console.log(\' MicroLMS - Run MicroLMS, allowing local access to Intel AMT.\');\r\n console.log(\' AmtInfo - Show Intel AMT version and activation state.\');\r\n console.log(\' AmtVersions - Show all Intel ME version information.\');\r\n console.log(\' AmtHashes - Show all Intel AMT trusted activation hashes.\');\r\n console.log(\' AmtCCM - Activate Intel AMT into Client Control Mode.\');\r\n console.log(\' AmtDeactivate - Deactivate Intel AMT if activated in Client Control mode.\');\r\n console.log(\' AmtAcmDeactivate - Deactivate Intel AMT if activated in Admin Control mode.\');\r\n console.log(\'\\r\\nValid local or remote actions:\');\r\n console.log(\' MeshCommander - Launch a local MeshCommander web server.\');\r\n console.log(\' AmtUUID - Show Intel AMT unique identifier.\');\r\n console.log(\' AmtEventLog - Show the Intel AMT event log.\');\r\n console.log(\' AmtAuditLog - Show the Intel AMT audit log.\');\r\n console.log(\' AmtLoadWebApp - Load MeshCommander in Intel AMT 11.6+ firmware.\');\r\n console.log(\' AmtClearWebApp - Clear everything from Intel AMT web storage.\');\r\n console.log(\' AmtStorageState - Show contents of the Intel AMT web storage.\');\r\n console.log(\' AmtSaveState - Save all Intel AMT WSMAN object to file.\');\r\n console.log(\' AmtPresence - Heartbeat a local Intel AMT watchdog agent.\');\r\n console.log(\' AmtPower - Perform remote Intel AMT power operation.\');\r\n console.log(\' AmtIDER - Mount local disk image to remote computer.\');\r\n console.log(\' AmtFeatures - Intel AMT features & user consent.\');\r\n console.log(\' AmtNetwork - Intel AMT network interface settings.\');\r\n console.log(\' AmtScan - Search local network for Intel AMT devices.\');\r\n console.log(\' AmtWifi - Intel AMT Wifi interface settings.\');\r\n console.log(\' AmtWake - Intel AMT Wake Alarms.\');\r\n console.log(\'\\r\\nHelp on a specific action using:\\r\\n\');\r\n console.log(\' meshcmd help [action]\');\r\n exit(1); return;\r\n }\r\n if (settings.action == \'help\') {\r\n if (argv.length <= 2) {\r\n actions.shift();\r\n console.log(\'Help usage:\\r\\n\\r\\n MeshCmd help [action]\\r\\n\\r\\nValid actions are: \' + actions.join(\', \') + \'.\');\r\n exit(1); return;\r\n }\r\n var action = argv[2].toLowerCase();\r\n if (action == \'route\') {\r\n console.log("The route action is used along with a MeshCentral account to map a local TCP port to a remote port on any computer on your MeshCentral account. This action requires many arguments, to avoid specifying them all it\'s best to download the meshaction.txt file from the web site and place it in the current folder. Example usage:\\r\\n\\r\\n (Place meshaction.txt file in current folder)\\r\\n meshcmd route --pass myAccountPassword");\r\n } else if (action == \'smbios\') {\r\n console.log("SMBios action will display this computer\'s system management BIOS information. Example usage:\\r\\n\\r\\n meshcmd smbios --out smbios.txt\\r\\n");\r\n console.log(\'\\r\\Optional arguments:\\r\\n\');\r\n console.log(\' --output [filename] Optional filename to write the results to.\');\r\n } else if (action == \'rawsmbios\') {\r\n console.log("RawSMBios action will display this computer\'s system management BIOS information in raw hexdecimal form. Example usage:\\r\\n\\r\\n meshcmd rawsmbios --out smbios.txt\\r\\n");\r\n console.log(\'\\r\\Optional arguments:\\r\\n\');\r\n console.log(\' --output [filename] Optional filename to write the results to.\');\r\n } else if (action == \'amtinfo\') {\r\n console.log(\'AmtInfo action will get the version and activation state of Intel AMT on this computer. The command must be run on a computer with Intel AMT, must run as administrator and the Intel management driver must be installed. Example usage:\\r\\n\\r\\n meshcmd amtinfo\');\r\n } else if ((action == \'amtversion\') || (action == \'amtversions\')) {\r\n console.log(\'AmtVersions will display all version information about Intel AMT on this computer. The command must be run on a computer with Intel AMT, must run as administrator and the Intel management driver must be installed. Example usage:\\r\\n\\r\\n meshcmd amtversions\');\r\n } else if (action == \'amthashes\') {\r\n console.log(\'Amthashes will display all trusted activations hashes for Intel AMT on this computer. The command must be run on a computer with Intel AMT, must run as administrator and the Intel management driver must be installed. These certificates hashes are used by Intel AMT when performing activation into ACM mode. Example usage:\\r\\n\\r\\n meshcmd amthashes\');\r\n } else if ((action == \'microlms\') || (action == \'lms\') || (action == \'amtlms\')) {\r\n console.log(\'Starts MicroLMS on this computer, allowing local access to Intel AMT on TCP ports 16992 and 16993 when applicable. The command must be run on a computer with Intel AMT, must run as administrator and the Intel management driver must be installed. These certificates hashes are used by Intel AMT when performing activation into ACM mode. Example usage:\\r\\n\\r\\n meshcmd microlms\');\r\n console.log(\'\\r\\nPossible arguments:\\r\\n\');\r\n console.log(\' --noconsole MeshCommander for LMS will no be available on port 16994.\');\r\n console.log(\'\\r\\nRun as a background service:\\r\\n\');\r\n console.log(\' microlms install/uninstall/start/stop.\');\r\n } else if (action == \'amtccm\') {\r\n console.log(\'AmtCCM will attempt to activate Intel AMT on this computer into client control mode (CCM). The command must be run on a computer with Intel AMT, must run as administrator and the Intel management driver must be installed. Intel AMT must be in "pre-provisioning" state for this command to work and a administrator password must be provided.\');\r\n console.log(\'\\r\\nPossible arguments:\\r\\n\');\r\n console.log(\' --password [password] Admin password used to activate Intel AMT.\');\r\n } else if (action == \'amtconfig\') {\r\n console.log(\'AmtConfig will attempt to activate and configure Intel AMT on this computer. The command must be run on a computer with Intel AMT, must run as administrator and the Intel management driver must be installed. Example usage:\\r\\n\\r\\n meshcmd amtconfig --url [url]\');\r\n console.log(\'\\r\\nPossible arguments:\\r\\n\');\r\n console.log(\' --url [wss://server] The address of the MeshCentral server.\');\r\n console.log(\' --id [groupid] The device group identifier.\');\r\n console.log(\' --serverhttpshash [hash] Optional TLS server certificate hash.\');\r\n console.log(\' --user [username] The Intel AMT admin username, admin is default.\');\r\n console.log(\' --pass [password] The Intel AMT admin password.\');\r\n console.log(\' --desc [description] Description of the device, used when first added to server.\');\r\n } else if (action == \'amtdeactivate\') {\r\n console.log(\'AmtDeactivate will attempt to deactivate Intel AMT on this computer when in client control mode (CCM). The command must be run on a computer with Intel AMT, must run as administrator and the Intel management driver must be installed. Intel AMT must be activated in client control mode for this command to work. Example usage:\\r\\n\\r\\n meshcmd amtdeactivate\');\r\n } else if (action == \'amtacmdeactivate\') {\r\n console.log(\'AmtACMDeactivate will attempt to deactivate Intel AMT on this computer when in admin control mode (ACM). The command must be run on a computer with Intel AMT, must run as administrator and the Intel management driver must be installed. Intel AMT must be activated in admin control mode for this command to work. Example usage:\\r\\n\\r\\n meshcmd amtacmdeactivate\');\r\n console.log(\'\\r\\nPossible arguments:\\r\\n\');\r\n console.log(\' --user [username] The Intel AMT login username, admin is default.\');\r\n console.log(\' --pass [password] The Intel AMT login password.\');\r\n console.log(\' --type [partial/full] Specifies to perform partial or full unprovision.\');\r\n } else if (action == \'amtuuid\') {\r\n console.log(\'AmtUUID action will get the unique identifier of the local or remote Intel AMT computer. By default, the local UUID is obtained unless a host is specified. Intel AMT must be activated for this command to work. Example usage:\\r\\n\\r\\n meshcmd amtuuid --host 1.2.3.4 --user admin --pass mypassword --tls\');\r\n console.log(\'\\r\\nPossible arguments:\\r\\n\');\r\n console.log(\' --host [hostname] The IP address or DNS name of Intel AMT, 127.0.0.1 is default.\');\r\n console.log(\' --user [username] The Intel AMT login username, admin is default.\');\r\n console.log(\' --pass [password] The Intel AMT login password.\');\r\n console.log(\' --tls Specifies that TLS must be used.\');\r\n } else if ((action == \'amtloadwebapp\') || (action == \'amtloadsmallwebapp\') || (action == \'amtloadlargewebapp\') || (action == \'amtclearwebapp\') || (action == \'amtstoragestate\')) {\r\n console.log(\'AmtLoadWebApp action will load MeshCommander into Intel AMT 11.6 or higher. If the computer is in ACM mode, MeshCommander will replace the default index.htm on HTTP/16992 or HTTPS/16993. If Intel AMT is in CCM mode, MeshCommander will be installed alongside the default web page and will be accessible in the "Web Applications" section. This action works on Intel AMT 11.6 and higher only. Example usage:\\r\\n\\r\\n meshcmd amtloadwebapp --host 1.2.3.4 --user admin --pass mypassword --tls\');\r\n console.log(\'\\r\\nPossible arguments:\\r\\n\');\r\n console.log(\' --host [hostname] The IP address or DNS name of Intel AMT, 127.0.0.1 is default.\');\r\n console.log(\' --user [username] The Intel AMT login username, admin is default.\');\r\n console.log(\' --pass [password] The Intel AMT login password.\');\r\n console.log(\' --tls Specifies that TLS must be used.\');\r\n } else if (action == \'amtclearwebstorage\') {\r\n console.log(\'AmtClearWebStorage will clear the web storage of Intel AMT, removing any loaded firmware version of MeshCommander. This command can clear the local or a remote Intel AMT computer. By default, the local computer storage is cleared unless a host is specified. Intel AMT must be activated for this command to work. This action works on Intel AMT 11.6 and higher only. Example usage:\\r\\n\\r\\n meshcmd amtclearwebstorage --host 1.2.3.4 --user admin --pass mypassword --tls\');\r\n console.log(\'\\r\\nPossible arguments:\\r\\n\');\r\n console.log(\' --host [hostname] The IP address or DNS name of Intel AMT, 127.0.0.1 is default.\');\r\n console.log(\' --user [username] The Intel AMT login username, admin is default.\');\r\n console.log(\' --pass [password] The Intel AMT login password.\');\r\n console.log(\' --tls Specifies that TLS must be used.\');\r\n } else if (action == \'amtstoragestate\') {\r\n console.log(\'AmtStorageState will display the content of the web storage of Intel AMT including any loaded firmware version of MeshCommander. This command can read the storage state of a local or remote Intel AMT computer. By default, the local computer storage state is displayed unless a host is specified. Intel AMT must be activated for this command to work. This action works on Intel AMT 11.6 and higher only. Example usage:\\r\\n\\r\\n meshcmd amtstoragestate --host 1.2.3.4 --user admin --pass mypassword --tls\');\r\n console.log(\'\\r\\nPossible arguments:\\r\\n\');\r\n console.log(\' --host [hostname] The IP address or DNS name of Intel AMT, 127.0.0.1 is default.\');\r\n console.log(\' --user [username] The Intel AMT login username, admin is default.\');\r\n console.log(\' --pass [password] The Intel AMT login password.\');\r\n console.log(\' --tls Specifies that TLS must be used.\');\r\n } else if (action == \'amtsavestate\') {\r\n console.log(\'AmtSaveState action will fetch all the entire state of Intel AMT and save it as a JSON file. This action will take multiple minutes to perform. The command will fetch the local computer state unless host is specified. Intel AMT must be ativated for this command to work. Example usage:\\r\\n\\r\\n meshcmd amtsavestate --host 1.2.3.4 --user admin --pass mypassword --tls --output state.json\');\r\n console.log(\'\\r\\nPossible arguments:\\r\\n\');\r\n console.log(\' --output [filename] The output file for the Intel AMT state in JSON format.\');\r\n console.log(\' --host [hostname] The IP address or DNS name of Intel AMT, 127.0.0.1 is default.\');\r\n console.log(\' --user [username] The Intel AMT login username, admin is default.\');\r\n console.log(\' --pass [password] The Intel AMT login password.\');\r\n console.log(\' --tls Specifies that TLS must be used.\');\r\n } else if (action == \'amtpresence\') {\r\n console.log(\'AmtPresence will heartbeat a local Intel AMT watchdog agent. Example usage:\\r\\n\\r\\n meshcmd amtpresence --agent B4B6A24C-255E-A75C-F5E8-B00B4D946AA7\');\r\n console.log(\'\\r\\nPossible arguments:\\r\\n\');\r\n console.log(\' --user [username] The Intel AMT login username, admin is default.\');\r\n console.log(\' --pass [password] The Intel AMT login password.\');\r\n console.log(\' --agent [uuid] The unique identifier of the watchdog agent.\');\r\n } else if (action == \'amtpower\') {\r\n console.log(\'AmtPower will get current pwoer state or send a reboot command to a remote Intel AMT device. Example usage:\\r\\n\\r\\n meshcmd amtpower --reset --host 1.2.3.4 --user admin --pass mypassword --tls\');\r\n console.log(\'\\r\\nRequired arguments:\\r\\n\');\r\n console.log(\' --host [hostname] The IP address or DNS name of Intel AMT.\');\r\n console.log(\' --pass [password] The Intel AMT login password.\');\r\n console.log(\'\\r\\nOptional arguments:\\r\\n\');\r\n console.log(\' --reset, --poweron, --poweroff, --powercycle, --sleep, --hibernate\');\r\n console.log(\' --user [username] The Intel AMT login username, admin is default.\');\r\n console.log(\' --tls Specifies that TLS must be used.\');\r\n console.log(\' --bootdevice [pxe|hdd|cd] Specifies the boot device to use after reset, poweron or powercycle.\');\r\n console.log(\' --bootindex [number] Specifies the index of boot device to use.\');\r\n } else if (action == \'amtnetwork\') {\r\n console.log(\'AmtNetwork is used to get/set Intel AMT network interface configuration. Example usage:\\r\\n\\r\\n meshcmd amtnetwork --host 1.2.3.4 --user admin --pass mypassword --dhcp\');\r\n console.log(\'\\r\\nRequired arguments:\\r\\n\');\r\n console.log(\' --host [hostname] The IP address or DNS name of Intel AMT, 127.0.0.1 is default.\');\r\n console.log(\' --pass [password] The Intel AMT login password.\');\r\n console.log(\'\\r\\nOptional arguments:\\r\\n\');\r\n console.log(\' --user [username] The Intel AMT login username, admin is default.\');\r\n console.log(\' --tls Specifies that TLS must be used.\');\r\n console.log(\' --ipsync [0 or 1] Change the wired IPSync setting on Intel AMT 7+\');\r\n console.log(\' --dhcp Change IPv4 wired interface to DHCP mode\');\r\n console.log(\' --static Change IPv4 wired interface to static IP mode\');\r\n console.log(\' --ip [1.2.3.4] Static IPv4 address (required)\');\r\n console.log(\' --subnet [1.2.3.4] Static IPv4 subnet mask\');\r\n console.log(\' --gateway [1.2.3.4] Static IPv4 default gateway\');\r\n console.log(\' --dns [1.2.3.4] Primary DNS IPv4 address\');\r\n console.log(\' --dns2 [1.2.3.4] Secondary DNS IPv4 address\');\r\n } else if (action == \'amtfeatures\') {\r\n console.log(\'AmtFeatures is used to get/set Intel AMT feature configuration. Example usage:\\r\\n\\r\\n meshcmd amtfeatures --host 1.2.3.4 --user admin --pass mypassword --tls --redir 1\');\r\n console.log(\'\\r\\nRequired arguments:\\r\\n\');\r\n console.log(\' --host [hostname] The IP address or DNS name of Intel AMT, 127.0.0.1 is default.\');\r\n console.log(\' --pass [password] The Intel AMT login password.\');\r\n console.log(\'\\r\\nOptional arguments:\\r\\n\');\r\n console.log(\' --user [username] The Intel AMT login username, admin is default.\');\r\n console.log(\' --tls Specifies that TLS must be used.\');\r\n console.log(\' --consent [none/kvm/all] Set Intel AMT user consent feature.\');\r\n console.log(\' --redir [0/1] Set Intel AMT redirection port feature.\');\r\n console.log(\' --kvm [0/1] Set Intel AMT KVM feature.\');\r\n console.log(\' --sol [0/1] Set Intel AMT Serial-over-LAN feature.\');\r\n console.log(\' --ider [0/1] Set Intel AMT IDE redirection feature.\');\r\n } else if (action == \'meshcommander\') {\r\n console.log(\'This action launched a local web server that hosts MeshCommander, a Intel AMT management console.\');\r\n console.log(\'\\r\\nPossible arguments:\\r\\n\');\r\n console.log(\' --localport [port] Local port used for the web server, 3000 is default.\');\r\n console.log(\'\\r\\nRun as a background service:\\r\\n\');\r\n console.log(\' meshcommander install/uninstall/start/stop.\');\r\n } else if (action == \'amteventlog\') {\r\n console.log(\'AmtEventLog action will fetch the local or remote event log. Example usage:\\r\\n\\r\\n meshcmd amteventlog --host 1.2.3.4 --user admin --pass mypassword --tls --output events.txt\');\r\n console.log(\'\\r\\nPossible arguments:\\r\\n\');\r\n console.log(\' --output [filename] The output file for the Intel AMT event log.\');\r\n console.log(\' --host [hostname] The IP address or DNS name of Intel AMT, 127.0.0.1 is default.\');\r\n console.log(\' --user [username] The Intel AMT login username, admin is default.\');\r\n console.log(\' --pass [password] The Intel AMT login password.\');\r\n console.log(\' --tls Specifies that TLS must be used.\');\r\n console.log(\' --uuidoutput Output with unique identifier as the filename.\');\r\n console.log(\' --json Output as a JSON format.\');\r\n } else if (action == \'amtauditlog\') {\r\n console.log(\'AmtAuditLog action will fetch the local or remote audit log. If used localy, no username/password is required. Example usage:\\r\\n\\r\\n meshcmd amtauditlog --host 1.2.3.4 --user admin --pass mypassword --tls --output audit.json\');\r\n console.log(\'\\r\\nPossible arguments:\\r\\n\');\r\n console.log(\' --output [filename] The output file for the Intel AMT audit log.\');\r\n console.log(\' --host [hostname] The IP address or DNS name of Intel AMT, 127.0.0.1 is default.\');\r\n console.log(\' --user [username] The Intel AMT login username, admin is default.\');\r\n console.log(\' --pass [password] The Intel AMT login password.\');\r\n console.log(\' --tls Specifies that TLS must be used.\');\r\n console.log(\' --uuidoutput Output with unique identifier as the filename.\');\r\n console.log(\' --json Output as a JSON format.\');\r\n } else if (action == \'amtider\') {\r\n console.log(\'AmtIDER will mount a local disk images to a remote Intel AMT computer. Example usage:\\r\\n\\r\\n meshcmd amtider --host 1.2.3.4 --user admin --pass mypassword --tls --floppy disk.img --cdrom disk.iso\');\r\n console.log(\'\\r\\nPossible arguments:\\r\\n\');\r\n console.log(\' --host [hostname] The IP address or DNS name of Intel AMT.\');\r\n console.log(\' --user [username] The Intel AMT login username, admin is default.\');\r\n console.log(\' --pass [password] The Intel AMT login password.\');\r\n console.log(\' --tls Specifies that TLS must be used.\');\r\n console.log(\' --floppy [file] Specifies .img file to be mounted as a flppy disk.\');\r\n console.log(\' --cdrom [file] Specifies .img file to be mounted as a CDROM disk.\');\r\n console.log(\' --timeout [seconds] Optional, disconnect after number of seconds without disk read.\');\r\n } else if (action == \'amtscan\') {\r\n console.log(\'AmtSCAN will look for Intel AMT device on the network. Example usage:\\r\\n\\r\\n meshcmd amtscan --scan 192.168.1.0/24\');\r\n console.log(\'\\r\\Required arguments:\\r\\n\');\r\n console.log(\' --scan [ip range] The IP address range to perform the scan on.\');\r\n } else if (action == \'amtwifi\') {\r\n console.log(\'AmtWifi is used to get/set Intel AMT Wifi configuration. Example usage:\\r\\n\\r\\n meshcmd amtwifi --host 1.2.3.4 --user admin --pass mypassword --list\');\r\n console.log(\'\\r\\nRequired arguments:\\r\\n\');\r\n console.log(\' --host [hostname] The IP address or DNS name of Intel AMT, 127.0.0.1 is default.\');\r\n console.log(\' --pass [password] The Intel AMT login password.\');\r\n console.log(\' --[action] Action options are list, add, del.\');\r\n console.log(\'\\r\\nOptional arguments:\\r\\n\');\r\n console.log(\' --user [username] The Intel AMT login username, admin is default.\');\r\n console.log(\' --tls Specifies that TLS must be used.\');\r\n console.log(\' --list List Wifi profiles\');\r\n console.log(\' --add Add new Wifi profile\');\r\n console.log(\' --name New Wifi profile name\');\r\n console.log(\' --priority Priority of this profile - default 0\');\r\n console.log(\' --ssid Wifi SSID\');\r\n console.log(\' --auth Wifi Authentication method (4 - WPA, 6 - WPA2/RSN) - default 6\');\r\n console.log(\' --enc Wifi Encryption type (3 - TKIP, 4 - CCMP) - default 3\');\r\n console.log(\' --psk Wifi password/pre-shared key\');\r\n console.log(\' --del [profile-name] Delete new Wifi profile\');\r\n } else if (action == \'amtwake\') {\r\n console.log(\'AmtWake is used to view/set/remote Intel AMT Wake Alarms. Example usage:\\r\\n\\r\\n meshcmd amtwake --host 1.2.3.4 --user admin --pass mypassword --list\');\r\n console.log(\'\\r\\nRequired arguments:\\r\\n\');\r\n console.log(\' --host [hostname] The IP address or DNS name of Intel AMT, 127.0.0.1 is default.\');\r\n console.log(\' --pass [password] The Intel AMT login password.\');\r\n console.log(\' --[action] Action options are list, add, del.\');\r\n console.log(\'\\r\\nOptional arguments:\\r\\n\');\r\n console.log(\' --user [username] The Intel AMT login username, admin is default.\');\r\n console.log(\' --tls Specifies that TLS must be used.\');\r\n console.log(\' --list List wake alarms profile\');\r\n console.log(\' --add [alarm-name] Add new wake alarm\');\r\n console.log(\' --date [yyyy-mm-dd] Alarm date in year-month-day format\');\r\n console.log(\' --time (hh:mm:ss) Optional alarm time in hours:minutes:seconds format, default is 00:00:00.\');\r\n console.log(\' --interval (dd-hh-mm) Optional alarm interval in days-hours-minutes format, default is alarm once.\');\r\n console.log(\' --deletewhendone Indicates alarm is removed once triggered, default is to no remove.\');\r\n console.log(\' --del [alarm-name] Remove a wake alarm\');\r\n } else {\r\n actions.shift();\r\n console.log(\'Invalid action, usage:\\r\\n\\r\\n meshcmd help [action]\\r\\n\\r\\nValid actions are: \' + actions.join(\', \') + \'.\');\r\n }\r\n exit(1); return;\r\n }\r\n settings.action = settings.action.toLowerCase();\r\n debug(1, "Settings: " + JSON.stringify(settings));\r\n\r\n // Setup the proxy if needed\r\n if ((typeof settings.proxy) == \'string\') {\r\n var proxy = settings.proxy.split(\':\'), proxyport = (proxy.length == 2) ? parseInt(proxy[1]) : 0;\r\n if ((proxy.length != 2) || (proxy[0].length < 1) || (proxyport < 1) || (proxyport > 65535)) { console.log(\'Invalid \\"proxy\\" specified, use --proxy [hostname]:[port].\'); exit(1); return; }\r\n try { require(\'global-tunnel\').initialize({ host: proxy[0], port: proxyport }); } catch (ex) { console.log(ex); exit(1); return; }\r\n console.log(\'Proxy set to \' + proxy[0] + \':\' + proxyport);\r\n }\r\n\r\n if (settings.action == \'amtstartconfig\') {\r\n // Start Intel AMT configuration\r\n var amtMeiModule, amtMei;\r\n try { amtMeiModule = require(\'amt-mei\'); amtMei = new amtMeiModule(); } catch (ex) { console.log(ex); exit(1); return; }\r\n amtMei.on(\'error\', function (e) { console.log(\'ERROR: \' + e); exit(1); return; });\r\n amtMei.startConfiguration(function (state) {\r\n if (state == 3) { console.log("Intel AMT is not in correct mode."); }\r\n else if (state == 1) { console.log("Intel AMT internal error."); }\r\n else if (state == 48) { console.log("Random generator not ready."); }\r\n else if (state == 49) { console.log("Certificate not ready."); }\r\n else if (state == 0) { console.log("Success."); }\r\n else { console.log("Unknown status: " + state); }\r\n exit(1);\r\n });\r\n } else if (settings.action == \'amtstopconfig\') {\r\n // Stop Intel AMT configuration\r\n var amtMeiModule, amtMei;\r\n try { amtMeiModule = require(\'amt-mei\'); amtMei = new amtMeiModule(); } catch (ex) { console.log(ex); exit(1); return; }\r\n amtMei.on(\'error\', function (e) { console.log(\'ERROR: \' + e); exit(1); return; });\r\n amtMei.stopConfiguration(function (state) {\r\n if (state == 3) { console.log("Intel AMT is not in in-provisionning mode."); }\r\n else if (state == 1) { console.log("Intel AMT internal error."); }\r\n else if (state == 0) { console.log("Success."); }\r\n else { console.log("Unknown status: " + state); }\r\n exit(1);\r\n });\r\n } else if (settings.action == \'smbios\') {\r\n // Display SM BIOS tables in raw form\r\n SMBiosTables = require(\'smbios\');\r\n SMBiosTables.get(function (data) {\r\n var r = SMBiosTables.parse(data);\r\n var out = objToString(r, 0, \'\\r\\n\');\r\n if (settings.output == null) { console.log(out); } else { var file = fs.openSync(settings.output, \'w\'); fs.writeSync(file, Buffer.from(out, \'utf8\')); fs.closeSync(file); }\r\n exit(1);\r\n });\r\n } else if (settings.action == \'rawsmbios\') {\r\n // Display SM BIOS tables in raw form\r\n SMBiosTables = require(\'smbios\');\r\n SMBiosTables.get(function (data) {\r\n var out = \'\';\r\n for (var i in data) { var header = false; for (var j in data[i]) { if (data[i][j].length > 0) { if (header == false) { out += (\'Table type #\' + i + ((SMBiosTables.smTableTypes[i] == null) ? \'\' : (\', \' + SMBiosTables.smTableTypes[i]))) + \'\\r\\n\'; header = true; } out += (\' \' + data[i][j].toString(\'hex\')) + \'\\r\\n\'; } } }\r\n if (settings.output == null) { console.log(out); } else { var file = fs.openSync(settings.output, \'w\'); fs.writeSync(file, Buffer.from(out, \'utf8\')); fs.closeSync(file); }\r\n exit(1);\r\n });\r\n } else if (settings.action == \'route\') {\r\n // MeshCentral Router, port map local TCP port to a remote computer\r\n if ((settings.localport == null) || (typeof settings.localport != \'number\') || (settings.localport < 0) || (settings.localport > 65535)) { console.log(\'No or invalid \\"localPort\\" specified, use --localport [localport].\'); exit(1); return; }\r\n if ((settings.remotenodeid == null) || (typeof settings.remotenodeid != \'string\')) { console.log(\'No or invalid \\"remoteNodeId\\" specified.\'); exit(1); return; }\r\n if (((settings.username == null) || (typeof settings.username != \'string\') || (settings.username == \'\')) && (settings.authcookie == null || typeof settings.authcookie != \'string\' || settings.authcookie == \'\')) { console.log(\'No or invalid \\"username\\" specified, use --username [username].\'); exit(1); return; }\r\n if (((settings.password == null) || (typeof settings.password != \'string\') || (settings.password == \'\')) && (settings.authcookie == null || typeof settings.authcookie != \'string\' || settings.authcookie == \'\')) { console.log(\'No or invalid \\"password\\" specified, use --password [password].\'); exit(1); return; }\r\n if (settings.serverid != null) {\r\n if ((typeof settings.serverid != \'string\') || (settings.serverid.length != 96)) { console.log(\'No or invalid \\"serverId\\" specified.\'); exit(1); return; }\r\n } else {\r\n if ((settings.serverhttpshash == null) || (typeof settings.serverhttpshash != \'string\') || (settings.serverhttpshash.length != 96)) { console.log(\'No or invalid \\"serverHttpsHash\\" or \\"serverId\\" specified.\'); exit(1); return; }\r\n }\r\n if ((settings.remoteport == null) || (typeof settings.remoteport != \'number\') || (settings.remoteport < 0) || (settings.remoteport > 65535)) { console.log(\'No or invalid \\"remotePort\\" specified, use --remoteport [remoteport].\'); exit(1); return; }\r\n if (settings.serverurl != null) { startRouter(); } else { discoverMeshServer(); } // Start MeshCentral Router\r\n } else if ((settings.action == \'amtloadwebapp\') || (settings.action == \'amtloadsmallwebapp\') || (settings.action == \'amtloadlargewebapp\') || (settings.action == \'amtclearwebapp\') || (settings.action == \'amtstoragestate\')) { // Intel AMT Web Application Actions\r\n // Intel AMT 11.6+ Load MeshCommander into firmware\r\n if ((settings.password == null) || (typeof settings.password != \'string\') || (settings.password == \'\')) { console.log(\'No or invalid \\"password\\" specified, use --password [password].\'); exit(1); return; }\r\n if ((settings.hostname == null) || (typeof settings.hostname != \'string\') || (settings.hostname == \'\')) { settings.hostname = \'127.0.0.1\'; }\r\n if ((settings.username == null) || (typeof settings.username != \'string\') || (settings.username == \'\')) { settings.username = \'admin\'; }\r\n settings.protocol = \'http:\';\r\n settings.localport = 16992;\r\n debug(1, "Settings: " + JSON.stringify(settings));\r\n digest = require(\'http-digest\').create(settings.username, settings.password);\r\n digest.http = require(\'http\');\r\n if (settings.action == \'amtstoragestate\') {\r\n getAmtStorage(function (statusCode, data) { if (statusCode == 200) { console.log("Storage State: " + JSON.stringify(data, null, 2)); exit(); return; } else { console.log("Unable to read storage state."); exit(); return; } });\r\n } else {\r\n if (settings.action == \'amtloadwebapp\') { settings.webapp = Medium_IntelAmtWebApp; }\r\n else if (settings.action == \'amtloadsmallwebapp\') { settings.webapp = Small_IntelAmtWebApp; }\r\n else if (settings.action == \'amtloadlargewebapp\') { settings.webapp = Large_IntelAmtWebApp; }\r\n else if (settings.action == \'amtclearwebapp\') { settings.webapp = null; }\r\n nextStepStorageUpload();\r\n }\r\n } else if ((settings.action == \'amtversion\') || (settings.action == \'amtversions\') || (settings.action == \'amtver\')) {\r\n // Display Intel ME versions\r\n var amtMeiModule, amtMei;\r\n try { amtMeiModule = require(\'amt-mei\'); amtMei = new amtMeiModule(); } catch (ex) { console.log(ex); exit(1); return; }\r\n amtMei.on(\'error\', function (e) { console.log(\'ERROR: \' + e); exit(1); return; });\r\n amtMei.getVersion(function (val) {\r\n console.log("BIOS Version = " + val.BiosVersion.toString());\r\n for (var version in val.Versions) {\r\n var extras = \'\', skuBits = [\'\', \'iQST\', \'ASF\', \'AMT\', \'ISM\', \'TPM\', \'\', \'\', \'HomeIT\', \'\', \'WOX\', \'\', \'\', \'AT-p\', \'Corporate\', \'L3 Mgt Upgrade\'];\r\n if (val.Versions[version].Description == \'Sku\') {\r\n var n = parseInt(val.Versions[version].Version), x = [], xx = 1;\r\n for (var i = 0; i < skuBits.length; i++) { if ((n & xx) != 0) { x.push(skuBits[i]); } xx = xx << 1; }\r\n if (x.length > 0) { extras = \' (\' + x.join(\', \') + \')\' }\r\n }\r\n console.log(val.Versions[version].Description + " = " + val.Versions[version].Version + extras);\r\n }\r\n exit(1); return;\r\n });\r\n } else if (settings.action == \'amthashes\') {\r\n // Display Intel AMT list of trusted hashes\r\n var amtMeiModule, amtMei;\r\n try { amtMeiModule = require(\'amt-mei\'); amtMei = new amtMeiModule(); } catch (ex) { console.log(ex); exit(1); return; }\r\n amtMei.on(\'error\', function (e) { console.log(\'ERROR: \' + e); exit(1); return; });\r\n amtMei.getHashHandles(function (handles) {\r\n exitOnCount = handles.length;\r\n for (var i = 0; i < handles.length; ++i) {\r\n this.getCertHashEntry(handles[i], function (result) {\r\n var certState = [];\r\n if (result.isDefault) { certState.push(\'Default\'); }\r\n if (result.isActive) { certState.push(\'Active\'); } else { certState.push(\'Disabled\'); }\r\n console.log(result.name + \', (\' + certState.join(\', \') + \')\\r\\n \' + result.hashAlgorithmStr + \': \' + result.certificateHash);\r\n if (--exitOnCount == 0) { exit(1); }\r\n });\r\n }\r\n });\r\n } else if (settings.action == \'netinfo\') {\r\n // Display network information\r\n var interfaces = require(\'os\').networkInterfaces();\r\n console.log(JSON.stringify(interfaces, 2, \' \'));\r\n exit(0); return;\r\n } else if (settings.action == \'amtinfo\') {\r\n // Display Intel AMT version and activation state\r\n mestate = {};\r\n var amtMeiModule, amtMei;\r\n try { amtMeiModule = require(\'amt-mei\'); amtMei = new amtMeiModule(); } catch (ex) { console.log(ex); exit(1); return; }\r\n amtMei.on(\'error\', function (e) { console.log(\'ERROR: \' + e); exit(1); return; });\r\n try {\r\n amtMei.getVersion(function (result) {\r\n if (result) {\r\n for (var version in result.Versions) {\r\n if (result.Versions[version].Description == \'AMT\') { mestate.ver = result.Versions[version].Version; }\r\n if (result.Versions[version].Description == \'Sku\') { mestate.sku = parseInt(result.Versions[version].Version); }\r\n }\r\n }\r\n });\r\n amtMei.getProvisioningState(function (result) { if (result) { mestate.ProvisioningState = result; } });\r\n amtMei.getProvisioningMode(function (result) { if (result) { mestate.ProvisioningMode = result; } });\r\n amtMei.getEHBCState(function (result) { if (result) { mestate.ehbc = result; } });\r\n amtMei.getControlMode(function (result) { if (result) { mestate.controlmode = result; } });\r\n amtMei.getMACAddresses(function (result) { if (result) { mestate.mac = result; } });\r\n amtMei.getLanInterfaceSettings(0, function (result) { if (result) { mestate.net0 = result; } });\r\n amtMei.getLanInterfaceSettings(1, function (result) { if (result) { mestate.net1 = result; } });\r\n amtMei.getUuid(function (result) { if ((result != null) && (result.uuid != null)) { mestate.uuid = result.uuid; } });\r\n amtMei.getRemoteAccessConnectionStatus(function (result) { if ((result != null) && (result.status == 0)) { mestate.networkStatus = result.networkStatus; mestate.remoteAccessStatus = result.remoteAccessStatus; mestate.remoteAccessTrigger = result.remoteAccessTrigger; mestate.mpsHostname = result.mpsHostname; } });\r\n amtMei.getDnsSuffix(function (result) {\r\n if (result) { mestate.dns = result; }\r\n if (mestate.ver && mestate.ProvisioningState && mestate.ProvisioningMode) {\r\n var str = \'Intel ME v\' + mestate.ver;\r\n if (mestate.sku & 8) { str = \'Intel AMT v\' + mestate.ver }\r\n else if (mestate.sku & 16) { str = \'Intel SM v\' + mestate.ver }\r\n if (mestate.ProvisioningState.stateStr == \'PRE\') { str += \', pre-provisioning state\'; }\r\n else if (mestate.ProvisioningState.stateStr == \'IN\') { str += \', in-provisioning state\'; }\r\n else if (mestate.ProvisioningState.stateStr == \'POST\') {\r\n if (mestate.ProvisioningMode) {\r\n if (mestate.controlmode) {\r\n if (mestate.ProvisioningMode.modeStr == \'ENTERPRISE\') { str += \', activated in \' + ["none", "Client Control Mode (CCM)", "Admin Control Mode (ACM)", "remote assistance mode"][mestate.controlmode.controlMode]; } else { str += \', activated in \' + mestate.ProvisioningMode.modeStr; }\r\n } else {\r\n str += \', activated in \' + mestate.ProvisioningMode.modeStr;\r\n }\r\n }\r\n }\r\n if ((mestate.ehbc) && (mestate.ehbc.EHBC == true)) { str += \', EHBC enabled\'; }\r\n str += \'.\';\r\n if (mestate.net0 != null) { str += \'\\r\\nWired \' + ((mestate.net0.enabled == 1) ? \'Enabled\' : \'Disabled\') + ((mestate.net0.dhcpEnabled == 1) ? \', DHCP\' : \', Static\') + \', \' + mestate.net0.mac + (mestate.net0.address == \'0.0.0.0\' ? \'\' : (\', \' + mestate.net0.address)); }\r\n if (mestate.net1 != null) { str += \'\\r\\nWireless \' + ((mestate.net1.enabled == 1) ? \'Enabled\' : \'Disabled\') + ((mestate.net1.dhcpEnabled == 1) ? \', DHCP\' : \', Static\') + \', \' + mestate.net1.mac + (mestate.net1.address == \'0.0.0.0\' ? \'\' : (\', \' + mestate.net1.address)); }\r\n if ((mestate.net0 != null) && (mestate.net0.enabled == 1)) {\r\n if (mestate.dns != null) {\r\n // Intel AMT has a trusted DNS suffix set, use that one.\r\n str += \'\\r\\nTrusted DNS suffix: \' + mestate.dns;\r\n } else {\r\n // Look for the DNS suffix for the Intel AMT Ethernet interface\r\n var fqdn = null, interfaces = require(\'os\').networkInterfaces();\r\n for (var i in interfaces) {\r\n for (var j in interfaces[i]) {\r\n if ((interfaces[i][j].mac == mestate.net0.mac) && (interfaces[i][j].fqdn != null) && (interfaces[i][j].fqdn != \'\')) { fqdn = interfaces[i][j].fqdn; }\r\n }\r\n }\r\n if (fqdn != null) { str += \'\\r\\nDNS suffix: \' + fqdn; }\r\n }\r\n }\r\n if (typeof mestate.networkStatus == \'number\') {\r\n str += \'\\r\\nConnection Status: \' + [\'Direct\', \'VPN\', \'Outside\'][mestate.networkStatus];\r\n str += \', CIRA: \' + [\'Disconnected\', \'Connecting\', \'Connected\'][mestate.remoteAccessStatus];\r\n if ((mestate.remoteAccessStatus > 0) && (mestate.mpsHostname != null) && (mestate.mpsHostname.length > 0)) {\r\n str += \' to \' + mestate.mpsHostname + \', \' + [\'User initiated\', \'Alert\', \'Periodic\', \'Provisioning\'][mestate.remoteAccessTrigger];\r\n }\r\n }\r\n console.log(str + \'.\');\r\n } else {\r\n console.log(\'Intel(R) AMT not supported.\');\r\n }\r\n exit(1);\r\n });\r\n } catch (ex) { console.log("Unable to perform MEI operations, try running as administrator."); exit(1); return; }\r\n } else if (settings.action == \'amtinfodebug\') {\r\n // Display Intel AMT version and activation state\r\n getMeiState(15, function (state) { console.log(JSON.stringify(state, null, 2)); exit(1); }); // Flags: 1 = Versions, 2 = OsAdmin, 4 = Hashes, 8 = Network\r\n } else if (settings.action == \'amtsavestate\') {\r\n // Save the entire state of Intel AMT info a JSON file\r\n if ((settings.password == null) || (typeof settings.password != \'string\') || (settings.password == \'\')) { console.log(\'No or invalid \\"password\\" specified, use --password [password].\'); exit(1); return; }\r\n if ((settings.hostname == null) || (typeof settings.hostname != \'string\') || (settings.hostname == \'\')) { settings.hostname = \'127.0.0.1\'; }\r\n if ((settings.username == null) || (typeof settings.username != \'string\') || (settings.username == \'\')) { settings.username = \'admin\'; }\r\n if ((settings.output == null) || (typeof settings.output != \'string\') || (settings.output == \'\')) { console.log(\'No or invalid \\"output\\" file specified, use --output [filename].\'); exit(1); return; }\r\n settings.protocol = \'http:\';\r\n settings.localport = 16992;\r\n debug(1, "Settings: " + JSON.stringify(settings));\r\n saveEntireAmtState();\r\n } else if ((settings.action == \'microlms\') || (settings.action == \'amtlms\') || (settings.action == \'lms\')) {\r\n // Start Intel AMT MicroLMS\r\n startLms(function (state) {\r\n console.log([\'MicroLMS did not start. Must run as administrator or LMS already active.\', \'MicroLMS started.\', \'MicroLMS started, MeshCommander on HTTP/16994.\', \'MEI error\'][state]);\r\n if (((state == 0) || (state == 3)) && (settings.noconsole === true)) { exit(0); } else { console.log(\'Press ctrl-c to exit.\'); }\r\n }, settings.noconsole !== true);\r\n } else if (settings.action == \'amtpresence\') {\r\n // Heartbeat a Intel AMT watchdog\r\n if ((settings.password == null) || (typeof settings.password != \'string\') || (settings.password == \'\')) { console.log(\'No or invalid \\"password\\" specified, use --password [password].\'); exit(1); return; }\r\n if ((settings.username == null) || (typeof settings.username != \'string\') || (settings.username == \'\')) { settings.username = \'admin\'; }\r\n if ((settings.agent == null) || (typeof settings.agent != \'string\') || (settings.agent == \'\')) { console.log(\'No or invalid \\"agent\\" specified, use --agent [agent].\'); exit(1); return; }\r\n performAmtAgentPresence();\r\n } else if (settings.action == \'amtuuid\') {\r\n // Start running\r\n if (settings.hostname != null) {\r\n if ((settings.password == null) || (typeof settings.password != \'string\') || (settings.password == \'\')) { console.log(\'No or invalid \\"password\\" specified, use --password [password].\'); exit(1); return; }\r\n if ((settings.username == null) || (typeof settings.username != \'string\') || (settings.username == \'\')) { settings.username = \'admin\'; }\r\n }\r\n settings.protocol = \'http:\';\r\n settings.localport = 16992;\r\n debug(1, "Settings: " + JSON.stringify(settings));\r\n getAmtUuid();\r\n } else if (settings.action == \'amtconfig\') {\r\n // Start Intel AMT configuration\r\n if ((settings.url == null) || (typeof settings.url != \'string\') || (settings.url == \'\')) { console.log(\'No MeshCentral server URL specified, use --url [url].\'); exit(1); return; }\r\n if ((settings.id == null) || (typeof settings.id != \'string\') || (settings.id == \'\')) { console.log(\'No device group identifier specified, use --id [identifier].\'); exit(1); return; }\r\n debug(1, "Settings: " + JSON.stringify(settings));\r\n configureAmt();\r\n } else if (settings.action == \'amtccm\') {\r\n // Start activation to CCM \r\n if (((settings.password == null) || (typeof settings.password != \'string\') || (settings.password == \'\'))) { console.log(\'No or invalid parameters specified, use --password [password] or --url [url].\'); exit(1); return; }\r\n settings.protocol = \'http:\';\r\n settings.localport = 16992;\r\n debug(1, "Settings: " + JSON.stringify(settings));\r\n activeToCCM();\r\n } else if (settings.action == \'amtdeactivate\') {\r\n // Deactivate CCM\r\n debug(1, "Settings: " + JSON.stringify(settings));\r\n deactivateCCM();\r\n } else if (settings.action == \'amtacmdeactivate\') {\r\n // Deactivate ACM\r\n if ((settings.password == null) || (typeof settings.password != \'string\') || (settings.password == \'\')) { console.log(\'No or invalid \\"password\\" specified, use --password [password].\'); exit(1); return; }\r\n if ((settings.type == null) || (typeof settings.type != \'string\') || (settings.type == \'\')) { console.log(\'Unprovisioning \\"type\\" must be specified, use --type [partial/full].\'); exit(1); return; }\r\n if ((settings.username == null) || (typeof settings.username != \'string\') || (settings.username == \'\')) { settings.username = \'admin\'; }\r\n if (settings.hostname == null) { settings.hostname = \'127.0.0.1\'; }\r\n if (settings.tls == null) { settings.tls = false; }\r\n debug(1, "Settings: " + JSON.stringify(settings));\r\n deactivateACM();\r\n } else if (settings.action == \'meshcommander\') { // Start MeshCommander\r\n startMeshCommander();\r\n //} else if (settings.action == \'amtdisable\') { // Disable AMT Network Interface\r\n // amtDisable();\r\n } else if (settings.action == \'amtscan\') {\r\n // Scan the network for Intel AMT devices\r\n if ((settings.scan == null) || (typeof settings.scan != \'string\') || (settings.scan == \'\')) { console.log(\'No or invalid \\"scan\\" specified, use --scan [ip range].\'); exit(1); return; }\r\n console.log(\'Scanning: \' + settings.scan + \'...\');\r\n var AMTScannerModule = require(\'amt-scanner\');\r\n var amtscanner = new AMTScannerModule(), r = \'\';\r\n amtscanner.scan(settings.scan, 2000, function (data) {\r\n if (data.length > 0) {\r\n r = \'\', pstates = [\'NotActivated\', \'InActivation\', \'Activated\'];\r\n for (var i in data) {\r\n var x = data[i];\r\n if (r != \'\') { r += \'\\r\\n\'; }\r\n r += x.address + \' - Intel AMT v\' + x.majorVersion + \'.\' + x.minorVersion;\r\n if (x.provisioningState < 3) { r += (\', \' + pstates[x.provisioningState]); }\r\n if (x.provisioningState == 2) { r += (\', \' + x.openPorts.join(\', \')); }\r\n r += \'.\';\r\n }\r\n } else {\r\n r = \'No Intel AMT found.\';\r\n }\r\n console.log(r);\r\n exit(1);\r\n });\r\n } else if (settings.action == \'amtauditlog\') { // Read the Intel AMT audit log\r\n if (settings.hostname != null) {\r\n if ((settings.password == null) || (typeof settings.password != \'string\') || (settings.password == \'\')) { console.log(\'No or invalid \\"password\\" specified, use --password [password].\'); exit(1); return; }\r\n if ((settings.username == null) || (typeof settings.username != \'string\') || (settings.username == \'\')) { settings.username = \'admin\'; }\r\n } else { settings.hostname = \'127.0.0.1\'; }\r\n readAmtAuditLog();\r\n } else if (settings.action == \'amteventlog\') { // Read the Intel AMT audit log\r\n if (settings.hostname != null) {\r\n if ((settings.password == null) || (typeof settings.password != \'string\') || (settings.password == \'\')) { console.log(\'No or invalid \\"password\\" specified, use --password [password].\'); exit(1); return; }\r\n if ((settings.username == null) || (typeof settings.username != \'string\') || (settings.username == \'\')) { settings.username = \'admin\'; }\r\n } else { settings.hostname = \'127.0.0.1\'; }\r\n readAmtEventLog();\r\n } else if (settings.action == \'amtider\') { // Remote mount IDER image\r\n if ((settings.hostname == null) || (typeof settings.hostname != \'string\') || (settings.hostname == \'\')) { console.log(\'No or invalid \\"hostname\\" specified, use --hostname [password].\'); exit(1); return; }\r\n if ((settings.password == null) || (typeof settings.password != \'string\') || (settings.password == \'\')) { console.log(\'No or invalid \\"password\\" specified, use --password [password].\'); exit(1); return; }\r\n if ((settings.username == null) || (typeof settings.username != \'string\') || (settings.username == \'\')) { settings.username = \'admin\'; }\r\n if ((settings.floppy == null) || (typeof settings.floppy != \'string\') || (settings.floppy == \'\')) { settings.floppy = null; }\r\n if ((settings.cdrom == null) || (typeof settings.cdrom != \'string\') || (settings.cdrom == \'\')) { settings.cdrom = null; }\r\n if ((settings.floppy == null) && (settings.cdrom == null)) { console.log(\'No or invalid \\"floppy\\" or \\"cdrom\\" specified, use --floppy [file] or --cdrom [file].\'); exit(1); return; }\r\n performIder();\r\n } else if (settings.action == \'amtnetwork\') { // Perform remote Intel AMT wired IPv4 configuration operation\r\n if (settings.hostname == null) { settings.hostname = \'127.0.0.1\'; }\r\n if ((settings.password == null) || (typeof settings.password != \'string\') || (settings.password == \'\')) { console.log(\'No or invalid \\"password\\" specified, use --password [password].\'); exit(1); return; }\r\n if ((settings.username == null) || (typeof settings.username != \'string\') || (settings.username == \'\')) { settings.username = \'admin\'; }\r\n performAmtNetConfig(args);\r\n } else if (settings.action == \'amtwifi\') { // Perform remote Intel AMT Wifi configuration operation\r\n if (settings.hostname == null) { settings.hostname = \'127.0.0.1\'; }\r\n if ((settings.password == null) || (typeof settings.password != \'string\') || (settings.password == \'\')) { console.log(\'No or invalid \\"password\\" specified, use --password [password].\'); exit(1); return; }\r\n if ((settings.username == null) || (typeof settings.username != \'string\') || (settings.username == \'\')) { settings.username = \'admin\'; }\r\n if (args.add != null) {\r\n if ((args.name == null) || (typeof args.name != \'string\') || args.name == \'\') { console.log("Wifi profile name is required."); exit(1); return; }\r\n if ((args.ssid == null) || (typeof args.ssid != \'string\') || args.ssid == \'\') { console.log("Wifi SSID is required."); exit(1); return; }\r\n if ((args.psk == null) || (typeof args.psk != \'string\') || args.psk == \'\') { console.log("Wifi password is required."); exit(1); return; }\r\n }\r\n if (args.del != null) {\r\n if ((settings.name == null) || (typeof settings.name != \'string\') || settings.name == \'\') { console.log("Wifi profile name is required."); exit(1); return; }\r\n }\r\n performAmtWifiConfig(args);\r\n } else if (settings.action == \'amtwake\') { // Perform remote Intel AMT wake alarm operations\r\n if (settings.hostname == null) { settings.hostname = \'127.0.0.1\'; }\r\n if ((settings.password == null) || (typeof settings.password != \'string\') || (settings.password == \'\')) { console.log(\'No or invalid \\"password\\" specified, use --password [password].\'); exit(1); return; }\r\n if ((settings.username == null) || (typeof settings.username != \'string\') || (settings.username == \'\')) { settings.username = \'admin\'; }\r\n if ((args.del != null) && ((typeof args.del != \'string\') || args.del == \'\')) { console.log("Alarm name is required (--del [name])."); exit(1); return; }\r\n if (args.add != null) {\r\n if (((typeof args.add != \'string\') || args.add == \'\')) { console.log("Wake alarm name is required (--add [name])."); exit(1); return; }\r\n if (((typeof args.date != \'string\') || args.data == \'\')) { console.log("Wake alarm date is required (--date [yyyy-mm-dd])."); exit(1); return; }\r\n }\r\n performAmtWakeConfig(args);\r\n } else if (settings.action == \'amtfeatures\') { // Perform remote Intel AMT feature configuration operation\r\n if (settings.hostname == null) { settings.hostname = \'127.0.0.1\'; }\r\n if ((settings.password == null) || (typeof settings.password != \'string\') || (settings.password == \'\')) { console.log(\'No or invalid \\"password\\" specified, use --password [password].\'); exit(1); return; }\r\n if ((settings.username == null) || (typeof settings.username != \'string\') || (settings.username == \'\')) { settings.username = \'admin\'; }\r\n performAmtFeatureConfig(args);\r\n } else if (settings.action == \'amtpower\') { // Perform remote Intel AMT power operation\r\n if ((settings.hostname == null) || (typeof settings.hostname != \'string\') || (settings.hostname == \'\')) { console.log(\'No or invalid \\"hostname\\" specified, use --hostname [host].\'); exit(1); return; }\r\n if ((settings.password == null) || (typeof settings.password != \'string\') || (settings.password == \'\')) { console.log(\'No or invalid \\"password\\" specified, use --password [password].\'); exit(1); return; }\r\n if ((settings.username == null) || (typeof settings.username != \'string\') || (settings.username == \'\')) { settings.username = \'admin\'; }\r\n\r\n /*\r\n 2 = Power On\r\n 3 = Sleep - Light\r\n 4 = Sleep - Deep\r\n 5 = Power Cycle (Off Soft)\r\n 6 = Power Off - Hard\r\n 7 = Hibernate\r\n 8 = Power Off - Soft\r\n 9 = Power Cycle (Off Hard)\r\n 10 = Main Bus Reset\r\n 11 = Diagnostic Interrupt (NMI)\r\n 12 = Power Off - Soft Graceful\r\n 13 = Power Off - Hard Graceful\r\n 14 = Main Bus Reset Graceful\r\n 15 = Power Cycle (Off - Soft Graceful)\r\n 16 = Power Cycle (Off - Hard Graceful)\r\n */\r\n\r\n settings.poweraction = 0;\r\n if (args.poweron) { settings.poweraction = 2; }\r\n if (args.sleep) { settings.poweraction = 3; }\r\n if (args.powercycle) { settings.poweraction = 5; }\r\n if (args.poweroff) { settings.poweraction = 8; }\r\n if (args.hibernate) { settings.poweraction = 7; }\r\n if (args.reset) { settings.poweraction = 10; }\r\n //if (settings.poweraction == 0) { console.log(\'No power action, specify --poweron, --sleep, --powercycle, --poweroff, --hibernate, --reset.\'); exit(1); return; }\r\n // Accepted option for boot device are: pxe, hdd, cd \r\n var bootdevices = [\'pxe\',\'hdd\',\'cd\']; \r\n if (args.bootdevice) {\r\n if (bootdevices.indexOf(args.bootdevice.toLowerCase())>=0) {\r\n settings.bootdevice = args.bootdevice\r\n // Set bootindex to 0 by default, unless overriden\r\n settings.bootindex = 0\r\n } else {\r\n console.log(\'Supported boot devices are pxe, hdd, cd\'); exit(1); return; \r\n }\r\n }\r\n // boot index for cd and hdd\r\n if (args.bootindex && args.bootindex >=0) {\r\n settings.bootindex = args.bootindex;\r\n }\r\n\r\n performAmtPowerAction();\r\n } else {\r\n console.log(\'Invalid "action" specified.\'); exit(1); return;\r\n }\r\n}\r\n\r\n//\r\n// Intel AMT Agent Presence\r\n//\r\n\r\nfunction performAmtAgentPresence() { startLms(function () { tempWatchdogTimer = setTimeout(performAmtAgentPresenceRegister, 3000); }); }\r\n\r\nfunction performAmtAgentPresenceRegister() {\r\n // Setup the Intel AMT WSMAN stack\r\n tempWatchdogTimer = null;\r\n var transport = require(\'amt-wsman-duk\');\r\n var wsman = require(\'amt-wsman\');\r\n var amt = require(\'amt\');\r\n wsstack = new wsman(transport, \'127.0.0.1\', settings.tls ? 16993 : 16992, settings.username, settings.password, settings.tls);\r\n amtstack = new amt(wsstack);\r\n\r\n // Register the watchdog\r\n watchdog = { DeviceID: Buffer.from(guidToStr(settings.agent.split(\'-\').join(\'\')).split(\'-\').join(\'\'), \'hex\').toString(\'base64\'), Retry: 0 };\r\n amtstack.AMT_AgentPresenceWatchdog_RegisterAgent(performAmtAgentPresenceRegisterRetry, watchdog, watchdog.Seq, { \'DeviceID\': watchdog.DeviceID });\r\n}\r\n\r\n// Called after the agent is registered\r\nfunction performAmtAgentPresenceRegisterRetry(stack, name, response, status, watchdog) {\r\n if ((status == 200) && (response.Body.SessionSequenceNumber) && (response.Body.TimeoutInterval)) {\r\n console.log(\'Asserting presence of the watchdog...\');\r\n watchdog.Seq = response.Body.SessionSequenceNumber;\r\n watchdog.Interval = response.Body.TimeoutInterval * 800;\r\n watchdog.Retry = 0;\r\n tempWatchdogTimer = setTimeout(performAmtAgentPresenceAssert, watchdog.Interval);\r\n } else {\r\n debug(1, \'Failed to register, status = \' + status);\r\n watchdog.Retry++;\r\n if (watchdog.Retry < 5) {\r\n tempWatchdogTimer = setTimeout(function () { amtstack.AMT_AgentPresenceWatchdog_RegisterAgent(performAmtAgentPresenceRegisterRetry, watchdog, watchdog.Seq, { \'DeviceID\': watchdog.DeviceID }); }, 1000);\r\n } else {\r\n console.log(\'Failed to register this watchdog.\');\r\n process.exit(0);\r\n }\r\n }\r\n}\r\n\r\n// Start a new agent assert\r\nfunction performAmtAgentPresenceAssert() {\r\n watchdog.Seq++;\r\n amtstack.AMT_AgentPresenceWatchdog_AssertPresence(watchdog.Seq, performAmtAgentPresenceAssertRetry, watchdog, 0, { \'DeviceID\': watchdog.DeviceID });\r\n}\r\n\r\n// Called after the agent is asserted\r\nfunction performAmtAgentPresenceAssertRetry(stack, name, response, status, watchdog) {\r\n if (status == 200) {\r\n debug(1, \'Successful assert, sequence = \' + watchdog.Seq);\r\n watchdog.Retry = 0;\r\n tempWatchdogTimer = setTimeout(performAmtAgentPresenceAssert, watchdog.Interval);\r\n } else {\r\n debug(1, \'Failed to assert, status = \' + status);\r\n watchdog.Retry++;\r\n if (watchdog.Retry < 5) {\r\n amtstack.AMT_AgentPresenceWatchdog_AssertPresence(watchdog.Seq, performAmtAgentPresenceAssertRetry, watchdog, 0, { \'DeviceID\': watchdog.DeviceID });\r\n } else {\r\n console.log(\'Failed to assert presence on this watchdog.\');\r\n process.exit(0);\r\n }\r\n }\r\n}\r\n\r\nfunction performAmtAgentPresenceEx5(stack, name, response, status, watchdog) {\r\n console.log(\'b\', status, watchdog);\r\n if (status == 200) {\r\n watchdog.Retry = 0;\r\n } else {\r\n watchdog.Retry++;\r\n if (watchdog.Retry < 5) {\r\n amtstack.AMT_AgentPresenceWatchdog_AssertPresence(watchdog.Seq, performAmtAgentPresenceEx4, watchdog, 0, { \'DeviceID\': watchdog.DeviceID });\r\n } else {\r\n console.log(\'Failed to assert presence on this watchdog.\');\r\n process.exit(0);\r\n }\r\n }\r\n}\r\n\r\n\r\n//\r\n// Intel AMT Event Log\r\n//\r\n\r\nfunction readAmtEventLog() {\r\n // See if MicroLMS needs to be started\r\n if ((settings.hostname == \'127.0.0.1\') || (settings.hostname.toLowerCase() == \'localhost\')) {\r\n settings.noconsole = true; startLms(readAmtEventLogEx);\r\n } else {\r\n readAmtEventLogEx(9999);\r\n }\r\n}\r\n\r\nfunction readAmtEventLogEx(x) {\r\n if (x == 9999) {\r\n var transport = require(\'amt-wsman-duk\');\r\n var wsman = require(\'amt-wsman\');\r\n var amt = require(\'amt\');\r\n wsstack = new wsman(transport, settings.hostname, settings.tls ? 16993 : 16992, settings.username, settings.password, settings.tls);\r\n amtstack = new amt(wsstack);\r\n amtstack.GetMessageLog(readAmtEventLogEx2);\r\n } else {\r\n osamtstack.GetMessageLog(readAmtEventLogEx2);\r\n }\r\n}\r\n\r\nfunction readAmtEventLogEx2(stack, messages) {\r\n if (messages == null) {\r\n console.log(\'Unable to get event log.\');\r\n } else {\r\n var out = \'\';\r\n if (settings.json) {\r\n out = JSON.stringify(messages, 4, \' \');\r\n } else {\r\n for (var i in messages) { out += messages[i].Time + \', \' + messages[i].EntityStr + \', \' + messages[i].Desc + \', \' + messages[i].EventSeverity + \'\\r\\n\'; }\r\n }\r\n if ((settings.output == null || settings.output == "") && !settings.uuidoutput) { console.log(out); exit(1); }\r\n else {\r\n try {\r\n if (settings.output) {\r\n var file = fs.openSync(settings.output, \'w\');\r\n fs.writeSync(file, Buffer.from(out));\r\n fs.closeSync(file);\r\n exit(1);\r\n }\r\n else if (settings.uuidoutput) {\r\n var destpath = null; //Dest path where messagelog file will be saved\r\n if ((typeof settings.uuidoutput) == \'string\') {\r\n fs.statSync(settings.uuidoutput).isDirectory();//Validate directory path\r\n destpath = settings.uuidoutput;\r\n }\r\n //Generate uuid and append it to dest path\r\n stack.Get(\'CIM_ComputerSystemPackage\', function (obj, name, response, xstatus, tag) {\r\n if (xstatus == 200) {\r\n var eventlogsfile = path.join(destpath, guidToStr(response.Body.PlatformGUID.toLowerCase() + \'_Event\' + (settings.json ? \'.json\' : \'.csv\')));\r\n var file = fs.openSync(eventlogsfile, \'w\');\r\n fs.writeSync(file, Buffer.from(out));\r\n fs.closeSync(file);\r\n } else {\r\n console.log(\'Intel AMT is not available or not activated, status = \' + status + \'.\');\r\n } exit(1);\r\n });\r\n }\r\n else {\r\n console.log(\'Invalid action, usage:\\r\\n\\r\\n meshcmd help amtauditlog\');\r\n exit(1);\r\n }\r\n }\r\n catch (e) {\r\n console.log(e);\r\n exit(1);\r\n }\r\n }\r\n }\r\n}\r\n\r\n//\r\n// Intel AMT Audit Log\r\n//\r\n\r\nfunction readAmtAuditLog() {\r\n // See if MicroLMS needs to be started\r\n if ((settings.hostname == \'127.0.0.1\') || (settings.hostname.toLowerCase() == \'localhost\')) {\r\n settings.noconsole = true; startLms(readAmtAuditLogEx);\r\n } else {\r\n readAmtAuditLogEx(9999);\r\n }\r\n}\r\n\r\nfunction readAmtAuditLogEx(x) {\r\n if (x == 9999) {\r\n var transport = require(\'amt-wsman-duk\');\r\n var wsman = require(\'amt-wsman\');\r\n var amt = require(\'amt\');\r\n wsstack = new wsman(transport, settings.hostname, settings.tls ? 16993 : 16992, settings.username, settings.password, settings.tls);\r\n amtstack = new amt(wsstack);\r\n amtstack.GetAuditLog(readAmtAuditLogEx2);\r\n } else {\r\n osamtstack.GetAuditLog(readAmtAuditLogEx2);\r\n }\r\n}\r\n\r\nfunction readAmtAuditLogEx2(stack, response, status) {\r\n if (status != 200) {\r\n console.log(\'Unable to get audit log, status = \' + status + \'.\');\r\n } else {\r\n var out = \'\';\r\n if (settings.json) {\r\n out = JSON.stringify(response, 4, \' \');\r\n } else {\r\n for (var i in response) {\r\n var name = ((response[i].Initiator != \'\') ? (response[i].Initiator + \': \') : \'\')\r\n out += (response[i].Time + \' - \' + name + response[i].Event + \'\\r\\n\');\r\n }\r\n }\r\n if ((settings.output == null || settings.output == "") && !settings.uuidoutput) { console.log(out); exit(1); }\r\n else {\r\n try {\r\n if (settings.output) {\r\n var file = fs.openSync(settings.output, \'w\');\r\n fs.writeSync(file, Buffer.from(out));\r\n fs.closeSync(file);\r\n exit(1);\r\n }\r\n else if (settings.uuidoutput) {\r\n var destpath = null; //Dest path where auditlog file will be saved\r\n if ((typeof settings.uuidoutput) == \'string\') {\r\n fs.statSync(settings.uuidoutput).isDirectory();//Validate directory path\r\n destpath = settings.uuidoutput;\r\n }\r\n //Generate uuid and append it to dest path\r\n stack.Get(\'CIM_ComputerSystemPackage\', function (obj, name, response, xstatus, tag) {\r\n if (xstatus == 200) {\r\n var auditlogsfile = path.join(destpath, guidToStr(response.Body.PlatformGUID.toLowerCase() + \'_Audit\' + (settings.json ? \'.json\' : \'.csv\')));\r\n var file = fs.openSync(auditlogsfile, \'w\');\r\n fs.writeSync(file, Buffer.from(out));\r\n fs.closeSync(file);\r\n } else {\r\n console.log(\'Intel AMT is not available or not activated, status = \' + status + \'.\');\r\n } exit(1);\r\n });\r\n }\r\n else {\r\n console.log(\'Invalid action, usage:\\r\\n\\r\\n meshcmd help amtauditlog\');\r\n exit(1);\r\n }\r\n }\r\n catch (e) {\r\n console.log(e);\r\n exit(1);\r\n }\r\n }\r\n }\r\n}\r\n\r\n//\r\n// Disable AMT Network\r\n//\r\n\r\n//function amtDisable() {\r\n// settings.noconsole = true;\r\n// startLms(amtDisableEx);\r\n//}\r\n\r\n//function amtDisableEx(stack, response, status) {\r\n// //console.log(osamtstack);\r\n// osamtstack.Get(\'AMT_EthernetPortSettings\', function (stack, name, response, status) {\r\n// console.log(response.Body);\r\n// });\r\n//}\r\n\r\n//\r\n// MeshCommander local web server\r\n//\r\n\r\nfunction startMeshCommander() {\r\n if (settings.localport == null) { settings.localport = 3000; }\r\n\r\n // Start the web server\r\n var http = require(\'http\');\r\n webServer = http.createServer();\r\n webServer.listen(settings.localport);\r\n webServer.wsList = {};\r\n webServer.wsListIndex = 0;\r\n webServer.on(\'upgrade\', function (req, socket, head) {\r\n //console.log("WebSocket for " + req.url.split(\'?\')[0]);\r\n switch (req.url.split(\'?\')[0]) {\r\n case \'/webrelay.ashx\': // MeshCommander relay channel\r\n var ws = socket.upgradeWebSocket();\r\n socket.ws = ws;\r\n ws.wsIndex = ++webServer.wsListIndex;\r\n webServer.wsList[ws.wsIndex] = ws; // Keep a reference so the websocket and forwarder don\'t get disposed.\r\n ws.pause();\r\n\r\n // We got a new web socket connection, initiate a TCP connection to the target Intel AMT host/port.\r\n var webargs = parseUrlArguments(req.url);\r\n if (webargs.p) { webargs.p = parseInt(webargs.p); }\r\n if (webargs.tls) { webargs.tls = parseInt(webargs.tls); }\r\n if (webargs.tls1only) { webargs.tls1only = parseInt(webargs.tls1only); }\r\n if (webargs.port) { webargs.port = parseInt(webargs.port); }\r\n debug(1, \'Opening web socket connection to \' + webargs.host + \':\' + webargs.port + \'.\');\r\n //console.log(\'Opening web socket connection to \' + webargs.host + \':\' + webargs.port + \'.\');\r\n if (webargs.tls == 0) {\r\n // If this is TCP (without TLS) set a normal TCP socket\r\n var net = require(\'net\');\r\n ws.forwardclient = net.connect({ host: webargs.host, port: webargs.port })\r\n ws.forwardclient.on(\'connect\', function () { debug(1, \'Connected TCP to \' + webargs.host + \':\' + webargs.port + \'.\'); this.pipe(this.ws, { end: false }); this.ws.pipe(this, { end: false }); });\r\n ws.forwardclient.on(\'error\', function () { debug(1, \'TCP connection error to \' + webargs.host + \':\' + webargs.port + \'.\'); try { this.ws.end(); } catch (e) { } });\r\n ws.forwardclient.ws = ws;\r\n } else {\r\n // If TLS is going to be used, setup a TLS socket\r\n var tls = require(\'tls\');\r\n var tlsoptions = { host: webargs.host, port: webargs.port, rejectUnauthorized: false };\r\n if (webargs.tls1only == 1) { tlsoptions.secureProtocol = \'TLSv1_method\'; }\r\n ws.forwardclient = tls.connect(tlsoptions, function () { debug(1, \'Connected TLS to \' + webargs.host + \':\' + webargs.port + \'.\'); this.pipe(this.ws, { end: false }); this.ws.pipe(this, { end: false }); });\r\n ws.forwardclient.on(\'error\', function () { debug(1, \'TLS connection error to \' + webargs.host + \':\' + webargs.port + \'.\'); try { this.ws.end(); } catch (e) { } });\r\n ws.forwardclient.ws = ws;\r\n }\r\n\r\n // Handle pipe closure\r\n ws.on(\'end\', function () { debug(1, \'Disconnected from \' + webargs.host + \':\' + webargs.port + \'.\'); try { this.forwardclient.end(); } catch (e) { } delete webServer.wsList[this.wsIndex]; });\r\n ws.forwardclient.on(\'end\', function () { try { this.ws.end(); } catch (e) { } });\r\n\r\n break;\r\n default:\r\n socket.end();\r\n break;\r\n }\r\n });\r\n webServer.on(\'request\', function (req, rsp) {\r\n //console.log("WebRequest for " + req.url.split(\'?\')[0]);\r\n switch (req.url.split(\'?\')[0]) {\r\n case \'/\': // Serve MeshCommander Web Application\r\n var meshcommander = null;\r\n try { meshcommander = fs.readFileSync(\'meshcommander.htm\'); } catch (e) { }\r\n if (meshcommander != null) {\r\n rsp.writeHead(200, \'OK\', { Server: \'JSLMS\', \'Cache-Control\': \'max-age=0, no-cache\', \'X-Frame-Options\': \'DENY\', \'Content-Type\': \'text/html\', \'Transfer-Encoding\': \'chunked\' });\r\n rsp.end(meshcommander);\r\n } else {\r\n rsp.writeHead(200, \'OK\', { Server: \'JSLMS\', \'Cache-Control\': \'max-age=0, no-cache\', \'X-Frame-Options\': \'DENY\', \'Content-Type\': \'text/html\', \'Content-Encoding\': \'gzip\', \'Transfer-Encoding\': \'chunked\', ETag: FullSite_IntelAmtLocalWebApp_etag });\r\n rsp.end(Buffer.from(FullSite_IntelAmtLocalWebApp, \'base64\'));\r\n }\r\n break;\r\n default: // Unknown request\r\n rsp.statusCode = 404;\r\n rsp.statusMessage = "Not Found";\r\n rsp.end();\r\n break;\r\n }\r\n });\r\n console.log(\'MeshCommander running on HTTP port \' + settings.localport + \'.\');\r\n console.log(\'Press ctrl-c to exit.\');\r\n}\r\n\r\n\r\n//\r\n// Configure Intel AMT\r\n//\r\n\r\nfunction configureAmt() {\r\n settings.noconsole = true;\r\n startLms(configureAmt2, amtMei);\r\n}\r\n\r\nfunction configureAmt2() {\r\n getMeiState(15, function (state) { // Flags: 1 = Versions, 2 = OsAdmin, 4 = Hashes, 8 = Network\r\n if (state == null) { console.log(\'Unable to get Intel AMT state, try running as administrator.\'); exit(1); return; }\r\n if (state.ProvisioningState == null) { console.log(\'Intel AMT not ready for configuration.\'); exit(1); return; }\r\n console.log(\'Starting Intel AMT configuration...\');\r\n\r\n // Add indication if the device is battery powered, this is used to show a mobile icon when adding the device\r\n state.isBatteryPowered = (require(\'identifiers\').isBatteryPowered && require(\'identifiers\').isBatteryPowered());\r\n\r\n // Add Intel AMT credentials if provided\r\n if ((typeof settings.password == \'string\') && (settings.password != \'\')) {\r\n state.amtpass = settings.password;\r\n state.amtuser = \'admin\';\r\n if ((typeof settings.username == \'string\') && (settings.username != \'\')) { state.amtuser = settings.username; }\r\n }\r\n\r\n // If a description is provided, send it to the server\r\n if ((typeof settings.desc == \'string\') && (settings.desc != \'\')) { state.desc = settings.desc; }\r\n\r\n // Connect to MPS and start APF relay\r\n var apfarg = {\r\n mpsurl: settings.url,\r\n mpsuser: settings.id.substring(0, 16),\r\n mpspass: settings.id.substring(0, 16),\r\n mpskeepalive: 60000,\r\n clientname: state.OsHostname,\r\n clientaddress: \'127.0.0.1\',\r\n clientuuid: state.UUID,\r\n conntype: 2, // 0 = CIRA, 1 = Relay, 2 = LMS. The correct value is 2 since we are performing an LMS relay.\r\n meiState: state\r\n };\r\n if ((apfarg.clientuuid == null) || (apfarg.clientuuid.length != 36)) {\r\n console.log("Unable to get Intel AMT UUID: " + apfarg.clientuuid);\r\n exit(1); return;\r\n } else {\r\n settings.apftunnel = require(\'amt-apfclient\')({ debug: (settings.debuglevel > 0) }, apfarg);\r\n settings.apftunnel.onJsonControl = configureJsonControl;\r\n settings.apftunnel.onChannelClosed = function () { exit(0); }\r\n try {\r\n settings.apftunnel.connect();\r\n console.log("Started APF tunnel...");\r\n } catch (e) {\r\n console.log(JSON.stringify(e));\r\n exit(1); return;\r\n }\r\n }\r\n });\r\n}\r\n\r\nfunction configureJsonControl(data) {\r\n switch (data.action) {\r\n case \'console\': // Display a console message\r\n console.log(data.msg);\r\n break;\r\n case \'mestate\': // Request an updated MEI state\r\n getMeiState(15, function (state) { settings.apftunnel.updateMeiState(state); });\r\n break;\r\n case \'deactivate\': // Request CCM deactivation\r\n var amtMeiModule, amtMei;\r\n try { amtMeiModule = require(\'amt-mei\'); amtMei = new amtMeiModule(); } catch (ex) { settings.apftunnel.sendMeiDeactivationState(1); break; }\r\n amtMei.on(\'error\', function (e) { settings.apftunnel.sendMeiDeactivationState(1); });\r\n amtMei.unprovision(1, function (status) { settings.apftunnel.sendMeiDeactivationState(status); }); // 0 = Success\r\n break;\r\n case \'startTlsHostConfig\': // Request start of host based TLS ACM activation\r\n var amtMeiModule, amtMei;\r\n try { amtMeiModule = require(\'amt-mei\'); amtMei = new amtMeiModule(); } catch (ex) { settings.apftunnel.sendStartTlsHostConfigResponse({ state: -103 }); break; }\r\n amtMei.on(\'error\', function (e) { settings.apftunnel.sendStartTlsHostConfigResponse({ state: -104 }); });\r\n amtMei.startConfigurationHBased(Buffer.from(data.hash, \'hex\'), data.hostVpn, data.dnsSuffixList, function (response) {\r\n settings.apftunnel.sendStartTlsHostConfigResponse(response);\r\n });\r\n break;\r\n case \'stopConfiguration\': // Request Intel AMT stop configuration.\r\n var amtMeiModule, amtMei;\r\n try { amtMeiModule = require(\'amt-mei\'); amtMei = new amtMeiModule(); } catch (ex) { settings.apftunnel.sendStartTlsHostConfigResponse({ state: -103 }); break; }\r\n amtMei.on(\'error\', function (e) { settings.apftunnel.sendStartTlsHostConfigResponse({ state: -104 }); });\r\n amtMei.stopConfiguration(function (status) {\r\n settings.apftunnel.sendStopConfigurationResponse(status);\r\n });\r\n break;\r\n case \'close\': // Close the CIRA-LMS connection\r\n exit(0);\r\n break;\r\n default:\r\n console.log("MeshCmd update may be needed, unknown JSON control action: " + data.action);\r\n break;\r\n }\r\n}\r\n\r\n\r\n//\r\n// Deactivate Intel AMT CCM\r\n//\r\n\r\n// When called, this will use MEI to deactivate Intel AMT when it\'s in CCM mode. Simply calls "unprovision" on MEI and checks the return code.\r\nfunction deactivateCCM() {\r\n var amtMeiModule, amtMei;\r\n try { amtMeiModule = require(\'amt-mei\'); amtMei = new amtMeiModule(); } catch (ex) { console.log(ex); exit(1); return; }\r\n amtMei.on(\'error\', function (e) { console.log(\'ERROR: \' + e); exit(1); return; });\r\n amtMei.unprovision(1, function (status) { if (status == 0) { console.log(\'Success\'); } else { console.log(\'Error \' + status); } exit(1); });\r\n}\r\n\r\n\r\n//\r\n// Activate Intel AMT to CCM\r\n//\r\n\r\nfunction activeToCCM() {\r\n // See if MicroLMS needs to be started and setup the $$OsAdmin wsman stack\r\n settings.noconsole = true;\r\n startLms(activeToCCMEx); // TODO: Fix this so that it works even if LMS already running.\r\n}\r\n\r\nfunction activeToCCMEx(state) {\r\n osamtstack.BatchEnum(null, [\'*AMT_GeneralSettings\', \'*IPS_HostBasedSetupService\'], activeToCCMEx2);\r\n}\r\n\r\nfunction activeToCCMEx2(stack, name, responses, status) {\r\n if (status != 200) { console.log(\'Failed to fetch activation status, status \' + status); exit(1); }\r\n else if (responses[\'IPS_HostBasedSetupService\'].response[\'AllowedControlModes\'].length != 2) { console.log(\'Client control mode activation not allowed\'); exit(1); }\r\n else { osamtstack.IPS_HostBasedSetupService_Setup(2, md5hex(\'admin:\' + responses[\'AMT_GeneralSettings\'].response[\'DigestRealm\'] + \':\' + settings.password).substring(0, 32), null, null, null, null, activeToCCMEx3); }\r\n}\r\n\r\nfunction activeToCCMEx3(stack, name, responses, status) {\r\n if (status != 200) { console.log(\'Failed to activate, status \' + status); }\r\n else if (responses.Body.ReturnValue != 0) { console.log(\'Client control mode activation failed: \' + responses.Body.ReturnValueStr); }\r\n else { console.log(\'Success\'); exit(0); }\r\n exit(1);\r\n}\r\n\r\n\r\n\r\n//\r\n// Deactivate Intel AMT ACM\r\n//\r\n\r\n// When called, this will use MEI to deactivate Intel AMT when it\'s in ACM mode. Calls "unprovision" on MEI and checks the return code.\r\nfunction deactivateACM() {\r\n settings.noconsole = true;\r\n startLms(deactivateACMEx);\r\n}\r\n\r\nfunction deactivateACMEx() {\r\n var transport = require(\'amt-wsman-duk\');\r\n var wsman = require(\'amt-wsman\');\r\n var amt = require(\'amt\');\r\n wsstack = new wsman(transport, settings.hostname, settings.tls ? 16993 : 16992, settings.username, settings.password, settings.tls);\r\n amtstack = new amt(wsstack);\r\n amtstack.Get("AMT_SetupAndConfigurationService", function (stack, name, responses, status) {\r\n if (status !== 200) {\r\n console.log(\'Command not allowed. Status: \' + status);\r\n exit(1);\r\n } else {\r\n var sacs = responses.Body;\r\n if (sacs.ZeroTouchConfigurationEnabled == true) { sacs.ZeroTouchConfigurationEnabled = true; }\r\n amtstack.Put("AMT_SetupAndConfigurationService", sacs, function (stack, name, responses, status) {\r\n if (settings.type == \'full\') {\r\n amtstack.AMT_SetupAndConfigurationService_Unprovision(2, function (stack, name, responses, status) {\r\n if (status != 200) { console.log(\'Failed to fully unconfigure AMT, status \' + status); exit(1); }\r\n else if (responses.Body.ReturnValue != 0) { console.log(\'Unprovision failed: \' + responses.Body.ReturnValueStr); exit(1); }\r\n else { console.log(\'AMT fully unprovisioned.\'); exit(0); }\r\n });\r\n } else {\r\n console.log(\'Only full unprovision is currently supported.\');\r\n exit(0);\r\n }\r\n //} else if (settings.type == \'partial\') {\r\n // amtstack.AMT_SetupAndConfigurationService_PartialUnprovision(null, function (stack, name, responses, status) {\r\n // if (status != 200) { console.log(\'Failed to partially unconfigure AMT, status \' + status); exit(1); }\r\n // else if (responses.Body.ReturnValue != 0) { console.log(\'Unprovision failed: \' + responses.Body.ReturnValueStr); exit(1); }\r\n // else { console.log(\'AMT partially unprovisioned.\'); exit(0); }\r\n // });\r\n //}\r\n });\r\n }\r\n });\r\n}\r\n\r\n//\r\n// Get Intel AMT activation hashes\r\n//\r\n\r\nvar trustedHashes = null;\r\nfunction getTrustedHashes(amtMei, func, tag) {\r\n if (trustedHashes != null) { func(tag); }\r\n trustedHashes = [];\r\n amtMei.getHashHandles(function (handles) {\r\n var exitOnCount = handles.length;\r\n for (var i = 0; i < handles.length; ++i) {\r\n this.getCertHashEntry(handles[i], function (result) {\r\n if (result.isActive == 1) { trustedHashes.push(result.certificateHash.toLowerCase()); }\r\n if (--exitOnCount == 0) { func(tag); }\r\n });\r\n }\r\n });\r\n}\r\n\r\n\r\n//\r\n// Get AMT UUID\r\n//\r\n\r\n// Called to get the UUID of Intel AMT, start by setting up MicroLMS if we are doing the operation on the local computer\r\nfunction getAmtUuid() {\r\n if (settings.hostname == null) {\r\n var amtMeiModule, amtMei;\r\n try { amtMeiModule = require(\'amt-mei\'); amtMei = new amtMeiModule(); } catch (ex) { console.log(ex); exit(1); return; }\r\n amtMei.on(\'error\', function (e) { console.log(\'ERROR: \' + e); exit(1); return; });\r\n amtMei.getUuid(function (result) { if ((result == null) || (result.uuid == null)) { console.log(\'Failed.\'); } else { console.log(result.uuid); } exit(1); });\r\n } else {\r\n if ((settings.hostname == \'127.0.0.1\') || (settings.hostname.toLowerCase() == \'localhost\')) { settings.noconsole = true; startLms(getAmtUuidEx); return; } else { getAmtUuidEx(); }\r\n }\r\n}\r\n\r\n// Fetch the computer\'s UUID by fetching the CIM_ComputerSystemPackage WSMAN object.\r\nfunction getAmtUuidEx() {\r\n var transport = require(\'amt-wsman-duk\');\r\n var wsman = require(\'amt-wsman\');\r\n var amt = require(\'amt\');\r\n wsstack = new wsman(transport, settings.hostname, settings.tls ? 16993 : 16992, settings.username, settings.password, settings.tls);\r\n amtstack = new amt(wsstack);\r\n amtstack.Get("CIM_ComputerSystemPackage", function (obj, name, response, xstatus, tag) {\r\n if (xstatus == 200) { console.log("GUID: " + guidToStr(response.Body.PlatformGUID.toLowerCase())); } else { console.log("Intel AMT is not available or not activated."); } exit(1);\r\n });\r\n}\r\n\r\n\r\n//\r\n// FETCH ALL INTEL AMT STATE\r\n//\r\n\r\nfunction saveEntireAmtState2() {\r\n console.log(\'Fetching all Intel AMT state, this may take a few minutes...\');\r\n var transport = require(\'amt-wsman-duk\');\r\n var wsman = require(\'amt-wsman\');\r\n var amt = require(\'amt\');\r\n wsstack = new wsman(transport, settings.hostname, settings.tls ? 16993 : 16992, settings.username, settings.password, settings.tls);\r\n amtstack = new amt(wsstack);\r\n amtstack.onProcessChanged = onWsmanProcessChanged;\r\n //var AllWsman = "AMT_GeneralSystemDefenseCapabilities".split(\',\');\r\n var AllWsman = "AMT_8021xCredentialContext,AMT_8021XProfile,AMT_ActiveFilterStatistics,AMT_AgentPresenceCapabilities,AMT_AgentPresenceInterfacePolicy,AMT_AgentPresenceService,AMT_AgentPresenceWatchdog,AMT_AgentPresenceWatchdogAction,AMT_AlarmClockService,IPS_AlarmClockOccurrence,AMT_AssetTable,AMT_AssetTableService,AMT_AuditLog,AMT_AuditPolicyRule,AMT_AuthorizationService,AMT_BootCapabilities,AMT_BootSettingData,AMT_ComplexFilterEntryBase,AMT_CRL,AMT_CryptographicCapabilities,AMT_EACCredentialContext,AMT_EndpointAccessControlService,AMT_EnvironmentDetectionInterfacePolicy,AMT_EnvironmentDetectionSettingData,AMT_EthernetPortSettings,AMT_EventLogEntry,AMT_EventManagerService,AMT_EventSubscriber,AMT_FilterEntryBase,AMT_FilterInSystemDefensePolicy,AMT_GeneralSettings,AMT_GeneralSystemDefenseCapabilities,AMT_Hdr8021Filter,AMT_HeuristicPacketFilterInterfacePolicy,AMT_HeuristicPacketFilterSettings,AMT_HeuristicPacketFilterStatistics,AMT_InterfacePolicy,AMT_IPHeadersFilter,AMT_KerberosSettingData,AMT_ManagementPresenceRemoteSAP,AMT_MessageLog,AMT_MPSUsernamePassword,AMT_NetworkFilter,AMT_NetworkPortDefaultSystemDefensePolicy,AMT_NetworkPortSystemDefenseCapabilities,AMT_NetworkPortSystemDefensePolicy,AMT_PCIDevice,AMT_PETCapabilities,AMT_PETFilterForTarget,AMT_PETFilterSetting,AMT_ProvisioningCertificateHash,AMT_PublicKeyCertificate,AMT_PublicKeyManagementCapabilities,AMT_PublicKeyManagementService,AMT_PublicPrivateKeyPair,AMT_RedirectionService,AMT_RemoteAccessCapabilities,AMT_RemoteAccessCredentialContext,AMT_RemoteAccessPolicyAppliesToMPS,AMT_RemoteAccessPolicyRule,AMT_RemoteAccessService,AMT_SetupAndConfigurationService,AMT_SNMPEventSubscriber,AMT_StateTransitionCondition,AMT_SystemDefensePolicy,AMT_SystemDefensePolicyInService,AMT_SystemDefenseService,AMT_SystemPowerScheme,AMT_ThirdPartyDataStorageAdministrationService,AMT_ThirdPartyDataStorageService,AMT_TimeSynchronizationService,AMT_TLSCredentialContext,AMT_TLSProtocolEndpoint,AMT_TLSProtocolEndpointCollection,AMT_TLSSettingData,AMT_TrapTargetForService,AMT_UserInitiatedConnectionService,AMT_WebUIService,AMT_WiFiPortConfigurationService,CIM_AbstractIndicationSubscription,CIM_Account,CIM_AccountManagementCapabilities,CIM_AccountManagementService,CIM_AccountOnSystem,CIM_AdminDomain,CIM_AlertIndication,CIM_AssignedIdentity,CIM_AssociatedPowerManagementService,CIM_AuthenticationService,CIM_AuthorizationService,CIM_BIOSElement,CIM_BIOSFeature,CIM_BIOSFeatureBIOSElements,CIM_BootConfigSetting,CIM_BootService,CIM_BootSettingData,CIM_BootSourceSetting,CIM_Capabilities,CIM_Card,CIM_Chassis,CIM_Chip,CIM_Collection,CIM_Component,CIM_ComputerSystem,CIM_ComputerSystemPackage,CIM_ConcreteComponent,CIM_ConcreteDependency,CIM_Controller,CIM_CoolingDevice,CIM_Credential,CIM_CredentialContext,CIM_CredentialManagementService,CIM_Dependency,CIM_DeviceSAPImplementation,CIM_ElementCapabilities,CIM_ElementConformsToProfile,CIM_ElementLocation,CIM_ElementSettingData,CIM_ElementSoftwareIdentity,CIM_ElementStatisticalData,CIM_EnabledLogicalElement,CIM_EnabledLogicalElementCapabilities,CIM_EthernetPort,CIM_Fan,CIM_FilterCollection,CIM_FilterCollectionSubscription,CIM_HostedAccessPoint,CIM_HostedDependency,CIM_HostedService,CIM_Identity,CIM_IEEE8021xCapabilities,CIM_IEEE8021xSettings,CIM_Indication,CIM_IndicationService,CIM_InstalledSoftwareIdentity,CIM_KVMRedirectionSAP,CIM_LANEndpoint,CIM_ListenerDestination,CIM_ListenerDestinationWSManagement,CIM_Location,CIM_Log,CIM_LogEntry,CIM_LogicalDevice,CIM_LogicalElement,CIM_LogicalPort,CIM_LogicalPortCapabilities,CIM_LogManagesRecord,CIM_ManagedCredential,CIM_ManagedElement,CIM_ManagedSystemElement,CIM_MediaAccessDevice,CIM_MemberOfCollection,CIM_Memory,CIM_MessageLog,CIM_NetworkPort,CIM_NetworkPortCapabilities,CIM_NetworkPortConfigurationService,CIM_OrderedComponent,CIM_OwningCollectionElement,CIM_OwningJobElement,CIM_PCIController,CIM_PhysicalComponent,CIM_PhysicalElement,CIM_PhysicalElementLocation,CIM_PhysicalFrame,CIM_PhysicalMemory,CIM_PhysicalPackage,CIM_Policy,CIM_PolicyAction,CIM_PolicyCondition,CIM_PolicyInSystem,CIM_PolicyRule,CIM_PolicyRuleInSystem,CIM_PolicySet,CIM_PolicySetAppliesToElement,CIM_PolicySetInSystem,CIM_PowerManagementCapabilities,CIM_PowerManagementService,CIM_PowerSupply,CIM_Privilege,CIM_PrivilegeManagementCapabilities,CIM_PrivilegeManagementService,CIM_ProcessIndication,CIM_Processor,CIM_ProtocolEndpoint,CIM_ProvidesServiceToElement,CIM_Realizes,CIM_RecordForLog,CIM_RecordLog,CIM_RedirectionService,CIM_ReferencedProfile,CIM_RegisteredProfile,CIM_RemoteAccessAvailableToElement,CIM_RemoteIdentity,CIM_RemotePort,CIM_RemoteServiceAccessPoint,CIM_Role,CIM_RoleBasedAuthorizationService,CIM_RoleBasedManagementCapabilities,CIM_RoleLimitedToTarget,CIM_SAPAvailableForElement,CIM_SecurityService,CIM_Sensor,CIM_Service,CIM_ServiceAccessBySAP,CIM_ServiceAccessPoint,CIM_ServiceAffectsElement,CIM_ServiceAvailableToElement,CIM_ServiceSAPDependency,CIM_ServiceServiceDependency,CIM_SettingData,CIM_SharedCredential,CIM_SoftwareElement,CIM_SoftwareFeature,CIM_SoftwareFeatureSoftwareElements,CIM_SoftwareIdentity,CIM_StatisticalData,CIM_StorageExtent,CIM_System,CIM_SystemBIOS,CIM_SystemComponent,CIM_SystemDevice,CIM_SystemPackaging,CIM_UseOfLog,CIM_Watchdog,CIM_WiFiEndpoint,CIM_WiFiEndpointCapabilities,CIM_WiFiEndpointSettings,CIM_WiFiPort,CIM_WiFiPortCapabilities,IPS_AdminProvisioningRecord,IPS_ClientProvisioningRecord,IPS_HostBasedSetupService,IPS_HostIPSettings,IPS_IderSessionUsingPort,IPS_IPv6PortSettings,IPS_KVMRedirectionSettingData,IPS_KvmSessionUsingPort,IPS_ManualProvisioningRecord,IPS_OptInService,IPS_ProvisioningAuditRecord,IPS_ProvisioningRecordLog,IPS_RasSessionUsingPort,IPS_ScreenSettingData,IPS_SecIOService,IPS_SessionUsingPort,IPS_SolSessionUsingPort,IPS_TLSProvisioningRecord".split(\',\');\r\n IntelAmtEntireStateProgress = 101;\r\n IntelAmtEntireStateCalls = 3;\r\n IntelAmtEntireState = { \'localtime\': Date(), \'utctime\': new Date().toUTCString(), \'isotime\': new Date().toISOString() };\r\n amtstack.BatchEnum(null, AllWsman, saveEntireAmtStateOk2, null, true);\r\n amtstack.GetAuditLog(saveEntireAmtStateOk3);\r\n amtstack.GetMessageLog(saveEntireAmtStateOk4);\r\n}\r\n\r\n// Save the entire Intel AMT state\r\nfunction saveEntireAmtState() {\r\n // See if MicroLMS needs to be started\r\n if ((settings.hostname == \'127.0.0.1\') || (settings.hostname.toLowerCase() == \'localhost\')) {\r\n settings.noconsole = true;\r\n startLms().then(saveEntireAmtState2);\r\n } else {\r\n saveEntireAmtState2();\r\n }\r\n}\r\n\r\nfunction onWsmanProcessChanged(a, b) { var x = Math.floor((a * 100) / b); if (x < IntelAmtEntireStateProgress) { IntelAmtEntireStateProgress = x; console.log((100 - x) + \'%\'); } }\r\nfunction saveEntireAmtStateOk2(stack, name, responses, status) { if (status == 600) { console.log(\'ERROR: Unable to connect to Intel(R) AMT.\'); exit(2); } IntelAmtEntireState[\'wsmanenums\'] = responses; saveEntireAmtStateDone(); }\r\nfunction saveEntireAmtStateOk3(stack, messages, status) { if (status == 600) { console.log(\'ERROR: Unable to connect to Intel(R) AMT.\'); exit(2); } IntelAmtEntireState[\'auditlog\'] = messages; saveEntireAmtStateDone(); }\r\nfunction saveEntireAmtStateOk4(stack, messages, tag, status) { if (status == 600) { console.log(\'ERROR: Unable to connect to Intel(R) AMT.\'); exit(2); } IntelAmtEntireState[\'eventlog\'] = messages; saveEntireAmtStateDone(); }\r\n\r\n// Called when the entire state of Intel AMT is fetched.\r\nfunction saveEntireAmtStateDone() {\r\n if (--IntelAmtEntireStateCalls != 0) return;\r\n var out = fs.openSync(settings.output, \'w\');\r\n fs.writeSync(out, Buffer.from(JSON.stringify(IntelAmtEntireState)));\r\n fs.closeSync(out);\r\n console.log(\'Done, results written to \' + settings.output + \'.\');\r\n exit(1);\r\n}\r\n\r\n\r\n//\r\n// FETCH ALL INTEL AMT MEI STATE\r\n//\r\n\r\n// Get Intel AMT information using MEI\r\n// TODO: If this call is called many time at once, it\'s going to cause issues.\r\nvar getAmtInfoFetching = null;\r\nvar getAmtInfoFetchingTimer = null;\r\nfunction getAmtInfo(func, tag) {\r\n if (amtMei == null) { if (func != null) { func(null, tag); } return; }\r\n if (getAmtInfoFetching != null) { getAmtInfoFetching.push({ f: func, t: tag }); return; }\r\n getAmtInfoFetching = [{ f: func, t: tag }];\r\n amtMeiTmpState = { Flags: 0, TrustedHashes: [] }; // Flags: 1=EHBC, 2=CCM, 4=ACM\r\n getAmtInfoFetchingTimer = setTimeout(function () {\r\n // MEI failed to respond, break out and reset everthing.\r\n for (var i in getAmtInfoFetching) { if (getAmtInfoFetching[i].f != null) { getAmtInfoFetching[i].f(amtMeiTmpState, getAmtInfoFetching[i].t); } }\r\n getAmtInfoFetching = null;\r\n getAmtInfoFetchingTimer = null;\r\n var amtMeiModule, amtMei;\r\n try { amtMeiModule = require(\'amt-mei\'); amtMei = new amtMeiModule(); } catch (ex) { console.log(ex); exit(1); return; }\r\n amtMei.on(\'error\', function (e) { console.log(\'ERROR: \' + e); exit(1); return; });\r\n }, 3000);\r\n amtMei.getProtocolVersion(function (result) { if (result != null) { amtMeiTmpState.MeiVersion = result; } });\r\n amtMei.getVersion(function (val) {\r\n amtMeiTmpState.Versions = {};\r\n if (val != null) {\r\n for (var version in val.Versions) { amtMeiTmpState.Versions[val.Versions[version].Description] = val.Versions[version].Version; }\r\n amtMei.getProvisioningMode(function (result) { if (result != null) { amtMeiTmpState.ProvisioningMode = result.mode; } });\r\n amtMei.getProvisioningState(function (result) { if (result != null) { amtMeiTmpState.ProvisioningState = result.state; } });\r\n amtMei.getEHBCState(function (result) { if ((result != null) && (result.EHBC == true)) { amtMeiTmpState.Flags += 1; } });\r\n amtMei.getControlMode(function (result) { if (result != null) { if (result.controlMode == 1) { amtMeiTmpState.Flags += 2; } if (result.controlMode == 2) { amtMeiTmpState.Flags += 4; } } });\r\n //amtMei.getMACAddresses(function (result) { if (result != null) { amtMeiTmpState.mac = result; } });\r\n amtMei.getDnsSuffix(function (result) { if (result != null) { amtMeiTmpState.dns = result; } });\r\n amtMei.getHashHandles(function (handles) {\r\n exitOnCount = handles.length;\r\n for (var i = 0; i < handles.length; ++i) {\r\n amtMei.getCertHashEntry(handles[i], function (result) {\r\n amtMeiTmpState.TrustedHashes.push({ Active: result.isActive, Default: result.isDefault, HashAlgorithm: result.hashAlgorithm, Name: result.name, Hash: result.certificateHash });\r\n if (--exitOnCount == 0) {\r\n amtMeiTmpState.Notifications = lmsNotifications; amtMeiState = amtMeiTmpState;\r\n for (var i in getAmtInfoFetching) { if (getAmtInfoFetching[i].f != null) { getAmtInfoFetching[i].f(amtMeiTmpState, getAmtInfoFetching[i].t); } }\r\n getAmtInfoFetching = null;\r\n clearTimeout(getAmtInfoFetchingTimer);\r\n getAmtInfoFetchingTimer = null;\r\n }\r\n });\r\n }\r\n });\r\n } else {\r\n amtMeiState = amtMeiTmpState;\r\n amtMeiState.ProvisioningMode = -858993460;\r\n amtMeiState.TrustedHashes = {};\r\n amtMeiState.Notifications = lmsNotifications;\r\n //console.log(\'getAmtInfo3\', JSON.stringify(amtMeiState));\r\n if (func != null) { func(amtMeiState, tag); }\r\n }\r\n });\r\n}\r\n\r\n\r\n//\r\n// MicroLMS\r\n//\r\n\r\nvar lmsControlSockets = {};\r\nvar lmsControlSocketsNextId = 1;\r\nvar lmsNotifications = [];\r\nvar amtLms = null;\r\nvar promise = require(\'promise\');\r\n\r\nfunction startLms(func, lmscommander, tag) {\r\n var ret = new promise(function (res, rej) { this._res = res; this._rej = rej; });\r\n var lme_heci = null\r\n try { lme_heci = require(\'amt-lme\'); } catch (ex) { }\r\n if (lme_heci == null) { if (func != null) { func(0, tag); } this.promise._res(); return; }\r\n\r\n //var amtLms = null;\r\n var http = require(\'http\');\r\n\r\n console.log(\'Setting up MEI...\');\r\n try { amtMeiModule = require(\'amt-mei\'); amtMei = new amtMeiModule(); } catch (ex) { console.log(ex); exit(1); return; }\r\n amtMei.on(\'error\', function (e) { console.log(\'ERROR: \' + e); exit(1); return; });\r\n //console.log("PTHI Connected.");\r\n\r\n console.log(\'Setting up LME...\');\r\n try { amtLms = new lme_heci({ debug: settings.lmsdebug }); } catch (ex) { if (func != null) { func(0, tag); } return; }\r\n amtLms.promise = ret;\r\n amtLms.on(\'error\', function (e) {\r\n //console.log(\'LME connection failed\', e);\r\n if (lmscommander === true) { //settings.noconsole !== true) {\r\n startMeshCommanderLms();\r\n //console.log("LMS started, MeshCommander on HTTP/16994.");\r\n tempTimer = setTimeout(function () { delete tempTimer; setupMeiOsAdmin(func, 2, tag); }, 100);\r\n } else {\r\n //console.log(\'LME connection failed: \' + JSON.stringify(e));\r\n tempTimer = setTimeout(function () { delete tempTimer; setupMeiOsAdmin(func, 0, tag); }, 100);\r\n }\r\n this.promise._res();\r\n });\r\n amtLms.on(\'notify\', function (data, options, str, code) {\r\n if (code == \'iAMT0052-3\') {\r\n kvmGetData();\r\n } else if (str != null) {\r\n var notify = { date: Date.now(), str: str, code: code };\r\n lmsNotifications.push(notify);\r\n while (lmsNotifications.length > 100) { lmsNotifications.shift(); }\r\n var notifyBuf = Buffer.concat([Buffer.from(\'0900\', \'hex\'), Buffer.from(JSON.stringify(notify))]) // Add a notification\r\n for (var i in lmsControlSockets) { lmsControlSockets[i].write(notifyBuf); }\r\n }\r\n });\r\n //console.log(\'LME Connecting...\');\r\n amtLms.on(\'bind\', function (mapping) {\r\n if (mapping[16992]) { this.removeAllListeners(\'bind\'); } else { return; }\r\n //console.log(\'LMS Bounded\');\r\n amtLms.connected = true;\r\n this.promise._res();\r\n\r\n //console.log("LME Connected.");\r\n if (settings.noconsole !== true) {\r\n startMeshCommanderLms();\r\n //console.log("LMS started, MeshCommander on HTTP/16994.");\r\n tempTimer = setTimeout(function () { delete tempTimer; setupMeiOsAdmin(func, 2, tag); }, 100);\r\n //console.logReferenceCount(tempTimer);\r\n } else {\r\n //console.log("LMS started.");\r\n tempTimer = setTimeout(function () { delete tempTimer; setupMeiOsAdmin(func, 1, tag); }, 100);\r\n //console.logReferenceCount(tempTimer);\r\n }\r\n\r\n });\r\n return (ret);\r\n}\r\n\r\nfunction startMeshCommanderLms() {\r\n\r\n amtLms.meshCommander = http.createServer();\r\n amtLms.meshCommander.listen(16994);\r\n amtLms.meshCommander.on(\'upgrade\', function (req, socket, head) {\r\n //console.log("WebSocket for " + req.url.split(\'?\')[0]);\r\n switch (req.url.split(\'?\')[0]) {\r\n case \'/lms.ashx\': // MeshCommander control channel (PTHI)\r\n socket.ws = socket.upgradeWebSocket();\r\n socket.ws.on(\'data\', processLmsControlData);\r\n socket.ws.on(\'end\', function () { if (lmsControlSockets[this.id]) { delete lmsControlSockets[this.id]; /*console.log(\'removeControl\', JSON.stringify(lmsControlSockets));*/ } });\r\n var id = lmsControlSocketsNextId++;\r\n lmsControlSockets[id] = socket.ws;\r\n socket.ws.id = id;\r\n //socket.ws.write(Buffer.concat([Buffer.from(\'0900\', \'hex\'), Buffer.from(JSON.stringify(lmsNotifications))])); // Send out full list of notifications\r\n //console.log(\'addControl\', JSON.stringify(lmsControlSockets));\r\n break;\r\n case \'/webrelay.ashx\': // MeshCommander data channel (LME)\r\n socket.ws = socket.upgradeWebSocket();\r\n if (amtLms.connected == true) {\r\n // Route traffic directly into MicroLMS\r\n amtLms.bindDuplexStream(socket.ws, \'IPv4\', 16992);\r\n } else {\r\n // Route traffic to real LMS service\r\n var net = require(\'net\');\r\n socket.relay = net.connect({ host: \'127.0.0.1\', port: 16992 })\r\n socket.relay.on(\'connect\', function () {\r\n socket.ws.on(\'data\', function (data) { socket.relay.write(data); });\r\n socket.ws.on(\'end\', function () { socket.relay.end(); });\r\n });\r\n socket.relay.on(\'data\', function (data) { socket.ws.write(data); });\r\n socket.relay.on(\'close\', function () { socket.ws.end(); });\r\n }\r\n break;\r\n default:\r\n socket.end();\r\n break;\r\n }\r\n });\r\n amtLms.meshCommander.on(\'request\', function (req, rsp) {\r\n //console.log("WebRequest for " + req.url.split(\'?\')[0]);\r\n switch (req.url.split(\'?\')[0]) {\r\n case \'/\': // Serve MeshCommander Web Application for LMS\r\n var lmscommander = null;\r\n try { lmscommander = fs.readFileSync(\'lmscommander.htm\'); } catch (e) { }\r\n if (lmscommander != null) {\r\n rsp.writeHead(200, \'OK\', { Server: \'JSLMS\', \'Cache-Control\': \'max-age=0, no-cache\', \'X-Frame-Options\': \'DENY\', \'Content-Type\': \'text/html\', \'Transfer-Encoding\': \'chunked\' });\r\n rsp.end(lmscommander);\r\n } else {\r\n rsp.writeHead(200, \'OK\', { Server: \'JSLMS\', \'Cache-Control\': \'max-age=0, no-cache\', \'X-Frame-Options\': \'DENY\', \'Content-Type\': \'text/html\', \'Content-Encoding\': \'gzip\', \'Transfer-Encoding\': \'chunked\', ETag: _IntelAmtWebApp_etag });\r\n rsp.end(Buffer.from(_IntelAmtWebApp, "base64"));\r\n }\r\n break;\r\n default: // Unknown request\r\n rsp.statusCode = 404;\r\n rsp.statusMessage = "Not Found";\r\n rsp.end();\r\n break;\r\n }\r\n\r\n });\r\n}\r\n\r\nfunction setupMeiOsAdmin(func, state, tag) {\r\n if (amtMei == null) {\r\n if (func) { func(state, tag); }\r\n } else {\r\n amtMei.getLocalSystemAccount(function (x) {\r\n if ((x == null) || (x.user == null) || (x.pass == null)) { if (func) { func(state, tag); } return; } // No OsAdmin, stop here.\r\n var transport = require(\'amt-wsman-duk\');\r\n var wsman = require(\'amt-wsman\');\r\n var amt = require(\'amt\');\r\n oswsstack = new wsman(transport, \'127.0.0.1\', 16992, x.user, x.pass, false);\r\n osamtstack = new amt(oswsstack);\r\n if (func) { func(state, tag); }\r\n\r\n //var AllWsman = "CIM_SoftwareIdentity,IPS_SecIOService,IPS_ScreenSettingData,IPS_ProvisioningRecordLog,IPS_HostBasedSetupService,IPS_HostIPSettings,IPS_IPv6PortSettings".split(\',\');\r\n //osamtstack.BatchEnum(null, AllWsman, startLmsWsmanResponse, null, true);\r\n //*************************************\r\n\r\n // Setup KVM data channel if this is Intel AMT 12 or above\r\n amtMei.getVersion(function (x) {\r\n var amtver = null;\r\n try { for (var i in x.Versions) { if (x.Versions[i].Description == \'AMT\') amtver = parseInt(x.Versions[i].Version.split(\'.\')[0]); } } catch (e) { }\r\n if ((amtver != null) && (amtver >= 12)) {\r\n kvmGetData(\'skip\'); // Clear any previous data, this is a dummy read to about handling old data.\r\n tempTimer = setInterval(function () { kvmGetData(); }, 2000); // Start polling for KVM data.\r\n kvmSetData(JSON.stringify({ action: \'restart\', ver: 1 })); // Send a restart command to advise the console if present that MicroLMS just started.\r\n }\r\n });\r\n });\r\n }\r\n}\r\n\r\nfunction kvmGetData(tag) {\r\n osamtstack.IPS_KVMRedirectionSettingData_DataChannelRead(kvmDataGetResponse, tag);\r\n}\r\n\r\nfunction kvmDataGetResponse(stack, name, response, status, tag) {\r\n if ((tag != \'skip\') && (status == 200) && (response.Body.ReturnValue == 0)) {\r\n var val = null;\r\n try { val = Buffer.from(response.Body.DataMessage, \'base64\').toString(); } catch (e) { return }\r\n if (val != null) { kvmProcessData(response.Body.RealmsBitmap, response.Body.MessageId, val); }\r\n }\r\n}\r\n\r\nvar webRtcDesktop = null;\r\nfunction kvmProcessData(realms, messageId, val) {\r\n var data = null;\r\n try { data = JSON.parse(val) } catch (e) { }\r\n if ((data != null) && (data.action)) {\r\n if (data.action == \'present\') { kvmSetData(JSON.stringify({ action: \'present\', ver: 1, platform: process.platform })); }\r\n if (data.action == \'offer\') {\r\n webRtcDesktop = {};\r\n var rtc = require(\'ILibWebRTC\');\r\n webRtcDesktop.webrtc = rtc.createConnection();\r\n webRtcDesktop.webrtc.on(\'connected\', function () { });\r\n webRtcDesktop.webrtc.on(\'disconnected\', function () { webRtcCleanUp(); });\r\n webRtcDesktop.webrtc.on(\'dataChannel\', function (rtcchannel) {\r\n webRtcDesktop.rtcchannel = rtcchannel;\r\n var kvmmodule = require(\'meshDesktop\');\r\n webRtcDesktop.kvm = kvmmodule.getRemoteDesktopStream();\r\n webRtcDesktop.kvm.pipe(webRtcDesktop.rtcchannel, { dataTypeSkip: 1, end: false });\r\n webRtcDesktop.rtcchannel.on(\'end\', function () { webRtcCleanUp(); });\r\n webRtcDesktop.rtcchannel.on(\'data\', function (x) { kvmCtrlData(this, x); });\r\n webRtcDesktop.rtcchannel.pipe(webRtcDesktop.kvm, { dataTypeSkip: 1, end: false });\r\n //webRtcDesktop.kvm.on(\'end\', function () { console.log(\'WebRTC DataChannel closed2\'); webRtcCleanUp(); });\r\n //webRtcDesktop.rtcchannel.on(\'data\', function (data) { console.log(\'WebRTC data: \' + data); });\r\n });\r\n kvmSetData(JSON.stringify({ action: \'answer\', ver: 1, sdp: webRtcDesktop.webrtc.setOffer(data.sdp) }));\r\n }\r\n }\r\n}\r\n\r\n// Polyfill path.join\r\nvar path = {\r\n join: function () {\r\n var x = [];\r\n for (var i in arguments) {\r\n var w = arguments[i];\r\n if (w != null) {\r\n while (w.endsWith(\'/\') || w.endsWith(\'\\\\\')) { w = w.substring(0, w.length - 1); }\r\n if (i != 0) {\r\n while (w.startsWith(\'/\') || w.startsWith(\'\\\\\')) { w = w.substring(1); }\r\n }\r\n x.push(w);\r\n }\r\n }\r\n if (x.length == 0) return \'/\';\r\n return x.join(\'/\');\r\n }\r\n};\r\n\r\n// Get a formated response for a given directory path\r\nfunction getDirectoryInfo(reqpath) {\r\n var response = { path: reqpath, dir: [] };\r\n if (((reqpath == undefined) || (reqpath == \'\')) && (process.platform == \'win32\')) {\r\n // List all the drives in the root, or the root itself\r\n var results = null;\r\n try { results = fs.readDrivesSync(); } catch (e) { } // TODO: Anyway to get drive total size and free space? Could draw a progress bar.\r\n //console.log(\'a\', objToString(results, 0, \' \'));\r\n if (results != null) {\r\n for (var i = 0; i < results.length; ++i) {\r\n var drive = { n: results[i].name, t: 1 };\r\n if (results[i].type == \'REMOVABLE\') { drive.dt = \'removable\'; } // TODO: See if this is USB/CDROM or something else, we can draw icons.\r\n response.dir.push(drive);\r\n }\r\n }\r\n } else {\r\n // List all the files and folders in this path\r\n if (reqpath == \'\') { reqpath = \'/\'; }\r\n var xpath = path.join(reqpath, \'*\');\r\n var results = null;\r\n\r\n try { results = fs.readdirSync(xpath); } catch (e) { }\r\n if (results != null) {\r\n for (var i = 0; i < results.length; ++i) {\r\n if ((results[i] != \'.\') && (results[i] != \'..\')) {\r\n var stat = null, p = path.join(reqpath, results[i]);\r\n try { stat = fs.statSync(p); } catch (e) { } // TODO: Get file size/date\r\n if ((stat != null) && (stat != undefined)) {\r\n if (stat.isDirectory() == true) {\r\n response.dir.push({ n: results[i], t: 2, d: stat.mtime });\r\n } else {\r\n response.dir.push({ n: results[i], t: 3, s: stat.size, d: stat.mtime });\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n return response;\r\n}\r\n\r\n// Process KVM control channel data\r\nfunction kvmCtrlData(channel, cmd) {\r\n if (cmd.length > 0 && cmd.charCodeAt(0) != 123) {\r\n // This is upload data\r\n if (this.fileupload != null) {\r\n cmd = Buffer.from(cmd, \'base64\');\r\n var header = cmd.readUInt32BE(0);\r\n if ((header == 0x01000000) || (header == 0x01000001)) {\r\n fs.writeSync(this.fileupload.fp, cmd.slice(4));\r\n channel.write({ action: \'upload\', sub: \'ack\', reqid: this.fileupload.reqid });\r\n if (header == 0x01000001) { fs.closeSync(this.fileupload.fp); this.fileupload = null; } // Close the file\r\n }\r\n }\r\n return;\r\n }\r\n //console.log(\'KVM Ctrl Data\', cmd);\r\n\r\n try { cmd = JSON.parse(cmd); } catch (ex) { console.error(\'Invalid JSON: \' + cmd); return; }\r\n if ((cmd.path != null) && (process.platform != \'win32\') && (cmd.path[0] != \'/\')) { cmd.path = \'/\' + cmd.path; } // Add \'/\' to paths on non-windows\r\n switch (cmd.action) {\r\n case \'ping\': {\r\n // This is a keep alive\r\n channel.write({ action: \'pong\' });\r\n break;\r\n }\r\n case \'ls\': {\r\n /*\r\n // Close the watcher if required\r\n var samepath = ((this.httprequest.watcher != undefined) && (cmd.path == this.httprequest.watcher.path));\r\n if ((this.httprequest.watcher != undefined) && (samepath == false)) {\r\n //console.log(\'Closing watcher: \' + this.httprequest.watcher.path);\r\n //this.httprequest.watcher.close(); // TODO: This line causes the agent to crash!!!!\r\n delete this.httprequest.watcher;\r\n }\r\n */\r\n\r\n // Send the folder content to the browser\r\n var response = getDirectoryInfo(cmd.path);\r\n if (cmd.reqid != undefined) { response.reqid = cmd.reqid; }\r\n channel.write(response);\r\n\r\n /*\r\n // Start the directory watcher\r\n if ((cmd.path != \'\') && (samepath == false)) {\r\n var watcher = fs.watch(cmd.path, onFileWatcher);\r\n watcher.tunnel = this.httprequest;\r\n watcher.path = cmd.path;\r\n this.httprequest.watcher = watcher;\r\n //console.log(\'Starting watcher: \' + this.httprequest.watcher.path);\r\n }\r\n */\r\n break;\r\n }\r\n case \'mkdir\': {\r\n // Create a new empty folder\r\n fs.mkdirSync(cmd.path);\r\n break;\r\n }\r\n case \'rm\': {\r\n // Remove many files or folders\r\n for (var i in cmd.delfiles) {\r\n var fullpath = path.join(cmd.path, cmd.delfiles[i]);\r\n try { fs.unlinkSync(fullpath); } catch (e) { console.log(e); }\r\n }\r\n break;\r\n }\r\n case \'rename\': {\r\n // Rename a file or folder\r\n var oldfullpath = path.join(cmd.path, cmd.oldname);\r\n var newfullpath = path.join(cmd.path, cmd.newname);\r\n try { fs.renameSync(oldfullpath, newfullpath); } catch (e) { console.log(e); }\r\n break;\r\n }\r\n case \'download\': {\r\n // Download a file, to browser\r\n var sendNextBlock = 0;\r\n if (cmd.sub == \'start\') { // Setup the download\r\n if (this.filedownload != null) { channel.write({ action: \'download\', sub: \'cancel\', id: this.filedownload.id }); delete this.filedownload; }\r\n this.filedownload = { id: cmd.id, path: cmd.path, ptr: 0 }\r\n try { this.filedownload.f = fs.openSync(this.filedownload.path, \'rbN\'); } catch (e) { channel.write({ action: \'download\', sub: \'cancel\', id: this.filedownload.id }); delete this.filedownload; }\r\n if (this.filedownload) { channel.write({ action: \'download\', sub: \'start\', id: cmd.id }); }\r\n } else if ((this.filedownload != null) && (cmd.id == this.filedownload.id)) { // Download commands\r\n if (cmd.sub == \'startack\') { sendNextBlock = 8; } else if (cmd.sub == \'stop\') { delete this.filedownload; } else if (cmd.sub == \'ack\') { sendNextBlock = 1; }\r\n }\r\n // Send the next download block(s)\r\n while (sendNextBlock > 0) {\r\n sendNextBlock--;\r\n var buf = Buffer.alloc(4096);\r\n var len = fs.readSync(this.filedownload.f, buf, 4, 4092, null);\r\n this.filedownload.ptr += len;\r\n if (len < 4092) { buf.writeInt32BE(0x01000001, 0); fs.closeSync(this.filedownload.f); delete this.filedownload; sendNextBlock = 0; } else { buf.writeInt32BE(0x01000000, 0); }\r\n channel.write(buf.slice(0, len + 4).toString(\'base64\')); // Write as Base64\r\n }\r\n break;\r\n }\r\n case \'upload\': {\r\n // Upload a file, from browser\r\n if (cmd.sub == \'start\') { // Start the upload\r\n if (this.fileupload != null) { fs.closeSync(this.fileupload.fp); }\r\n if (!cmd.path || !cmd.name) break;\r\n this.fileupload = { reqid: cmd.reqid };\r\n var filepath = path.join(cmd.path, cmd.name);\r\n try { this.fileupload.fp = fs.openSync(filepath, \'wbN\'); } catch (e) { }\r\n if (this.fileupload.fp) { channel.write({ action: \'upload\', sub: \'start\', reqid: this.fileupload.reqid }); } else { this.fileupload = null; channel.write({ action: \'upload\', sub: \'error\', reqid: this.fileupload.reqid }); }\r\n }\r\n else if (cmd.sub == \'cancel\') { // Stop the upload\r\n if (this.fileupload != null) { fs.closeSync(this.fileupload.fp); this.fileupload = null; }\r\n }\r\n break;\r\n }\r\n case \'copy\': {\r\n // Copy a bunch of files from scpath to dspath\r\n for (var i in cmd.names) {\r\n var sc = path.join(cmd.scpath, cmd.names[i]), ds = path.join(cmd.dspath, cmd.names[i]);\r\n if (sc != ds) { try { fs.copyFileSync(sc, ds); } catch (e) { } }\r\n }\r\n break;\r\n }\r\n case \'move\': {\r\n // Move a bunch of files from scpath to dspath\r\n for (var i in cmd.names) {\r\n var sc = path.join(cmd.scpath, cmd.names[i]), ds = path.join(cmd.dspath, cmd.names[i]);\r\n if (sc != ds) { try { fs.copyFileSync(sc, ds); fs.unlinkSync(sc); } catch (e) { } }\r\n }\r\n break;\r\n }\r\n default:\r\n // Unknown action, ignore it.\r\n break;\r\n }\r\n}\r\n\r\nfunction webRtcCleanUp() {\r\n if (webRtcDesktop == null) return;\r\n if (webRtcDesktop.rtcchannel) {\r\n try { webRtcDesktop.rtcchannel.close(); } catch (e) { }\r\n try { webRtcDesktop.rtcchannel.removeAllListeners(\'data\'); } catch (e) { }\r\n try { webRtcDesktop.rtcchannel.removeAllListeners(\'end\'); } catch (e) { }\r\n delete webRtcDesktop.rtcchannel;\r\n }\r\n if (webRtcDesktop.webrtc) {\r\n try { webRtcDesktop.webrtc.close(); } catch (e) { }\r\n try { webRtcDesktop.webrtc.removeAllListeners(\'connected\'); } catch (e) { }\r\n try { webRtcDesktop.webrtc.removeAllListeners(\'disconnected\'); } catch (e) { }\r\n try { webRtcDesktop.webrtc.removeAllListeners(\'dataChannel\'); } catch (e) { }\r\n delete webRtcDesktop.webrtc;\r\n }\r\n if (webRtcDesktop.kvm) {\r\n try { webRtcDesktop.kvm.end(); } catch (e) { }\r\n delete webRtcDesktop.kvm;\r\n }\r\n webRtcDesktop = null;\r\n}\r\n\r\nfunction kvmSetData(x) {\r\n osamtstack.IPS_KVMRedirectionSettingData_DataChannelWrite(Buffer.from(x).toString(\'base64\'), function () { });\r\n}\r\n\r\nfunction startLmsWsmanResponse(stack, name, responses, status) {\r\n if (status == 600) { console.log("ERROR: Unable to connect to Intel(R) AMT."); }\r\n else if (status != 200) { console.log("ERROR: Unable to get object from Intel(R) AMT, status = " + status + "."); }\r\n else {\r\n //console.log(JSON.stringify(responses), status);\r\n var amtlogicalelements = responses[\'CIM_SoftwareIdentity\'].responses;\r\n if (amtlogicalelements.length > 0) {\r\n var v = getInstance(amtlogicalelements, \'AMT\')[\'VersionString\'];\r\n amtversion = parseInt(v.split(\'.\')[0]);\r\n amtversionmin = parseInt(v.split(\'.\')[1]);\r\n //console.log(amtversion, amtversionmin);\r\n }\r\n }\r\n}\r\n\r\n\r\n// Process commands in the LMS control channel\r\n// Command 9 is add a notification.\r\nfunction processLmsControlData(data) {\r\n if (data.length < 2) return;\r\n var cmdid = data.readUInt16LE(0);\r\n switch (cmdid) {\r\n case 1: // Request basic Intel AMT information (CMD = 1)\r\n { getAmtInfo(function (meinfo, socket) { meinfo.LoginMode = 2; socket.write(Buffer.concat([Buffer.from(\'0100\', \'hex\'), Buffer.from(JSON.stringify(meinfo))])); }, this); break; }\r\n case 2: // Intel AMT MEI Unprovision (CMD = 2)\r\n { if (data.length < 6) break; amtMei.unprovision(data.readUInt32LE(2), function (status, socket) { var data = Buffer.alloc(6); data.writeUInt16LE(2, 0); data.writeUInt32LE(status, 2); socket.write(data); }, this); break; }\r\n case 3: // Intel AMT MEI GetLocalSystemAccount (CMD = 3)\r\n { amtMei.getLocalSystemAccount(function (account, socket) { socket.write(Buffer.concat([Buffer.from(\'030000000000\', \'hex\'), account.raw])); }, this); break; }\r\n case 4: // Instruct Intel AMT to start remote configuration (CMD = 4)\r\n { amtMei.startConfiguration(function (status, socket) { var data = Buffer.alloc(6); data.writeUInt16LE(7, 0); data.writeUInt32LE(status, 2); socket.write(data); }, this); break; }\r\n case 5: // Instruct Intel AMT to stop remote configuration (CMD = 5)\r\n { amtMei.stopConfiguration(function (status, socket) { var data = Buffer.alloc(6); data.writeUInt16LE(7, 0); data.writeUInt32LE(status, 2); socket.write(data); }, this); break; }\r\n case 6: // Instruct Intel AMT connect CIRA (CMD = 6)\r\n { amtMei.openUserInitiatedConnection(function (status, socket) { var data = Buffer.alloc(6); data.writeUInt16LE(7, 0); data.writeUInt32LE(status, 2); socket.write(data); }, this); break; }\r\n case 7: // Instruct Intel AMT disconnect CIRA (CMD = 7)\r\n { amtMei.closeUserInitiatedConnection(function (status, socket) { var data = Buffer.alloc(6); data.writeUInt16LE(7, 0); data.writeUInt32LE(status, 2); socket.write(data); }, this); break; }\r\n case 8: // Get Intel AMT CIRA State (CMD = 8)\r\n { amtMei.getRemoteAccessConnectionStatus(function (state, socket) { var data = Buffer.alloc(6); data.writeUInt16LE(8, 0); data.writeUInt32LE(state.status, 2); socket.write(Buffer.concat([data, state.raw])); }, this); break; }\r\n default:\r\n // Unknown action, ignore it.\r\n break;\r\n }\r\n}\r\n\r\n\r\n//\r\n// MeshCentral TCP port router\r\n//\r\n\r\nfunction startRouter() {\r\n // Start by requesting a login token, this is needed because of 2FA and check that we have correct credentials from the start\r\n var options;\r\n try {\r\n // Parse the URL\r\n options = http.parseUri(settings.serverurl.split(\'meshrelay.ashx\').join(\'control.ashx\'));\r\n\r\n // Figure out the 2FA token to use if any\r\n var xtoken = null;\r\n if (settings.emailtoken) { xtoken = \'**email**\'; }\r\n else if (settings.smstoken) { xtoken = \'**sms**\'; }\r\n else if (settings.token != null) { xtoken = settings.token; }\r\n\r\n // Complete the URL and add a x-meshauth header if needed\r\n var xurlargs = [];\r\n if (settings.serverid == null) {\r\n // Authenticate the server using HTTPS cert hash\r\n if (settings.authcookie != null) {\r\n xurlargs.push(\'auth=\' + settings.authcookie);\r\n if (xtoken != null) { xurlargs.push(\'token=\' + xtoken); }\r\n } else {\r\n if (xtoken != null) {\r\n options.headers = { \'x-meshauth\': Buffer.from(settings.username, \'binary\').toString(\'base64\') + \',\' + Buffer.from(settings.password, \'binary\').toString(\'base64\') + \',\' + Buffer.from(xtoken, \'binary\').toString(\'base64\') };\r\n } else {\r\n options.headers = { \'x-meshauth\': Buffer.from(settings.username, \'binary\').toString(\'base64\') + \',\' + Buffer.from(settings.password, \'binary\').toString(\'base64\') };\r\n }\r\n }\r\n } else { options.headers = { \'x-meshauth\': \'*\' }; } // Request inner authentication\r\n if (settings.loginkey) { xurlargs.push(\'key=\' + settings.loginkey); }\r\n if (xurlargs.length > 0) { options.path += \'?\' + xurlargs.join(\'&\'); }\r\n } catch (e) { console.log("Unable to parse \\"serverUrl\\"."); process.exit(1); return; }\r\n\r\n options.checkServerIdentity = onVerifyServer;\r\n options.rejectUnauthorized = false;\r\n settings.websocket = http.request(options);\r\n settings.websocket.upgrade = OnServerWebSocket;\r\n settings.websocket.on(\'error\', function (e) { console.log("ERROR: " + JSON.stringify(e)); });\r\n settings.websocket.end();\r\n}\r\n\r\nfunction OnServerWebSocket(msg, s, head) {\r\n settings.webchannel = s;\r\n s.on(\'data\', function (msg) {\r\n var command = JSON.parse(msg);\r\n switch (command.action) {\r\n case \'close\': {\r\n if (command.cause == \'noauth\') {\r\n if (command.msg == \'tokenrequired\') {\r\n if (command.email2fasent === true) {\r\n console.log("Login token email sent.");\r\n } else if ((command.email2fa === true) && (command.sms2fa === true)) {\r\n console.log("Login token required, use --token [token], or --emailtoken, --smstoken get a token.");\r\n } else if (command.sms2fa === true) {\r\n console.log("Login token required, use --token [token], or --smstoken get a token.");\r\n } else if (command.email2fa === true) {\r\n console.log("Login token required, use --token [token], or --emailtoken get a token.");\r\n } else {\r\n console.log("Login token required, use --token [token].");\r\n }\r\n } else { console.log("Invalid username or password."); }\r\n } else { console.log("Server disconnected: " + command.msg); }\r\n process.exit(1);\r\n return;\r\n }\r\n case \'serverinfo\': {\r\n s.write("{\\"action\\":\\"authcookie\\"}"); // Ask for our first authentication cookie\r\n break;\r\n }\r\n case \'authcookie\': {\r\n if (settings.acookie == null) {\r\n settings.acookie = command.cookie;\r\n settings.rcookie = command.rcookie;\r\n settings.renewCookieTimer = setInterval(function () { settings.webchannel.write("{\\"action\\":\\"authcookie\\"}"); }, 600000); // Ask for new cookie every 10 minutes\r\n startRouterEx();\r\n } else {\r\n settings.acookie = command.cookie;\r\n settings.rcookie = command.rcookie;\r\n }\r\n break;\r\n }\r\n case \'serverAuth\': {\r\n // Check that the server certificate matches the serverid we have\r\n var hasher = require(\'SHA384Stream\').create();\r\n var certDer = Buffer.from(command.cert, \'base64\');\r\n var cert = require(\'tls\').loadCertificate({ der: certDer });\r\n if (cert.getKeyHash().toString(\'hex\') != settings.serverid) { console.log("Unable to authenticate the server, invalid server identifier."); process.exit(1); return; }\r\n\r\n // Hash the signed data and verify the server signature\r\n var signDataHash = hasher.syncHash(Buffer.concat([Buffer.from(settings.serverAuthClientNonce, \'base64\'), Buffer.from(settings.meshServerTlsHash, \'hex\'), Buffer.from(command.nonce, \'base64\')]));\r\n if (require(\'RSA\').verify(require(\'RSA\').TYPES.SHA384, cert, signDataHash, Buffer.from(command.signature, \'base64\')) == false) { console.log("Unable to authenticate the server, invalid signature."); process.exit(1); return; }\r\n\r\n // Switch to using HTTPS TLS certificate for authentication\r\n delete settings.serverid;\r\n settings.serverhttpshash = settings.meshServerTlsHash;\r\n delete settings.meshServerTlsHash;\r\n\r\n // Figure out the 2FA token to use if any\r\n var xtoken = null;\r\n if (settings.emailtoken) { xtoken = \'**email**\'; }\r\n else if (settings.smstoken) { xtoken = \'**sms**\'; }\r\n else if (settings.token != null) { xtoken = settings.token; }\r\n\r\n // Authenticate the server using HTTPS cert hash\r\n if (settings.authcookie != null) {\r\n if (xtoken != null) {\r\n s.write("{\\"action\\":\\"userAuth\\",\\"auth\\":\\"" + settings.authcookie + "\\",\\"token\\":\\"" + xtoken + "\\"}");\r\n } else {\r\n s.write("{\\"action\\":\\"userAuth\\",\\"auth\\":\\"" + settings.authcookie + "\\"}");\r\n }\r\n } else {\r\n if (xtoken != null) {\r\n s.write("{\\"action\\":\\"userAuth\\",\\"username\\":\\"" + Buffer.from(settings.username, \'binary\').toString(\'base64\') + "\\",\\"password\\":\\"" + Buffer.from(settings.password, \'binary\').toString(\'base64\') + "\\",\\"token\\":\\"" + xtoken + "\\"}");\r\n } else {\r\n s.write("{\\"action\\":\\"userAuth\\",\\"username\\":\\"" + Buffer.from(settings.username, \'binary\').toString(\'base64\') + "\\",\\"password\\":\\"" + Buffer.from(settings.password, \'binary\').toString(\'base64\') + "\\"}");\r\n }\r\n }\r\n break;\r\n }\r\n }\r\n });\r\n s.on(\'error\', function () { console.log("Server connection error."); process.exit(1); return; });\r\n s.on(\'close\', function () { console.log("Server closed the connection."); process.exit(1); return; });\r\n\r\n // Perform inner server authentication\r\n if (settings.serverid != null) {\r\n settings.serverAuthClientNonce = require(\'EncryptionStream\').GenerateRandom(48).toString(\'base64\');\r\n s.write("{\\"action\\":\\"serverAuth\\",\\"cnonce\\":\\"" + settings.serverAuthClientNonce + "\\",\\"tlshash\\":\\"" + settings.meshServerTlsHash + "\\"}"); // Ask for server authentication\r\n }\r\n}\r\n\r\nfunction startRouterEx() {\r\n tcpserver = net.createServer(OnTcpClientConnected);\r\n tcpserver.on(\'error\', function (e) { console.log("ERROR: " + JSON.stringify(e)); exit(0); return; });\r\n try {\r\n tcpserver.listen(settings.localport, function () {\r\n // We started listening.\r\n if (settings.remotetarget == null) {\r\n console.log(\'Redirecting local port \' + settings.localport + \' to remote port \' + settings.remoteport + \'.\');\r\n } else {\r\n console.log(\'Redirecting local port \' + settings.localport + \' to \' + settings.remotetarget + \':\' + settings.remoteport + \'.\');\r\n }\r\n console.log("Press ctrl-c to exit.");\r\n\r\n // If settings has a "cmd", run it now.\r\n //process.exec("notepad.exe");\r\n });\r\n } catch (ex) { console.log("Unable to bind to local TCP port " + settings.localport + "."); exit(1); return; }\r\n}\r\n\r\n// Called when a TCP connect is received on the local port. Launch a tunnel.\r\nfunction OnTcpClientConnected(c) {\r\n try {\r\n // \'connection\' listener\r\n debug(1, "Client connected");\r\n c.on(\'end\', function () { disconnectTunnel(this, this.websocket, "Client closed"); });\r\n c.pause();\r\n var options;\r\n try {\r\n options = http.parseUri(settings.serverurl + \'?auth=\' + settings.acookie + \'&nodeid=\' + settings.remotenodeid + \'&tcpport=\' + settings.remoteport + (settings.remotetarget == null ? \'\' : \'&tcpaddr=\' + settings.remotetarget));\r\n } catch (e) { console.log("Unable to parse \\"serverUrl\\"."); process.exit(1); return; }\r\n options.checkServerIdentity = onVerifyServer;\r\n options.rejectUnauthorized = false;\r\n c.websocket = http.request(options);\r\n c.websocket.tcp = c;\r\n c.websocket.tunneling = false;\r\n c.websocket.upgrade = OnWebSocket;\r\n c.websocket.on(\'error\', function (e) { console.log("ERROR: " + JSON.stringify(e)); });\r\n c.websocket.end();\r\n } catch (e) { debug(2, e); }\r\n}\r\n\r\n// Disconnect both TCP & WebSocket connections and display a message.\r\nfunction disconnectTunnel(tcp, ws, msg) {\r\n if (ws != null) { try { ws.end(); } catch (e) { debug(2, e); } }\r\n if (tcp != null) { try { tcp.end(); } catch (e) { debug(2, e); } }\r\n debug(1, "Tunnel disconnected: " + msg);\r\n}\r\n\r\n// Called when the web socket gets connected\r\nfunction OnWebSocket(msg, s, head) {\r\n debug(1, "Websocket connected");\r\n s.on(\'data\', function (msg) {\r\n if (this.parent.tunneling == false) {\r\n msg = msg.toString();\r\n if ((msg == \'c\') || (msg == \'cr\')) {\r\n // Pipe the connection, but don\'t pipe text websocket frames into the TCP socket.\r\n this.parent.tunneling = true; this.pipe(this.parent.tcp, { dataTypeSkip: 1 }); this.parent.tcp.pipe(this); debug(1, "Tunnel active");\r\n } else if ((msg.length > 6) && (msg.substring(0, 6) == \'error:\')) {\r\n console.log(msg.substring(6));\r\n disconnectTunnel(this.tcp, this, msg.substring(6));\r\n }\r\n }\r\n });\r\n s.on(\'error\', function () { disconnectTunnel(this.tcp, this, \'Websocket error\'); });\r\n s.on(\'close\', function () { disconnectTunnel(this.tcp, this, \'Websocket closed\'); });\r\n s.parent = this;\r\n}\r\n\r\n// Try to discover the location of the mesh server\r\nfunction discoverMeshServer() { console.log("Looking for server..."); discoveryInterval = setInterval(discoverMeshServerOnce, 5000); discoverMeshServerOnce(); }\r\n\r\n// Try to discover the location of the mesh server only once\r\nfunction discoverMeshServerOnce() {\r\n var interfaces = os.networkInterfaces();\r\n for (var adapter in interfaces) {\r\n if (interfaces.hasOwnProperty(adapter)) {\r\n for (var i = 0; i < interfaces[adapter].length; ++i) {\r\n var addr = interfaces[adapter][i];\r\n multicastSockets[i] = dgram.createSocket({ type: (addr.family == \'IPv4\' ? \'udp4\' : \'udp6\') });\r\n multicastSockets[i].bind({ address: addr.address, exclusive: false });\r\n if (addr.family == \'IPv4\') {\r\n try {\r\n multicastSockets[i].addMembership(membershipIPv4);\r\n //multicastSockets[i].setMulticastLoopback(true);\r\n multicastSockets[i].once(\'message\', OnMulticastMessage);\r\n multicastSockets[i].send(settings.serverid, 16989, membershipIPv4);\r\n } catch (e) { }\r\n }\r\n }\r\n }\r\n }\r\n}\r\n\r\n// Called when a multicast packet is received\r\nfunction OnMulticastMessage(msg, rinfo) {\r\n var m = msg.toString().split(\'|\');\r\n if ((m.length == 3) && (m[0] == \'MeshCentral2\') && (m[1] == settings.serverid)) {\r\n settings.serverurl = m[2].replace(\'%s\', rinfo.address).replace(\'/agent.ashx\', \'/meshrelay.ashx\');\r\n console.log("Found server at " + settings.serverurl + ".");\r\n if (discoveryInterval != null) { clearInterval(discoveryInterval); discoveryInterval = null; }\r\n startRouter();\r\n }\r\n}\r\n\r\n\r\n//\r\n// PUSH MESHCOMMANDER INTO FIRMWARE\r\n//\r\n\r\nfunction nextStepStorageUpload() {\r\n debug(3, "nextStepStorageUpload");\r\n getAmtStorage(function (statusCode, data) {\r\n if (statusCode == 200) {\r\n debug(2, "getAmtStorage: " + JSON.stringify(data, null, 2));\r\n if ((data[\'content\'] != null) && (data[\'content\'][\'index.htm\'] != null)) { nextStepStorageUpload3(\'index.htm\'); }\r\n else if ((data[\'content\'] != null) && (data[\'content\'][\'logon.htm\'] != null)) { nextStepStorageUpload3(\'logon.htm\'); }\r\n else if ((data[\'content\'] != null) && (data[\'content\'][\'logon.htm\'] != null)) { nextStepStorageUpload3(\'logon.htm\'); }\r\n else { nextStepStorageUpload2(\'index.htm\', null); }\r\n } else {\r\n console.log("Unable to read storage state.");\r\n exit();\r\n return;\r\n }\r\n });\r\n}\r\n\r\nfunction nextStepStorageUpload2(uploadName, linkName) {\r\n debug(3, "nextStepStorageUpload2");\r\n if (settings.webapp == null) { console.log("Done."); exit(); return; } else {\r\n console.log("Uploading MeshCommander...");\r\n pushToStorage(uploadName, linkName, Buffer.from(settings.webapp, \'base64\'), function (statusCode) {\r\n if (statusCode == 500) { console.log("Error, check that computer is powered on."); exit(); return; }\r\n if (statusCode != 200) {\r\n if (uploadName == \'index.htm\') {\r\n nextStepStorageUpload2(\'mesh/commander/console\', \'MeshCommander\');\r\n } else {\r\n console.log("Unable to upload MeshCommander, status = " + statusCode + "."); exit(); return;\r\n }\r\n } else {\r\n console.log("Verifying MeshCommander...");\r\n verifyStorage(uploadName, Buffer.from(settings.webapp, \'base64\'), function (verified) {\r\n if (verified == true) { console.log("Done."); } else { console.log("MeshCommander verification failed."); }\r\n exit(); return;\r\n });\r\n }\r\n });\r\n }\r\n}\r\n\r\nfunction nextStepStorageUpload3(deleteName) {\r\n console.log("Deleting " + deleteName + " from storage...");\r\n deleteStorage(deleteName, function (statusCode) {\r\n if (statusCode == 500) { console.log("Error, check that computer is powered on."); exit(); return; }\r\n if (statusCode == 200) { nextStepStorageUpload(); } else { console.log("Unable to delete " + deleteName + "."); exit(); return; }\r\n });\r\n}\r\n\r\n// Fetch the Intel AMT storage document\r\nfunction getAmtStorage(func, noretry) {\r\n var req = digest.request({ protocol: settings.protocol, method: \'GET\', host: settings.hostname, path: \'/amt-storage/\', port: settings.localport },\r\n function (response) {\r\n if (response.statusCode != 200) { console.log("Unable to connect to Intel(R) AMT."); func(response.statusCode, null); }\r\n response.on(\'data\', function (chunk) { if (response.acc == null) { response.acc = chunk; } else { response.acc += chunk; } });\r\n response.on(\'end\', function () {\r\n var data = response.acc.toString(), len, data2, amtstorage = null;\r\n data = data.split(\'\\t\').join(\'\').split(\'\\r\').join(\'\').split(\'\\n\').join(\'\');\r\n try {\r\n do { len = data.length; data2 = data; data = data2.replace(\'": \', \'":\'); } while (data != data2); // Remove all zero\'s, this is needed because firmware sometimes returns garbage we must fix.\r\n do { len = data.length; data2 = data; data = data2.replace(\'\\x00\', \'\'); } while (data != data2); // Remove all zero\'s, this is needed because firmware sometimes returns garbage we must fix.\r\n do { len = data.length; data2 = data; data = data2.replace(\'\\x22\\x01\\x22\', \'\\x22\\x22\'); } while (data != data2); // "\\x01", this is needed because firmware sometimes returns garbage we must fix.\r\n var xopen = data.split("{").length, xclose = data.split("}").length, xadd = \'\';\r\n while (xopen > xclose) { data += \'}\'; xclose++; } // Close any missing close brackets\r\n amtstorage = JSON.parse(data);\r\n } catch (e) { console.log("Error: Unable to parse Intel AMT response: " + data, e); func(null); }\r\n if (func != null) { func(response.statusCode, amtstorage); }\r\n });\r\n });\r\n req.on(\'error\', function (e) { console.log("Error occured: " + JSON.stringify(e)); if (noretry == true) { if (func != null) { func(null); } } else { getAmtStorage(func, true); } });\r\n req.end();\r\n}\r\n\r\n// Fetch the Intel AMT storage document\r\nfunction pushToStorage(name, linkname, data, func, ptr) {\r\n if (ptr == null) { ptr = 0; }\r\n var req = digest.request({ protocol: settings.protocol, method: \'PUT\', host: settings.hostname, path: (\'/amt-storage/\' + name + ((ptr != 0) ? \'?append=\' : \'\')), port: settings.localport });\r\n req.on(\'error\', function (e) { console.log("Error occured: " + JSON.stringify(e)); if (func != null) { func(null); } });\r\n req.on(\'response\', function (response) {\r\n debug(1, \'Chunk Done\', data.length, ptr);\r\n if ((response.statusCode == 200) && (ptr < data.length)) { pushToStorage(name, linkname, data, func, ptr); } else { if (func != null) { func(response.statusCode); } }\r\n });\r\n var header = (ptr > 0) ? \'\' : \'Content-Encoding:gzipContent-Type:text/html\' + ((linkname != null) ? (\'\' + linkname + \'\') : \'\') + \'\';\r\n var blocklen = ((data.length - ptr) > (7000 - header.length)) ? (7000 - header.length) : (data.length - ptr);\r\n req.write(Buffer.concat([Buffer.from(header), data.slice(ptr, ptr + blocklen)]));\r\n ptr += blocklen;\r\n req.end();\r\n}\r\n\r\n// Fetch the Intel AMT storage document\r\nfunction verifyStorage(name, data, func) {\r\n var req = digest.request({ protocol: settings.protocol, method: \'GET\', host: settings.hostname, path: (\'/amt-storage/\' + name), port: settings.localport });\r\n req.on(\'error\', function (e) { console.log("Verify error occured: " + JSON.stringify(e)); if (func != null) { func(null); } });\r\n req.on(\'response\', function (response) {\r\n response.ptr = 0;\r\n response.ok = true;\r\n response.on(\'data\', function (data2) { if (data2.toString(\'hex\') != data.slice(response.ptr, response.ptr + data2.length).toString(\'hex\')) { response.ok = false; console.log(\'Verifiy failed (\' + response.ptr + \', \' + data2.length + \').\'); } response.ptr += data2.length; });\r\n response.on(\'end\', function () { if (func != null) { func(response.ok); } });\r\n });\r\n req.end();\r\n}\r\n\r\n// Fetch the Intel AMT storage document\r\nfunction deleteStorage(name, func, noretry) {\r\n var req = digest.request({ protocol: settings.protocol, method: \'DELETE\', host: settings.hostname, path: \'/amt-storage/\' + name, port: settings.localport });\r\n req.on(\'error\', function (e) { if ((e == "Error: Socket was unexpectedly closed") && (noretry != true)) { deleteStorage(name, func, true); } else { if (func != null) { if (e.statusCode) { func(e.statusCode); } else { func(null); } } } });\r\n req.on(\'response\', function (response) { if (func != null) { func(response.statusCode); } });\r\n req.end();\r\n}\r\n\r\n\r\n//\r\n// IDER\r\n//\r\n\r\nider = null;\r\niderIdleTimer = null;\r\n\r\n// Perform IDER\r\nfunction performIder() {\r\n if ((settings.floppy != null) && fs.existsSync(settings.floppy) == false) { console.log("Unable to floppy image file: " + settings.floppy); process.exit(); return; }\r\n if ((settings.cdrom != null) && fs.existsSync(settings.cdrom) == false) { console.log("Unable to CDROM image file: " + settings.cdrom); process.exit(); return; }\r\n try {\r\n var sfloppy = null, scdrom = null;\r\n if (settings.floppy) { try { if (sfloppy = fs.statSync(settings.floppy)) { sfloppy.file = fs.openSync(settings.floppy, \'rbN\'); } } catch (ex) { console.log(ex); process.exit(1); return; } }\r\n if (settings.cdrom) { try { scdrom = fs.statSync(settings.cdrom); if (scdrom) { scdrom.file = fs.openSync(settings.cdrom, \'rbN\'); } } catch (ex) { console.log(ex); process.exit(1); return; } }\r\n\r\n ider = require(\'amt-redir-duk\')(require(\'amt-ider\')());\r\n ider.onStateChanged = onIderStateChange;\r\n ider.m.floppy = sfloppy;\r\n ider.m.cdrom = scdrom;\r\n ider.m.iderStart = 1; // OnReboot = 0, Graceful = 1, Now = 2\r\n ider.m.debug = (settings.debuglevel > 0);\r\n if (settings.timeout > 0) { ider.m.sectorStats = iderSectorStats; }\r\n //ider.digestRealmMatch = wsstack.comm.digestRealm;\r\n //ider.tlsv1only = amtstack.wsman.comm.tlsv1only;\r\n ider.Start(settings.hostname, (settings.tls == true) ? 16995 : 16994, settings.username ? \'admin\' : settings.username, settings.password, settings.tls);\r\n } catch (ex) { console.log(ex); }\r\n}\r\n\r\nfunction onIderStateChange(stack, state) { console.log(["Disconnected", "Connecting...", "Connected...", "Started IDER..."][state]); }\r\n\r\nfunction iderSectorStats(mode, dev, mediaBlocks, lba, len) {\r\n if (iderIdleTimer != null) { clearTimeout(iderIdleTimer); }\r\n iderIdleTimer = setTimeout(function () { console.log("Idle timeout"); process.exit(1); }, 1000 * settings.timeout);\r\n}\r\n\r\n//\r\n// Intel AMT IPv4 wired configuration\r\n//\r\n\r\nfunction performAmtNetConfig(args) {\r\n if ((settings.hostname == \'127.0.0.1\') || (settings.hostname.toLowerCase() == \'localhost\')) {\r\n settings.noconsole = true; startLms(performAmtNetConfig0, false, args);\r\n } else {\r\n performAmtNetConfig0(1, args);\r\n }\r\n}\r\n\r\nfunction performAmtNetConfig0(state, args) {\r\n var transport = require(\'amt-wsman-duk\');\r\n var wsman = require(\'amt-wsman\');\r\n var amt = require(\'amt\');\r\n wsstack = new wsman(transport, settings.hostname, settings.tls ? 16993 : 16992, settings.username, settings.password, settings.tls);\r\n amtstack = new amt(wsstack);\r\n amtstack.BatchEnum(null, [\'AMT_EthernetPortSettings\'], performAmtNetConfig1, args);\r\n}\r\n\r\nfunction performAmtNetConfig1(stack, name, response, status, args) {\r\n if (status == 200) {\r\n // Set wired and wireless interfaces\r\n var amtwirelessif = -1;\r\n var amtwiredif = -1;\r\n for (var y in response[\'AMT_EthernetPortSettings\'].responses) {\r\n var z = response[\'AMT_EthernetPortSettings\'].responses[y];\r\n if (z[\'WLANLinkProtectionLevel\'] || (y == 1)) { amtwirelessif = y; } // Set the wireless interface, this seems to cover new wireless only computers and older computers with dual interfaces.\r\n if (y == 0) { if ((amtwirelessif != y) && (z[\'MACAddress\'] != \'00-00-00-00-00-00\')) { amtwiredif = y; } } // On computers with only wireless, the wired interface will have a null MAC\r\n }\r\n\r\n // Check if configuration change is required\r\n if (args) {\r\n var docall = false;\r\n var x = JSON.parse(JSON.stringify(response[\'AMT_EthernetPortSettings\'].responses[amtwiredif]));\r\n var y = response[\'AMT_EthernetPortSettings\'].responses[amtwiredif];\r\n delete x[\'IpSyncEnabled\'];\r\n delete x[\'LinkIsUp\'];\r\n delete x[\'LinkPolicy\'];\r\n delete x[\'MACAddress\'];\r\n delete x[\'SharedDynamicIP\'];\r\n delete x[\'SharedMAC\'];\r\n delete x[\'SharedStaticIp\'];\r\n\r\n if ((y[\'IpSyncEnabled\'] == false) && (args.ipsync === \'1\')) { x[\'IpSyncEnabled\'] = true; docall = true; }\r\n if ((y[\'IpSyncEnabled\'] == true) && (args.ipsync === \'0\')) { x[\'IpSyncEnabled\'] = false; docall = true; }\r\n if (args.dhcp && (amtwiredif != -1) && (response[\'AMT_EthernetPortSettings\'].responses[amtwiredif].DHCPEnabled == false)) {\r\n // Change to DHCP\r\n x[\'DHCPEnabled\'] = true;\r\n docall = true;\r\n }\r\n else if (args.static && (amtwiredif != -1) && (response[\'AMT_EthernetPortSettings\'].responses[amtwiredif].DHCPEnabled == true)) {\r\n // Change to STATIC\r\n x[\'DHCPEnabled\'] = false;\r\n if (args.ip) { x[\'IPAddress\'] = args.ip; } else { console.log("Missing IPv4 address, use --ip 1.2.3.4"); process.exit(1); }\r\n if (args.subnet) { x[\'SubnetMask\'] = args.subnet; } else { console.log("Missing IPv4 subnet, use --subnet 255.255.255.0"); process.exit(1); }\r\n if (args.gateway) { x[\'DefaultGateway\'] = args.gateway; }\r\n if (args.dns) { x[\'PrimaryDNS\'] = args.dns; }\r\n if (args.dns2) { x[\'SecondaryDNS\'] = args.dns2; }\r\n docall = true;\r\n }\r\n if (docall) {\r\n if (x[\'DHCPEnabled\'] == true) {\r\n delete x[\'IPAddress\'];\r\n delete x[\'DefaultGateway\'];\r\n delete x[\'PrimaryDNS\'];\r\n delete x[\'SecondaryDNS\'];\r\n delete x[\'SubnetMask\'];\r\n }\r\n pendingAmtConfigActions++;\r\n //console.log(JSON.stringify(x, 4, \' \'));\r\n amtstack.Put(\'AMT_EthernetPortSettings\', x, function (stack, name, response, status) { if (status != 200) { console.log("Error, status " + status + "."); } if (--pendingAmtConfigActions == 0) { performAmtNetConfig0(); } }, null, 0, x);\r\n }\r\n }\r\n\r\n if (pendingAmtConfigActions == 0) {\r\n var maxlen = 0;\r\n if (amtwiredif != -1) { for (var i in response[\'AMT_EthernetPortSettings\'].responses[amtwiredif]) { if (i.length > maxlen) { maxlen = i.length; } } }\r\n if (amtwirelessif != -1) { for (var i in response[\'AMT_EthernetPortSettings\'].responses[amtwirelessif]) { if (i.length > maxlen) { maxlen = i.length; } } }\r\n\r\n if (amtwiredif != -1) { // Wired\r\n var z = response[\'AMT_EthernetPortSettings\'].responses[amtwiredif];\r\n console.log("--WIRED---");\r\n for (var i in z) {\r\n if ([\'ElementName\', \'InstanceID\'].indexOf(i) == -1) {\r\n var name = i;\r\n while (name.length < maxlen) { name += \' \'; }\r\n console.log(name + \' : \' + z[i]);\r\n }\r\n }\r\n }\r\n if (amtwirelessif != -1) { // Wireless\r\n var z = response[\'AMT_EthernetPortSettings\'].responses[amtwirelessif];\r\n console.log("--WIRELESS---");\r\n for (var i in z) {\r\n if ([\'ElementName\', \'InstanceID\'].indexOf(i) == -1) {\r\n var name = i;\r\n while (name.length < maxlen) { name += \' \'; }\r\n console.log(name + \' : \' + z[i]);\r\n }\r\n }\r\n }\r\n process.exit(0);\r\n }\r\n } else {\r\n console.log("Error, status " + status + ".");\r\n process.exit(1);\r\n }\r\n}\r\n\r\n//\r\n// Intel AMT Wifi configuration\r\n//\r\n\r\nfunction performAmtWifiConfig(args) {\r\n if ((settings.hostname == \'127.0.0.1\') || (settings.hostname.toLowerCase() == \'localhost\')) {\r\n settings.noconsole = true; startLms(performAmtWifiConfig0, false, args);\r\n } else {\r\n performAmtWifiConfig0(1, args);\r\n }\r\n}\r\n\r\nfunction performAmtWifiConfig0(state, args) {\r\n var transport = require(\'amt-wsman-duk\');\r\n var wsman = require(\'amt-wsman\');\r\n var amt = require(\'amt\');\r\n wsstack = new wsman(transport, settings.hostname, settings.tls ? 16993 : 16992, settings.username, settings.password, settings.tls);\r\n amtstack = new amt(wsstack);\r\n amtstack.BatchEnum(null, [\'CIM_WiFiEndpointSettings\'], performAmtWifiConfig1, args);\r\n}\r\n\r\nfunction performAmtWifiConfig1(stack, name, response, status, args) {\r\n if (status == 200) {\r\n var wifiAuthMethod = { 1: "Other", 2: "Open", 3: "Shared Key", 4: "WPA PSK", 5: "WPA 802.1x", 6: "WPA2 PSK", 7: "WPA2 802.1x", 32768: "WPA3 802.1x" };\r\n var wifiEncMethod = { 1: "Other", 2: "WEP", 3: "TKIP", 4: "CCMP", 5: "None" }\r\n var wifiProfiles = {};\r\n for (var y in response[\'CIM_WiFiEndpointSettings\'].responses) {\r\n var z = response[\'CIM_WiFiEndpointSettings\'].responses[y];\r\n var n = z[\'ElementName\'];\r\n wifiProfiles[n] = { \'Priority\': z[\'Priority\'], \'SSID\': z[\'SSID\'], \'AuthenticationMethod\': z[\'AuthenticationMethod\'], \'EncryptionMethod\': z[\'EncryptionMethod\'] };\r\n }\r\n\r\n if (args) {\r\n if (args.list) {\r\n console.log(\'List of Intel AMT Wifi profiles:\');\r\n if (wifiProfiles.length == 0) {\r\n console.log(\'No Wifi profiles is stored.\');\r\n }\r\n for (var t in wifiProfiles) {\r\n var w = wifiProfiles[t];\r\n console.log(\'Profile Name: \' + t + \'; Priority: \' + w[\'Priority\'] + \'; SSID: \' + w[\'SSID\'] + \'; Security: \' + wifiAuthMethod[w[\'AuthenticationMethod\']] + \'/\' + wifiEncMethod[w[\'EncryptionMethod\']]);\r\n }\r\n process.exit(0);\r\n } else if (args.add) {\r\n if (args.auth == null) { args.auth = 6; } // if not set, default to WPA2 PSK\r\n if (args.enc == null) { args.enc = 3; } // if not set, default to TKIP\r\n if (args.priority == null) { args.priority = 0; } // if not set, default to 0\r\n\r\n var wifiep = {\r\n __parameterType: \'reference\',\r\n __resourceUri: \'http://schemas.dmtf.org/wbem/wscim/1/cim-schema/2/CIM_WiFiEndpoint\',\r\n Name: \'WiFi Endpoint 0\'\r\n };\r\n\r\n var wifiepsettinginput = {\r\n __parameterType: \'instance\',\r\n __namespace: \'http://schemas.dmtf.org/wbem/wscim/1/cim-schema/2/CIM_WiFiEndpointSettings\',\r\n ElementName: args.name,\r\n InstanceID: \'Intel(r) AMT:WiFi Endpoint Settings \' + args.name,\r\n AuthenticationMethod: args.auth,\r\n EncryptionMethod: args.enc,\r\n SSID: args.ssid,\r\n Priority: args.priority,\r\n PSKPassPhrase: args.psk\r\n }\r\n stack.AMT_WiFiPortConfigurationService_AddWiFiSettings(wifiep, wifiepsettinginput, null, null, null,\r\n function (stck, nm, resp, sts) {\r\n if (sts == 200) {\r\n console.log("Wifi profile " + args.name + " successfully added.");\r\n } else {\r\n console.log("Failed to add wifi profile " + args.name + ".");\r\n }\r\n process.exit(0);\r\n });\r\n } else if (args.del) {\r\n if (wifiProfiles[args.name] == null) {\r\n console.log("Profile " + args.name + " could not be found.");\r\n process.exit(0);\r\n }\r\n stack.Delete(\'CIM_WiFiEndpointSettings\', { InstanceID: \'Intel(r) AMT:WiFi Endpoint Settings \' + args.name },\r\n function (stck, nm, resp, sts) {\r\n if (sts == 200) {\r\n console.log("Wifi profile " + args.name + " successfully deleted.");\r\n } else {\r\n console.log("Failed to delete wifi profile " + args.name + ".");\r\n }\r\n process.exit(0);\r\n },\r\n 0, 1);\r\n }\r\n } else {\r\n process.exit(0);\r\n }\r\n } else {\r\n console.log("Error, status " + status + ".");\r\n process.exit(1);\r\n }\r\n}\r\n\r\n//\r\n// Intel AMT wake alarm configuration\r\n//\r\n\r\nfunction _fmtdatetime(str) {\r\n return str.replace(\'T\', \' \').replace(\'Z\', \'\');\r\n}\r\n\r\nfunction _fmtinterval(str) {\r\n var cl = str.replace(\'T\', \'\').substring(str.indexOf(\'P\') + 1);\r\n cl = \' \' + cl.replace(\'D\', " days ").replace(\'H\', " hours ").replace(\'M\', " minutes ");\r\n cl = cl.replace(" 1 days ", " 1 day ").replace(" 1 hours ", " 1 hour ").replace(" 1 minutes ", " 1 minute ");\r\n return cl.substring(0, cl.length - 1);\r\n}\r\n\r\nfunction _fmttimepad(str) {\r\n str = \'\' + str;\r\n while (str.length < 2) { str = \'0\' + str; }\r\n return str;\r\n}\r\n\r\nfunction convertAmtDataStr(str) {\r\n var timeArray = str.split(\'Z\').join(\'\').split(\'T\').join(\'-\').split(\':\').join(\'-\').split(\'-\');\r\n return new Date(timeArray[0], timeArray[1] - 1, timeArray[2], timeArray[3], timeArray[4], timeArray[5]);\r\n}\r\n\r\nfunction prepareAlarmOccurenceTemplate(id, nm, start, interval, del) {\r\n return \'\' + id + \'\' + start + \'\' + interval + \'\' + del + \'\';\r\n}\r\n\r\nfunction performAmtWakeConfig(args) {\r\n if ((settings.hostname == \'127.0.0.1\') || (settings.hostname.toLowerCase() == \'localhost\')) {\r\n settings.noconsole = true; startLms(performAmtWakeConfig0, false, args);\r\n } else {\r\n performAmtWakeConfig0(1, args);\r\n }\r\n}\r\n\r\nfunction performAmtWakeConfig0(state, args) {\r\n var transport = require(\'amt-wsman-duk\');\r\n var wsman = require(\'amt-wsman\');\r\n var amt = require(\'amt\');\r\n wsstack = new wsman(transport, settings.hostname, settings.tls ? 16993 : 16992, settings.username, settings.password, settings.tls);\r\n amtstack = new amt(wsstack);\r\n amtstack.BatchEnum(null, [\'IPS_AlarmClockOccurrence\'], performAmtWakeConfig1, args);\r\n}\r\n\r\nfunction performAmtWakeConfig1(stack, name, response, status, args) {\r\n if (status == 200) {\r\n var response = response[\'IPS_AlarmClockOccurrence\'].responses;\r\n if (!args) { process.exit(0); return; }\r\n if (args.list) {\r\n if (response.length == 0) {\r\n console.log(\'No wake alarms.\');\r\n } else {\r\n for (var i = 0; i < response.length; i++) {\r\n var waketime = convertAmtDataStr(response[i][\'StartTime\'][\'Datetime\']);\r\n var t = waketime.toLocaleString(), tx = t.indexOf(\'.\');\r\n if (tx >= 0) { t = t.substring(0, tx); }\r\n var details = response[i][\'ElementName\'] + \', wake on \' + t.replace(\' \', \' at \');\r\n if (response[i][\'Interval\'] != null) { details += \' and each\' + _fmtinterval(response[i][\'Interval\'][\'Interval\']); }\r\n if (response[i][\'DeleteOnCompletion\'] == true) { details += ", delete when done"; }\r\n console.log(details);\r\n }\r\n }\r\n process.exit(0);\r\n } else if (args.del) {\r\n // Remove a wake alarm, start by looking to see if it exists\r\n var alarmFound = false;\r\n for (var i = 0; i < response.length; i++) { if (response[i][\'ElementName\'] == args.del) { alarmFound = true; } }\r\n if (alarmFound == false) { console.log("Wake alarm " + args.del + " could not be found."); process.exit(0); return; }\r\n // Remote the alarm\r\n stack.Delete(\'IPS_AlarmClockOccurrence\', { InstanceID: args.del },\r\n function (stck, nm, resp, sts) {\r\n if (sts == 200) { console.log("Done."); } else { console.log("Failed to delete wake alarm " + args.del + "."); }\r\n process.exit(0);\r\n },\r\n 0, 1);\r\n } else if (args.add) {\r\n // Add a wake alarm\r\n var alarmFound = false;\r\n for (var i = 0; i < response.length; i++) { if (response[i][\'ElementName\'] == args.add) { alarmFound = true; } }\r\n if (alarmFound) { console.log("Wake alarm " + args.add + " already exists."); process.exit(0); return; }\r\n if (typeof args.time != \'string\') { args.time = \'00:00:00\'; }\r\n if (typeof args.interval != \'string\') { args.interval = \'\'; }\r\n var alarm_name = args.add;\r\n var x1 = args.date.split(\'-\');\r\n var x2 = args.time.split(\':\');\r\n var t = new Date(x1[0], x1[1] - 1, x1[2], x2[0], x2[1], 0, 0); // Not sure why, but month is 0 = JAN, 11 = DEC, seconds must be 00.\r\n var alarm_starttime = _fmttimepad(t.getFullYear()) + \'-\' + _fmttimepad(t.getMonth() + 1) + \'-\' + _fmttimepad(t.getDate()) + \'T\' + _fmttimepad(t.getHours()) + \':\' + _fmttimepad(t.getMinutes()) + \':\' + _fmttimepad(t.getSeconds()) + \'Z\';\r\n var x = args.interval.split(\'-\');\r\n if (x.length != 3) { x = [0, 0, 0]; }\r\n var alarm_interval = \'P\' + x[0] + \'DT\' + x[1] + \'H\' + x[2] + \'M\';\r\n var alarm_doc = (args.deletewhendone != null);\r\n var tpl = prepareAlarmOccurenceTemplate(alarm_name, alarm_name, alarm_starttime, alarm_interval, alarm_doc);\r\n stack.wsman.ExecMethodXml(amtstack.CompleteName(\'AMT_AlarmClockService\'), \'AddAlarm\', tpl,\r\n function (ws, resuri, response, status) {\r\n if (status != 200) { console.log("Failed to add alarm. Status: " + status + ". Verify the alarm is for a future time."); }\r\n else if (response.Body[\'ReturnValue\'] != 0) { console.log("Failed to add alarm " + response.Body[\'ReturnValueStr\'] + ". Verify the alarm is for a future time."); }\r\n else { console.log("Done."); }\r\n process.exit(0);\r\n }\r\n );\r\n } else {\r\n console.log("Unknown action, specify --list, --del or --add.");\r\n process.exit(0);\r\n }\r\n } else {\r\n console.log("Error, status " + status + ".");\r\n process.exit(1);\r\n }\r\n}\r\n\r\n//\r\n// Intel AMT feature configuration action\r\n//\r\n\r\nfunction performAmtFeatureConfig(args) {\r\n if ((settings.hostname == \'127.0.0.1\') || (settings.hostname.toLowerCase() == \'localhost\')) {\r\n settings.noconsole = true; startLms(performAmtFeatureConfig0, false, args);\r\n } else {\r\n performAmtFeatureConfig0(1, args);\r\n }\r\n}\r\n\r\nfunction performAmtFeatureConfig0(state, args) {\r\n var transport = require(\'amt-wsman-duk\');\r\n var wsman = require(\'amt-wsman\');\r\n var amt = require(\'amt\');\r\n wsstack = new wsman(transport, settings.hostname, settings.tls ? 16993 : 16992, settings.username, settings.password, settings.tls);\r\n amtstack = new amt(wsstack);\r\n amtstack.BatchEnum(null, [\'*IPS_OptInService\', \'*AMT_RedirectionService\', \'*CIM_KVMRedirectionSAP\'], performAmtFeatureConfig1, args);\r\n}\r\n\r\nfunction performAmtFeatureConfig1(stack, name, response, status, args) {\r\n if (status == 200) {\r\n // User consent\r\n var optinrequired = response[\'IPS_OptInService\'].response[\'OptInRequired\'];\r\n if (args) {\r\n if ((args.userconsent == \'none\') && (optinrequired != 0)) {\r\n pendingAmtConfigActions++;\r\n response[\'IPS_OptInService\'].response[\'OptInRequired\'] = 0;\r\n amtstack.Put(\'IPS_OptInService\', response[\'IPS_OptInService\'].response, function (stack, name, response, status) { if (--pendingAmtConfigActions == 0) { performAmtFeatureConfig0(); } });\r\n }\r\n else if ((args.userconsent == \'kvm\') && (optinrequired != 1)) {\r\n pendingAmtConfigActions++;\r\n response[\'IPS_OptInService\'].response[\'OptInRequired\'] = 1;\r\n amtstack.Put(\'IPS_OptInService\', response[\'IPS_OptInService\'].response, function (stack, name, response, status) { if (--pendingAmtConfigActions == 0) { performAmtFeatureConfig0(); } });\r\n }\r\n else if ((args.userconsent == \'all\') && (optinrequired != 0xFFFFFFFF)) {\r\n pendingAmtConfigActions++;\r\n response[\'IPS_OptInService\'].response[\'OptInRequired\'] = 0xFFFFFFFF;\r\n amtstack.Put(\'IPS_OptInService\', response[\'IPS_OptInService\'].response, function (stack, name, response, status) { if (--pendingAmtConfigActions == 0) { performAmtFeatureConfig0(); } });\r\n }\r\n }\r\n\r\n // Redirection ports\r\n var redirportchange = false;\r\n var redirchange = false;\r\n var redir = (response[\'AMT_RedirectionService\'].response[\'ListenerEnabled\'] == true);\r\n\r\n var sol = ((response[\'AMT_RedirectionService\'].response[\'EnabledState\'] & 2) != 0);\r\n var ider = ((response[\'AMT_RedirectionService\'].response[\'EnabledState\'] & 1) != 0);\r\n if (args) {\r\n if ((redir == false) && ((args.redir == \'enabled\') || (args.redir == 1))) { response[\'AMT_RedirectionService\'].response[\'ListenerEnabled\'] = true; redirportchange = true; }\r\n if ((redir == true) && ((args.redir == \'disabled\') || (args.redir == 0))) { response[\'AMT_RedirectionService\'].response[\'ListenerEnabled\'] = false; redirportchange = true; }\r\n if ((sol == false) && ((args.sol == \'enabled\') || (args.sol == 1))) { sol = true; redirchange = true; }\r\n if ((sol == true) && ((args.sol == \'disabled\') || (args.sol == 0))) { sol = false; redirchange = true; }\r\n if ((ider == false) && ((args.ider == \'enabled\') || (args.ider == 1))) { ider = true; redirchange = true; }\r\n if ((ider == true) && ((args.ider == \'disabled\') || (args.ider == 0))) { ider = false; redirchange = true; }\r\n if (redirportchange) { pendingAmtConfigActions++; amtstack.Put("AMT_RedirectionService", response[\'AMT_RedirectionService\'].response, function (stack, name, response, status) { if (--pendingAmtConfigActions == 0) { performAmtFeatureConfig0(); } }); }\r\n if (redirchange) { pendingAmtConfigActions++; amtstack.AMT_RedirectionService_RequestStateChange((32768 + ((ider ? 1 : 0) + (sol ? 2 : 0))), function (stack, name, response, status) { if (--pendingAmtConfigActions == 0) { performAmtFeatureConfig0(); } }); }\r\n }\r\n\r\n // KVM\r\n var kvm = false;\r\n var kvmchange = false;\r\n if (response[\'CIM_KVMRedirectionSAP\'] != null) {\r\n kvm = ((response[\'CIM_KVMRedirectionSAP\'].response["EnabledState"] == 6 && response[\'CIM_KVMRedirectionSAP\'].response[\'RequestedState\'] == 2) || response[\'CIM_KVMRedirectionSAP\'].response[\'EnabledState\'] == 2 || response[\'CIM_KVMRedirectionSAP\'].response[\'EnabledState\'] == 6);\r\n if (args) {\r\n if ((kvm == false) && ((args.kvm == \'enabled\') || (args.kvm == 1))) { kvm = true; kvmchange = true; }\r\n if ((kvm == true) && ((args.kvm == \'disabled\') || (args.kvm == 0))) { kvm = false; kvmchange = true; }\r\n if (kvmchange) { pendingAmtConfigActions++; amtstack.CIM_KVMRedirectionSAP_RequestStateChange(kvm ? 2 : 3, 0, function (stack, name, response, status) { if (--pendingAmtConfigActions == 0) { performAmtFeatureConfig0(); } }); }\r\n }\r\n }\r\n\r\n if (pendingAmtConfigActions == 0) {\r\n if (optinrequired == 0) { console.log("User Consent : None"); }\r\n else if (optinrequired == 1) { console.log("User Consent : KVM"); }\r\n else if (optinrequired == 0xFFFFFFFF) { console.log("User Consent : All"); }\r\n else { console.log("User Consent : " + optinrequired); }\r\n console.log("Redirection Port : " + (redir ? "Enabled" : "Disabled"));\r\n console.log("Serial-over-LAN : " + (sol ? "Enabled" : "Disabled"));\r\n console.log("IDE Redirection : " + (ider ? "Enabled" : \'Disabled\'));\r\n if (response[\'CIM_KVMRedirectionSAP\'] != null) { console.log("Remote desktop (KVM) : " + (kvm ? "Enabled" : "Disabled")); }\r\n process.exit(0);\r\n }\r\n } else {\r\n console.log("Error, status " + status + ".");\r\n process.exit(1);\r\n }\r\n}\r\n\r\n\r\n//\r\n// Intel AMT Remote Power Action\r\n//\r\n\r\nfunction performAmtPowerAction() {\r\n var transport = require(\'amt-wsman-duk\');\r\n var wsman = require(\'amt-wsman\');\r\n var amt = require(\'amt\');\r\n wsstack = new wsman(transport, settings.hostname, settings.tls ? 16993 : 16992, settings.username, settings.password, settings.tls);\r\n amtstack = new amt(wsstack);\r\n if (settings.poweraction != 0) {\r\n // Check if there is bootdevice and the command is either poweron, powercycle or reset\r\n if (settings.bootdevice && [2,5,10].indexOf(settings.poweraction)>=0) {\r\n // Change boot order\r\n amtstack.Get(\'AMT_BootSettingData\', powerActionResponse1, 0, 1);\r\n } else {\r\n // Set the power state\r\n amtstack.RequestPowerStateChange(settings.poweraction, performAmtPowerActionEx);\r\n }\r\n } else {\r\n // Get the power state\r\n amtstack.Get(\'CIM_AssociatedPowerManagementService\', performAmtPowerActionEx2, 0, 1);\r\n }\r\n}\r\n\r\nfunction powerActionResponse1(stack, name, response, status) {\r\n if (status !=200) { console.log("Unable to get AMT_BootSettingData"); exit(1); return;}\r\n var r = response.Body;\r\n r[\'ConfigurationDataReset\'] = false;\r\n r[\'BIOSPause\'] = false;\r\n r[\'EnforceSecureBoot\'] = false;\r\n r[\'BIOSSetup\'] = false;\r\n if (settings.bootdevice && settings.bootdevice!=\'pxe\') {\r\n r[\'BootMediaIndex\'] = settings.bootindex;\r\n } else {\r\n r[\'BootMediaIndex\'] = 0;\r\n }\r\n r[\'FirmwareVerbosity\'] = 0;\r\n r[\'ForcedProgressEvents\'] = false;\r\n r[\'IDERBootDevice\'] = 0;\r\n r[\'LockKeyboard\'] = false;\r\n r[\'LockPowerButton\'] = false;\r\n r[\'LockResetButton\'] = false;\r\n r[\'LockSleepButton\'] = false;\r\n r[\'ReflashBIOS\'] = false;\r\n r[\'UseIDER\'] = false;\r\n r[\'UseSOL\'] = false;//\r\n r[\'UseSafeMode\'] = false;\r\n r[\'UserPasswordBypass\'] = false;\r\n if (r[\'SecureErase\'] != null) {\r\n r[\'SecureErase\'] = false; // no secure erase\r\n }\r\n if (r[\'PlatformErase\'] != null) {\r\n r[\'PlatformErase\'] = false; //disable platform erase\r\n }\r\n delete r[\'WinREBootEnabled\'];\r\n delete r[\'UEFILocalPBABootEnabled\'];\r\n delete r[\'UEFIHTTPSBootEnabled\'];\r\n delete r[\'SecureBootControlEnabled\'];\r\n delete r[\'BootguardStatus\'];\r\n delete r[\'OptionsCleared\'];\r\n delete r[\'BIOSLastStatus\'];\r\n delete r[\'UefiBootParametersArray\'];\r\n if (r[\'UefiBootNumberOfParams\'] != null) r[\'UefiBootNumberOfParams\'] = 0;\r\n // Set the boot order to null, this is needed for some AMT versions that don\'t clear this automatically.\r\n amtstack.CIM_BootConfigSetting_ChangeBootOrder(null, function (stack, name, response, status) {\r\n if (status != 200) { console.log(\'PUT CIM_BootConfigSetting_ChangeBootOrder failed\'); exit(1); return; }\r\n if (response.Body[\'ReturnValue\'] != 0) { console.log(\'(1) Change Boot Order returns \'+ response.Body.ReturnValueStr); exit(1); return; }\r\n amtstack.Put(\'AMT_BootSettingData\', r, powerActionResponse2, 0, 1);\r\n }, 0, 1);\r\n}\r\n\r\nfunction powerActionResponse2(stack, name, response, status, tag) {\r\n if (status != 200) { console.log(\'PUT AMT_BootSettingData failed.\'); exit(1); return; }\r\n amtstack.SetBootConfigRole(1, powerActionResponse3, 0, 1);\r\n}\r\n\r\nfunction powerActionResponse3(stack, name, response, status) {\r\n if (status != 200) { console.log(\'SetBootConfigRole failed.\'); exit(1); return; }\r\n var bootsources = { \'pxe\' : \'Force PXE Boot\', \'hdd\' : \'Force Hard-drive Boot\', \'cd\' : \'Force CD/DVD Boot\'};\r\n var cbparam=\'
http://schemas.xmlsoap.org/ws/2004/08/addressing
http://schemas.dmtf.org/wbem/wscim/1/cim-schema/2/CIM_BootSourceSettingIntel(r) AMT: \' + bootsources[settings.bootdevice] + \'\';\r\n if (!settings.bootdevice) { cbparam=null;}\r\n amtstack.CIM_BootConfigSetting_ChangeBootOrder(cbparam, function(st, nm, resp, sts) {\r\n if (resp.Body[\'ReturnValue\'] != 0) { console.log(\'(2) Change Boot Order returns \'+ response.Body.ReturnValueStr); exit(1); return; }\r\n amtstack.RequestPowerStateChange(settings.poweraction, performAmtPowerActionEx);\r\n });\r\n}\r\n\r\n\r\nfunction performAmtPowerActionEx(stack, name, response, status) {\r\n if (status == 200) {\r\n console.log(response.Body.ReturnValueStr.split(\'_\').join(\' \'));\r\n process.exit(0);\r\n } else {\r\n console.log("Error, status " + status + ".");\r\n process.exit(1);\r\n }\r\n}\r\n\r\nvar DMTFPowerStates = [\'\', \'\', "Power on", "Light sleep", "Deep sleep", "Power cycle (Soft off)", "Off - Hard", "Hibernate (Off soft)", "Soft off", "Power cycle (Off-hard)", "Main bus reset", "Diagnostic interrupt (NMI)", "Not applicable", "Off - Soft graceful", "Off - Hard graceful", "Main bus reset graceful", "Power cycle (Off - Soft graceful)", "Power cycle (Off - Hard graceful)", "Diagnostic interrupt (INIT)"];\r\nfunction performAmtPowerActionEx2(stack, name, response, status) {\r\n if (status == 200) {\r\n var powerNumber = parseInt(response.Body.PowerState);\r\n if ((powerNumber >= DMTFPowerStates.length) && (powerNumber > 1)) {\r\n console.log("Unknown power state: " + response.Body.PowerState);\r\n } else {\r\n console.log("Current power state: " + DMTFPowerStates[powerNumber]);\r\n }\r\n process.exit(0);\r\n } else {\r\n console.log("Error, status " + status + ".");\r\n process.exit(1);\r\n }\r\n}\r\n\r\n\r\n//\r\n// Get MEI state\r\n//\r\n\r\n// Get Intel MEI State in a flexible way\r\n// Flags: 1 = Versions, 2 = OsAdmin, 4 = Hashes, 8 = Network\r\nfunction getMeiState(flags, func) {\r\n var amtMeiModule, amtMei;\r\n try { amtMeiModule = require(\'amt-mei\'); amtMei = new amtMeiModule(); } catch (ex) { func(null); return; }\r\n amtMei.on(\'error\', function (e) { func(null); return; });\r\n try {\r\n var amtMeiTmpState = { \'core-ver\': 1, OsHostname: require(\'os\').hostname(), Flags: 0 }; // Flags: 1=EHBC, 2=CCM, 4=ACM\r\n amtMei.getProtocolVersion(function (result) { if (result != null) { amtMeiTmpState.MeiVersion = result; } });\r\n if ((flags & 1) != 0) { amtMei.getVersion(function (result) { if (result) { amtMeiTmpState.Versions = {}; for (var version in result.Versions) { amtMeiTmpState.Versions[result.Versions[version].Description] = result.Versions[version].Version; } } }); }\r\n amtMei.getProvisioningMode(function (result) { if (result) { amtMeiTmpState.ProvisioningMode = result.mode; } });\r\n amtMei.getProvisioningState(function (result) { if (result) { amtMeiTmpState.ProvisioningState = result.state; } }); // 0: "Not Activated (Pre)", 1: "Not Activated (In)", 2: "Activated"\r\n amtMei.getEHBCState(function (result) { if ((result != null) && (result.EHBC == true)) { amtMeiTmpState.Flags += 1; } });\r\n amtMei.getControlMode(function (result) { if (result != null) { if (result.controlMode == 1) { amtMeiTmpState.Flags += 2; } if (result.controlMode == 2) { amtMeiTmpState.Flags += 4; } } }); // Flag 2 = CCM, 4 = ACM\r\n //amtMei.getMACAddresses(function (result) { if (result) { amtMeiTmpState.mac = result; } });\r\n if ((flags & 8) != 0) {\r\n amtMei.getLanInterfaceSettings(0, function (result) {\r\n if (result) {\r\n amtMeiTmpState.net0 = result;\r\n var fqdn = null, interfaces = require(\'os\').networkInterfaces(); // Look for the DNS suffix for the Intel AMT Ethernet interface\r\n for (var i in interfaces) { for (var j in interfaces[i]) { if ((interfaces[i][j].mac == amtMeiTmpState.net0.mac) && (interfaces[i][j].fqdn != null) && (interfaces[i][j].fqdn != \'\')) { amtMeiTmpState.OsDnsSuffix = interfaces[i][j].fqdn; } } }\r\n }\r\n });\r\n amtMei.getLanInterfaceSettings(1, function (result) { if (result) { amtMeiTmpState.net1 = result; } });\r\n }\r\n amtMei.getUuid(function (result) { if ((result != null) && (result.uuid != null)) { amtMeiTmpState.UUID = result.uuid; } });\r\n if ((flags & 2) != 0) { amtMei.getLocalSystemAccount(function (x) { if ((x != null) && x.user && x.pass) { amtMeiTmpState.OsAdmin = { user: x.user, pass: x.pass }; } }); }\r\n amtMei.getDnsSuffix(function (result) { if (result != null) { amtMeiTmpState.DnsSuffix = result; } if ((flags & 4) == 0) { if (func != null) { func(amtMeiTmpState); } } });\r\n if ((flags & 4) != 0) {\r\n amtMei.getHashHandles(function (handles) {\r\n if ((handles != null) && (handles.length > 0)) { amtMeiTmpState.Hashes = []; } else { func(amtMeiTmpState); }\r\n var exitOnCount = handles.length;\r\n for (var i = 0; i < handles.length; ++i) { this.getCertHashEntry(handles[i], function (hashresult) { amtMeiTmpState.Hashes.push(hashresult); if (--exitOnCount == 0) { if (func != null) { func(amtMeiTmpState); } } }); }\r\n });\r\n }\r\n } catch (e) { if (func != null) { func(null); } return; }\r\n}\r\n\r\n\r\n//\r\n// Startup\r\n//\r\n\r\n// Parse URL arguments\r\nfunction parseUrlArguments(url) {\r\n var r = {}, x = url.split(\'?\');\r\n if (x.length < 2) return r;\r\n x = x[1].split(\'&\');\r\n for (var i in x) { var j = x[i].indexOf(\'=\'); if (j > 0) { r[x[i].substring(0, j).toLowerCase()] = x[i].substring(j + 1); } }\r\n return r;\r\n}\r\n\r\n// Remove a element from a array\r\nfunction removeItemFromArray(array, element) {\r\n var index = array.indexOf(element);\r\n if (index !== -1) { array.splice(index, 1); }\r\n}\r\n\r\n// Run MeshCmd, but before we do, we need to see if what type of service we are going to be\r\nvar serviceName = null, serviceDisplayName = null, serviceDesc = null;\r\nfor (var i in process.argv) {\r\n if (process.argv[i].toLowerCase() == \'install\') { process.argv[i] = \'-install\'; }\r\n if (process.argv[i].toLowerCase() == \'uninstall\') { process.argv[i] = \'-uninstall\'; }\r\n if ((process.argv[i].toLowerCase() == \'microlms\') || (process.argv[i].toLowerCase() == \'amtlms\') || (process.argv[i].toLowerCase() == \'lms\')) {\r\n serviceName = \'MicroLMS\';\r\n serviceDisplayName = "MicroLMS Service for Intel(R) AMT";\r\n serviceDesc = "Intel AMT Micro Local Manageability Service (MicroLMS)";\r\n } else if ((process.argv[i].toLowerCase() == \'intellms\')) {\r\n serviceName = \'LMS\';\r\n serviceDisplayName = "Intel(R) Management and Security Application Local Management Service";\r\n serviceDesc = "Intel(R) Management and Security Application Local Management Service - Provides OS-related Intel(R) ME functionality.";\r\n } else if ((process.argv[i].toLowerCase() == \'meshcommander\') || (process.argv[i].toLowerCase() == \'commander\')) {\r\n serviceName = \'MeshCommander\';\r\n serviceDisplayName = "MeshCommander, Intel AMT Management console";\r\n serviceDesc = "MeshCommander is a Intel AMT management console.";\r\n }\r\n}\r\n\r\nif (serviceName == null) {\r\n if (process.execPath.includes(\'MicroLMS\')) { serviceName = \'MicroLMS\'; }\r\n else if (process.execPath.includes(\'LMS\')) { serviceName = \'LMS\'; }\r\n else if (process.execPath.includes(\'MeshCommander\')) { serviceName = \'MeshCommander\'; }\r\n if (serviceName == null) { for (var i in process.argv) { if ((process.argv[i].toLowerCase() == \'-install\') || (process.argv[i].toLowerCase() == \'-uninstall\')) { console.log(\'In order to install/uninstall, a service type must be specified.\'); process.exit(); } } }\r\n if (serviceName == null) { try { run(process.argv); } catch (e) { console.log("ERROR: " + e); } }\r\n} else {\r\n var serviceHost = require(\'service-host\');\r\n var meshcmdService = new serviceHost({ name: serviceName, displayName: serviceDisplayName, startType: \'AUTO_START\', description: serviceDesc });\r\n\r\n // Called when the background service is started.\r\n meshcmdService.on(\'serviceStart\', function onStart() {\r\n //process.coreDumpLocation = \'C:\\\\tmp\\\\meshcommander.dmp\';\r\n //process.on(\'exit\', function () { console.log(\'exit3\'); _debugCrash(); });\r\n console.setDestination(console.Destinations.DISABLED); // Disable console.log().\r\n //console.setDestination(console.Destinations.LOGFILE);\r\n //attachDebuger({ webport: 0, wait: 1 }).then(console.log, console.log);\r\n\r\n if (process.execPath.includes(\'MicroLMS\')) { run([process.execPath, \'microlms\']); } // Start MicroLMS\r\n else if (process.execPath.includes(\'LMS\')) { run([process.execPath, \'microlms\']); } // Start MicroLMS\r\n else if (process.execPath.includes(\'MeshCommander\')) { run([process.execPath, \'meshcommander\']); } // Start MeshCommander\r\n else { console.log("Aborting Service Start, because unknown binary: " + process.execPath); process.exit(1); }\r\n });\r\n\r\n // Called when the background service is stopping\r\n meshcmdService.on(\'serviceStop\', function onStop() { console.log("Stopping service"); process.exit(); }); // The console.log() is for debugging, will be ignored unless "console.setDestination()" is set.\r\n\r\n // Called when the executable is not running as a service, run normally.\r\n meshcmdService.on(\'normalStart\', function onNormalStart() { try { run(process.argv); } catch (e) { console.log("ERROR: " + e); } });\r\n meshcmdService.run();\r\n}\r\n', - defaultMeshCores: - { 'windows-amt': '\u0000\u0000\u0000\u0000var addedModules = [];\r\ntry { addModule("amt-apfclient", "function CreateAPFClient(q,e){if((e.clientuuid==null)||(e.clientuuid.length!=36)){return null}var o={};o.parent=q;o.args=e;o.http=require(\\"http\\");o.net=require(\\"net\\");o.forwardClient=null;o.downlinks={};o.pfwd_idx=0;o.timer=null;function u(L,K){return(L.charCodeAt(K)*16777216)+(L.charCodeAt(K+1)<<16)+(L.charCodeAt(K+2)<<8)+L.charCodeAt(K+3)}function n(K){return String.fromCharCode((K>>24)&255,(K>>16)&255,(K>>8)&255,K&255)}function m(K){var M=\\"\\",L=(\\"\\"+K).match(/../g),N;while(N=L.shift()){M+=String.fromCharCode(\\"0x\\"+N)}return M}function h(K){return(K+256).toString(16).substr(-2).toUpperCase()}function w(L){var M=\\"\\",K;for(K=0;K0){o.forwardClient.tag.accumulator=o.forwardClient.tag.accumulator.slice(P)}if(o.cirastate==i.FAILED){k(\\"APF: in a failed state, destroying socket.\\");o.forwardClient.ws.end()}}while(P>0)}catch(O){k(O)}});o.forwardClient.ws.on(\\"error\\",function(N){k(\\"APF: Connection error, ending connecting.\\");if(o.timer!=null){clearInterval(o.timer);o.timer=null}});o.state=i.INITIAL;if((typeof o.args.conntype==\\"number\\")&&(o.args.conntype!=0)){D(o.forwardClient.ws,{action:\\"connType\\",value:o.args.conntype});if(o.args.meiState!=null){D(o.forwardClient.ws,{action:\\"meiState\\",value:o.args.meiState})}}G(o.forwardClient.ws,o.args.clientuuid);H(o.forwardClient.ws,\\"auth@amt.intel.com\\")};o.updateMeiState=function(K){D(o.forwardClient.ws,{action:\\"meiState\\",value:K})};o.sendMeiDeactivationState=function(K){D(o.forwardClient.ws,{action:\\"deactivate\\",value:K})};o.sendStartTlsHostConfigResponse=function(K){D(o.forwardClient.ws,{action:\\"startTlsHostConfig\\",value:K})};o.sendStopConfigurationResponse=function(K){D(o.forwardClient.ws,{action:\\"stopConfiguration\\",value:K})};function D(M,L){var K=JSON.stringify(L);M.write(String.fromCharCode(d.JSON_CONTROL)+n(K.length)+K);k(\\"APF: Send JSON control: \\"+K)}function G(L,M){var K=String.fromCharCode(d.PROTOCOLVERSION)+n(1)+n(0)+n(0)+m(J(M))+f(64);L.write(K);k(\\"APF: Send protocol version 1 0 \\"+M);o.cirastate=i.PROTOCOL_VERSION_SENT}function H(M,L){var K=String.fromCharCode(d.SERVICE_REQUEST)+n(L.length)+L;M.write(K);k(\\"APF: Send service request \\"+L);if(L==\\"auth@amt.intel.com\\"){o.cirastate=i.AUTH_SERVICE_REQUEST_SENT}else{if(L==\\"pfwd@amt.intel.com\\"){o.cirastate=i.PFWD_SERVICE_REQUEST_SENT}}}function I(N,O,L){var M=\\"pfwd@amt.intel.com\\";var K=String.fromCharCode(d.USERAUTH_REQUEST)+n(O.length)+O+n(M.length)+M;K+=n(8)+\\"password\\";K+=f(1)+n(L.length)+L;N.write(K);k(\\"APF: Send username password authentication to MPS\\");o.cirastate=i.AUTH_REQUEST_SENT}function C(N,K,L){var O=\\"tcpip-forward\\";var M=String.fromCharCode(d.GLOBAL_REQUEST)+n(O.length)+O+f(1,1);M+=n(K.length)+K+n(L);N.write(M);k(\\"APF: Send tcpip-forward \\"+K+\\":\\"+L);o.cirastate=i.GLOBAL_REQUEST_SENT}function F(K){K.write(String.fromCharCode(d.KEEPALIVE_REQUEST)+n(255));k(\\"APF: Send keepalive request\\")}function E(L,K){L.write(String.fromCharCode(d.KEEPALIVE_REPLY)+n(K));k(\\"APF: Send keepalive reply\\")}function t(X){var N=X.tag.accumulator.charCodeAt(0);var Q=X.tag.accumulator.length;var O=X.tag.accumulator;if(Q==0){return 0}switch(N){case d.SERVICE_ACCEPT:var W=u(O,1),V=O.substring(5,6+W);k(\\"APF: Service request to \\"+V+\\" accepted.\\");if(V==\\"auth@amt.intel.com\\"){if(o.cirastate>=i.AUTH_SERVICE_REQUEST_SENT){I(X.ws,o.args.mpsuser,o.args.mpspass)}}else{if(V==\\"pfwd@amt.intel.com\\"){if(o.cirastate>=i.PFWD_SERVICE_REQUEST_SENT){C(X.ws,o.args.clientname,s[o.pfwd_idx++])}}}return 5+W;case d.REQUEST_SUCCESS:if(Q>=5){var T=u(O,1);k(\\"APF: Request to port forward \\"+T+\\" successful.\\");if(o.pfwd_idx=0){var K=o.net.createConnection({host:o.args.clientaddress,port:S.target_port},function(){z(X.ws,S)});K.maxInWindow=S.window_size;K.curInWindow=0;K.on(\\"data\\",function(Y){y(X.ws,S.sender_chan,Y)});K.on(\\"error\\",function(Y){A(X.ws,S)});K.on(\\"end\\",function(){var Y=o.downlinks[S.sender_chan];if(Y!=null){k(\\"Socket ends.\\");try{x(X.ws,S.sender_chan)}catch(Z){}delete o.downlinks[S.sender_chan]}});o.downlinks[S.sender_chan]=K}else{A(X.ws,S)}return S.len;case d.CHANNEL_OPEN_CONFIRMATION:k(\\"APF: CHANNEL_OPEN_CONFIRMATION\\");return 17;case d.CHANNEL_CLOSE:var U=u(O,1);k(\\"APF: CHANNEL_CLOSE: \\"+U);try{o.downlinks[U].end()}catch(P){}return 5;case d.CHANNEL_DATA:k(\\"APF: CHANNEL_DATA: \\"+JSON.stringify(w(O)));var U=u(O,1);var M=u(O,5);var L=O.substring(9,9+M);var K=o.downlinks[U];if(K!=null){K.curInWindow+=M;try{K.write(Buffer.from(L,\\"binary\\"),function(){k(\\"Write completed.\\");if(this.curInWindow>(this.maxInWindow/2)){B(X.ws,U,this.curInWindow);this.curInWindow=0}})}catch(P){k(\\"Cannot forward data to downlink socket.\\")}}return 9+M;case d.CHANNEL_WINDOW_ADJUST:k(\\"APF: CHANNEL_WINDOW_ADJUST\\");return 9;case d.JSON_CONTROL:k(\\"APF: JSON_CONTROL\\");var Q=u(O,1);if(o.onJsonControl){var R=null;try{R=JSON.parse(O.substring(5,5+Q))}catch(P){}if(R!=null){o.onJsonControl(R)}}return 5+Q;default:k(\\"CMD: \\"+N+\\" is not implemented.\\");o.cirastate=i.FAILED;return 0}}function r(M){var O={cmd:d.CHANNEL_OPEN};var L=u(M,1);O.chan_type=M.substring(5,5+L);O.sender_chan=u(M,5+L);O.window_size=u(M,9+L);var K=u(M,17+L);O.target_address=M.substring(21+L,21+L+K);O.target_port=u(M,21+L+K);var N=u(M,25+L+K);O.origin_address=M.substring(29+L+K,29+L+K+N);O.origin_port=u(M,29+L+K+N);O.len=33+L+K+N;return O}function A(L,K){L.write(String.fromCharCode(d.CHANNEL_OPEN_FAILURE)+n(K.sender_chan)+n(2)+n(0)+n(0));k(\\"APF: Send ChannelOpenFailure\\")}function z(L,K){L.write(String.fromCharCode(d.CHANNEL_OPEN_CONFIRMATION)+n(K.sender_chan)+n(K.sender_chan)+n(K.window_size)+n(4294967295));k(\\"APF: Send ChannelOpenConfirmation\\")}function B(M,K,L){M.write(String.fromCharCode(d.CHANNEL_WINDOW_ADJUST)+n(K)+n(L));k(\\"APF: Send ChannelWindowAdjust, channel: \\"+K+\\", size: \\"+L)}function y(M,K,L){M.write(Buffer.concat([Buffer.from(String.fromCharCode(d.CHANNEL_DATA)+n(K)+n(L.length),\\"binary\\"),L]));k(\\"APF: Send ChannelData: \\"+L.toString(\\"hex\\"))}function x(L,K){L.write(String.fromCharCode(d.CHANNEL_CLOSE)+n(K));k(\\"APF: Send ChannelClose \\")}o.connect=function(){if(o.forwardClient!=null){try{o.forwardClient.ws.end()}catch(K){k(K)}}o.cirastate=i.INITIAL;o.pfwd_idx=0;var L=o.http.parseUri(o.args.mpsurl);L.rejectUnauthorized=0;o.forwardClient=o.http.request(L);o.forwardClient.upgrade=o.onSecureConnect;o.forwardClient.end()};o.disconnect=function(){try{o.forwardClient.ws.end()}catch(K){k(K)}};return o}module.exports=CreateAPFClient;"); addedModules.push("amt-apfclient"); } catch (e) { }\r\ntry { addModule("amt-lme", "var MemoryStream=require(\\"MemoryStream\\");var lme_id=0;var lme_port_offset=0;var xmlParser=null;try{xmlParser=require(\\"amt-xml\\")}catch(ex){}var APF_DISCONNECT=1;var APF_SERVICE_REQUEST=5;var APF_SERVICE_ACCEPT=6;var APF_USERAUTH_REQUEST=50;var APF_USERAUTH_FAILURE=51;var APF_USERAUTH_SUCCESS=52;var APF_GLOBAL_REQUEST=80;var APF_REQUEST_SUCCESS=81;var APF_REQUEST_FAILURE=82;var APF_CHANNEL_OPEN=90;var APF_CHANNEL_OPEN_CONFIRMATION=91;var APF_CHANNEL_OPEN_FAILURE=92;var APF_CHANNEL_WINDOW_ADJUST=93;var APF_CHANNEL_DATA=94;var APF_CHANNEL_CLOSE=97;var APF_PROTOCOLVERSION=192;function lme_object(){this.ourId=++lme_id;this.amtId=-1;this.LME_CHANNEL_STATUS=\\"LME_CS_FREE\\";this.txWindow=0;this.rxWindow=0;this.localPort=0;this.errorCount=0}function stream_bufferedWrite(){var a=require(\\"events\\").inherits(this);this.buffer=[];this._readCheckImmediate=undefined;this._ObjectID=\\"bufferedWriteStream\\";a.createEvent(\\"close\\");a.createEvent(\\"drain\\");a.createEvent(\\"error\\");a.createEvent(\\"finish\\");a.createEvent(\\"pipe\\");a.createEvent(\\"unpipe\\");a.createEvent(\\"readable\\");this.isEmpty=function(){return(this.buffer.length==0)};this.isWaiting=function(){return(this._readCheckImmediate==undefined)};this.write=function(c){for(var b in arguments){if(typeof(arguments[b])==\\"function\\"){this.once(\\"drain\\",arguments[b]);break}}var d=Buffer.alloc(c.length);c.copy(d);this.buffer.push({offset:0,data:d});this.emit(\\"readable\\");return(this.buffer.length==0?true:false)};this.read=function(){var f=arguments.length==0?undefined:arguments[0];var b=0;var d=[];while((f==undefined||b0){var c=this.buffer[0].data.length-this.buffer[0].offset;var e=this.buffer[0].offset;if(c>(f-b)){d.push(this.buffer[0].data.slice(e,e+f-b));this.buffer[0].offset+=(f-b);b+=(f-b)}else{d.push(this.buffer[0].data.slice(e));b+=c;this.buffer.shift()}}this._readCheckImmediate=setImmediate(function(g){g._readCheckImmediate=undefined;if(g.buffer.length==0){g.emit(\\"drain\\")}else{g.emit(\\"readable\\")}},this);return(Buffer.concat(d))}}function lme_heci(c){var a=require(\\"events\\").inherits(this);a.createEvent(\\"error\\");a.createEvent(\\"connect\\");a.createEvent(\\"notify\\");a.createEvent(\\"bind\\");this.on(\\"newListener\\",function(e,d){if(e==\\"connect\\"&&this._LME._connected==true){d.call(this)}});if((c!=null)&&(c.debug==true)){lme_port_offset=-100}var b=require(\\"heci\\");this.INITIAL_RXWINDOW_SIZE=4096;this._ObjectID=\\"lme\\";this._LME=b.create();this._LME._connected=false;this._LME.descriptorMetadata=\\"amt-lme\\";this._LME._binded={};this._LME.LMS=this;this._LME.on(\\"error\\",function(d){this.LMS.emit(\\"error\\",d)});this._LME.on(\\"connect\\",function(){this._connected=true;this.on(\\"data\\",function(k){var l=k.readUInt8(0);switch(l){default:console.log(\\"Unhandled LME Command \\"+l+\\", \\"+k.length+\\" byte(s).\\");break;case APF_SERVICE_REQUEST:var A=k.readUInt32BE(1);var z=k.slice(5,A+5);if(z==\\"pfwd@amt.intel.com\\"||z==\\"auth@amt.intel.com\\"){var G=Buffer.alloc(5+A);G.writeUInt8(6,0);G.writeUInt32BE(A,1);G.write(z.toString(),5);this.write(G)}else{}break;case APF_GLOBAL_REQUEST:var A=k.readUInt32BE(1);var z=k.slice(5,A+5).toString();switch(z){case\\"tcpip-forward\\":var w=k.readUInt32BE(A+6);var H=k.readUInt32BE(A+10+w);if(this[z]==undefined){this[z]={}}if(this[z][H]!=null){for(var t in this.sockets){var h=this.sockets[t];if(h.localPort==H){this.sockets[t].end();delete this.sockets[t]}}}if(this[z][H]==null){try{this[z][H]=require(\\"net\\").createServer();this[z][H].descriptorMetadata=\\"amt-lme (port: \\"+H+\\")\\";this[z][H].HECI=this;if(lme_port_offset==0){this[z][H].listen({port:H,host:\\"127.0.0.1\\"})}else{this[z][H].listen({port:(H+lme_port_offset)})}this[z][H].on(\\"connection\\",function(e){this.HECI.LMS.bindDuplexStream(e,e.remoteFamily,e.localPort-lme_port_offset)});this._binded[H]=true;this.LMS.emit(\\"bind\\",this._binded)}catch(p){console.log(p,\\"Port \\"+H)}}var G=Buffer.alloc(5);G.writeUInt8(81,0);G.writeUInt32BE(H,1);this.write(G);break;case\\"cancel-tcpip-forward\\":var G=Buffer.alloc(1);G.writeUInt8(APF_REQUEST_SUCCESS,0);this.write(G);break;case\\"udp-send-to@amt.intel.com\\":var G=Buffer.alloc(1);G.writeUInt8(APF_REQUEST_FAILURE,0);this.write(G);break;default:break}break;case APF_CHANNEL_OPEN_CONFIRMATION:var J=k.readUInt32BE(1);var N=k.readUInt32BE(5);var O=k.readUInt32BE(9);if(this.sockets[J]!=undefined){this.sockets[J].lme.amtId=N;this.sockets[J].lme.rxWindow=O;this.sockets[J].lme.txWindow=O;this.sockets[J].lme.LME_CHANNEL_STATUS=\\"LME_CS_CONNECTED\\";this.sockets[J].bufferedStream=new stream_bufferedWrite();this.sockets[J].bufferedStream.socket=this.sockets[J];this.sockets[J].bufferedStream.on(\\"readable\\",function(){if(this.socket.lme.txWindow>0){var e=this.read(this.socket.lme.txWindow);var i=Buffer.alloc(9+e.length);i.writeUInt8(APF_CHANNEL_DATA,0);i.writeUInt32BE(this.socket.lme.amtId,1);i.writeUInt32BE(e.length,5);e.copy(i,9);this.socket.lme.txWindow-=e.length;this.socket.HECI.write(i)}});this.sockets[J].bufferedStream.on(\\"drain\\",function(){this.socket.resume()});this.sockets[J].on(\\"data\\",function(e){if(!this.bufferedStream.write(e)){this.pause()}});this.sockets[J].on(\\"end\\",function(){var e=Buffer.alloc(5);e.writeUInt8(APF_CHANNEL_CLOSE,0);e.writeUInt32BE(this.lme.amtId,1);this.HECI.write(e)});this.sockets[J].resume()}break;case APF_PROTOCOLVERSION:var x=k.readUInt32BE(1);var y=k.readUInt32BE(5);var L=k.readUInt32BE(9);var G=Buffer.alloc(93);G.writeUInt8(192,0);G.writeUInt32BE(1,1);G.writeUInt32BE(0,5);G.writeUInt32BE(L,9);this.write(G);break;case APF_CHANNEL_WINDOW_ADJUST:var K=k.readUInt32BE(1);var g=k.readUInt32BE(5);if(this.sockets[K]!=undefined){this.sockets[K].lme.txWindow+=g;if(!this.sockets[K].bufferedStream.isEmpty()&&this.sockets[K].bufferedStream.isWaiting()){this.sockets[K].bufferedStream.emit(\\"readable\\")}}else{console.log(\\"Unknown Recipient ID/\\"+K+\\" for APF_CHANNEL_WINDOW_ADJUST\\")}break;case APF_CHANNEL_DATA:var K=k.readUInt32BE(1);var n=k.readUInt32BE(5);var m=k.slice(9,9+n);if((this.sockets!=null)&&(this.sockets[K]!=undefined)){this.sockets[K].pendingBytes.push(m.length);this.sockets[K].write(m,function(){var i=this.pendingBytes.shift();var e=Buffer.alloc(9);e.writeUInt8(APF_CHANNEL_WINDOW_ADJUST,0);e.writeUInt32BE(this.lme.amtId,1);e.writeUInt32BE(i,5);this.HECI.write(e)})}else{if((this.insockets!=null)&&(this.insockets[K]!=undefined)){var h=this.insockets[K];if(h.data==null){h.data=m.toString()}else{h.data+=m.toString()}h.rxWindow+=n;var s=parseHttp(h.data);if((s!=null)||(h.data.length>=8000)){var B=null;if(xmlParser!=null){try{B=xmlParser.ParseWsman(s)}catch(o){}}if(B!=null){this.LMS.emit(\\"notify\\",B,h.options,_lmsNotifyToCode(B))}var f=Buffer.alloc(5);f.writeUInt8(APF_CHANNEL_CLOSE,0);f.writeUInt32BE(d,1);this.write(f)}else{if(h.rxWindow>6000){var f=Buffer.alloc(9);f.writeUInt8(APF_CHANNEL_WINDOW_ADJUST,0);f.writeUInt32BE(h.amtId,1);f.writeUInt32BE(h.rxWindow,5);this.write(f);h.rxWindow=0}}}else{console.log(\\"Unknown Recipient ID/\\"+K+\\" for APF_CHANNEL_DATA\\")}}break;case APF_CHANNEL_OPEN_FAILURE:var K=k.readUInt32BE(1);var M=k.readUInt32BE(5);if((this.sockets!=null)&&(this.sockets[K]!=undefined)){this.sockets[K].end();delete this.sockets[K]}else{if((this.insockets!=null)&&(this.insockets[K]!=undefined)){delete this.insockets[K]}else{console.log(\\"Unknown Recipient ID/\\"+K+\\" for APF_CHANNEL_OPEN_FAILURE\\")}}break;case APF_CHANNEL_CLOSE:var K=k.readUInt32BE(1);if((this.sockets!=null)&&(this.sockets[K]!=undefined)){this.sockets[K].end();var d=this.sockets[K].lme.amtId;var f=Buffer.alloc(5);delete this.sockets[K];f.writeUInt8(APF_CHANNEL_CLOSE,0);f.writeUInt32BE(d,1);this.write(f)}else{if((this.insockets!=null)&&(this.insockets[K]!=undefined)){delete this.insockets[K]}else{console.log(\\"Unknown Recipient ID/\\"+K+\\" for APF_CHANNEL_CLOSE\\")}}break;case APF_CHANNEL_OPEN:var A=k.readUInt32BE(1);var z=k.slice(5,A+5).toString();var j=k.readUInt32BE(A+5);var u=k.readUInt32BE(A+9);var r=k.readUInt32BE(A+17);var q=k.slice(A+21,A+21+r).toString();var I=k.readUInt32BE(A+21+r);var D=k.readUInt32BE(A+25+r);var C=k.slice(A+29+r,A+29+r+D).toString();var E=k.readUInt32BE(A+29+r+D);if(this.insockets==null){this.insockets={}}var F=++lme_id;var v=new lme_object();v.ourId=F;v.amtId=j;v.txWindow=u;v.rxWindow=0;v.options={target:q,targetPort:I,source:C,sourcePort:E};this.insockets[F]=v;var f=Buffer.alloc(17);f.writeUInt8(APF_CHANNEL_OPEN_CONFIRMATION,0);f.writeUInt32BE(j,1);f.writeUInt32BE(F,5);f.writeUInt32BE(4000,9);f.writeUInt32BE(4294967295,13);this.write(f);break}});this.LMS.emit(\\"connect\\");this.resume()});this.bindDuplexStream=function(e,h,g){var j=e;j.pendingBytes=[];j.HECI=this._LME;j.LMS=this;j.lme=new lme_object();j.lme.Socket=j;j.localPort=g;var d=new MemoryStream();d.writeUInt8(90);d.writeUInt32BE(15);d.write(\\"forwarded-tcpip\\");d.writeUInt32BE(j.lme.ourId);d.writeUInt32BE(this.INITIAL_RXWINDOW_SIZE);d.writeUInt32BE(4294967295);for(var f=0;f<2;++f){if(h==\\"IPv6\\"){d.writeUInt32BE(3);d.write(\\"::1\\")}else{d.writeUInt32BE(9);d.write(\\"127.0.0.1\\")}d.writeUInt32BE(g)}this._LME.write(d.buffer);if(this._LME.sockets==undefined){this._LME.sockets={}}this._LME.sockets[j.lme.ourId]=j;j.pause()};this._LME.connect(b.GUIDS.LME,{noPipeline:0})}function parseHttp(c){var d=c.indexOf(\\"\\\\r\\\\n\\\\r\\\\n\\");if((d==-1)||(c.length<(d+2))){return null}var b=require(\\"http-headers\\")(c.substring(0,d),true);var a=parseInt(b[\\"content-length\\"]);if(c.length>=a+d+4){return c.substring(d+4,d+4+a)}return null}function _lmsNotifyToCode(c){if((c==null)||(c.Body==null)||(c.Body.MessageID==null)){return null}var b=c.Body.MessageID;try{b+=\\"-\\"+c.Body.MessageArguments[0]}catch(a){}return b}module.exports=lme_heci;"); addedModules.push("amt-lme"); } catch (e) { }\r\ntry { addModule("amt-manage", "function AmtManager(a,g,k){var o=function(r){a.SendCommand({action:\\"msg\\",type:\\"console\\",value:r})};var h=function(r){if(k){o(\\"amt-manager: \\"+r+\\"
\\")}};var e=null,f=0;var c=null,d=0;var b=null;var m=this;var l;var q=null;require(\\"events\\").EventEmitter.call(m,true).createEvent(\\"stateChange_LMS\\").createEvent(\\"portBinding_LMS\\");m._lmsstate=0;m._mapping=[];m.on(\\"newListener\\",function(s,r){if(s==\\"portBinding_LMS\\"){r.call(this,this._mapping)}});Object.defineProperty(m,\\"lmsstate\\",{get:function(){return(this._lmsstate)},set:function(r){if(this._lmsstate!=r){this._lmsstate=r;this.emit(\\"stateChange_LMS\\",r)}}});m.state=0;m.onStateChange=null;m.setDebug=function(r){k=r};var n=0;m.reset=function(){++n;m.amtMei=null,e=null,f=0,c=null,d=0,m.state=0,m.lmsstate=0;try{var r=require(\\"amt-mei\\");m.amtMei=e=new r();e.on(\\"error\\",function(t){h(\\"MEI error\\");e=null;f=-1;m.state=-1;if(m.onStateChange!=null){m.onStateChange(f)}});e.getVersion(function(t){if(t==null){m.state=f=-1;if(m.onStateChange!=null){m.onStateChange(f)}if(n<10){setTimeout(m.reset,10000)}}else{b=t;m.state=f=2;n=0;if(m.onStateChange!=null){m.onStateChange(f)}m.lmsreset()}})}catch(s){h(\\"MEI exception: \\"+s);e=null;f=-1;m.state=-1}};var i={};m.getMeiState=function(t,u){if((e==null)||(f<2)){if(u!=null){u(null)}return}try{var r={\\"core-ver\\":1,OsHostname:require(\\"os\\").hostname(),Flags:0};if(i.MeiVersion!=null){r.MeiVersion=i.MeiVersion}else{e.getProtocolVersion(function(v){if(v!=null){i.MeiVersion=r.MeiVersion=v}})}if((t&1)!=0){if(i.Versions!=null){r.Versions=i.Versions}else{e.getVersion(function(v){if(v){i.Versions=r.Versions={};for(var w in v.Versions){r.Versions[v.Versions[w].Description]=v.Versions[w].Version}}})}}e.getProvisioningMode(function(v){if(v){r.ProvisioningMode=v.mode}});e.getProvisioningState(function(v){if(v){r.ProvisioningState=v.state;if(v.state!=2){e.stopConfiguration(function(){})}}});e.getEHBCState(function(v){if((v!=null)&&(v.EHBC==true)){r.Flags+=1}});e.getControlMode(function(v){if(v!=null){if(v.controlMode==1){r.Flags+=2}if(v.controlMode==2){r.Flags+=4}}});if((t&8)!=0){e.getLanInterfaceSettings(0,function(z){if(z){r.net0=z;var v=null,x=require(\\"os\\").networkInterfaces();for(var w in x){for(var y in x[w]){if((x[w][y].mac==z.mac)&&(x[w][y].fqdn!=null)&&(x[w][y].fqdn!=\\"\\")){r.OsDnsSuffix=x[w][y].fqdn}}}}});e.getLanInterfaceSettings(1,function(v){if(v){r.net1=v}})}if(i.UUID!=null){r.UUID=i.UUID}else{e.getUuid(function(v){if((v!=null)&&(v.uuid!=null)){i.UUID=r.UUID=v.uuid}})}if((t&2)!=0){e.getLocalSystemAccount(function(v){if((v!=null)&&v.user&&v.pass){r.OsAdmin={user:v.user,pass:v.pass}}})}e.getDnsSuffix(function(v){if(v!=null){r.DnsSuffix=v}if((t&4)==0){if(u!=null){u(r)}}});if((t&4)!=0){e.getHashHandles(function(w){if((w!=null)&&(w.length>0)){r.Hashes=[]}else{u(r)}var v=w.length;for(var x=0;x=0){return E.substring(0,F)}else{return E}}this.getCommand=function g(E){var F=E.length==0?(this._rq.peekQueue().cmd|8388608):E.readUInt32LE(4);var G={IsResponse:(F&8388608)==8388608?true:false,Command:(F&8388607),Status:E.length!=0?E.readUInt32LE(12):-1,Data:E.length!=0?E.slice(16):null};return(G)};this.sendCommand=function w(){if(arguments.length<3||typeof(arguments[0])!=\\"number\\"||typeof(arguments[1])!=\\"object\\"||typeof(arguments[2])!=\\"function\\"){throw (\\"invalid parameters\\")}var E=[];for(var G=3;G0){N.BiosVersion=N.BiosVersion.substring(0,N.BiosVersion.indexOf(\\"\\\\0\\"))}L.unshift(N)}else{L.unshift(null)}I.apply(this,L)},E,G)};function D(G,F){if((F==null)&&(typeof(F)!=\\"number\\")){return null}if(G==null){G=\\"\\"}var H=\\"\\";for(var E=0;E0){J.unshift(I.Data.slice(2,2+K).toString())}else{J.unshift(null)}}else{J.unshift(null)}H.apply(this,J)},E,G)};this.getHashHandles=function k(E){var G=[];for(var F=1;F0){this.getCertHashEntry(G.shift(),this._getHashEntrySink,F,H,E,G)}else{H.unshift(E);F.apply(this,H)}};this.getLocalSystemAccount=function m(E){var G=[];for(var F=1;F>24)&255)+\\".\\"+((K>>16)&255)+\\".\\"+((K>>8)&255)+\\".\\"+(K&255);O.unshift(N);L.apply(this,O)}else{O.unshift(null);L.apply(this,O)}},E,J)};this.unprovision=function C(H,E){var I=[];for(var G=2;G0?this[this.length-1]:undefined)}})}catch(e){}try{Object.defineProperty(String.prototype,\\"replaceAll\\",{value:function replaceAll(b,a){return(this.split(b).join(a))}})}catch(e){}var RSMB=1381190978;var memoryLocation={1:\\"Other\\",2:\\"Unknown\\",3:\\"System Board\\",4:\\"ISA\\",5:\\"EISA\\",6:\\"PCI\\",7:\\"MCA\\",8:\\"PCMCIA\\",9:\\"Proprietary\\",10:\\"NuBus\\",160:\\"PC-98/C20\\",161:\\"PC-98/C24\\",162:\\"PC-98/E\\",163:\\"PC-98/LB\\"};var wakeReason=[\\"Reserved\\",\\"Other\\",\\"Unknown\\",\\"APM Timer\\",\\"Modem Ring\\",\\"LAN\\",\\"Power Switch\\",\\"PCI\\",\\"AC Power\\"];function zeroLeftPad(c,b){if((b==null)&&(typeof(b)!=\\"number\\")){return null}if(c==null){c=\\"\\"}var d=\\"\\";for(var a=0;a1){var r=v[1].split(\\"\\\\x0A\\\\x0A\\")[0].split(\\"\\\\x0A\\");var s=[];for(var t in r){var u=r[t].trim().replaceAll(\\" \\",\\"\\").replaceAll(\\"\\\\x09\\",\\"\\");if(!(u[0]==\\\'\\"\\\')){s.push(u)}}p.write(Buffer.from(s.join(\\"\\"),\\"hex\\"));p.write(Buffer.from(\\"00\\",\\"hex\\"))}else{p.write(Buffer.from(\\"0000\\",\\"hex\\"))}}var q=p.buffer;q.ms=p;return(q)}}this._parse=function b(o){var n={};var m;var l=0;var o;var s=0;while(o&&l65535){n={}}}catch(m){}return n};this.processorInfo=function h(l){if(!l){throw (\\"no data\\")}var r=[];var q=[\\"ERROR\\",\\"Other\\",\\"Unknown\\",\\"CPU\\",\\"ALU\\",\\"DSP\\",\\"GPU\\"];var t=[\\"Unknown\\",\\"Enabled\\",\\"Disabled by user\\",\\"Disabled by BIOS\\",\\"Idle\\",\\"Reserved\\",\\"Reserved\\",\\"Other\\"];var k=0;while(l[4]&&l[4].length>0){var n=l[4].pop();var o=n[20]&64;var s=n[20]&7;if(o){var m={_ObjectID:\\"SMBiosTables.processorInfo\\"};m.Processor=q[n[1]];m.MaxSpeed=n.readUInt16LE(16)+\\" Mhz\\";if(n[31]){m.Cores=n[31]}if(n[33]){m.Threads=n[33]}m.Populated=1;m.Status=t[s];m.Socket=n._strings[n[0]-1];m.Manufacturer=n._strings[n[3]-1];m.Version=n._strings[n[12]-1];r.push(m)}}return(r)};this.memoryInfo=function f(k){if(!k){throw (\\"no data\\")}var n={_ObjectID:\\"SMBiosTables.memoryInfo\\"};if(k[16]){var l=k[16].peek();n.location=memoryLocation[l[0]];if((n.maxCapacityKb=l.readUInt32LE(3))==2147483648){n.maxCapacityKb=\\"A really big number\\"}}return(n)};this.systemInfo=function i(k){if(!k){throw (\\"no data\\")}var l={_ObjectID:\\"SMBiosTables.systemInfo\\"};if(k[1]){var m=k[1].peek();var n=m.slice(4,20);l.uuid=[zeroLeftPad(n.readUInt32LE(0).toString(16),8),zeroLeftPad(n.readUInt16LE(4).toString(16),4),zeroLeftPad(n.readUInt16LE(6).toString(16),4),zeroLeftPad(n.readUInt16BE(8).toString(16),4),zeroLeftPad(n.slice(10).toString(\\"hex\\").toLowerCase(),12)].join(\\"-\\");l.wakeReason=wakeReason[m[20]]}return(l)};this.systemSlots=function j(k){if(!k){throw (\\"no data\\")}var l=[];if(k[9]){while(k[9].length>0){var m=k[9].pop();l.push({name:m._strings[m[0]-1]})}}return(l)};this.amtInfo=function c(l){if(!l){throw (\\"no data\\")}var n={AMT:false};if(l[130]&&l[130].peek().slice(0,4).toString()==\\"$AMT\\"){var k=l[130].peek();n.AMT=k[4]?true:false;if(n.AMT){n.enabled=k[5]?true:false;n.storageRedirection=k[6]?true:false;n.serialOverLan=k[7]?true:false;n.kvm=k[14]?true:false;if(l[131].peek()&&l[131].peek().slice(52,56).toString()==\\"vPro\\"){var o=l[131].peek();if(o[0]&4){n.TXT=(o[0]&8)?true:false}if(o[0]&16){n.VMX=(o[0]&32)?true:false}n.MEBX=o.readUInt16LE(4).toString()+\\".\\"+o.readUInt16LE(6).toString()+\\".\\"+o.readUInt16LE(8).toString()+\\".\\"+o.readUInt16LE(10).toString();var m=o.slice(20,32);n.ManagementEngine=m.readUInt16LE(6).toString()+\\".\\"+m.readUInt16LE(4).toString()+\\".\\"+m.readUInt16LE(10).toString()+\\".\\"+m.readUInt16LE(8).toString()}}}return(n)};this.smTableTypes={0:\\"BIOS information\\",1:\\"System information\\",2:\\"Baseboard (or Module) information\\",4:\\"Processor information\\",5:\\"memory controller information\\",6:\\"Memory module information\\",7:\\"Cache information\\",8:\\"Port connector information\\",9:\\"System slots\\",10:\\"On board devices information\\",11:\\"OEM strings\\",12:\\"System configuration options\\",13:\\"BIOS language information\\",14:\\"Group associations\\",15:\\"System event log\\",16:\\"Physical memory array\\",17:\\"Memory device\\",18:\\"32bit memory error information\\",19:\\"Memory array mapped address\\",20:\\"Memory device mapped address\\",21:\\"Built-in pointing device\\",22:\\"Portable battery\\",23:\\"System reset\\",24:\\"Hardware security\\",25:\\"System power controls\\",26:\\"Voltage probe\\",27:\\"Cooling device\\",28:\\"Temperature probe\\",29:\\"Electrical current probe\\",30:\\"Out-of-band remote access\\",31:\\"Boot integrity services (BIS) entry point\\",32:\\"System boot information\\",33:\\"64bit memory error information\\",34:\\"Management device\\",35:\\"Management device component\\",36:\\"Management device threshold data\\",37:\\"Memory channel\\",38:\\"IPMI device information\\",39:\\"System power supply\\",40:\\"Additional information\\",41:\\"Onboard devices extended information\\",42:\\"Management controller host interface\\",126:\\"Inactive\\",127:\\"End-of-table\\"}}module.exports=new SMBiosTables();"); addedModules.push("smbios"); } catch (e) { }\r\ntry { addModule("sysinfo", "var PDH_FMT_LONG=256;var PDH_FMT_DOUBLE=512;var promise=require(\\"promise\\");if(process.platform==\\"win32\\"){var GM=require(\\"_GenericMarshal\\");GM.kernel32=GM.CreateNativeProxy(\\"kernel32.dll\\");GM.kernel32.CreateMethod(\\"GlobalMemoryStatusEx\\");GM.pdh=GM.CreateNativeProxy(\\"pdh.dll\\");GM.pdh.CreateMethod(\\"PdhAddEnglishCounterA\\");GM.pdh.CreateMethod(\\"PdhCloseQuery\\");GM.pdh.CreateMethod(\\"PdhCollectQueryData\\");GM.pdh.CreateMethod(\\"PdhGetFormattedCounterValue\\");GM.pdh.CreateMethod(\\"PdhGetFormattedCounterArrayA\\");GM.pdh.CreateMethod(\\"PdhOpenQueryA\\");GM.pdh.CreateMethod(\\"PdhRemoveCounter\\")}function windows_cpuUtilization(){var b=new promise(function(d,c){this._res=d;this._rej=c});b.counter=GM.CreateVariable(16);b.cpu=GM.CreatePointer();b.cpuTotal=GM.CreatePointer();var a=0;if((a=GM.pdh.PdhOpenQueryA(0,0,b.cpu).Val)!=0){b._rej(a);return}if((a=GM.pdh.PdhAddEnglishCounterA(b.cpu.Deref(),GM.CreateVariable(\\"\\\\\\\\Processor(*)\\\\\\\\% Processor Time\\"),0,b.cpuTotal).Val)!=0){b._rej(a);return}if((a=GM.pdh.PdhCollectQueryData(b.cpu.Deref()).Val!=0)){b._rej(a);return}b._timeout=setTimeout(function(k){var m={cpus:[]};var d=GM.CreateVariable(4);var j=GM.CreateVariable(4);var c,l,h;var f;if((f=GM.pdh.PdhCollectQueryData(k.cpu.Deref()).Val!=0)){k._rej(f);return}if((f=GM.pdh.PdhGetFormattedCounterArrayA(k.cpuTotal.Deref(),PDH_FMT_DOUBLE,d,j,0).Val)==-2147481646){c=GM.CreateVariable(d.toBuffer().readUInt32LE())}else{k._rej(f);return}if((f=GM.pdh.PdhGetFormattedCounterArrayA(k.cpuTotal.Deref(),PDH_FMT_DOUBLE,d,j,c).Val)!=0){k._rej(f);return}for(var g=0;g0){var f=c[0].split(\\":\\")[1];var a=f.split(\\",\\");var e=parseFloat(a[0].split(\\"%\\")[0].trim())+parseFloat(a[1].split(\\"%\\")[0].trim());d._res({total:e,cpus:[]})}else{d._rej(\\"parse error\\")}return(d)}function macos_memUtilization(){var d={};var e=new promise(function(h,g){this._res=h;this._rej=g});var b=require(\\"child_process\\").execFile(\\"/bin/sh\\",[\\"sh\\"]);b.stdout.str=\\"\\";b.stdout.on(\\"data\\",function(g){this.str+=g.toString()});b.stdin.write(\\\'top -l 1 | grep -E \\"^Phys\\"\\\\nexit\\\\n\\\');b.waitExit();var c=b.stdout.str.split(\\"\\\\n\\");if(c[0].length>0){var f=c[0].split(\\":\\")[1];var a=f.split(\\",\\");d.MemTotal=parseInt(a[0].trim().split(\\" \\")[0]);d.MemFree=parseInt(a[1].trim().split(\\" \\")[0]);d.percentFree=((d.MemFree/d.MemTotal)*100);d.percentConsumed=(((d.MemTotal-d.MemFree)/d.MemTotal)*100);return(d)}else{throw (\\"Parse Error\\")}}function windows_thermals(){var c=[];child=require(\\"child_process\\").execFile(process.env.windir+\\"\\\\\\\\System32\\\\\\\\wbem\\\\\\\\wmic.exe\\",[\\"wmic\\",\\"/namespace:\\\\\\\\\\\\\\\\root\\\\\\\\wmi\\",\\"PATH\\",\\"MSAcpi_ThermalZoneTemperature\\",\\"get\\",\\"CurrentTemperature\\"]);child.stdout.str=\\"\\";child.stdout.on(\\"data\\",function(d){this.str+=d.toString()});child.stderr.str=\\"\\";child.stderr.on(\\"data\\",function(d){this.str+=d.toString()});child.waitExit();if(child.stdout.str.trim!=\\"\\"){var b=child.stdout.str.trim().split(\\"\\\\r\\\\n\\");for(var a=1;a1){b.push(f[e].split(\\" \\")[3]);this.parent.kill()}}});a.stderr.str=\\"\\";a.stderr.on(\\"data\\",function(d){this.str+=d.toString()});a.stdin.write(\\"powermetrics -s smc\\\\n\\");a.waitExit(5000)}return(b)}switch(process.platform){case\\"linux\\":module.exports={cpuUtilization:linux_cpuUtilization,memUtilization:linux_memUtilization,thermals:linux_thermals};break;case\\"win32\\":module.exports={cpuUtilization:windows_cpuUtilization,memUtilization:windows_memUtilization,thermals:windows_thermals};break;case\\"darwin\\":module.exports={cpuUtilization:macos_cpuUtilization,memUtilization:macos_memUtilization,thermals:macos_thermals};break};"); addedModules.push("sysinfo"); } catch (e) { }\r\ntry { addModule("util-agentlog", "function parseLine(f){var n=f.match(/^\\\\[.*M\\\\]/);if(n==null){n=f.match(/\\\\[.+ => .+:[0-9]+\\\\]/);if(n!=null){var g=n[0].substring(1).match(/(?!.+ ).+(?=:)/);var j=n[0].match(/(?!:)[0-9]+(?=\\\\]$)/);var h=n[0].match(/(?!\\\\[).+(?= =>)/);if(g!=null){this.results.peek().f=g[0].trim()}if(j!=null){this.results.peek().l=j[0]}if(h!=null){this.results.peek().fn=h[0]}}else{n=f.match(/^[\\\\.\\\\/].+\\\\(\\\\) \\\\[0x[0-9a-fA-F]+\\\\]$/);if(n!=null){n=n[0].match(/(?!\\\\[)0x[0-9a-fA-F]+(?=\\\\]$)/);if(n!=null){if(this.results.peek().sx==null){this.results.peek().sx=[]}this.results.peek().sx.unshift(n[0])}}else{n=f.match(/^\\\\[.+_[0-9a-fA-F]{16}\\\\]$/);if(n!=null){n=n[0].match(/(?!_)[0-9a-fA-F]{16}(?=\\\\]$)/);this.results.peek().h=n[0]}}n=f.match(/(?!^=>)\\\\/+.+:[0-9]+$/);if(n!=null){if(this.results.peek().s==null){this.results.peek().s=[]}this.results.peek().s.unshift(n[0])}}return}n=n[0];var e=n.substring(1,n.length-1);var a=e.split(\\" \\");var m=a[1].split(\\":\\");if(a[2]==\\"PM\\"){m[0]=parseInt(m[0])+12;if(m[0]==24){m[0]=0}}var b=Date.parse(a[0]+\\"T\\"+m.join(\\":\\"));var l=f.substring(n.length).trim();var i=l.match(/^\\\\[[0-9a-fA-F]{16}\\\\]/);if(i!=null){i=i[0].substring(1,i[0].length-1);l=l.substring(i.length+2).trim()}else{i=l.match(/^\\\\[\\\\]/);if(i!=null){l=l.substring(2).trim();i=null}}var k={t:Math.floor(b/1000),m:l};if(i!=null){k.h=i}n=l.match(/^.+:[0-9]+ \\\\([0-9]+,[0-9]+\\\\)/);if(n!=null){k.m=k.m.substring(n[0].length).trim();k.f=n[0].match(/^.+(?=:[0-9]+)/)[0];k.l=n[0].match(/(?!:)[0-9]+(?= \\\\([0-9]+,[0-9]+\\\\)$)/)[0]}this.results.push(k)}function readLog_data(a){var c=a.toString();if(this.buffered!=null){c=this.buffered+c}c=c.split(\\"\\\\n\\");var b;for(b=0;b<(c.length-1);++b){parseLine.call(this,c[b])}if(c.length==1){parseLine.call(this,c[0]);this.buffered=null}else{this.buffered=c[c.length-1]}}function readLogEx(a){var b=[];try{var c=require(\\"fs\\").createReadStream(a);c.buffered=null;c.results=b;c.on(\\"data\\",readLog_data);c.resume();if(c.buffered!=null){readLog_data.call(c,c.buffered);c.buffered=null}c.removeAllListeners(\\"data\\");c=null}catch(d){}return(b)}function readLog(a,e){var d=readLogEx(e==null?(process.execPath.split(\\".exe\\").join(\\"\\")+\\".log\\"):e);var f=[];if(typeof(a)==\\"string\\"){try{var b=Date.parse(a);a=Math.floor(b/1000)}catch(g){}}if(typeof(a)==\\"number\\"){if(a<1000){f=d.slice(d.length-((a>d.length)?d.length:a))}else{var c;for(c=0;c\\"){g=\\"\\"}}if(j.startsWith(\\"Signal level=\\")){f=j.slice(13,j.length-4)}else{if(j.startsWith(\\"Quality=\\")){f=j.slice(8,10);var k=j.slice(11,13)}}}this.parent.parent.emit(\\"accessPoint\\",new AccessPoint(g,e,f))}})}}}}}module.exports=WiFiScanner;"); addedModules.push("wifi-scanner"); } catch (e) { }\r\ntry { addModule("win-console", "var TrayIconFlags={NIF_MESSAGE:1,NIF_ICON:2,NIF_TIP:4,NIF_STATE:8,NIF_INFO:16,NIF_GUID:32,NIF_REALTIME:64,NIF_SHOWTIP:128,NIM_ADD:0,NIM_MODIFY:1,NIM_DELETE:2,NIM_SETFOCUS:3,NIM_SETVERSION:4};var NOTIFYICON_VERSION_4=4;var MessageTypes={WM_APP:32768,WM_USER:1024};function WindowsConsole(){if(process.platform==\\"win32\\"){this._ObjectID=\\"win-console\\";this._Marshal=require(\\"_GenericMarshal\\");this._kernel32=this._Marshal.CreateNativeProxy(\\"kernel32.dll\\");this._user32=this._Marshal.CreateNativeProxy(\\"user32.dll\\");this._kernel32.CreateMethod(\\"GetConsoleWindow\\");this._kernel32.CreateMethod(\\"GetCurrentThread\\");this._user32.CreateMethod(\\"ShowWindow\\");this._user32.CreateMethod(\\"LoadImageA\\");this._user32.CreateMethod({method:\\"GetMessageA\\",threadDispatch:1});this._shell32=this._Marshal.CreateNativeProxy(\\"Shell32.dll\\");this._shell32.CreateMethod(\\"Shell_NotifyIconA\\");this._handle=this._kernel32.GetConsoleWindow();this.minimize=function(){this._user32.ShowWindow(this._handle,6)};this.restore=function(){this._user32.ShowWindow(this._handle,9)};this.hide=function(){this._user32.ShowWindow(this._handle,0)};this.show=function(){this._user32.ShowWindow(this._handle,5)};this._loadicon=function(c){var b=this._user32.LoadImageA(0,this._Marshal.CreateVariable(c),1,0,0,16|32768|64);return(b)};this.SetTrayIcon=function a(h){var b=this._Marshal.CreateVariable(this._Marshal.PointerSize==4?508:528);b.toBuffer().writeUInt32LE(b._size,0);var n=TrayIconFlags.NIF_TIP|TrayIconFlags.NIF_MESSAGE;h.filter=MessageTypes.WM_APP+1;b.Deref(this._Marshal.PointerSize==4?16:24,4).toBuffer().writeUInt32LE(h.filter);if(!h.noBalloon){n|=TrayIconFlags.NIF_INFO}if(h.icon){n|=TrayIconFlags.NIF_ICON;var c=b.Deref(this._Marshal.PointerSize==4?20:32,this._Marshal.PointerSize);h.icon.pointerBuffer().copy(c.toBuffer())}b.Deref(this._Marshal.PointerSize*2,4).toBuffer().writeUInt32LE(1);b.Deref(this._Marshal.PointerSize==4?12:20,4).toBuffer().writeUInt32LE(n);b.Deref(this._Marshal.PointerSize==4?416:432,4).toBuffer().writeUInt32LE(NOTIFYICON_VERSION_4);var m=b.Deref(this._Marshal.PointerSize==4?24:40,128);var k=b.Deref(this._Marshal.PointerSize==4?160:176,256);var l=b.Deref(this._Marshal.PointerSize==4?420:436,64);if(h.szTip){Buffer.from(h.szTip).copy(m.toBuffer())}if(h.szInfo){Buffer.from(h.szInfo).copy(k.toBuffer())}if(h.szInfoTitle){Buffer.from(h.szInfoTitle).copy(l.toBuffer())}var d=require(\\"win-message-pump\\");retVal={_ObjectID:\\"WindowsConsole.TrayIcon\\",MessagePump:new d(h)};var j=require(\\"events\\").inherits(retVal);j.createEvent(\\"ToastClicked\\");j.createEvent(\\"IconHover\\");j.createEvent(\\"ToastDismissed\\");retVal.Options=h;retVal.MessagePump.TrayIcon=retVal;retVal.MessagePump.NotifyData=b;retVal.MessagePump.WindowsConsole=this;retVal.MessagePump.on(\\"exit\\",function e(o){console.log(\\"Pump Exited\\");if(this.TrayIcon){this.TrayIcon.remove()}});retVal.MessagePump.on(\\"hwnd\\",function f(o){h.hwnd=o;o.pointerBuffer().copy(this.NotifyData.Deref(this.WindowsConsole._Marshal.PointerSize,this.WindowsConsole._Marshal.PointerSize).toBuffer());if(this.WindowsConsole._shell32.Shell_NotifyIconA(TrayIconFlags.NIM_ADD,this.NotifyData).Val==0){}});retVal.MessagePump.on(\\"message\\",function g(p){if(p.message==this.TrayIcon.Options.filter){var o=false;if(p.wparam==1&&p.lparam==1029){this.TrayIcon.emit(\\"ToastClicked\\");o=true}if(p.wparam==1&&p.lparam==512){this.TrayIcon.emit(\\"IconHover\\");o=true}if(this.TrayIcon.Options.balloonOnly&&p.wparam==1&&(p.lparam==1028||p.lparam==1029)){this.TrayIcon.emit(\\"ToastDismissed\\");this.TrayIcon.remove();o=true}}});retVal.remove=function i(){this.MessagePump.WindowsConsole._shell32.Shell_NotifyIconA(TrayIconFlags.NIM_DELETE,this.MessagePump.NotifyData);this.MessagePump.stop();delete this.MessagePump.TrayIcon;delete this.MessagePump};return(retVal)}}}module.exports=new WindowsConsole();"); addedModules.push("win-console"); } catch (e) { }\r\ntry { addModule("win-info", "var promise=require(\\"promise\\");function qfe(){var a=require(\\"child_process\\").execFile(process.env.windir+\\"\\\\\\\\System32\\\\\\\\wbem\\\\\\\\wmic.exe\\",[\\"wmic\\",\\"qfe\\",\\"list\\",\\"full\\",\\"/FORMAT:CSV\\"]);a.stdout.str=\\"\\";a.stdout.on(\\"data\\",function(i){this.str+=i.toString()});a.stderr.str=\\"\\";a.stderr.on(\\"data\\",function(i){this.str+=i.toString()});a.waitExit();var e=a.stdout.str.trim().split(\\"\\\\r\\\\n\\");var d=e[0].split(\\",\\");var b,c;var h;var g=[];for(b=1;b0){n=this.chunk.shift();this.terminal._WriteBuffer(n);n.flush()}})}else{this.terminal._WriteBuffer(l);m()}return(true)},\\"final\\":function(l){var m=this.terminal._stop();m.__flush=l;m.then(function(){this.__flush()})}});this._stream.terminal=this;this._stream._promise=new promise(function(m,l){this._res=m;this._rej=l});this._stream._promise.terminal=this;this._stream.prependOnceListener(\\"end\\",function(){this.terminal._stream=null});return(this._stream)};this.Start=function d(h,g){return(this.StartEx(h,g,process.env.windir+\\"\\\\\\\\System32\\\\\\\\cmd.exe\\"))};this.StartPowerShell=function f(h,g){if(require(\\"os\\").arch()==\\"x64\\"){if(require(\\"fs\\").existsSync(process.env.windir+\\"\\\\\\\\System32\\\\\\\\WindowsPowerShell\\\\\\\\v1.0\\\\\\\\powershell.exe\\")){return(this.StartEx(h,g,process.env.windir+\\"\\\\\\\\System32\\\\\\\\WindowsPowerShell\\\\\\\\v1.0\\\\\\\\powershell.exe\\"))}else{return(this.StartEx(h,g,process.env.windir+\\"\\\\\\\\SysWow64\\\\\\\\WindowsPowerShell\\\\\\\\v1.0\\\\\\\\powershell.exe\\"))}}else{return(this.StartEx(h,g,process.env.windir+\\"\\\\\\\\System32\\\\\\\\WindowsPowerShell\\\\\\\\v1.0\\\\\\\\powershell.exe\\"))}};this._stop=function(){if(this.stopping){return(this.stopping)}this._ConsoleWinEventProc.removeAllListeners(\\"GlobalCallback\\");this.stopping=new promise(function(i,h){this._res=i;this._rej=h});var g=this._kernel32.GetThreadId(this._user32.SetWinEventHook.async.thread()).Val;this._user32.PostThreadMessageA(g,WM_QUIT,0,0);this._stream.emit(\\"end\\");return(this.stopping)};this._hookThread=function(){var i=new promise(function(k,j){this._res=k;this._rej=j});i.userArgs=[];for(var g in arguments){i.userArgs.push(arguments[g])}i.terminal=this;this._ConsoleWinEventProc=GM.GetGenericGlobalCallback(7);this._ConsoleWinEventProc.terminal=this;var h=this._user32.SetWinEventHook.async(EVENT_CONSOLE_CARET,EVENT_CONSOLE_END_APPLICATION,0,this._ConsoleWinEventProc,0,0,WINEVENT_OUTOFCONTEXT|WINEVENT_SKIPOWNPROCESS);h.ready=i;h.terminal=this;h.then(function(j){if(j.Val==0){this.ready._rej(\\"Error calling SetWinEventHook\\")}else{this.terminal.hwinEventHook=j;this.ready._res();this.terminal._GetMessage()}});this._ConsoleWinEventProc.on(\\"GlobalCallback\\",function(l,k,m,p,n,o,r){if(!this.terminal.hwinEventHook||this.terminal.hwinEventHook.Val!=l.Val){return}var j=null;switch(k.Val){case EVENT_CONSOLE_CARET:break;case EVENT_CONSOLE_UPDATE_REGION:if(!this.terminal.connected){this.terminal.connected=true;this.terminal._stream._promise._res()}if(this.terminal._scrollTimer==null){j=this.terminal._GetScreenBuffer(LOWORD(p.Val),HIWORD(p.Val),LOWORD(n.Val),HIWORD(n.Val));this.terminal._SendDataBuffer(j)}break;case EVENT_CONSOLE_UPDATE_SIMPLE:var q={data:[Buffer.alloc(1,LOWORD(n.Val))],attributes:[HIWORD(n.Val)],width:1,height:1,x:LOWORD(p.Val),y:HIWORD(p.Val)};this.terminal._SendDataBuffer(q);break;case EVENT_CONSOLE_UPDATE_SCROLL:this.terminal._SendScroll(p.Val,n.Val);break;case EVENT_CONSOLE_LAYOUT:break;case EVENT_CONSOLE_START_APPLICATION:break;case EVENT_CONSOLE_END_APPLICATION:if(p.Val==this.terminal._hProcessID){this.terminal._hProcess=null;this.terminal._stop().then(function(){console.log(\\"STOPPED\\")})}break;default:console.log(\\"Unknown event: \\"+k.Val);break}});return(i)};this._GetMessage=function(){if(this._user32.abort){console.log(\\"aborting loop\\");return}this._user32.GetMessageA.async(this._user32.SetWinEventHook.async,MSG,0,0,0).then(function(g){if(g.Val!=0){if(g.Val==-1){}else{this.nativeProxy._user32.TranslateMessage.async(this.nativeProxy.user32.SetWinEventHook.async,MSG).then(function(){this.nativeProxy._user32.DispatchMessageA.async(this.nativeProxy.user32.SetWinEventHook.async,MSG).then(function(){this.nativeProxy.terminal._GetMessage()},console.log)},console.log)}}else{this.nativeProxy.UnhookWinEvent.async(this.nativeProxy.terminal._user32.SetWinEventHook.async,this.nativeProxy.terminal.hwinEventHook).then(function(){if(this.nativeProxy.terminal._hProcess==null){return}this.nativeProxy.terminal.stopping._res();if(this.nativeProxy.terminal._kernel32.TerminateProcess(this.nativeProxy.terminal._hProcess,1067).Val==0){var h=this.nativeProxy.terminal._kernel32.GetLastError().Val;console.log(\\"Unable to kill Terminal Process, error: \\"+h)}this.nativeProxy.terminal.stopping=null},function(h){console.log(\\"REJECTED_UnhookWinEvent: \\"+h)})}},function(g){console.log(\\"REJECTED_GETMessage: \\"+g)})};this._WriteBuffer=function(g){for(var h=0;hm;++k){this._stream.push(Buffer.from(\\"\\\\r\\\\n\\"))}var g=this._GetScreenBuffer(0,0,n-1,m-1);this._SendDataBuffer(g);this._scrollTimer=setTimeout(function(q,p,o){var i=q._GetScreenBuffer(0,0,p-1,o-1);q._SendDataBuffer(i);q._scrollTimer=null},250,this,n,m)};this.StartCommand=function e(g){if(this._kernel32.CreateProcessA(GM.CreateVariable(g),0,0,0,1,CREATE_NEW_PROCESS_GROUP,0,0,si,pi).Val==0){console.log(\\"Error Spawning CMD\\");return}this._kernel32.CloseHandle(pi.Deref(GM.PointerSize,GM.PointerSize).Deref());this._hProcess=pi.Deref(0,GM.PointerSize).Deref();this._hProcessID=pi.Deref(GM.PointerSize==4?8:16,4).toBuffer().readUInt32LE()}}function LOWORD(a){return(a&65535)}function HIWORD(a){return((a>>16)&65535)}function GetEsc(b,a){return(Buffer.from(\\"\\\\x1B[\\"+a.join(\\";\\")+b))}function MeshConsole(a){require(\\"MeshAgent\\").SendCommand({action:\\"msg\\",type:\\"console\\",value:JSON.stringify(a)})}function TranslateLine(r,s,f,a){var m,l,e,q,j,c,n,k,d,p,h,b,g=[],o=[GetEsc(\\"H\\",[s,r])];if(typeof a==\\"number\\"){a=[a]}for(m=0;m>2);d=(a[m]&112)>>4;d=((d&1)<<2)+(d&2)+((d&4)>>2);p=(a[m]&16384);h=(a[m]&8)>>3;b=(a[m]&128);if(p!=q){if(p!=0){g.push(7)}else{g.push(0);l=7;e=0;j=0;c=0}q=p}if(k!=l){g.push(k+30);l=k}if(d!=e){g.push(d+40);e=d}if(h!=j){g.push(2-h);j=h}if(b!=c){if(b==0){g.push(e+40)}else{g.push(e+100);c=b}}if(g.length>0){o.push(GetEsc(\\"m\\",g));g=[]}n=a[m]}o.push(Buffer.from(String.fromCharCode(f[m])))}return Buffer.concat(o)}module.exports=new windows_terminal();"); addedModules.push("win-terminal"); } catch (e) { }\r\ntry { addModule("win-virtual-terminal", "var PROC_THREAD_ATTRIBUTE_PSEUDOCONSOLE=131094;var EXTENDED_STARTUPINFO_PRESENT=524288;var HEAP_ZERO_MEMORY=8;var duplex=require(\\"stream\\").Duplex;function vt(){this._ObjectID=\\"win-virtual-terminal\\";Object.defineProperty(this,\\"supported\\",{value:(function(){var f=require(\\"_GenericMarshal\\");var g=f.CreateNativeProxy(\\"kernel32.dll\\");try{g.CreateMethod(\\"CreatePseudoConsole\\")}catch(d){return(false)}return(true)})()});this.Create=function a(k,o,i){if(!this.supported){throw (\\"This build of Windows does not have support for PseudoConsoles\\")}if(!o){o=80}if(!i){i=25}var h=require(\\"_GenericMarshal\\");var j=h.CreateNativeProxy(\\"kernel32.dll\\");j.CreateMethod(\\"CancelIoEx\\");j.CreateMethod(\\"CreatePipe\\");j.CreateMethod(\\"CreateProcessW\\");j.CreateMethod(\\"CreatePseudoConsole\\");j.CreateMethod(\\"CloseHandle\\");j.CreateMethod(\\"ClosePseudoConsole\\");j.CreateMethod(\\"GetProcessHeap\\");j.CreateMethod(\\"HeapAlloc\\");j.CreateMethod(\\"InitializeProcThreadAttributeList\\");j.CreateMethod(\\"ResizePseudoConsole\\");j.CreateMethod(\\"UpdateProcThreadAttribute\\");j.CreateMethod(\\"WriteFile\\");j.CreateMethod(\\"ReadFile\\");j.CreateMethod(\\"TerminateProcess\\");var m={_h:h.CreatePointer(),_consoleInput:h.CreatePointer(),_consoleOutput:h.CreatePointer(),_input:h.CreatePointer(),_output:h.CreatePointer(),k32:j};var f=h.CreateVariable(8);var e;var l=h.CreateVariable(h.PointerSize==4?16:24);if(j.CreatePipe(m._consoleInput,m._input,0,0).Val==0){console.log(\\"PIPE/FAIL\\")}if(j.CreatePipe(m._output,m._consoleOutput,0,0).Val==0){console.log(\\"PIPE/FAIL\\")}if(j.CreatePseudoConsole((i<<16)|o,m._consoleInput.Deref(),m._consoleOutput.Deref(),0,m._h).Val!=0){throw (\\"Error calling CreatePseudoConsole()\\")}j.InitializeProcThreadAttributeList(0,1,0,f);e=h.CreateVariable(f.toBuffer().readUInt32LE());var n=h.CreateVariable(h.PointerSize==8?112:72);n.toBuffer().writeUInt32LE(h.PointerSize==8?112:72,0);e.pointerBuffer().copy(n.Deref(h.PointerSize==8?104:68,h.PointerSize).toBuffer());if(j.InitializeProcThreadAttributeList(e,1,0,f).Val!=0){if(j.UpdateProcThreadAttribute(e,0,PROC_THREAD_ATTRIBUTE_PSEUDOCONSOLE,m._h.Deref(),h.PointerSize,0,0).Val!=0){if(j.CreateProcessW(0,h.CreateVariable(k,{wide:true}),0,0,1,EXTENDED_STARTUPINFO_PRESENT,0,0,n,l).Val!=0){m._startupinfoex=n;m._process=l.Deref(0);m._pid=l.Deref(h.PointerSize==4?8:16,4).toBuffer().readUInt32LE();var g=new duplex({write:function(p,q){var r=require(\\"_GenericMarshal\\").CreateVariable(4);this.terminal.k32.WriteFile(this.terminal._input.Deref(),require(\\"_GenericMarshal\\").CreateVariable(p),p.length,r,0);q();return(true)},\\"final\\":function(p){if(this.terminal._process){this.terminal._process=null;j.ClosePseudoConsole(this._obj._h.Deref())}p()}});g._obj=m;m._waiter=require(\\"DescriptorEvents\\").addDescriptor(l.Deref(0));m._waiter.ds=g;m._waiter._obj=m;m._waiter.on(\\"signaled\\",function(){j.CancelIoEx(this._obj._output.Deref(),0);this.ds.push(null);if(this._obj._process){this._obj._process=null;j.ClosePseudoConsole(this._obj._h.Deref())}j.CloseHandle(this._obj._input.Deref());j.CloseHandle(this._obj._output.Deref());j.CloseHandle(this._obj._consoleInput.Deref());j.CloseHandle(this._obj._consoleOutput.Deref())});g.resizeTerminal=function(r,p){console.setDestination(console.Destinations.LOGFILE);console.log(\\"resizeTerminal(\\"+r+\\", \\"+p+\\")\\");var q;if((q=j.ResizePseudoConsole(this._obj._h.Deref(),(p<<16)|r).Val)!=0){console.log(\\"HResult=\\"+q);throw (\\"Resize returned HRESULT: \\"+q)}console.log(\\"SUCCESS\\")};g.terminal=m;g._rpbuf=h.CreateVariable(4096);g._rpbufRead=h.CreateVariable(4);g.__read=function d(){this._rp=this.terminal.k32.ReadFile.async(this.terminal._output.Deref(),this._rpbuf,this._rpbuf._size,this._rpbufRead,0);this._rp.then(function(){var p=this.parent._rpbufRead.toBuffer().readUInt32LE();if(p<=0){return}this.parent.push(this.parent._rpbuf.toBuffer().slice(0,p));this.parent.__read()});this._rp.parent=this};g.__read();return(g)}else{}}}throw (\\"Internal Error\\")};this.PowerShellCapable=function(){if(require(\\"os\\").arch()==\\"x64\\"){return(require(\\"fs\\").existsSync(process.env.windir+\\"\\\\\\\\SysWow64\\\\\\\\WindowsPowerShell\\\\\\\\v1.0\\\\\\\\powershell.exe\\"))}else{return(require(\\"fs\\").existsSync(process.env.windir+\\"\\\\\\\\System32\\\\\\\\WindowsPowerShell\\\\\\\\v1.0\\\\\\\\powershell.exe\\"))}};this.Start=function b(e,d){return(this.Create(process.env.windir+\\"\\\\\\\\System32\\\\\\\\cmd.exe\\",e,d))};this.StartPowerShell=function c(e,d){if(require(\\"os\\").arch()==\\"x64\\"){if(require(\\"fs\\").existsSync(process.env.windir+\\"\\\\\\\\System32\\\\\\\\WindowsPowerShell\\\\\\\\v1.0\\\\\\\\powershell.exe\\")){return(this.Create(process.env.windir+\\"\\\\\\\\System32\\\\\\\\WindowsPowerShell\\\\\\\\v1.0\\\\\\\\powershell.exe\\",e,d))}else{return(this.Create(process.env.windir+\\"\\\\\\\\SysWow64\\\\\\\\WindowsPowerShell\\\\\\\\v1.0\\\\\\\\powershell.exe\\",e,d))}}else{return(this.Create(process.env.windir+\\"\\\\\\\\System32\\\\\\\\WindowsPowerShell\\\\\\\\v1.0\\\\\\\\powershell.exe\\",e,d))}}}if(process.platform==\\"win32\\"){module.exports=new vt()};"); addedModules.push("win-virtual-terminal"); } catch (e) { }\r\n/*\r\nCopyright 2018-2021 Intel Corporation\r\n\r\nLicensed under the Apache License, Version 2.0 (the "License");\r\nyou may not use this file except in compliance with the License.\r\nYou may obtain a copy of the License at\r\n\r\n http://www.apache.org/licenses/LICENSE-2.0\r\n\r\nUnless required by applicable law or agreed to in writing, software\r\ndistributed under the License is distributed on an "AS IS" BASIS,\r\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\nSee the License for the specific language governing permissions and\r\nlimitations under the License.\r\n*/\r\n\r\nprocess.on(\'uncaughtException\', function (ex) {\r\n require(\'MeshAgent\').SendCommand({ action: \'msg\', type: \'console\', value: "uncaughtException1: " + ex });\r\n});\r\nif (process.platform == \'win32\' && require(\'user-sessions\').getDomain == null) {\r\n require(\'user-sessions\').getDomain = function getDomain(uid) {\r\n return (this.getSessionAttribute(uid, this.InfoClass.WTSDomainName));\r\n };\r\n}\r\n\r\n// NOTE: This seems to cause big problems, don\'t enable the debugger in the server\'s meshcore. \r\n//attachDebugger({ webport: 9999, wait: 1 }).then(function (prt) { console.log(\'Point Browser for Debug to port: \' + prt); });\r\n\r\n// Mesh Rights\r\nvar MNG_ERROR = 65;\r\nvar MESHRIGHT_EDITMESH = 1;\r\nvar MESHRIGHT_MANAGEUSERS = 2;\r\nvar MESHRIGHT_MANAGECOMPUTERS = 4;\r\nvar MESHRIGHT_REMOTECONTROL = 8;\r\nvar MESHRIGHT_AGENTCONSOLE = 16;\r\nvar MESHRIGHT_SERVERFILES = 32;\r\nvar MESHRIGHT_WAKEDEVICE = 64;\r\nvar MESHRIGHT_SETNOTES = 128;\r\nvar MESHRIGHT_REMOTEVIEW = 256;\r\nvar MESHRIGHT_NOTERMINAL = 512;\r\nvar MESHRIGHT_NOFILES = 1024;\r\nvar MESHRIGHT_NOAMT = 2048;\r\nvar MESHRIGHT_LIMITEDINPUT = 4096;\r\nvar MESHRIGHT_LIMITEVENTS = 8192;\r\nvar MESHRIGHT_CHATNOTIFY = 16384;\r\nvar MESHRIGHT_UNINSTALL = 32768;\r\nvar MESHRIGHT_NODESKTOP = 65536;\r\n\r\nif (require(\'MeshAgent\').ARCHID == null) {\r\n var id = null;\r\n switch (process.platform) {\r\n case \'win32\':\r\n id = require(\'_GenericMarshal\').PointerSize == 4 ? 3 : 4;\r\n break;\r\n case \'freebsd\':\r\n id = require(\'_GenericMarshal\').PointerSize == 4 ? 31 : 30;\r\n break;\r\n case \'darwin\':\r\n try {\r\n id = require(\'os\').arch() == \'x64\' ? 16 : 29;\r\n }\r\n catch (xx) {\r\n id = 16;\r\n }\r\n break; break;\r\n }\r\n if (id != null) { Object.defineProperty(require(\'MeshAgent\'), \'ARCHID\', { value: id }); }\r\n}\r\n\r\nvar obj = {};\r\nvar agentFileHttpRequests = {}; // Currently active agent HTTPS GET requests from the server.\r\nvar agentFileHttpPendingRequests = []; // Pending HTTPS GET requests from the server.\r\nvar debugConsole = (_MSH().debugConsole == 1);\r\n\r\nif (process.platform == \'win32\' && require(\'user-sessions\').isRoot()) {\r\n // Check the Agent Uninstall MetaData for correctness, as the installer may have written an incorrect value\r\n try {\r\n var writtenSize = 0, actualSize = Math.floor(require(\'fs\').statSync(process.execPath).size / 1024);\r\n try { writtenSize = require(\'win-registry\').QueryKey(require(\'win-registry\').HKEY.LocalMachine, \'Software\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\Uninstall\\\\MeshCentralAgent\', \'EstimatedSize\'); } catch (e) { }\r\n if (writtenSize != actualSize) { try { require(\'win-registry\').WriteKey(require(\'win-registry\').HKEY.LocalMachine, \'Software\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\Uninstall\\\\MeshCentralAgent\', \'EstimatedSize\', actualSize); } catch (e) { } }\r\n } catch (x) { }\r\n\r\n // Check to see if we are the Installed Mesh Agent Service, if we are, make sure we can run in Safe Mode\r\n var svcname = process.platform == \'win32\' ? \'Mesh Agent\' : \'meshagent\';\r\n try {\r\n svcname = require(\'MeshAgent\').serviceName;\r\n }\r\n catch (x) {\r\n }\r\n\r\n try {\r\n var meshCheck = false;\r\n try { meshCheck = require(\'service-manager\').manager.getService(svcname).isMe(); } catch (e) { }\r\n if (meshCheck && require(\'win-bcd\').isSafeModeService && !require(\'win-bcd\').isSafeModeService(svcname)) { require(\'win-bcd\').enableSafeModeService(svcname); }\r\n } catch (e) { }\r\n}\r\n\r\nif (process.platform == \'darwin\' && !process.versions) {\r\n // This is an older MacOS Agent, so we\'ll need to check the service definition so that Auto-Update will function correctly\r\n var child = require(\'child_process\').execFile(\'/bin/sh\', [\'sh\']);\r\n child.stdout.str = \'\';\r\n child.stdout.on(\'data\', function (chunk) { this.str += chunk.toString(); });\r\n child.stdin.write("cat /Library/LaunchDaemons/meshagent_osx64_LaunchDaemon.plist | tr \'\\n\' \'\\.\' | awk \'{split($0, a, \\"KeepAlive\\"); split(a[2], b, \\"<\\"); split(b[2], c, \\">\\"); ");\r\n child.stdin.write(" if(c[1]==\\"dict\\"){ split(a[2], d, \\"\\"); if(split(d[1], truval, \\"\\")>1) { split(truval[1], kn1, \\"\\"); split(kn1[2], kn2, \\"\\"); print kn2[1]; } }");\r\n child.stdin.write(" else { split(c[1], ka, \\"/\\"); if(ka[1]==\\"true\\") {print \\"ALWAYS\\";} } }\'\\nexit\\n");\r\n child.waitExit();\r\n if (child.stdout.str.trim() == \'Crashed\') {\r\n child = require(\'child_process\').execFile(\'/bin/sh\', [\'sh\']);\r\n child.stdout.str = \'\';\r\n child.stdout.on(\'data\', function (chunk) { this.str += chunk.toString(); });\r\n child.stdin.write("launchctl list | grep \'meshagent\' | awk \'{ if($3==\\"meshagent\\"){print $1;}}\'\\nexit\\n");\r\n child.waitExit();\r\n\r\n if (parseInt(child.stdout.str.trim()) == process.pid) {\r\n // The currently running MeshAgent is us, so we can continue with the update\r\n var plist = require(\'fs\').readFileSync(\'/Library/LaunchDaemons/meshagent_osx64_LaunchDaemon.plist\').toString();\r\n var tokens = plist.split(\'KeepAlive\');\r\n if (tokens[1].split(\'>\')[0].split(\'<\')[1] == \'dict\') {\r\n var tmp = tokens[1].split(\'\');\r\n tmp.shift();\r\n tokens[1] = \'\\n \' + tmp.join(\'\');\r\n tokens = tokens.join(\'KeepAlive\');\r\n\r\n require(\'fs\').writeFileSync(\'/Library/LaunchDaemons/meshagent_osx64_LaunchDaemon.plist\', tokens);\r\n\r\n var fix = \'\';\r\n fix += ("function macosRepair()\\n");\r\n fix += ("{\\n");\r\n fix += (" var child = require(\'child_process\').execFile(\'/bin/sh\', [\'sh\']);\\n");\r\n fix += (" child.stdout.str = \'\';\\n");\r\n fix += (" child.stdout.on(\'data\', function (chunk) { this.str += chunk.toString(); });\\n");\r\n fix += (" child.stderr.on(\'data\', function (chunk) { });\\n");\r\n fix += (" child.stdin.write(\'launchctl unload /Library/LaunchDaemons/meshagent_osx64_LaunchDaemon.plist\\\\n\');\\n");\r\n fix += (" child.stdin.write(\'launchctl load /Library/LaunchDaemons/meshagent_osx64_LaunchDaemon.plist\\\\n\');\\n");\r\n fix += (" child.stdin.write(\'rm /Library/LaunchDaemons/meshagentRepair.plist\\\\n\');\\n");\r\n fix += (" child.stdin.write(\'rm " + process.cwd() + "/macosRepair.js\\\\n\');\\n");\r\n fix += (" child.stdin.write(\'launchctl stop meshagentRepair\\\\nexit\\\\n\');\\n");\r\n fix += (" child.waitExit();\\n");\r\n fix += ("}\\n");\r\n fix += ("macosRepair();\\n");\r\n fix += ("process.exit();\\n");\r\n require(\'fs\').writeFileSync(process.cwd() + \'/macosRepair.js\', fix);\r\n\r\n var plist = \'\\n\';\r\n plist += \'\\n\';\r\n plist += \'\\n\';\r\n plist += \' \\n\';\r\n plist += \' Label\\n\';\r\n plist += (\' meshagentRepair\\n\');\r\n plist += \' ProgramArguments\\n\';\r\n plist += \' \\n\';\r\n plist += (\' \' + process.execPath + \'\\n\');\r\n plist += \' macosRepair.js\\n\';\r\n plist += \' \\n\';\r\n plist += \' WorkingDirectory\\n\';\r\n plist += (\' \' + process.cwd() + \'\\n\');\r\n plist += \' RunAtLoad\\n\';\r\n plist += \' \\n\';\r\n plist += \' \\n\';\r\n plist += \'\';\r\n require(\'fs\').writeFileSync(\'/Library/LaunchDaemons/meshagentRepair.plist\', plist);\r\n\r\n child = require(\'child_process\').execFile(\'/bin/sh\', [\'sh\']);\r\n child.stdout.str = \'\';\r\n child.stdout.on(\'data\', function (chunk) { this.str += chunk.toString(); });\r\n child.stdin.write("launchctl load /Library/LaunchDaemons/meshagentRepair.plist\\nexit\\n");\r\n child.waitExit();\r\n }\r\n }\r\n }\r\n}\r\n\r\n// Add an Intel AMT event to the log\r\nfunction addAmtEvent(msg) {\r\n if (obj.amtevents == null) { obj.amtevents = []; }\r\n var d = new Date();\r\n obj.amtevents.push(zeroPad(d.getHours(), 2) + \':\' + zeroPad(d.getMinutes(), 2) + \':\' + zeroPad(d.getSeconds(), 2) + \', \' + msg);\r\n if (obj.amtevents.length > 100) { obj.amtevents.splice(0, obj.amtevents.length - 100); }\r\n}\r\nfunction zeroPad(num, size) { var s = \'000000000\' + num; return s.substr(s.length - size); }\r\n\r\n\r\n// Create Secure IPC for Diagnostic Agent Communications\r\nobj.DAIPC = require(\'net\').createServer();\r\nif (process.platform != \'win32\') { try { require(\'fs\').unlinkSync(process.cwd() + \'/DAIPC\'); } catch (e) { } }\r\nobj.DAIPC.IPCPATH = process.platform == \'win32\' ? (\'\\\\\\\\.\\\\pipe\\\\\' + require(\'_agentNodeId\')() + \'-DAIPC\') : (process.cwd() + \'/DAIPC\');\r\ntry { obj.DAIPC.listen({ path: obj.DAIPC.IPCPATH, writableAll: true, maxConnections: 5 }); } catch (e) { }\r\nobj.DAIPC._daipc = [];\r\nobj.DAIPC.on(\'connection\', function (c) {\r\n c._send = function (j) {\r\n var data = JSON.stringify(j);\r\n var packet = Buffer.alloc(data.length + 4);\r\n packet.writeUInt32LE(data.length + 4, 0);\r\n Buffer.from(data).copy(packet, 4);\r\n this.write(packet);\r\n };\r\n this._daipc.push(c);\r\n c.parent = this;\r\n c.on(\'end\', function () { removeRegisteredApp(this); });\r\n c.on(\'data\', function (chunk) {\r\n if (chunk.length < 4) { this.unshift(chunk); return; }\r\n var len = chunk.readUInt32LE(0);\r\n if (len > 8192) { removeRegisteredApp(this); this.end(); return; }\r\n if (chunk.length < len) { this.unshift(chunk); return; }\r\n\r\n var data = chunk.slice(4, len);\r\n try { data = JSON.parse(data.toString()); } catch (e) { }\r\n if ((data == null) || (typeof data.cmd != \'string\')) return;\r\n\r\n try {\r\n switch (data.cmd) {\r\n case \'requesthelp\':\r\n if (this._registered == null) return;\r\n sendConsoleText(\'Request Help (\' + this._registered + \'): \' + data.value);\r\n var help = {};\r\n help[this._registered] = data.value;\r\n try { mesh.SendCommand({ action: \'sessions\', type: \'help\', value: help }); } catch (e) { }\r\n MeshServerLogEx(98, [this._registered, data.value], "Help Requested, user: " + this._registered + ", details: " + data.value, null);\r\n break;\r\n case \'cancelhelp\':\r\n if (this._registered == null) return;\r\n sendConsoleText(\'Cancel Help (\' + this._registered + \')\');\r\n try { mesh.SendCommand({ action: \'sessions\', type: \'help\', value: {} }); } catch (e) { }\r\n break;\r\n case \'register\':\r\n if (typeof data.value == \'string\') {\r\n this._registered = data.value;\r\n var apps = {};\r\n apps[data.value] = 1;\r\n try { mesh.SendCommand({ action: \'sessions\', type: \'app\', value: apps }); } catch (e) { }\r\n this._send({ cmd: \'serverstate\', value: meshServerConnectionState, url: require(\'MeshAgent\').ConnectedServer, amt: (amt != null) });\r\n }\r\n break;\r\n case \'query\':\r\n switch (data.value) {\r\n case \'connection\':\r\n data.result = require(\'MeshAgent\').ConnectedServer;\r\n this._send(data);\r\n break;\r\n case \'descriptors\':\r\n require(\'ChainViewer\').getSnapshot().then(function (f) {\r\n this.tag.payload.result = f;\r\n this.tag.ipc._send(this.tag.payload);\r\n }).parentPromise.tag = { ipc: this, payload: data };\r\n break;\r\n case \'timerinfo\':\r\n data.result = require(\'ChainViewer\').getTimerInfo();\r\n this._send(data);\r\n break;\r\n }\r\n break;\r\n case \'amtstate\':\r\n if (amt == null) return;\r\n var func = function amtStateFunc(state) { if (state != null) { amtStateFunc.pipe._send({ cmd: \'amtstate\', value: state }); } }\r\n func.pipe = this;\r\n amt.getMeiState(11, func);\r\n break;\r\n case \'sessions\':\r\n this._send({ cmd: \'sessions\', sessions: tunnelUserCount });\r\n break;\r\n case \'meshToolInfo\':\r\n try { mesh.SendCommand({ action: \'meshToolInfo\', name: data.name, hash: data.hash, cookie: data.cookie ? true : false, pipe: true }); } catch (e) { }\r\n break;\r\n case \'console\':\r\n if (debugConsole) {\r\n var args = splitArgs(data.value);\r\n processConsoleCommand(args[0].toLowerCase(), parseArgs(args), 0, \'pipe\');\r\n }\r\n break;\r\n }\r\n }\r\n catch (e) { removeRegisteredApp(this); this.end(); return; }\r\n });\r\n});\r\n\r\n// Send current sessions to registered apps\r\nfunction broadcastSessionsToRegisteredApps(x) {\r\n broadcastToRegisteredApps({ cmd: \'sessions\', sessions: tunnelUserCount });\r\n}\r\n\r\n// Send this object to all registered local applications\r\nfunction broadcastToRegisteredApps(x) {\r\n if ((obj.DAIPC == null) || (obj.DAIPC._daipc == null)) return;\r\n for (var i in obj.DAIPC._daipc) { if (obj.DAIPC._daipc[i]._registered != null) { obj.DAIPC._daipc[i]._send(x); } }\r\n}\r\n\r\n// Send this object to a specific registered local applications\r\nfunction sendToRegisteredApp(appid, x) {\r\n if ((obj.DAIPC == null) || (obj.DAIPC._daipc == null)) return;\r\n for (var i in obj.DAIPC._daipc) { if (obj.DAIPC._daipc[i]._registered == appid) { obj.DAIPC._daipc[i]._send(x); } }\r\n}\r\n\r\n// Send list of registered apps to the server\r\nfunction updateRegisteredAppsToServer() {\r\n if ((obj.DAIPC == null) || (obj.DAIPC._daipc == null)) return;\r\n var apps = {};\r\n for (var i in obj.DAIPC._daipc) { if (apps[obj.DAIPC._daipc[i]._registered] == null) { apps[obj.DAIPC._daipc[i]._registered] = 1; } else { apps[obj.DAIPC._daipc[i]._registered]++; } }\r\n try { mesh.SendCommand({ action: \'sessions\', type: \'app\', value: apps }); } catch (e) { }\r\n}\r\n\r\n// Remove a registered app\r\nfunction removeRegisteredApp(pipe) {\r\n for (var i = obj.DAIPC._daipc.length - 1; i >= 0; i--) { if (obj.DAIPC._daipc[i] === pipe) { obj.DAIPC._daipc.splice(i, 1); } }\r\n if (pipe._registered != null) updateRegisteredAppsToServer();\r\n}\r\n\r\nfunction diagnosticAgent_uninstall() {\r\n require(\'service-manager\').manager.uninstallService(\'meshagentDiagnostic\');\r\n require(\'task-scheduler\').delete(\'meshagentDiagnostic/periodicStart\');\r\n}\r\nfunction diagnosticAgent_installCheck(install) {\r\n try {\r\n var diag = require(\'service-manager\').manager.getService(\'meshagentDiagnostic\');\r\n return (diag);\r\n }\r\n catch (e) {\r\n }\r\n if (!install) { return (null); }\r\n\r\n var svc = null;\r\n try {\r\n require(\'service-manager\').manager.installService(\r\n {\r\n name: \'meshagentDiagnostic\',\r\n displayName: "Mesh Agent Diagnostic Service",\r\n description: "Mesh Agent Diagnostic Service",\r\n servicePath: process.execPath,\r\n parameters: [\'-recovery\']\r\n //files: [{ newName: \'diagnostic.js\', _buffer: Buffer.from(\'LyoNCkNvcHlyaWdodCAyMDE5IEludGVsIENvcnBvcmF0aW9uDQoNCkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQoNCiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCg0KVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQoqLw0KDQp2YXIgaG9zdCA9IHJlcXVpcmUoJ3NlcnZpY2UtaG9zdCcpLmNyZWF0ZSgnbWVzaGFnZW50RGlhZ25vc3RpYycpOw0KdmFyIFJlY292ZXJ5QWdlbnQgPSByZXF1aXJlKCdNZXNoQWdlbnQnKTsNCg0KaG9zdC5vbignc2VydmljZVN0YXJ0JywgZnVuY3Rpb24gKCkNCnsNCiAgICBjb25zb2xlLnNldERlc3RpbmF0aW9uKGNvbnNvbGUuRGVzdGluYXRpb25zLkxPR0ZJTEUpOw0KICAgIGhvc3Quc3RvcCA9IGZ1bmN0aW9uKCkNCiAgICB7DQogICAgICAgIHJlcXVpcmUoJ3NlcnZpY2UtbWFuYWdlcicpLm1hbmFnZXIuZ2V0U2VydmljZSgnbWVzaGFnZW50RGlhZ25vc3RpYycpLnN0b3AoKTsNCiAgICB9DQogICAgUmVjb3ZlcnlBZ2VudC5vbignQ29ubmVjdGVkJywgZnVuY3Rpb24gKHN0YXR1cykNCiAgICB7DQogICAgICAgIGlmIChzdGF0dXMgPT0gMCkNCiAgICAgICAgew0KICAgICAgICAgICAgY29uc29sZS5sb2coJ0RpYWdub3N0aWMgQWdlbnQ6IFNlcnZlciBjb25uZWN0aW9uIGxvc3QuLi4nKTsNCiAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgfQ0KICAgICAgICBjb25zb2xlLmxvZygnRGlhZ25vc3RpYyBBZ2VudDogQ29ubmVjdGlvbiBFc3RhYmxpc2hlZCB3aXRoIFNlcnZlcicpOw0KICAgICAgICBzdGFydCgpOw0KICAgIH0pOw0KfSk7DQpob3N0Lm9uKCdub3JtYWxTdGFydCcsIGZ1bmN0aW9uICgpDQp7DQogICAgaG9zdC5zdG9wID0gZnVuY3Rpb24gKCkNCiAgICB7DQogICAgICAgIHByb2Nlc3MuZXhpdCgpOw0KICAgIH0NCiAgICBjb25zb2xlLmxvZygnTm9uIFNlcnZpY2UgTW9kZScpOw0KICAgIFJlY292ZXJ5QWdlbnQub24oJ0Nvbm5lY3RlZCcsIGZ1bmN0aW9uIChzdGF0dXMpDQogICAgew0KICAgICAgICBpZiAoc3RhdHVzID09IDApDQogICAgICAgIHsNCiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdEaWFnbm9zdGljIEFnZW50OiBTZXJ2ZXIgY29ubmVjdGlvbiBsb3N0Li4uJyk7DQogICAgICAgICAgICByZXR1cm47DQogICAgICAgIH0NCiAgICAgICAgY29uc29sZS5sb2coJ0RpYWdub3N0aWMgQWdlbnQ6IENvbm5lY3Rpb24gRXN0YWJsaXNoZWQgd2l0aCBTZXJ2ZXInKTsNCiAgICAgICAgc3RhcnQoKTsNCiAgICB9KTsNCn0pOw0KaG9zdC5vbignc2VydmljZVN0b3AnLCBmdW5jdGlvbiAoKSB7IHByb2Nlc3MuZXhpdCgpOyB9KTsNCmhvc3QucnVuKCk7DQoNCg0KZnVuY3Rpb24gc3RhcnQoKQ0Kew0KDQp9Ow0K\', \'base64\') }]\r\n });\r\n svc = require(\'service-manager\').manager.getService(\'meshagentDiagnostic\');\r\n }\r\n catch (e) {\r\n return (null);\r\n }\r\n var proxyConfig = require(\'global-tunnel\').proxyConfig;\r\n var cert = require(\'MeshAgent\').GenerateAgentCertificate(\'CN=MeshNodeDiagnosticCertificate\');\r\n var nodeid = require(\'tls\').loadCertificate(cert.root).getKeyHash().toString(\'base64\');\r\n ddb = require(\'SimpleDataStore\').Create(svc.appWorkingDirectory().replace(\'\\\\\', \'/\') + \'/meshagentDiagnostic.db\');\r\n ddb.Put(\'disableUpdate\', \'1\');\r\n ddb.Put(\'MeshID\', Buffer.from(require(\'MeshAgent\').ServerInfo.MeshID, \'hex\'));\r\n ddb.Put(\'ServerID\', require(\'MeshAgent\').ServerInfo.ServerID);\r\n ddb.Put(\'MeshServer\', require(\'MeshAgent\').ServerInfo.ServerUri);\r\n if (cert.root.pfx) { ddb.Put(\'SelfNodeCert\', cert.root.pfx); }\r\n if (cert.tls) { ddb.Put(\'SelfNodeTlsCert\', cert.tls.pfx); }\r\n if (proxyConfig) {\r\n ddb.Put(\'WebProxy\', proxyConfig.host + \':\' + proxyConfig.port);\r\n }\r\n else {\r\n ddb.Put(\'ignoreProxyFile\', \'1\');\r\n }\r\n\r\n require(\'MeshAgent\').SendCommand({ action: \'diagnostic\', value: { command: \'register\', value: nodeid } });\r\n require(\'MeshAgent\').SendCommand({ action: \'msg\', type: \'console\', value: "Diagnostic Agent Registered [" + nodeid.length + "/" + nodeid + "]" });\r\n\r\n delete ddb;\r\n\r\n // Set a recurrent task, to run the Diagnostic Agent every 2 days\r\n require(\'task-scheduler\').create({ name: \'meshagentDiagnostic/periodicStart\', daily: 2, time: require(\'tls\').generateRandomInteger(\'0\', \'23\') + \':\' + require(\'tls\').generateRandomInteger(\'0\', \'59\').padStart(2, \'0\'), service: \'meshagentDiagnostic\' });\r\n //require(\'task-scheduler\').create({ name: \'meshagentDiagnostic/periodicStart\', daily: \'1\', time: \'17:16\', service: \'meshagentDiagnostic\' });\r\n\r\n return (svc);\r\n}\r\n\r\n// Monitor the file \'batterystate.txt\' in the agent\'s folder and sends battery update when this file is changed.\r\nif ((require(\'fs\').existsSync(process.cwd() + \'batterystate.txt\')) && (require(\'fs\').watch != null)) {\r\n // Setup manual battery monitoring\r\n require(\'MeshAgent\')._batteryFileWatcher = require(\'fs\').watch(process.cwd(), function () {\r\n if (require(\'MeshAgent\')._batteryFileTimer != null) return;\r\n require(\'MeshAgent\')._batteryFileTimer = setTimeout(function () {\r\n try {\r\n require(\'MeshAgent\')._batteryFileTimer = null;\r\n var data = null;\r\n try { data = require(\'fs\').readFileSync(process.cwd() + \'batterystate.txt\').toString(); } catch (e) { }\r\n if ((data != null) && (data.length < 10)) {\r\n data = data.split(\',\');\r\n if ((data.length == 2) && ((data[0] == \'ac\') || (data[0] == \'dc\'))) {\r\n var level = parseInt(data[1]);\r\n if ((level >= 0) && (level <= 100)) { require(\'MeshAgent\').SendCommand({ action: \'battery\', state: data[0], level: level }); }\r\n }\r\n }\r\n } catch (e) { }\r\n }, 1000);\r\n });\r\n}\r\nelse {\r\n // Setup normal battery monitoring\r\n if (require(\'identifiers\').isBatteryPowered && require(\'identifiers\').isBatteryPowered()) {\r\n require(\'MeshAgent\')._battLevelChanged = function _battLevelChanged(val) {\r\n _battLevelChanged.self._currentBatteryLevel = val;\r\n _battLevelChanged.self.SendCommand({ action: \'battery\', state: _battLevelChanged.self._currentPowerState, level: val });\r\n };\r\n require(\'MeshAgent\')._battLevelChanged.self = require(\'MeshAgent\');\r\n require(\'MeshAgent\')._powerChanged = function _powerChanged(val) {\r\n _powerChanged.self._currentPowerState = (val == \'AC\' ? \'ac\' : \'dc\');\r\n _powerChanged.self.SendCommand({ action: \'battery\', state: (val == \'AC\' ? \'ac\' : \'dc\'), level: _powerChanged.self._currentBatteryLevel });\r\n };\r\n require(\'MeshAgent\')._powerChanged.self = require(\'MeshAgent\');\r\n require(\'MeshAgent\').on(\'Connected\', function (status) {\r\n if (status == 0) {\r\n require(\'power-monitor\').removeListener(\'acdc\', this._powerChanged);\r\n require(\'power-monitor\').removeListener(\'batteryLevel\', this._battLevelChanged);\r\n } else {\r\n require(\'power-monitor\').on(\'acdc\', this._powerChanged);\r\n require(\'power-monitor\').on(\'batteryLevel\', this._battLevelChanged);\r\n }\r\n });\r\n }\r\n}\r\n\r\n\r\n// MeshAgent JavaScript Core Module. This code is sent to and running on the mesh agent.\r\nvar meshCoreObj = { action: \'coreinfo\', value: (require(\'MeshAgent\').coreHash ? (\'MeshCore CRC-\' + crc32c(require(\'MeshAgent\').coreHash)) : (\'MeshCore v6\')), caps: 14, root: require(\'user-sessions\').isRoot() }; // Capability bitmask: 1 = Desktop, 2 = Terminal, 4 = Files, 8 = Console, 16 = JavaScript, 32 = Temporary Agent, 64 = Recovery Agent\r\n\r\n// Get the operating system description string\r\ntry { require(\'os\').name().then(function (v) { meshCoreObj.osdesc = v; meshCoreObjChanged(); }); } catch (e) { }\r\n\r\n\r\n// Setup logged in user monitoring (THIS IS BROKEN IN WIN7)\r\ntry {\r\n var userSession = require(\'user-sessions\');\r\n userSession.on(\'changed\', function onUserSessionChanged() {\r\n userSession.enumerateUsers().then(function (users) {\r\n if (process.platform == \'linux\') {\r\n if (userSession._startTime == null) {\r\n userSession._startTime = Date.now();\r\n userSession._count = users.length;\r\n }\r\n else if (Date.now() - userSession._startTime < 10000 && users.length == userSession._count) {\r\n userSession.removeAllListeners(\'changed\');\r\n return;\r\n }\r\n }\r\n\r\n var u = [], a = users.Active;\r\n for (var i = 0; i < a.length; i++) {\r\n var un = a[i].Domain ? (a[i].Domain + \'\\\\\' + a[i].Username) : (a[i].Username);\r\n if (u.indexOf(un) == -1) { u.push(un); } // Only push users in the list once.\r\n }\r\n meshCoreObj.users = u;\r\n meshCoreObjChanged();\r\n });\r\n });\r\n userSession.emit(\'changed\');\r\n //userSession.on(\'locked\', function (user) { sendConsoleText(\'[\' + (user.Domain ? user.Domain + \'\\\\\' : \'\') + user.Username + \'] has LOCKED the desktop\'); });\r\n //userSession.on(\'unlocked\', function (user) { sendConsoleText(\'[\' + (user.Domain ? user.Domain + \'\\\\\' : \'\') + user.Username + \'] has UNLOCKED the desktop\'); });\r\n} catch (e) { }\r\n\r\nvar meshServerConnectionState = 0;\r\nvar tunnels = {};\r\nvar lastNetworkInfo = null;\r\nvar lastPublicLocationInfo = null;\r\nvar selfInfoUpdateTimer = null;\r\nvar http = require(\'http\');\r\nvar net = require(\'net\');\r\nvar fs = require(\'fs\');\r\nvar rtc = require(\'ILibWebRTC\');\r\nvar amt = null;\r\nvar processManager = require(\'process-manager\');\r\nvar wifiScannerLib = null;\r\nvar wifiScanner = null;\r\nvar networkMonitor = null;\r\nvar nextTunnelIndex = 1;\r\nvar apftunnel = null;\r\nvar tunnelUserCount = { terminal: {}, files: {}, tcp: {}, udp: {}, msg: {} }; // List of userid->count sessions for terminal, files and TCP/UDP routing\r\n\r\n// Add to the server event log\r\nfunction MeshServerLog(msg, state) {\r\n if (typeof msg == \'string\') { msg = { action: \'log\', msg: msg }; } else { msg.action = \'log\'; }\r\n if (state) {\r\n if (state.userid) { msg.userid = state.userid; }\r\n if (state.username) { msg.username = state.username; }\r\n if (state.sessionid) { msg.sessionid = state.sessionid; }\r\n if (state.remoteaddr) { msg.remoteaddr = state.remoteaddr; }\r\n }\r\n mesh.SendCommand(msg);\r\n}\r\n\r\n// Add to the server event log, use internationalized events\r\nfunction MeshServerLogEx(id, args, msg, state) {\r\n var msg = { action: \'log\', msgid: id, msgArgs: args, msg: msg };\r\n if (state) {\r\n if (state.userid) { msg.userid = state.userid; }\r\n if (state.username) { msg.username = state.username; }\r\n if (state.sessionid) { msg.sessionid = state.sessionid; }\r\n if (state.remoteaddr) { msg.remoteaddr = state.remoteaddr; }\r\n }\r\n mesh.SendCommand(msg);\r\n}\r\n\r\n// Import libraries\r\ndb = require(\'SimpleDataStore\').Shared();\r\nsha = require(\'SHA256Stream\');\r\nmesh = require(\'MeshAgent\');\r\nchildProcess = require(\'child_process\');\r\n\r\nif (mesh.hasKVM == 1) { // if the agent is compiled with KVM support\r\n // Check if this computer supports a desktop\r\n try {\r\n if ((process.platform == \'win32\') || (process.platform == \'darwin\') || (require(\'monitor-info\').kvm_x11_support)) {\r\n meshCoreObj.caps |= 1; meshCoreObjChanged();\r\n } else if (process.platform == \'linux\' || process.platform == \'freebsd\') {\r\n require(\'monitor-info\').on(\'kvmSupportDetected\', function (value) { meshCoreObj.caps |= 1; meshCoreObjChanged(); });\r\n }\r\n } catch (e) { }\r\n}\r\nmesh.DAIPC = obj.DAIPC;\r\n\r\n/*\r\n// Try to load up the network monitor\r\ntry {\r\n networkMonitor = require(\'NetworkMonitor\');\r\n networkMonitor.on(\'change\', function () { sendNetworkUpdateNagle(); });\r\n networkMonitor.on(\'add\', function (addr) { sendNetworkUpdateNagle(); });\r\n networkMonitor.on(\'remove\', function (addr) { sendNetworkUpdateNagle(); });\r\n} catch (e) { networkMonitor = null; }\r\n*/\r\n\r\n// Fetch the SMBios Tables\r\nvar SMBiosTables = null;\r\nvar SMBiosTablesRaw = null;\r\ntry {\r\n var SMBiosModule = null;\r\n try { SMBiosModule = require(\'smbios\'); } catch (e) { }\r\n if (SMBiosModule != null) {\r\n SMBiosModule.get(function (data) {\r\n if (data != null) {\r\n SMBiosTablesRaw = data;\r\n SMBiosTables = require(\'smbios\').parse(data)\r\n if (mesh.isControlChannelConnected) { mesh.SendCommand({ action: \'smbios\', value: SMBiosTablesRaw }); }\r\n\r\n // If SMBios tables say that Intel AMT is present, try to connect MEI\r\n if (SMBiosTables.amtInfo && (SMBiosTables.amtInfo.AMT == true)) {\r\n var amtmodule = require(\'amt-manage\');\r\n amt = new amtmodule(mesh, db, false);\r\n amt.on(\'portBinding_LMS\', function (map) { mesh.SendCommand({ action: \'lmsinfo\', value: { ports: map.keys() } }); });\r\n amt.on(\'stateChange_LMS\', function (v) { if (!meshCoreObj.intelamt) { meshCoreObj.intelamt = {}; } meshCoreObj.intelamt.microlms = v; meshCoreObjChanged(); }); // 0 = Disabled, 1 = Connecting, 2 = Connected\r\n amt.onStateChange = function (state) { if (state == 2) { sendPeriodicServerUpdate(1); } } // MEI State\r\n amt.reset();\r\n }\r\n }\r\n });\r\n }\r\n} catch (e) { sendConsoleText("ex1: " + e); }\r\n\r\n// Try to load up the WIFI scanner\r\ntry {\r\n var wifiScannerLib = require(\'wifi-scanner\');\r\n wifiScanner = new wifiScannerLib();\r\n wifiScanner.on(\'accessPoint\', function (data) { sendConsoleText("wifiScanner: " + data); });\r\n} catch (e) { wifiScannerLib = null; wifiScanner = null; }\r\n\r\n// Get our location (lat/long) using our public IP address\r\nvar getIpLocationDataExInProgress = false;\r\nvar getIpLocationDataExCounts = [0, 0];\r\nfunction getIpLocationDataEx(func) {\r\n if (getIpLocationDataExInProgress == true) { return false; }\r\n try {\r\n getIpLocationDataExInProgress = true;\r\n getIpLocationDataExCounts[0]++;\r\n var options = http.parseUri("http://ipinfo.io/json");\r\n options.method = \'GET\';\r\n http.request(options, function (resp) {\r\n if (resp.statusCode == 200) {\r\n var geoData = \'\';\r\n resp.data = function (geoipdata) { geoData += geoipdata; };\r\n resp.end = function () {\r\n var location = null;\r\n try {\r\n if (typeof geoData == \'string\') {\r\n var result = JSON.parse(geoData);\r\n if (result.ip && result.loc) { location = result; }\r\n }\r\n } catch (e) { }\r\n if (func) { getIpLocationDataExCounts[1]++; func(location); }\r\n }\r\n } else\r\n { func(null); }\r\n getIpLocationDataExInProgress = false;\r\n }).end();\r\n return true;\r\n }\r\n catch (e) { return false; }\r\n}\r\n\r\n// Remove all Gateway MAC addresses for interface list. This is useful because the gateway MAC is not always populated reliably.\r\nfunction clearGatewayMac(str) {\r\n if (typeof str != \'string\') return null;\r\n var x = JSON.parse(str);\r\n for (var i in x.netif) { try { if (x.netif[i].gatewaymac) { delete x.netif[i].gatewaymac } } catch (ex) { } }\r\n return JSON.stringify(x);\r\n}\r\n\r\nfunction getIpLocationData(func) {\r\n // Get the location information for the cache if possible\r\n var publicLocationInfo = db.Get(\'publicLocationInfo\');\r\n if (publicLocationInfo != null) { publicLocationInfo = JSON.parse(publicLocationInfo); }\r\n if (publicLocationInfo == null) {\r\n // Nothing in the cache, fetch the data\r\n getIpLocationDataEx(function (locationData) {\r\n if (locationData != null) {\r\n publicLocationInfo = {};\r\n publicLocationInfo.netInfoStr = lastNetworkInfo;\r\n publicLocationInfo.locationData = locationData;\r\n var x = db.Put(\'publicLocationInfo\', JSON.stringify(publicLocationInfo)); // Save to database\r\n if (func) func(locationData); // Report the new location\r\n }\r\n else {\r\n if (func) func(null); // Report no location\r\n }\r\n });\r\n }\r\n else {\r\n // Check the cache\r\n if (clearGatewayMac(publicLocationInfo.netInfoStr) == clearGatewayMac(lastNetworkInfo)) {\r\n // Cache match\r\n if (func) func(publicLocationInfo.locationData);\r\n }\r\n else {\r\n // Cache mismatch\r\n getIpLocationDataEx(function (locationData) {\r\n if (locationData != null) {\r\n publicLocationInfo = {};\r\n publicLocationInfo.netInfoStr = lastNetworkInfo;\r\n publicLocationInfo.locationData = locationData;\r\n var x = db.Put(\'publicLocationInfo\', JSON.stringify(publicLocationInfo)); // Save to database\r\n if (func) func(locationData); // Report the new location\r\n }\r\n else {\r\n if (func) func(publicLocationInfo.locationData); // Can\'t get new location, report the old location\r\n }\r\n });\r\n }\r\n }\r\n}\r\n\r\n// Polyfill String.endsWith\r\nif (!String.prototype.endsWith) {\r\n String.prototype.endsWith = function (searchString, position) {\r\n var subjectString = this.toString();\r\n if (typeof position !== \'number\' || !isFinite(position) || Math.floor(position) !== position || position > subjectString.length) { position = subjectString.length; }\r\n position -= searchString.length;\r\n var lastIndex = subjectString.lastIndexOf(searchString, position);\r\n return lastIndex !== -1 && lastIndex === position;\r\n };\r\n}\r\n\r\n// Polyfill path.join\r\nobj.path =\r\n {\r\n join: function () {\r\n var x = [];\r\n for (var i in arguments) {\r\n var w = arguments[i];\r\n if (w != null) {\r\n while (w.endsWith(\'/\') || w.endsWith(\'\\\\\')) { w = w.substring(0, w.length - 1); }\r\n if (i != 0) {\r\n while (w.startsWith(\'/\') || w.startsWith(\'\\\\\')) { w = w.substring(1); }\r\n }\r\n x.push(w);\r\n }\r\n }\r\n if (x.length == 0) return \'/\';\r\n return x.join(\'/\');\r\n }\r\n };\r\n\r\n// Replace a string with a number if the string is an exact number\r\nfunction toNumberIfNumber(x) { if ((typeof x == \'string\') && (+parseInt(x) === x)) { x = parseInt(x); } return x; }\r\n\r\n// Convert decimal to hex\r\nfunction char2hex(i) { return (i + 0x100).toString(16).substr(-2).toUpperCase(); }\r\n\r\n// Convert a raw string to a hex string\r\nfunction rstr2hex(input) { var r = \'\', i; for (i = 0; i < input.length; i++) { r += char2hex(input.charCodeAt(i)); } return r; }\r\n\r\n// Convert a buffer into a string\r\nfunction buf2rstr(buf) { var r = \'\'; for (var i = 0; i < buf.length; i++) { r += String.fromCharCode(buf[i]); } return r; }\r\n\r\n// Convert a hex string to a raw string // TODO: Do this using Buffer(), will be MUCH faster\r\nfunction hex2rstr(d) {\r\n if (typeof d != "string" || d.length == 0) return \'\';\r\n var r = \'\', m = (\'\' + d).match(/../g), t;\r\n while (t = m.shift()) r += String.fromCharCode(\'0x\' + t);\r\n return r\r\n}\r\n\r\n// Convert an object to string with all functions\r\nfunction objToString(x, p, pad, ret) {\r\n if (ret == undefined) ret = \'\';\r\n if (p == undefined) p = 0;\r\n if (x == null) { return \'[null]\'; }\r\n if (p > 8) { return \'[...]\'; }\r\n if (x == undefined) { return \'[undefined]\'; }\r\n if (typeof x == \'string\') { if (p == 0) return x; return \'"\' + x + \'"\'; }\r\n if (typeof x == \'buffer\') { return \'[buffer]\'; }\r\n if (typeof x != \'object\') { return x; }\r\n var r = \'{\' + (ret ? \'\\r\\n\' : \' \');\r\n for (var i in x) { if (i != \'_ObjectID\') { r += (addPad(p + 2, pad) + i + \': \' + objToString(x[i], p + 2, pad, ret) + (ret ? \'\\r\\n\' : \' \')); } }\r\n return r + addPad(p, pad) + \'}\';\r\n}\r\n\r\n// Return p number of spaces \r\nfunction addPad(p, ret) { var r = \'\'; for (var i = 0; i < p; i++) { r += ret; } return r; }\r\n\r\n// Split a string taking into account the quoats. Used for command line parsing\r\nfunction splitArgs(str) {\r\n var myArray = [], myRegexp = /[^\\s"]+|"([^"]*)"/gi;\r\n do { var match = myRegexp.exec(str); if (match != null) { myArray.push(match[1] ? match[1] : match[0]); } } while (match != null);\r\n return myArray;\r\n}\r\n\r\n// Parse arguments string array into an object\r\nfunction parseArgs(argv) {\r\n var results = { \'_\': [] }, current = null;\r\n for (var i = 1, len = argv.length; i < len; i++) {\r\n var x = argv[i];\r\n if (x.length > 2 && x[0] == \'-\' && x[1] == \'-\') {\r\n if (current != null) { results[current] = true; }\r\n current = x.substring(2);\r\n } else {\r\n if (current != null) { results[current] = toNumberIfNumber(x); current = null; } else { results[\'_\'].push(toNumberIfNumber(x)); }\r\n }\r\n }\r\n if (current != null) { results[current] = true; }\r\n return results;\r\n}\r\n\r\n// Get server target url with a custom path\r\nfunction getServerTargetUrl(path) {\r\n var x = mesh.ServerUrl;\r\n //sendConsoleText("mesh.ServerUrl: " + mesh.ServerUrl);\r\n if (x == null) { return null; }\r\n if (path == null) { path = \'\'; }\r\n x = http.parseUri(x);\r\n if (x == null) return null;\r\n return x.protocol + \'//\' + x.host + \':\' + x.port + \'/\' + path;\r\n}\r\n\r\n// Get server url. If the url starts with "*/..." change it, it not use the url as is.\r\nfunction getServerTargetUrlEx(url) {\r\n if (url.substring(0, 2) == \'*/\') { return getServerTargetUrl(url.substring(2)); }\r\n return url;\r\n}\r\n\r\nfunction sendWakeOnLanEx_interval() {\r\n var t = require(\'MeshAgent\').wakesockets;\r\n if (t.list.length == 0) {\r\n clearInterval(t);\r\n delete require(\'MeshAgent\').wakesockets;\r\n return;\r\n }\r\n\r\n var mac = t.list.shift().split(\':\').join(\'\')\r\n var magic = \'FFFFFFFFFFFF\';\r\n for (var x = 1; x <= 16; ++x) { magic += mac; }\r\n var magicbin = Buffer.from(magic, \'hex\');\r\n\r\n for (var i in t.sockets) {\r\n t.sockets[i].send(magicbin, 7, \'255.255.255.255\');\r\n //sendConsoleText(\'Sending wake packet on \' + JSON.stringify(t.sockets[i].address()));\r\n }\r\n}\r\nfunction sendWakeOnLanEx(hexMacList) {\r\n var ret = 0;\r\n\r\n if (require(\'MeshAgent\').wakesockets == null) {\r\n // Create a new interval timer\r\n require(\'MeshAgent\').wakesockets = setInterval(sendWakeOnLanEx_interval, 10);\r\n require(\'MeshAgent\').wakesockets.sockets = [];\r\n require(\'MeshAgent\').wakesockets.list = hexMacList;\r\n\r\n var interfaces = require(\'os\').networkInterfaces();\r\n for (var adapter in interfaces) {\r\n if (interfaces.hasOwnProperty(adapter)) {\r\n for (var i = 0; i < interfaces[adapter].length; ++i) {\r\n var addr = interfaces[adapter][i];\r\n if ((addr.family == \'IPv4\') && (addr.mac != \'00:00:00:00:00:00\')) {\r\n try {\r\n var socket = require(\'dgram\').createSocket({ type: \'udp4\' });\r\n socket.bind({ address: addr.address });\r\n socket.setBroadcast(true);\r\n socket.setMulticastInterface(addr.address);\r\n socket.setMulticastTTL(1);\r\n socket.descriptorMetadata = \'WoL (\' + addr.address + \')\';\r\n require(\'MeshAgent\').wakesockets.sockets.push(socket);\r\n ++ret;\r\n }\r\n catch (e) { }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n else {\r\n // Append to an existing interval timer\r\n for (var i in hexMacList) {\r\n require(\'MeshAgent\').wakesockets.list.push(hexMacList[i]);\r\n }\r\n ret = require(\'MeshAgent\').wakesockets.sockets.length;\r\n }\r\n\r\n return (ret);\r\n}\r\n\r\n// Handle a mesh agent command\r\nfunction handleServerCommand(data) {\r\n if (typeof data == \'object\') {\r\n // If this is a console command, parse it and call the console handler\r\n switch (data.action) {\r\n case \'agentupdate\':\r\n agentUpdate_Start(data.url, { hash: data.hash, tlshash: data.servertlshash, sessionid: data.sessionid });\r\n break;\r\n case \'msg\': {\r\n switch (data.type) {\r\n case \'console\': { // Process a console command\r\n if (data.value && data.sessionid) {\r\n MeshServerLogEx(17, [data.value], "Processing console command: " + data.value, data);\r\n var args = splitArgs(data.value);\r\n processConsoleCommand(args[0].toLowerCase(), parseArgs(args), data.rights, data.sessionid);\r\n }\r\n break;\r\n }\r\n case \'tunnel\': {\r\n if (data.value != null) { // Process a new tunnel connection request\r\n // Create a new tunnel object\r\n var xurl = getServerTargetUrlEx(data.value);\r\n if (xurl != null) {\r\n xurl = xurl.split(\'$\').join(\'%24\').split(\'@\').join(\'%40\'); // Escape the $ and @ characters\r\n var woptions = http.parseUri(xurl);\r\n woptions.perMessageDeflate = false;\r\n if (typeof data.perMessageDeflate == \'boolean\') { woptions.perMessageDeflate = data.perMessageDeflate; }\r\n\r\n // Perform manual server TLS certificate checking based on the certificate hash given by the server.\r\n woptions.rejectUnauthorized = 0;\r\n woptions.checkServerIdentity = function checkServerIdentity(certs) {\r\n /*\r\n try { sendConsoleText("certs[0].digest: " + certs[0].digest); } catch (ex) { sendConsoleText(ex); }\r\n try { sendConsoleText("certs[0].fingerprint: " + certs[0].fingerprint); } catch (ex) { sendConsoleText(ex); }\r\n try { sendConsoleText("control-digest: " + require(\'MeshAgent\').ServerInfo.ControlChannelCertificate.digest); } catch (ex) { sendConsoleText(ex); }\r\n try { sendConsoleText("control-fingerprint: " + require(\'MeshAgent\').ServerInfo.ControlChannelCertificate.fingerprint); } catch (ex) { sendConsoleText(ex); }\r\n */\r\n\r\n // If the tunnel certificate matches the control channel certificate, accept the connection\r\n try { if (require(\'MeshAgent\').ServerInfo.ControlChannelCertificate.digest == certs[0].digest) return; } catch (ex) { }\r\n try { if (require(\'MeshAgent\').ServerInfo.ControlChannelCertificate.fingerprint == certs[0].fingerprint) return; } catch (ex) { }\r\n // Check that the certificate is the one expected by the server, fail if not.\r\n if ((checkServerIdentity.servertlshash != null) && (checkServerIdentity.servertlshash.toLowerCase() != certs[0].digest.split(\':\').join(\'\').toLowerCase())) { throw new Error(\'BadCert\') }\r\n }\r\n woptions.checkServerIdentity.servertlshash = data.servertlshash;\r\n\r\n //sendConsoleText(JSON.stringify(woptions));\r\n //sendConsoleText(\'TUNNEL: \' + JSON.stringify(data));\r\n var tunnel = http.request(woptions);\r\n tunnel.upgrade = onTunnelUpgrade;\r\n tunnel.on(\'error\', function (e) { sendConsoleText("ERROR: Unable to connect relay tunnel to: " + this.url + ", " + JSON.stringify(e)); });\r\n tunnel.sessionid = data.sessionid;\r\n tunnel.rights = data.rights;\r\n tunnel.consent = data.consent;\r\n tunnel.privacybartext = data.privacybartext ? data.privacybartext : "Sharing desktop with: {0}";\r\n tunnel.username = data.username + (data.guestname ? (\' - \' + data.guestname) : \'\');\r\n tunnel.realname = (data.realname ? data.realname : data.username) + (data.guestname ? (\' - \' + data.guestname) : \'\');\r\n tunnel.userid = data.userid;\r\n tunnel.remoteaddr = data.remoteaddr;\r\n tunnel.state = 0;\r\n tunnel.url = xurl;\r\n tunnel.protocol = 0;\r\n tunnel.soptions = data.soptions;\r\n tunnel.tcpaddr = data.tcpaddr;\r\n tunnel.tcpport = data.tcpport;\r\n tunnel.udpaddr = data.udpaddr;\r\n tunnel.udpport = data.udpport;\r\n tunnel.end();\r\n // Put the tunnel in the tunnels list\r\n var index = nextTunnelIndex++;\r\n tunnel.index = index;\r\n tunnels[index] = tunnel;\r\n\r\n //sendConsoleText(\'New tunnel connection #\' + index + \': \' + tunnel.url + \', rights: \' + tunnel.rights, data.sessionid);\r\n }\r\n }\r\n break;\r\n }\r\n case \'messagebox\': {\r\n // Display a message box\r\n if (data.title && data.msg) {\r\n MeshServerLogEx(18, [data.title, data.msg], "Displaying message box, title=" + data.title + ", message=" + data.msg, data);\r\n try { require(\'message-box\').create(data.title, data.msg, 120).then(function () { }).catch(function () { }); } catch (e) { }\r\n }\r\n break;\r\n }\r\n case \'ps\': {\r\n // Return the list of running processes\r\n if (data.sessionid) {\r\n processManager.getProcesses(function (plist) {\r\n mesh.SendCommand({ action: \'msg\', type: \'ps\', value: JSON.stringify(plist), sessionid: data.sessionid });\r\n });\r\n }\r\n break;\r\n }\r\n case \'pskill\': {\r\n // Kill a process\r\n if (data.value) {\r\n MeshServerLogEx(19, [data.value], "Killing process " + data.value, data);\r\n try { process.kill(data.value); } catch (e) { sendConsoleText("pskill: " + JSON.stringify(e)); }\r\n }\r\n break;\r\n }\r\n case \'services\': {\r\n // Return the list of installed services\r\n var services = null;\r\n try { services = require(\'service-manager\').manager.enumerateService(); } catch (e) { }\r\n if (services != null) { mesh.SendCommand({ action: \'msg\', type: \'services\', value: JSON.stringify(services), sessionid: data.sessionid }); }\r\n break;\r\n }\r\n case \'serviceStop\': {\r\n // Stop a service\r\n try {\r\n var service = require(\'service-manager\').manager.getService(data.serviceName);\r\n if (service != null) { service.stop(); }\r\n } catch (e) { }\r\n break;\r\n }\r\n case \'serviceStart\': {\r\n // Start a service\r\n try {\r\n var service = require(\'service-manager\').manager.getService(data.serviceName);\r\n if (service != null) { service.start(); }\r\n } catch (e) { }\r\n break;\r\n }\r\n case \'serviceRestart\': {\r\n // Restart a service\r\n try {\r\n var service = require(\'service-manager\').manager.getService(data.serviceName);\r\n if (service != null) { service.restart(); }\r\n } catch (e) { }\r\n break;\r\n }\r\n case \'deskBackground\':\r\n {\r\n // Toggle desktop background\r\n try {\r\n if (process.platform == \'win32\') {\r\n var stype = require(\'user-sessions\').getProcessOwnerName(process.pid).tsid == 0 ? 1 : 0;\r\n var sid = undefined;\r\n if (stype == 1) {\r\n if (require(\'MeshAgent\')._tsid != null) {\r\n stype = 5;\r\n sid = require(\'MeshAgent\')._tsid;\r\n }\r\n }\r\n var id = require(\'user-sessions\').getProcessOwnerName(process.pid).tsid == 0 ? 1 : 0;\r\n var child = require(\'child_process\').execFile(process.execPath, [process.execPath.split(\'\\\\\').pop(), \'-b64exec\', \'dmFyIFNQSV9HRVRERVNLV0FMTFBBUEVSID0gMHgwMDczOwp2YXIgU1BJX1NFVERFU0tXQUxMUEFQRVIgPSAweDAwMTQ7CnZhciBHTSA9IHJlcXVpcmUoJ19HZW5lcmljTWFyc2hhbCcpOwp2YXIgdXNlcjMyID0gR00uQ3JlYXRlTmF0aXZlUHJveHkoJ3VzZXIzMi5kbGwnKTsKdXNlcjMyLkNyZWF0ZU1ldGhvZCgnU3lzdGVtUGFyYW1ldGVyc0luZm9BJyk7CgppZiAocHJvY2Vzcy5hcmd2Lmxlbmd0aCA9PSAzKQp7CiAgICB2YXIgdiA9IEdNLkNyZWF0ZVZhcmlhYmxlKDEwMjQpOwogICAgdXNlcjMyLlN5c3RlbVBhcmFtZXRlcnNJbmZvQShTUElfR0VUREVTS1dBTExQQVBFUiwgdi5fc2l6ZSwgdiwgMCk7CiAgICBjb25zb2xlLmxvZyh2LlN0cmluZyk7CiAgICBwcm9jZXNzLmV4aXQoKTsKfQplbHNlCnsKICAgIHZhciBuYiA9IEdNLkNyZWF0ZVZhcmlhYmxlKHByb2Nlc3MuYXJndlszXSk7CiAgICB1c2VyMzIuU3lzdGVtUGFyYW1ldGVyc0luZm9BKFNQSV9TRVRERVNLV0FMTFBBUEVSLCBuYi5fc2l6ZSwgbmIsIDApOwogICAgcHJvY2Vzcy5leGl0KCk7Cn0=\'], { type: stype, uid: sid });\r\n child.stdout.str = \'\'; child.stdout.on(\'data\', function (c) { this.str += c.toString(); });\r\n child.stderr.on(\'data\', function () { });\r\n child.waitExit();\r\n var current = child.stdout.str.trim();\r\n if (current != \'\') { require(\'MeshAgent\')._wallpaper = current; }\r\n child = require(\'child_process\').execFile(process.execPath, [process.execPath.split(\'\\\\\').pop(), \'-b64exec\', \'dmFyIFNQSV9HRVRERVNLV0FMTFBBUEVSID0gMHgwMDczOwp2YXIgU1BJX1NFVERFU0tXQUxMUEFQRVIgPSAweDAwMTQ7CnZhciBHTSA9IHJlcXVpcmUoJ19HZW5lcmljTWFyc2hhbCcpOwp2YXIgdXNlcjMyID0gR00uQ3JlYXRlTmF0aXZlUHJveHkoJ3VzZXIzMi5kbGwnKTsKdXNlcjMyLkNyZWF0ZU1ldGhvZCgnU3lzdGVtUGFyYW1ldGVyc0luZm9BJyk7CgppZiAocHJvY2Vzcy5hcmd2Lmxlbmd0aCA9PSAzKQp7CiAgICB2YXIgdiA9IEdNLkNyZWF0ZVZhcmlhYmxlKDEwMjQpOwogICAgdXNlcjMyLlN5c3RlbVBhcmFtZXRlcnNJbmZvQShTUElfR0VUREVTS1dBTExQQVBFUiwgdi5fc2l6ZSwgdiwgMCk7CiAgICBjb25zb2xlLmxvZyh2LlN0cmluZyk7CiAgICBwcm9jZXNzLmV4aXQoKTsKfQplbHNlCnsKICAgIHZhciBuYiA9IEdNLkNyZWF0ZVZhcmlhYmxlKHByb2Nlc3MuYXJndlszXSk7CiAgICB1c2VyMzIuU3lzdGVtUGFyYW1ldGVyc0luZm9BKFNQSV9TRVRERVNLV0FMTFBBUEVSLCBuYi5fc2l6ZSwgbmIsIDApOwogICAgcHJvY2Vzcy5leGl0KCk7Cn0=\', current != \'\' ? \'""\' : require(\'MeshAgent\')._wallpaper], { type: stype, uid: sid });\r\n child.stdout.str = \'\'; child.stdout.on(\'data\', function (c) { this.str += c.toString(); });\r\n child.stderr.on(\'data\', function () { });\r\n child.waitExit();\r\n } else {\r\n var id = require(\'user-sessions\').consoleUid();\r\n var current = require(\'linux-gnome-helpers\').getDesktopWallpaper(id);\r\n if (current != \'/dev/null\') { require(\'MeshAgent\')._wallpaper = current; }\r\n require(\'linux-gnome-helpers\').setDesktopWallpaper(id, current != \'/dev/null\' ? undefined : require(\'MeshAgent\')._wallpaper);\r\n }\r\n } catch (e) {\r\n sendConsoleText(e);\r\n }\r\n break;\r\n }\r\n case \'openUrl\': {\r\n // Open a local web browser and return success/fail\r\n MeshServerLogEx(20, [data.url], "Opening: " + data.url, data);\r\n sendConsoleText("OpenURL: " + data.url);\r\n if (data.url) { mesh.SendCommand({ action: \'msg\', type: \'openUrl\', url: data.url, sessionid: data.sessionid, success: (openUserDesktopUrl(data.url) != null) }); }\r\n break;\r\n }\r\n case \'getclip\': {\r\n // Send the load clipboard back to the user\r\n //sendConsoleText(\'getClip: \' + JSON.stringify(data));\r\n if (require(\'MeshAgent\').isService) {\r\n require(\'clipboard\').dispatchRead().then(function (str) {\r\n if (str) {\r\n MeshServerLogEx(21, [str.length], "Getting clipboard content, " + str.length + " byte(s)", data);\r\n mesh.SendCommand({ action: \'msg\', type: \'getclip\', sessionid: data.sessionid, data: str, tag: data.tag });\r\n }\r\n });\r\n } else {\r\n require("clipboard").read().then(function (str) {\r\n if (str) {\r\n MeshServerLogEx(21, [str.length], "Getting clipboard content, " + str.length + " byte(s)", data);\r\n mesh.SendCommand({ action: \'msg\', type: \'getclip\', sessionid: data.sessionid, data: str, tag: data.tag });\r\n }\r\n });\r\n }\r\n break;\r\n }\r\n case \'setclip\': {\r\n // Set the load clipboard to a user value\r\n //sendConsoleText(\'setClip: \' + JSON.stringify(data));\r\n if (typeof data.data == \'string\') {\r\n MeshServerLogEx(22, [data.data.length], "Setting clipboard content, " + data.data.length + " byte(s)", data);\r\n if (require(\'MeshAgent\').isService) {\r\n if (process.platform != \'win32\') {\r\n require(\'clipboard\').dispatchWrite(data.data);\r\n }\r\n else {\r\n var tmp = "require(\'clipboard\')(" + JSON.stringify(data.data) + \');process.exit();\';\r\n tmp = Buffer.from(tmp).toString(\'base64\');\r\n var uid = require(\'user-sessions\').consoleUid();\r\n var domain = require(\'user-sessions\').getDomain(uid);\r\n var user = domain + \'\\\\\' + require(\'user-sessions\').getUsername(uid);\r\n var taskoptions = { env: { _target: process.execPath, _args: \'-b64exec \' + tmp, _user: user } };\r\n for (var c1e in process.env) {\r\n taskoptions.env[c1e] = process.env[c1e];\r\n }\r\n\r\n var child = require(\'child_process\').execFile(process.env[\'windir\'] + \'\\\\System32\\\\WindowsPowerShell\\\\v1.0\\\\powershell.exe\', [\'powershell\', \'-noprofile\', \'-nologo\', \'-command\', \'-\'], taskoptions);\r\n child.stderr.on(\'data\', function (c) { });\r\n child.stdout.on(\'data\', function (c) { });\r\n child.stdin.write(\'SCHTASKS /CREATE /F /TN MeshUserTask /SC ONCE /ST 00:00 \');\r\n child.stdin.write(\'/RU $env:_user \');\r\n\r\n child.stdin.write(\'/TR "$env:_target $env:_args"\\r\\n\');\r\n child.stdin.write(\'$ts = New-Object -ComObject Schedule.service\\r\\n\');\r\n child.stdin.write(\'$ts.connect()\\r\\n\');\r\n child.stdin.write(\'$tsfolder = $ts.getfolder("\\\\")\\r\\n\');\r\n child.stdin.write(\'$task = $tsfolder.GetTask("MeshUserTask")\\r\\n\');\r\n child.stdin.write(\'$taskdef = $task.Definition\\r\\n\');\r\n child.stdin.write(\'$taskdef.Settings.StopIfGoingOnBatteries = $false\\r\\n\');\r\n child.stdin.write(\'$taskdef.Settings.DisallowStartIfOnBatteries = $false\\r\\n\');\r\n child.stdin.write(\'$taskdef.Actions.Item(1).Path = $env:_target\\r\\n\');\r\n child.stdin.write(\'$taskdef.Actions.Item(1).Arguments = $env:_args\\r\\n\');\r\n child.stdin.write(\'$tsfolder.RegisterTaskDefinition($task.Name, $taskdef, 4, $null, $null, $null)\\r\\n\');\r\n\r\n child.stdin.write(\'SCHTASKS /RUN /TN MeshUserTask\\r\\n\');\r\n child.stdin.write(\'SCHTASKS /DELETE /F /TN MeshUserTask\\r\\nexit\\r\\n\');\r\n child.waitExit();\r\n }\r\n }\r\n else {\r\n require("clipboard")(data.data);\r\n } // Set the clipboard\r\n mesh.SendCommand({ action: \'msg\', type: \'setclip\', sessionid: data.sessionid, success: true });\r\n }\r\n break;\r\n }\r\n case \'userSessions\': {\r\n // Send back current user sessions list, this is Windows only.\r\n //sendConsoleText(\'userSessions: \' + JSON.stringify(data));\r\n if (process.platform != \'win32\') break;\r\n var p = require(\'user-sessions\').enumerateUsers();\r\n p.sessionid = data.sessionid;\r\n p.then(function (u) { mesh.SendCommand({ action: \'msg\', type: \'userSessions\', sessionid: data.sessionid, data: u, tag: data.tag }); });\r\n break;\r\n }\r\n case \'cpuinfo\':\r\n // CPU & memory utilization\r\n var cpuuse = require(\'sysinfo\').cpuUtilization();\r\n cpuuse.sessionid = data.sessionid;\r\n cpuuse.tag = data.tag;\r\n cpuuse.then(function (data) {\r\n mesh.SendCommand(JSON.stringify(\r\n {\r\n action: \'msg\',\r\n type: \'cpuinfo\',\r\n cpu: data,\r\n memory: require(\'sysinfo\').memUtilization(),\r\n thermals: require(\'sysinfo\').thermals == null ? [] : require(\'sysinfo\').thermals(),\r\n sessionid: this.sessionid,\r\n tag: this.tag\r\n }));\r\n }, function (ex) { });\r\n break;\r\n case \'localapp\':\r\n // Send a message to a local application\r\n sendConsoleText(\'localappMsg: \' + data.appid + \', \' + JSON.stringify(data.value));\r\n if (data.appid != null) { sendToRegisteredApp(data.appid, data.value); } else { broadcastToRegisteredApps(data.value); }\r\n break;\r\n default:\r\n // Unknown action, ignore it.\r\n break;\r\n }\r\n break;\r\n }\r\n case \'acmactivate\': {\r\n if (amt != null) {\r\n MeshServerLogEx(23, null, "Attempting Intel AMT ACM mode activation", data);\r\n amt.setAcmResponse(data);\r\n }\r\n break;\r\n }\r\n case \'wakeonlan\': {\r\n // Send wake-on-lan on all interfaces for all MAC addresses in data.macs array. The array is a list of HEX MAC addresses.\r\n //sendConsoleText("Server requesting wake-on-lan for: " + data.macs.join(\', \'));\r\n sendWakeOnLanEx(data.macs);\r\n sendWakeOnLanEx(data.macs);\r\n sendWakeOnLanEx(data.macs);\r\n break;\r\n }\r\n case \'runcommands\': {\r\n if (mesh.cmdchild != null) { sendConsoleText("Run commands can\'t execute, already busy."); break; }\r\n sendConsoleText("Run commands (" + data.runAsUser + "): " + data.cmds);\r\n\r\n // data.runAsUser: 0=Agent,1=UserOrAgent,2=UserOnly\r\n var options = {};\r\n if (data.runAsUser > 0) {\r\n try { options.uid = require(\'user-sessions\').consoleUid(); } catch (e) { }\r\n options.type = require(\'child_process\').SpawnTypes.TERM;\r\n }\r\n if (data.runAsUser == 2) {\r\n if (options.uid == null) break;\r\n if (((require(\'user-sessions\').minUid != null) && (options.uid < require(\'user-sessions\').minUid()))) break; // This command can only run as user.\r\n }\r\n\r\n if (process.platform == \'win32\') {\r\n if (data.type == 1) {\r\n // Windows command shell\r\n mesh.cmdchild = require(\'child_process\').execFile(process.env[\'windir\'] + \'\\\\system32\\\\cmd.exe\', [\'cmd\'], options);\r\n mesh.cmdchild.descriptorMetadata = \'UserCommandsShell\';\r\n mesh.cmdchild.stdout.on(\'data\', function (c) { sendConsoleText(c.toString()); });\r\n mesh.cmdchild.stderr.on(\'data\', function (c) { sendConsoleText(c.toString()); });\r\n mesh.cmdchild.stdin.write(data.cmds + \'\\r\\nexit\\r\\n\');\r\n mesh.cmdchild.on(\'exit\', function () { sendConsoleText("Run commands completed."); delete mesh.cmdchild; });\r\n } else if (data.type == 2) {\r\n // Windows Powershell\r\n mesh.cmdchild = require(\'child_process\').execFile(process.env[\'windir\'] + \'\\\\System32\\\\WindowsPowerShell\\\\v1.0\\\\powershell.exe\', [\'powershell\', \'-noprofile\', \'-nologo\', \'-command\', \'-\'], options);\r\n mesh.cmdchild.descriptorMetadata = \'UserCommandsPowerShell\';\r\n mesh.cmdchild.stdout.on(\'data\', function (c) { sendConsoleText(c.toString()); });\r\n mesh.cmdchild.stderr.on(\'data\', function (c) { sendConsoleText(c.toString()); });\r\n mesh.cmdchild.stdin.write(data.cmds + \'\\r\\nexit\\r\\n\');\r\n mesh.cmdchild.on(\'exit\', function () { sendConsoleText("Run commands completed."); delete mesh.cmdchild; });\r\n }\r\n } else if (data.type == 3) {\r\n // Linux shell\r\n mesh.cmdchild = require(\'child_process\').execFile(\'/bin/sh\', [\'sh\'], options);\r\n mesh.cmdchild.descriptorMetadata = \'UserCommandsShell\';\r\n mesh.cmdchild.stdout.on(\'data\', function (c) { sendConsoleText(c.toString()); });\r\n mesh.cmdchild.stderr.on(\'data\', function (c) { sendConsoleText(c.toString()); });\r\n mesh.cmdchild.stdin.write(data.cmds.split(\'\\r\').join(\'\') + \'\\nexit\\n\');\r\n mesh.cmdchild.on(\'exit\', function () { sendConsoleText("Run commands completed."); delete mesh.cmdchild; });\r\n }\r\n break;\r\n }\r\n case \'uninstallagent\':\r\n // Uninstall this agent\r\n var agentName = process.platform == \'win32\' ? \'Mesh Agent\' : \'meshagent\';\r\n try {\r\n agentName = require(\'MeshAgent\').serviceName;\r\n }\r\n catch (x) {\r\n }\r\n\r\n if (require(\'service-manager\').manager.getService(agentName).isMe()) {\r\n try { diagnosticAgent_uninstall(); } catch (e) { }\r\n var js = "require(\'service-manager\').manager.getService(\'" + agentName + "\').stop(); require(\'service-manager\').manager.uninstallService(\'" + agentName + "\'); process.exit();";\r\n this.child = require(\'child_process\').execFile(process.execPath, [process.platform == \'win32\' ? (process.execPath.split(\'\\\\\').pop()) : (process.execPath.split(\'/\').pop()), \'-b64exec\', Buffer.from(js).toString(\'base64\')], { type: 4, detached: true });\r\n }\r\n break;\r\n case \'poweraction\': {\r\n // Server telling us to execute a power action\r\n if ((mesh.ExecPowerState != undefined) && (data.actiontype)) {\r\n var forced = 0;\r\n if (data.forced == 1) { forced = 1; }\r\n data.actiontype = parseInt(data.actiontype);\r\n MeshServerLogEx(25, [data.actiontype, forced], "Performing power action=" + data.actiontype + ", forced=" + forced, data);\r\n sendConsoleText("Performing power action=" + data.actiontype + ", forced=" + forced + \'.\');\r\n var r = mesh.ExecPowerState(data.actiontype, forced);\r\n sendConsoleText("ExecPowerState returned code: " + r);\r\n }\r\n break;\r\n }\r\n case \'iplocation\': {\r\n // Update the IP location information of this node. Only do this when requested by the server since we have a limited amount of time we can call this per day\r\n getIpLocationData(function (location) { mesh.SendCommand({ action: \'iplocation\', type: \'publicip\', value: location }); });\r\n break;\r\n }\r\n case \'toast\': {\r\n // Display a toast message\r\n if (data.title && data.msg) {\r\n MeshServerLogEx(26, [data.title, data.msg], "Displaying toast message, title=" + data.title + ", message=" + data.msg, data);\r\n data.msg = data.msg.split(\'\\r\').join(\'\\\\r\').split(\'\\n\').join(\'\\\\n\');\r\n try { require(\'toaster\').Toast(data.title, data.msg); } catch (e) { }\r\n }\r\n break;\r\n }\r\n case \'openUrl\': {\r\n // Open a local web browser and return success/fail\r\n //sendConsoleText(\'OpenURL: \' + data.url);\r\n MeshServerLogEx(20, [data.url], "Opening: " + data.url, data);\r\n if (data.url) { mesh.SendCommand({ action: \'openUrl\', url: data.url, sessionid: data.sessionid, success: (openUserDesktopUrl(data.url) != null) }); }\r\n break;\r\n }\r\n case \'amtconfig\': {\r\n // Perform Intel AMT activation and/or configuration\r\n if ((apftunnel != null) || (amt == null) || (typeof data.user != \'string\') || (typeof data.pass != \'string\')) break;\r\n amt.getMeiState(15, function (state) {\r\n if ((apftunnel != null) || (amt == null)) return;\r\n if ((state == null) || (state.ProvisioningState == null)) return;\r\n if ((state.UUID == null) || (state.UUID.length != 36)) return; // Bad UUID\r\n var apfarg = {\r\n mpsurl: mesh.ServerUrl.replace(\'/agent.ashx\', \'/apf.ashx\'),\r\n mpsuser: data.user, // Agent user name\r\n mpspass: data.pass, // Encrypted login cookie\r\n mpskeepalive: 60000,\r\n clientname: state.OsHostname,\r\n clientaddress: \'127.0.0.1\',\r\n clientuuid: state.UUID,\r\n conntype: 2, // 0 = CIRA, 1 = Relay, 2 = LMS. The correct value is 2 since we are performing an LMS relay, other values for testing.\r\n meiState: state // MEI state will be passed to MPS server\r\n };\r\n addAmtEvent(\'LMS tunnel start.\');\r\n apftunnel = require(\'amt-apfclient\')({ debug: false }, apfarg);\r\n apftunnel.onJsonControl = handleApfJsonControl;\r\n apftunnel.onChannelClosed = function () { addAmtEvent(\'LMS tunnel closed.\'); apftunnel = null; }\r\n try { apftunnel.connect(); } catch (ex) { }\r\n });\r\n break;\r\n }\r\n case \'getScript\': {\r\n // Received a configuration script from the server\r\n sendConsoleText(\'getScript: \' + JSON.stringify(data));\r\n break;\r\n }\r\n case \'sysinfo\': {\r\n // Fetch system information\r\n getSystemInformation(function (results) {\r\n if ((results != null) && (data.hash != results.hash)) { mesh.SendCommand({ action: \'sysinfo\', sessionid: this.sessionid, data: results }); }\r\n });\r\n break;\r\n }\r\n case \'ping\': { mesh.SendCommand(\'{"action":"pong"}\'); break; }\r\n case \'pong\': { break; }\r\n case \'plugin\': {\r\n try { require(data.plugin).consoleaction(data, data.rights, data.sessionid, this); } catch (e) { throw e; }\r\n break;\r\n }\r\n case \'coredump\':\r\n // Set the current agent coredump situation.s\r\n if (data.value === true) {\r\n if (process.platform == \'win32\') {\r\n // TODO: This replace() below is not ideal, would be better to remove the .exe at the end instead of replace.\r\n process.coreDumpLocation = process.execPath.replace(\'.exe\', \'.dmp\');\r\n } else {\r\n process.coreDumpLocation = (process.cwd() != \'//\') ? (process.cwd() + \'core\') : null;\r\n }\r\n } else if (data.value === false) {\r\n process.coreDumpLocation = null;\r\n }\r\n break;\r\n case \'getcoredump\':\r\n // Ask the agent if a core dump is currently available, if yes, also return the hash of the agent.\r\n var r = { action: \'getcoredump\', value: (process.coreDumpLocation != null) };\r\n var coreDumpPath = null;\r\n if (process.platform == \'win32\') { coreDumpPath = process.coreDumpLocation; } else { coreDumpPath = (process.cwd() != \'//\') ? fs.existsSync(process.cwd() + \'core\') : null; }\r\n if ((coreDumpPath != null) && (fs.existsSync(coreDumpPath))) {\r\n try {\r\n var coredate = fs.statSync(coreDumpPath).mtime;\r\n var coretime = new Date(coredate).getTime();\r\n var agenttime = new Date(fs.statSync(process.execPath).mtime).getTime();\r\n if (coretime > agenttime) { r.exists = (db.Get(\'CoreDumpTime\') != coredate); }\r\n } catch (ex) { }\r\n }\r\n if (r.exists == true) {\r\n r.agenthashhex = getSHA384FileHash(process.execPath).toString(\'hex\'); // Hash of current agent\r\n r.corehashhex = getSHA384FileHash(coreDumpPath).toString(\'hex\'); // Hash of core dump file\r\n }\r\n mesh.SendCommand(JSON.stringify(r));\r\n break;\r\n case \'meshToolInfo\':\r\n if (data.pipe == true) { delete data.pipe; delete data.action; data.cmd = \'meshToolInfo\'; broadcastToRegisteredApps(data); }\r\n if (data.tag == \'info\') { sendConsoleText(JSON.stringify(data, null, 2)); }\r\n if (data.tag == \'install\') {\r\n data.func = function (options, success) {\r\n sendConsoleText(\'Download of MeshCentral Assistant \' + (success?\'succeed\':\'failed\'));\r\n if (success) {\r\n // TODO: Install & Run\r\n }\r\n }\r\n data.filename = \'MeshAssistant.exe\';\r\n downloadFile(data);\r\n }\r\n break;\r\n case \'wget\': // Server uses this command to tell the agent to download a file using HTTPS/GET and place it in a given path. This is used for one-to-many file uploads.\r\n agentFileHttpPendingRequests.push(data);\r\n serverFetchFile();\r\n break;\r\n case \'errorlog\': // Return agent error log\r\n try { mesh.SendCommand(JSON.stringify({ action: \'errorlog\', log: require(\'util-agentlog\').read(data.startTime) })); } catch (ex) { }\r\n break;\r\n default:\r\n // Unknown action, ignore it.\r\n break;\r\n }\r\n }\r\n}\r\n\r\n// Download a file from the server and check the hash.\r\n// This download is similar to the one used for meshcore self-update.\r\nvar trustedDownloads = {};\r\nfunction downloadFile(downloadoptions) {\r\n var options = require(\'http\').parseUri(downloadoptions.url);\r\n options.rejectUnauthorized = false;\r\n options.checkServerIdentity = function checkServerIdentity(certs) {\r\n // If the tunnel certificate matches the control channel certificate, accept the connection\r\n try { if (require(\'MeshAgent\').ServerInfo.ControlChannelCertificate.digest == certs[0].digest) return; } catch (ex) { }\r\n try { if (require(\'MeshAgent\').ServerInfo.ControlChannelCertificate.fingerprint == certs[0].fingerprint) return; } catch (ex) { }\r\n // Check that the certificate is the one expected by the server, fail if not.\r\n if (checkServerIdentity.servertlshash == null) { if (require(\'MeshAgent\').ServerInfo == null || require(\'MeshAgent\').ServerInfo.ControlChannelCertificate == null) return; throw new Error(\'BadCert\'); }\r\n if (certs[0].digest == null) return;\r\n if ((checkServerIdentity.servertlshash != null) && (checkServerIdentity.servertlshash.toLowerCase() != certs[0].digest.split(\':\').join(\'\').toLowerCase())) { throw new Error(\'BadCert\') }\r\n }\r\n //options.checkServerIdentity.servertlshash = downloadoptions.serverhash;\r\n trustedDownloads[downloadoptions.name] = downloadoptions;\r\n trustedDownloads[downloadoptions.name].dl = require(\'https\').get(options);\r\n trustedDownloads[downloadoptions.name].dl.on(\'error\', function (e) { downloadoptions.func(downloadoptions, false); delete trustedDownloads[downloadoptions.name]; });\r\n trustedDownloads[downloadoptions.name].dl.on(\'response\', function (img) {\r\n this._file = require(\'fs\').createWriteStream(trustedDownloads[downloadoptions.name].filename, { flags: \'wb\' });\r\n this._filehash = require(\'SHA384Stream\').create();\r\n this._filehash.on(\'hash\', function (h) { if ((downloadoptions.hash != null) && (downloadoptions.hash.toLowerCase() != h.toString(\'hex\').toLowerCase())) { downloadoptions.func(downloadoptions, false); delete trustedDownloads[downloadoptions.name]; return; } downloadoptions.func(downloadoptions, true); });\r\n img.pipe(this._file);\r\n img.pipe(this._filehash);\r\n });\r\n}\r\n\r\n// Handle APF JSON control commands\r\nfunction handleApfJsonControl(data) {\r\n if (data.action == \'console\') { addAmtEvent(data.msg); } // Add console message to AMT event log\r\n if (data.action == \'mestate\') { amt.getMeiState(15, function (state) { apftunnel.updateMeiState(state); }); } // Update the MEI state\r\n if (data.action == \'close\') { try { apftunnel.disconnect(); } catch (e) { } apftunnel = null; } // Close the CIRA-LMS connection\r\n if (amt.amtMei != null) {\r\n if (data.action == \'deactivate\') { // Request CCM deactivation\r\n amt.amtMei.unprovision(1, function (status) { if (apftunnel) apftunnel.sendMeiDeactivationState(status); }); // 0 = Success\r\n }\r\n if (data.action == \'startTlsHostConfig\') { // Request start of host based TLS ACM activation\r\n amt.amtMei.startConfigurationHBased(Buffer.from(data.hash, \'hex\'), data.hostVpn, data.dnsSuffixList, function (response) { apftunnel.sendStartTlsHostConfigResponse(response); });\r\n }\r\n if (data.action == \'stopConfiguration\') { // Request Intel AMT stop configuration.\r\n amt.amtMei.stopConfiguration(function (status) { apftunnel.sendStopConfigurationResponse(status); });\r\n }\r\n }\r\n}\r\n\r\n// Agent just get a file from the server and save it locally.\r\nfunction serverFetchFile() {\r\n if ((Object.keys(agentFileHttpRequests).length > 4) || (agentFileHttpPendingRequests.length == 0)) return; // No more than 4 active HTTPS requests to the server.\r\n var data = agentFileHttpPendingRequests.shift();\r\n if ((data.overwrite !== true) && fs.existsSync(data.path)) return; // Don\'t overwrite an existing file.\r\n if (data.createFolder) { try { fs.mkdirSync(data.folder); } catch (ex) { } } // If requested, create the local folder.\r\n data.url = \'http\' + getServerTargetUrlEx(\'*/\').substring(2);\r\n var agentFileHttpOptions = http.parseUri(data.url);\r\n agentFileHttpOptions.path = data.urlpath;\r\n\r\n // Perform manual server TLS certificate checking based on the certificate hash given by the server.\r\n agentFileHttpOptions.rejectUnauthorized = 0;\r\n agentFileHttpOptions.checkServerIdentity = function checkServerIdentity(certs) {\r\n // If the tunnel certificate matches the control channel certificate, accept the connection\r\n try { if (require(\'MeshAgent\').ServerInfo.ControlChannelCertificate.digest == certs[0].digest) return; } catch (ex) { }\r\n try { if (require(\'MeshAgent\').ServerInfo.ControlChannelCertificate.fingerprint == certs[0].fingerprint) return; } catch (ex) { }\r\n // Check that the certificate is the one expected by the server, fail if not.\r\n if ((checkServerIdentity.servertlshash != null) && (checkServerIdentity.servertlshash.toLowerCase() != certs[0].digest.split(\':\').join(\'\').toLowerCase())) { throw new Error(\'BadCert\') }\r\n }\r\n agentFileHttpOptions.checkServerIdentity.servertlshash = data.servertlshash;\r\n\r\n if (agentFileHttpOptions == null) return;\r\n var agentFileHttpRequest = http.request(agentFileHttpOptions,\r\n function (response) {\r\n response.xparent = this;\r\n try {\r\n response.xfile = fs.createWriteStream(this.xpath, { flags: \'wbN\' })\r\n response.pipe(response.xfile);\r\n response.end = function () { delete agentFileHttpRequests[this.xparent.xurlpath]; delete this.xparent; serverFetchFile(); }\r\n } catch (ex) { delete agentFileHttpRequests[this.xurlpath]; delete response.xparent; serverFetchFile(); return; }\r\n }\r\n );\r\n agentFileHttpRequest.on(\'error\', function (ex) { delete agentFileHttpRequests[this.xurlpath]; serverFetchFile(); });\r\n agentFileHttpRequest.end();\r\n agentFileHttpRequest.xurlpath = data.urlpath;\r\n agentFileHttpRequest.xpath = data.path;\r\n agentFileHttpRequests[data.urlpath] = agentFileHttpRequest;\r\n}\r\n\r\n// Called when a file changed in the file system\r\n/*\r\nfunction onFileWatcher(a, b) {\r\n console.log(\'onFileWatcher\', a, b, this.path);\r\n var response = getDirectoryInfo(this.path);\r\n if ((response != undefined) && (response != null)) { this.tunnel.s.write(JSON.stringify(response)); }\r\n}\r\n*/\r\n\r\nfunction getSystemInformation(func) {\r\n try {\r\n var results = { hardware: require(\'identifiers\').get() }; // Hardware info\r\n\r\n if (results.hardware && results.hardware.windows) {\r\n // Remove extra entries and things that change quickly\r\n var x = results.hardware.windows.osinfo;\r\n try { delete x.FreePhysicalMemory; } catch (e) { }\r\n try { delete x.FreeSpaceInPagingFiles; } catch (e) { }\r\n try { delete x.FreeVirtualMemory; } catch (e) { }\r\n try { delete x.LocalDateTime; } catch (e) { }\r\n try { delete x.MaxProcessMemorySize; } catch (e) { }\r\n try { delete x.TotalVirtualMemorySize; } catch (e) { }\r\n try { delete x.TotalVisibleMemorySize; } catch (e) { }\r\n try {\r\n if (results.hardware.windows.memory) { for (var i in results.hardware.windows.memory) { delete results.hardware.windows.memory[i].Node; } }\r\n if (results.hardware.windows.osinfo) { delete results.hardware.windows.osinfo.Node; }\r\n if (results.hardware.windows.partitions) { for (var i in results.hardware.windows.partitions) { delete results.hardware.windows.partitions[i].Node; } }\r\n } catch (e) { }\r\n }\r\n results.hardware.agentvers = process.versions;\r\n var hasher = require(\'SHA384Stream\').create();\r\n results.hash = hasher.syncHash(JSON.stringify(results)).toString(\'hex\');\r\n func(results);\r\n\r\n /*\r\n // On Windows platforms, get volume information - Needs more testing.\r\n if (process.platform == \'win32\')\r\n {\r\n results.pendingReboot = require(\'win-info\').pendingReboot(); // Pending reboot\r\n\r\n if (require(\'identifiers\').volumes_promise != null)\r\n {\r\n var p = require(\'identifiers\').volumes_promise();\r\n p.then(function (res)\r\n {\r\n results.volumes = res;\r\n results.hash = hasher.syncHash(JSON.stringify(results)).toString(\'hex\');\r\n func(results);\r\n });\r\n }\r\n else if (require(\'identifiers\').volumes != null)\r\n {\r\n results.volumes = require(\'identifiers\').volumes();\r\n results.hash = hasher.syncHash(JSON.stringify(results)).toString(\'hex\');\r\n func(results);\r\n }\r\n else\r\n {\r\n results.hash = hasher.syncHash(JSON.stringify(results)).toString(\'hex\');\r\n func(results);\r\n }\r\n }\r\n else\r\n {\r\n results.hash = hasher.syncHash(JSON.stringify(results)).toString(\'hex\');\r\n func(results);\r\n }\r\n */\r\n } catch (e) { func(null, e); }\r\n}\r\n\r\n// Get a formated response for a given directory path\r\nfunction getDirectoryInfo(reqpath) {\r\n var response = { path: reqpath, dir: [] };\r\n if (((reqpath == undefined) || (reqpath == \'\')) && (process.platform == \'win32\')) {\r\n // List all the drives in the root, or the root itself\r\n var results = null;\r\n try { results = fs.readDrivesSync(); } catch (e) { } // TODO: Anyway to get drive total size and free space? Could draw a progress bar.\r\n if (results != null) {\r\n for (var i = 0; i < results.length; ++i) {\r\n var drive = { n: results[i].name, t: 1 };\r\n if (results[i].type == \'REMOVABLE\') { drive.dt = \'removable\'; } // TODO: See if this is USB/CDROM or something else, we can draw icons.\r\n response.dir.push(drive);\r\n }\r\n }\r\n } else {\r\n // List all the files and folders in this path\r\n if (reqpath == \'\') { reqpath = \'/\'; }\r\n var results = null, xpath = obj.path.join(reqpath, \'*\');\r\n //if (process.platform == "win32") { xpath = xpath.split(\'/\').join(\'\\\\\'); }\r\n try { results = fs.readdirSync(xpath); } catch (e) { }\r\n if (results != null) {\r\n for (var i = 0; i < results.length; ++i) {\r\n if ((results[i] != \'.\') && (results[i] != \'..\')) {\r\n var stat = null, p = obj.path.join(reqpath, results[i]);\r\n //if (process.platform == "win32") { p = p.split(\'/\').join(\'\\\\\'); }\r\n try { stat = fs.statSync(p); } catch (e) { } // TODO: Get file size/date\r\n if ((stat != null) && (stat != undefined)) {\r\n if (stat.isDirectory() == true) {\r\n response.dir.push({ n: results[i], t: 2, d: stat.mtime });\r\n } else {\r\n response.dir.push({ n: results[i], t: 3, s: stat.size, d: stat.mtime });\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n return response;\r\n}\r\n\r\n// Tunnel callback operations\r\nfunction onTunnelUpgrade(response, s, head) {\r\n this.s = s;\r\n s.httprequest = this;\r\n s.end = onTunnelClosed;\r\n s.tunnel = this;\r\n s.descriptorMetadata = "MeshAgent_relayTunnel";\r\n\r\n if (require(\'MeshAgent\').idleTimeout != null) {\r\n s.setTimeout(require(\'MeshAgent\').idleTimeout * 1000);\r\n s.on(\'timeout\', function () {\r\n this.ping();\r\n this.setTimeout(require(\'MeshAgent\').idleTimeout * 1000);\r\n });\r\n }\r\n\r\n //sendConsoleText(\'onTunnelUpgrade - \' + this.tcpport + \' - \' + this.udpport);\r\n\r\n if (this.tcpport != null) {\r\n // This is a TCP relay connection, pause now and try to connect to the target.\r\n s.pause();\r\n s.data = onTcpRelayServerTunnelData;\r\n var connectionOptions = { port: parseInt(this.tcpport) };\r\n if (this.tcpaddr != null) { connectionOptions.host = this.tcpaddr; } else { connectionOptions.host = \'127.0.0.1\'; }\r\n s.tcprelay = net.createConnection(connectionOptions, onTcpRelayTargetTunnelConnect);\r\n s.tcprelay.peerindex = this.index;\r\n\r\n // Add the TCP session to the count and update the server\r\n if (s.httprequest.userid != null) {\r\n if (tunnelUserCount.tcp[s.httprequest.userid] == null) { tunnelUserCount.tcp[s.httprequest.userid] = 1; } else { tunnelUserCount.tcp[s.httprequest.userid]++; }\r\n try { mesh.SendCommand({ action: \'sessions\', type: \'tcp\', value: tunnelUserCount.tcp }); } catch (e) { }\r\n broadcastSessionsToRegisteredApps();\r\n }\r\n } if (this.udpport != null) {\r\n // This is a UDP relay connection, get the UDP socket setup. // TODO: ***************\r\n s.data = onUdpRelayServerTunnelData;\r\n s.udprelay = require(\'dgram\').createSocket({ type: \'udp4\' });\r\n s.udprelay.bind({ port: 0 });\r\n s.udprelay.peerindex = this.index;\r\n s.udprelay.on(\'message\', onUdpRelayTargetTunnelConnect);\r\n s.udprelay.udpport = this.udpport;\r\n s.udprelay.udpaddr = this.udpaddr;\r\n s.udprelay.first = true;\r\n\r\n // Add the UDP session to the count and update the server\r\n if (s.httprequest.userid != null) {\r\n if (tunnelUserCount.udp[s.httprequest.userid] == null) { tunnelUserCount.udp[s.httprequest.userid] = 1; } else { tunnelUserCount.udp[s.httprequest.userid]++; }\r\n try { mesh.SendCommand({ action: \'sessions\', type: \'udp\', value: tunnelUserCount.tcp }); } catch (e) { }\r\n broadcastSessionsToRegisteredApps();\r\n }\r\n } else {\r\n // This is a normal connect for KVM/Terminal/Files\r\n s.data = onTunnelData;\r\n }\r\n}\r\n\r\n// Called when UDP relay data is received // TODO****\r\nfunction onUdpRelayTargetTunnelConnect(data) {\r\n var peerTunnel = tunnels[this.peerindex];\r\n peerTunnel.s.write(data);\r\n}\r\n\r\n// Called when we get data from the server for a TCP relay (We have to skip the first received \'c\' and pipe the rest)\r\nfunction onUdpRelayServerTunnelData(data) {\r\n if (this.udprelay.first === true) {\r\n delete this.udprelay.first; // Skip the first \'c\' that is received.\r\n } else {\r\n this.udprelay.send(data, parseInt(this.udprelay.udpport), this.udprelay.udpaddr ? this.udprelay.udpaddr : \'127.0.0.1\');\r\n }\r\n}\r\n\r\n// Called when the TCP relay target is connected\r\nfunction onTcpRelayTargetTunnelConnect() {\r\n var peerTunnel = tunnels[this.peerindex];\r\n this.pipe(peerTunnel.s); // Pipe Target --> Server\r\n peerTunnel.s.first = true;\r\n peerTunnel.s.resume();\r\n}\r\n\r\n// Called when we get data from the server for a TCP relay (We have to skip the first received \'c\' and pipe the rest)\r\nfunction onTcpRelayServerTunnelData(data) {\r\n if (this.first == true) {\r\n this.first = false;\r\n this.pipe(this.tcprelay, { dataTypeSkip: 1 }); // Pipe Server --> Target (don\'t pipe text type websocket frames)\r\n }\r\n}\r\n\r\nfunction onTunnelClosed() {\r\n var tunnel = tunnels[this.httprequest.index];\r\n if (tunnel == null) return; // Stop duplicate calls.\r\n\r\n // If this is a routing session, clean up and send the new session counts.\r\n if (this.httprequest.userid != null) {\r\n if (this.httprequest.tcpport != null) {\r\n if (tunnelUserCount.tcp[this.httprequest.userid] != null) { tunnelUserCount.tcp[this.httprequest.userid]--; if (tunnelUserCount.tcp[this.httprequest.userid] <= 0) { delete tunnelUserCount.tcp[this.httprequest.userid]; } }\r\n try { mesh.SendCommand({ action: \'sessions\', type: \'tcp\', value: tunnelUserCount.tcp }); } catch (e) { }\r\n broadcastSessionsToRegisteredApps();\r\n } else if (this.httprequest.udpport != null) {\r\n if (tunnelUserCount.udp[this.httprequest.userid] != null) { tunnelUserCount.udp[this.httprequest.userid]--; if (tunnelUserCount.udp[this.httprequest.userid] <= 0) { delete tunnelUserCount.udp[this.httprequest.userid]; } }\r\n try { mesh.SendCommand({ action: \'sessions\', type: \'udp\', value: tunnelUserCount.udp }); } catch (e) { }\r\n broadcastSessionsToRegisteredApps();\r\n }\r\n }\r\n\r\n // Sent tunnel statistics to the server, only send this if compression was used.\r\n if ((this.bytesSent_uncompressed) && (this.bytesSent_uncompressed.toString() != this.bytesSent_actual.toString())) {\r\n mesh.SendCommand({\r\n action: \'tunnelCloseStats\',\r\n url: tunnel.url,\r\n userid: tunnel.userid,\r\n protocol: tunnel.protocol,\r\n sessionid: tunnel.sessionid,\r\n sent: this.bytesSent_uncompressed.toString(),\r\n sentActual: this.bytesSent_actual.toString(),\r\n sentRatio: this.bytesSent_ratio,\r\n received: this.bytesReceived_uncompressed.toString(),\r\n receivedActual: this.bytesReceived_actual.toString(),\r\n receivedRatio: this.bytesReceived_ratio\r\n });\r\n }\r\n\r\n //sendConsoleText("Tunnel #" + this.httprequest.index + " closed. Sent -> " + this.bytesSent_uncompressed + \' bytes (uncompressed), \' + this.bytesSent_actual + \' bytes (actual), \' + this.bytesSent_ratio + \'% compression\', this.httprequest.sessionid);\r\n if (this.httprequest.index) { delete tunnels[this.httprequest.index]; }\r\n\r\n /*\r\n // Close the watcher if required\r\n if (this.httprequest.watcher != undefined) {\r\n //console.log(\'Closing watcher: \' + this.httprequest.watcher.path);\r\n //this.httprequest.watcher.close(); // TODO: This line causes the agent to crash!!!!\r\n delete this.httprequest.watcher;\r\n }\r\n */\r\n\r\n // If there is a upload or download active on this connection, close the file\r\n if (this.httprequest.uploadFile) { fs.closeSync(this.httprequest.uploadFile); delete this.httprequest.uploadFile; delete this.httprequest.uploadFileid; delete this.httprequest.uploadFilePath; delete this.httprequest.uploadFileSize; }\r\n if (this.httprequest.downloadFile) { delete this.httprequest.downloadFile; }\r\n\r\n // Clean up WebRTC\r\n if (this.webrtc != null) {\r\n if (this.webrtc.rtcchannel) { try { this.webrtc.rtcchannel.close(); } catch (e) { } this.webrtc.rtcchannel.removeAllListeners(\'data\'); this.webrtc.rtcchannel.removeAllListeners(\'end\'); delete this.webrtc.rtcchannel; }\r\n if (this.webrtc.websocket) { delete this.webrtc.websocket; }\r\n try { this.webrtc.close(); } catch (e) { }\r\n this.webrtc.removeAllListeners(\'connected\');\r\n this.webrtc.removeAllListeners(\'disconnected\');\r\n this.webrtc.removeAllListeners(\'dataChannel\');\r\n delete this.webrtc;\r\n }\r\n\r\n // Clean up WebSocket\r\n this.removeAllListeners(\'data\');\r\n}\r\nfunction onTunnelSendOk() { /*sendConsoleText("Tunnel #" + this.index + " SendOK.", this.sessionid);*/ }\r\nfunction onTunnelData(data) {\r\n //console.log("OnTunnelData");\r\n //sendConsoleText(\'OnTunnelData, \' + data.length + \', \' + typeof data + \', \' + data);\r\n\r\n // If this is upload data, save it to file\r\n if ((this.httprequest.uploadFile) && (typeof data == \'object\') && (data[0] != 123)) {\r\n // Save the data to file being uploaded.\r\n if (data[0] == 0) {\r\n // If data starts with zero, skip the first byte. This is used to escape binary file data from JSON.\r\n this.httprequest.uploadFileSize += (data.length - 1);\r\n try { fs.writeSync(this.httprequest.uploadFile, data, 1, data.length - 1); } catch (e) { sendConsoleText(\'FileUpload Error\'); this.write(Buffer.from(JSON.stringify({ action: \'uploaderror\' }))); return; } // Write to the file, if there is a problem, error out.\r\n } else {\r\n // If data does not start with zero, save as-is.\r\n this.httprequest.uploadFileSize += data.length;\r\n try { fs.writeSync(this.httprequest.uploadFile, data); } catch (e) { sendConsoleText(\'FileUpload Error\'); this.write(Buffer.from(JSON.stringify({ action: \'uploaderror\' }))); return; } // Write to the file, if there is a problem, error out.\r\n }\r\n this.write(Buffer.from(JSON.stringify({ action: \'uploadack\', reqid: this.httprequest.uploadFileid }))); // Ask for more data.\r\n return;\r\n }\r\n\r\n if (this.httprequest.state == 0) {\r\n // Check if this is a relay connection\r\n if ((data == \'c\') || (data == \'cr\')) { this.httprequest.state = 1; /*sendConsoleText("Tunnel #" + this.httprequest.index + " now active", this.httprequest.sessionid);*/ }\r\n }\r\n else {\r\n // Handle tunnel data\r\n if (this.httprequest.protocol == 0) { // 1 = Terminal (admin), 2 = Desktop, 5 = Files, 6 = PowerShell (admin), 7 = Plugin Data Exchange, 8 = Terminal (user), 9 = PowerShell (user), 10 = FileTransfer\r\n // Take a look at the protocol\r\n if ((data.length > 3) && (data[0] == \'{\')) { onTunnelControlData(data, this); return; }\r\n this.httprequest.protocol = parseInt(data);\r\n if (typeof this.httprequest.protocol != \'number\') { this.httprequest.protocol = 0; }\r\n\r\n // See if this protocol request is allowed.\r\n if ((this.httprequest.soptions != null) && (this.httprequest.soptions.usages != null) && (this.httprequest.soptions.usages.indexOf(this.httprequest.protocol) == -1)) { this.httprequest.protocol = 0; }\r\n\r\n if (this.httprequest.protocol == 10) {\r\n //\r\n // Basic file transfer\r\n //\r\n var stats = null;\r\n if ((process.platform != \'win32\') && (this.httprequest.xoptions.file.startsWith(\'/\') == false)) { this.httprequest.xoptions.file = \'/\' + this.httprequest.xoptions.file; }\r\n try { stats = require(\'fs\').statSync(this.httprequest.xoptions.file) } catch (e) { }\r\n try { if (stats) { this.httprequest.downloadFile = fs.createReadStream(this.httprequest.xoptions.file, { flags: \'rbN\' }); } } catch (e) { }\r\n if (this.httprequest.downloadFile) {\r\n MeshServerLogEx(106, [this.httprequest.xoptions.file, stats.size], \'Download: \\"\' + this.httprequest.xoptions.file + \'\\", Size: \' + stats.size, this.httprequest);\r\n //sendConsoleText(\'BasicFileTransfer, ok, \' + this.httprequest.xoptions.file + \', \' + JSON.stringify(stats));\r\n this.write(JSON.stringify({ op: \'ok\', size: stats.size }));\r\n this.httprequest.downloadFile.pipe(this);\r\n this.httprequest.downloadFile.end = function () { }\r\n } else {\r\n //sendConsoleText(\'BasicFileTransfer, cancel, \' + this.httprequest.xoptions.file);\r\n this.write(JSON.stringify({ op: \'cancel\' }));\r\n }\r\n }\r\n else if ((this.httprequest.protocol == 1) || (this.httprequest.protocol == 6) || (this.httprequest.protocol == 8) || (this.httprequest.protocol == 9)) {\r\n //\r\n // Remote Terminal\r\n //\r\n\r\n // Check user access rights for terminal\r\n if (((this.httprequest.rights & MESHRIGHT_REMOTECONTROL) == 0) || ((this.httprequest.rights != 0xFFFFFFFF) && ((this.httprequest.rights & MESHRIGHT_NOTERMINAL) != 0))) {\r\n // Disengage this tunnel, user does not have the rights to do this!!\r\n this.httprequest.protocol = 999999;\r\n this.httprequest.s.end();\r\n sendConsoleText("Error: No Terminal Control Rights.");\r\n return;\r\n }\r\n\r\n this.descriptorMetadata = "Remote Terminal";\r\n\r\n if (process.platform == \'win32\') {\r\n if (!require(\'win-terminal\').PowerShellCapable() && (this.httprequest.protocol == 6 || this.httprequest.protocol == 9)) {\r\n this.httprequest.write(JSON.stringify({ ctrlChannel: \'102938\', type: \'console\', msg: \'PowerShell is not supported on this version of windows\', msgid: 1 }));\r\n this.httprequest.s.end();\r\n return;\r\n }\r\n }\r\n\r\n var prom = require(\'promise\');\r\n this.httprequest.tpromise = new prom(function (res, rej) { this._res = res; this._rej = rej; });\r\n this.httprequest.tpromise.that = this;\r\n this.httprequest.tpromise.httprequest = this.httprequest;\r\n\r\n this.end = function () {\r\n if (this.httprequest.tpromise._consent) { this.httprequest.tpromise._consent.close(); }\r\n if (this.httprequest.connectionPromise) { this.httprequest.connectionPromise._rej(\'Closed\'); }\r\n\r\n // Remove the terminal session to the count to update the server\r\n if (this.httprequest.userid != null) {\r\n if (tunnelUserCount.terminal[this.httprequest.userid] != null) { tunnelUserCount.terminal[this.httprequest.userid]--; if (tunnelUserCount.terminal[this.httprequest.userid] <= 0) { delete tunnelUserCount.terminal[this.httprequest.userid]; } }\r\n try { mesh.SendCommand({ action: \'sessions\', type: \'terminal\', value: tunnelUserCount.terminal }); } catch (e) { }\r\n broadcastSessionsToRegisteredApps();\r\n }\r\n\r\n if (process.platform == \'win32\') {\r\n // Unpipe the web socket\r\n this.unpipe(this.httprequest._term);\r\n if (this.httprequest._term) { this.httprequest._term.unpipe(this); }\r\n\r\n // Unpipe the WebRTC channel if needed (This will also be done when the WebRTC channel ends).\r\n if (this.rtcchannel) {\r\n this.rtcchannel.unpipe(this.httprequest._term);\r\n if (this.httprequest._term) { this.httprequest._term.unpipe(this.rtcchannel); }\r\n }\r\n\r\n // Clean up\r\n if (this.httprequest._term) { this.httprequest._term.end(); }\r\n this.httprequest._term = null;\r\n }\r\n };\r\n\r\n // Perform User-Consent if needed. \r\n if (this.httprequest.consent && (this.httprequest.consent & 16)) {\r\n this.write(JSON.stringify({ ctrlChannel: \'102938\', type: \'console\', msg: "Waiting for user to grant access...", msgid: 1 }));\r\n var consentMessage = this.httprequest.username + " requesting remote terminal access. Grant access?", consentTitle = \'MeshCentral\';\r\n if (this.httprequest.soptions != null) {\r\n if (this.httprequest.soptions.consentTitle != null) { consentTitle = this.httprequest.soptions.consentTitle; }\r\n if (this.httprequest.soptions.consentMsgTerminal != null) { consentMessage = this.httprequest.soptions.consentMsgTerminal.replace(\'{0}\', this.httprequest.realname).replace(\'{1}\', this.httprequest.username); }\r\n }\r\n this.httprequest.tpromise._consent = require(\'message-box\').create(consentTitle, consentMessage, 30);\r\n this.httprequest.tpromise._consent.retPromise = this.httprequest.tpromise;\r\n this.httprequest.tpromise._consent.then(\r\n function () {\r\n // Success\r\n MeshServerLogEx(27, null, "Local user accepted remote terminal request (" + this.retPromise.httprequest.remoteaddr + ")", this.retPromise.that.httprequest);\r\n this.retPromise.that.write(JSON.stringify({ ctrlChannel: \'102938\', type: \'console\', msg: null, msgid: 0 }));\r\n this.retPromise._consent = null;\r\n this.retPromise._res();\r\n },\r\n function (e) {\r\n // Denied\r\n MeshServerLogEx(28, null, "Local user rejected remote terminal request (" + this.retPromise.that.httprequest.remoteaddr + ")", this.retPromise.that.httprequest);\r\n this.retPromise.that.write(JSON.stringify({ ctrlChannel: \'102938\', type: \'console\', msg: e.toString(), msgid: 2 }));\r\n this.retPromise._rej(e.toString());\r\n });\r\n }\r\n else {\r\n // User-Consent is not required, so just resolve this promise\r\n this.httprequest.tpromise._res();\r\n }\r\n\r\n\r\n this.httprequest.tpromise.then(\r\n function () {\r\n this.httprequest.connectionPromise = new prom(function (res, rej) { this._res = res; this._rej = rej; });\r\n this.httprequest.connectionPromise.ws = this.that;\r\n\r\n // Start Terminal\r\n if (process.platform == \'win32\') {\r\n try {\r\n var cols = 80, rows = 25;\r\n if (this.httprequest.xoptions) {\r\n if (this.httprequest.xoptions.rows) { rows = this.httprequest.xoptions.rows; }\r\n if (this.httprequest.xoptions.cols) { cols = this.httprequest.xoptions.cols; }\r\n }\r\n\r\n if ((this.httprequest.protocol == 1) || (this.httprequest.protocol == 6)) {\r\n // Admin Terminal\r\n if (require(\'win-virtual-terminal\').supported) {\r\n // ConPTY PseudoTerminal\r\n // this.httprequest._term = require(\'win-virtual-terminal\')[this.httprequest.protocol == 6 ? \'StartPowerShell\' : \'Start\'](80, 25);\r\n\r\n // The above line is commented out, because there is a bug with ClosePseudoConsole() API, so this is the workaround\r\n this.httprequest._dispatcher = require(\'win-dispatcher\').dispatch({ modules: [{ name: \'win-virtual-terminal\', script: getJSModule(\'win-virtual-terminal\') }], launch: { module: \'win-virtual-terminal\', method: (this.httprequest.protocol == 6 ? \'StartPowerShell\' : \'Start\'), args: [cols, rows] } });\r\n this.httprequest._dispatcher.httprequest = this.httprequest;\r\n this.httprequest._dispatcher.on(\'connection\', function (c) {\r\n if (this.httprequest.connectionPromise.completed) {\r\n c.end();\r\n }\r\n else {\r\n this.httprequest.connectionPromise._res(c);\r\n }\r\n });\r\n }\r\n else {\r\n // Legacy Terminal\r\n this.httprequest.connectionPromise._res(require(\'win-terminal\')[this.httprequest.protocol == 6 ? \'StartPowerShell\' : \'Start\'](cols, rows));\r\n }\r\n }\r\n else {\r\n // Logged in user\r\n var userPromise = require(\'user-sessions\').enumerateUsers();\r\n userPromise.that = this;\r\n userPromise.then(function (u) {\r\n var that = this.that;\r\n if (u.Active.length > 0) {\r\n var username = \'"\' + u.Active[0].Domain + \'\\\\\' + u.Active[0].Username + \'"\';\r\n sendConsoleText(\'Terminal: \' + username);\r\n if (require(\'win-virtual-terminal\').supported) {\r\n // ConPTY PseudoTerminal\r\n that.httprequest._dispatcher = require(\'win-dispatcher\').dispatch({ user: username, modules: [{ name: \'win-virtual-terminal\', script: getJSModule(\'win-virtual-terminal\') }], launch: { module: \'win-virtual-terminal\', method: (that.httprequest.protocol == 9 ? \'StartPowerShell\' : \'Start\'), args: [cols, rows] } });\r\n }\r\n else {\r\n // Legacy Terminal\r\n that.httprequest._dispatcher = require(\'win-dispatcher\').dispatch({ user: username, modules: [{ name: \'win-terminal\', script: getJSModule(\'win-terminal\') }], launch: { module: \'win-terminal\', method: (that.httprequest.protocol == 9 ? \'StartPowerShell\' : \'Start\'), args: [cols, rows] } });\r\n }\r\n that.httprequest._dispatcher.ws = that;\r\n that.httprequest._dispatcher.on(\'connection\', function (c) {\r\n if (this.ws.httprequest.connectionPromise.completed) {\r\n c.end();\r\n }\r\n else {\r\n this.ws.httprequest.connectionPromise._res(c);\r\n }\r\n });\r\n }\r\n });\r\n }\r\n }\r\n catch (e) {\r\n this.httprequest.connectionPromise._rej(\'Failed to start remote terminal session, \' + e.toString());\r\n }\r\n }\r\n else {\r\n try {\r\n var bash = fs.existsSync(\'/bin/bash\') ? \'/bin/bash\' : false;\r\n var sh = fs.existsSync(\'/bin/sh\') ? \'/bin/sh\' : false;\r\n var login = process.platform == \'linux\' ? \'/bin/login\' : \'/usr/bin/login\';\r\n\r\n var env = { HISTCONTROL: \'ignoreboth\' };\r\n if (this.httprequest.xoptions) {\r\n if (this.httprequest.xoptions.rows) { env.LINES = (\'\' + this.httprequest.xoptions.rows); }\r\n if (this.httprequest.xoptions.cols) { env.COLUMNS = (\'\' + this.httprequest.xoptions.cols); }\r\n }\r\n var options = { type: childProcess.SpawnTypes.TERM, uid: (this.httprequest.protocol == 8) ? require(\'user-sessions\').consoleUid() : null, env: env };\r\n if (this.httprequest.xoptions && this.httprequest.xoptions.requireLogin) {\r\n if (!require(\'fs\').existsSync(login)) { throw (\'Unable to spawn login process\'); }\r\n this.httprequest.connectionPromise._res(childProcess.execFile(login, [\'login\'], options)); // Start login shell\r\n }\r\n else if (bash) {\r\n var p = childProcess.execFile(bash, [\'bash\'], options); // Start bash\r\n // Spaces at the beginning of lines are needed to hide commands from the command history\r\n if (process.platform == \'linux\') { p.stdin.write(\' alias ls=\\\'ls --color=auto\\\';clear\\n\'); }\r\n this.httprequest.connectionPromise._res(p);\r\n }\r\n else if (sh) {\r\n var p = childProcess.execFile(sh, [\'sh\'], options); // Start sh\r\n // Spaces at the beginning of lines are needed to hide commands from the command history\r\n if (process.platform == \'linux\') { p.stdin.write(\' alias ls=\\\'ls --color=auto\\\';clear\\n\'); }\r\n this.httprequest.connectionPromise._res(p);\r\n }\r\n else {\r\n this.httprequest.connectionPromise._rej(\'Failed to start remote terminal session, no shell found\');\r\n }\r\n }\r\n catch (e) {\r\n this.httprequest.connectionPromise._rej(\'Failed to start remote terminal session, \' + e.toString());\r\n }\r\n }\r\n\r\n this.httprequest.connectionPromise.then(\r\n function (term) {\r\n // SUCCESS\r\n var stdoutstream;\r\n var stdinstream;\r\n if (process.platform == \'win32\') {\r\n this.ws.httprequest._term = term;\r\n this.ws.httprequest._term.tunnel = this.ws;\r\n stdoutstream = stdinstream = term;\r\n }\r\n else {\r\n term.descriptorMetadata = \'Remote Terminal\';\r\n this.ws.httprequest.process = term;\r\n this.ws.httprequest.process.tunnel = this.ws;\r\n term.stderr.stdout = term.stdout;\r\n term.stderr.on(\'data\', function (c) { this.stdout.write(c); });\r\n stdoutstream = term.stdout;\r\n stdinstream = term.stdin;\r\n this.ws.prependListener(\'end\', function () { this.httprequest.process.kill(); });\r\n term.prependListener(\'exit\', function () { this.tunnel.end(); });\r\n }\r\n\r\n this.ws.removeAllListeners(\'data\');\r\n this.ws.on(\'data\', onTunnelControlData);\r\n\r\n stdoutstream.pipe(this.ws, { dataTypeSkip: 1 }); // 0 = Binary, 1 = Text.\r\n this.ws.pipe(stdinstream, { dataTypeSkip: 1, end: false }); // 0 = Binary, 1 = Text. \r\n\r\n // Add the terminal session to the count to update the server\r\n if (this.ws.httprequest.userid != null) {\r\n if (tunnelUserCount.terminal[this.ws.httprequest.userid] == null) { tunnelUserCount.terminal[this.ws.httprequest.userid] = 1; } else { tunnelUserCount.terminal[this.ws.httprequest.userid]++; }\r\n try { mesh.SendCommand({ action: \'sessions\', type: \'terminal\', value: tunnelUserCount.terminal }); } catch (e) { }\r\n broadcastSessionsToRegisteredApps();\r\n }\r\n\r\n // Toast Notification, if required\r\n if (this.ws.httprequest.consent && (this.ws.httprequest.consent & 2)) {\r\n // User Notifications is required\r\n var notifyMessage = this.ws.httprequest.username + " started a remote terminal session.", notifyTitle = "MeshCentral";\r\n if (this.ws.httprequest.soptions != null) {\r\n if (this.ws.httprequest.soptions.notifyTitle != null) { notifyTitle = this.ws.httprequest.soptions.notifyTitle; }\r\n if (this.ws.httprequest.soptions.notifyMsgTerminal != null) { notifyMessage = this.ws.httprequest.soptions.notifyMsgTerminal.replace(\'{0}\', this.ws.httprequest.realname).replace(\'{1}\', this.ws.httprequest.username); }\r\n }\r\n try { require(\'toaster\').Toast(notifyTitle, notifyMessage); } catch (e) { }\r\n }\r\n },\r\n function (e) {\r\n // FAILED to connect terminal\r\n this.ws.write(JSON.stringify({ ctrlChannel: \'102938\', type: \'console\', msg: e.toString(), msgid: 2 }));\r\n this.ws.end();\r\n });\r\n },\r\n function (e) {\r\n // DO NOT start terminal\r\n this.that.write(JSON.stringify({ ctrlChannel: \'102938\', type: \'console\', msg: e.toString(), msgid: 2 }));\r\n this.that.end();\r\n });\r\n }\r\n else if (this.httprequest.protocol == 2) {\r\n //\r\n // Remote Desktop\r\n //\r\n\r\n // Check user access rights for desktop\r\n if ((((this.httprequest.rights & MESHRIGHT_REMOTECONTROL) == 0) && ((this.httprequest.rights & MESHRIGHT_REMOTEVIEW) == 0)) || ((this.httprequest.rights != 0xFFFFFFFF) && ((this.httprequest.rights & MESHRIGHT_NODESKTOP) != 0))) {\r\n // Disengage this tunnel, user does not have the rights to do this!!\r\n this.httprequest.protocol = 999999;\r\n this.httprequest.s.end();\r\n sendConsoleText("Error: No Desktop Control Rights.");\r\n return;\r\n }\r\n\r\n this.descriptorMetadata = "Remote KVM";\r\n\r\n // Look for a TSID\r\n var tsid = null;\r\n if ((this.httprequest.xoptions != null) && (typeof this.httprequest.xoptions.tsid == \'number\')) { tsid = this.httprequest.xoptions.tsid; }\r\n require(\'MeshAgent\')._tsid = tsid;\r\n\r\n // Remote desktop using native pipes\r\n this.httprequest.desktop = { state: 0, kvm: mesh.getRemoteDesktopStream(tsid), tunnel: this };\r\n this.httprequest.desktop.kvm.parent = this.httprequest.desktop;\r\n this.desktop = this.httprequest.desktop;\r\n\r\n // Add ourself to the list of remote desktop sessions\r\n if (this.httprequest.desktop.kvm.tunnels == null) { this.httprequest.desktop.kvm.tunnels = []; }\r\n this.httprequest.desktop.kvm.tunnels.push(this);\r\n\r\n // Send a metadata update to all desktop sessions\r\n var users = {};\r\n if (this.httprequest.desktop.kvm.tunnels != null) {\r\n for (var i in this.httprequest.desktop.kvm.tunnels) { try { var userid = this.httprequest.desktop.kvm.tunnels[i].httprequest.userid; if (users[userid] == null) { users[userid] = 1; } else { users[userid]++; } } catch (e) { } }\r\n for (var i in this.httprequest.desktop.kvm.tunnels) { try { this.httprequest.desktop.kvm.tunnels[i].write(JSON.stringify({ ctrlChannel: \'102938\', type: \'metadata\', users: users })); } catch (e) { } }\r\n tunnelUserCount.desktop = users;\r\n try { mesh.SendCommand({ action: \'sessions\', type: \'kvm\', value: users }); } catch (e) { }\r\n broadcastSessionsToRegisteredApps();\r\n }\r\n\r\n this.end = function () {\r\n --this.desktop.kvm.connectionCount;\r\n\r\n // Remove ourself from the list of remote desktop session\r\n var i = this.desktop.kvm.tunnels.indexOf(this);\r\n if (i >= 0) { this.desktop.kvm.tunnels.splice(i, 1); }\r\n\r\n // Send a metadata update to all desktop sessions\r\n var users = {};\r\n if (this.httprequest.desktop.kvm.tunnels != null) {\r\n for (var i in this.httprequest.desktop.kvm.tunnels) { try { var userid = this.httprequest.desktop.kvm.tunnels[i].httprequest.userid; if (users[userid] == null) { users[userid] = 1; } else { users[userid]++; } } catch (e) { } }\r\n for (var i in this.httprequest.desktop.kvm.tunnels) { try { this.httprequest.desktop.kvm.tunnels[i].write(JSON.stringify({ ctrlChannel: \'102938\', type: \'metadata\', users: users })); } catch (e) { } }\r\n tunnelUserCount.desktop = users;\r\n try { mesh.SendCommand({ action: \'sessions\', type: \'kvm\', value: users }); } catch (e) { }\r\n broadcastSessionsToRegisteredApps();\r\n }\r\n\r\n // Unpipe the web socket\r\n try {\r\n this.unpipe(this.httprequest.desktop.kvm);\r\n this.httprequest.desktop.kvm.unpipe(this);\r\n }\r\n catch (e) { }\r\n\r\n // Unpipe the WebRTC channel if needed (This will also be done when the WebRTC channel ends).\r\n if (this.rtcchannel) {\r\n try {\r\n this.rtcchannel.unpipe(this.httprequest.desktop.kvm);\r\n this.httprequest.desktop.kvm.unpipe(this.rtcchannel);\r\n }\r\n catch (e) { }\r\n }\r\n\r\n // Place wallpaper back if needed\r\n // TODO\r\n\r\n if (this.desktop.kvm.connectionCount == 0) {\r\n // Display a toast message. This may not be supported on all platforms.\r\n // try { require(\'toaster\').Toast(\'MeshCentral\', \'Remote Desktop Control Ended.\'); } catch (e) { }\r\n\r\n this.httprequest.desktop.kvm.end();\r\n if (this.httprequest.desktop.kvm.connectionBar) {\r\n this.httprequest.desktop.kvm.connectionBar.removeAllListeners(\'close\');\r\n this.httprequest.desktop.kvm.connectionBar.close();\r\n this.httprequest.desktop.kvm.connectionBar = null;\r\n }\r\n } else {\r\n for (var i in this.httprequest.desktop.kvm.users) {\r\n if ((this.httprequest.desktop.kvm.users[i] == this.httprequest.username) && this.httprequest.desktop.kvm.connectionBar) {\r\n for (var j in this.httprequest.desktop.kvm.rusers) { if (this.httprequest.desktop.kvm.rusers[j] == this.httprequest.realname) { this.httprequest.desktop.kvm.rusers.splice(j, 1); break; } }\r\n this.httprequest.desktop.kvm.users.splice(i, 1);\r\n this.httprequest.desktop.kvm.connectionBar.removeAllListeners(\'close\');\r\n this.httprequest.desktop.kvm.connectionBar.close();\r\n this.httprequest.desktop.kvm.connectionBar = require(\'notifybar-desktop\')(this.httprequest.privacybartext.replace(\'{0}\', this.httprequest.desktop.kvm.rusers.join(\', \')).replace(\'{1}\', this.httprequest.desktop.kvm.users.join(\', \')), require(\'MeshAgent\')._tsid);\r\n this.httprequest.desktop.kvm.connectionBar.httprequest = this.httprequest;\r\n this.httprequest.desktop.kvm.connectionBar.on(\'close\', function () {\r\n MeshServerLogEx(29, null, "Remote Desktop Connection forcefully closed by local user (" + this.httprequest.remoteaddr + ")", this.httprequest);\r\n for (var i in this.httprequest.desktop.kvm._pipedStreams) {\r\n this.httprequest.desktop.kvm._pipedStreams[i].end();\r\n }\r\n this.httprequest.desktop.kvm.end();\r\n });\r\n break;\r\n }\r\n }\r\n }\r\n };\r\n if (this.httprequest.desktop.kvm.hasOwnProperty(\'connectionCount\')) {\r\n this.httprequest.desktop.kvm.connectionCount++;\r\n this.httprequest.desktop.kvm.rusers.push(this.httprequest.realname);\r\n this.httprequest.desktop.kvm.users.push(this.httprequest.username);\r\n this.httprequest.desktop.kvm.rusers.sort();\r\n this.httprequest.desktop.kvm.users.sort();\r\n } else {\r\n this.httprequest.desktop.kvm.connectionCount = 1;\r\n this.httprequest.desktop.kvm.rusers = [this.httprequest.realname];\r\n this.httprequest.desktop.kvm.users = [this.httprequest.username];\r\n }\r\n\r\n if ((this.httprequest.rights == 0xFFFFFFFF) || (((this.httprequest.rights & MESHRIGHT_REMOTECONTROL) != 0) && ((this.httprequest.rights & MESHRIGHT_REMOTEVIEW) == 0))) {\r\n // If we have remote control rights, pipe the KVM input\r\n this.pipe(this.httprequest.desktop.kvm, { dataTypeSkip: 1, end: false }); // 0 = Binary, 1 = Text. Pipe the Browser --> KVM input.\r\n } else {\r\n // We need to only pipe non-mouse & non-keyboard inputs.\r\n //sendConsoleText(\'Warning: No Remote Desktop Input Rights.\');\r\n // TODO!!!\r\n }\r\n\r\n // Perform notification if needed. Toast messages may not be supported on all platforms.\r\n if (this.httprequest.consent && (this.httprequest.consent & 8)) {\r\n // User Consent Prompt is required\r\n // Send a console message back using the console channel, "\\n" is supported.\r\n this.write(JSON.stringify({ ctrlChannel: \'102938\', type: \'console\', msg: "Waiting for user to grant access...", msgid: 1 }));\r\n var consentMessage = this.httprequest.realname + " requesting remote desktop access. Grant access?", consentTitle = \'MeshCentral\';\r\n if (this.httprequest.soptions != null) {\r\n if (this.httprequest.soptions.consentTitle != null) { consentTitle = this.httprequest.soptions.consentTitle; }\r\n if (this.httprequest.soptions.consentMsgDesktop != null) { consentMessage = this.httprequest.soptions.consentMsgDesktop.replace(\'{0}\', this.httprequest.realname).replace(\'{1}\', this.httprequest.username); }\r\n }\r\n var pr = require(\'message-box\').create(consentTitle, consentMessage, 30, null, tsid);\r\n pr.ws = this;\r\n this.pause();\r\n this._consentpromise = pr;\r\n this.prependOnceListener(\'end\', function () { if (this._consentpromise && this._consentpromise.close) { this._consentpromise.close(); } });\r\n pr.then(\r\n function () {\r\n // Success\r\n this.ws._consentpromise = null;\r\n MeshServerLogEx(30, null, "Starting remote desktop after local user accepted (" + this.ws.httprequest.remoteaddr + ")", this.ws.httprequest);\r\n this.ws.write(JSON.stringify({ ctrlChannel: \'102938\', type: \'console\', msg: null, msgid: 0 }));\r\n if (this.ws.httprequest.consent && (this.ws.httprequest.consent & 1)) {\r\n // User Notifications is required\r\n var notifyMessage = this.ws.httprequest.realname + " started a remote desktop session.", notifyTitle = "MeshCentral";\r\n if (this.ws.httprequest.soptions != null) {\r\n if (this.ws.httprequest.soptions.notifyTitle != null) { notifyTitle = this.ws.httprequest.soptions.notifyTitle; }\r\n if (this.ws.httprequest.soptions.notifyMsgDesktop != null) { notifyMessage = this.ws.httprequest.soptions.notifyMsgDesktop.replace(\'{0}\', this.ws.httprequest.realname).replace(\'{1}\', this.ws.httprequest.username); }\r\n }\r\n try { require(\'toaster\').Toast(notifyTitle, notifyMessage, tsid); } catch (e) { }\r\n }\r\n if (this.ws.httprequest.consent && (this.ws.httprequest.consent & 0x40)) {\r\n // Connection Bar is required\r\n if (this.ws.httprequest.desktop.kvm.connectionBar) {\r\n this.ws.httprequest.desktop.kvm.connectionBar.removeAllListeners(\'close\');\r\n this.ws.httprequest.desktop.kvm.connectionBar.close();\r\n }\r\n try {\r\n this.ws.httprequest.desktop.kvm.connectionBar = require(\'notifybar-desktop\')(this.ws.httprequest.privacybartext.replace(\'{0}\', this.ws.httprequest.desktop.kvm.rusers.join(\', \')).replace(\'{1}\', this.ws.httprequest.desktop.kvm.users.join(\', \')), require(\'MeshAgent\')._tsid);\r\n MeshServerLogEx(31, null, "Remote Desktop Connection Bar Activated/Updated (" + this.ws.httprequest.remoteaddr + ")", this.ws.httprequest);\r\n }\r\n catch (e) {\r\n if (process.platform != \'darwin\') {\r\n MeshServerLogEx(32, null, "Remote Desktop Connection Bar Failed or Not Supported (" + this.ws.httprequest.remoteaddr + ")", this.ws.httprequest);\r\n }\r\n }\r\n if (this.ws.httprequest.desktop.kvm.connectionBar) {\r\n this.ws.httprequest.desktop.kvm.connectionBar.httprequest = this.ws.httprequest;\r\n this.ws.httprequest.desktop.kvm.connectionBar.on(\'close\', function () {\r\n MeshServerLogEx(33, null, "Remote Desktop Connection forcefully closed by local user (" + this.httprequest.remoteaddr + ")", this.httprequest);\r\n for (var i in this.httprequest.desktop.kvm._pipedStreams) {\r\n this.httprequest.desktop.kvm._pipedStreams[i].end();\r\n }\r\n this.httprequest.desktop.kvm.end();\r\n });\r\n }\r\n }\r\n this.ws.httprequest.desktop.kvm.pipe(this.ws, { dataTypeSkip: 1 });\r\n this.ws.resume();\r\n },\r\n function (e) {\r\n // User Consent Denied/Failed\r\n this.ws._consentpromise = null;\r\n MeshServerLogEx(34, null, "Failed to start remote desktop after local user rejected (" + this.ws.httprequest.remoteaddr + ")", this.ws.httprequest);\r\n this.ws.end(JSON.stringify({ ctrlChannel: \'102938\', type: \'console\', msg: e.toString(), msgid: 2 }));\r\n });\r\n } else {\r\n // User Consent Prompt is not required\r\n if (this.httprequest.consent && (this.httprequest.consent & 1)) {\r\n // User Notifications is required\r\n MeshServerLogEx(35, null, "Started remote desktop with toast notification (" + this.httprequest.remoteaddr + ")", this.httprequest);\r\n var notifyMessage = this.httprequest.realname + " started a remote desktop session.", notifyTitle = "MeshCentral";\r\n if (this.httprequest.soptions != null) {\r\n if (this.httprequest.soptions.notifyTitle != null) { notifyTitle = this.httprequest.soptions.notifyTitle; }\r\n if (this.httprequest.soptions.notifyMsgDesktop != null) { notifyMessage = this.httprequest.soptions.notifyMsgDesktop.replace(\'{0}\', this.httprequest.realname).replace(\'{1}\', this.httprequest.username); }\r\n }\r\n try { require(\'toaster\').Toast(notifyTitle, notifyMessage, tsid); } catch (e) { }\r\n } else {\r\n MeshServerLogEx(36, null, "Started remote desktop without notification (" + this.httprequest.remoteaddr + ")", this.httprequest);\r\n }\r\n if (this.httprequest.consent && (this.httprequest.consent & 0x40)) {\r\n // Connection Bar is required\r\n if (this.httprequest.desktop.kvm.connectionBar) {\r\n this.httprequest.desktop.kvm.connectionBar.removeAllListeners(\'close\');\r\n this.httprequest.desktop.kvm.connectionBar.close();\r\n }\r\n try {\r\n this.httprequest.desktop.kvm.connectionBar = require(\'notifybar-desktop\')(this.httprequest.privacybartext.replace(\'{0}\', this.httprequest.desktop.kvm.rusers.join(\', \')).replace(\'{1}\', this.httprequest.desktop.kvm.users.join(\', \')), require(\'MeshAgent\')._tsid);\r\n MeshServerLogEx(37, null, "Remote Desktop Connection Bar Activated/Updated (" + this.httprequest.remoteaddr + ")", this.httprequest);\r\n }\r\n catch (e) {\r\n MeshServerLogEx(38, null, "Remote Desktop Connection Bar Failed or not Supported (" + this.httprequest.remoteaddr + ")", this.httprequest);\r\n }\r\n if (this.httprequest.desktop.kvm.connectionBar) {\r\n this.httprequest.desktop.kvm.connectionBar.httprequest = this.httprequest;\r\n this.httprequest.desktop.kvm.connectionBar.on(\'close\', function () {\r\n MeshServerLogEx(39, null, "Remote Desktop Connection forcefully closed by local user (" + this.httprequest.remoteaddr + ")", this.httprequest);\r\n for (var i in this.httprequest.desktop.kvm._pipedStreams) {\r\n this.httprequest.desktop.kvm._pipedStreams[i].end();\r\n }\r\n this.httprequest.desktop.kvm.end();\r\n });\r\n }\r\n }\r\n this.httprequest.desktop.kvm.pipe(this, { dataTypeSkip: 1 });\r\n }\r\n\r\n this.removeAllListeners(\'data\');\r\n this.on(\'data\', onTunnelControlData);\r\n //this.write(\'MeshCore KVM Hello!1\');\r\n\r\n } else if (this.httprequest.protocol == 5) {\r\n //\r\n // Remote Files\r\n //\r\n\r\n // Check user access rights for files\r\n if (((this.httprequest.rights & MESHRIGHT_REMOTECONTROL) == 0) || ((this.httprequest.rights != 0xFFFFFFFF) && ((this.httprequest.rights & MESHRIGHT_NOFILES) != 0))) {\r\n // Disengage this tunnel, user does not have the rights to do this!!\r\n this.httprequest.protocol = 999999;\r\n this.httprequest.s.end();\r\n sendConsoleText("Error: No files control rights.");\r\n return;\r\n }\r\n\r\n this.descriptorMetadata = "Remote Files";\r\n\r\n // Add the files session to the count to update the server\r\n if (this.httprequest.userid != null) {\r\n if (tunnelUserCount.files[this.httprequest.userid] == null) { tunnelUserCount.files[this.httprequest.userid] = 1; } else { tunnelUserCount.files[this.httprequest.userid]++; }\r\n try { mesh.SendCommand({ action: \'sessions\', type: \'files\', value: tunnelUserCount.files }); } catch (e) { }\r\n broadcastSessionsToRegisteredApps();\r\n }\r\n\r\n this.end = function () {\r\n // Remove the files session from the count to update the server\r\n if (this.httprequest.userid != null) {\r\n if (tunnelUserCount.files[this.httprequest.userid] != null) { tunnelUserCount.files[this.httprequest.userid]--; if (tunnelUserCount.files[this.httprequest.userid] <= 0) { delete tunnelUserCount.files[this.httprequest.userid]; } }\r\n try { mesh.SendCommand({ action: \'sessions\', type: \'files\', value: tunnelUserCount.files }); } catch (e) { }\r\n broadcastSessionsToRegisteredApps();\r\n }\r\n };\r\n\r\n // Perform notification if needed. Toast messages may not be supported on all platforms.\r\n if (this.httprequest.consent && (this.httprequest.consent & 32)) {\r\n // User Consent Prompt is required\r\n // Send a console message back using the console channel, "\\n" is supported.\r\n this.write(JSON.stringify({ ctrlChannel: \'102938\', type: \'console\', msg: "Waiting for user to grant access...", msgid: 1 }));\r\n var consentMessage = this.httprequest.realname + " requesting remote file Access. Grant access?", consentTitle = \'MeshCentral\';\r\n if (this.httprequest.soptions != null) {\r\n if (this.httprequest.soptions.consentTitle != null) { consentTitle = this.httprequest.soptions.consentTitle; }\r\n if (this.httprequest.soptions.consentMsgFiles != null) { consentMessage = this.httprequest.soptions.consentMsgFiles.replace(\'{0}\', this.httprequest.realname).replace(\'{1}\', this.httprequest.username); }\r\n }\r\n var pr = require(\'message-box\').create(consentTitle, consentMessage, 30);\r\n pr.ws = this;\r\n this.pause();\r\n this._consentpromise = pr;\r\n this.prependOnceListener(\'end\', function () { if (this._consentpromise && this._consentpromise.close) { this._consentpromise.close(); } });\r\n pr.then(\r\n function () {\r\n // Success\r\n this.ws._consentpromise = null;\r\n MeshServerLogEx(40, null, "Starting remote files after local user accepted (" + this.ws.httprequest.remoteaddr + ")", this.ws.httprequest);\r\n this.ws.write(JSON.stringify({ ctrlChannel: \'102938\', type: \'console\', msg: null }));\r\n if (this.ws.httprequest.consent && (this.ws.httprequest.consent & 4)) {\r\n // User Notifications is required\r\n var notifyMessage = this.ws.httprequest.realname + " started a remote file session.", notifyTitle = "MeshCentral";\r\n if (this.ws.httprequest.soptions != null) {\r\n if (this.ws.httprequest.soptions.notifyTitle != null) { notifyTitle = this.ws.httprequest.soptions.notifyTitle; }\r\n if (this.ws.httprequest.soptions.notifyMsgFiles != null) { notifyMessage = this.ws.httprequest.soptions.notifyMsgFiles.replace(\'{0}\', this.ws.httprequest.realname).replace(\'{1}\', this.ws.httprequest.username); }\r\n }\r\n try { require(\'toaster\').Toast(notifyTitle, notifyMessage); } catch (e) { }\r\n }\r\n this.ws.resume();\r\n },\r\n function (e) {\r\n // User Consent Denied/Failed\r\n this.ws._consentpromise = null;\r\n MeshServerLogEx(41, null, "Failed to start remote files after local user rejected (" + this.ws.httprequest.remoteaddr + ")", this.ws.httprequest);\r\n this.ws.end(JSON.stringify({ ctrlChannel: \'102938\', type: \'console\', msg: e.toString(), msgid: 2 }));\r\n });\r\n } else {\r\n // User Consent Prompt is not required\r\n if (this.httprequest.consent && (this.httprequest.consent & 4)) {\r\n // User Notifications is required\r\n MeshServerLogEx(42, null, "Started remote files with toast notification (" + this.httprequest.remoteaddr + ")", this.httprequest);\r\n var notifyMessage = this.httprequest.realname + " started a remote file session.", notifyTitle = "MeshCentral";\r\n if (this.httprequest.soptions != null) {\r\n if (this.httprequest.soptions.notifyTitle != null) { notifyTitle = this.httprequest.soptions.notifyTitle; }\r\n if (this.httprequest.soptions.notifyMsgFiles != null) { notifyMessage = this.httprequest.soptions.notifyMsgFiles.replace(\'{0}\', this.httprequest.realname).replace(\'{1}\', this.httprequest.username); }\r\n }\r\n try { require(\'toaster\').Toast(notifyTitle, notifyMessage); } catch (e) { }\r\n } else {\r\n MeshServerLogEx(43, null, "Started remote files without notification (" + this.httprequest.remoteaddr + ")", this.httprequest);\r\n }\r\n this.resume();\r\n }\r\n\r\n // Setup files\r\n // NOP\r\n }\r\n } else if (this.httprequest.protocol == 1) {\r\n // Send data into terminal stdin\r\n //this.write(data); // Echo back the keys (Does not seem to be a good idea)\r\n } else if (this.httprequest.protocol == 2) {\r\n // Send data into remote desktop\r\n if (this.httprequest.desktop.state == 0) {\r\n this.write(Buffer.from(String.fromCharCode(0x11, 0xFE, 0x00, 0x00, 0x4D, 0x45, 0x53, 0x48, 0x00, 0x00, 0x00, 0x00, 0x02)));\r\n this.httprequest.desktop.state = 1;\r\n } else {\r\n this.httprequest.desktop.write(data);\r\n }\r\n } else if (this.httprequest.protocol == 5) {\r\n // Process files commands\r\n var cmd = null;\r\n try { cmd = JSON.parse(data); } catch (e) { };\r\n if (cmd == null) { return; }\r\n if ((cmd.ctrlChannel == \'102938\') || ((cmd.type == \'offer\') && (cmd.sdp != null))) { onTunnelControlData(cmd, this); return; } // If this is control data, handle it now.\r\n if (cmd.action == undefined) { return; }\r\n //sendConsoleText(\'CMD: \' + JSON.stringify(cmd));\r\n\r\n if ((cmd.path != null) && (process.platform != \'win32\') && (cmd.path[0] != \'/\')) { cmd.path = \'/\' + cmd.path; } // Add \'/\' to paths on non-windows\r\n //console.log(objToString(cmd, 0, \' \'));\r\n switch (cmd.action) {\r\n case \'ls\': {\r\n /*\r\n // Close the watcher if required\r\n var samepath = ((this.httprequest.watcher != undefined) && (cmd.path == this.httprequest.watcher.path));\r\n if ((this.httprequest.watcher != undefined) && (samepath == false)) {\r\n //console.log(\'Closing watcher: \' + this.httprequest.watcher.path);\r\n //this.httprequest.watcher.close(); // TODO: This line causes the agent to crash!!!!\r\n delete this.httprequest.watcher;\r\n }\r\n */\r\n\r\n // Send the folder content to the browser\r\n var response = getDirectoryInfo(cmd.path);\r\n if (cmd.reqid != undefined) { response.reqid = cmd.reqid; }\r\n this.write(Buffer.from(JSON.stringify(response)));\r\n\r\n /*\r\n // Start the directory watcher\r\n if ((cmd.path != \'\') && (samepath == false)) {\r\n var watcher = fs.watch(cmd.path, onFileWatcher);\r\n watcher.tunnel = this.httprequest;\r\n watcher.path = cmd.path;\r\n this.httprequest.watcher = watcher;\r\n //console.log(\'Starting watcher: \' + this.httprequest.watcher.path);\r\n }\r\n */\r\n break;\r\n }\r\n case \'mkdir\': {\r\n // Create a new empty folder\r\n fs.mkdirSync(cmd.path);\r\n MeshServerLogEx(44, [cmd.path], "Create folder: \\"" + cmd.path + "\\"", this.httprequest);\r\n break;\r\n }\r\n case \'rm\': {\r\n // Delete, possibly recursive delete\r\n for (var i in cmd.delfiles) {\r\n var p = obj.path.join(cmd.path, cmd.delfiles[i]), delcount = 0;\r\n try { delcount = deleteFolderRecursive(p, cmd.rec); } catch (e) { }\r\n if ((delcount == 1) && !cmd.rec) {\r\n MeshServerLogEx(45, [p], "Delete: \\"" + p + "\\"", this.httprequest);\r\n } else {\r\n if (cmd.rec) {\r\n MeshServerLogEx(46, [p, delcount], "Delete recursive: \\"" + p + "\\", " + delcount + " element(s) removed", this.httprequest);\r\n } else {\r\n MeshServerLogEx(47, [p, delcount], "Delete: \\"" + p + "\\", " + delcount + " element(s) removed", this.httprequest);\r\n }\r\n }\r\n }\r\n break;\r\n }\r\n case \'markcoredump\': {\r\n // If we are asking for the coredump file, set the right path.\r\n var coreDumpPath = null;\r\n if (process.platform == \'win32\') {\r\n if (fs.existsSync(process.coreDumpLocation)) { coreDumpPath = process.coreDumpLocation; }\r\n } else {\r\n if ((process.cwd() != \'//\') && fs.existsSync(process.cwd() + \'core\')) { coreDumpPath = process.cwd() + \'core\'; }\r\n }\r\n if (coreDumpPath != null) { db.Put(\'CoreDumpTime\', require(\'fs\').statSync(coreDumpPath).mtime); }\r\n break;\r\n }\r\n case \'rename\':\r\n {\r\n // Rename a file or folder\r\n var oldfullpath = obj.path.join(cmd.path, cmd.oldname);\r\n var newfullpath = obj.path.join(cmd.path, cmd.newname);\r\n MeshServerLogEx(48, [oldfullpath, cmd.newname], \'Rename: \\"\' + oldfullpath + \'\\" to \\"\' + cmd.newname + \'\\"\', this.httprequest);\r\n try { fs.renameSync(oldfullpath, newfullpath); } catch (e) { console.log(e); }\r\n break;\r\n }\r\n case \'findfile\':\r\n {\r\n // Search for files\r\n var r = require(\'file-search\').find(\'"\' + cmd.path + \'"\', cmd.filter);\r\n if (!r.cancel) { r.cancel = function cancel() { this.child.kill(); }; }\r\n this._search = r;\r\n r.socket = this;\r\n r.socket.reqid = cmd.reqid; // Search request id. This is used to send responses and cancel the request.\r\n r.socket.path = cmd.path; // Search path\r\n r.on(\'result\', function (str) { try { this.socket.write(Buffer.from(JSON.stringify({ action: \'findfile\', r: str.substring(this.socket.path.length), reqid: this.socket.reqid }))); } catch (ex) { } });\r\n r.then(function () { try { this.socket.write(Buffer.from(JSON.stringify({ action: \'findfile\', r: null, reqid: this.socket.reqid }))); } catch (ex) { } });\r\n break;\r\n }\r\n case \'cancelfindfile\':\r\n {\r\n if (this._search) { this._search.cancel(); this._search = null; }\r\n break;\r\n }\r\n case \'download\':\r\n {\r\n // Download a file\r\n var sendNextBlock = 0;\r\n if (cmd.sub == \'start\') { // Setup the download\r\n if ((cmd.path == null) && (cmd.ask == \'coredump\')) { // If we are asking for the coredump file, set the right path.\r\n if (process.platform == \'win32\') {\r\n if (fs.existsSync(process.coreDumpLocation)) { cmd.path = process.coreDumpLocation; }\r\n } else {\r\n if ((process.cwd() != \'//\') && fs.existsSync(process.cwd() + \'core\')) { cmd.path = process.cwd() + \'core\'; }\r\n }\r\n }\r\n MeshServerLogEx((cmd.ask == \'coredump\') ? 104 : 49, [cmd.path], \'Download: \\"\' + cmd.path + \'\\"\', this.httprequest);\r\n if ((cmd.path == null) || (this.filedownload != null)) { this.write({ action: \'download\', sub: \'cancel\', id: this.filedownload.id }); delete this.filedownload; }\r\n this.filedownload = { id: cmd.id, path: cmd.path, ptr: 0 }\r\n try { this.filedownload.f = fs.openSync(this.filedownload.path, \'rbN\'); } catch (e) { this.write({ action: \'download\', sub: \'cancel\', id: this.filedownload.id }); delete this.filedownload; }\r\n if (this.filedownload) { this.write({ action: \'download\', sub: \'start\', id: cmd.id }); }\r\n } else if ((this.filedownload != null) && (cmd.id == this.filedownload.id)) { // Download commands\r\n if (cmd.sub == \'startack\') { sendNextBlock = ((typeof cmd.ack == \'number\') ? cmd.ack : 8); } else if (cmd.sub == \'stop\') { delete this.filedownload; } else if (cmd.sub == \'ack\') { sendNextBlock = 1; }\r\n }\r\n // Send the next download block(s)\r\n while (sendNextBlock > 0) {\r\n sendNextBlock--;\r\n var buf = Buffer.alloc(16384);\r\n var len = fs.readSync(this.filedownload.f, buf, 4, 16380, null);\r\n this.filedownload.ptr += len;\r\n if (len < 16380) { buf.writeInt32BE(0x01000001, 0); fs.closeSync(this.filedownload.f); delete this.filedownload; sendNextBlock = 0; } else { buf.writeInt32BE(0x01000000, 0); }\r\n this.write(buf.slice(0, len + 4)); // Write as binary\r\n }\r\n break;\r\n }\r\n case \'upload\':\r\n {\r\n // Upload a file, browser to agent\r\n if (this.httprequest.uploadFile != null) { fs.closeSync(this.httprequest.uploadFile); delete this.httprequest.uploadFile; }\r\n if (cmd.path == undefined) break;\r\n var filepath = cmd.name ? obj.path.join(cmd.path, cmd.name) : cmd.path;\r\n this.httprequest.uploadFilePath = filepath;\r\n this.httprequest.uploadFileSize = 0;\r\n try { this.httprequest.uploadFile = fs.openSync(filepath, \'wbN\'); } catch (e) { this.write(Buffer.from(JSON.stringify({ action: \'uploaderror\', reqid: cmd.reqid }))); break; }\r\n this.httprequest.uploadFileid = cmd.reqid;\r\n if (this.httprequest.uploadFile) { this.write(Buffer.from(JSON.stringify({ action: \'uploadstart\', reqid: this.httprequest.uploadFileid }))); }\r\n break;\r\n }\r\n case \'uploaddone\':\r\n {\r\n // Indicates that an upload is done\r\n if (this.httprequest.uploadFile) {\r\n MeshServerLogEx(105, [this.httprequest.uploadFilePath, this.httprequest.uploadFileSize], \'Upload: \\"\' + this.httprequest.uploadFilePath + \'\\", Size: \' + this.httprequest.uploadFileSize, this.httprequest);\r\n fs.closeSync(this.httprequest.uploadFile);\r\n this.write(Buffer.from(JSON.stringify({ action: \'uploaddone\', reqid: this.httprequest.uploadFileid }))); // Indicate that we closed the file.\r\n delete this.httprequest.uploadFile;\r\n delete this.httprequest.uploadFileid;\r\n delete this.httprequest.uploadFilePath;\r\n delete this.httprequest.uploadFileSize;\r\n }\r\n break;\r\n }\r\n case \'uploadcancel\':\r\n {\r\n // Indicates that an upload is canceled\r\n if (this.httprequest.uploadFile) {\r\n fs.closeSync(this.httprequest.uploadFile);\r\n fs.unlinkSync(this.httprequest.uploadFilePath);\r\n this.write(Buffer.from(JSON.stringify({ action: \'uploadcancel\', reqid: this.httprequest.uploadFileid }))); // Indicate that we closed the file.\r\n delete this.httprequest.uploadFile;\r\n delete this.httprequest.uploadFileid;\r\n delete this.httprequest.uploadFilePath;\r\n delete this.httprequest.uploadFileSize;\r\n }\r\n break;\r\n }\r\n case \'copy\':\r\n {\r\n // Copy a bunch of files from scpath to dspath\r\n for (var i in cmd.names) {\r\n var sc = obj.path.join(cmd.scpath, cmd.names[i]), ds = obj.path.join(cmd.dspath, cmd.names[i]);\r\n MeshServerLogEx(51, [sc, ds], \'Copy: \\"\' + sc + \'\\" to \\"\' + ds + \'\\"\', this.httprequest);\r\n if (sc != ds) { try { fs.copyFileSync(sc, ds); } catch (e) { } }\r\n }\r\n break;\r\n }\r\n case \'move\':\r\n {\r\n // Move a bunch of files from scpath to dspath\r\n for (var i in cmd.names) {\r\n var sc = obj.path.join(cmd.scpath, cmd.names[i]), ds = obj.path.join(cmd.dspath, cmd.names[i]);\r\n MeshServerLogEx(52, [sc, ds], \'Move: \\"\' + sc + \'\\" to \\"\' + ds + \'\\"\', this.httprequest);\r\n if (sc != ds) { try { fs.copyFileSync(sc, ds); fs.unlinkSync(sc); } catch (e) { } }\r\n }\r\n break;\r\n }\r\n case \'zip\':\r\n // Zip a bunch of files\r\n if (this.zip != null) return; // Zip operating is currently running, exit now.\r\n\r\n // Check that the specified files exist & build full paths\r\n var fp, stat, p = [];\r\n for (var i in cmd.files) { fp = cmd.path + \'/\' + cmd.files[i]; stat = null; try { stat = fs.statSync(fp); } catch (e) { } if (stat != null) { p.push(fp); } }\r\n if (p.length == 0) return; // No files, quit now.\r\n\r\n // Setup file compression\r\n var ofile = cmd.path + \'/\' + cmd.output;\r\n this.write(Buffer.from(JSON.stringify({ action: \'dialogmessage\', msg: \'zipping\' })));\r\n this.zipfile = ofile;\r\n delete this.zipcancel;\r\n var out = require(\'fs\').createWriteStream(ofile, { flags: \'wb\' });\r\n out.xws = this;\r\n out.on(\'close\', function () {\r\n this.xws.write(Buffer.from(JSON.stringify({ action: \'dialogmessage\', msg: null })));\r\n this.xws.write(Buffer.from(JSON.stringify({ action: \'refresh\' })));\r\n if (this.xws.zipcancel === true) { fs.unlinkSync(this.xws.zipfile); } // Delete the complete file.\r\n delete this.xws.zipcancel;\r\n delete this.xws.zipfile;\r\n delete this.xws.zip;\r\n });\r\n this.zip = require(\'zip-writer\').write({ files: p, basePath: cmd.path });\r\n this.zip.xws = this;\r\n this.zip.on(\'progress\', require(\'events\').moderated(function (name, p) { this.xws.write(Buffer.from(JSON.stringify({ action: \'dialogmessage\', msg: \'zippingFile\', file: ((process.platform == \'win32\') ? (name.split(\'/\').join(\'\\\\\')) : name), progress: p }))); }, 1000));\r\n this.zip.pipe(out);\r\n break;\r\n case \'cancel\':\r\n // Cancel zip operation if present\r\n try { this.zipcancel = true; this.zip.cancel(function () { }); } catch (e) { }\r\n this.zip = null;\r\n break;\r\n default:\r\n // Unknown action, ignore it.\r\n break;\r\n }\r\n } else if (this.httprequest.protocol == 7) { // Plugin data exchange\r\n var cmd = null;\r\n try { cmd = JSON.parse(data); } catch (e) { };\r\n if (cmd == null) { return; }\r\n if ((cmd.ctrlChannel == \'102938\') || ((cmd.type == \'offer\') && (cmd.sdp != null))) { onTunnelControlData(cmd, this); return; } // If this is control data, handle it now.\r\n if (cmd.action == undefined) return;\r\n\r\n switch (cmd.action) {\r\n case \'plugin\': {\r\n try { require(cmd.plugin).consoleaction(cmd, null, null, this); } catch (e) { throw e; }\r\n break;\r\n }\r\n default: {\r\n // probably shouldn\'t happen, but just in case this feature is expanded\r\n }\r\n }\r\n\r\n }\r\n //sendConsoleText("Got tunnel #" + this.httprequest.index + " data: " + data, this.httprequest.sessionid);\r\n }\r\n}\r\n\r\n// Delete a directory with a files and directories within it\r\nfunction deleteFolderRecursive(path, rec) {\r\n var count = 0;\r\n if (fs.existsSync(path)) {\r\n if (rec == true) {\r\n fs.readdirSync(obj.path.join(path, \'*\')).forEach(function (file, index) {\r\n var curPath = obj.path.join(path, file);\r\n if (fs.statSync(curPath).isDirectory()) { // recurse\r\n count += deleteFolderRecursive(curPath, true);\r\n } else { // delete file\r\n fs.unlinkSync(curPath);\r\n count++;\r\n }\r\n });\r\n }\r\n fs.unlinkSync(path);\r\n count++;\r\n }\r\n return count;\r\n}\r\n\r\n// Called when receiving control data on WebRTC\r\nfunction onTunnelWebRTCControlData(data) {\r\n if (typeof data != \'string\') return;\r\n var obj;\r\n try { obj = JSON.parse(data); } catch (e) { sendConsoleText(\'Invalid control JSON on WebRTC: \' + data); return; }\r\n if (obj.type == \'close\') {\r\n //sendConsoleText(\'Tunnel #\' + this.xrtc.websocket.tunnel.index + \' WebRTC control close\');\r\n try { this.close(); } catch (e) { }\r\n try { this.xrtc.close(); } catch (e) { }\r\n }\r\n}\r\n\r\n// Called when receiving control data on websocket\r\nfunction onTunnelControlData(data, ws) {\r\n var obj;\r\n if (ws == null) { ws = this; }\r\n if (typeof data == \'string\') { try { obj = JSON.parse(data); } catch (e) { sendConsoleText(\'Invalid control JSON: \' + data); return; } }\r\n else if (typeof data == \'object\') { obj = data; } else { return; }\r\n //sendConsoleText(\'onTunnelControlData(\' + ws.httprequest.protocol + \'): \' + JSON.stringify(data));\r\n //console.log(\'onTunnelControlData: \' + JSON.stringify(data));\r\n\r\n switch (obj.type) {\r\n case \'lock\': {\r\n // Look for a TSID\r\n var tsid = null;\r\n if ((ws.httprequest.xoptions != null) && (typeof ws.httprequest.xoptions.tsid == \'number\')) { tsid = ws.httprequest.xoptions.tsid; }\r\n\r\n // Lock the current user out of the desktop\r\n try {\r\n if (process.platform == \'win32\') {\r\n MeshServerLogEx(53, null, "Locking remote user out of desktop", ws.httprequest);\r\n var child = require(\'child_process\');\r\n child.execFile(process.env[\'windir\'] + \'\\\\system32\\\\cmd.exe\', [\'/c\', \'RunDll32.exe user32.dll,LockWorkStation\'], { type: 1, uid: tsid });\r\n }\r\n } catch (e) { }\r\n break;\r\n }\r\n case \'options\': {\r\n // These are additional connection options passed in the control channel.\r\n //sendConsoleText(\'options: \' + JSON.stringify(obj));\r\n delete obj.type;\r\n ws.httprequest.xoptions = obj;\r\n\r\n // Set additional user consent options if present\r\n if ((obj != null) && (typeof obj.consent == \'number\')) { ws.httprequest.consent |= obj.consent; }\r\n\r\n break;\r\n }\r\n case \'close\': {\r\n // We received the close on the websocket\r\n //sendConsoleText(\'Tunnel #\' + ws.tunnel.index + \' WebSocket control close\');\r\n try { ws.close(); } catch (e) { }\r\n break;\r\n }\r\n case \'termsize\': {\r\n // Indicates a change in terminal size\r\n if (process.platform == \'win32\') {\r\n if (ws.httprequest._dispatcher == null) return;\r\n //sendConsoleText(\'Win32-TermSize: \' + obj.cols + \'x\' + obj.rows);\r\n if (ws.httprequest._dispatcher.invoke) { ws.httprequest._dispatcher.invoke(\'resizeTerminal\', [obj.cols, obj.rows]); }\r\n } else {\r\n if (ws.httprequest.process == null || ws.httprequest.process.pty == 0) return;\r\n //sendConsoleText(\'Linux Resize: \' + obj.cols + \'x\' + obj.rows);\r\n\r\n if (ws.httprequest.process.tcsetsize) { ws.httprequest.process.tcsetsize(obj.rows, obj.cols); }\r\n }\r\n break;\r\n }\r\n case \'webrtc0\': { // Browser indicates we can start WebRTC switch-over.\r\n if (ws.httprequest.protocol == 1) { // Terminal\r\n // This is a terminal data stream, unpipe the terminal now and indicate to the other side that terminal data will no longer be received over WebSocket\r\n if (process.platform == \'win32\') {\r\n ws.httprequest._term.unpipe(ws);\r\n } else {\r\n ws.httprequest.process.stdout.unpipe(ws);\r\n ws.httprequest.process.stderr.unpipe(ws);\r\n }\r\n } else if (ws.httprequest.protocol == 2) { // Desktop\r\n // This is a KVM data stream, unpipe the KVM now and indicate to the other side that KVM data will no longer be received over WebSocket\r\n ws.httprequest.desktop.kvm.unpipe(ws);\r\n } else {\r\n // Switch things around so all WebRTC data goes to onTunnelData().\r\n ws.rtcchannel.httprequest = ws.httprequest;\r\n ws.rtcchannel.removeAllListeners(\'data\');\r\n ws.rtcchannel.on(\'data\', onTunnelData);\r\n }\r\n ws.write("{\\"ctrlChannel\\":\\"102938\\",\\"type\\":\\"webrtc1\\"}"); // End of data marker\r\n break;\r\n }\r\n case \'webrtc1\': {\r\n if ((ws.httprequest.protocol == 1) || (ws.httprequest.protocol == 6)) { // Terminal\r\n // Switch the user input from websocket to webrtc at this point.\r\n if (process.platform == \'win32\') {\r\n ws.unpipe(ws.httprequest._term);\r\n ws.rtcchannel.pipe(ws.httprequest._term, { dataTypeSkip: 1 }); // 0 = Binary, 1 = Text.\r\n } else {\r\n ws.unpipe(ws.httprequest.process.stdin);\r\n ws.rtcchannel.pipe(ws.httprequest.process.stdin, { dataTypeSkip: 1 }); // 0 = Binary, 1 = Text.\r\n }\r\n ws.resume(); // Resume the websocket to keep receiving control data\r\n } else if (ws.httprequest.protocol == 2) { // Desktop\r\n // Switch the user input from websocket to webrtc at this point.\r\n ws.unpipe(ws.httprequest.desktop.kvm);\r\n try { ws.webrtc.rtcchannel.pipe(ws.httprequest.desktop.kvm, { dataTypeSkip: 1, end: false }); } catch (e) { sendConsoleText(\'EX2\'); } // 0 = Binary, 1 = Text.\r\n ws.resume(); // Resume the websocket to keep receiving control data\r\n }\r\n ws.write(\'{\\"ctrlChannel\\":\\"102938\\",\\"type\\":\\"webrtc2\\"}\'); // Indicates we will no longer get any data on websocket, switching to WebRTC at this point.\r\n break;\r\n }\r\n case \'webrtc2\': {\r\n // Other side received websocket end of data marker, start sending data on WebRTC channel\r\n if ((ws.httprequest.protocol == 1) || (ws.httprequest.protocol == 6)) { // Terminal\r\n if (process.platform == \'win32\') {\r\n ws.httprequest._term.pipe(ws.webrtc.rtcchannel, { dataTypeSkip: 1, end: false }); // 0 = Binary, 1 = Text.\r\n } else {\r\n ws.httprequest.process.stdout.pipe(ws.webrtc.rtcchannel, { dataTypeSkip: 1, end: false }); // 0 = Binary, 1 = Text.\r\n ws.httprequest.process.stderr.pipe(ws.webrtc.rtcchannel, { dataTypeSkip: 1, end: false }); // 0 = Binary, 1 = Text.\r\n }\r\n } else if (ws.httprequest.protocol == 2) { // Desktop\r\n ws.httprequest.desktop.kvm.pipe(ws.webrtc.rtcchannel, { dataTypeSkip: 1 }); // 0 = Binary, 1 = Text.\r\n }\r\n break;\r\n }\r\n case \'offer\': {\r\n // This is a WebRTC offer.\r\n if ((ws.httprequest.protocol == 1) || (ws.httprequest.protocol == 6)) return; // TODO: Terminal is currently broken with WebRTC. Reject WebRTC upgrade for now.\r\n ws.webrtc = rtc.createConnection();\r\n ws.webrtc.websocket = ws;\r\n ws.webrtc.on(\'connected\', function () { /*sendConsoleText(\'Tunnel #\' + this.websocket.tunnel.index + \' WebRTC connected\');*/ });\r\n ws.webrtc.on(\'disconnected\', function () { /*sendConsoleText(\'Tunnel #\' + this.websocket.tunnel.index + \' WebRTC disconnected\');*/ });\r\n ws.webrtc.on(\'dataChannel\', function (rtcchannel) {\r\n //sendConsoleText(\'WebRTC Datachannel open, protocol: \' + this.websocket.httprequest.protocol);\r\n rtcchannel.maxFragmentSize = 32768;\r\n rtcchannel.xrtc = this;\r\n rtcchannel.websocket = this.websocket;\r\n this.rtcchannel = rtcchannel;\r\n this.websocket.rtcchannel = rtcchannel;\r\n this.websocket.rtcchannel.on(\'data\', onTunnelWebRTCControlData);\r\n this.websocket.rtcchannel.on(\'end\', function () {\r\n // The WebRTC channel closed, unpipe the KVM now. This is also done when the web socket closes.\r\n //sendConsoleText(\'Tunnel #\' + this.websocket.tunnel.index + \' WebRTC data channel closed\');\r\n if (this.websocket.desktop && this.websocket.desktop.kvm) {\r\n try {\r\n this.unpipe(this.websocket.desktop.kvm);\r\n this.websocket.httprequest.desktop.kvm.unpipe(this);\r\n }\r\n catch (e) { }\r\n }\r\n });\r\n this.websocket.write(\'{\\"ctrlChannel\\":\\"102938\\",\\"type\\":\\"webrtc0\\"}\'); // Indicate we are ready for WebRTC switch-over.\r\n });\r\n var sdp = null;\r\n try { sdp = ws.webrtc.setOffer(obj.sdp); } catch (e) { }\r\n if (sdp != null) { ws.write({ type: \'answer\', ctrlChannel: \'102938\', sdp: sdp }); }\r\n break;\r\n }\r\n case \'ping\': {\r\n ws.write("{\\"ctrlChannel\\":\\"102938\\",\\"type\\":\\"pong\\"}"); // Send pong response\r\n break;\r\n }\r\n case \'pong\': { // NOP\r\n break;\r\n }\r\n case \'rtt\': {\r\n ws.write({ type: \'rtt\', ctrlChannel: \'102938\', time: obj.time });\r\n break;\r\n }\r\n }\r\n}\r\n\r\n// Console state\r\nvar consoleWebSockets = {};\r\nvar consoleHttpRequest = null;\r\n\r\n// Console HTTP response\r\nfunction consoleHttpResponse(response) {\r\n response.data = function (data) { sendConsoleText(rstr2hex(buf2rstr(data)), this.sessionid); consoleHttpRequest = null; }\r\n response.close = function () { sendConsoleText(\'httprequest.response.close\', this.sessionid); consoleHttpRequest = null; }\r\n}\r\n\r\n// Open a web browser to a specified URL on current user\'s desktop\r\nfunction openUserDesktopUrl(url) {\r\n if ((url.toLowerCase().startsWith(\'http://\') == false) && (url.toLowerCase().startsWith(\'https://\') == false)) { return null; }\r\n var child = null;\r\n try {\r\n switch (process.platform) {\r\n case \'win32\':\r\n var uid = require(\'user-sessions\').consoleUid();\r\n var user = require(\'user-sessions\').getUsername(uid);\r\n var domain = require(\'user-sessions\').getDomain(uid);\r\n var taskoptions = { env: { _target: process.env[\'windir\'] + \'\\\\system32\\\\cmd.exe\', _args: \'/C START \' + url.split(\'&\').join(\'^&\'), _user: \'"\' + domain + \'\\\\\' + user + \'"\' } };\r\n for (var c1e in process.env) {\r\n taskoptions.env[c1e] = process.env[c1e];\r\n }\r\n var child = require(\'child_process\').execFile(process.env[\'windir\'] + \'\\\\System32\\\\WindowsPowerShell\\\\v1.0\\\\powershell.exe\', [\'powershell\', \'-noprofile\', \'-nologo\', \'-command\', \'-\'], taskoptions);\r\n child.stderr.on(\'data\', function (c) { });\r\n child.stdout.on(\'data\', function (c) { });\r\n child.stdin.write(\'SCHTASKS /CREATE /F /TN MeshChatTask /SC ONCE /ST 00:00 \');\r\n if (user) { child.stdin.write(\'/RU $env:_user \'); }\r\n child.stdin.write(\'/TR "$env:_target $env:_args"\\r\\n\');\r\n child.stdin.write(\'$ts = New-Object -ComObject Schedule.service\\r\\n\');\r\n child.stdin.write(\'$ts.connect()\\r\\n\');\r\n child.stdin.write(\'$tsfolder = $ts.getfolder("\\\\")\\r\\n\');\r\n child.stdin.write(\'$task = $tsfolder.GetTask("MeshChatTask")\\r\\n\');\r\n child.stdin.write(\'$taskdef = $task.Definition\\r\\n\');\r\n child.stdin.write(\'$taskdef.Settings.StopIfGoingOnBatteries = $false\\r\\n\');\r\n child.stdin.write(\'$taskdef.Settings.DisallowStartIfOnBatteries = $false\\r\\n\');\r\n child.stdin.write(\'$taskdef.Actions.Item(1).Path = $env:_target\\r\\n\');\r\n child.stdin.write(\'$taskdef.Actions.Item(1).Arguments = $env:_args\\r\\n\');\r\n child.stdin.write(\'$tsfolder.RegisterTaskDefinition($task.Name, $taskdef, 4, $null, $null, $null)\\r\\n\');\r\n\r\n child.stdin.write(\'SCHTASKS /RUN /TN MeshChatTask\\r\\n\');\r\n child.stdin.write(\'SCHTASKS /DELETE /F /TN MeshChatTask\\r\\nexit\\r\\n\');\r\n child.waitExit();\r\n break;\r\n case \'linux\':\r\n child = require(\'child_process\').execFile(\'/usr/bin/xdg-open\', [\'xdg-open\', url], { uid: require(\'user-sessions\').consoleUid() });\r\n break;\r\n case \'darwin\':\r\n child = require(\'child_process\').execFile(\'/usr/bin/open\', [\'open\', url], { uid: require(\'user-sessions\').consoleUid() });\r\n break;\r\n default:\r\n // Unknown platform, ignore this command.\r\n break;\r\n }\r\n } catch (e) { }\r\n return child;\r\n}\r\n\r\n// Process a mesh agent console command\r\nfunction processConsoleCommand(cmd, args, rights, sessionid) {\r\n try {\r\n var response = null;\r\n switch (cmd) {\r\n case \'help\': { // Displays available commands\r\n var fin = \'\', f = \'\', availcommands = \'agentupdate,errorlog,msh,timerinfo,coreinfo,coredump,service,fdsnapshot,fdcount,startupoptions,alert,agentsize,versions,help,info,osinfo,args,print,type,dbkeys,dbget,dbset,dbcompact,eval,parseuri,httpget,wslist,plugin,wsconnect,wssend,wsclose,notify,ls,ps,kill,netinfo,location,power,wakeonlan,setdebug,smbios,rawsmbios,toast,lock,users,openurl,getscript,getclip,setclip,log,av,cpuinfo,sysinfo,apf,scanwifi,wallpaper,agentmsg\';\r\n if (require(\'os\').dns != null) { availcommands += \',dnsinfo\'; }\r\n if (process.platform == \'win32\') { availcommands += \',cs,safemode,wpfhwacceleration,uac\'; }\r\n if (amt != null) { availcommands += \',amt,amtconfig,amtevents\'; }\r\n if (process.platform != \'freebsd\') { availcommands += \',vm\'; }\r\n if (require(\'MeshAgent\').maxKvmTileSize != null) { availcommands += \',kvmmode\'; }\r\n try { require(\'zip-reader\'); availcommands += \',zip,unzip\'; } catch (e) { }\r\n\r\n availcommands = availcommands.split(\',\').sort();\r\n while (availcommands.length > 0) {\r\n if (f.length > 90) { fin += (f + \',\\r\\n\'); f = \'\'; }\r\n f += (((f != \'\') ? \', \' : \' \') + availcommands.shift());\r\n }\r\n if (f != \'\') { fin += f; }\r\n response = "Available commands: \\r\\n" + fin + ".";\r\n break;\r\n }\r\n case \'cs\':\r\n if (process.platform != \'win32\') {\r\n response = \'Unknown command "cs", type "help" for list of avaialble commands.\';\r\n break;\r\n }\r\n switch (args[\'_\'].length) {\r\n case 0:\r\n try {\r\n var cs = require(\'win-registry\').QueryKey(require(\'win-registry\').HKEY.LocalMachine, \'System\\\\CurrentControlSet\\\\Control\\\\Power\', \'CsEnabled\');\r\n response = "Connected Standby: " + (cs == 1 ? "ENABLED" : "DISABLED");\r\n }\r\n catch (e) {\r\n response = "This machine does not support Connected Standby";\r\n }\r\n break;\r\n case 1:\r\n if ((args[\'_\'][0].toUpperCase() != \'ENABLE\' && args[\'_\'][0].toUpperCase() != \'DISABLE\')) {\r\n response = "Proper usage:\\r\\n cs [ENABLE|DISABLE]";\r\n }\r\n else {\r\n try {\r\n var cs = require(\'win-registry\').QueryKey(require(\'win-registry\').HKEY.LocalMachine, \'System\\\\CurrentControlSet\\\\Control\\\\Power\', \'CsEnabled\');\r\n require(\'win-registry\').WriteKey(require(\'win-registry\').HKEY.LocalMachine, \'System\\\\CurrentControlSet\\\\Control\\\\Power\', \'CsEnabled\', args[\'_\'][0].toUpperCase() == \'ENABLE\' ? 1 : 0);\r\n\r\n cs = require(\'win-registry\').QueryKey(require(\'win-registry\').HKEY.LocalMachine, \'System\\\\CurrentControlSet\\\\Control\\\\Power\', \'CsEnabled\');\r\n response = "Connected Standby: " + (cs == 1 ? "ENABLED" : "DISABLED");\r\n }\r\n catch (e) {\r\n response = "This machine does not support Connected Standby";\r\n }\r\n }\r\n break;\r\n default:\r\n response = "Proper usage:\\r\\n cs [ENABLE|DISABLE]";\r\n break;\r\n }\r\n break;\r\n case \'assistant\':\r\n if (process.platform == \'win32\') {\r\n // Install MeshCentral Assistant on this device\r\n response = "Usage: Assistant [info|install|uninstall]";\r\n if (args[\'_\'].length == 1) {\r\n if ((args[\'_\'][0] == \'install\') || (args[\'_\'][0] == \'info\')) { response = \'\'; require(\'MeshAgent\').SendCommand({ action: \'meshToolInfo\', sessionid: sessionid, name: \'MeshCentralAssistant\', cookie: true, tag: args[\'_\'][0] }); }\r\n // TODO: Uninstall\r\n }\r\n } else {\r\n response = "MeshCentral Assistant is not supported on this platform.";\r\n }\r\n break;\r\n case \'agentupdate\':\r\n require(\'MeshAgent\').SendCommand({ action: \'agentupdate\', sessionid: sessionid });\r\n break;\r\n case \'agentupdateex\':\r\n // Perform an direct agent update without requesting any information from the server, this should not typically be used.\r\n if (args[\'_\'].length == 1) {\r\n if (args[\'_\'][0].startsWith(\'https://\')) { agentUpdate_Start(args[\'_\'][0], { sessionid: sessionid }); } else { response = "Usage: agentupdateex https://server/path"; }\r\n } else {\r\n agentUpdate_Start(null, { sessionid: sessionid });\r\n }\r\n break;\r\n case \'errorlog\':\r\n switch (args[\'_\'].length) {\r\n case 0:\r\n // All Error Logs\r\n response = JSON.stringify(require(\'util-agentlog\').read(), null, 1);\r\n break;\r\n case 1:\r\n // Error Logs, by either count or timestamp\r\n response = JSON.stringify(require(\'util-agentlog\').read(parseInt(args[\'_\'][0])), null, 1);\r\n break;\r\n default:\r\n response = "Proper usage:\\r\\n errorlog [lastCount|linuxEpoch]";\r\n break;\r\n }\r\n break;\r\n case \'msh\':\r\n response = JSON.stringify(_MSH(), null, 2);\r\n break;\r\n case \'dnsinfo\':\r\n if (require(\'os\').dns == null) {\r\n response = "Unknown command \\"" + cmd + "\\", type \\"help\\" for list of avaialble commands.";\r\n }\r\n else {\r\n response = \'DNS Servers: \';\r\n var dns = require(\'os\').dns();\r\n for (var i = 0; i < dns.length; ++i) {\r\n if (i > 0) { response += \', \'; }\r\n response += dns[i];\r\n }\r\n }\r\n break;\r\n case \'timerinfo\':\r\n response = require(\'ChainViewer\').getTimerInfo();\r\n break;\r\n case \'find\':\r\n if (args[\'_\'].length <= 1) {\r\n response = "Proper usage:\\r\\n find root criteria [criteria2] [criteria n...]";\r\n }\r\n else {\r\n var root = args[\'_\'][0];\r\n var p = args[\'_\'].slice(1);\r\n var r = require(\'file-search\').find(root, p);\r\n r.sid = sessionid;\r\n r.on(\'result\', function (str) { sendConsoleText(str, this.sid); });\r\n r.then(function () { sendConsoleText(\'*** End Results ***\', this.sid); });\r\n response = "Find: [" + root + "] " + JSON.stringify(p);\r\n }\r\n break;\r\n case \'coreinfo\': {\r\n response = JSON.stringify(meshCoreObj, null, 2);\r\n break;\r\n }\r\n case \'coreinfoupdate\': {\r\n sendPeriodicServerUpdate();\r\n break;\r\n }\r\n case \'agentmsg\': {\r\n if (args[\'_\'].length == 0) {\r\n response = "Proper usage:\\r\\n agentmsg add \\"[message]\\" [iconIndex]\\r\\n agentmsg remove [index]\\r\\n agentmsg list"; // Display usage\r\n } else {\r\n if ((args[\'_\'][0] == \'add\') && (args[\'_\'].length > 1)) {\r\n var msgIndex = 1, iconIndex = 0;\r\n while (tunnelUserCount.msg[msgIndex] != null) { msgIndex++; }\r\n if (args[\'_\'].length >= 3) { try { iconIndex = parseInt(args[\'_\'][2]); } catch (e) { } }\r\n if (typeof iconIndex != \'number\') { iconIndex = 0; }\r\n tunnelUserCount.msg[msgIndex] = { msg: args[\'_\'][1], icon: iconIndex };\r\n response = \'Agent message \' + msgIndex + \' added.\';\r\n } else if ((args[\'_\'][0] == \'remove\') && (args[\'_\'].length > 1)) {\r\n var msgIndex = 0;\r\n try { msgIndex = parseInt(args[\'_\'][1]); } catch (x) { }\r\n if (tunnelUserCount.msg[msgIndex] == null) { response = "Message not found."; } else { delete tunnelUserCount.msg[msgIndex]; response = "Message removed."; }\r\n } else if (args[\'_\'][0] == \'list\') {\r\n response = JSON.stringify(tunnelUserCount.msg, null, 2);\r\n }\r\n try { mesh.SendCommand({ action: \'sessions\', type: \'msg\', value: tunnelUserCount.msg }); } catch (x) { }\r\n broadcastSessionsToRegisteredApps();\r\n }\r\n break;\r\n }\r\n case \'clearagentmsg\': {\r\n tunnelUserCount.msg = {};\r\n try { mesh.SendCommand({ action: \'sessions\', type: \'msg\', value: tunnelUserCount.msg }); } catch (x) { }\r\n broadcastSessionsToRegisteredApps();\r\n break;\r\n }\r\n case \'coredump\':\r\n if (args[\'_\'].length != 1) {\r\n response = "Proper usage: coredump on|off|status|clear"; // Display usage\r\n } else {\r\n switch (args[\'_\'][0].toLowerCase()) {\r\n case \'on\':\r\n process.coreDumpLocation = (process.platform == \'win32\') ? (process.execPath.replace(\'.exe\', \'.dmp\')) : (process.execPath + \'.dmp\');\r\n response = \'coredump is now on\';\r\n break;\r\n case \'off\':\r\n process.coreDumpLocation = null;\r\n response = \'coredump is now off\';\r\n break;\r\n case \'status\':\r\n response = \'coredump is: \' + ((process.coreDumpLocation == null) ? \'off\' : \'on\');\r\n if (process.coreDumpLocation != null) {\r\n if (process.platform == \'win32\') {\r\n if (fs.existsSync(process.coreDumpLocation)) {\r\n response += \'\\r\\n CoreDump present at: \' + process.coreDumpLocation;\r\n response += \'\\r\\n CoreDump Time: \' + new Date(fs.statSync(process.coreDumpLocation).mtime).getTime();\r\n response += \'\\r\\n Agent Time : \' + new Date(fs.statSync(process.execPath).mtime).getTime();\r\n }\r\n } else {\r\n if ((process.cwd() != \'//\') && fs.existsSync(process.cwd() + \'core\')) {\r\n response += \'\\r\\n CoreDump present at: \' + process.cwd() + \'core\';\r\n response += \'\\r\\n CoreDump Time: \' + new Date(fs.statSync(process.cwd() + \'core\').mtime).getTime();\r\n response += \'\\r\\n Agent Time : \' + new Date(fs.statSync(process.execPath).mtime).getTime();\r\n }\r\n }\r\n }\r\n break;\r\n case \'clear\':\r\n db.Put(\'CoreDumpTime\', null);\r\n response = \'coredump db cleared\';\r\n break;\r\n default:\r\n response = "Proper usage: coredump on|off|status"; // Display usage\r\n break;\r\n }\r\n }\r\n break;\r\n case \'service\':\r\n if (args[\'_\'].length != 1) {\r\n response = "Proper usage: service status|restart"; // Display usage\r\n }\r\n else {\r\n var svcname = process.platform == \'win32\' ? \'Mesh Agent\' : \'meshagent\';\r\n try {\r\n svcname = require(\'MeshAgent\').serviceName;\r\n }\r\n catch (x) {\r\n }\r\n var s = require(\'service-manager\').manager.getService(svcname);\r\n switch (args[\'_\'][0].toLowerCase()) {\r\n case \'status\':\r\n response = \'Service \' + (s.isRunning() ? (s.isMe() ? \'[SELF]\' : \'[RUNNING]\') : (\'[NOT RUNNING]\'));\r\n break;\r\n case \'restart\':\r\n if (s.isMe()) {\r\n s.restart();\r\n }\r\n else {\r\n response = \'Restarting another agent instance is not allowed\';\r\n }\r\n break;\r\n default:\r\n response = "Proper usage: service status|restart"; // Display usage\r\n break;\r\n }\r\n if (process.platform == \'win32\') { s.close(); }\r\n }\r\n break;\r\n case \'zip\':\r\n if (args[\'_\'].length == 0) {\r\n response = "Proper usage: zip (output file name), input1 [, input n]"; // Display usage\r\n } else {\r\n var p = args[\'_\'].join(\' \').split(\',\');\r\n var ofile = p.shift();\r\n sendConsoleText(\'Writing \' + ofile + \'...\');\r\n var out = require(\'fs\').createWriteStream(ofile, { flags: \'wb\' });\r\n out.fname = ofile;\r\n out.sessionid = sessionid;\r\n out.on(\'close\', function () { sendConsoleText(\'DONE writing \' + this.fname, this.sessionid); });\r\n var zip = require(\'zip-writer\').write({ files: p });\r\n zip.pipe(out);\r\n }\r\n break;\r\n case \'unzip\':\r\n if (args[\'_\'].length == 0) {\r\n response = "Proper usage: unzip input, destination"; // Display usage\r\n } else {\r\n var p = args[\'_\'].join(\' \').split(\',\');\r\n if (p.length != 2) { response = "Proper usage: unzip input, destination"; break; } // Display usage\r\n var prom = require(\'zip-reader\').read(p[0]);\r\n prom._dest = p[1];\r\n prom.self = this;\r\n prom.sessionid = sessionid;\r\n prom.then(function (zipped) {\r\n sendConsoleText(\'Extracting to \' + this._dest + \'...\', this.sessionid);\r\n zipped.extractAll(this._dest).then(function () { sendConsoleText(\'finished unzipping\', this.sessionid); }, function (e) { sendConsoleText(\'Error unzipping: \' + e, this.sessionid); }).parentPromise.sessionid = this.sessionid;\r\n }, function (e) { sendConsoleText(\'Error unzipping: \' + e, this.sessionid); });\r\n }\r\n break;\r\n case \'setbattery\':\r\n // require(\'MeshAgent\').SendCommand({ action: \'battery\', state: \'dc\', level: 55 });\r\n if ((args[\'_\'].length > 0) && ((args[\'_\'][0] == \'ac\') || (args[\'_\'][0] == \'dc\'))) {\r\n var b = { action: \'battery\', state: args[\'_\'][0] };\r\n if (args[\'_\'].length == 2) { b.level = parseInt(args[\'_\'][1]); }\r\n require(\'MeshAgent\').SendCommand(b);\r\n } else {\r\n require(\'MeshAgent\').SendCommand({ action: \'battery\' });\r\n }\r\n break;\r\n case \'fdsnapshot\':\r\n require(\'ChainViewer\').getSnapshot().then(function (c) { sendConsoleText(c, this.sessionid); }).parentPromise.sessionid = sessionid;\r\n break;\r\n case \'fdcount\':\r\n require(\'DescriptorEvents\').getDescriptorCount().then(\r\n function (c) {\r\n sendConsoleText(\'Descriptor Count: \' + c, this.sessionid);\r\n }, function (e) {\r\n sendConsoleText(\'Error fetching descriptor count: \' + e, this.sessionid);\r\n }).parentPromise.sessionid = sessionid;\r\n break;\r\n case \'uac\':\r\n if (process.platform != \'win32\') {\r\n response = \'Unknown command "uac", type "help" for list of avaialble commands.\';\r\n break;\r\n }\r\n if (args[\'_\'].length != 1) {\r\n response = \'Proper usage: uac [get|interactive|secure]\';\r\n }\r\n else {\r\n switch (args[\'_\'][0].toUpperCase()) {\r\n case \'GET\':\r\n var secd = require(\'win-registry\').QueryKey(require(\'win-registry\').HKEY.LocalMachine, \'Software\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\Policies\\\\System\', \'PromptOnSecureDesktop\');\r\n response = "UAC mode: " + (secd == 0 ? "Interactive Desktop" : "Secure Desktop");\r\n break;\r\n case \'INTERACTIVE\':\r\n try {\r\n require(\'win-registry\').WriteKey(require(\'win-registry\').HKEY.LocalMachine, \'Software\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\Policies\\\\System\', \'PromptOnSecureDesktop\', 0);\r\n response = \'UAC mode changed to: Interactive Desktop\';\r\n }\r\n catch (e) {\r\n response = "Unable to change UAC Mode";\r\n }\r\n break;\r\n case \'SECURE\':\r\n try {\r\n require(\'win-registry\').WriteKey(require(\'win-registry\').HKEY.LocalMachine, \'Software\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\Policies\\\\System\', \'PromptOnSecureDesktop\', 1);\r\n response = \'UAC mode changed to: Secure Desktop\';\r\n }\r\n catch (e) {\r\n response = "Unable to change UAC Mode";\r\n }\r\n break;\r\n default:\r\n response = \'Proper usage: uac [get|interactive|secure]\';\r\n break;\r\n }\r\n }\r\n break;\r\n case \'vm\':\r\n response = \'Virtual Machine = \' + require(\'identifiers\').isVM();\r\n break;\r\n case \'startupoptions\':\r\n response = JSON.stringify(require(\'MeshAgent\').getStartupOptions());\r\n break;\r\n case \'kvmmode\':\r\n if (require(\'MeshAgent\').maxKvmTileSize == null) {\r\n response = "Unknown command \\"kvmmode\\", type \\"help\\" for list of avaialble commands.";\r\n }\r\n else {\r\n if (require(\'MeshAgent\').maxKvmTileSize == 0) {\r\n response = \'KVM Mode: Full JUMBO\';\r\n }\r\n else {\r\n response = \'KVM Mode: \' + (require(\'MeshAgent\').maxKvmTileSize <= 65500 ? \'NO JUMBO\' : \'Partial JUMBO\');\r\n response += (\', TileLimit: \' + (require(\'MeshAgent\').maxKvmTileSize < 1024 ? (require(\'MeshAgent\').maxKvmTileSize + \' bytes\') : (Math.round(require(\'MeshAgent\').maxKvmTileSize / 1024) + \' Kbytes\')));\r\n }\r\n }\r\n break;\r\n case \'alert\':\r\n if (args[\'_\'].length == 0) {\r\n response = "Proper usage: alert TITLE, CAPTION [, TIMEOUT]"; // Display usage\r\n }\r\n else {\r\n var p = args[\'_\'].join(\' \').split(\',\');\r\n if (p.length < 2) {\r\n response = "Proper usage: alert TITLE, CAPTION [, TIMEOUT]"; // Display usage\r\n }\r\n else {\r\n this._alert = require(\'message-box\').create(p[0], p[1], p.length == 3 ? parseInt(p[2]) : 9999, 1);\r\n }\r\n }\r\n break;\r\n case \'agentsize\':\r\n var actualSize = Math.floor(require(\'fs\').statSync(process.execPath).size / 1024);\r\n if (process.platform == \'win32\') {\r\n // Check the Agent Uninstall MetaData for correctness, as the installer may have written an incorrect value\r\n var writtenSize = 0;\r\n try { writtenSize = require(\'win-registry\').QueryKey(require(\'win-registry\').HKEY.LocalMachine, \'Software\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\Uninstall\\\\MeshCentralAgent\', \'EstimatedSize\'); } catch (e) { response = e; }\r\n if (writtenSize != actualSize) {\r\n response = "Size updated from: " + writtenSize + " to: " + actualSize;\r\n try { require(\'win-registry\').WriteKey(require(\'win-registry\').HKEY.LocalMachine, \'Software\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\Uninstall\\\\MeshCentralAgent\', \'EstimatedSize\', actualSize); } catch (e) { response = e; }\r\n } else\r\n { response = "Agent Size: " + actualSize + " kb"; }\r\n } else\r\n { response = "Agent Size: " + actualSize + " kb"; }\r\n break;\r\n case \'versions\':\r\n response = JSON.stringify(process.versions, null, \' \');\r\n break;\r\n case \'wpfhwacceleration\':\r\n if (process.platform != \'win32\') { throw ("wpfhwacceleration setting is only supported on Windows"); }\r\n if (args[\'_\'].length != 1) {\r\n response = "Proper usage: wpfhwacceleration (ON|OFF|STATUS)"; // Display usage\r\n }\r\n else {\r\n var reg = require(\'win-registry\');\r\n var uname = require(\'user-sessions\').getUsername(require(\'user-sessions\').consoleUid());\r\n var key = reg.usernameToUserKey(uname);\r\n\r\n switch (args[\'_\'][0].toUpperCase()) {\r\n default:\r\n response = "Proper usage: wpfhwacceleration (ON|OFF|STATUS|DEFAULT)"; // Display usage\r\n break;\r\n case \'ON\':\r\n try {\r\n reg.WriteKey(reg.HKEY.Users, key + \'\\\\SOFTWARE\\\\Microsoft\\\\Avalon.Graphics\', \'DisableHWAcceleration\', 0);\r\n response = "OK";\r\n } catch (e) { response = "FAILED"; }\r\n break;\r\n case \'OFF\':\r\n try {\r\n reg.WriteKey(reg.HKEY.Users, key + \'\\\\SOFTWARE\\\\Microsoft\\\\Avalon.Graphics\', \'DisableHWAcceleration\', 1);\r\n response = \'OK\';\r\n } catch (e) { response = \'FAILED\'; }\r\n break;\r\n case \'STATUS\':\r\n var s;\r\n try { s = reg.QueryKey(reg.HKEY.Users, key + \'\\\\SOFTWARE\\\\Microsoft\\\\Avalon.Graphics\', \'DisableHWAcceleration\') == 1 ? \'DISABLED\' : \'ENABLED\'; } catch (e) { s = \'DEFAULT\'; }\r\n response = "WPF Hardware Acceleration: " + s;\r\n break;\r\n case \'DEFAULT\':\r\n try { reg.DeleteKey(reg.HKEY.Users, key + \'\\\\SOFTWARE\\\\Microsoft\\\\Avalon.Graphics\', \'DisableHWAcceleration\'); } catch (e) { }\r\n response = \'OK\';\r\n break;\r\n }\r\n }\r\n break;\r\n case \'tsid\':\r\n if (process.platform == \'win32\') {\r\n if (args[\'_\'].length != 1) {\r\n response = "TSID: " + (require(\'MeshAgent\')._tsid == null ? "console" : require(\'MeshAgent\')._tsid);\r\n } else {\r\n var i = parseInt(args[\'_\'][0]);\r\n require(\'MeshAgent\')._tsid = (isNaN(i) ? null : i);\r\n response = "TSID set to: " + (require(\'MeshAgent\')._tsid == null ? "console" : require(\'MeshAgent\')._tsid);\r\n }\r\n } else\r\n { response = "TSID command only supported on Windows"; }\r\n break;\r\n case \'activeusers\':\r\n if (process.platform == \'win32\') {\r\n var p = require(\'user-sessions\').enumerateUsers();\r\n p.sessionid = sessionid;\r\n p.then(function (u) {\r\n var v = [];\r\n for (var i in u) {\r\n if (u[i].State == \'Active\') { v.push({ tsid: i, type: u[i].StationName, user: u[i].Username, domain: u[i].Domain }); }\r\n }\r\n sendConsoleText(JSON.stringify(v, null, 1), this.sessionid);\r\n });\r\n } else\r\n { response = "activeusers command only supported on Windows"; }\r\n break;\r\n case \'wallpaper\':\r\n if (process.platform != \'win32\' && !(process.platform == \'linux\' && require(\'linux-gnome-helpers\').available)) {\r\n response = "wallpaper command not supported on this platform";\r\n }\r\n else {\r\n if (args[\'_\'].length != 1) {\r\n response = \'Proper usage: wallpaper (GET|TOGGLE)\'; // Display usage\r\n }\r\n else {\r\n switch (args[\'_\'][0].toUpperCase()) {\r\n default:\r\n response = \'Proper usage: wallpaper (GET|TOGGLE)\'; // Display usage\r\n break;\r\n case \'GET\':\r\n case \'TOGGLE\':\r\n if (process.platform == \'win32\') {\r\n var id = require(\'user-sessions\').getProcessOwnerName(process.pid).tsid == 0 ? 1 : 0;\r\n var child = require(\'child_process\').execFile(process.execPath, [process.execPath.split(\'\\\\\').pop(), \'-b64exec\', \'dmFyIFNQSV9HRVRERVNLV0FMTFBBUEVSID0gMHgwMDczOwp2YXIgU1BJX1NFVERFU0tXQUxMUEFQRVIgPSAweDAwMTQ7CnZhciBHTSA9IHJlcXVpcmUoJ19HZW5lcmljTWFyc2hhbCcpOwp2YXIgdXNlcjMyID0gR00uQ3JlYXRlTmF0aXZlUHJveHkoJ3VzZXIzMi5kbGwnKTsKdXNlcjMyLkNyZWF0ZU1ldGhvZCgnU3lzdGVtUGFyYW1ldGVyc0luZm9BJyk7CgppZiAocHJvY2Vzcy5hcmd2Lmxlbmd0aCA9PSAzKQp7CiAgICB2YXIgdiA9IEdNLkNyZWF0ZVZhcmlhYmxlKDEwMjQpOwogICAgdXNlcjMyLlN5c3RlbVBhcmFtZXRlcnNJbmZvQShTUElfR0VUREVTS1dBTExQQVBFUiwgdi5fc2l6ZSwgdiwgMCk7CiAgICBjb25zb2xlLmxvZyh2LlN0cmluZyk7CiAgICBwcm9jZXNzLmV4aXQoKTsKfQplbHNlCnsKICAgIHZhciBuYiA9IEdNLkNyZWF0ZVZhcmlhYmxlKHByb2Nlc3MuYXJndlszXSk7CiAgICB1c2VyMzIuU3lzdGVtUGFyYW1ldGVyc0luZm9BKFNQSV9TRVRERVNLV0FMTFBBUEVSLCBuYi5fc2l6ZSwgbmIsIDApOwogICAgcHJvY2Vzcy5leGl0KCk7Cn0=\'], { type: id });\r\n child.stdout.str = \'\'; child.stdout.on(\'data\', function (c) { this.str += c.toString(); });\r\n child.stderr.on(\'data\', function () { });\r\n child.waitExit();\r\n var current = child.stdout.str.trim();\r\n if (args[\'_\'][0].toUpperCase() == \'GET\') {\r\n response = current;\r\n break;\r\n }\r\n if (current != \'\') {\r\n require(\'MeshAgent\')._wallpaper = current;\r\n response = \'Wallpaper cleared\';\r\n } else {\r\n response = \'Wallpaper restored\';\r\n }\r\n child = require(\'child_process\').execFile(process.execPath, [process.execPath.split(\'\\\\\').pop(), \'-b64exec\', \'dmFyIFNQSV9HRVRERVNLV0FMTFBBUEVSID0gMHgwMDczOwp2YXIgU1BJX1NFVERFU0tXQUxMUEFQRVIgPSAweDAwMTQ7CnZhciBHTSA9IHJlcXVpcmUoJ19HZW5lcmljTWFyc2hhbCcpOwp2YXIgdXNlcjMyID0gR00uQ3JlYXRlTmF0aXZlUHJveHkoJ3VzZXIzMi5kbGwnKTsKdXNlcjMyLkNyZWF0ZU1ldGhvZCgnU3lzdGVtUGFyYW1ldGVyc0luZm9BJyk7CgppZiAocHJvY2Vzcy5hcmd2Lmxlbmd0aCA9PSAzKQp7CiAgICB2YXIgdiA9IEdNLkNyZWF0ZVZhcmlhYmxlKDEwMjQpOwogICAgdXNlcjMyLlN5c3RlbVBhcmFtZXRlcnNJbmZvQShTUElfR0VUREVTS1dBTExQQVBFUiwgdi5fc2l6ZSwgdiwgMCk7CiAgICBjb25zb2xlLmxvZyh2LlN0cmluZyk7CiAgICBwcm9jZXNzLmV4aXQoKTsKfQplbHNlCnsKICAgIHZhciBuYiA9IEdNLkNyZWF0ZVZhcmlhYmxlKHByb2Nlc3MuYXJndlszXSk7CiAgICB1c2VyMzIuU3lzdGVtUGFyYW1ldGVyc0luZm9BKFNQSV9TRVRERVNLV0FMTFBBUEVSLCBuYi5fc2l6ZSwgbmIsIDApOwogICAgcHJvY2Vzcy5leGl0KCk7Cn0=\', current != \'\' ? \'""\' : require(\'MeshAgent\')._wallpaper], { type: id });\r\n child.stdout.str = \'\'; child.stdout.on(\'data\', function (c) { this.str += c.toString(); });\r\n child.stderr.on(\'data\', function () { });\r\n child.waitExit();\r\n }\r\n else {\r\n var id = require(\'user-sessions\').consoleUid();\r\n var current = require(\'linux-gnome-helpers\').getDesktopWallpaper(id);\r\n if (args[\'_\'][0].toUpperCase() == \'GET\') {\r\n response = current;\r\n break;\r\n }\r\n if (current != \'/dev/null\') {\r\n require(\'MeshAgent\')._wallpaper = current;\r\n response = \'Wallpaper cleared\';\r\n } else {\r\n response = \'Wallpaper restored\';\r\n }\r\n require(\'linux-gnome-helpers\').setDesktopWallpaper(id, current != \'/dev/null\' ? undefined : require(\'MeshAgent\')._wallpaper);\r\n }\r\n break;\r\n }\r\n }\r\n }\r\n break;\r\n case \'safemode\':\r\n if (process.platform != \'win32\') {\r\n response = \'safemode only supported on Windows Platforms\'\r\n }\r\n else {\r\n if (args[\'_\'].length != 1) {\r\n response = \'Proper usage: safemode (ON|OFF|STATUS)\'; // Display usage\r\n }\r\n else {\r\n var svcname = process.platform == \'win32\' ? \'Mesh Agent\' : \'meshagent\';\r\n try {\r\n svcname = require(\'MeshAgent\').serviceName;\r\n }\r\n catch (x) {\r\n }\r\n\r\n switch (args[\'_\'][0].toUpperCase()) {\r\n default:\r\n response = \'Proper usage: safemode (ON|OFF|STATUS)\'; // Display usage\r\n break;\r\n case \'ON\':\r\n require(\'win-bcd\').setKey(\'safeboot\', \'Network\');\r\n require(\'win-bcd\').enableSafeModeService(svcname);\r\n break;\r\n case \'OFF\':\r\n require(\'win-bcd\').deleteKey(\'safeboot\');\r\n break;\r\n case \'STATUS\':\r\n var nextboot = require(\'win-bcd\').getKey(\'safeboot\');\r\n if (nextboot) {\r\n switch (nextboot) {\r\n case \'Network\':\r\n case \'network\':\r\n nextboot = \'SAFE_MODE_NETWORK\';\r\n break;\r\n default:\r\n nextboot = \'SAFE_MODE\';\r\n break;\r\n }\r\n }\r\n response = \'Current: \' + require(\'win-bcd\').bootMode + \', NextBoot: \' + (nextboot ? nextboot : \'NORMAL\');\r\n break;\r\n }\r\n }\r\n }\r\n break;\r\n /*\r\n case \'border\':\r\n {\r\n if ((args[\'_\'].length == 1) && (args[\'_\'][0] == \'on\')) {\r\n if (meshCoreObj.users.length > 0) {\r\n obj.borderManager.Start(meshCoreObj.users[0]);\r\n response = \'Border blinking is on.\';\r\n } else {\r\n response = \'Cannot turn on border blinking, no logged in users.\';\r\n }\r\n } else if ((args[\'_\'].length == 1) && (args[\'_\'][0] == \'off\')) {\r\n obj.borderManager.Stop();\r\n response = \'Border blinking is off.\';\r\n } else {\r\n response = \'Proper usage: border "on|off"\'; // Display correct command usage\r\n }\r\n }\r\n break;\r\n */\r\n case \'av\':\r\n if (process.platform == \'win32\') {\r\n // Windows Command: "wmic /Namespace:\\\\root\\SecurityCenter2 Path AntiVirusProduct get /FORMAT:CSV"\r\n response = JSON.stringify(require(\'win-info\').av(), null, 1);\r\n } else {\r\n response = \'Not supported on the platform\';\r\n }\r\n break;\r\n case \'log\':\r\n if (args[\'_\'].length != 1) { response = \'Proper usage: log "sample text"\'; } else { MeshServerLog(args[\'_\'][0]); response = \'ok\'; }\r\n break;\r\n case \'getclip\':\r\n if (require(\'MeshAgent\').isService) {\r\n require(\'clipboard\').dispatchRead().then(function (str) { sendConsoleText(str, sessionid); });\r\n } else {\r\n require("clipboard").read().then(function (str) { sendConsoleText(str, sessionid); });\r\n }\r\n break;\r\n case \'setclip\': {\r\n if (args[\'_\'].length != 1) {\r\n response = \'Proper usage: setclip "sample text"\';\r\n } else {\r\n if (require(\'MeshAgent\').isService) {\r\n if (process.platform != \'win32\') {\r\n require(\'clipboard\').dispatchWrite(args[\'_\'][0]);\r\n }\r\n else {\r\n var tmp = "require(\'clipboard\')(\\"" + (args[\'_\'][0]).split(\'"\').join(\'\\\\"\') + \'");process.exit();\';\r\n tmp = Buffer.from(tmp).toString(\'base64\');\r\n\r\n var uid = require(\'user-sessions\').consoleUid();\r\n var user = require(\'user-sessions\').getUsername(uid);\r\n var domain = require(\'user-sessions\').getDomain(uid);\r\n\r\n var taskoptions = { env: { _target: process.execPath, _args: \'-b64exec \' + tmp, _user: domain + \'\\\\\' + user } };\r\n for (var c1e in process.env) {\r\n taskoptions.env[c1e] = process.env[c1e];\r\n }\r\n\r\n var child = require(\'child_process\').execFile(process.env[\'windir\'] + \'\\\\System32\\\\WindowsPowerShell\\\\v1.0\\\\powershell.exe\', [\'powershell\', \'-noprofile\', \'-nologo\', \'-command\', \'-\'], taskoptions);\r\n child.stderr.on(\'data\', function (c) { });\r\n child.stdout.on(\'data\', function (c) { });\r\n child.stdin.write(\'SCHTASKS /CREATE /F /TN MeshUserTask /SC ONCE /ST 00:00 \');\r\n child.stdin.write(\'/RU $env:_user \');\r\n\r\n child.stdin.write(\'/TR "$env:_target $env:_args"\\r\\n\');\r\n child.stdin.write(\'$ts = New-Object -ComObject Schedule.service\\r\\n\');\r\n child.stdin.write(\'$ts.connect()\\r\\n\');\r\n child.stdin.write(\'$tsfolder = $ts.getfolder("\\\\")\\r\\n\');\r\n child.stdin.write(\'$task = $tsfolder.GetTask("MeshUserTask")\\r\\n\');\r\n child.stdin.write(\'$taskdef = $task.Definition\\r\\n\');\r\n child.stdin.write(\'$taskdef.Settings.StopIfGoingOnBatteries = $false\\r\\n\');\r\n child.stdin.write(\'$taskdef.Settings.DisallowStartIfOnBatteries = $false\\r\\n\');\r\n child.stdin.write(\'$taskdef.Actions.Item(1).Path = $env:_target\\r\\n\');\r\n child.stdin.write(\'$taskdef.Actions.Item(1).Arguments = $env:_args\\r\\n\');\r\n child.stdin.write(\'$tsfolder.RegisterTaskDefinition($task.Name, $taskdef, 4, $null, $null, $null)\\r\\n\');\r\n\r\n child.stdin.write(\'SCHTASKS /RUN /TN MeshUserTask\\r\\n\');\r\n child.stdin.write(\'SCHTASKS /DELETE /F /TN MeshUserTask\\r\\nexit\\r\\n\');\r\n child.waitExit();\r\n }\r\n response = \'Setting clipboard to: "\' + args[\'_\'][0] + \'"\';\r\n }\r\n else {\r\n require("clipboard")(args[\'_\'][0]); response = \'Setting clipboard to: "\' + args[\'_\'][0] + \'"\';\r\n }\r\n }\r\n break;\r\n }\r\n case \'openurl\': {\r\n if (args[\'_\'].length != 1) { response = \'Proper usage: openurl (url)\'; } // Display usage\r\n else { if (openUserDesktopUrl(args[\'_\'][0]) == null) { response = \'Failed.\'; } else { response = \'Success.\'; } }\r\n break;\r\n }\r\n case \'users\': {\r\n if (meshCoreObj.users == null) { response = \'Active users are unknown.\'; } else { response = \'Active Users: \' + meshCoreObj.users.join(\', \') + \'.\'; }\r\n require(\'user-sessions\').enumerateUsers().then(function (u) { for (var i in u) { sendConsoleText(u[i]); } });\r\n break;\r\n }\r\n case \'toast\': {\r\n if (args[\'_\'].length < 1) { response = \'Proper usage: toast "message"\'; } else {\r\n if (require(\'MeshAgent\')._tsid == null) {\r\n require(\'toaster\').Toast(\'MeshCentral\', args[\'_\'][0]).then(sendConsoleText, sendConsoleText);\r\n }\r\n else {\r\n require(\'toaster\').Toast(\'MeshCentral\', args[\'_\'][0], require(\'MeshAgent\')._tsid).then(sendConsoleText, sendConsoleText);\r\n }\r\n }\r\n break;\r\n }\r\n case \'setdebug\': {\r\n if (args[\'_\'].length < 1) { response = \'Proper usage: setdebug (target), 0 = Disabled, 1 = StdOut, 2 = This Console, * = All Consoles, 4 = WebLog, 8 = Logfile\'; } // Display usage\r\n else { if (args[\'_\'][0] == \'*\') { console.setDestination(2); } else { console.setDestination(parseInt(args[\'_\'][0]), sessionid); } }\r\n break;\r\n }\r\n case \'ps\': {\r\n processManager.getProcesses(function (plist) {\r\n var x = \'\';\r\n for (var i in plist) { x += i + ((plist[i].user) ? (\', \' + plist[i].user) : \'\') + \', \' + plist[i].cmd + \'\\r\\n\'; }\r\n sendConsoleText(x, sessionid);\r\n });\r\n break;\r\n }\r\n case \'kill\': {\r\n if ((args[\'_\'].length < 1)) {\r\n response = \'Proper usage: kill [pid]\'; // Display correct command usage\r\n } else {\r\n process.kill(parseInt(args[\'_\'][0]));\r\n response = \'Killed process \' + args[\'_\'][0] + \'.\';\r\n }\r\n break;\r\n }\r\n case \'smbios\': {\r\n if (SMBiosTables == null) { response = \'SMBios tables not available.\'; } else { response = objToString(SMBiosTables, 0, \' \', true); }\r\n break;\r\n }\r\n case \'rawsmbios\': {\r\n if (SMBiosTablesRaw == null) { response = \'SMBios tables not available.\'; } else {\r\n response = \'\';\r\n for (var i in SMBiosTablesRaw) {\r\n var header = false;\r\n for (var j in SMBiosTablesRaw[i]) {\r\n if (SMBiosTablesRaw[i][j].length > 0) {\r\n if (header == false) { response += (\'Table type #\' + i + ((require(\'smbios\').smTableTypes[i] == null) ? \'\' : (\', \' + require(\'smbios\').smTableTypes[i]))) + \'\\r\\n\'; header = true; }\r\n response += (\' \' + SMBiosTablesRaw[i][j].toString(\'hex\')) + \'\\r\\n\';\r\n }\r\n }\r\n }\r\n }\r\n break;\r\n }\r\n case \'eval\': { // Eval JavaScript\r\n if (args[\'_\'].length < 1) {\r\n response = \'Proper usage: eval "JavaScript code"\'; // Display correct command usage\r\n } else {\r\n response = JSON.stringify(mesh.eval(args[\'_\'][0])); // This can only be run by trusted administrator.\r\n }\r\n break;\r\n }\r\n case \'uninstallagent\': // Uninstall this agent\r\n var agentName = process.platform == \'win32\' ? \'Mesh Agent\' : \'meshagent\';\r\n try {\r\n agentName = require(\'MeshAgent\').serviceName;\r\n }\r\n catch (x) {\r\n }\r\n\r\n if (!require(\'service-manager\').manager.getService(agentName).isMe()) {\r\n response = \'Uininstall failed, this instance is not the service instance\';\r\n } else {\r\n try { diagnosticAgent_uninstall(); } catch (e) { }\r\n var js = "require(\'service-manager\').manager.getService(\'" + agentName + "\').stop(); require(\'service-manager\').manager.uninstallService(\'" + agentName + "\'); process.exit();";\r\n this.child = require(\'child_process\').execFile(process.execPath, [process.platform == \'win32\' ? (process.execPath.split(\'\\\\\').pop()) : (process.execPath.split(\'/\').pop()), \'-b64exec\', Buffer.from(js).toString(\'base64\')], { type: 4, detached: true });\r\n }\r\n break;\r\n case \'notify\': { // Send a notification message to the mesh\r\n if (args[\'_\'].length != 1) {\r\n response = \'Proper usage: notify "message" [--session]\'; // Display correct command usage\r\n } else {\r\n var notification = { action: \'msg\', type: \'notify\', value: args[\'_\'][0], tag: \'console\' };\r\n if (args.session) { notification.sessionid = sessionid; } // If "--session" is specified, notify only this session, if not, the server will notify the mesh\r\n mesh.SendCommand(notification); // no sessionid or userid specified, notification will go to the entire mesh\r\n response = "ok";\r\n }\r\n break;\r\n }\r\n case \'cpuinfo\': { // Return system information\r\n // CPU & memory utilization\r\n pr = require(\'sysinfo\').cpuUtilization();\r\n pr.sessionid = sessionid;\r\n pr.then(function (data) {\r\n sendConsoleText(JSON.stringify(\r\n {\r\n cpu: data,\r\n memory: require(\'sysinfo\').memUtilization(),\r\n thermals: require(\'sysinfo\').thermals == null ? [] : require(\'sysinfo\').thermals()\r\n }, null, 1), this.sessionid);\r\n }, function (e) {\r\n sendConsoleText(e);\r\n });\r\n break;\r\n }\r\n case \'sysinfo\': { // Return system information\r\n getSystemInformation(function (results, err) {\r\n if (results == null) { sendConsoleText(err, this.sessionid); } else {\r\n sendConsoleText(JSON.stringify(results, null, 1), this.sessionid);\r\n }\r\n });\r\n break;\r\n }\r\n case \'info\': { // Return information about the agent and agent core module\r\n response = \'Current Core: \' + meshCoreObj.value + \'\\r\\nAgent Time: \' + Date() + \'.\\r\\nUser Rights: 0x\' + rights.toString(16) + \'.\\r\\nPlatform: \' + process.platform + \'.\\r\\nCapabilities: \' + meshCoreObj.caps + \'.\\r\\nServer URL: \' + mesh.ServerUrl + \'.\';\r\n if (amt != null) { response += \'\\r\\nBuilt-in LMS: \' + [\'Disabled\', \'Connecting..\', \'Connected\'][amt.lmsstate] + \'.\'; }\r\n if (meshCoreObj.osdesc) { response += \'\\r\\nOS: \' + meshCoreObj.osdesc + \'.\'; }\r\n response += \'\\r\\nModules: \' + addedModules.join(\', \') + \'.\';\r\n response += \'\\r\\nServer Connection: \' + mesh.isControlChannelConnected + \', State: \' + meshServerConnectionState + \'.\';\r\n var oldNodeId = db.Get(\'OldNodeId\');\r\n if (oldNodeId != null) { response += \'\\r\\nOldNodeID: \' + oldNodeId + \'.\'; }\r\n if (process.platform == \'linux\' || process.platform == \'freebsd\') { response += \'\\r\\nX11 support: \' + require(\'monitor-info\').kvm_x11_support + \'.\'; }\r\n //response += \'\\r\\Debug Console: \' + debugConsole + \'.\';\r\n break;\r\n }\r\n case \'osinfo\': { // Return the operating system information\r\n var i = 1;\r\n if (args[\'_\'].length > 0) { i = parseInt(args[\'_\'][0]); if (i > 8) { i = 8; } response = \'Calling \' + i + \' times.\'; }\r\n for (var j = 0; j < i; j++) {\r\n var pr = require(\'os\').name();\r\n pr.sessionid = sessionid;\r\n pr.then(function (v) {\r\n sendConsoleText("OS: " + v + (process.platform == \'win32\' ? (require(\'win-virtual-terminal\').supported ? \' [ConPTY: YES]\' : \' [ConPTY: NO]\') : \'\'), this.sessionid);\r\n });\r\n }\r\n break;\r\n }\r\n case \'args\': { // Displays parsed command arguments\r\n response = \'args \' + objToString(args, 0, \' \', true);\r\n break;\r\n }\r\n case \'print\': { // Print a message on the mesh agent console, does nothing when running in the background\r\n var r = [];\r\n for (var i in args[\'_\']) { r.push(args[\'_\'][i]); }\r\n console.log(r.join(\' \'));\r\n response = \'Message printed on agent console.\';\r\n break;\r\n }\r\n case \'type\': { // Returns the content of a file\r\n if (args[\'_\'].length == 0) {\r\n response = \'Proper usage: type (filepath) [maxlength]\'; // Display correct command usage\r\n } else {\r\n var max = 4096;\r\n if ((args[\'_\'].length > 1) && (typeof args[\'_\'][1] == \'number\')) { max = args[\'_\'][1]; }\r\n if (max > 4096) max = 4096;\r\n var buf = Buffer.alloc(max), fd = fs.openSync(args[\'_\'][0], "r"), r = fs.readSync(fd, buf, 0, max); // Read the file content\r\n response = buf.toString();\r\n var i = response.indexOf(\'\\n\');\r\n if ((i > 0) && (response[i - 1] != \'\\r\')) { response = response.split(\'\\n\').join(\'\\r\\n\'); }\r\n if (r == max) response += \'...\';\r\n fs.closeSync(fd);\r\n }\r\n break;\r\n }\r\n case \'dbkeys\': { // Return all data store keys\r\n response = JSON.stringify(db.Keys);\r\n break;\r\n }\r\n case \'dbget\': { // Return the data store value for a given key\r\n if (db == null) { response = \'Database not accessible.\'; break; }\r\n if (args[\'_\'].length != 1) {\r\n response = \'Proper usage: dbget (key)\'; // Display the value for a given database key\r\n } else {\r\n response = db.Get(args[\'_\'][0]);\r\n }\r\n break;\r\n }\r\n case \'dbset\': { // Set a data store key and value pair\r\n if (db == null) { response = \'Database not accessible.\'; break; }\r\n if (args[\'_\'].length != 2) {\r\n response = \'Proper usage: dbset (key) (value)\'; // Set a database key\r\n } else {\r\n var r = db.Put(args[\'_\'][0], args[\'_\'][1]);\r\n response = \'Key set: \' + r;\r\n }\r\n break;\r\n }\r\n case \'dbcompact\': { // Compact the data store\r\n if (db == null) { response = \'Database not accessible.\'; break; }\r\n var r = db.Compact();\r\n response = \'Database compacted: \' + r;\r\n break;\r\n }\r\n case \'httpget\': {\r\n if (consoleHttpRequest != null) {\r\n response = \'HTTP operation already in progress.\';\r\n } else {\r\n if (args[\'_\'].length != 1) {\r\n response = \'Proper usage: httpget (url)\';\r\n } else {\r\n var options = http.parseUri(args[\'_\'][0]);\r\n options.method = \'GET\';\r\n if (options == null) {\r\n response = \'Invalid url.\';\r\n } else {\r\n try { consoleHttpRequest = http.request(options, consoleHttpResponse); } catch (e) { response = \'Invalid HTTP GET request\'; }\r\n consoleHttpRequest.sessionid = sessionid;\r\n if (consoleHttpRequest != null) {\r\n consoleHttpRequest.end();\r\n response = \'HTTPGET \' + options.protocol + \'//\' + options.host + \':\' + options.port + options.path;\r\n }\r\n }\r\n }\r\n }\r\n break;\r\n }\r\n case \'wslist\': { // List all web sockets\r\n response = \'\';\r\n for (var i in consoleWebSockets) {\r\n var httprequest = consoleWebSockets[i];\r\n response += \'Websocket #\' + i + \', \' + httprequest.url + \'\\r\\n\';\r\n }\r\n if (response == \'\') { response = \'no websocket sessions.\'; }\r\n break;\r\n }\r\n case \'wsconnect\': { // Setup a web socket\r\n if (args[\'_\'].length == 0) {\r\n response = \'Proper usage: wsconnect (url)\\r\\nFor example: wsconnect wss://localhost:443/meshrelay.ashx?id=abc\'; // Display correct command usage\r\n } else {\r\n var httprequest = null;\r\n try {\r\n var options = http.parseUri(args[\'_\'][0].split(\'$\').join(\'%24\').split(\'@\').join(\'%40\')); // Escape the $ and @ characters in the URL\r\n options.rejectUnauthorized = 0;\r\n httprequest = http.request(options);\r\n } catch (e) { response = \'Invalid HTTP websocket request\'; }\r\n if (httprequest != null) {\r\n httprequest.upgrade = onWebSocketUpgrade;\r\n httprequest.on(\'error\', function (e) { sendConsoleText("ERROR: Unable to connect to: " + this.url + ", " + JSON.stringify(e)); });\r\n\r\n var index = 1;\r\n while (consoleWebSockets[index]) { index++; }\r\n httprequest.sessionid = sessionid;\r\n httprequest.index = index;\r\n httprequest.url = args[\'_\'][0];\r\n consoleWebSockets[index] = httprequest;\r\n response = \'New websocket session #\' + index;\r\n }\r\n }\r\n break;\r\n }\r\n case \'wssend\': { // Send data on a web socket\r\n if (args[\'_\'].length == 0) {\r\n response = \'Proper usage: wssend (socketnumber)\\r\\n\'; // Display correct command usage\r\n for (var i in consoleWebSockets) {\r\n var httprequest = consoleWebSockets[i];\r\n response += \'Websocket #\' + i + \', \' + httprequest.url + \'\\r\\n\';\r\n }\r\n } else {\r\n var i = parseInt(args[\'_\'][0]);\r\n var httprequest = consoleWebSockets[i];\r\n if (httprequest != undefined) {\r\n httprequest.s.write(args[\'_\'][1]);\r\n response = \'ok\';\r\n } else {\r\n response = \'Invalid web socket number\';\r\n }\r\n }\r\n break;\r\n }\r\n case \'wsclose\': { // Close a websocket\r\n if (args[\'_\'].length == 0) {\r\n response = \'Proper usage: wsclose (socketnumber)\'; // Display correct command usage\r\n } else {\r\n var i = parseInt(args[\'_\'][0]);\r\n var httprequest = consoleWebSockets[i];\r\n if (httprequest != undefined) {\r\n if (httprequest.s != null) { httprequest.s.end(); } else { httprequest.end(); }\r\n response = \'ok\';\r\n } else {\r\n response = \'Invalid web socket number\';\r\n }\r\n }\r\n break;\r\n }\r\n case \'tunnels\': { // Show the list of current tunnels\r\n response = \'\';\r\n for (var i in tunnels) { response += \'Tunnel #\' + i + \', \' + tunnels[i].url + \'\\r\\n\'; }\r\n if (response == \'\') { response = \'No websocket sessions.\'; }\r\n break;\r\n }\r\n case \'ls\': { // Show list of files and folders\r\n response = \'\';\r\n var xpath = \'*\';\r\n if (args[\'_\'].length > 0) { xpath = obj.path.join(args[\'_\'][0], \'*\'); }\r\n response = \'List of \' + xpath + \'\\r\\n\';\r\n var results = fs.readdirSync(xpath);\r\n for (var i = 0; i < results.length; ++i) {\r\n var stat = null, p = obj.path.join(args[\'_\'][0], results[i]);\r\n try { stat = fs.statSync(p); } catch (e) { }\r\n if ((stat == null) || (stat == undefined)) {\r\n response += (results[i] + "\\r\\n");\r\n } else {\r\n response += (results[i] + " " + ((stat.isDirectory()) ? "(Folder)" : "(File)") + "\\r\\n");\r\n }\r\n }\r\n break;\r\n }\r\n case \'lsx\': { // Show list of files and folders\r\n response = objToString(getDirectoryInfo(args[\'_\'][0]), 0, \' \', true);\r\n break;\r\n }\r\n case \'lock\': { // Lock the current user out of the desktop\r\n if (process.platform == \'win32\') { var child = require(\'child_process\'); child.execFile(process.env[\'windir\'] + \'\\\\system32\\\\cmd.exe\', [\'/c\', \'RunDll32.exe user32.dll,LockWorkStation\'], { type: 1 }); response = \'Ok\'; }\r\n else { response = \'Not supported on the platform\'; }\r\n break;\r\n }\r\n case \'amt\': { // Show Intel AMT status\r\n if (amt != null) {\r\n amt.getMeiState(9, function (state) {\r\n var resp = "Intel AMT not detected.";\r\n if (state != null) { resp = objToString(state, 0, \' \', true); }\r\n sendConsoleText(resp, sessionid);\r\n });\r\n } else {\r\n response = "Intel AMT not detected.";\r\n }\r\n break;\r\n }\r\n case \'netinfo\': { // Show network interface information\r\n var interfaces = require(\'os\').networkInterfaces();\r\n response = objToString(interfaces, 0, \' \', true);\r\n break;\r\n }\r\n case \'wakeonlan\': { // Send wake-on-lan\r\n if ((args[\'_\'].length != 1) || (args[\'_\'][0].length != 12)) {\r\n response = \'Proper usage: wakeonlan [mac], for example "wakeonlan 010203040506".\';\r\n } else {\r\n var count = sendWakeOnLanEx([args[\'_\'][0]]);\r\n sendWakeOnLanEx([args[\'_\'][0]]);\r\n sendWakeOnLanEx([args[\'_\'][0]]);\r\n response = \'Sending wake-on-lan on \' + count + \' interface(s).\';\r\n }\r\n break;\r\n }\r\n case \'sendall\': { // Send a message to all consoles on this mesh\r\n sendConsoleText(args[\'_\'].join(\' \'));\r\n break;\r\n }\r\n case \'power\': { // Execute a power action on this computer\r\n if (mesh.ExecPowerState == undefined) {\r\n response = \'Power command not supported on this agent.\';\r\n } else {\r\n if ((args[\'_\'].length == 0) || isNaN(Number(args[\'_\'][0]))) {\r\n response = \'Proper usage: power (actionNumber), where actionNumber is:\\r\\n LOGOFF = 1\\r\\n SHUTDOWN = 2\\r\\n REBOOT = 3\\r\\n SLEEP = 4\\r\\n HIBERNATE = 5\\r\\n DISPLAYON = 6\\r\\n KEEPAWAKE = 7\\r\\n BEEP = 8\\r\\n CTRLALTDEL = 9\\r\\n VIBRATE = 13\\r\\n FLASH = 14\'; // Display correct command usage\r\n } else {\r\n var r = mesh.ExecPowerState(Number(args[\'_\'][0]), Number(args[\'_\'][1]));\r\n response = \'Power action executed with return code: \' + r + \'.\';\r\n }\r\n }\r\n break;\r\n }\r\n case \'location\': {\r\n getIpLocationData(function (location) {\r\n sendConsoleText(objToString({ action: \'iplocation\', type: \'publicip\', value: location }, 0, \' \'));\r\n });\r\n break;\r\n }\r\n case \'parseuri\': {\r\n response = JSON.stringify(http.parseUri(args[\'_\'][0]));\r\n break;\r\n }\r\n case \'scanwifi\': {\r\n if (wifiScanner != null) {\r\n var wifiPresent = wifiScanner.hasWireless;\r\n if (wifiPresent) { response = "Perfoming Wifi scan..."; wifiScanner.Scan(); } else { response = "Wifi absent."; }\r\n } else\r\n { response = "Wifi module not present."; }\r\n break;\r\n }\r\n case \'modules\': {\r\n response = JSON.stringify(addedModules);\r\n break;\r\n }\r\n case \'listservices\': {\r\n var services = require(\'service-manager\').manager.enumerateService();\r\n response = JSON.stringify(services, null, 1);\r\n break;\r\n }\r\n case \'getscript\': {\r\n if (args[\'_\'].length != 1) {\r\n response = "Proper usage: getscript [scriptNumber].";\r\n } else {\r\n mesh.SendCommand({ action: \'getScript\', type: args[\'_\'][0] });\r\n }\r\n break;\r\n }\r\n case \'diagnostic\':\r\n {\r\n if (!mesh.DAIPC.listening) {\r\n response = \'Unable to bind to Diagnostic IPC, most likely because the path (\' + process.cwd() + \') is not on a local file system\';\r\n break;\r\n }\r\n var diag = diagnosticAgent_installCheck();\r\n if (diag) {\r\n if (args[\'_\'].length == 1 && args[\'_\'][0] == \'uninstall\') {\r\n diagnosticAgent_uninstall();\r\n response = \'Diagnostic Agent uninstalled\';\r\n }\r\n else {\r\n response = \'Diagnostic Agent installed at: \' + diag.appLocation();\r\n }\r\n }\r\n else {\r\n if (args[\'_\'].length == 1 && args[\'_\'][0] == \'install\') {\r\n diag = diagnosticAgent_installCheck(true);\r\n if (diag) {\r\n response = \'Diagnostic agent was installed at: \' + diag.appLocation();\r\n }\r\n else {\r\n response = \'Diagnostic agent installation failed\';\r\n }\r\n }\r\n else {\r\n response = \'Diagnostic Agent Not installed. To install: diagnostic install\';\r\n }\r\n }\r\n if (diag) { diag.close(); diag = null; }\r\n break;\r\n }\r\n case \'amtevents\': {\r\n if (obj.amtevents == null) { response = \'No events.\'; } else { response = obj.amtevents.join(\'\\r\\n\'); }\r\n break;\r\n }\r\n case \'amtconfig\': {\r\n if (amt == null) { response = "Intel AMT not detected."; break; }\r\n if (apftunnel != null) { response = "Intel AMT server tunnel already active"; break; }\r\n amt.getMeiState(15, function (state) {\r\n var rx = \'\';\r\n if ((state == null) || (state.ProvisioningState == null)) { rx = "Intel AMT not ready for configuration."; } else {\r\n var apfarg = {\r\n mpsurl: mesh.ServerUrl.replace(\'agent.ashx\', \'apf.ashx\'),\r\n mpsuser: Buffer.from(mesh.ServerInfo.MeshID, \'hex\').toString(\'base64\').substring(0, 16),\r\n mpspass: Buffer.from(mesh.ServerInfo.MeshID, \'hex\').toString(\'base64\').substring(0, 16),\r\n mpskeepalive: 60000,\r\n clientname: state.OsHostname,\r\n clientaddress: \'127.0.0.1\',\r\n clientuuid: state.UUID,\r\n conntype: 2, // 0 = CIRA, 1 = Relay, 2 = LMS. The correct value is 2 since we are performing an LMS relay, other values for testing.\r\n meiState: state // MEI state will be passed to MPS server\r\n };\r\n if ((state.UUID == null) || (state.UUID.length != 36)) {\r\n rx = "Unable to get Intel AMT UUID";\r\n } else {\r\n addAmtEvent(\'User LMS tunnel start.\');\r\n apftunnel = require(\'amt-apfclient\')({ debug: false }, apfarg);\r\n apftunnel.onJsonControl = handleApfJsonControl;\r\n apftunnel.onChannelClosed = function () { addAmtEvent(\'User LMS tunnel closed.\'); apftunnel = null; }\r\n try {\r\n apftunnel.connect();\r\n rx = "Started Intel AMT configuration";\r\n } catch (ex) {\r\n rx = JSON.stringify(ex);\r\n }\r\n }\r\n }\r\n if (rx != \'\') { require(\'MeshAgent\').SendCommand({ action: \'msg\', type: \'console\', value: rx }); }\r\n });\r\n break;\r\n }\r\n case \'apf\': {\r\n if (meshCoreObj.intelamt !== null) {\r\n if (args[\'_\'].length == 1) {\r\n var connType = -1, connTypeStr = args[\'_\'][0].toLowerCase();\r\n if (connTypeStr == \'lms\') { connType = 2; }\r\n if (connTypeStr == \'relay\') { connType = 1; }\r\n if (connTypeStr == \'cira\') { connType = 0; }\r\n if (connTypeStr == \'off\') { connType = -2; }\r\n if (connType >= 0) { // Connect\r\n var apfarg = {\r\n mpsurl: mesh.ServerUrl.replace(\'agent.ashx\', \'apf.ashx\'),\r\n mpsuser: Buffer.from(mesh.ServerInfo.MeshID, \'hex\').toString(\'base64\').substring(0, 16),\r\n mpspass: Buffer.from(mesh.ServerInfo.MeshID, \'hex\').toString(\'base64\').substring(0, 16),\r\n mpskeepalive: 60000,\r\n clientname: require(\'os\').hostname(),\r\n clientaddress: \'127.0.0.1\',\r\n clientuuid: meshCoreObj.intelamt.uuid,\r\n conntype: connType // 0 = CIRA, 1 = Relay, 2 = LMS. The correct value is 2 since we are performing an LMS relay, other values for testing.\r\n };\r\n if ((apfarg.clientuuid == null) || (apfarg.clientuuid.length != 36)) {\r\n response = "Unable to get Intel AMT UUID: " + apfarg.clientuuid;\r\n } else {\r\n apftunnel = require(\'amt-apfclient\')({ debug: false }, apfarg);\r\n apftunnel.onJsonControl = handleApfJsonControl;\r\n apftunnel.onChannelClosed = function () { apftunnel = null; }\r\n try {\r\n apftunnel.connect();\r\n response = "Started APF tunnel";\r\n } catch (e) {\r\n response = JSON.stringify(e);\r\n }\r\n }\r\n } else if (connType == -2) { // Disconnect\r\n try {\r\n apftunnel.disconnect();\r\n response = "Stopped APF tunnel";\r\n } catch (e) {\r\n response = JSON.stringify(e);\r\n }\r\n apftunnel = null;\r\n } else {\r\n response = "Invalid command.\\r\\nUse: apf lms|relay|cira|off";\r\n }\r\n } else {\r\n response = "APF tunnel is " + (apftunnel == null ? "off" : "on") + "\\r\\nUse: apf lms|relay|cira|off";\r\n }\r\n } else {\r\n response = "APF tunnel requires Intel AMT";\r\n }\r\n break;\r\n }\r\n case \'plugin\': {\r\n if (typeof args[\'_\'][0] == \'string\') {\r\n try {\r\n // Pass off the action to the plugin\r\n // for plugin creators, you\'ll want to have a plugindir/modules_meshcore/plugin.js\r\n // to control the output / actions here.\r\n response = require(args[\'_\'][0]).consoleaction(args, rights, sessionid, mesh);\r\n } catch (e) {\r\n response = "There was an error in the plugin (" + e + ")";\r\n }\r\n } else {\r\n response = "Proper usage: plugin [pluginName] [args].";\r\n }\r\n break;\r\n }\r\n default: { // This is an unknown command, return an error message\r\n response = "Unknown command \\"" + cmd + "\\", type \\"help\\" for list of avaialble commands.";\r\n break;\r\n }\r\n }\r\n } catch (e) { response = "Command returned an exception error: " + e; console.log(e); }\r\n if (response != null) { sendConsoleText(response, sessionid); }\r\n}\r\n\r\n// Send a mesh agent console command\r\nfunction sendConsoleText(text, sessionid) {\r\n if (typeof text == \'object\') { text = JSON.stringify(text); }\r\n if (debugConsole && ((sessionid == null) || (sessionid == \'pipe\'))) { broadcastToRegisteredApps({ cmd: \'console\', value: text }); }\r\n if (sessionid != \'pipe\') { require(\'MeshAgent\').SendCommand({ action: \'msg\', type: \'console\', value: text, sessionid: sessionid }); }\r\n}\r\n\r\n// Send a mesh agent message to server, placing a bubble/badge on the agent device\r\nfunction sendAgentMessage(msg, icon) {\r\n if (sendAgentMessage.messages == null) {\r\n sendAgentMessage.messages = {};\r\n sendAgentMessage.nextid = 1;\r\n }\r\n sendAgentMessage.messages[sendAgentMessage.nextid++] = { msg: msg, icon: icon };\r\n require(\'MeshAgent\').SendCommand({ action: \'sessions\', type: \'msg\', value: sendAgentMessage.messages });\r\n}\r\nfunction getOpenDescriptors() {\r\n switch (process.platform) {\r\n case "freebsd":\r\n var child = require(\'child_process\').execFile(\'/bin/sh\', [\'sh\']);\r\n child.stdout.str = \'\'; child.stdout.on(\'data\', function (c) { this.str += c.toString(); });\r\n child.stderr.on(\'data\', function (c) { });\r\n\r\n child.stdin.write("procstat -f " + process.pid + " | tr \'\\\\n\' \'`\' | awk -F\'`\' \'");\r\n child.stdin.write(\'{\');\r\n child.stdin.write(\' DEL="";\');\r\n child.stdin.write(\' printf "[";\');\r\n child.stdin.write(\' for(i=1;i 0) {\r\n fd = descriptors.pop();\r\n if (fd > 2) {\r\n libc.close(fd);\r\n }\r\n }\r\n}\r\nfunction linux_execv(name, agentfilename, sessionid) {\r\n var libs = require(\'monitor-info\').getLibInfo(\'libc\');\r\n var libc = null;\r\n\r\n if ((libs.length == 0 || libs.length == null) && require(\'MeshAgent\').ARCHID == 33) {\r\n var child = require(\'child_process\').execFile(\'/bin/sh\', [\'sh\']);\r\n child.stdout.str = \'\'; child.stdout.on(\'data\', function (c) { this.str += c.toString(); });\r\n child.stderr.str = \'\'; child.stderr.on(\'data\', function (c) { this.str += c.toString(); });\r\n child.stdin.write("ls /lib/libc.* | tr \'\\\\n\' \'`\' | awk -F\'`\' \'{ " + \' printf "["; DEL=""; for(i=1;i 0) {\r\n try {\r\n libc = require(\'_GenericMarshal\').CreateNativeProxy(libs.pop().path);\r\n break;\r\n }\r\n catch (e) {\r\n libc = null;\r\n continue;\r\n }\r\n }\r\n if (libc != null) {\r\n try {\r\n libc.CreateMethod(\'execv\');\r\n libc.CreateMethod(\'close\');\r\n }\r\n catch (e) {\r\n libc = null;\r\n }\r\n }\r\n\r\n if (libc == null) {\r\n // Couldn\'t find libc.so, fallback to using service manager to restart agent\r\n if (sessionid != null) { sendConsoleText(\'Restarting service via service-manager...\', sessionid) }\r\n try {\r\n // restart service\r\n var s = require(\'service-manager\').manager.getService(name);\r\n s.restart();\r\n }\r\n catch (zz) {\r\n sendConsoleText(\'Self Update encountered an error trying to restart service\', sessionid);\r\n sendAgentMessage(\'Self Update encountered an error trying to restart service\', 3);\r\n }\r\n return;\r\n }\r\n\r\n if (sessionid != null) { sendConsoleText(\'Restarting service via execv()...\', sessionid) }\r\n\r\n var i;\r\n var args;\r\n var argarr = [process.execPath];\r\n var argtmp = [];\r\n var path = require(\'_GenericMarshal\').CreateVariable(process.execPath);\r\n\r\n if (require(\'MeshAgent\').getStartupOptions != null) {\r\n var options = require(\'MeshAgent\').getStartupOptions();\r\n for (i in options) {\r\n argarr.push(\'--\' + i + \'="\' + options[i] + \'"\');\r\n }\r\n }\r\n\r\n args = require(\'_GenericMarshal\').CreateVariable((1 + argarr.length) * require(\'_GenericMarshal\').PointerSize);\r\n for (i = 0; i < argarr.length; ++i) {\r\n var arg = require(\'_GenericMarshal\').CreateVariable(argarr[i]);\r\n argtmp.push(arg);\r\n arg.pointerBuffer().copy(args.toBuffer(), i * require(\'_GenericMarshal\').PointerSize);\r\n }\r\n\r\n var descriptors = getOpenDescriptors();\r\n closeDescriptors(libc, descriptors);\r\n\r\n libc.execv(path, args);\r\n if (sessionid != null) { sendConsoleText(\'Self Update failed because execv() failed\', sessionid) }\r\n sendAgentMessage(\'Self Update failed because execv() failed\', 3);\r\n}\r\n\r\nfunction bsd_execv(name, agentfilename, sessionid) {\r\n var child = require(\'child_process\').execFile(\'/bin/sh\', [\'sh\']);\r\n child.stdout.str = \'\'; child.stdout.on(\'data\', function (c) { this.str += c.toString(); });\r\n child.stderr.str = \'\'; child.stderr.on(\'data\', function (c) { this.str += c.toString(); });\r\n child.stdin.write("cat /usr/lib/libc.so | awk \'");\r\n child.stdin.write(\'{\');\r\n child.stdin.write(\' a=split($0, tok, "(");\');\r\n child.stdin.write(\' if(a>1)\');\r\n child.stdin.write(\' {\');\r\n child.stdin.write(\' split(tok[2], b, ")");\');\r\n child.stdin.write(\' split(b[1], c, " ");\');\r\n child.stdin.write(\' print c[1];\');\r\n child.stdin.write(\' }\');\r\n child.stdin.write("}\'\\nexit\\n");\r\n child.waitExit();\r\n if (child.stdout.str.trim() == \'\') {\r\n if (sessionid != null) { sendConsoleText(\'Self Update failed because cannot find libc.so\', sessionid) }\r\n sendAgentMessage(\'Self Update failed because cannot find libc.so\', 3);\r\n return;\r\n }\r\n\r\n var libc = null;\r\n try {\r\n libc = require(\'_GenericMarshal\').CreateNativeProxy(child.stdout.str.trim());\r\n libc.CreateMethod(\'execv\');\r\n libc.CreateMethod(\'close\');\r\n }\r\n catch (e) {\r\n if (sessionid != null) { sendConsoleText(\'Self Update failed: \' + e.toString(), sessionid) }\r\n sendAgentMessage(\'Self Update failed: \' + e.toString(), 3);\r\n return;\r\n }\r\n\r\n var i;\r\n var path = require(\'_GenericMarshal\').CreateVariable(process.execPath);\r\n var argarr = [process.execPath];\r\n var argtmp = [];\r\n var args;\r\n var options = require(\'MeshAgent\').getStartupOptions();\r\n for (i in options) {\r\n argarr.push(\'--\' + i + \'="\' + options[i] + \'"\');\r\n }\r\n args = require(\'_GenericMarshal\').CreateVariable((1 + argarr.length) * require(\'_GenericMarshal\').PointerSize);\r\n for (i = 0; i < argarr.length; ++i) {\r\n var arg = require(\'_GenericMarshal\').CreateVariable(argarr[i]);\r\n argtmp.push(arg);\r\n arg.pointerBuffer().copy(args.toBuffer(), i * require(\'_GenericMarshal\').PointerSize);\r\n }\r\n\r\n if (sessionid != null) { sendConsoleText(\'Restarting service via execv()\', sessionid) }\r\n\r\n var descriptors = getOpenDescriptors();\r\n closeDescriptors(libc, descriptors);\r\n\r\n libc.execv(path, args);\r\n if (sessionid != null) { sendConsoleText(\'Self Update failed because execv() failed\', sessionid) }\r\n sendAgentMessage(\'Self Update failed because execv() failed\', 3);\r\n}\r\n\r\nfunction windows_execve(name, agentfilename, sessionid) {\r\n var libc;\r\n try {\r\n libc = require(\'_GenericMarshal\').CreateNativeProxy(\'msvcrt.dll\');\r\n libc.CreateMethod(\'_wexecve\');\r\n }\r\n catch (xx) {\r\n sendConsoleText(\'Self Update failed because msvcrt.dll is missing\', sessionid);\r\n sendAgentMessage(\'Self Update failed because msvcrt.dll is missing\', 3);\r\n return;\r\n }\r\n\r\n var cmd = require(\'_GenericMarshal\').CreateVariable(process.env[\'windir\'] + \'\\\\system32\\\\cmd.exe\', { wide: true });\r\n var args = require(\'_GenericMarshal\').CreateVariable(3 * require(\'_GenericMarshal\').PointerSize);\r\n var arg1 = require(\'_GenericMarshal\').CreateVariable(\'cmd.exe\', { wide: true });\r\n var arg2 = require(\'_GenericMarshal\').CreateVariable(\'/C wmic service "\' + name + \'" call stopservice & "\' + process.cwd() + agentfilename + \'.update.exe" -b64exec \' + \'dHJ5CnsKICAgIHZhciBzZXJ2aWNlTG9jYXRpb24gPSBwcm9jZXNzLmFyZ3YucG9wKCk7CiAgICByZXF1aXJlKCdwcm9jZXNzLW1hbmFnZXInKS5lbnVtZXJhdGVQcm9jZXNzZXMoKS50aGVuKGZ1bmN0aW9uIChwcm9jKQogICAgewogICAgICAgIGZvciAodmFyIHAgaW4gcHJvYykKICAgICAgICB7CiAgICAgICAgICAgIGlmIChwcm9jW3BdLnBhdGggPT0gc2VydmljZUxvY2F0aW9uKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBwcm9jZXNzLmtpbGwocHJvY1twXS5waWQpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHByb2Nlc3MuZXhpdCgpOwogICAgfSk7Cn0KY2F0Y2goZSkKewogICAgcHJvY2Vzcy5leGl0KCk7Cn0=\' +\r\n \' "\' + process.execPath + \'" & copy "\' + process.cwd() + agentfilename + \'.update.exe" "\' + process.execPath + \'" & wmic service "\' + name + \'" call startservice & erase "\' + process.cwd() + agentfilename + \'.update.exe"\', { wide: true });\r\n\r\n arg1.pointerBuffer().copy(args.toBuffer());\r\n arg2.pointerBuffer().copy(args.toBuffer(), require(\'_GenericMarshal\').PointerSize);\r\n\r\n libc._wexecve(cmd, args, 0);\r\n}\r\n\r\n// Start a JavaScript based Agent Self-Update\r\nfunction agentUpdate_Start(updateurl, updateoptions) {\r\n // If this value is null\r\n var sessionid = (updateoptions != null) ? updateoptions.sessionid : null; // If this is null, messages will be broadcast. Otherwise they will be unicasted\r\n\r\n // If the url starts with *, switch it to use the same protoco, host and port as the control channel.\r\n if (updateurl != null) {\r\n updateurl = getServerTargetUrlEx(updateurl);\r\n if (updateurl.startsWith("wss://")) { updateurl = "https://" + updateurl.substring(6); }\r\n }\r\n\r\n if (agentUpdate_Start._selfupdate != null) {\r\n // We were already called, so we will ignore this duplicate request\r\n if (sessionid != null) { sendConsoleText(\'Self update already in progress...\', sessionid); }\r\n }\r\n else {\r\n if (agentUpdate_Start._retryCount == null) { agentUpdate_Start._retryCount = 0; }\r\n if (require(\'MeshAgent\').ARCHID == null && updateurl == null) {\r\n // This agent doesn\'t have the ability to tell us which ARCHID it is, so we don\'t know which agent to pull\r\n sendConsoleText(\'Unable to initiate update, agent ARCHID is not defined\', sessionid);\r\n }\r\n else {\r\n var agentfilename = process.execPath.split(process.platform == \'win32\' ? \'\\\\\' : \'/\').pop(); // Local File Name, ie: MeshAgent.exe\r\n var name = require(\'MeshAgent\').serviceName;\r\n if (name == null) { name = (process.platform == \'win32\' ? \'Mesh Agent\' : \'meshagent\'); } // This is an older agent that doesn\'t expose the service name, so use the default\r\n try {\r\n var s = require(\'service-manager\').manager.getService(name);\r\n if (!s.isMe()) {\r\n if (process.platform == \'win32\') { s.close(); }\r\n sendConsoleText(\'Self Update cannot continue, this agent is not an instance of (\' + name + \')\', sessionid);\r\n return;\r\n }\r\n if (process.platform == \'win32\') { s.close(); }\r\n }\r\n catch (zz) {\r\n sendConsoleText(\'Self Update Failed because this agent is not an instance of (\' + name + \')\', sessionid);\r\n sendAgentMessage(\'Self Update Failed because this agent is not an instance of (\' + name + \')\', 3);\r\n return;\r\n }\r\n\r\n if ((sessionid != null) && (updateurl != null)) { sendConsoleText(\'Downloading update from: \' + updateurl, sessionid); }\r\n var options = require(\'http\').parseUri(updateurl != null ? updateurl : require(\'MeshAgent\').ServerUrl);\r\n options.protocol = \'https:\';\r\n if (updateurl == null) { options.path = (\'/meshagents?id=\' + require(\'MeshAgent\').ARCHID); sendConsoleText(\'Downloading update from: \' + options.path, sessionid); }\r\n options.rejectUnauthorized = false;\r\n options.checkServerIdentity = function checkServerIdentity(certs) {\r\n // If the tunnel certificate matches the control channel certificate, accept the connection\r\n try { if (require(\'MeshAgent\').ServerInfo.ControlChannelCertificate.digest == certs[0].digest) return; } catch (ex) { }\r\n try { if (require(\'MeshAgent\').ServerInfo.ControlChannelCertificate.fingerprint == certs[0].fingerprint) return; } catch (ex) { }\r\n\r\n // Check that the certificate is the one expected by the server, fail if not.\r\n if (checkServerIdentity.servertlshash == null) {\r\n if (require(\'MeshAgent\').ServerInfo == null || require(\'MeshAgent\').ServerInfo.ControlChannelCertificate == null) { return; }\r\n sendConsoleText(\'Self Update failed, because the url cannot be verified: \' + updateurl, sessionid);\r\n sendAgentMessage(\'Self Update failed, because the url cannot be verified: \' + updateurl, 3);\r\n throw new Error(\'BadCert\');\r\n }\r\n if (certs[0].digest == null) { return; }\r\n if ((checkServerIdentity.servertlshash != null) && (checkServerIdentity.servertlshash.toLowerCase() != certs[0].digest.split(\':\').join(\'\').toLowerCase())) {\r\n sendConsoleText(\'Self Update failed, because the supplied certificate does not match\', sessionid);\r\n sendAgentMessage(\'Self Update failed, because the supplied certificate does not match\', 3);\r\n throw new Error(\'BadCert\')\r\n }\r\n }\r\n options.checkServerIdentity.servertlshash = (updateoptions != null ? updateoptions.tlshash : null);\r\n agentUpdate_Start._selfupdate = require(\'https\').get(options);\r\n agentUpdate_Start._selfupdate.on(\'error\', function (e) {\r\n sendConsoleText(\'Self Update failed, because there was a problem trying to download the update from \' + updateurl, sessionid);\r\n sendAgentMessage(\'Self Update failed, because there was a problem trying to download the update from \' + updateurl, 3);\r\n agentUpdate_Start._selfupdate = null;\r\n });\r\n agentUpdate_Start._selfupdate.on(\'response\', function (img) {\r\n this._file = require(\'fs\').createWriteStream(agentfilename + (process.platform == \'win32\' ? \'.update.exe\' : \'.update\'), { flags: \'wb\' });\r\n this._filehash = require(\'SHA384Stream\').create();\r\n this._filehash.on(\'hash\', function (h) {\r\n if (updateoptions != null && updateoptions.hash != null) {\r\n if (updateoptions.hash.toLowerCase() == h.toString(\'hex\').toLowerCase()) {\r\n if (sessionid != null) { sendConsoleText(\'Download complete. HASH verified.\', sessionid); }\r\n }\r\n else {\r\n agentUpdate_Start._retryCount++;\r\n sendConsoleText(\'Self Update FAILED because the downloaded agent FAILED hash check (\' + agentUpdate_Start._retryCount + \'), URL: \' + updateurl, sessionid);\r\n sendAgentMessage(\'Self Update FAILED because the downloaded agent FAILED hash check (\' + agentUpdate_Start._retryCount + \'), URL: \' + updateurl, 3);\r\n agentUpdate_Start._selfupdate = null;\r\n\r\n if (agentUpdate_Start._retryCount < 4) {\r\n // Retry the download again\r\n sendConsoleText(\'Self Update will try again in 60 seconds...\', sessionid);\r\n agentUpdate_Start._timeout = setTimeout(agentUpdate_Start, 60000, updateurl, updateoptions);\r\n }\r\n else {\r\n sendConsoleText(\'Self Update giving up, too many failures...\', sessionid);\r\n sendAgentMessage(\'Self Update giving up, too many failures...\', 3);\r\n }\r\n return;\r\n }\r\n }\r\n else {\r\n sendConsoleText(\'Download complete. HASH=\' + h.toString(\'hex\'), sessionid);\r\n }\r\n\r\n // Send an indication to the server that we got the update download correctly.\r\n try { require(\'MeshAgent\').SendCommand({ action: \'agentupdatedownloaded\' }); } catch (e) { }\r\n\r\n if (sessionid != null) { sendConsoleText(\'Updating and restarting agent...\', sessionid); }\r\n if (process.platform == \'win32\') {\r\n // Use _wexecve() equivalent to perform the update\r\n windows_execve(name, agentfilename, sessionid);\r\n }\r\n else {\r\n var m = require(\'fs\').statSync(process.execPath).mode;\r\n require(\'fs\').chmodSync(process.cwd() + agentfilename + \'.update\', m);\r\n\r\n // remove binary\r\n require(\'fs\').unlinkSync(process.execPath);\r\n\r\n // copy update\r\n require(\'fs\').copyFileSync(process.cwd() + agentfilename + \'.update\', process.execPath);\r\n require(\'fs\').chmodSync(process.execPath, m);\r\n\r\n // erase update\r\n require(\'fs\').unlinkSync(process.cwd() + agentfilename + \'.update\');\r\n\r\n switch (process.platform) {\r\n case \'freebsd\':\r\n bsd_execv(name, agentfilename, sessionid);\r\n break;\r\n case \'linux\':\r\n linux_execv(name, agentfilename, sessionid);\r\n break;\r\n default:\r\n try {\r\n // restart service\r\n var s = require(\'service-manager\').manager.getService(name);\r\n s.restart();\r\n }\r\n catch (zz) {\r\n sendConsoleText(\'Self Update encountered an error trying to restart service\', sessionid);\r\n sendAgentMessage(\'Self Update encountered an error trying to restart service\', 3);\r\n }\r\n break;\r\n }\r\n }\r\n });\r\n img.pipe(this._file);\r\n img.pipe(this._filehash);\r\n });\r\n }\r\n }\r\n}\r\n\r\n\r\n\r\n\r\n// Called before the process exits\r\n//process.exit = function (code) { console.log("Exit with code: " + code.toString()); }\r\n\r\n// Called when the server connection state changes\r\nfunction handleServerConnection(state) {\r\n meshServerConnectionState = state;\r\n if (meshServerConnectionState == 0) {\r\n // Server disconnected\r\n if (selfInfoUpdateTimer != null) { clearInterval(selfInfoUpdateTimer); selfInfoUpdateTimer = null; }\r\n lastSelfInfo = null;\r\n } else {\r\n // Server connected, send mesh core information\r\n var oldNodeId = db.Get(\'OldNodeId\');\r\n if (oldNodeId != null) { mesh.SendCommand({ action: \'mc1migration\', oldnodeid: oldNodeId }); }\r\n\r\n // Send SMBios tables if present\r\n if (SMBiosTablesRaw != null) { mesh.SendCommand({ action: \'smbios\', value: SMBiosTablesRaw }); }\r\n\r\n // Update the server on with basic info, logged in users and more advanced stuff, like Intel ME and Network Settings\r\n meInfoStr = null;\r\n sendPeriodicServerUpdate(null, true);\r\n if (selfInfoUpdateTimer == null) {\r\n selfInfoUpdateTimer = setInterval(sendPeriodicServerUpdate, 1200000); // 20 minutes\r\n selfInfoUpdateTimer.metadata = \'meshcore (InfoUpdate Timer)\';\r\n }\r\n\r\n // Send any state messages\r\n if (Object.keys(tunnelUserCount.msg).length > 0) {\r\n try { mesh.SendCommand({ action: \'sessions\', type: \'msg\', value: tunnelUserCount.msg }); } catch (e) { }\r\n broadcastSessionsToRegisteredApps();\r\n }\r\n\r\n // Send update of registered applications to the server\r\n updateRegisteredAppsToServer();\r\n }\r\n\r\n // Send server state update to registered applications\r\n broadcastToRegisteredApps({ cmd: \'serverstate\', value: meshServerConnectionState, url: require(\'MeshAgent\').ConnectedServer });\r\n}\r\n\r\n// Update the server with the latest network interface information\r\nvar sendNetworkUpdateNagleTimer = null;\r\nfunction sendNetworkUpdateNagle() { if (sendNetworkUpdateNagleTimer != null) { clearTimeout(sendNetworkUpdateNagleTimer); sendNetworkUpdateNagleTimer = null; } sendNetworkUpdateNagleTimer = setTimeout(sendNetworkUpdate, 5000); }\r\nfunction sendNetworkUpdate(force) {\r\n sendNetworkUpdateNagleTimer = null;\r\n\r\n try {\r\n // Update the network interfaces information data\r\n var netInfo = { netif2: require(\'os\').networkInterfaces() };\r\n if (netInfo.netif2) {\r\n netInfo.action = \'netinfo\';\r\n var netInfoStr = JSON.stringify(netInfo);\r\n if ((force == true) || (clearGatewayMac(netInfoStr) != clearGatewayMac(lastNetworkInfo))) { mesh.SendCommand(netInfo); lastNetworkInfo = netInfoStr; }\r\n }\r\n } catch (ex) { }\r\n}\r\n\r\n// Called periodically to check if we need to send updates to the server\r\nfunction sendPeriodicServerUpdate(flags, force) {\r\n if (meshServerConnectionState == 0) return; // Not connected to server, do nothing.\r\n if (!flags) { flags = 0xFFFFFFFF; }\r\n\r\n // If we have a connected MEI, get Intel ME information\r\n if ((flags & 1) && (amt != null) && (amt.state == 2)) {\r\n delete meshCoreObj.intelamt;\r\n amt.getMeiState(9, function (meinfo) {\r\n meshCoreObj.intelamt = meinfo;\r\n meshCoreObj.intelamt.microlms = amt.lmsstate;\r\n meshCoreObjChanged();\r\n });\r\n }\r\n\r\n // Update network information\r\n if (flags & 2) { sendNetworkUpdateNagle(false); }\r\n\r\n // Update anti-virus information\r\n if ((flags & 4) && (process.platform == \'win32\')) {\r\n // Windows Command: "wmic /Namespace:\\\\root\\SecurityCenter2 Path AntiVirusProduct get /FORMAT:CSV"\r\n try { meshCoreObj.av = require(\'win-info\').av(); meshCoreObjChanged(); } catch (e) { av = null; } // Antivirus\r\n //if (process.platform == \'win32\') { try { meshCoreObj.pr = require(\'win-info\').pendingReboot(); meshCoreObjChanged(); } catch (e) { meshCoreObj.pr = null; } } // Pending reboot\r\n }\r\n if (process.platform == \'win32\') {\r\n if (require(\'MeshAgent\')._securitycenter == null) {\r\n try {\r\n require(\'MeshAgent\')._securitycenter = require(\'win-securitycenter\').status();\r\n meshCoreObj[\'wsc\'] = require(\'MeshAgent\')._securitycenter; // Windows Security Central (WSC)\r\n require(\'win-securitycenter\').on(\'changed\', function () {\r\n require(\'MeshAgent\')._securitycenter = require(\'win-securitycenter\').status();\r\n meshCoreObj[\'wsc\'] = require(\'MeshAgent\')._securitycenter; // Windows Security Central (WSC)\r\n require(\'MeshAgent\').SendCommand({ action: \'coreinfo\', wsc: require(\'MeshAgent\')._securitycenter });\r\n });\r\n } catch (e) { }\r\n }\r\n }\r\n\r\n // Send available data right now\r\n if (force) {\r\n meshCoreObj = sortObjRec(meshCoreObj);\r\n var x = JSON.stringify(meshCoreObj);\r\n if (x != LastPeriodicServerUpdate) {\r\n LastPeriodicServerUpdate = x;\r\n mesh.SendCommand(meshCoreObj);\r\n }\r\n }\r\n}\r\n\r\n// Once we are done collecting all the data, send to server if needed\r\nvar LastPeriodicServerUpdate = null;\r\nvar PeriodicServerUpdateNagleTimer = null;\r\nfunction meshCoreObjChanged() {\r\n if (PeriodicServerUpdateNagleTimer == null) {\r\n PeriodicServerUpdateNagleTimer = setTimeout(meshCoreObjChangedEx, 500);\r\n }\r\n}\r\nfunction meshCoreObjChangedEx() {\r\n PeriodicServerUpdateNagleTimer = null;\r\n meshCoreObj = sortObjRec(meshCoreObj);\r\n var x = JSON.stringify(meshCoreObj);\r\n if (x != LastPeriodicServerUpdate) {\r\n try { LastPeriodicServerUpdate = x; mesh.SendCommand(meshCoreObj); } catch (ex) { }\r\n }\r\n}\r\n\r\nfunction sortObjRec(o) { if ((typeof o != \'object\') || (Array.isArray(o))) return o; for (var i in o) { if (typeof o[i] == \'object\') { o[i] = sortObjRec(o[i]); } } return sortObj(o); }\r\nfunction sortObj(o) { return Object.keys(o).sort().reduce(function (result, key) { result[key] = o[key]; return result; }, {}); }\r\n\r\nfunction onWebSocketClosed() { sendConsoleText("WebSocket #" + this.httprequest.index + " closed.", this.httprequest.sessionid); delete consoleWebSockets[this.httprequest.index]; }\r\nfunction onWebSocketData(data) { sendConsoleText("Got WebSocket #" + this.httprequest.index + " data: " + data, this.httprequest.sessionid); }\r\nfunction onWebSocketSendOk() { sendConsoleText("WebSocket #" + this.index + " SendOK.", this.sessionid); }\r\n\r\nfunction onWebSocketUpgrade(response, s, head) {\r\n sendConsoleText("WebSocket #" + this.index + " connected.", this.sessionid);\r\n this.s = s;\r\n s.httprequest = this;\r\n s.end = onWebSocketClosed;\r\n s.data = onWebSocketData;\r\n}\r\n\r\nmesh.AddCommandHandler(handleServerCommand);\r\nmesh.AddConnectHandler(handleServerConnection);\r\n\r\n', - 'linux-amt': '\u0000\u0000\u0000\u0000var addedModules = [];\r\ntry { addModule("amt-apfclient", "function CreateAPFClient(q,e){if((e.clientuuid==null)||(e.clientuuid.length!=36)){return null}var o={};o.parent=q;o.args=e;o.http=require(\\"http\\");o.net=require(\\"net\\");o.forwardClient=null;o.downlinks={};o.pfwd_idx=0;o.timer=null;function u(L,K){return(L.charCodeAt(K)*16777216)+(L.charCodeAt(K+1)<<16)+(L.charCodeAt(K+2)<<8)+L.charCodeAt(K+3)}function n(K){return String.fromCharCode((K>>24)&255,(K>>16)&255,(K>>8)&255,K&255)}function m(K){var M=\\"\\",L=(\\"\\"+K).match(/../g),N;while(N=L.shift()){M+=String.fromCharCode(\\"0x\\"+N)}return M}function h(K){return(K+256).toString(16).substr(-2).toUpperCase()}function w(L){var M=\\"\\",K;for(K=0;K0){o.forwardClient.tag.accumulator=o.forwardClient.tag.accumulator.slice(P)}if(o.cirastate==i.FAILED){k(\\"APF: in a failed state, destroying socket.\\");o.forwardClient.ws.end()}}while(P>0)}catch(O){k(O)}});o.forwardClient.ws.on(\\"error\\",function(N){k(\\"APF: Connection error, ending connecting.\\");if(o.timer!=null){clearInterval(o.timer);o.timer=null}});o.state=i.INITIAL;if((typeof o.args.conntype==\\"number\\")&&(o.args.conntype!=0)){D(o.forwardClient.ws,{action:\\"connType\\",value:o.args.conntype});if(o.args.meiState!=null){D(o.forwardClient.ws,{action:\\"meiState\\",value:o.args.meiState})}}G(o.forwardClient.ws,o.args.clientuuid);H(o.forwardClient.ws,\\"auth@amt.intel.com\\")};o.updateMeiState=function(K){D(o.forwardClient.ws,{action:\\"meiState\\",value:K})};o.sendMeiDeactivationState=function(K){D(o.forwardClient.ws,{action:\\"deactivate\\",value:K})};o.sendStartTlsHostConfigResponse=function(K){D(o.forwardClient.ws,{action:\\"startTlsHostConfig\\",value:K})};o.sendStopConfigurationResponse=function(K){D(o.forwardClient.ws,{action:\\"stopConfiguration\\",value:K})};function D(M,L){var K=JSON.stringify(L);M.write(String.fromCharCode(d.JSON_CONTROL)+n(K.length)+K);k(\\"APF: Send JSON control: \\"+K)}function G(L,M){var K=String.fromCharCode(d.PROTOCOLVERSION)+n(1)+n(0)+n(0)+m(J(M))+f(64);L.write(K);k(\\"APF: Send protocol version 1 0 \\"+M);o.cirastate=i.PROTOCOL_VERSION_SENT}function H(M,L){var K=String.fromCharCode(d.SERVICE_REQUEST)+n(L.length)+L;M.write(K);k(\\"APF: Send service request \\"+L);if(L==\\"auth@amt.intel.com\\"){o.cirastate=i.AUTH_SERVICE_REQUEST_SENT}else{if(L==\\"pfwd@amt.intel.com\\"){o.cirastate=i.PFWD_SERVICE_REQUEST_SENT}}}function I(N,O,L){var M=\\"pfwd@amt.intel.com\\";var K=String.fromCharCode(d.USERAUTH_REQUEST)+n(O.length)+O+n(M.length)+M;K+=n(8)+\\"password\\";K+=f(1)+n(L.length)+L;N.write(K);k(\\"APF: Send username password authentication to MPS\\");o.cirastate=i.AUTH_REQUEST_SENT}function C(N,K,L){var O=\\"tcpip-forward\\";var M=String.fromCharCode(d.GLOBAL_REQUEST)+n(O.length)+O+f(1,1);M+=n(K.length)+K+n(L);N.write(M);k(\\"APF: Send tcpip-forward \\"+K+\\":\\"+L);o.cirastate=i.GLOBAL_REQUEST_SENT}function F(K){K.write(String.fromCharCode(d.KEEPALIVE_REQUEST)+n(255));k(\\"APF: Send keepalive request\\")}function E(L,K){L.write(String.fromCharCode(d.KEEPALIVE_REPLY)+n(K));k(\\"APF: Send keepalive reply\\")}function t(X){var N=X.tag.accumulator.charCodeAt(0);var Q=X.tag.accumulator.length;var O=X.tag.accumulator;if(Q==0){return 0}switch(N){case d.SERVICE_ACCEPT:var W=u(O,1),V=O.substring(5,6+W);k(\\"APF: Service request to \\"+V+\\" accepted.\\");if(V==\\"auth@amt.intel.com\\"){if(o.cirastate>=i.AUTH_SERVICE_REQUEST_SENT){I(X.ws,o.args.mpsuser,o.args.mpspass)}}else{if(V==\\"pfwd@amt.intel.com\\"){if(o.cirastate>=i.PFWD_SERVICE_REQUEST_SENT){C(X.ws,o.args.clientname,s[o.pfwd_idx++])}}}return 5+W;case d.REQUEST_SUCCESS:if(Q>=5){var T=u(O,1);k(\\"APF: Request to port forward \\"+T+\\" successful.\\");if(o.pfwd_idx=0){var K=o.net.createConnection({host:o.args.clientaddress,port:S.target_port},function(){z(X.ws,S)});K.maxInWindow=S.window_size;K.curInWindow=0;K.on(\\"data\\",function(Y){y(X.ws,S.sender_chan,Y)});K.on(\\"error\\",function(Y){A(X.ws,S)});K.on(\\"end\\",function(){var Y=o.downlinks[S.sender_chan];if(Y!=null){k(\\"Socket ends.\\");try{x(X.ws,S.sender_chan)}catch(Z){}delete o.downlinks[S.sender_chan]}});o.downlinks[S.sender_chan]=K}else{A(X.ws,S)}return S.len;case d.CHANNEL_OPEN_CONFIRMATION:k(\\"APF: CHANNEL_OPEN_CONFIRMATION\\");return 17;case d.CHANNEL_CLOSE:var U=u(O,1);k(\\"APF: CHANNEL_CLOSE: \\"+U);try{o.downlinks[U].end()}catch(P){}return 5;case d.CHANNEL_DATA:k(\\"APF: CHANNEL_DATA: \\"+JSON.stringify(w(O)));var U=u(O,1);var M=u(O,5);var L=O.substring(9,9+M);var K=o.downlinks[U];if(K!=null){K.curInWindow+=M;try{K.write(Buffer.from(L,\\"binary\\"),function(){k(\\"Write completed.\\");if(this.curInWindow>(this.maxInWindow/2)){B(X.ws,U,this.curInWindow);this.curInWindow=0}})}catch(P){k(\\"Cannot forward data to downlink socket.\\")}}return 9+M;case d.CHANNEL_WINDOW_ADJUST:k(\\"APF: CHANNEL_WINDOW_ADJUST\\");return 9;case d.JSON_CONTROL:k(\\"APF: JSON_CONTROL\\");var Q=u(O,1);if(o.onJsonControl){var R=null;try{R=JSON.parse(O.substring(5,5+Q))}catch(P){}if(R!=null){o.onJsonControl(R)}}return 5+Q;default:k(\\"CMD: \\"+N+\\" is not implemented.\\");o.cirastate=i.FAILED;return 0}}function r(M){var O={cmd:d.CHANNEL_OPEN};var L=u(M,1);O.chan_type=M.substring(5,5+L);O.sender_chan=u(M,5+L);O.window_size=u(M,9+L);var K=u(M,17+L);O.target_address=M.substring(21+L,21+L+K);O.target_port=u(M,21+L+K);var N=u(M,25+L+K);O.origin_address=M.substring(29+L+K,29+L+K+N);O.origin_port=u(M,29+L+K+N);O.len=33+L+K+N;return O}function A(L,K){L.write(String.fromCharCode(d.CHANNEL_OPEN_FAILURE)+n(K.sender_chan)+n(2)+n(0)+n(0));k(\\"APF: Send ChannelOpenFailure\\")}function z(L,K){L.write(String.fromCharCode(d.CHANNEL_OPEN_CONFIRMATION)+n(K.sender_chan)+n(K.sender_chan)+n(K.window_size)+n(4294967295));k(\\"APF: Send ChannelOpenConfirmation\\")}function B(M,K,L){M.write(String.fromCharCode(d.CHANNEL_WINDOW_ADJUST)+n(K)+n(L));k(\\"APF: Send ChannelWindowAdjust, channel: \\"+K+\\", size: \\"+L)}function y(M,K,L){M.write(Buffer.concat([Buffer.from(String.fromCharCode(d.CHANNEL_DATA)+n(K)+n(L.length),\\"binary\\"),L]));k(\\"APF: Send ChannelData: \\"+L.toString(\\"hex\\"))}function x(L,K){L.write(String.fromCharCode(d.CHANNEL_CLOSE)+n(K));k(\\"APF: Send ChannelClose \\")}o.connect=function(){if(o.forwardClient!=null){try{o.forwardClient.ws.end()}catch(K){k(K)}}o.cirastate=i.INITIAL;o.pfwd_idx=0;var L=o.http.parseUri(o.args.mpsurl);L.rejectUnauthorized=0;o.forwardClient=o.http.request(L);o.forwardClient.upgrade=o.onSecureConnect;o.forwardClient.end()};o.disconnect=function(){try{o.forwardClient.ws.end()}catch(K){k(K)}};return o}module.exports=CreateAPFClient;"); addedModules.push("amt-apfclient"); } catch (e) { }\r\ntry { addModule("amt-lme", "var MemoryStream=require(\\"MemoryStream\\");var lme_id=0;var lme_port_offset=0;var xmlParser=null;try{xmlParser=require(\\"amt-xml\\")}catch(ex){}var APF_DISCONNECT=1;var APF_SERVICE_REQUEST=5;var APF_SERVICE_ACCEPT=6;var APF_USERAUTH_REQUEST=50;var APF_USERAUTH_FAILURE=51;var APF_USERAUTH_SUCCESS=52;var APF_GLOBAL_REQUEST=80;var APF_REQUEST_SUCCESS=81;var APF_REQUEST_FAILURE=82;var APF_CHANNEL_OPEN=90;var APF_CHANNEL_OPEN_CONFIRMATION=91;var APF_CHANNEL_OPEN_FAILURE=92;var APF_CHANNEL_WINDOW_ADJUST=93;var APF_CHANNEL_DATA=94;var APF_CHANNEL_CLOSE=97;var APF_PROTOCOLVERSION=192;function lme_object(){this.ourId=++lme_id;this.amtId=-1;this.LME_CHANNEL_STATUS=\\"LME_CS_FREE\\";this.txWindow=0;this.rxWindow=0;this.localPort=0;this.errorCount=0}function stream_bufferedWrite(){var a=require(\\"events\\").inherits(this);this.buffer=[];this._readCheckImmediate=undefined;this._ObjectID=\\"bufferedWriteStream\\";a.createEvent(\\"close\\");a.createEvent(\\"drain\\");a.createEvent(\\"error\\");a.createEvent(\\"finish\\");a.createEvent(\\"pipe\\");a.createEvent(\\"unpipe\\");a.createEvent(\\"readable\\");this.isEmpty=function(){return(this.buffer.length==0)};this.isWaiting=function(){return(this._readCheckImmediate==undefined)};this.write=function(c){for(var b in arguments){if(typeof(arguments[b])==\\"function\\"){this.once(\\"drain\\",arguments[b]);break}}var d=Buffer.alloc(c.length);c.copy(d);this.buffer.push({offset:0,data:d});this.emit(\\"readable\\");return(this.buffer.length==0?true:false)};this.read=function(){var f=arguments.length==0?undefined:arguments[0];var b=0;var d=[];while((f==undefined||b0){var c=this.buffer[0].data.length-this.buffer[0].offset;var e=this.buffer[0].offset;if(c>(f-b)){d.push(this.buffer[0].data.slice(e,e+f-b));this.buffer[0].offset+=(f-b);b+=(f-b)}else{d.push(this.buffer[0].data.slice(e));b+=c;this.buffer.shift()}}this._readCheckImmediate=setImmediate(function(g){g._readCheckImmediate=undefined;if(g.buffer.length==0){g.emit(\\"drain\\")}else{g.emit(\\"readable\\")}},this);return(Buffer.concat(d))}}function lme_heci(c){var a=require(\\"events\\").inherits(this);a.createEvent(\\"error\\");a.createEvent(\\"connect\\");a.createEvent(\\"notify\\");a.createEvent(\\"bind\\");this.on(\\"newListener\\",function(e,d){if(e==\\"connect\\"&&this._LME._connected==true){d.call(this)}});if((c!=null)&&(c.debug==true)){lme_port_offset=-100}var b=require(\\"heci\\");this.INITIAL_RXWINDOW_SIZE=4096;this._ObjectID=\\"lme\\";this._LME=b.create();this._LME._connected=false;this._LME.descriptorMetadata=\\"amt-lme\\";this._LME._binded={};this._LME.LMS=this;this._LME.on(\\"error\\",function(d){this.LMS.emit(\\"error\\",d)});this._LME.on(\\"connect\\",function(){this._connected=true;this.on(\\"data\\",function(k){var l=k.readUInt8(0);switch(l){default:console.log(\\"Unhandled LME Command \\"+l+\\", \\"+k.length+\\" byte(s).\\");break;case APF_SERVICE_REQUEST:var A=k.readUInt32BE(1);var z=k.slice(5,A+5);if(z==\\"pfwd@amt.intel.com\\"||z==\\"auth@amt.intel.com\\"){var G=Buffer.alloc(5+A);G.writeUInt8(6,0);G.writeUInt32BE(A,1);G.write(z.toString(),5);this.write(G)}else{}break;case APF_GLOBAL_REQUEST:var A=k.readUInt32BE(1);var z=k.slice(5,A+5).toString();switch(z){case\\"tcpip-forward\\":var w=k.readUInt32BE(A+6);var H=k.readUInt32BE(A+10+w);if(this[z]==undefined){this[z]={}}if(this[z][H]!=null){for(var t in this.sockets){var h=this.sockets[t];if(h.localPort==H){this.sockets[t].end();delete this.sockets[t]}}}if(this[z][H]==null){try{this[z][H]=require(\\"net\\").createServer();this[z][H].descriptorMetadata=\\"amt-lme (port: \\"+H+\\")\\";this[z][H].HECI=this;if(lme_port_offset==0){this[z][H].listen({port:H,host:\\"127.0.0.1\\"})}else{this[z][H].listen({port:(H+lme_port_offset)})}this[z][H].on(\\"connection\\",function(e){this.HECI.LMS.bindDuplexStream(e,e.remoteFamily,e.localPort-lme_port_offset)});this._binded[H]=true;this.LMS.emit(\\"bind\\",this._binded)}catch(p){console.log(p,\\"Port \\"+H)}}var G=Buffer.alloc(5);G.writeUInt8(81,0);G.writeUInt32BE(H,1);this.write(G);break;case\\"cancel-tcpip-forward\\":var G=Buffer.alloc(1);G.writeUInt8(APF_REQUEST_SUCCESS,0);this.write(G);break;case\\"udp-send-to@amt.intel.com\\":var G=Buffer.alloc(1);G.writeUInt8(APF_REQUEST_FAILURE,0);this.write(G);break;default:break}break;case APF_CHANNEL_OPEN_CONFIRMATION:var J=k.readUInt32BE(1);var N=k.readUInt32BE(5);var O=k.readUInt32BE(9);if(this.sockets[J]!=undefined){this.sockets[J].lme.amtId=N;this.sockets[J].lme.rxWindow=O;this.sockets[J].lme.txWindow=O;this.sockets[J].lme.LME_CHANNEL_STATUS=\\"LME_CS_CONNECTED\\";this.sockets[J].bufferedStream=new stream_bufferedWrite();this.sockets[J].bufferedStream.socket=this.sockets[J];this.sockets[J].bufferedStream.on(\\"readable\\",function(){if(this.socket.lme.txWindow>0){var e=this.read(this.socket.lme.txWindow);var i=Buffer.alloc(9+e.length);i.writeUInt8(APF_CHANNEL_DATA,0);i.writeUInt32BE(this.socket.lme.amtId,1);i.writeUInt32BE(e.length,5);e.copy(i,9);this.socket.lme.txWindow-=e.length;this.socket.HECI.write(i)}});this.sockets[J].bufferedStream.on(\\"drain\\",function(){this.socket.resume()});this.sockets[J].on(\\"data\\",function(e){if(!this.bufferedStream.write(e)){this.pause()}});this.sockets[J].on(\\"end\\",function(){var e=Buffer.alloc(5);e.writeUInt8(APF_CHANNEL_CLOSE,0);e.writeUInt32BE(this.lme.amtId,1);this.HECI.write(e)});this.sockets[J].resume()}break;case APF_PROTOCOLVERSION:var x=k.readUInt32BE(1);var y=k.readUInt32BE(5);var L=k.readUInt32BE(9);var G=Buffer.alloc(93);G.writeUInt8(192,0);G.writeUInt32BE(1,1);G.writeUInt32BE(0,5);G.writeUInt32BE(L,9);this.write(G);break;case APF_CHANNEL_WINDOW_ADJUST:var K=k.readUInt32BE(1);var g=k.readUInt32BE(5);if(this.sockets[K]!=undefined){this.sockets[K].lme.txWindow+=g;if(!this.sockets[K].bufferedStream.isEmpty()&&this.sockets[K].bufferedStream.isWaiting()){this.sockets[K].bufferedStream.emit(\\"readable\\")}}else{console.log(\\"Unknown Recipient ID/\\"+K+\\" for APF_CHANNEL_WINDOW_ADJUST\\")}break;case APF_CHANNEL_DATA:var K=k.readUInt32BE(1);var n=k.readUInt32BE(5);var m=k.slice(9,9+n);if((this.sockets!=null)&&(this.sockets[K]!=undefined)){this.sockets[K].pendingBytes.push(m.length);this.sockets[K].write(m,function(){var i=this.pendingBytes.shift();var e=Buffer.alloc(9);e.writeUInt8(APF_CHANNEL_WINDOW_ADJUST,0);e.writeUInt32BE(this.lme.amtId,1);e.writeUInt32BE(i,5);this.HECI.write(e)})}else{if((this.insockets!=null)&&(this.insockets[K]!=undefined)){var h=this.insockets[K];if(h.data==null){h.data=m.toString()}else{h.data+=m.toString()}h.rxWindow+=n;var s=parseHttp(h.data);if((s!=null)||(h.data.length>=8000)){var B=null;if(xmlParser!=null){try{B=xmlParser.ParseWsman(s)}catch(o){}}if(B!=null){this.LMS.emit(\\"notify\\",B,h.options,_lmsNotifyToCode(B))}var f=Buffer.alloc(5);f.writeUInt8(APF_CHANNEL_CLOSE,0);f.writeUInt32BE(d,1);this.write(f)}else{if(h.rxWindow>6000){var f=Buffer.alloc(9);f.writeUInt8(APF_CHANNEL_WINDOW_ADJUST,0);f.writeUInt32BE(h.amtId,1);f.writeUInt32BE(h.rxWindow,5);this.write(f);h.rxWindow=0}}}else{console.log(\\"Unknown Recipient ID/\\"+K+\\" for APF_CHANNEL_DATA\\")}}break;case APF_CHANNEL_OPEN_FAILURE:var K=k.readUInt32BE(1);var M=k.readUInt32BE(5);if((this.sockets!=null)&&(this.sockets[K]!=undefined)){this.sockets[K].end();delete this.sockets[K]}else{if((this.insockets!=null)&&(this.insockets[K]!=undefined)){delete this.insockets[K]}else{console.log(\\"Unknown Recipient ID/\\"+K+\\" for APF_CHANNEL_OPEN_FAILURE\\")}}break;case APF_CHANNEL_CLOSE:var K=k.readUInt32BE(1);if((this.sockets!=null)&&(this.sockets[K]!=undefined)){this.sockets[K].end();var d=this.sockets[K].lme.amtId;var f=Buffer.alloc(5);delete this.sockets[K];f.writeUInt8(APF_CHANNEL_CLOSE,0);f.writeUInt32BE(d,1);this.write(f)}else{if((this.insockets!=null)&&(this.insockets[K]!=undefined)){delete this.insockets[K]}else{console.log(\\"Unknown Recipient ID/\\"+K+\\" for APF_CHANNEL_CLOSE\\")}}break;case APF_CHANNEL_OPEN:var A=k.readUInt32BE(1);var z=k.slice(5,A+5).toString();var j=k.readUInt32BE(A+5);var u=k.readUInt32BE(A+9);var r=k.readUInt32BE(A+17);var q=k.slice(A+21,A+21+r).toString();var I=k.readUInt32BE(A+21+r);var D=k.readUInt32BE(A+25+r);var C=k.slice(A+29+r,A+29+r+D).toString();var E=k.readUInt32BE(A+29+r+D);if(this.insockets==null){this.insockets={}}var F=++lme_id;var v=new lme_object();v.ourId=F;v.amtId=j;v.txWindow=u;v.rxWindow=0;v.options={target:q,targetPort:I,source:C,sourcePort:E};this.insockets[F]=v;var f=Buffer.alloc(17);f.writeUInt8(APF_CHANNEL_OPEN_CONFIRMATION,0);f.writeUInt32BE(j,1);f.writeUInt32BE(F,5);f.writeUInt32BE(4000,9);f.writeUInt32BE(4294967295,13);this.write(f);break}});this.LMS.emit(\\"connect\\");this.resume()});this.bindDuplexStream=function(e,h,g){var j=e;j.pendingBytes=[];j.HECI=this._LME;j.LMS=this;j.lme=new lme_object();j.lme.Socket=j;j.localPort=g;var d=new MemoryStream();d.writeUInt8(90);d.writeUInt32BE(15);d.write(\\"forwarded-tcpip\\");d.writeUInt32BE(j.lme.ourId);d.writeUInt32BE(this.INITIAL_RXWINDOW_SIZE);d.writeUInt32BE(4294967295);for(var f=0;f<2;++f){if(h==\\"IPv6\\"){d.writeUInt32BE(3);d.write(\\"::1\\")}else{d.writeUInt32BE(9);d.write(\\"127.0.0.1\\")}d.writeUInt32BE(g)}this._LME.write(d.buffer);if(this._LME.sockets==undefined){this._LME.sockets={}}this._LME.sockets[j.lme.ourId]=j;j.pause()};this._LME.connect(b.GUIDS.LME,{noPipeline:0})}function parseHttp(c){var d=c.indexOf(\\"\\\\r\\\\n\\\\r\\\\n\\");if((d==-1)||(c.length<(d+2))){return null}var b=require(\\"http-headers\\")(c.substring(0,d),true);var a=parseInt(b[\\"content-length\\"]);if(c.length>=a+d+4){return c.substring(d+4,d+4+a)}return null}function _lmsNotifyToCode(c){if((c==null)||(c.Body==null)||(c.Body.MessageID==null)){return null}var b=c.Body.MessageID;try{b+=\\"-\\"+c.Body.MessageArguments[0]}catch(a){}return b}module.exports=lme_heci;"); addedModules.push("amt-lme"); } catch (e) { }\r\ntry { addModule("amt-manage", "function AmtManager(a,g,k){var o=function(r){a.SendCommand({action:\\"msg\\",type:\\"console\\",value:r})};var h=function(r){if(k){o(\\"amt-manager: \\"+r+\\"
\\")}};var e=null,f=0;var c=null,d=0;var b=null;var m=this;var l;var q=null;require(\\"events\\").EventEmitter.call(m,true).createEvent(\\"stateChange_LMS\\").createEvent(\\"portBinding_LMS\\");m._lmsstate=0;m._mapping=[];m.on(\\"newListener\\",function(s,r){if(s==\\"portBinding_LMS\\"){r.call(this,this._mapping)}});Object.defineProperty(m,\\"lmsstate\\",{get:function(){return(this._lmsstate)},set:function(r){if(this._lmsstate!=r){this._lmsstate=r;this.emit(\\"stateChange_LMS\\",r)}}});m.state=0;m.onStateChange=null;m.setDebug=function(r){k=r};var n=0;m.reset=function(){++n;m.amtMei=null,e=null,f=0,c=null,d=0,m.state=0,m.lmsstate=0;try{var r=require(\\"amt-mei\\");m.amtMei=e=new r();e.on(\\"error\\",function(t){h(\\"MEI error\\");e=null;f=-1;m.state=-1;if(m.onStateChange!=null){m.onStateChange(f)}});e.getVersion(function(t){if(t==null){m.state=f=-1;if(m.onStateChange!=null){m.onStateChange(f)}if(n<10){setTimeout(m.reset,10000)}}else{b=t;m.state=f=2;n=0;if(m.onStateChange!=null){m.onStateChange(f)}m.lmsreset()}})}catch(s){h(\\"MEI exception: \\"+s);e=null;f=-1;m.state=-1}};var i={};m.getMeiState=function(t,u){if((e==null)||(f<2)){if(u!=null){u(null)}return}try{var r={\\"core-ver\\":1,OsHostname:require(\\"os\\").hostname(),Flags:0};if(i.MeiVersion!=null){r.MeiVersion=i.MeiVersion}else{e.getProtocolVersion(function(v){if(v!=null){i.MeiVersion=r.MeiVersion=v}})}if((t&1)!=0){if(i.Versions!=null){r.Versions=i.Versions}else{e.getVersion(function(v){if(v){i.Versions=r.Versions={};for(var w in v.Versions){r.Versions[v.Versions[w].Description]=v.Versions[w].Version}}})}}e.getProvisioningMode(function(v){if(v){r.ProvisioningMode=v.mode}});e.getProvisioningState(function(v){if(v){r.ProvisioningState=v.state;if(v.state!=2){e.stopConfiguration(function(){})}}});e.getEHBCState(function(v){if((v!=null)&&(v.EHBC==true)){r.Flags+=1}});e.getControlMode(function(v){if(v!=null){if(v.controlMode==1){r.Flags+=2}if(v.controlMode==2){r.Flags+=4}}});if((t&8)!=0){e.getLanInterfaceSettings(0,function(z){if(z){r.net0=z;var v=null,x=require(\\"os\\").networkInterfaces();for(var w in x){for(var y in x[w]){if((x[w][y].mac==z.mac)&&(x[w][y].fqdn!=null)&&(x[w][y].fqdn!=\\"\\")){r.OsDnsSuffix=x[w][y].fqdn}}}}});e.getLanInterfaceSettings(1,function(v){if(v){r.net1=v}})}if(i.UUID!=null){r.UUID=i.UUID}else{e.getUuid(function(v){if((v!=null)&&(v.uuid!=null)){i.UUID=r.UUID=v.uuid}})}if((t&2)!=0){e.getLocalSystemAccount(function(v){if((v!=null)&&v.user&&v.pass){r.OsAdmin={user:v.user,pass:v.pass}}})}e.getDnsSuffix(function(v){if(v!=null){r.DnsSuffix=v}if((t&4)==0){if(u!=null){u(r)}}});if((t&4)!=0){e.getHashHandles(function(w){if((w!=null)&&(w.length>0)){r.Hashes=[]}else{u(r)}var v=w.length;for(var x=0;x=0){return E.substring(0,F)}else{return E}}this.getCommand=function g(E){var F=E.length==0?(this._rq.peekQueue().cmd|8388608):E.readUInt32LE(4);var G={IsResponse:(F&8388608)==8388608?true:false,Command:(F&8388607),Status:E.length!=0?E.readUInt32LE(12):-1,Data:E.length!=0?E.slice(16):null};return(G)};this.sendCommand=function w(){if(arguments.length<3||typeof(arguments[0])!=\\"number\\"||typeof(arguments[1])!=\\"object\\"||typeof(arguments[2])!=\\"function\\"){throw (\\"invalid parameters\\")}var E=[];for(var G=3;G0){N.BiosVersion=N.BiosVersion.substring(0,N.BiosVersion.indexOf(\\"\\\\0\\"))}L.unshift(N)}else{L.unshift(null)}I.apply(this,L)},E,G)};function D(G,F){if((F==null)&&(typeof(F)!=\\"number\\")){return null}if(G==null){G=\\"\\"}var H=\\"\\";for(var E=0;E0){J.unshift(I.Data.slice(2,2+K).toString())}else{J.unshift(null)}}else{J.unshift(null)}H.apply(this,J)},E,G)};this.getHashHandles=function k(E){var G=[];for(var F=1;F0){this.getCertHashEntry(G.shift(),this._getHashEntrySink,F,H,E,G)}else{H.unshift(E);F.apply(this,H)}};this.getLocalSystemAccount=function m(E){var G=[];for(var F=1;F>24)&255)+\\".\\"+((K>>16)&255)+\\".\\"+((K>>8)&255)+\\".\\"+(K&255);O.unshift(N);L.apply(this,O)}else{O.unshift(null);L.apply(this,O)}},E,J)};this.unprovision=function C(H,E){var I=[];for(var G=2;G0?this[this.length-1]:undefined)}})}catch(e){}try{Object.defineProperty(String.prototype,\\"replaceAll\\",{value:function replaceAll(b,a){return(this.split(b).join(a))}})}catch(e){}var RSMB=1381190978;var memoryLocation={1:\\"Other\\",2:\\"Unknown\\",3:\\"System Board\\",4:\\"ISA\\",5:\\"EISA\\",6:\\"PCI\\",7:\\"MCA\\",8:\\"PCMCIA\\",9:\\"Proprietary\\",10:\\"NuBus\\",160:\\"PC-98/C20\\",161:\\"PC-98/C24\\",162:\\"PC-98/E\\",163:\\"PC-98/LB\\"};var wakeReason=[\\"Reserved\\",\\"Other\\",\\"Unknown\\",\\"APM Timer\\",\\"Modem Ring\\",\\"LAN\\",\\"Power Switch\\",\\"PCI\\",\\"AC Power\\"];function zeroLeftPad(c,b){if((b==null)&&(typeof(b)!=\\"number\\")){return null}if(c==null){c=\\"\\"}var d=\\"\\";for(var a=0;a1){var r=v[1].split(\\"\\\\x0A\\\\x0A\\")[0].split(\\"\\\\x0A\\");var s=[];for(var t in r){var u=r[t].trim().replaceAll(\\" \\",\\"\\").replaceAll(\\"\\\\x09\\",\\"\\");if(!(u[0]==\\\'\\"\\\')){s.push(u)}}p.write(Buffer.from(s.join(\\"\\"),\\"hex\\"));p.write(Buffer.from(\\"00\\",\\"hex\\"))}else{p.write(Buffer.from(\\"0000\\",\\"hex\\"))}}var q=p.buffer;q.ms=p;return(q)}}this._parse=function b(o){var n={};var m;var l=0;var o;var s=0;while(o&&l65535){n={}}}catch(m){}return n};this.processorInfo=function h(l){if(!l){throw (\\"no data\\")}var r=[];var q=[\\"ERROR\\",\\"Other\\",\\"Unknown\\",\\"CPU\\",\\"ALU\\",\\"DSP\\",\\"GPU\\"];var t=[\\"Unknown\\",\\"Enabled\\",\\"Disabled by user\\",\\"Disabled by BIOS\\",\\"Idle\\",\\"Reserved\\",\\"Reserved\\",\\"Other\\"];var k=0;while(l[4]&&l[4].length>0){var n=l[4].pop();var o=n[20]&64;var s=n[20]&7;if(o){var m={_ObjectID:\\"SMBiosTables.processorInfo\\"};m.Processor=q[n[1]];m.MaxSpeed=n.readUInt16LE(16)+\\" Mhz\\";if(n[31]){m.Cores=n[31]}if(n[33]){m.Threads=n[33]}m.Populated=1;m.Status=t[s];m.Socket=n._strings[n[0]-1];m.Manufacturer=n._strings[n[3]-1];m.Version=n._strings[n[12]-1];r.push(m)}}return(r)};this.memoryInfo=function f(k){if(!k){throw (\\"no data\\")}var n={_ObjectID:\\"SMBiosTables.memoryInfo\\"};if(k[16]){var l=k[16].peek();n.location=memoryLocation[l[0]];if((n.maxCapacityKb=l.readUInt32LE(3))==2147483648){n.maxCapacityKb=\\"A really big number\\"}}return(n)};this.systemInfo=function i(k){if(!k){throw (\\"no data\\")}var l={_ObjectID:\\"SMBiosTables.systemInfo\\"};if(k[1]){var m=k[1].peek();var n=m.slice(4,20);l.uuid=[zeroLeftPad(n.readUInt32LE(0).toString(16),8),zeroLeftPad(n.readUInt16LE(4).toString(16),4),zeroLeftPad(n.readUInt16LE(6).toString(16),4),zeroLeftPad(n.readUInt16BE(8).toString(16),4),zeroLeftPad(n.slice(10).toString(\\"hex\\").toLowerCase(),12)].join(\\"-\\");l.wakeReason=wakeReason[m[20]]}return(l)};this.systemSlots=function j(k){if(!k){throw (\\"no data\\")}var l=[];if(k[9]){while(k[9].length>0){var m=k[9].pop();l.push({name:m._strings[m[0]-1]})}}return(l)};this.amtInfo=function c(l){if(!l){throw (\\"no data\\")}var n={AMT:false};if(l[130]&&l[130].peek().slice(0,4).toString()==\\"$AMT\\"){var k=l[130].peek();n.AMT=k[4]?true:false;if(n.AMT){n.enabled=k[5]?true:false;n.storageRedirection=k[6]?true:false;n.serialOverLan=k[7]?true:false;n.kvm=k[14]?true:false;if(l[131].peek()&&l[131].peek().slice(52,56).toString()==\\"vPro\\"){var o=l[131].peek();if(o[0]&4){n.TXT=(o[0]&8)?true:false}if(o[0]&16){n.VMX=(o[0]&32)?true:false}n.MEBX=o.readUInt16LE(4).toString()+\\".\\"+o.readUInt16LE(6).toString()+\\".\\"+o.readUInt16LE(8).toString()+\\".\\"+o.readUInt16LE(10).toString();var m=o.slice(20,32);n.ManagementEngine=m.readUInt16LE(6).toString()+\\".\\"+m.readUInt16LE(4).toString()+\\".\\"+m.readUInt16LE(10).toString()+\\".\\"+m.readUInt16LE(8).toString()}}}return(n)};this.smTableTypes={0:\\"BIOS information\\",1:\\"System information\\",2:\\"Baseboard (or Module) information\\",4:\\"Processor information\\",5:\\"memory controller information\\",6:\\"Memory module information\\",7:\\"Cache information\\",8:\\"Port connector information\\",9:\\"System slots\\",10:\\"On board devices information\\",11:\\"OEM strings\\",12:\\"System configuration options\\",13:\\"BIOS language information\\",14:\\"Group associations\\",15:\\"System event log\\",16:\\"Physical memory array\\",17:\\"Memory device\\",18:\\"32bit memory error information\\",19:\\"Memory array mapped address\\",20:\\"Memory device mapped address\\",21:\\"Built-in pointing device\\",22:\\"Portable battery\\",23:\\"System reset\\",24:\\"Hardware security\\",25:\\"System power controls\\",26:\\"Voltage probe\\",27:\\"Cooling device\\",28:\\"Temperature probe\\",29:\\"Electrical current probe\\",30:\\"Out-of-band remote access\\",31:\\"Boot integrity services (BIS) entry point\\",32:\\"System boot information\\",33:\\"64bit memory error information\\",34:\\"Management device\\",35:\\"Management device component\\",36:\\"Management device threshold data\\",37:\\"Memory channel\\",38:\\"IPMI device information\\",39:\\"System power supply\\",40:\\"Additional information\\",41:\\"Onboard devices extended information\\",42:\\"Management controller host interface\\",126:\\"Inactive\\",127:\\"End-of-table\\"}}module.exports=new SMBiosTables();"); addedModules.push("smbios"); } catch (e) { }\r\ntry { addModule("sysinfo", "var PDH_FMT_LONG=256;var PDH_FMT_DOUBLE=512;var promise=require(\\"promise\\");if(process.platform==\\"win32\\"){var GM=require(\\"_GenericMarshal\\");GM.kernel32=GM.CreateNativeProxy(\\"kernel32.dll\\");GM.kernel32.CreateMethod(\\"GlobalMemoryStatusEx\\");GM.pdh=GM.CreateNativeProxy(\\"pdh.dll\\");GM.pdh.CreateMethod(\\"PdhAddEnglishCounterA\\");GM.pdh.CreateMethod(\\"PdhCloseQuery\\");GM.pdh.CreateMethod(\\"PdhCollectQueryData\\");GM.pdh.CreateMethod(\\"PdhGetFormattedCounterValue\\");GM.pdh.CreateMethod(\\"PdhGetFormattedCounterArrayA\\");GM.pdh.CreateMethod(\\"PdhOpenQueryA\\");GM.pdh.CreateMethod(\\"PdhRemoveCounter\\")}function windows_cpuUtilization(){var b=new promise(function(d,c){this._res=d;this._rej=c});b.counter=GM.CreateVariable(16);b.cpu=GM.CreatePointer();b.cpuTotal=GM.CreatePointer();var a=0;if((a=GM.pdh.PdhOpenQueryA(0,0,b.cpu).Val)!=0){b._rej(a);return}if((a=GM.pdh.PdhAddEnglishCounterA(b.cpu.Deref(),GM.CreateVariable(\\"\\\\\\\\Processor(*)\\\\\\\\% Processor Time\\"),0,b.cpuTotal).Val)!=0){b._rej(a);return}if((a=GM.pdh.PdhCollectQueryData(b.cpu.Deref()).Val!=0)){b._rej(a);return}b._timeout=setTimeout(function(k){var m={cpus:[]};var d=GM.CreateVariable(4);var j=GM.CreateVariable(4);var c,l,h;var f;if((f=GM.pdh.PdhCollectQueryData(k.cpu.Deref()).Val!=0)){k._rej(f);return}if((f=GM.pdh.PdhGetFormattedCounterArrayA(k.cpuTotal.Deref(),PDH_FMT_DOUBLE,d,j,0).Val)==-2147481646){c=GM.CreateVariable(d.toBuffer().readUInt32LE())}else{k._rej(f);return}if((f=GM.pdh.PdhGetFormattedCounterArrayA(k.cpuTotal.Deref(),PDH_FMT_DOUBLE,d,j,c).Val)!=0){k._rej(f);return}for(var g=0;g0){var f=c[0].split(\\":\\")[1];var a=f.split(\\",\\");var e=parseFloat(a[0].split(\\"%\\")[0].trim())+parseFloat(a[1].split(\\"%\\")[0].trim());d._res({total:e,cpus:[]})}else{d._rej(\\"parse error\\")}return(d)}function macos_memUtilization(){var d={};var e=new promise(function(h,g){this._res=h;this._rej=g});var b=require(\\"child_process\\").execFile(\\"/bin/sh\\",[\\"sh\\"]);b.stdout.str=\\"\\";b.stdout.on(\\"data\\",function(g){this.str+=g.toString()});b.stdin.write(\\\'top -l 1 | grep -E \\"^Phys\\"\\\\nexit\\\\n\\\');b.waitExit();var c=b.stdout.str.split(\\"\\\\n\\");if(c[0].length>0){var f=c[0].split(\\":\\")[1];var a=f.split(\\",\\");d.MemTotal=parseInt(a[0].trim().split(\\" \\")[0]);d.MemFree=parseInt(a[1].trim().split(\\" \\")[0]);d.percentFree=((d.MemFree/d.MemTotal)*100);d.percentConsumed=(((d.MemTotal-d.MemFree)/d.MemTotal)*100);return(d)}else{throw (\\"Parse Error\\")}}function windows_thermals(){var c=[];child=require(\\"child_process\\").execFile(process.env.windir+\\"\\\\\\\\System32\\\\\\\\wbem\\\\\\\\wmic.exe\\",[\\"wmic\\",\\"/namespace:\\\\\\\\\\\\\\\\root\\\\\\\\wmi\\",\\"PATH\\",\\"MSAcpi_ThermalZoneTemperature\\",\\"get\\",\\"CurrentTemperature\\"]);child.stdout.str=\\"\\";child.stdout.on(\\"data\\",function(d){this.str+=d.toString()});child.stderr.str=\\"\\";child.stderr.on(\\"data\\",function(d){this.str+=d.toString()});child.waitExit();if(child.stdout.str.trim!=\\"\\"){var b=child.stdout.str.trim().split(\\"\\\\r\\\\n\\");for(var a=1;a1){b.push(f[e].split(\\" \\")[3]);this.parent.kill()}}});a.stderr.str=\\"\\";a.stderr.on(\\"data\\",function(d){this.str+=d.toString()});a.stdin.write(\\"powermetrics -s smc\\\\n\\");a.waitExit(5000)}return(b)}switch(process.platform){case\\"linux\\":module.exports={cpuUtilization:linux_cpuUtilization,memUtilization:linux_memUtilization,thermals:linux_thermals};break;case\\"win32\\":module.exports={cpuUtilization:windows_cpuUtilization,memUtilization:windows_memUtilization,thermals:windows_thermals};break;case\\"darwin\\":module.exports={cpuUtilization:macos_cpuUtilization,memUtilization:macos_memUtilization,thermals:macos_thermals};break};"); addedModules.push("sysinfo"); } catch (e) { }\r\ntry { addModule("util-agentlog", "function parseLine(f){var n=f.match(/^\\\\[.*M\\\\]/);if(n==null){n=f.match(/\\\\[.+ => .+:[0-9]+\\\\]/);if(n!=null){var g=n[0].substring(1).match(/(?!.+ ).+(?=:)/);var j=n[0].match(/(?!:)[0-9]+(?=\\\\]$)/);var h=n[0].match(/(?!\\\\[).+(?= =>)/);if(g!=null){this.results.peek().f=g[0].trim()}if(j!=null){this.results.peek().l=j[0]}if(h!=null){this.results.peek().fn=h[0]}}else{n=f.match(/^[\\\\.\\\\/].+\\\\(\\\\) \\\\[0x[0-9a-fA-F]+\\\\]$/);if(n!=null){n=n[0].match(/(?!\\\\[)0x[0-9a-fA-F]+(?=\\\\]$)/);if(n!=null){if(this.results.peek().sx==null){this.results.peek().sx=[]}this.results.peek().sx.unshift(n[0])}}else{n=f.match(/^\\\\[.+_[0-9a-fA-F]{16}\\\\]$/);if(n!=null){n=n[0].match(/(?!_)[0-9a-fA-F]{16}(?=\\\\]$)/);this.results.peek().h=n[0]}}n=f.match(/(?!^=>)\\\\/+.+:[0-9]+$/);if(n!=null){if(this.results.peek().s==null){this.results.peek().s=[]}this.results.peek().s.unshift(n[0])}}return}n=n[0];var e=n.substring(1,n.length-1);var a=e.split(\\" \\");var m=a[1].split(\\":\\");if(a[2]==\\"PM\\"){m[0]=parseInt(m[0])+12;if(m[0]==24){m[0]=0}}var b=Date.parse(a[0]+\\"T\\"+m.join(\\":\\"));var l=f.substring(n.length).trim();var i=l.match(/^\\\\[[0-9a-fA-F]{16}\\\\]/);if(i!=null){i=i[0].substring(1,i[0].length-1);l=l.substring(i.length+2).trim()}else{i=l.match(/^\\\\[\\\\]/);if(i!=null){l=l.substring(2).trim();i=null}}var k={t:Math.floor(b/1000),m:l};if(i!=null){k.h=i}n=l.match(/^.+:[0-9]+ \\\\([0-9]+,[0-9]+\\\\)/);if(n!=null){k.m=k.m.substring(n[0].length).trim();k.f=n[0].match(/^.+(?=:[0-9]+)/)[0];k.l=n[0].match(/(?!:)[0-9]+(?= \\\\([0-9]+,[0-9]+\\\\)$)/)[0]}this.results.push(k)}function readLog_data(a){var c=a.toString();if(this.buffered!=null){c=this.buffered+c}c=c.split(\\"\\\\n\\");var b;for(b=0;b<(c.length-1);++b){parseLine.call(this,c[b])}if(c.length==1){parseLine.call(this,c[0]);this.buffered=null}else{this.buffered=c[c.length-1]}}function readLogEx(a){var b=[];try{var c=require(\\"fs\\").createReadStream(a);c.buffered=null;c.results=b;c.on(\\"data\\",readLog_data);c.resume();if(c.buffered!=null){readLog_data.call(c,c.buffered);c.buffered=null}c.removeAllListeners(\\"data\\");c=null}catch(d){}return(b)}function readLog(a,e){var d=readLogEx(e==null?(process.execPath.split(\\".exe\\").join(\\"\\")+\\".log\\"):e);var f=[];if(typeof(a)==\\"string\\"){try{var b=Date.parse(a);a=Math.floor(b/1000)}catch(g){}}if(typeof(a)==\\"number\\"){if(a<1000){f=d.slice(d.length-((a>d.length)?d.length:a))}else{var c;for(c=0;c\\"){g=\\"\\"}}if(j.startsWith(\\"Signal level=\\")){f=j.slice(13,j.length-4)}else{if(j.startsWith(\\"Quality=\\")){f=j.slice(8,10);var k=j.slice(11,13)}}}this.parent.parent.emit(\\"accessPoint\\",new AccessPoint(g,e,f))}})}}}}}module.exports=WiFiScanner;"); addedModules.push("wifi-scanner"); } catch (e) { }\r\n/*\r\nCopyright 2018-2021 Intel Corporation\r\n\r\nLicensed under the Apache License, Version 2.0 (the "License");\r\nyou may not use this file except in compliance with the License.\r\nYou may obtain a copy of the License at\r\n\r\n http://www.apache.org/licenses/LICENSE-2.0\r\n\r\nUnless required by applicable law or agreed to in writing, software\r\ndistributed under the License is distributed on an "AS IS" BASIS,\r\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\nSee the License for the specific language governing permissions and\r\nlimitations under the License.\r\n*/\r\n\r\nprocess.on(\'uncaughtException\', function (ex) {\r\n require(\'MeshAgent\').SendCommand({ action: \'msg\', type: \'console\', value: "uncaughtException1: " + ex });\r\n});\r\nif (process.platform == \'win32\' && require(\'user-sessions\').getDomain == null) {\r\n require(\'user-sessions\').getDomain = function getDomain(uid) {\r\n return (this.getSessionAttribute(uid, this.InfoClass.WTSDomainName));\r\n };\r\n}\r\n\r\n// NOTE: This seems to cause big problems, don\'t enable the debugger in the server\'s meshcore. \r\n//attachDebugger({ webport: 9999, wait: 1 }).then(function (prt) { console.log(\'Point Browser for Debug to port: \' + prt); });\r\n\r\n// Mesh Rights\r\nvar MNG_ERROR = 65;\r\nvar MESHRIGHT_EDITMESH = 1;\r\nvar MESHRIGHT_MANAGEUSERS = 2;\r\nvar MESHRIGHT_MANAGECOMPUTERS = 4;\r\nvar MESHRIGHT_REMOTECONTROL = 8;\r\nvar MESHRIGHT_AGENTCONSOLE = 16;\r\nvar MESHRIGHT_SERVERFILES = 32;\r\nvar MESHRIGHT_WAKEDEVICE = 64;\r\nvar MESHRIGHT_SETNOTES = 128;\r\nvar MESHRIGHT_REMOTEVIEW = 256;\r\nvar MESHRIGHT_NOTERMINAL = 512;\r\nvar MESHRIGHT_NOFILES = 1024;\r\nvar MESHRIGHT_NOAMT = 2048;\r\nvar MESHRIGHT_LIMITEDINPUT = 4096;\r\nvar MESHRIGHT_LIMITEVENTS = 8192;\r\nvar MESHRIGHT_CHATNOTIFY = 16384;\r\nvar MESHRIGHT_UNINSTALL = 32768;\r\nvar MESHRIGHT_NODESKTOP = 65536;\r\n\r\nif (require(\'MeshAgent\').ARCHID == null) {\r\n var id = null;\r\n switch (process.platform) {\r\n case \'win32\':\r\n id = require(\'_GenericMarshal\').PointerSize == 4 ? 3 : 4;\r\n break;\r\n case \'freebsd\':\r\n id = require(\'_GenericMarshal\').PointerSize == 4 ? 31 : 30;\r\n break;\r\n case \'darwin\':\r\n try {\r\n id = require(\'os\').arch() == \'x64\' ? 16 : 29;\r\n }\r\n catch (xx) {\r\n id = 16;\r\n }\r\n break; break;\r\n }\r\n if (id != null) { Object.defineProperty(require(\'MeshAgent\'), \'ARCHID\', { value: id }); }\r\n}\r\n\r\nvar obj = {};\r\nvar agentFileHttpRequests = {}; // Currently active agent HTTPS GET requests from the server.\r\nvar agentFileHttpPendingRequests = []; // Pending HTTPS GET requests from the server.\r\nvar debugConsole = (_MSH().debugConsole == 1);\r\n\r\nif (process.platform == \'win32\' && require(\'user-sessions\').isRoot()) {\r\n // Check the Agent Uninstall MetaData for correctness, as the installer may have written an incorrect value\r\n try {\r\n var writtenSize = 0, actualSize = Math.floor(require(\'fs\').statSync(process.execPath).size / 1024);\r\n try { writtenSize = require(\'win-registry\').QueryKey(require(\'win-registry\').HKEY.LocalMachine, \'Software\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\Uninstall\\\\MeshCentralAgent\', \'EstimatedSize\'); } catch (e) { }\r\n if (writtenSize != actualSize) { try { require(\'win-registry\').WriteKey(require(\'win-registry\').HKEY.LocalMachine, \'Software\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\Uninstall\\\\MeshCentralAgent\', \'EstimatedSize\', actualSize); } catch (e) { } }\r\n } catch (x) { }\r\n\r\n // Check to see if we are the Installed Mesh Agent Service, if we are, make sure we can run in Safe Mode\r\n var svcname = process.platform == \'win32\' ? \'Mesh Agent\' : \'meshagent\';\r\n try {\r\n svcname = require(\'MeshAgent\').serviceName;\r\n }\r\n catch (x) {\r\n }\r\n\r\n try {\r\n var meshCheck = false;\r\n try { meshCheck = require(\'service-manager\').manager.getService(svcname).isMe(); } catch (e) { }\r\n if (meshCheck && require(\'win-bcd\').isSafeModeService && !require(\'win-bcd\').isSafeModeService(svcname)) { require(\'win-bcd\').enableSafeModeService(svcname); }\r\n } catch (e) { }\r\n}\r\n\r\nif (process.platform == \'darwin\' && !process.versions) {\r\n // This is an older MacOS Agent, so we\'ll need to check the service definition so that Auto-Update will function correctly\r\n var child = require(\'child_process\').execFile(\'/bin/sh\', [\'sh\']);\r\n child.stdout.str = \'\';\r\n child.stdout.on(\'data\', function (chunk) { this.str += chunk.toString(); });\r\n child.stdin.write("cat /Library/LaunchDaemons/meshagent_osx64_LaunchDaemon.plist | tr \'\\n\' \'\\.\' | awk \'{split($0, a, \\"KeepAlive\\"); split(a[2], b, \\"<\\"); split(b[2], c, \\">\\"); ");\r\n child.stdin.write(" if(c[1]==\\"dict\\"){ split(a[2], d, \\"\\"); if(split(d[1], truval, \\"\\")>1) { split(truval[1], kn1, \\"\\"); split(kn1[2], kn2, \\"\\"); print kn2[1]; } }");\r\n child.stdin.write(" else { split(c[1], ka, \\"/\\"); if(ka[1]==\\"true\\") {print \\"ALWAYS\\";} } }\'\\nexit\\n");\r\n child.waitExit();\r\n if (child.stdout.str.trim() == \'Crashed\') {\r\n child = require(\'child_process\').execFile(\'/bin/sh\', [\'sh\']);\r\n child.stdout.str = \'\';\r\n child.stdout.on(\'data\', function (chunk) { this.str += chunk.toString(); });\r\n child.stdin.write("launchctl list | grep \'meshagent\' | awk \'{ if($3==\\"meshagent\\"){print $1;}}\'\\nexit\\n");\r\n child.waitExit();\r\n\r\n if (parseInt(child.stdout.str.trim()) == process.pid) {\r\n // The currently running MeshAgent is us, so we can continue with the update\r\n var plist = require(\'fs\').readFileSync(\'/Library/LaunchDaemons/meshagent_osx64_LaunchDaemon.plist\').toString();\r\n var tokens = plist.split(\'KeepAlive\');\r\n if (tokens[1].split(\'>\')[0].split(\'<\')[1] == \'dict\') {\r\n var tmp = tokens[1].split(\'\');\r\n tmp.shift();\r\n tokens[1] = \'\\n \' + tmp.join(\'\');\r\n tokens = tokens.join(\'KeepAlive\');\r\n\r\n require(\'fs\').writeFileSync(\'/Library/LaunchDaemons/meshagent_osx64_LaunchDaemon.plist\', tokens);\r\n\r\n var fix = \'\';\r\n fix += ("function macosRepair()\\n");\r\n fix += ("{\\n");\r\n fix += (" var child = require(\'child_process\').execFile(\'/bin/sh\', [\'sh\']);\\n");\r\n fix += (" child.stdout.str = \'\';\\n");\r\n fix += (" child.stdout.on(\'data\', function (chunk) { this.str += chunk.toString(); });\\n");\r\n fix += (" child.stderr.on(\'data\', function (chunk) { });\\n");\r\n fix += (" child.stdin.write(\'launchctl unload /Library/LaunchDaemons/meshagent_osx64_LaunchDaemon.plist\\\\n\');\\n");\r\n fix += (" child.stdin.write(\'launchctl load /Library/LaunchDaemons/meshagent_osx64_LaunchDaemon.plist\\\\n\');\\n");\r\n fix += (" child.stdin.write(\'rm /Library/LaunchDaemons/meshagentRepair.plist\\\\n\');\\n");\r\n fix += (" child.stdin.write(\'rm " + process.cwd() + "/macosRepair.js\\\\n\');\\n");\r\n fix += (" child.stdin.write(\'launchctl stop meshagentRepair\\\\nexit\\\\n\');\\n");\r\n fix += (" child.waitExit();\\n");\r\n fix += ("}\\n");\r\n fix += ("macosRepair();\\n");\r\n fix += ("process.exit();\\n");\r\n require(\'fs\').writeFileSync(process.cwd() + \'/macosRepair.js\', fix);\r\n\r\n var plist = \'\\n\';\r\n plist += \'\\n\';\r\n plist += \'\\n\';\r\n plist += \' \\n\';\r\n plist += \' Label\\n\';\r\n plist += (\' meshagentRepair\\n\');\r\n plist += \' ProgramArguments\\n\';\r\n plist += \' \\n\';\r\n plist += (\' \' + process.execPath + \'\\n\');\r\n plist += \' macosRepair.js\\n\';\r\n plist += \' \\n\';\r\n plist += \' WorkingDirectory\\n\';\r\n plist += (\' \' + process.cwd() + \'\\n\');\r\n plist += \' RunAtLoad\\n\';\r\n plist += \' \\n\';\r\n plist += \' \\n\';\r\n plist += \'\';\r\n require(\'fs\').writeFileSync(\'/Library/LaunchDaemons/meshagentRepair.plist\', plist);\r\n\r\n child = require(\'child_process\').execFile(\'/bin/sh\', [\'sh\']);\r\n child.stdout.str = \'\';\r\n child.stdout.on(\'data\', function (chunk) { this.str += chunk.toString(); });\r\n child.stdin.write("launchctl load /Library/LaunchDaemons/meshagentRepair.plist\\nexit\\n");\r\n child.waitExit();\r\n }\r\n }\r\n }\r\n}\r\n\r\n// Add an Intel AMT event to the log\r\nfunction addAmtEvent(msg) {\r\n if (obj.amtevents == null) { obj.amtevents = []; }\r\n var d = new Date();\r\n obj.amtevents.push(zeroPad(d.getHours(), 2) + \':\' + zeroPad(d.getMinutes(), 2) + \':\' + zeroPad(d.getSeconds(), 2) + \', \' + msg);\r\n if (obj.amtevents.length > 100) { obj.amtevents.splice(0, obj.amtevents.length - 100); }\r\n}\r\nfunction zeroPad(num, size) { var s = \'000000000\' + num; return s.substr(s.length - size); }\r\n\r\n\r\n// Create Secure IPC for Diagnostic Agent Communications\r\nobj.DAIPC = require(\'net\').createServer();\r\nif (process.platform != \'win32\') { try { require(\'fs\').unlinkSync(process.cwd() + \'/DAIPC\'); } catch (e) { } }\r\nobj.DAIPC.IPCPATH = process.platform == \'win32\' ? (\'\\\\\\\\.\\\\pipe\\\\\' + require(\'_agentNodeId\')() + \'-DAIPC\') : (process.cwd() + \'/DAIPC\');\r\ntry { obj.DAIPC.listen({ path: obj.DAIPC.IPCPATH, writableAll: true, maxConnections: 5 }); } catch (e) { }\r\nobj.DAIPC._daipc = [];\r\nobj.DAIPC.on(\'connection\', function (c) {\r\n c._send = function (j) {\r\n var data = JSON.stringify(j);\r\n var packet = Buffer.alloc(data.length + 4);\r\n packet.writeUInt32LE(data.length + 4, 0);\r\n Buffer.from(data).copy(packet, 4);\r\n this.write(packet);\r\n };\r\n this._daipc.push(c);\r\n c.parent = this;\r\n c.on(\'end\', function () { removeRegisteredApp(this); });\r\n c.on(\'data\', function (chunk) {\r\n if (chunk.length < 4) { this.unshift(chunk); return; }\r\n var len = chunk.readUInt32LE(0);\r\n if (len > 8192) { removeRegisteredApp(this); this.end(); return; }\r\n if (chunk.length < len) { this.unshift(chunk); return; }\r\n\r\n var data = chunk.slice(4, len);\r\n try { data = JSON.parse(data.toString()); } catch (e) { }\r\n if ((data == null) || (typeof data.cmd != \'string\')) return;\r\n\r\n try {\r\n switch (data.cmd) {\r\n case \'requesthelp\':\r\n if (this._registered == null) return;\r\n sendConsoleText(\'Request Help (\' + this._registered + \'): \' + data.value);\r\n var help = {};\r\n help[this._registered] = data.value;\r\n try { mesh.SendCommand({ action: \'sessions\', type: \'help\', value: help }); } catch (e) { }\r\n MeshServerLogEx(98, [this._registered, data.value], "Help Requested, user: " + this._registered + ", details: " + data.value, null);\r\n break;\r\n case \'cancelhelp\':\r\n if (this._registered == null) return;\r\n sendConsoleText(\'Cancel Help (\' + this._registered + \')\');\r\n try { mesh.SendCommand({ action: \'sessions\', type: \'help\', value: {} }); } catch (e) { }\r\n break;\r\n case \'register\':\r\n if (typeof data.value == \'string\') {\r\n this._registered = data.value;\r\n var apps = {};\r\n apps[data.value] = 1;\r\n try { mesh.SendCommand({ action: \'sessions\', type: \'app\', value: apps }); } catch (e) { }\r\n this._send({ cmd: \'serverstate\', value: meshServerConnectionState, url: require(\'MeshAgent\').ConnectedServer, amt: (amt != null) });\r\n }\r\n break;\r\n case \'query\':\r\n switch (data.value) {\r\n case \'connection\':\r\n data.result = require(\'MeshAgent\').ConnectedServer;\r\n this._send(data);\r\n break;\r\n case \'descriptors\':\r\n require(\'ChainViewer\').getSnapshot().then(function (f) {\r\n this.tag.payload.result = f;\r\n this.tag.ipc._send(this.tag.payload);\r\n }).parentPromise.tag = { ipc: this, payload: data };\r\n break;\r\n case \'timerinfo\':\r\n data.result = require(\'ChainViewer\').getTimerInfo();\r\n this._send(data);\r\n break;\r\n }\r\n break;\r\n case \'amtstate\':\r\n if (amt == null) return;\r\n var func = function amtStateFunc(state) { if (state != null) { amtStateFunc.pipe._send({ cmd: \'amtstate\', value: state }); } }\r\n func.pipe = this;\r\n amt.getMeiState(11, func);\r\n break;\r\n case \'sessions\':\r\n this._send({ cmd: \'sessions\', sessions: tunnelUserCount });\r\n break;\r\n case \'meshToolInfo\':\r\n try { mesh.SendCommand({ action: \'meshToolInfo\', name: data.name, hash: data.hash, cookie: data.cookie ? true : false, pipe: true }); } catch (e) { }\r\n break;\r\n case \'console\':\r\n if (debugConsole) {\r\n var args = splitArgs(data.value);\r\n processConsoleCommand(args[0].toLowerCase(), parseArgs(args), 0, \'pipe\');\r\n }\r\n break;\r\n }\r\n }\r\n catch (e) { removeRegisteredApp(this); this.end(); return; }\r\n });\r\n});\r\n\r\n// Send current sessions to registered apps\r\nfunction broadcastSessionsToRegisteredApps(x) {\r\n broadcastToRegisteredApps({ cmd: \'sessions\', sessions: tunnelUserCount });\r\n}\r\n\r\n// Send this object to all registered local applications\r\nfunction broadcastToRegisteredApps(x) {\r\n if ((obj.DAIPC == null) || (obj.DAIPC._daipc == null)) return;\r\n for (var i in obj.DAIPC._daipc) { if (obj.DAIPC._daipc[i]._registered != null) { obj.DAIPC._daipc[i]._send(x); } }\r\n}\r\n\r\n// Send this object to a specific registered local applications\r\nfunction sendToRegisteredApp(appid, x) {\r\n if ((obj.DAIPC == null) || (obj.DAIPC._daipc == null)) return;\r\n for (var i in obj.DAIPC._daipc) { if (obj.DAIPC._daipc[i]._registered == appid) { obj.DAIPC._daipc[i]._send(x); } }\r\n}\r\n\r\n// Send list of registered apps to the server\r\nfunction updateRegisteredAppsToServer() {\r\n if ((obj.DAIPC == null) || (obj.DAIPC._daipc == null)) return;\r\n var apps = {};\r\n for (var i in obj.DAIPC._daipc) { if (apps[obj.DAIPC._daipc[i]._registered] == null) { apps[obj.DAIPC._daipc[i]._registered] = 1; } else { apps[obj.DAIPC._daipc[i]._registered]++; } }\r\n try { mesh.SendCommand({ action: \'sessions\', type: \'app\', value: apps }); } catch (e) { }\r\n}\r\n\r\n// Remove a registered app\r\nfunction removeRegisteredApp(pipe) {\r\n for (var i = obj.DAIPC._daipc.length - 1; i >= 0; i--) { if (obj.DAIPC._daipc[i] === pipe) { obj.DAIPC._daipc.splice(i, 1); } }\r\n if (pipe._registered != null) updateRegisteredAppsToServer();\r\n}\r\n\r\nfunction diagnosticAgent_uninstall() {\r\n require(\'service-manager\').manager.uninstallService(\'meshagentDiagnostic\');\r\n require(\'task-scheduler\').delete(\'meshagentDiagnostic/periodicStart\');\r\n}\r\nfunction diagnosticAgent_installCheck(install) {\r\n try {\r\n var diag = require(\'service-manager\').manager.getService(\'meshagentDiagnostic\');\r\n return (diag);\r\n }\r\n catch (e) {\r\n }\r\n if (!install) { return (null); }\r\n\r\n var svc = null;\r\n try {\r\n require(\'service-manager\').manager.installService(\r\n {\r\n name: \'meshagentDiagnostic\',\r\n displayName: "Mesh Agent Diagnostic Service",\r\n description: "Mesh Agent Diagnostic Service",\r\n servicePath: process.execPath,\r\n parameters: [\'-recovery\']\r\n //files: [{ newName: \'diagnostic.js\', _buffer: Buffer.from(\'LyoNCkNvcHlyaWdodCAyMDE5IEludGVsIENvcnBvcmF0aW9uDQoNCkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQoNCiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCg0KVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQoqLw0KDQp2YXIgaG9zdCA9IHJlcXVpcmUoJ3NlcnZpY2UtaG9zdCcpLmNyZWF0ZSgnbWVzaGFnZW50RGlhZ25vc3RpYycpOw0KdmFyIFJlY292ZXJ5QWdlbnQgPSByZXF1aXJlKCdNZXNoQWdlbnQnKTsNCg0KaG9zdC5vbignc2VydmljZVN0YXJ0JywgZnVuY3Rpb24gKCkNCnsNCiAgICBjb25zb2xlLnNldERlc3RpbmF0aW9uKGNvbnNvbGUuRGVzdGluYXRpb25zLkxPR0ZJTEUpOw0KICAgIGhvc3Quc3RvcCA9IGZ1bmN0aW9uKCkNCiAgICB7DQogICAgICAgIHJlcXVpcmUoJ3NlcnZpY2UtbWFuYWdlcicpLm1hbmFnZXIuZ2V0U2VydmljZSgnbWVzaGFnZW50RGlhZ25vc3RpYycpLnN0b3AoKTsNCiAgICB9DQogICAgUmVjb3ZlcnlBZ2VudC5vbignQ29ubmVjdGVkJywgZnVuY3Rpb24gKHN0YXR1cykNCiAgICB7DQogICAgICAgIGlmIChzdGF0dXMgPT0gMCkNCiAgICAgICAgew0KICAgICAgICAgICAgY29uc29sZS5sb2coJ0RpYWdub3N0aWMgQWdlbnQ6IFNlcnZlciBjb25uZWN0aW9uIGxvc3QuLi4nKTsNCiAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgfQ0KICAgICAgICBjb25zb2xlLmxvZygnRGlhZ25vc3RpYyBBZ2VudDogQ29ubmVjdGlvbiBFc3RhYmxpc2hlZCB3aXRoIFNlcnZlcicpOw0KICAgICAgICBzdGFydCgpOw0KICAgIH0pOw0KfSk7DQpob3N0Lm9uKCdub3JtYWxTdGFydCcsIGZ1bmN0aW9uICgpDQp7DQogICAgaG9zdC5zdG9wID0gZnVuY3Rpb24gKCkNCiAgICB7DQogICAgICAgIHByb2Nlc3MuZXhpdCgpOw0KICAgIH0NCiAgICBjb25zb2xlLmxvZygnTm9uIFNlcnZpY2UgTW9kZScpOw0KICAgIFJlY292ZXJ5QWdlbnQub24oJ0Nvbm5lY3RlZCcsIGZ1bmN0aW9uIChzdGF0dXMpDQogICAgew0KICAgICAgICBpZiAoc3RhdHVzID09IDApDQogICAgICAgIHsNCiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdEaWFnbm9zdGljIEFnZW50OiBTZXJ2ZXIgY29ubmVjdGlvbiBsb3N0Li4uJyk7DQogICAgICAgICAgICByZXR1cm47DQogICAgICAgIH0NCiAgICAgICAgY29uc29sZS5sb2coJ0RpYWdub3N0aWMgQWdlbnQ6IENvbm5lY3Rpb24gRXN0YWJsaXNoZWQgd2l0aCBTZXJ2ZXInKTsNCiAgICAgICAgc3RhcnQoKTsNCiAgICB9KTsNCn0pOw0KaG9zdC5vbignc2VydmljZVN0b3AnLCBmdW5jdGlvbiAoKSB7IHByb2Nlc3MuZXhpdCgpOyB9KTsNCmhvc3QucnVuKCk7DQoNCg0KZnVuY3Rpb24gc3RhcnQoKQ0Kew0KDQp9Ow0K\', \'base64\') }]\r\n });\r\n svc = require(\'service-manager\').manager.getService(\'meshagentDiagnostic\');\r\n }\r\n catch (e) {\r\n return (null);\r\n }\r\n var proxyConfig = require(\'global-tunnel\').proxyConfig;\r\n var cert = require(\'MeshAgent\').GenerateAgentCertificate(\'CN=MeshNodeDiagnosticCertificate\');\r\n var nodeid = require(\'tls\').loadCertificate(cert.root).getKeyHash().toString(\'base64\');\r\n ddb = require(\'SimpleDataStore\').Create(svc.appWorkingDirectory().replace(\'\\\\\', \'/\') + \'/meshagentDiagnostic.db\');\r\n ddb.Put(\'disableUpdate\', \'1\');\r\n ddb.Put(\'MeshID\', Buffer.from(require(\'MeshAgent\').ServerInfo.MeshID, \'hex\'));\r\n ddb.Put(\'ServerID\', require(\'MeshAgent\').ServerInfo.ServerID);\r\n ddb.Put(\'MeshServer\', require(\'MeshAgent\').ServerInfo.ServerUri);\r\n if (cert.root.pfx) { ddb.Put(\'SelfNodeCert\', cert.root.pfx); }\r\n if (cert.tls) { ddb.Put(\'SelfNodeTlsCert\', cert.tls.pfx); }\r\n if (proxyConfig) {\r\n ddb.Put(\'WebProxy\', proxyConfig.host + \':\' + proxyConfig.port);\r\n }\r\n else {\r\n ddb.Put(\'ignoreProxyFile\', \'1\');\r\n }\r\n\r\n require(\'MeshAgent\').SendCommand({ action: \'diagnostic\', value: { command: \'register\', value: nodeid } });\r\n require(\'MeshAgent\').SendCommand({ action: \'msg\', type: \'console\', value: "Diagnostic Agent Registered [" + nodeid.length + "/" + nodeid + "]" });\r\n\r\n delete ddb;\r\n\r\n // Set a recurrent task, to run the Diagnostic Agent every 2 days\r\n require(\'task-scheduler\').create({ name: \'meshagentDiagnostic/periodicStart\', daily: 2, time: require(\'tls\').generateRandomInteger(\'0\', \'23\') + \':\' + require(\'tls\').generateRandomInteger(\'0\', \'59\').padStart(2, \'0\'), service: \'meshagentDiagnostic\' });\r\n //require(\'task-scheduler\').create({ name: \'meshagentDiagnostic/periodicStart\', daily: \'1\', time: \'17:16\', service: \'meshagentDiagnostic\' });\r\n\r\n return (svc);\r\n}\r\n\r\n// Monitor the file \'batterystate.txt\' in the agent\'s folder and sends battery update when this file is changed.\r\nif ((require(\'fs\').existsSync(process.cwd() + \'batterystate.txt\')) && (require(\'fs\').watch != null)) {\r\n // Setup manual battery monitoring\r\n require(\'MeshAgent\')._batteryFileWatcher = require(\'fs\').watch(process.cwd(), function () {\r\n if (require(\'MeshAgent\')._batteryFileTimer != null) return;\r\n require(\'MeshAgent\')._batteryFileTimer = setTimeout(function () {\r\n try {\r\n require(\'MeshAgent\')._batteryFileTimer = null;\r\n var data = null;\r\n try { data = require(\'fs\').readFileSync(process.cwd() + \'batterystate.txt\').toString(); } catch (e) { }\r\n if ((data != null) && (data.length < 10)) {\r\n data = data.split(\',\');\r\n if ((data.length == 2) && ((data[0] == \'ac\') || (data[0] == \'dc\'))) {\r\n var level = parseInt(data[1]);\r\n if ((level >= 0) && (level <= 100)) { require(\'MeshAgent\').SendCommand({ action: \'battery\', state: data[0], level: level }); }\r\n }\r\n }\r\n } catch (e) { }\r\n }, 1000);\r\n });\r\n}\r\nelse {\r\n // Setup normal battery monitoring\r\n if (require(\'identifiers\').isBatteryPowered && require(\'identifiers\').isBatteryPowered()) {\r\n require(\'MeshAgent\')._battLevelChanged = function _battLevelChanged(val) {\r\n _battLevelChanged.self._currentBatteryLevel = val;\r\n _battLevelChanged.self.SendCommand({ action: \'battery\', state: _battLevelChanged.self._currentPowerState, level: val });\r\n };\r\n require(\'MeshAgent\')._battLevelChanged.self = require(\'MeshAgent\');\r\n require(\'MeshAgent\')._powerChanged = function _powerChanged(val) {\r\n _powerChanged.self._currentPowerState = (val == \'AC\' ? \'ac\' : \'dc\');\r\n _powerChanged.self.SendCommand({ action: \'battery\', state: (val == \'AC\' ? \'ac\' : \'dc\'), level: _powerChanged.self._currentBatteryLevel });\r\n };\r\n require(\'MeshAgent\')._powerChanged.self = require(\'MeshAgent\');\r\n require(\'MeshAgent\').on(\'Connected\', function (status) {\r\n if (status == 0) {\r\n require(\'power-monitor\').removeListener(\'acdc\', this._powerChanged);\r\n require(\'power-monitor\').removeListener(\'batteryLevel\', this._battLevelChanged);\r\n } else {\r\n require(\'power-monitor\').on(\'acdc\', this._powerChanged);\r\n require(\'power-monitor\').on(\'batteryLevel\', this._battLevelChanged);\r\n }\r\n });\r\n }\r\n}\r\n\r\n\r\n// MeshAgent JavaScript Core Module. This code is sent to and running on the mesh agent.\r\nvar meshCoreObj = { action: \'coreinfo\', value: (require(\'MeshAgent\').coreHash ? (\'MeshCore CRC-\' + crc32c(require(\'MeshAgent\').coreHash)) : (\'MeshCore v6\')), caps: 14, root: require(\'user-sessions\').isRoot() }; // Capability bitmask: 1 = Desktop, 2 = Terminal, 4 = Files, 8 = Console, 16 = JavaScript, 32 = Temporary Agent, 64 = Recovery Agent\r\n\r\n// Get the operating system description string\r\ntry { require(\'os\').name().then(function (v) { meshCoreObj.osdesc = v; meshCoreObjChanged(); }); } catch (e) { }\r\n\r\n\r\n// Setup logged in user monitoring (THIS IS BROKEN IN WIN7)\r\ntry {\r\n var userSession = require(\'user-sessions\');\r\n userSession.on(\'changed\', function onUserSessionChanged() {\r\n userSession.enumerateUsers().then(function (users) {\r\n if (process.platform == \'linux\') {\r\n if (userSession._startTime == null) {\r\n userSession._startTime = Date.now();\r\n userSession._count = users.length;\r\n }\r\n else if (Date.now() - userSession._startTime < 10000 && users.length == userSession._count) {\r\n userSession.removeAllListeners(\'changed\');\r\n return;\r\n }\r\n }\r\n\r\n var u = [], a = users.Active;\r\n for (var i = 0; i < a.length; i++) {\r\n var un = a[i].Domain ? (a[i].Domain + \'\\\\\' + a[i].Username) : (a[i].Username);\r\n if (u.indexOf(un) == -1) { u.push(un); } // Only push users in the list once.\r\n }\r\n meshCoreObj.users = u;\r\n meshCoreObjChanged();\r\n });\r\n });\r\n userSession.emit(\'changed\');\r\n //userSession.on(\'locked\', function (user) { sendConsoleText(\'[\' + (user.Domain ? user.Domain + \'\\\\\' : \'\') + user.Username + \'] has LOCKED the desktop\'); });\r\n //userSession.on(\'unlocked\', function (user) { sendConsoleText(\'[\' + (user.Domain ? user.Domain + \'\\\\\' : \'\') + user.Username + \'] has UNLOCKED the desktop\'); });\r\n} catch (e) { }\r\n\r\nvar meshServerConnectionState = 0;\r\nvar tunnels = {};\r\nvar lastNetworkInfo = null;\r\nvar lastPublicLocationInfo = null;\r\nvar selfInfoUpdateTimer = null;\r\nvar http = require(\'http\');\r\nvar net = require(\'net\');\r\nvar fs = require(\'fs\');\r\nvar rtc = require(\'ILibWebRTC\');\r\nvar amt = null;\r\nvar processManager = require(\'process-manager\');\r\nvar wifiScannerLib = null;\r\nvar wifiScanner = null;\r\nvar networkMonitor = null;\r\nvar nextTunnelIndex = 1;\r\nvar apftunnel = null;\r\nvar tunnelUserCount = { terminal: {}, files: {}, tcp: {}, udp: {}, msg: {} }; // List of userid->count sessions for terminal, files and TCP/UDP routing\r\n\r\n// Add to the server event log\r\nfunction MeshServerLog(msg, state) {\r\n if (typeof msg == \'string\') { msg = { action: \'log\', msg: msg }; } else { msg.action = \'log\'; }\r\n if (state) {\r\n if (state.userid) { msg.userid = state.userid; }\r\n if (state.username) { msg.username = state.username; }\r\n if (state.sessionid) { msg.sessionid = state.sessionid; }\r\n if (state.remoteaddr) { msg.remoteaddr = state.remoteaddr; }\r\n }\r\n mesh.SendCommand(msg);\r\n}\r\n\r\n// Add to the server event log, use internationalized events\r\nfunction MeshServerLogEx(id, args, msg, state) {\r\n var msg = { action: \'log\', msgid: id, msgArgs: args, msg: msg };\r\n if (state) {\r\n if (state.userid) { msg.userid = state.userid; }\r\n if (state.username) { msg.username = state.username; }\r\n if (state.sessionid) { msg.sessionid = state.sessionid; }\r\n if (state.remoteaddr) { msg.remoteaddr = state.remoteaddr; }\r\n }\r\n mesh.SendCommand(msg);\r\n}\r\n\r\n// Import libraries\r\ndb = require(\'SimpleDataStore\').Shared();\r\nsha = require(\'SHA256Stream\');\r\nmesh = require(\'MeshAgent\');\r\nchildProcess = require(\'child_process\');\r\n\r\nif (mesh.hasKVM == 1) { // if the agent is compiled with KVM support\r\n // Check if this computer supports a desktop\r\n try {\r\n if ((process.platform == \'win32\') || (process.platform == \'darwin\') || (require(\'monitor-info\').kvm_x11_support)) {\r\n meshCoreObj.caps |= 1; meshCoreObjChanged();\r\n } else if (process.platform == \'linux\' || process.platform == \'freebsd\') {\r\n require(\'monitor-info\').on(\'kvmSupportDetected\', function (value) { meshCoreObj.caps |= 1; meshCoreObjChanged(); });\r\n }\r\n } catch (e) { }\r\n}\r\nmesh.DAIPC = obj.DAIPC;\r\n\r\n/*\r\n// Try to load up the network monitor\r\ntry {\r\n networkMonitor = require(\'NetworkMonitor\');\r\n networkMonitor.on(\'change\', function () { sendNetworkUpdateNagle(); });\r\n networkMonitor.on(\'add\', function (addr) { sendNetworkUpdateNagle(); });\r\n networkMonitor.on(\'remove\', function (addr) { sendNetworkUpdateNagle(); });\r\n} catch (e) { networkMonitor = null; }\r\n*/\r\n\r\n// Fetch the SMBios Tables\r\nvar SMBiosTables = null;\r\nvar SMBiosTablesRaw = null;\r\ntry {\r\n var SMBiosModule = null;\r\n try { SMBiosModule = require(\'smbios\'); } catch (e) { }\r\n if (SMBiosModule != null) {\r\n SMBiosModule.get(function (data) {\r\n if (data != null) {\r\n SMBiosTablesRaw = data;\r\n SMBiosTables = require(\'smbios\').parse(data)\r\n if (mesh.isControlChannelConnected) { mesh.SendCommand({ action: \'smbios\', value: SMBiosTablesRaw }); }\r\n\r\n // If SMBios tables say that Intel AMT is present, try to connect MEI\r\n if (SMBiosTables.amtInfo && (SMBiosTables.amtInfo.AMT == true)) {\r\n var amtmodule = require(\'amt-manage\');\r\n amt = new amtmodule(mesh, db, false);\r\n amt.on(\'portBinding_LMS\', function (map) { mesh.SendCommand({ action: \'lmsinfo\', value: { ports: map.keys() } }); });\r\n amt.on(\'stateChange_LMS\', function (v) { if (!meshCoreObj.intelamt) { meshCoreObj.intelamt = {}; } meshCoreObj.intelamt.microlms = v; meshCoreObjChanged(); }); // 0 = Disabled, 1 = Connecting, 2 = Connected\r\n amt.onStateChange = function (state) { if (state == 2) { sendPeriodicServerUpdate(1); } } // MEI State\r\n amt.reset();\r\n }\r\n }\r\n });\r\n }\r\n} catch (e) { sendConsoleText("ex1: " + e); }\r\n\r\n// Try to load up the WIFI scanner\r\ntry {\r\n var wifiScannerLib = require(\'wifi-scanner\');\r\n wifiScanner = new wifiScannerLib();\r\n wifiScanner.on(\'accessPoint\', function (data) { sendConsoleText("wifiScanner: " + data); });\r\n} catch (e) { wifiScannerLib = null; wifiScanner = null; }\r\n\r\n// Get our location (lat/long) using our public IP address\r\nvar getIpLocationDataExInProgress = false;\r\nvar getIpLocationDataExCounts = [0, 0];\r\nfunction getIpLocationDataEx(func) {\r\n if (getIpLocationDataExInProgress == true) { return false; }\r\n try {\r\n getIpLocationDataExInProgress = true;\r\n getIpLocationDataExCounts[0]++;\r\n var options = http.parseUri("http://ipinfo.io/json");\r\n options.method = \'GET\';\r\n http.request(options, function (resp) {\r\n if (resp.statusCode == 200) {\r\n var geoData = \'\';\r\n resp.data = function (geoipdata) { geoData += geoipdata; };\r\n resp.end = function () {\r\n var location = null;\r\n try {\r\n if (typeof geoData == \'string\') {\r\n var result = JSON.parse(geoData);\r\n if (result.ip && result.loc) { location = result; }\r\n }\r\n } catch (e) { }\r\n if (func) { getIpLocationDataExCounts[1]++; func(location); }\r\n }\r\n } else\r\n { func(null); }\r\n getIpLocationDataExInProgress = false;\r\n }).end();\r\n return true;\r\n }\r\n catch (e) { return false; }\r\n}\r\n\r\n// Remove all Gateway MAC addresses for interface list. This is useful because the gateway MAC is not always populated reliably.\r\nfunction clearGatewayMac(str) {\r\n if (typeof str != \'string\') return null;\r\n var x = JSON.parse(str);\r\n for (var i in x.netif) { try { if (x.netif[i].gatewaymac) { delete x.netif[i].gatewaymac } } catch (ex) { } }\r\n return JSON.stringify(x);\r\n}\r\n\r\nfunction getIpLocationData(func) {\r\n // Get the location information for the cache if possible\r\n var publicLocationInfo = db.Get(\'publicLocationInfo\');\r\n if (publicLocationInfo != null) { publicLocationInfo = JSON.parse(publicLocationInfo); }\r\n if (publicLocationInfo == null) {\r\n // Nothing in the cache, fetch the data\r\n getIpLocationDataEx(function (locationData) {\r\n if (locationData != null) {\r\n publicLocationInfo = {};\r\n publicLocationInfo.netInfoStr = lastNetworkInfo;\r\n publicLocationInfo.locationData = locationData;\r\n var x = db.Put(\'publicLocationInfo\', JSON.stringify(publicLocationInfo)); // Save to database\r\n if (func) func(locationData); // Report the new location\r\n }\r\n else {\r\n if (func) func(null); // Report no location\r\n }\r\n });\r\n }\r\n else {\r\n // Check the cache\r\n if (clearGatewayMac(publicLocationInfo.netInfoStr) == clearGatewayMac(lastNetworkInfo)) {\r\n // Cache match\r\n if (func) func(publicLocationInfo.locationData);\r\n }\r\n else {\r\n // Cache mismatch\r\n getIpLocationDataEx(function (locationData) {\r\n if (locationData != null) {\r\n publicLocationInfo = {};\r\n publicLocationInfo.netInfoStr = lastNetworkInfo;\r\n publicLocationInfo.locationData = locationData;\r\n var x = db.Put(\'publicLocationInfo\', JSON.stringify(publicLocationInfo)); // Save to database\r\n if (func) func(locationData); // Report the new location\r\n }\r\n else {\r\n if (func) func(publicLocationInfo.locationData); // Can\'t get new location, report the old location\r\n }\r\n });\r\n }\r\n }\r\n}\r\n\r\n// Polyfill String.endsWith\r\nif (!String.prototype.endsWith) {\r\n String.prototype.endsWith = function (searchString, position) {\r\n var subjectString = this.toString();\r\n if (typeof position !== \'number\' || !isFinite(position) || Math.floor(position) !== position || position > subjectString.length) { position = subjectString.length; }\r\n position -= searchString.length;\r\n var lastIndex = subjectString.lastIndexOf(searchString, position);\r\n return lastIndex !== -1 && lastIndex === position;\r\n };\r\n}\r\n\r\n// Polyfill path.join\r\nobj.path =\r\n {\r\n join: function () {\r\n var x = [];\r\n for (var i in arguments) {\r\n var w = arguments[i];\r\n if (w != null) {\r\n while (w.endsWith(\'/\') || w.endsWith(\'\\\\\')) { w = w.substring(0, w.length - 1); }\r\n if (i != 0) {\r\n while (w.startsWith(\'/\') || w.startsWith(\'\\\\\')) { w = w.substring(1); }\r\n }\r\n x.push(w);\r\n }\r\n }\r\n if (x.length == 0) return \'/\';\r\n return x.join(\'/\');\r\n }\r\n };\r\n\r\n// Replace a string with a number if the string is an exact number\r\nfunction toNumberIfNumber(x) { if ((typeof x == \'string\') && (+parseInt(x) === x)) { x = parseInt(x); } return x; }\r\n\r\n// Convert decimal to hex\r\nfunction char2hex(i) { return (i + 0x100).toString(16).substr(-2).toUpperCase(); }\r\n\r\n// Convert a raw string to a hex string\r\nfunction rstr2hex(input) { var r = \'\', i; for (i = 0; i < input.length; i++) { r += char2hex(input.charCodeAt(i)); } return r; }\r\n\r\n// Convert a buffer into a string\r\nfunction buf2rstr(buf) { var r = \'\'; for (var i = 0; i < buf.length; i++) { r += String.fromCharCode(buf[i]); } return r; }\r\n\r\n// Convert a hex string to a raw string // TODO: Do this using Buffer(), will be MUCH faster\r\nfunction hex2rstr(d) {\r\n if (typeof d != "string" || d.length == 0) return \'\';\r\n var r = \'\', m = (\'\' + d).match(/../g), t;\r\n while (t = m.shift()) r += String.fromCharCode(\'0x\' + t);\r\n return r\r\n}\r\n\r\n// Convert an object to string with all functions\r\nfunction objToString(x, p, pad, ret) {\r\n if (ret == undefined) ret = \'\';\r\n if (p == undefined) p = 0;\r\n if (x == null) { return \'[null]\'; }\r\n if (p > 8) { return \'[...]\'; }\r\n if (x == undefined) { return \'[undefined]\'; }\r\n if (typeof x == \'string\') { if (p == 0) return x; return \'"\' + x + \'"\'; }\r\n if (typeof x == \'buffer\') { return \'[buffer]\'; }\r\n if (typeof x != \'object\') { return x; }\r\n var r = \'{\' + (ret ? \'\\r\\n\' : \' \');\r\n for (var i in x) { if (i != \'_ObjectID\') { r += (addPad(p + 2, pad) + i + \': \' + objToString(x[i], p + 2, pad, ret) + (ret ? \'\\r\\n\' : \' \')); } }\r\n return r + addPad(p, pad) + \'}\';\r\n}\r\n\r\n// Return p number of spaces \r\nfunction addPad(p, ret) { var r = \'\'; for (var i = 0; i < p; i++) { r += ret; } return r; }\r\n\r\n// Split a string taking into account the quoats. Used for command line parsing\r\nfunction splitArgs(str) {\r\n var myArray = [], myRegexp = /[^\\s"]+|"([^"]*)"/gi;\r\n do { var match = myRegexp.exec(str); if (match != null) { myArray.push(match[1] ? match[1] : match[0]); } } while (match != null);\r\n return myArray;\r\n}\r\n\r\n// Parse arguments string array into an object\r\nfunction parseArgs(argv) {\r\n var results = { \'_\': [] }, current = null;\r\n for (var i = 1, len = argv.length; i < len; i++) {\r\n var x = argv[i];\r\n if (x.length > 2 && x[0] == \'-\' && x[1] == \'-\') {\r\n if (current != null) { results[current] = true; }\r\n current = x.substring(2);\r\n } else {\r\n if (current != null) { results[current] = toNumberIfNumber(x); current = null; } else { results[\'_\'].push(toNumberIfNumber(x)); }\r\n }\r\n }\r\n if (current != null) { results[current] = true; }\r\n return results;\r\n}\r\n\r\n// Get server target url with a custom path\r\nfunction getServerTargetUrl(path) {\r\n var x = mesh.ServerUrl;\r\n //sendConsoleText("mesh.ServerUrl: " + mesh.ServerUrl);\r\n if (x == null) { return null; }\r\n if (path == null) { path = \'\'; }\r\n x = http.parseUri(x);\r\n if (x == null) return null;\r\n return x.protocol + \'//\' + x.host + \':\' + x.port + \'/\' + path;\r\n}\r\n\r\n// Get server url. If the url starts with "*/..." change it, it not use the url as is.\r\nfunction getServerTargetUrlEx(url) {\r\n if (url.substring(0, 2) == \'*/\') { return getServerTargetUrl(url.substring(2)); }\r\n return url;\r\n}\r\n\r\nfunction sendWakeOnLanEx_interval() {\r\n var t = require(\'MeshAgent\').wakesockets;\r\n if (t.list.length == 0) {\r\n clearInterval(t);\r\n delete require(\'MeshAgent\').wakesockets;\r\n return;\r\n }\r\n\r\n var mac = t.list.shift().split(\':\').join(\'\')\r\n var magic = \'FFFFFFFFFFFF\';\r\n for (var x = 1; x <= 16; ++x) { magic += mac; }\r\n var magicbin = Buffer.from(magic, \'hex\');\r\n\r\n for (var i in t.sockets) {\r\n t.sockets[i].send(magicbin, 7, \'255.255.255.255\');\r\n //sendConsoleText(\'Sending wake packet on \' + JSON.stringify(t.sockets[i].address()));\r\n }\r\n}\r\nfunction sendWakeOnLanEx(hexMacList) {\r\n var ret = 0;\r\n\r\n if (require(\'MeshAgent\').wakesockets == null) {\r\n // Create a new interval timer\r\n require(\'MeshAgent\').wakesockets = setInterval(sendWakeOnLanEx_interval, 10);\r\n require(\'MeshAgent\').wakesockets.sockets = [];\r\n require(\'MeshAgent\').wakesockets.list = hexMacList;\r\n\r\n var interfaces = require(\'os\').networkInterfaces();\r\n for (var adapter in interfaces) {\r\n if (interfaces.hasOwnProperty(adapter)) {\r\n for (var i = 0; i < interfaces[adapter].length; ++i) {\r\n var addr = interfaces[adapter][i];\r\n if ((addr.family == \'IPv4\') && (addr.mac != \'00:00:00:00:00:00\')) {\r\n try {\r\n var socket = require(\'dgram\').createSocket({ type: \'udp4\' });\r\n socket.bind({ address: addr.address });\r\n socket.setBroadcast(true);\r\n socket.setMulticastInterface(addr.address);\r\n socket.setMulticastTTL(1);\r\n socket.descriptorMetadata = \'WoL (\' + addr.address + \')\';\r\n require(\'MeshAgent\').wakesockets.sockets.push(socket);\r\n ++ret;\r\n }\r\n catch (e) { }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n else {\r\n // Append to an existing interval timer\r\n for (var i in hexMacList) {\r\n require(\'MeshAgent\').wakesockets.list.push(hexMacList[i]);\r\n }\r\n ret = require(\'MeshAgent\').wakesockets.sockets.length;\r\n }\r\n\r\n return (ret);\r\n}\r\n\r\n// Handle a mesh agent command\r\nfunction handleServerCommand(data) {\r\n if (typeof data == \'object\') {\r\n // If this is a console command, parse it and call the console handler\r\n switch (data.action) {\r\n case \'agentupdate\':\r\n agentUpdate_Start(data.url, { hash: data.hash, tlshash: data.servertlshash, sessionid: data.sessionid });\r\n break;\r\n case \'msg\': {\r\n switch (data.type) {\r\n case \'console\': { // Process a console command\r\n if (data.value && data.sessionid) {\r\n MeshServerLogEx(17, [data.value], "Processing console command: " + data.value, data);\r\n var args = splitArgs(data.value);\r\n processConsoleCommand(args[0].toLowerCase(), parseArgs(args), data.rights, data.sessionid);\r\n }\r\n break;\r\n }\r\n case \'tunnel\': {\r\n if (data.value != null) { // Process a new tunnel connection request\r\n // Create a new tunnel object\r\n var xurl = getServerTargetUrlEx(data.value);\r\n if (xurl != null) {\r\n xurl = xurl.split(\'$\').join(\'%24\').split(\'@\').join(\'%40\'); // Escape the $ and @ characters\r\n var woptions = http.parseUri(xurl);\r\n woptions.perMessageDeflate = false;\r\n if (typeof data.perMessageDeflate == \'boolean\') { woptions.perMessageDeflate = data.perMessageDeflate; }\r\n\r\n // Perform manual server TLS certificate checking based on the certificate hash given by the server.\r\n woptions.rejectUnauthorized = 0;\r\n woptions.checkServerIdentity = function checkServerIdentity(certs) {\r\n /*\r\n try { sendConsoleText("certs[0].digest: " + certs[0].digest); } catch (ex) { sendConsoleText(ex); }\r\n try { sendConsoleText("certs[0].fingerprint: " + certs[0].fingerprint); } catch (ex) { sendConsoleText(ex); }\r\n try { sendConsoleText("control-digest: " + require(\'MeshAgent\').ServerInfo.ControlChannelCertificate.digest); } catch (ex) { sendConsoleText(ex); }\r\n try { sendConsoleText("control-fingerprint: " + require(\'MeshAgent\').ServerInfo.ControlChannelCertificate.fingerprint); } catch (ex) { sendConsoleText(ex); }\r\n */\r\n\r\n // If the tunnel certificate matches the control channel certificate, accept the connection\r\n try { if (require(\'MeshAgent\').ServerInfo.ControlChannelCertificate.digest == certs[0].digest) return; } catch (ex) { }\r\n try { if (require(\'MeshAgent\').ServerInfo.ControlChannelCertificate.fingerprint == certs[0].fingerprint) return; } catch (ex) { }\r\n // Check that the certificate is the one expected by the server, fail if not.\r\n if ((checkServerIdentity.servertlshash != null) && (checkServerIdentity.servertlshash.toLowerCase() != certs[0].digest.split(\':\').join(\'\').toLowerCase())) { throw new Error(\'BadCert\') }\r\n }\r\n woptions.checkServerIdentity.servertlshash = data.servertlshash;\r\n\r\n //sendConsoleText(JSON.stringify(woptions));\r\n //sendConsoleText(\'TUNNEL: \' + JSON.stringify(data));\r\n var tunnel = http.request(woptions);\r\n tunnel.upgrade = onTunnelUpgrade;\r\n tunnel.on(\'error\', function (e) { sendConsoleText("ERROR: Unable to connect relay tunnel to: " + this.url + ", " + JSON.stringify(e)); });\r\n tunnel.sessionid = data.sessionid;\r\n tunnel.rights = data.rights;\r\n tunnel.consent = data.consent;\r\n tunnel.privacybartext = data.privacybartext ? data.privacybartext : "Sharing desktop with: {0}";\r\n tunnel.username = data.username + (data.guestname ? (\' - \' + data.guestname) : \'\');\r\n tunnel.realname = (data.realname ? data.realname : data.username) + (data.guestname ? (\' - \' + data.guestname) : \'\');\r\n tunnel.userid = data.userid;\r\n tunnel.remoteaddr = data.remoteaddr;\r\n tunnel.state = 0;\r\n tunnel.url = xurl;\r\n tunnel.protocol = 0;\r\n tunnel.soptions = data.soptions;\r\n tunnel.tcpaddr = data.tcpaddr;\r\n tunnel.tcpport = data.tcpport;\r\n tunnel.udpaddr = data.udpaddr;\r\n tunnel.udpport = data.udpport;\r\n tunnel.end();\r\n // Put the tunnel in the tunnels list\r\n var index = nextTunnelIndex++;\r\n tunnel.index = index;\r\n tunnels[index] = tunnel;\r\n\r\n //sendConsoleText(\'New tunnel connection #\' + index + \': \' + tunnel.url + \', rights: \' + tunnel.rights, data.sessionid);\r\n }\r\n }\r\n break;\r\n }\r\n case \'messagebox\': {\r\n // Display a message box\r\n if (data.title && data.msg) {\r\n MeshServerLogEx(18, [data.title, data.msg], "Displaying message box, title=" + data.title + ", message=" + data.msg, data);\r\n try { require(\'message-box\').create(data.title, data.msg, 120).then(function () { }).catch(function () { }); } catch (e) { }\r\n }\r\n break;\r\n }\r\n case \'ps\': {\r\n // Return the list of running processes\r\n if (data.sessionid) {\r\n processManager.getProcesses(function (plist) {\r\n mesh.SendCommand({ action: \'msg\', type: \'ps\', value: JSON.stringify(plist), sessionid: data.sessionid });\r\n });\r\n }\r\n break;\r\n }\r\n case \'pskill\': {\r\n // Kill a process\r\n if (data.value) {\r\n MeshServerLogEx(19, [data.value], "Killing process " + data.value, data);\r\n try { process.kill(data.value); } catch (e) { sendConsoleText("pskill: " + JSON.stringify(e)); }\r\n }\r\n break;\r\n }\r\n case \'services\': {\r\n // Return the list of installed services\r\n var services = null;\r\n try { services = require(\'service-manager\').manager.enumerateService(); } catch (e) { }\r\n if (services != null) { mesh.SendCommand({ action: \'msg\', type: \'services\', value: JSON.stringify(services), sessionid: data.sessionid }); }\r\n break;\r\n }\r\n case \'serviceStop\': {\r\n // Stop a service\r\n try {\r\n var service = require(\'service-manager\').manager.getService(data.serviceName);\r\n if (service != null) { service.stop(); }\r\n } catch (e) { }\r\n break;\r\n }\r\n case \'serviceStart\': {\r\n // Start a service\r\n try {\r\n var service = require(\'service-manager\').manager.getService(data.serviceName);\r\n if (service != null) { service.start(); }\r\n } catch (e) { }\r\n break;\r\n }\r\n case \'serviceRestart\': {\r\n // Restart a service\r\n try {\r\n var service = require(\'service-manager\').manager.getService(data.serviceName);\r\n if (service != null) { service.restart(); }\r\n } catch (e) { }\r\n break;\r\n }\r\n case \'deskBackground\':\r\n {\r\n // Toggle desktop background\r\n try {\r\n if (process.platform == \'win32\') {\r\n var stype = require(\'user-sessions\').getProcessOwnerName(process.pid).tsid == 0 ? 1 : 0;\r\n var sid = undefined;\r\n if (stype == 1) {\r\n if (require(\'MeshAgent\')._tsid != null) {\r\n stype = 5;\r\n sid = require(\'MeshAgent\')._tsid;\r\n }\r\n }\r\n var id = require(\'user-sessions\').getProcessOwnerName(process.pid).tsid == 0 ? 1 : 0;\r\n var child = require(\'child_process\').execFile(process.execPath, [process.execPath.split(\'\\\\\').pop(), \'-b64exec\', \'dmFyIFNQSV9HRVRERVNLV0FMTFBBUEVSID0gMHgwMDczOwp2YXIgU1BJX1NFVERFU0tXQUxMUEFQRVIgPSAweDAwMTQ7CnZhciBHTSA9IHJlcXVpcmUoJ19HZW5lcmljTWFyc2hhbCcpOwp2YXIgdXNlcjMyID0gR00uQ3JlYXRlTmF0aXZlUHJveHkoJ3VzZXIzMi5kbGwnKTsKdXNlcjMyLkNyZWF0ZU1ldGhvZCgnU3lzdGVtUGFyYW1ldGVyc0luZm9BJyk7CgppZiAocHJvY2Vzcy5hcmd2Lmxlbmd0aCA9PSAzKQp7CiAgICB2YXIgdiA9IEdNLkNyZWF0ZVZhcmlhYmxlKDEwMjQpOwogICAgdXNlcjMyLlN5c3RlbVBhcmFtZXRlcnNJbmZvQShTUElfR0VUREVTS1dBTExQQVBFUiwgdi5fc2l6ZSwgdiwgMCk7CiAgICBjb25zb2xlLmxvZyh2LlN0cmluZyk7CiAgICBwcm9jZXNzLmV4aXQoKTsKfQplbHNlCnsKICAgIHZhciBuYiA9IEdNLkNyZWF0ZVZhcmlhYmxlKHByb2Nlc3MuYXJndlszXSk7CiAgICB1c2VyMzIuU3lzdGVtUGFyYW1ldGVyc0luZm9BKFNQSV9TRVRERVNLV0FMTFBBUEVSLCBuYi5fc2l6ZSwgbmIsIDApOwogICAgcHJvY2Vzcy5leGl0KCk7Cn0=\'], { type: stype, uid: sid });\r\n child.stdout.str = \'\'; child.stdout.on(\'data\', function (c) { this.str += c.toString(); });\r\n child.stderr.on(\'data\', function () { });\r\n child.waitExit();\r\n var current = child.stdout.str.trim();\r\n if (current != \'\') { require(\'MeshAgent\')._wallpaper = current; }\r\n child = require(\'child_process\').execFile(process.execPath, [process.execPath.split(\'\\\\\').pop(), \'-b64exec\', \'dmFyIFNQSV9HRVRERVNLV0FMTFBBUEVSID0gMHgwMDczOwp2YXIgU1BJX1NFVERFU0tXQUxMUEFQRVIgPSAweDAwMTQ7CnZhciBHTSA9IHJlcXVpcmUoJ19HZW5lcmljTWFyc2hhbCcpOwp2YXIgdXNlcjMyID0gR00uQ3JlYXRlTmF0aXZlUHJveHkoJ3VzZXIzMi5kbGwnKTsKdXNlcjMyLkNyZWF0ZU1ldGhvZCgnU3lzdGVtUGFyYW1ldGVyc0luZm9BJyk7CgppZiAocHJvY2Vzcy5hcmd2Lmxlbmd0aCA9PSAzKQp7CiAgICB2YXIgdiA9IEdNLkNyZWF0ZVZhcmlhYmxlKDEwMjQpOwogICAgdXNlcjMyLlN5c3RlbVBhcmFtZXRlcnNJbmZvQShTUElfR0VUREVTS1dBTExQQVBFUiwgdi5fc2l6ZSwgdiwgMCk7CiAgICBjb25zb2xlLmxvZyh2LlN0cmluZyk7CiAgICBwcm9jZXNzLmV4aXQoKTsKfQplbHNlCnsKICAgIHZhciBuYiA9IEdNLkNyZWF0ZVZhcmlhYmxlKHByb2Nlc3MuYXJndlszXSk7CiAgICB1c2VyMzIuU3lzdGVtUGFyYW1ldGVyc0luZm9BKFNQSV9TRVRERVNLV0FMTFBBUEVSLCBuYi5fc2l6ZSwgbmIsIDApOwogICAgcHJvY2Vzcy5leGl0KCk7Cn0=\', current != \'\' ? \'""\' : require(\'MeshAgent\')._wallpaper], { type: stype, uid: sid });\r\n child.stdout.str = \'\'; child.stdout.on(\'data\', function (c) { this.str += c.toString(); });\r\n child.stderr.on(\'data\', function () { });\r\n child.waitExit();\r\n } else {\r\n var id = require(\'user-sessions\').consoleUid();\r\n var current = require(\'linux-gnome-helpers\').getDesktopWallpaper(id);\r\n if (current != \'/dev/null\') { require(\'MeshAgent\')._wallpaper = current; }\r\n require(\'linux-gnome-helpers\').setDesktopWallpaper(id, current != \'/dev/null\' ? undefined : require(\'MeshAgent\')._wallpaper);\r\n }\r\n } catch (e) {\r\n sendConsoleText(e);\r\n }\r\n break;\r\n }\r\n case \'openUrl\': {\r\n // Open a local web browser and return success/fail\r\n MeshServerLogEx(20, [data.url], "Opening: " + data.url, data);\r\n sendConsoleText("OpenURL: " + data.url);\r\n if (data.url) { mesh.SendCommand({ action: \'msg\', type: \'openUrl\', url: data.url, sessionid: data.sessionid, success: (openUserDesktopUrl(data.url) != null) }); }\r\n break;\r\n }\r\n case \'getclip\': {\r\n // Send the load clipboard back to the user\r\n //sendConsoleText(\'getClip: \' + JSON.stringify(data));\r\n if (require(\'MeshAgent\').isService) {\r\n require(\'clipboard\').dispatchRead().then(function (str) {\r\n if (str) {\r\n MeshServerLogEx(21, [str.length], "Getting clipboard content, " + str.length + " byte(s)", data);\r\n mesh.SendCommand({ action: \'msg\', type: \'getclip\', sessionid: data.sessionid, data: str, tag: data.tag });\r\n }\r\n });\r\n } else {\r\n require("clipboard").read().then(function (str) {\r\n if (str) {\r\n MeshServerLogEx(21, [str.length], "Getting clipboard content, " + str.length + " byte(s)", data);\r\n mesh.SendCommand({ action: \'msg\', type: \'getclip\', sessionid: data.sessionid, data: str, tag: data.tag });\r\n }\r\n });\r\n }\r\n break;\r\n }\r\n case \'setclip\': {\r\n // Set the load clipboard to a user value\r\n //sendConsoleText(\'setClip: \' + JSON.stringify(data));\r\n if (typeof data.data == \'string\') {\r\n MeshServerLogEx(22, [data.data.length], "Setting clipboard content, " + data.data.length + " byte(s)", data);\r\n if (require(\'MeshAgent\').isService) {\r\n if (process.platform != \'win32\') {\r\n require(\'clipboard\').dispatchWrite(data.data);\r\n }\r\n else {\r\n var tmp = "require(\'clipboard\')(" + JSON.stringify(data.data) + \');process.exit();\';\r\n tmp = Buffer.from(tmp).toString(\'base64\');\r\n var uid = require(\'user-sessions\').consoleUid();\r\n var domain = require(\'user-sessions\').getDomain(uid);\r\n var user = domain + \'\\\\\' + require(\'user-sessions\').getUsername(uid);\r\n var taskoptions = { env: { _target: process.execPath, _args: \'-b64exec \' + tmp, _user: user } };\r\n for (var c1e in process.env) {\r\n taskoptions.env[c1e] = process.env[c1e];\r\n }\r\n\r\n var child = require(\'child_process\').execFile(process.env[\'windir\'] + \'\\\\System32\\\\WindowsPowerShell\\\\v1.0\\\\powershell.exe\', [\'powershell\', \'-noprofile\', \'-nologo\', \'-command\', \'-\'], taskoptions);\r\n child.stderr.on(\'data\', function (c) { });\r\n child.stdout.on(\'data\', function (c) { });\r\n child.stdin.write(\'SCHTASKS /CREATE /F /TN MeshUserTask /SC ONCE /ST 00:00 \');\r\n child.stdin.write(\'/RU $env:_user \');\r\n\r\n child.stdin.write(\'/TR "$env:_target $env:_args"\\r\\n\');\r\n child.stdin.write(\'$ts = New-Object -ComObject Schedule.service\\r\\n\');\r\n child.stdin.write(\'$ts.connect()\\r\\n\');\r\n child.stdin.write(\'$tsfolder = $ts.getfolder("\\\\")\\r\\n\');\r\n child.stdin.write(\'$task = $tsfolder.GetTask("MeshUserTask")\\r\\n\');\r\n child.stdin.write(\'$taskdef = $task.Definition\\r\\n\');\r\n child.stdin.write(\'$taskdef.Settings.StopIfGoingOnBatteries = $false\\r\\n\');\r\n child.stdin.write(\'$taskdef.Settings.DisallowStartIfOnBatteries = $false\\r\\n\');\r\n child.stdin.write(\'$taskdef.Actions.Item(1).Path = $env:_target\\r\\n\');\r\n child.stdin.write(\'$taskdef.Actions.Item(1).Arguments = $env:_args\\r\\n\');\r\n child.stdin.write(\'$tsfolder.RegisterTaskDefinition($task.Name, $taskdef, 4, $null, $null, $null)\\r\\n\');\r\n\r\n child.stdin.write(\'SCHTASKS /RUN /TN MeshUserTask\\r\\n\');\r\n child.stdin.write(\'SCHTASKS /DELETE /F /TN MeshUserTask\\r\\nexit\\r\\n\');\r\n child.waitExit();\r\n }\r\n }\r\n else {\r\n require("clipboard")(data.data);\r\n } // Set the clipboard\r\n mesh.SendCommand({ action: \'msg\', type: \'setclip\', sessionid: data.sessionid, success: true });\r\n }\r\n break;\r\n }\r\n case \'userSessions\': {\r\n // Send back current user sessions list, this is Windows only.\r\n //sendConsoleText(\'userSessions: \' + JSON.stringify(data));\r\n if (process.platform != \'win32\') break;\r\n var p = require(\'user-sessions\').enumerateUsers();\r\n p.sessionid = data.sessionid;\r\n p.then(function (u) { mesh.SendCommand({ action: \'msg\', type: \'userSessions\', sessionid: data.sessionid, data: u, tag: data.tag }); });\r\n break;\r\n }\r\n case \'cpuinfo\':\r\n // CPU & memory utilization\r\n var cpuuse = require(\'sysinfo\').cpuUtilization();\r\n cpuuse.sessionid = data.sessionid;\r\n cpuuse.tag = data.tag;\r\n cpuuse.then(function (data) {\r\n mesh.SendCommand(JSON.stringify(\r\n {\r\n action: \'msg\',\r\n type: \'cpuinfo\',\r\n cpu: data,\r\n memory: require(\'sysinfo\').memUtilization(),\r\n thermals: require(\'sysinfo\').thermals == null ? [] : require(\'sysinfo\').thermals(),\r\n sessionid: this.sessionid,\r\n tag: this.tag\r\n }));\r\n }, function (ex) { });\r\n break;\r\n case \'localapp\':\r\n // Send a message to a local application\r\n sendConsoleText(\'localappMsg: \' + data.appid + \', \' + JSON.stringify(data.value));\r\n if (data.appid != null) { sendToRegisteredApp(data.appid, data.value); } else { broadcastToRegisteredApps(data.value); }\r\n break;\r\n default:\r\n // Unknown action, ignore it.\r\n break;\r\n }\r\n break;\r\n }\r\n case \'acmactivate\': {\r\n if (amt != null) {\r\n MeshServerLogEx(23, null, "Attempting Intel AMT ACM mode activation", data);\r\n amt.setAcmResponse(data);\r\n }\r\n break;\r\n }\r\n case \'wakeonlan\': {\r\n // Send wake-on-lan on all interfaces for all MAC addresses in data.macs array. The array is a list of HEX MAC addresses.\r\n //sendConsoleText("Server requesting wake-on-lan for: " + data.macs.join(\', \'));\r\n sendWakeOnLanEx(data.macs);\r\n sendWakeOnLanEx(data.macs);\r\n sendWakeOnLanEx(data.macs);\r\n break;\r\n }\r\n case \'runcommands\': {\r\n if (mesh.cmdchild != null) { sendConsoleText("Run commands can\'t execute, already busy."); break; }\r\n sendConsoleText("Run commands (" + data.runAsUser + "): " + data.cmds);\r\n\r\n // data.runAsUser: 0=Agent,1=UserOrAgent,2=UserOnly\r\n var options = {};\r\n if (data.runAsUser > 0) {\r\n try { options.uid = require(\'user-sessions\').consoleUid(); } catch (e) { }\r\n options.type = require(\'child_process\').SpawnTypes.TERM;\r\n }\r\n if (data.runAsUser == 2) {\r\n if (options.uid == null) break;\r\n if (((require(\'user-sessions\').minUid != null) && (options.uid < require(\'user-sessions\').minUid()))) break; // This command can only run as user.\r\n }\r\n\r\n if (process.platform == \'win32\') {\r\n if (data.type == 1) {\r\n // Windows command shell\r\n mesh.cmdchild = require(\'child_process\').execFile(process.env[\'windir\'] + \'\\\\system32\\\\cmd.exe\', [\'cmd\'], options);\r\n mesh.cmdchild.descriptorMetadata = \'UserCommandsShell\';\r\n mesh.cmdchild.stdout.on(\'data\', function (c) { sendConsoleText(c.toString()); });\r\n mesh.cmdchild.stderr.on(\'data\', function (c) { sendConsoleText(c.toString()); });\r\n mesh.cmdchild.stdin.write(data.cmds + \'\\r\\nexit\\r\\n\');\r\n mesh.cmdchild.on(\'exit\', function () { sendConsoleText("Run commands completed."); delete mesh.cmdchild; });\r\n } else if (data.type == 2) {\r\n // Windows Powershell\r\n mesh.cmdchild = require(\'child_process\').execFile(process.env[\'windir\'] + \'\\\\System32\\\\WindowsPowerShell\\\\v1.0\\\\powershell.exe\', [\'powershell\', \'-noprofile\', \'-nologo\', \'-command\', \'-\'], options);\r\n mesh.cmdchild.descriptorMetadata = \'UserCommandsPowerShell\';\r\n mesh.cmdchild.stdout.on(\'data\', function (c) { sendConsoleText(c.toString()); });\r\n mesh.cmdchild.stderr.on(\'data\', function (c) { sendConsoleText(c.toString()); });\r\n mesh.cmdchild.stdin.write(data.cmds + \'\\r\\nexit\\r\\n\');\r\n mesh.cmdchild.on(\'exit\', function () { sendConsoleText("Run commands completed."); delete mesh.cmdchild; });\r\n }\r\n } else if (data.type == 3) {\r\n // Linux shell\r\n mesh.cmdchild = require(\'child_process\').execFile(\'/bin/sh\', [\'sh\'], options);\r\n mesh.cmdchild.descriptorMetadata = \'UserCommandsShell\';\r\n mesh.cmdchild.stdout.on(\'data\', function (c) { sendConsoleText(c.toString()); });\r\n mesh.cmdchild.stderr.on(\'data\', function (c) { sendConsoleText(c.toString()); });\r\n mesh.cmdchild.stdin.write(data.cmds.split(\'\\r\').join(\'\') + \'\\nexit\\n\');\r\n mesh.cmdchild.on(\'exit\', function () { sendConsoleText("Run commands completed."); delete mesh.cmdchild; });\r\n }\r\n break;\r\n }\r\n case \'uninstallagent\':\r\n // Uninstall this agent\r\n var agentName = process.platform == \'win32\' ? \'Mesh Agent\' : \'meshagent\';\r\n try {\r\n agentName = require(\'MeshAgent\').serviceName;\r\n }\r\n catch (x) {\r\n }\r\n\r\n if (require(\'service-manager\').manager.getService(agentName).isMe()) {\r\n try { diagnosticAgent_uninstall(); } catch (e) { }\r\n var js = "require(\'service-manager\').manager.getService(\'" + agentName + "\').stop(); require(\'service-manager\').manager.uninstallService(\'" + agentName + "\'); process.exit();";\r\n this.child = require(\'child_process\').execFile(process.execPath, [process.platform == \'win32\' ? (process.execPath.split(\'\\\\\').pop()) : (process.execPath.split(\'/\').pop()), \'-b64exec\', Buffer.from(js).toString(\'base64\')], { type: 4, detached: true });\r\n }\r\n break;\r\n case \'poweraction\': {\r\n // Server telling us to execute a power action\r\n if ((mesh.ExecPowerState != undefined) && (data.actiontype)) {\r\n var forced = 0;\r\n if (data.forced == 1) { forced = 1; }\r\n data.actiontype = parseInt(data.actiontype);\r\n MeshServerLogEx(25, [data.actiontype, forced], "Performing power action=" + data.actiontype + ", forced=" + forced, data);\r\n sendConsoleText("Performing power action=" + data.actiontype + ", forced=" + forced + \'.\');\r\n var r = mesh.ExecPowerState(data.actiontype, forced);\r\n sendConsoleText("ExecPowerState returned code: " + r);\r\n }\r\n break;\r\n }\r\n case \'iplocation\': {\r\n // Update the IP location information of this node. Only do this when requested by the server since we have a limited amount of time we can call this per day\r\n getIpLocationData(function (location) { mesh.SendCommand({ action: \'iplocation\', type: \'publicip\', value: location }); });\r\n break;\r\n }\r\n case \'toast\': {\r\n // Display a toast message\r\n if (data.title && data.msg) {\r\n MeshServerLogEx(26, [data.title, data.msg], "Displaying toast message, title=" + data.title + ", message=" + data.msg, data);\r\n data.msg = data.msg.split(\'\\r\').join(\'\\\\r\').split(\'\\n\').join(\'\\\\n\');\r\n try { require(\'toaster\').Toast(data.title, data.msg); } catch (e) { }\r\n }\r\n break;\r\n }\r\n case \'openUrl\': {\r\n // Open a local web browser and return success/fail\r\n //sendConsoleText(\'OpenURL: \' + data.url);\r\n MeshServerLogEx(20, [data.url], "Opening: " + data.url, data);\r\n if (data.url) { mesh.SendCommand({ action: \'openUrl\', url: data.url, sessionid: data.sessionid, success: (openUserDesktopUrl(data.url) != null) }); }\r\n break;\r\n }\r\n case \'amtconfig\': {\r\n // Perform Intel AMT activation and/or configuration\r\n if ((apftunnel != null) || (amt == null) || (typeof data.user != \'string\') || (typeof data.pass != \'string\')) break;\r\n amt.getMeiState(15, function (state) {\r\n if ((apftunnel != null) || (amt == null)) return;\r\n if ((state == null) || (state.ProvisioningState == null)) return;\r\n if ((state.UUID == null) || (state.UUID.length != 36)) return; // Bad UUID\r\n var apfarg = {\r\n mpsurl: mesh.ServerUrl.replace(\'/agent.ashx\', \'/apf.ashx\'),\r\n mpsuser: data.user, // Agent user name\r\n mpspass: data.pass, // Encrypted login cookie\r\n mpskeepalive: 60000,\r\n clientname: state.OsHostname,\r\n clientaddress: \'127.0.0.1\',\r\n clientuuid: state.UUID,\r\n conntype: 2, // 0 = CIRA, 1 = Relay, 2 = LMS. The correct value is 2 since we are performing an LMS relay, other values for testing.\r\n meiState: state // MEI state will be passed to MPS server\r\n };\r\n addAmtEvent(\'LMS tunnel start.\');\r\n apftunnel = require(\'amt-apfclient\')({ debug: false }, apfarg);\r\n apftunnel.onJsonControl = handleApfJsonControl;\r\n apftunnel.onChannelClosed = function () { addAmtEvent(\'LMS tunnel closed.\'); apftunnel = null; }\r\n try { apftunnel.connect(); } catch (ex) { }\r\n });\r\n break;\r\n }\r\n case \'getScript\': {\r\n // Received a configuration script from the server\r\n sendConsoleText(\'getScript: \' + JSON.stringify(data));\r\n break;\r\n }\r\n case \'sysinfo\': {\r\n // Fetch system information\r\n getSystemInformation(function (results) {\r\n if ((results != null) && (data.hash != results.hash)) { mesh.SendCommand({ action: \'sysinfo\', sessionid: this.sessionid, data: results }); }\r\n });\r\n break;\r\n }\r\n case \'ping\': { mesh.SendCommand(\'{"action":"pong"}\'); break; }\r\n case \'pong\': { break; }\r\n case \'plugin\': {\r\n try { require(data.plugin).consoleaction(data, data.rights, data.sessionid, this); } catch (e) { throw e; }\r\n break;\r\n }\r\n case \'coredump\':\r\n // Set the current agent coredump situation.s\r\n if (data.value === true) {\r\n if (process.platform == \'win32\') {\r\n // TODO: This replace() below is not ideal, would be better to remove the .exe at the end instead of replace.\r\n process.coreDumpLocation = process.execPath.replace(\'.exe\', \'.dmp\');\r\n } else {\r\n process.coreDumpLocation = (process.cwd() != \'//\') ? (process.cwd() + \'core\') : null;\r\n }\r\n } else if (data.value === false) {\r\n process.coreDumpLocation = null;\r\n }\r\n break;\r\n case \'getcoredump\':\r\n // Ask the agent if a core dump is currently available, if yes, also return the hash of the agent.\r\n var r = { action: \'getcoredump\', value: (process.coreDumpLocation != null) };\r\n var coreDumpPath = null;\r\n if (process.platform == \'win32\') { coreDumpPath = process.coreDumpLocation; } else { coreDumpPath = (process.cwd() != \'//\') ? fs.existsSync(process.cwd() + \'core\') : null; }\r\n if ((coreDumpPath != null) && (fs.existsSync(coreDumpPath))) {\r\n try {\r\n var coredate = fs.statSync(coreDumpPath).mtime;\r\n var coretime = new Date(coredate).getTime();\r\n var agenttime = new Date(fs.statSync(process.execPath).mtime).getTime();\r\n if (coretime > agenttime) { r.exists = (db.Get(\'CoreDumpTime\') != coredate); }\r\n } catch (ex) { }\r\n }\r\n if (r.exists == true) {\r\n r.agenthashhex = getSHA384FileHash(process.execPath).toString(\'hex\'); // Hash of current agent\r\n r.corehashhex = getSHA384FileHash(coreDumpPath).toString(\'hex\'); // Hash of core dump file\r\n }\r\n mesh.SendCommand(JSON.stringify(r));\r\n break;\r\n case \'meshToolInfo\':\r\n if (data.pipe == true) { delete data.pipe; delete data.action; data.cmd = \'meshToolInfo\'; broadcastToRegisteredApps(data); }\r\n if (data.tag == \'info\') { sendConsoleText(JSON.stringify(data, null, 2)); }\r\n if (data.tag == \'install\') {\r\n data.func = function (options, success) {\r\n sendConsoleText(\'Download of MeshCentral Assistant \' + (success?\'succeed\':\'failed\'));\r\n if (success) {\r\n // TODO: Install & Run\r\n }\r\n }\r\n data.filename = \'MeshAssistant.exe\';\r\n downloadFile(data);\r\n }\r\n break;\r\n case \'wget\': // Server uses this command to tell the agent to download a file using HTTPS/GET and place it in a given path. This is used for one-to-many file uploads.\r\n agentFileHttpPendingRequests.push(data);\r\n serverFetchFile();\r\n break;\r\n case \'errorlog\': // Return agent error log\r\n try { mesh.SendCommand(JSON.stringify({ action: \'errorlog\', log: require(\'util-agentlog\').read(data.startTime) })); } catch (ex) { }\r\n break;\r\n default:\r\n // Unknown action, ignore it.\r\n break;\r\n }\r\n }\r\n}\r\n\r\n// Download a file from the server and check the hash.\r\n// This download is similar to the one used for meshcore self-update.\r\nvar trustedDownloads = {};\r\nfunction downloadFile(downloadoptions) {\r\n var options = require(\'http\').parseUri(downloadoptions.url);\r\n options.rejectUnauthorized = false;\r\n options.checkServerIdentity = function checkServerIdentity(certs) {\r\n // If the tunnel certificate matches the control channel certificate, accept the connection\r\n try { if (require(\'MeshAgent\').ServerInfo.ControlChannelCertificate.digest == certs[0].digest) return; } catch (ex) { }\r\n try { if (require(\'MeshAgent\').ServerInfo.ControlChannelCertificate.fingerprint == certs[0].fingerprint) return; } catch (ex) { }\r\n // Check that the certificate is the one expected by the server, fail if not.\r\n if (checkServerIdentity.servertlshash == null) { if (require(\'MeshAgent\').ServerInfo == null || require(\'MeshAgent\').ServerInfo.ControlChannelCertificate == null) return; throw new Error(\'BadCert\'); }\r\n if (certs[0].digest == null) return;\r\n if ((checkServerIdentity.servertlshash != null) && (checkServerIdentity.servertlshash.toLowerCase() != certs[0].digest.split(\':\').join(\'\').toLowerCase())) { throw new Error(\'BadCert\') }\r\n }\r\n //options.checkServerIdentity.servertlshash = downloadoptions.serverhash;\r\n trustedDownloads[downloadoptions.name] = downloadoptions;\r\n trustedDownloads[downloadoptions.name].dl = require(\'https\').get(options);\r\n trustedDownloads[downloadoptions.name].dl.on(\'error\', function (e) { downloadoptions.func(downloadoptions, false); delete trustedDownloads[downloadoptions.name]; });\r\n trustedDownloads[downloadoptions.name].dl.on(\'response\', function (img) {\r\n this._file = require(\'fs\').createWriteStream(trustedDownloads[downloadoptions.name].filename, { flags: \'wb\' });\r\n this._filehash = require(\'SHA384Stream\').create();\r\n this._filehash.on(\'hash\', function (h) { if ((downloadoptions.hash != null) && (downloadoptions.hash.toLowerCase() != h.toString(\'hex\').toLowerCase())) { downloadoptions.func(downloadoptions, false); delete trustedDownloads[downloadoptions.name]; return; } downloadoptions.func(downloadoptions, true); });\r\n img.pipe(this._file);\r\n img.pipe(this._filehash);\r\n });\r\n}\r\n\r\n// Handle APF JSON control commands\r\nfunction handleApfJsonControl(data) {\r\n if (data.action == \'console\') { addAmtEvent(data.msg); } // Add console message to AMT event log\r\n if (data.action == \'mestate\') { amt.getMeiState(15, function (state) { apftunnel.updateMeiState(state); }); } // Update the MEI state\r\n if (data.action == \'close\') { try { apftunnel.disconnect(); } catch (e) { } apftunnel = null; } // Close the CIRA-LMS connection\r\n if (amt.amtMei != null) {\r\n if (data.action == \'deactivate\') { // Request CCM deactivation\r\n amt.amtMei.unprovision(1, function (status) { if (apftunnel) apftunnel.sendMeiDeactivationState(status); }); // 0 = Success\r\n }\r\n if (data.action == \'startTlsHostConfig\') { // Request start of host based TLS ACM activation\r\n amt.amtMei.startConfigurationHBased(Buffer.from(data.hash, \'hex\'), data.hostVpn, data.dnsSuffixList, function (response) { apftunnel.sendStartTlsHostConfigResponse(response); });\r\n }\r\n if (data.action == \'stopConfiguration\') { // Request Intel AMT stop configuration.\r\n amt.amtMei.stopConfiguration(function (status) { apftunnel.sendStopConfigurationResponse(status); });\r\n }\r\n }\r\n}\r\n\r\n// Agent just get a file from the server and save it locally.\r\nfunction serverFetchFile() {\r\n if ((Object.keys(agentFileHttpRequests).length > 4) || (agentFileHttpPendingRequests.length == 0)) return; // No more than 4 active HTTPS requests to the server.\r\n var data = agentFileHttpPendingRequests.shift();\r\n if ((data.overwrite !== true) && fs.existsSync(data.path)) return; // Don\'t overwrite an existing file.\r\n if (data.createFolder) { try { fs.mkdirSync(data.folder); } catch (ex) { } } // If requested, create the local folder.\r\n data.url = \'http\' + getServerTargetUrlEx(\'*/\').substring(2);\r\n var agentFileHttpOptions = http.parseUri(data.url);\r\n agentFileHttpOptions.path = data.urlpath;\r\n\r\n // Perform manual server TLS certificate checking based on the certificate hash given by the server.\r\n agentFileHttpOptions.rejectUnauthorized = 0;\r\n agentFileHttpOptions.checkServerIdentity = function checkServerIdentity(certs) {\r\n // If the tunnel certificate matches the control channel certificate, accept the connection\r\n try { if (require(\'MeshAgent\').ServerInfo.ControlChannelCertificate.digest == certs[0].digest) return; } catch (ex) { }\r\n try { if (require(\'MeshAgent\').ServerInfo.ControlChannelCertificate.fingerprint == certs[0].fingerprint) return; } catch (ex) { }\r\n // Check that the certificate is the one expected by the server, fail if not.\r\n if ((checkServerIdentity.servertlshash != null) && (checkServerIdentity.servertlshash.toLowerCase() != certs[0].digest.split(\':\').join(\'\').toLowerCase())) { throw new Error(\'BadCert\') }\r\n }\r\n agentFileHttpOptions.checkServerIdentity.servertlshash = data.servertlshash;\r\n\r\n if (agentFileHttpOptions == null) return;\r\n var agentFileHttpRequest = http.request(agentFileHttpOptions,\r\n function (response) {\r\n response.xparent = this;\r\n try {\r\n response.xfile = fs.createWriteStream(this.xpath, { flags: \'wbN\' })\r\n response.pipe(response.xfile);\r\n response.end = function () { delete agentFileHttpRequests[this.xparent.xurlpath]; delete this.xparent; serverFetchFile(); }\r\n } catch (ex) { delete agentFileHttpRequests[this.xurlpath]; delete response.xparent; serverFetchFile(); return; }\r\n }\r\n );\r\n agentFileHttpRequest.on(\'error\', function (ex) { delete agentFileHttpRequests[this.xurlpath]; serverFetchFile(); });\r\n agentFileHttpRequest.end();\r\n agentFileHttpRequest.xurlpath = data.urlpath;\r\n agentFileHttpRequest.xpath = data.path;\r\n agentFileHttpRequests[data.urlpath] = agentFileHttpRequest;\r\n}\r\n\r\n// Called when a file changed in the file system\r\n/*\r\nfunction onFileWatcher(a, b) {\r\n console.log(\'onFileWatcher\', a, b, this.path);\r\n var response = getDirectoryInfo(this.path);\r\n if ((response != undefined) && (response != null)) { this.tunnel.s.write(JSON.stringify(response)); }\r\n}\r\n*/\r\n\r\nfunction getSystemInformation(func) {\r\n try {\r\n var results = { hardware: require(\'identifiers\').get() }; // Hardware info\r\n\r\n if (results.hardware && results.hardware.windows) {\r\n // Remove extra entries and things that change quickly\r\n var x = results.hardware.windows.osinfo;\r\n try { delete x.FreePhysicalMemory; } catch (e) { }\r\n try { delete x.FreeSpaceInPagingFiles; } catch (e) { }\r\n try { delete x.FreeVirtualMemory; } catch (e) { }\r\n try { delete x.LocalDateTime; } catch (e) { }\r\n try { delete x.MaxProcessMemorySize; } catch (e) { }\r\n try { delete x.TotalVirtualMemorySize; } catch (e) { }\r\n try { delete x.TotalVisibleMemorySize; } catch (e) { }\r\n try {\r\n if (results.hardware.windows.memory) { for (var i in results.hardware.windows.memory) { delete results.hardware.windows.memory[i].Node; } }\r\n if (results.hardware.windows.osinfo) { delete results.hardware.windows.osinfo.Node; }\r\n if (results.hardware.windows.partitions) { for (var i in results.hardware.windows.partitions) { delete results.hardware.windows.partitions[i].Node; } }\r\n } catch (e) { }\r\n }\r\n results.hardware.agentvers = process.versions;\r\n var hasher = require(\'SHA384Stream\').create();\r\n results.hash = hasher.syncHash(JSON.stringify(results)).toString(\'hex\');\r\n func(results);\r\n\r\n /*\r\n // On Windows platforms, get volume information - Needs more testing.\r\n if (process.platform == \'win32\')\r\n {\r\n results.pendingReboot = require(\'win-info\').pendingReboot(); // Pending reboot\r\n\r\n if (require(\'identifiers\').volumes_promise != null)\r\n {\r\n var p = require(\'identifiers\').volumes_promise();\r\n p.then(function (res)\r\n {\r\n results.volumes = res;\r\n results.hash = hasher.syncHash(JSON.stringify(results)).toString(\'hex\');\r\n func(results);\r\n });\r\n }\r\n else if (require(\'identifiers\').volumes != null)\r\n {\r\n results.volumes = require(\'identifiers\').volumes();\r\n results.hash = hasher.syncHash(JSON.stringify(results)).toString(\'hex\');\r\n func(results);\r\n }\r\n else\r\n {\r\n results.hash = hasher.syncHash(JSON.stringify(results)).toString(\'hex\');\r\n func(results);\r\n }\r\n }\r\n else\r\n {\r\n results.hash = hasher.syncHash(JSON.stringify(results)).toString(\'hex\');\r\n func(results);\r\n }\r\n */\r\n } catch (e) { func(null, e); }\r\n}\r\n\r\n// Get a formated response for a given directory path\r\nfunction getDirectoryInfo(reqpath) {\r\n var response = { path: reqpath, dir: [] };\r\n if (((reqpath == undefined) || (reqpath == \'\')) && (process.platform == \'win32\')) {\r\n // List all the drives in the root, or the root itself\r\n var results = null;\r\n try { results = fs.readDrivesSync(); } catch (e) { } // TODO: Anyway to get drive total size and free space? Could draw a progress bar.\r\n if (results != null) {\r\n for (var i = 0; i < results.length; ++i) {\r\n var drive = { n: results[i].name, t: 1 };\r\n if (results[i].type == \'REMOVABLE\') { drive.dt = \'removable\'; } // TODO: See if this is USB/CDROM or something else, we can draw icons.\r\n response.dir.push(drive);\r\n }\r\n }\r\n } else {\r\n // List all the files and folders in this path\r\n if (reqpath == \'\') { reqpath = \'/\'; }\r\n var results = null, xpath = obj.path.join(reqpath, \'*\');\r\n //if (process.platform == "win32") { xpath = xpath.split(\'/\').join(\'\\\\\'); }\r\n try { results = fs.readdirSync(xpath); } catch (e) { }\r\n if (results != null) {\r\n for (var i = 0; i < results.length; ++i) {\r\n if ((results[i] != \'.\') && (results[i] != \'..\')) {\r\n var stat = null, p = obj.path.join(reqpath, results[i]);\r\n //if (process.platform == "win32") { p = p.split(\'/\').join(\'\\\\\'); }\r\n try { stat = fs.statSync(p); } catch (e) { } // TODO: Get file size/date\r\n if ((stat != null) && (stat != undefined)) {\r\n if (stat.isDirectory() == true) {\r\n response.dir.push({ n: results[i], t: 2, d: stat.mtime });\r\n } else {\r\n response.dir.push({ n: results[i], t: 3, s: stat.size, d: stat.mtime });\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n return response;\r\n}\r\n\r\n// Tunnel callback operations\r\nfunction onTunnelUpgrade(response, s, head) {\r\n this.s = s;\r\n s.httprequest = this;\r\n s.end = onTunnelClosed;\r\n s.tunnel = this;\r\n s.descriptorMetadata = "MeshAgent_relayTunnel";\r\n\r\n if (require(\'MeshAgent\').idleTimeout != null) {\r\n s.setTimeout(require(\'MeshAgent\').idleTimeout * 1000);\r\n s.on(\'timeout\', function () {\r\n this.ping();\r\n this.setTimeout(require(\'MeshAgent\').idleTimeout * 1000);\r\n });\r\n }\r\n\r\n //sendConsoleText(\'onTunnelUpgrade - \' + this.tcpport + \' - \' + this.udpport);\r\n\r\n if (this.tcpport != null) {\r\n // This is a TCP relay connection, pause now and try to connect to the target.\r\n s.pause();\r\n s.data = onTcpRelayServerTunnelData;\r\n var connectionOptions = { port: parseInt(this.tcpport) };\r\n if (this.tcpaddr != null) { connectionOptions.host = this.tcpaddr; } else { connectionOptions.host = \'127.0.0.1\'; }\r\n s.tcprelay = net.createConnection(connectionOptions, onTcpRelayTargetTunnelConnect);\r\n s.tcprelay.peerindex = this.index;\r\n\r\n // Add the TCP session to the count and update the server\r\n if (s.httprequest.userid != null) {\r\n if (tunnelUserCount.tcp[s.httprequest.userid] == null) { tunnelUserCount.tcp[s.httprequest.userid] = 1; } else { tunnelUserCount.tcp[s.httprequest.userid]++; }\r\n try { mesh.SendCommand({ action: \'sessions\', type: \'tcp\', value: tunnelUserCount.tcp }); } catch (e) { }\r\n broadcastSessionsToRegisteredApps();\r\n }\r\n } if (this.udpport != null) {\r\n // This is a UDP relay connection, get the UDP socket setup. // TODO: ***************\r\n s.data = onUdpRelayServerTunnelData;\r\n s.udprelay = require(\'dgram\').createSocket({ type: \'udp4\' });\r\n s.udprelay.bind({ port: 0 });\r\n s.udprelay.peerindex = this.index;\r\n s.udprelay.on(\'message\', onUdpRelayTargetTunnelConnect);\r\n s.udprelay.udpport = this.udpport;\r\n s.udprelay.udpaddr = this.udpaddr;\r\n s.udprelay.first = true;\r\n\r\n // Add the UDP session to the count and update the server\r\n if (s.httprequest.userid != null) {\r\n if (tunnelUserCount.udp[s.httprequest.userid] == null) { tunnelUserCount.udp[s.httprequest.userid] = 1; } else { tunnelUserCount.udp[s.httprequest.userid]++; }\r\n try { mesh.SendCommand({ action: \'sessions\', type: \'udp\', value: tunnelUserCount.tcp }); } catch (e) { }\r\n broadcastSessionsToRegisteredApps();\r\n }\r\n } else {\r\n // This is a normal connect for KVM/Terminal/Files\r\n s.data = onTunnelData;\r\n }\r\n}\r\n\r\n// Called when UDP relay data is received // TODO****\r\nfunction onUdpRelayTargetTunnelConnect(data) {\r\n var peerTunnel = tunnels[this.peerindex];\r\n peerTunnel.s.write(data);\r\n}\r\n\r\n// Called when we get data from the server for a TCP relay (We have to skip the first received \'c\' and pipe the rest)\r\nfunction onUdpRelayServerTunnelData(data) {\r\n if (this.udprelay.first === true) {\r\n delete this.udprelay.first; // Skip the first \'c\' that is received.\r\n } else {\r\n this.udprelay.send(data, parseInt(this.udprelay.udpport), this.udprelay.udpaddr ? this.udprelay.udpaddr : \'127.0.0.1\');\r\n }\r\n}\r\n\r\n// Called when the TCP relay target is connected\r\nfunction onTcpRelayTargetTunnelConnect() {\r\n var peerTunnel = tunnels[this.peerindex];\r\n this.pipe(peerTunnel.s); // Pipe Target --> Server\r\n peerTunnel.s.first = true;\r\n peerTunnel.s.resume();\r\n}\r\n\r\n// Called when we get data from the server for a TCP relay (We have to skip the first received \'c\' and pipe the rest)\r\nfunction onTcpRelayServerTunnelData(data) {\r\n if (this.first == true) {\r\n this.first = false;\r\n this.pipe(this.tcprelay, { dataTypeSkip: 1 }); // Pipe Server --> Target (don\'t pipe text type websocket frames)\r\n }\r\n}\r\n\r\nfunction onTunnelClosed() {\r\n var tunnel = tunnels[this.httprequest.index];\r\n if (tunnel == null) return; // Stop duplicate calls.\r\n\r\n // If this is a routing session, clean up and send the new session counts.\r\n if (this.httprequest.userid != null) {\r\n if (this.httprequest.tcpport != null) {\r\n if (tunnelUserCount.tcp[this.httprequest.userid] != null) { tunnelUserCount.tcp[this.httprequest.userid]--; if (tunnelUserCount.tcp[this.httprequest.userid] <= 0) { delete tunnelUserCount.tcp[this.httprequest.userid]; } }\r\n try { mesh.SendCommand({ action: \'sessions\', type: \'tcp\', value: tunnelUserCount.tcp }); } catch (e) { }\r\n broadcastSessionsToRegisteredApps();\r\n } else if (this.httprequest.udpport != null) {\r\n if (tunnelUserCount.udp[this.httprequest.userid] != null) { tunnelUserCount.udp[this.httprequest.userid]--; if (tunnelUserCount.udp[this.httprequest.userid] <= 0) { delete tunnelUserCount.udp[this.httprequest.userid]; } }\r\n try { mesh.SendCommand({ action: \'sessions\', type: \'udp\', value: tunnelUserCount.udp }); } catch (e) { }\r\n broadcastSessionsToRegisteredApps();\r\n }\r\n }\r\n\r\n // Sent tunnel statistics to the server, only send this if compression was used.\r\n if ((this.bytesSent_uncompressed) && (this.bytesSent_uncompressed.toString() != this.bytesSent_actual.toString())) {\r\n mesh.SendCommand({\r\n action: \'tunnelCloseStats\',\r\n url: tunnel.url,\r\n userid: tunnel.userid,\r\n protocol: tunnel.protocol,\r\n sessionid: tunnel.sessionid,\r\n sent: this.bytesSent_uncompressed.toString(),\r\n sentActual: this.bytesSent_actual.toString(),\r\n sentRatio: this.bytesSent_ratio,\r\n received: this.bytesReceived_uncompressed.toString(),\r\n receivedActual: this.bytesReceived_actual.toString(),\r\n receivedRatio: this.bytesReceived_ratio\r\n });\r\n }\r\n\r\n //sendConsoleText("Tunnel #" + this.httprequest.index + " closed. Sent -> " + this.bytesSent_uncompressed + \' bytes (uncompressed), \' + this.bytesSent_actual + \' bytes (actual), \' + this.bytesSent_ratio + \'% compression\', this.httprequest.sessionid);\r\n if (this.httprequest.index) { delete tunnels[this.httprequest.index]; }\r\n\r\n /*\r\n // Close the watcher if required\r\n if (this.httprequest.watcher != undefined) {\r\n //console.log(\'Closing watcher: \' + this.httprequest.watcher.path);\r\n //this.httprequest.watcher.close(); // TODO: This line causes the agent to crash!!!!\r\n delete this.httprequest.watcher;\r\n }\r\n */\r\n\r\n // If there is a upload or download active on this connection, close the file\r\n if (this.httprequest.uploadFile) { fs.closeSync(this.httprequest.uploadFile); delete this.httprequest.uploadFile; delete this.httprequest.uploadFileid; delete this.httprequest.uploadFilePath; delete this.httprequest.uploadFileSize; }\r\n if (this.httprequest.downloadFile) { delete this.httprequest.downloadFile; }\r\n\r\n // Clean up WebRTC\r\n if (this.webrtc != null) {\r\n if (this.webrtc.rtcchannel) { try { this.webrtc.rtcchannel.close(); } catch (e) { } this.webrtc.rtcchannel.removeAllListeners(\'data\'); this.webrtc.rtcchannel.removeAllListeners(\'end\'); delete this.webrtc.rtcchannel; }\r\n if (this.webrtc.websocket) { delete this.webrtc.websocket; }\r\n try { this.webrtc.close(); } catch (e) { }\r\n this.webrtc.removeAllListeners(\'connected\');\r\n this.webrtc.removeAllListeners(\'disconnected\');\r\n this.webrtc.removeAllListeners(\'dataChannel\');\r\n delete this.webrtc;\r\n }\r\n\r\n // Clean up WebSocket\r\n this.removeAllListeners(\'data\');\r\n}\r\nfunction onTunnelSendOk() { /*sendConsoleText("Tunnel #" + this.index + " SendOK.", this.sessionid);*/ }\r\nfunction onTunnelData(data) {\r\n //console.log("OnTunnelData");\r\n //sendConsoleText(\'OnTunnelData, \' + data.length + \', \' + typeof data + \', \' + data);\r\n\r\n // If this is upload data, save it to file\r\n if ((this.httprequest.uploadFile) && (typeof data == \'object\') && (data[0] != 123)) {\r\n // Save the data to file being uploaded.\r\n if (data[0] == 0) {\r\n // If data starts with zero, skip the first byte. This is used to escape binary file data from JSON.\r\n this.httprequest.uploadFileSize += (data.length - 1);\r\n try { fs.writeSync(this.httprequest.uploadFile, data, 1, data.length - 1); } catch (e) { sendConsoleText(\'FileUpload Error\'); this.write(Buffer.from(JSON.stringify({ action: \'uploaderror\' }))); return; } // Write to the file, if there is a problem, error out.\r\n } else {\r\n // If data does not start with zero, save as-is.\r\n this.httprequest.uploadFileSize += data.length;\r\n try { fs.writeSync(this.httprequest.uploadFile, data); } catch (e) { sendConsoleText(\'FileUpload Error\'); this.write(Buffer.from(JSON.stringify({ action: \'uploaderror\' }))); return; } // Write to the file, if there is a problem, error out.\r\n }\r\n this.write(Buffer.from(JSON.stringify({ action: \'uploadack\', reqid: this.httprequest.uploadFileid }))); // Ask for more data.\r\n return;\r\n }\r\n\r\n if (this.httprequest.state == 0) {\r\n // Check if this is a relay connection\r\n if ((data == \'c\') || (data == \'cr\')) { this.httprequest.state = 1; /*sendConsoleText("Tunnel #" + this.httprequest.index + " now active", this.httprequest.sessionid);*/ }\r\n }\r\n else {\r\n // Handle tunnel data\r\n if (this.httprequest.protocol == 0) { // 1 = Terminal (admin), 2 = Desktop, 5 = Files, 6 = PowerShell (admin), 7 = Plugin Data Exchange, 8 = Terminal (user), 9 = PowerShell (user), 10 = FileTransfer\r\n // Take a look at the protocol\r\n if ((data.length > 3) && (data[0] == \'{\')) { onTunnelControlData(data, this); return; }\r\n this.httprequest.protocol = parseInt(data);\r\n if (typeof this.httprequest.protocol != \'number\') { this.httprequest.protocol = 0; }\r\n\r\n // See if this protocol request is allowed.\r\n if ((this.httprequest.soptions != null) && (this.httprequest.soptions.usages != null) && (this.httprequest.soptions.usages.indexOf(this.httprequest.protocol) == -1)) { this.httprequest.protocol = 0; }\r\n\r\n if (this.httprequest.protocol == 10) {\r\n //\r\n // Basic file transfer\r\n //\r\n var stats = null;\r\n if ((process.platform != \'win32\') && (this.httprequest.xoptions.file.startsWith(\'/\') == false)) { this.httprequest.xoptions.file = \'/\' + this.httprequest.xoptions.file; }\r\n try { stats = require(\'fs\').statSync(this.httprequest.xoptions.file) } catch (e) { }\r\n try { if (stats) { this.httprequest.downloadFile = fs.createReadStream(this.httprequest.xoptions.file, { flags: \'rbN\' }); } } catch (e) { }\r\n if (this.httprequest.downloadFile) {\r\n MeshServerLogEx(106, [this.httprequest.xoptions.file, stats.size], \'Download: \\"\' + this.httprequest.xoptions.file + \'\\", Size: \' + stats.size, this.httprequest);\r\n //sendConsoleText(\'BasicFileTransfer, ok, \' + this.httprequest.xoptions.file + \', \' + JSON.stringify(stats));\r\n this.write(JSON.stringify({ op: \'ok\', size: stats.size }));\r\n this.httprequest.downloadFile.pipe(this);\r\n this.httprequest.downloadFile.end = function () { }\r\n } else {\r\n //sendConsoleText(\'BasicFileTransfer, cancel, \' + this.httprequest.xoptions.file);\r\n this.write(JSON.stringify({ op: \'cancel\' }));\r\n }\r\n }\r\n else if ((this.httprequest.protocol == 1) || (this.httprequest.protocol == 6) || (this.httprequest.protocol == 8) || (this.httprequest.protocol == 9)) {\r\n //\r\n // Remote Terminal\r\n //\r\n\r\n // Check user access rights for terminal\r\n if (((this.httprequest.rights & MESHRIGHT_REMOTECONTROL) == 0) || ((this.httprequest.rights != 0xFFFFFFFF) && ((this.httprequest.rights & MESHRIGHT_NOTERMINAL) != 0))) {\r\n // Disengage this tunnel, user does not have the rights to do this!!\r\n this.httprequest.protocol = 999999;\r\n this.httprequest.s.end();\r\n sendConsoleText("Error: No Terminal Control Rights.");\r\n return;\r\n }\r\n\r\n this.descriptorMetadata = "Remote Terminal";\r\n\r\n if (process.platform == \'win32\') {\r\n if (!require(\'win-terminal\').PowerShellCapable() && (this.httprequest.protocol == 6 || this.httprequest.protocol == 9)) {\r\n this.httprequest.write(JSON.stringify({ ctrlChannel: \'102938\', type: \'console\', msg: \'PowerShell is not supported on this version of windows\', msgid: 1 }));\r\n this.httprequest.s.end();\r\n return;\r\n }\r\n }\r\n\r\n var prom = require(\'promise\');\r\n this.httprequest.tpromise = new prom(function (res, rej) { this._res = res; this._rej = rej; });\r\n this.httprequest.tpromise.that = this;\r\n this.httprequest.tpromise.httprequest = this.httprequest;\r\n\r\n this.end = function () {\r\n if (this.httprequest.tpromise._consent) { this.httprequest.tpromise._consent.close(); }\r\n if (this.httprequest.connectionPromise) { this.httprequest.connectionPromise._rej(\'Closed\'); }\r\n\r\n // Remove the terminal session to the count to update the server\r\n if (this.httprequest.userid != null) {\r\n if (tunnelUserCount.terminal[this.httprequest.userid] != null) { tunnelUserCount.terminal[this.httprequest.userid]--; if (tunnelUserCount.terminal[this.httprequest.userid] <= 0) { delete tunnelUserCount.terminal[this.httprequest.userid]; } }\r\n try { mesh.SendCommand({ action: \'sessions\', type: \'terminal\', value: tunnelUserCount.terminal }); } catch (e) { }\r\n broadcastSessionsToRegisteredApps();\r\n }\r\n\r\n if (process.platform == \'win32\') {\r\n // Unpipe the web socket\r\n this.unpipe(this.httprequest._term);\r\n if (this.httprequest._term) { this.httprequest._term.unpipe(this); }\r\n\r\n // Unpipe the WebRTC channel if needed (This will also be done when the WebRTC channel ends).\r\n if (this.rtcchannel) {\r\n this.rtcchannel.unpipe(this.httprequest._term);\r\n if (this.httprequest._term) { this.httprequest._term.unpipe(this.rtcchannel); }\r\n }\r\n\r\n // Clean up\r\n if (this.httprequest._term) { this.httprequest._term.end(); }\r\n this.httprequest._term = null;\r\n }\r\n };\r\n\r\n // Perform User-Consent if needed. \r\n if (this.httprequest.consent && (this.httprequest.consent & 16)) {\r\n this.write(JSON.stringify({ ctrlChannel: \'102938\', type: \'console\', msg: "Waiting for user to grant access...", msgid: 1 }));\r\n var consentMessage = this.httprequest.username + " requesting remote terminal access. Grant access?", consentTitle = \'MeshCentral\';\r\n if (this.httprequest.soptions != null) {\r\n if (this.httprequest.soptions.consentTitle != null) { consentTitle = this.httprequest.soptions.consentTitle; }\r\n if (this.httprequest.soptions.consentMsgTerminal != null) { consentMessage = this.httprequest.soptions.consentMsgTerminal.replace(\'{0}\', this.httprequest.realname).replace(\'{1}\', this.httprequest.username); }\r\n }\r\n this.httprequest.tpromise._consent = require(\'message-box\').create(consentTitle, consentMessage, 30);\r\n this.httprequest.tpromise._consent.retPromise = this.httprequest.tpromise;\r\n this.httprequest.tpromise._consent.then(\r\n function () {\r\n // Success\r\n MeshServerLogEx(27, null, "Local user accepted remote terminal request (" + this.retPromise.httprequest.remoteaddr + ")", this.retPromise.that.httprequest);\r\n this.retPromise.that.write(JSON.stringify({ ctrlChannel: \'102938\', type: \'console\', msg: null, msgid: 0 }));\r\n this.retPromise._consent = null;\r\n this.retPromise._res();\r\n },\r\n function (e) {\r\n // Denied\r\n MeshServerLogEx(28, null, "Local user rejected remote terminal request (" + this.retPromise.that.httprequest.remoteaddr + ")", this.retPromise.that.httprequest);\r\n this.retPromise.that.write(JSON.stringify({ ctrlChannel: \'102938\', type: \'console\', msg: e.toString(), msgid: 2 }));\r\n this.retPromise._rej(e.toString());\r\n });\r\n }\r\n else {\r\n // User-Consent is not required, so just resolve this promise\r\n this.httprequest.tpromise._res();\r\n }\r\n\r\n\r\n this.httprequest.tpromise.then(\r\n function () {\r\n this.httprequest.connectionPromise = new prom(function (res, rej) { this._res = res; this._rej = rej; });\r\n this.httprequest.connectionPromise.ws = this.that;\r\n\r\n // Start Terminal\r\n if (process.platform == \'win32\') {\r\n try {\r\n var cols = 80, rows = 25;\r\n if (this.httprequest.xoptions) {\r\n if (this.httprequest.xoptions.rows) { rows = this.httprequest.xoptions.rows; }\r\n if (this.httprequest.xoptions.cols) { cols = this.httprequest.xoptions.cols; }\r\n }\r\n\r\n if ((this.httprequest.protocol == 1) || (this.httprequest.protocol == 6)) {\r\n // Admin Terminal\r\n if (require(\'win-virtual-terminal\').supported) {\r\n // ConPTY PseudoTerminal\r\n // this.httprequest._term = require(\'win-virtual-terminal\')[this.httprequest.protocol == 6 ? \'StartPowerShell\' : \'Start\'](80, 25);\r\n\r\n // The above line is commented out, because there is a bug with ClosePseudoConsole() API, so this is the workaround\r\n this.httprequest._dispatcher = require(\'win-dispatcher\').dispatch({ modules: [{ name: \'win-virtual-terminal\', script: getJSModule(\'win-virtual-terminal\') }], launch: { module: \'win-virtual-terminal\', method: (this.httprequest.protocol == 6 ? \'StartPowerShell\' : \'Start\'), args: [cols, rows] } });\r\n this.httprequest._dispatcher.httprequest = this.httprequest;\r\n this.httprequest._dispatcher.on(\'connection\', function (c) {\r\n if (this.httprequest.connectionPromise.completed) {\r\n c.end();\r\n }\r\n else {\r\n this.httprequest.connectionPromise._res(c);\r\n }\r\n });\r\n }\r\n else {\r\n // Legacy Terminal\r\n this.httprequest.connectionPromise._res(require(\'win-terminal\')[this.httprequest.protocol == 6 ? \'StartPowerShell\' : \'Start\'](cols, rows));\r\n }\r\n }\r\n else {\r\n // Logged in user\r\n var userPromise = require(\'user-sessions\').enumerateUsers();\r\n userPromise.that = this;\r\n userPromise.then(function (u) {\r\n var that = this.that;\r\n if (u.Active.length > 0) {\r\n var username = \'"\' + u.Active[0].Domain + \'\\\\\' + u.Active[0].Username + \'"\';\r\n sendConsoleText(\'Terminal: \' + username);\r\n if (require(\'win-virtual-terminal\').supported) {\r\n // ConPTY PseudoTerminal\r\n that.httprequest._dispatcher = require(\'win-dispatcher\').dispatch({ user: username, modules: [{ name: \'win-virtual-terminal\', script: getJSModule(\'win-virtual-terminal\') }], launch: { module: \'win-virtual-terminal\', method: (that.httprequest.protocol == 9 ? \'StartPowerShell\' : \'Start\'), args: [cols, rows] } });\r\n }\r\n else {\r\n // Legacy Terminal\r\n that.httprequest._dispatcher = require(\'win-dispatcher\').dispatch({ user: username, modules: [{ name: \'win-terminal\', script: getJSModule(\'win-terminal\') }], launch: { module: \'win-terminal\', method: (that.httprequest.protocol == 9 ? \'StartPowerShell\' : \'Start\'), args: [cols, rows] } });\r\n }\r\n that.httprequest._dispatcher.ws = that;\r\n that.httprequest._dispatcher.on(\'connection\', function (c) {\r\n if (this.ws.httprequest.connectionPromise.completed) {\r\n c.end();\r\n }\r\n else {\r\n this.ws.httprequest.connectionPromise._res(c);\r\n }\r\n });\r\n }\r\n });\r\n }\r\n }\r\n catch (e) {\r\n this.httprequest.connectionPromise._rej(\'Failed to start remote terminal session, \' + e.toString());\r\n }\r\n }\r\n else {\r\n try {\r\n var bash = fs.existsSync(\'/bin/bash\') ? \'/bin/bash\' : false;\r\n var sh = fs.existsSync(\'/bin/sh\') ? \'/bin/sh\' : false;\r\n var login = process.platform == \'linux\' ? \'/bin/login\' : \'/usr/bin/login\';\r\n\r\n var env = { HISTCONTROL: \'ignoreboth\' };\r\n if (this.httprequest.xoptions) {\r\n if (this.httprequest.xoptions.rows) { env.LINES = (\'\' + this.httprequest.xoptions.rows); }\r\n if (this.httprequest.xoptions.cols) { env.COLUMNS = (\'\' + this.httprequest.xoptions.cols); }\r\n }\r\n var options = { type: childProcess.SpawnTypes.TERM, uid: (this.httprequest.protocol == 8) ? require(\'user-sessions\').consoleUid() : null, env: env };\r\n if (this.httprequest.xoptions && this.httprequest.xoptions.requireLogin) {\r\n if (!require(\'fs\').existsSync(login)) { throw (\'Unable to spawn login process\'); }\r\n this.httprequest.connectionPromise._res(childProcess.execFile(login, [\'login\'], options)); // Start login shell\r\n }\r\n else if (bash) {\r\n var p = childProcess.execFile(bash, [\'bash\'], options); // Start bash\r\n // Spaces at the beginning of lines are needed to hide commands from the command history\r\n if (process.platform == \'linux\') { p.stdin.write(\' alias ls=\\\'ls --color=auto\\\';clear\\n\'); }\r\n this.httprequest.connectionPromise._res(p);\r\n }\r\n else if (sh) {\r\n var p = childProcess.execFile(sh, [\'sh\'], options); // Start sh\r\n // Spaces at the beginning of lines are needed to hide commands from the command history\r\n if (process.platform == \'linux\') { p.stdin.write(\' alias ls=\\\'ls --color=auto\\\';clear\\n\'); }\r\n this.httprequest.connectionPromise._res(p);\r\n }\r\n else {\r\n this.httprequest.connectionPromise._rej(\'Failed to start remote terminal session, no shell found\');\r\n }\r\n }\r\n catch (e) {\r\n this.httprequest.connectionPromise._rej(\'Failed to start remote terminal session, \' + e.toString());\r\n }\r\n }\r\n\r\n this.httprequest.connectionPromise.then(\r\n function (term) {\r\n // SUCCESS\r\n var stdoutstream;\r\n var stdinstream;\r\n if (process.platform == \'win32\') {\r\n this.ws.httprequest._term = term;\r\n this.ws.httprequest._term.tunnel = this.ws;\r\n stdoutstream = stdinstream = term;\r\n }\r\n else {\r\n term.descriptorMetadata = \'Remote Terminal\';\r\n this.ws.httprequest.process = term;\r\n this.ws.httprequest.process.tunnel = this.ws;\r\n term.stderr.stdout = term.stdout;\r\n term.stderr.on(\'data\', function (c) { this.stdout.write(c); });\r\n stdoutstream = term.stdout;\r\n stdinstream = term.stdin;\r\n this.ws.prependListener(\'end\', function () { this.httprequest.process.kill(); });\r\n term.prependListener(\'exit\', function () { this.tunnel.end(); });\r\n }\r\n\r\n this.ws.removeAllListeners(\'data\');\r\n this.ws.on(\'data\', onTunnelControlData);\r\n\r\n stdoutstream.pipe(this.ws, { dataTypeSkip: 1 }); // 0 = Binary, 1 = Text.\r\n this.ws.pipe(stdinstream, { dataTypeSkip: 1, end: false }); // 0 = Binary, 1 = Text. \r\n\r\n // Add the terminal session to the count to update the server\r\n if (this.ws.httprequest.userid != null) {\r\n if (tunnelUserCount.terminal[this.ws.httprequest.userid] == null) { tunnelUserCount.terminal[this.ws.httprequest.userid] = 1; } else { tunnelUserCount.terminal[this.ws.httprequest.userid]++; }\r\n try { mesh.SendCommand({ action: \'sessions\', type: \'terminal\', value: tunnelUserCount.terminal }); } catch (e) { }\r\n broadcastSessionsToRegisteredApps();\r\n }\r\n\r\n // Toast Notification, if required\r\n if (this.ws.httprequest.consent && (this.ws.httprequest.consent & 2)) {\r\n // User Notifications is required\r\n var notifyMessage = this.ws.httprequest.username + " started a remote terminal session.", notifyTitle = "MeshCentral";\r\n if (this.ws.httprequest.soptions != null) {\r\n if (this.ws.httprequest.soptions.notifyTitle != null) { notifyTitle = this.ws.httprequest.soptions.notifyTitle; }\r\n if (this.ws.httprequest.soptions.notifyMsgTerminal != null) { notifyMessage = this.ws.httprequest.soptions.notifyMsgTerminal.replace(\'{0}\', this.ws.httprequest.realname).replace(\'{1}\', this.ws.httprequest.username); }\r\n }\r\n try { require(\'toaster\').Toast(notifyTitle, notifyMessage); } catch (e) { }\r\n }\r\n },\r\n function (e) {\r\n // FAILED to connect terminal\r\n this.ws.write(JSON.stringify({ ctrlChannel: \'102938\', type: \'console\', msg: e.toString(), msgid: 2 }));\r\n this.ws.end();\r\n });\r\n },\r\n function (e) {\r\n // DO NOT start terminal\r\n this.that.write(JSON.stringify({ ctrlChannel: \'102938\', type: \'console\', msg: e.toString(), msgid: 2 }));\r\n this.that.end();\r\n });\r\n }\r\n else if (this.httprequest.protocol == 2) {\r\n //\r\n // Remote Desktop\r\n //\r\n\r\n // Check user access rights for desktop\r\n if ((((this.httprequest.rights & MESHRIGHT_REMOTECONTROL) == 0) && ((this.httprequest.rights & MESHRIGHT_REMOTEVIEW) == 0)) || ((this.httprequest.rights != 0xFFFFFFFF) && ((this.httprequest.rights & MESHRIGHT_NODESKTOP) != 0))) {\r\n // Disengage this tunnel, user does not have the rights to do this!!\r\n this.httprequest.protocol = 999999;\r\n this.httprequest.s.end();\r\n sendConsoleText("Error: No Desktop Control Rights.");\r\n return;\r\n }\r\n\r\n this.descriptorMetadata = "Remote KVM";\r\n\r\n // Look for a TSID\r\n var tsid = null;\r\n if ((this.httprequest.xoptions != null) && (typeof this.httprequest.xoptions.tsid == \'number\')) { tsid = this.httprequest.xoptions.tsid; }\r\n require(\'MeshAgent\')._tsid = tsid;\r\n\r\n // Remote desktop using native pipes\r\n this.httprequest.desktop = { state: 0, kvm: mesh.getRemoteDesktopStream(tsid), tunnel: this };\r\n this.httprequest.desktop.kvm.parent = this.httprequest.desktop;\r\n this.desktop = this.httprequest.desktop;\r\n\r\n // Add ourself to the list of remote desktop sessions\r\n if (this.httprequest.desktop.kvm.tunnels == null) { this.httprequest.desktop.kvm.tunnels = []; }\r\n this.httprequest.desktop.kvm.tunnels.push(this);\r\n\r\n // Send a metadata update to all desktop sessions\r\n var users = {};\r\n if (this.httprequest.desktop.kvm.tunnels != null) {\r\n for (var i in this.httprequest.desktop.kvm.tunnels) { try { var userid = this.httprequest.desktop.kvm.tunnels[i].httprequest.userid; if (users[userid] == null) { users[userid] = 1; } else { users[userid]++; } } catch (e) { } }\r\n for (var i in this.httprequest.desktop.kvm.tunnels) { try { this.httprequest.desktop.kvm.tunnels[i].write(JSON.stringify({ ctrlChannel: \'102938\', type: \'metadata\', users: users })); } catch (e) { } }\r\n tunnelUserCount.desktop = users;\r\n try { mesh.SendCommand({ action: \'sessions\', type: \'kvm\', value: users }); } catch (e) { }\r\n broadcastSessionsToRegisteredApps();\r\n }\r\n\r\n this.end = function () {\r\n --this.desktop.kvm.connectionCount;\r\n\r\n // Remove ourself from the list of remote desktop session\r\n var i = this.desktop.kvm.tunnels.indexOf(this);\r\n if (i >= 0) { this.desktop.kvm.tunnels.splice(i, 1); }\r\n\r\n // Send a metadata update to all desktop sessions\r\n var users = {};\r\n if (this.httprequest.desktop.kvm.tunnels != null) {\r\n for (var i in this.httprequest.desktop.kvm.tunnels) { try { var userid = this.httprequest.desktop.kvm.tunnels[i].httprequest.userid; if (users[userid] == null) { users[userid] = 1; } else { users[userid]++; } } catch (e) { } }\r\n for (var i in this.httprequest.desktop.kvm.tunnels) { try { this.httprequest.desktop.kvm.tunnels[i].write(JSON.stringify({ ctrlChannel: \'102938\', type: \'metadata\', users: users })); } catch (e) { } }\r\n tunnelUserCount.desktop = users;\r\n try { mesh.SendCommand({ action: \'sessions\', type: \'kvm\', value: users }); } catch (e) { }\r\n broadcastSessionsToRegisteredApps();\r\n }\r\n\r\n // Unpipe the web socket\r\n try {\r\n this.unpipe(this.httprequest.desktop.kvm);\r\n this.httprequest.desktop.kvm.unpipe(this);\r\n }\r\n catch (e) { }\r\n\r\n // Unpipe the WebRTC channel if needed (This will also be done when the WebRTC channel ends).\r\n if (this.rtcchannel) {\r\n try {\r\n this.rtcchannel.unpipe(this.httprequest.desktop.kvm);\r\n this.httprequest.desktop.kvm.unpipe(this.rtcchannel);\r\n }\r\n catch (e) { }\r\n }\r\n\r\n // Place wallpaper back if needed\r\n // TODO\r\n\r\n if (this.desktop.kvm.connectionCount == 0) {\r\n // Display a toast message. This may not be supported on all platforms.\r\n // try { require(\'toaster\').Toast(\'MeshCentral\', \'Remote Desktop Control Ended.\'); } catch (e) { }\r\n\r\n this.httprequest.desktop.kvm.end();\r\n if (this.httprequest.desktop.kvm.connectionBar) {\r\n this.httprequest.desktop.kvm.connectionBar.removeAllListeners(\'close\');\r\n this.httprequest.desktop.kvm.connectionBar.close();\r\n this.httprequest.desktop.kvm.connectionBar = null;\r\n }\r\n } else {\r\n for (var i in this.httprequest.desktop.kvm.users) {\r\n if ((this.httprequest.desktop.kvm.users[i] == this.httprequest.username) && this.httprequest.desktop.kvm.connectionBar) {\r\n for (var j in this.httprequest.desktop.kvm.rusers) { if (this.httprequest.desktop.kvm.rusers[j] == this.httprequest.realname) { this.httprequest.desktop.kvm.rusers.splice(j, 1); break; } }\r\n this.httprequest.desktop.kvm.users.splice(i, 1);\r\n this.httprequest.desktop.kvm.connectionBar.removeAllListeners(\'close\');\r\n this.httprequest.desktop.kvm.connectionBar.close();\r\n this.httprequest.desktop.kvm.connectionBar = require(\'notifybar-desktop\')(this.httprequest.privacybartext.replace(\'{0}\', this.httprequest.desktop.kvm.rusers.join(\', \')).replace(\'{1}\', this.httprequest.desktop.kvm.users.join(\', \')), require(\'MeshAgent\')._tsid);\r\n this.httprequest.desktop.kvm.connectionBar.httprequest = this.httprequest;\r\n this.httprequest.desktop.kvm.connectionBar.on(\'close\', function () {\r\n MeshServerLogEx(29, null, "Remote Desktop Connection forcefully closed by local user (" + this.httprequest.remoteaddr + ")", this.httprequest);\r\n for (var i in this.httprequest.desktop.kvm._pipedStreams) {\r\n this.httprequest.desktop.kvm._pipedStreams[i].end();\r\n }\r\n this.httprequest.desktop.kvm.end();\r\n });\r\n break;\r\n }\r\n }\r\n }\r\n };\r\n if (this.httprequest.desktop.kvm.hasOwnProperty(\'connectionCount\')) {\r\n this.httprequest.desktop.kvm.connectionCount++;\r\n this.httprequest.desktop.kvm.rusers.push(this.httprequest.realname);\r\n this.httprequest.desktop.kvm.users.push(this.httprequest.username);\r\n this.httprequest.desktop.kvm.rusers.sort();\r\n this.httprequest.desktop.kvm.users.sort();\r\n } else {\r\n this.httprequest.desktop.kvm.connectionCount = 1;\r\n this.httprequest.desktop.kvm.rusers = [this.httprequest.realname];\r\n this.httprequest.desktop.kvm.users = [this.httprequest.username];\r\n }\r\n\r\n if ((this.httprequest.rights == 0xFFFFFFFF) || (((this.httprequest.rights & MESHRIGHT_REMOTECONTROL) != 0) && ((this.httprequest.rights & MESHRIGHT_REMOTEVIEW) == 0))) {\r\n // If we have remote control rights, pipe the KVM input\r\n this.pipe(this.httprequest.desktop.kvm, { dataTypeSkip: 1, end: false }); // 0 = Binary, 1 = Text. Pipe the Browser --> KVM input.\r\n } else {\r\n // We need to only pipe non-mouse & non-keyboard inputs.\r\n //sendConsoleText(\'Warning: No Remote Desktop Input Rights.\');\r\n // TODO!!!\r\n }\r\n\r\n // Perform notification if needed. Toast messages may not be supported on all platforms.\r\n if (this.httprequest.consent && (this.httprequest.consent & 8)) {\r\n // User Consent Prompt is required\r\n // Send a console message back using the console channel, "\\n" is supported.\r\n this.write(JSON.stringify({ ctrlChannel: \'102938\', type: \'console\', msg: "Waiting for user to grant access...", msgid: 1 }));\r\n var consentMessage = this.httprequest.realname + " requesting remote desktop access. Grant access?", consentTitle = \'MeshCentral\';\r\n if (this.httprequest.soptions != null) {\r\n if (this.httprequest.soptions.consentTitle != null) { consentTitle = this.httprequest.soptions.consentTitle; }\r\n if (this.httprequest.soptions.consentMsgDesktop != null) { consentMessage = this.httprequest.soptions.consentMsgDesktop.replace(\'{0}\', this.httprequest.realname).replace(\'{1}\', this.httprequest.username); }\r\n }\r\n var pr = require(\'message-box\').create(consentTitle, consentMessage, 30, null, tsid);\r\n pr.ws = this;\r\n this.pause();\r\n this._consentpromise = pr;\r\n this.prependOnceListener(\'end\', function () { if (this._consentpromise && this._consentpromise.close) { this._consentpromise.close(); } });\r\n pr.then(\r\n function () {\r\n // Success\r\n this.ws._consentpromise = null;\r\n MeshServerLogEx(30, null, "Starting remote desktop after local user accepted (" + this.ws.httprequest.remoteaddr + ")", this.ws.httprequest);\r\n this.ws.write(JSON.stringify({ ctrlChannel: \'102938\', type: \'console\', msg: null, msgid: 0 }));\r\n if (this.ws.httprequest.consent && (this.ws.httprequest.consent & 1)) {\r\n // User Notifications is required\r\n var notifyMessage = this.ws.httprequest.realname + " started a remote desktop session.", notifyTitle = "MeshCentral";\r\n if (this.ws.httprequest.soptions != null) {\r\n if (this.ws.httprequest.soptions.notifyTitle != null) { notifyTitle = this.ws.httprequest.soptions.notifyTitle; }\r\n if (this.ws.httprequest.soptions.notifyMsgDesktop != null) { notifyMessage = this.ws.httprequest.soptions.notifyMsgDesktop.replace(\'{0}\', this.ws.httprequest.realname).replace(\'{1}\', this.ws.httprequest.username); }\r\n }\r\n try { require(\'toaster\').Toast(notifyTitle, notifyMessage, tsid); } catch (e) { }\r\n }\r\n if (this.ws.httprequest.consent && (this.ws.httprequest.consent & 0x40)) {\r\n // Connection Bar is required\r\n if (this.ws.httprequest.desktop.kvm.connectionBar) {\r\n this.ws.httprequest.desktop.kvm.connectionBar.removeAllListeners(\'close\');\r\n this.ws.httprequest.desktop.kvm.connectionBar.close();\r\n }\r\n try {\r\n this.ws.httprequest.desktop.kvm.connectionBar = require(\'notifybar-desktop\')(this.ws.httprequest.privacybartext.replace(\'{0}\', this.ws.httprequest.desktop.kvm.rusers.join(\', \')).replace(\'{1}\', this.ws.httprequest.desktop.kvm.users.join(\', \')), require(\'MeshAgent\')._tsid);\r\n MeshServerLogEx(31, null, "Remote Desktop Connection Bar Activated/Updated (" + this.ws.httprequest.remoteaddr + ")", this.ws.httprequest);\r\n }\r\n catch (e) {\r\n if (process.platform != \'darwin\') {\r\n MeshServerLogEx(32, null, "Remote Desktop Connection Bar Failed or Not Supported (" + this.ws.httprequest.remoteaddr + ")", this.ws.httprequest);\r\n }\r\n }\r\n if (this.ws.httprequest.desktop.kvm.connectionBar) {\r\n this.ws.httprequest.desktop.kvm.connectionBar.httprequest = this.ws.httprequest;\r\n this.ws.httprequest.desktop.kvm.connectionBar.on(\'close\', function () {\r\n MeshServerLogEx(33, null, "Remote Desktop Connection forcefully closed by local user (" + this.httprequest.remoteaddr + ")", this.httprequest);\r\n for (var i in this.httprequest.desktop.kvm._pipedStreams) {\r\n this.httprequest.desktop.kvm._pipedStreams[i].end();\r\n }\r\n this.httprequest.desktop.kvm.end();\r\n });\r\n }\r\n }\r\n this.ws.httprequest.desktop.kvm.pipe(this.ws, { dataTypeSkip: 1 });\r\n this.ws.resume();\r\n },\r\n function (e) {\r\n // User Consent Denied/Failed\r\n this.ws._consentpromise = null;\r\n MeshServerLogEx(34, null, "Failed to start remote desktop after local user rejected (" + this.ws.httprequest.remoteaddr + ")", this.ws.httprequest);\r\n this.ws.end(JSON.stringify({ ctrlChannel: \'102938\', type: \'console\', msg: e.toString(), msgid: 2 }));\r\n });\r\n } else {\r\n // User Consent Prompt is not required\r\n if (this.httprequest.consent && (this.httprequest.consent & 1)) {\r\n // User Notifications is required\r\n MeshServerLogEx(35, null, "Started remote desktop with toast notification (" + this.httprequest.remoteaddr + ")", this.httprequest);\r\n var notifyMessage = this.httprequest.realname + " started a remote desktop session.", notifyTitle = "MeshCentral";\r\n if (this.httprequest.soptions != null) {\r\n if (this.httprequest.soptions.notifyTitle != null) { notifyTitle = this.httprequest.soptions.notifyTitle; }\r\n if (this.httprequest.soptions.notifyMsgDesktop != null) { notifyMessage = this.httprequest.soptions.notifyMsgDesktop.replace(\'{0}\', this.httprequest.realname).replace(\'{1}\', this.httprequest.username); }\r\n }\r\n try { require(\'toaster\').Toast(notifyTitle, notifyMessage, tsid); } catch (e) { }\r\n } else {\r\n MeshServerLogEx(36, null, "Started remote desktop without notification (" + this.httprequest.remoteaddr + ")", this.httprequest);\r\n }\r\n if (this.httprequest.consent && (this.httprequest.consent & 0x40)) {\r\n // Connection Bar is required\r\n if (this.httprequest.desktop.kvm.connectionBar) {\r\n this.httprequest.desktop.kvm.connectionBar.removeAllListeners(\'close\');\r\n this.httprequest.desktop.kvm.connectionBar.close();\r\n }\r\n try {\r\n this.httprequest.desktop.kvm.connectionBar = require(\'notifybar-desktop\')(this.httprequest.privacybartext.replace(\'{0}\', this.httprequest.desktop.kvm.rusers.join(\', \')).replace(\'{1}\', this.httprequest.desktop.kvm.users.join(\', \')), require(\'MeshAgent\')._tsid);\r\n MeshServerLogEx(37, null, "Remote Desktop Connection Bar Activated/Updated (" + this.httprequest.remoteaddr + ")", this.httprequest);\r\n }\r\n catch (e) {\r\n MeshServerLogEx(38, null, "Remote Desktop Connection Bar Failed or not Supported (" + this.httprequest.remoteaddr + ")", this.httprequest);\r\n }\r\n if (this.httprequest.desktop.kvm.connectionBar) {\r\n this.httprequest.desktop.kvm.connectionBar.httprequest = this.httprequest;\r\n this.httprequest.desktop.kvm.connectionBar.on(\'close\', function () {\r\n MeshServerLogEx(39, null, "Remote Desktop Connection forcefully closed by local user (" + this.httprequest.remoteaddr + ")", this.httprequest);\r\n for (var i in this.httprequest.desktop.kvm._pipedStreams) {\r\n this.httprequest.desktop.kvm._pipedStreams[i].end();\r\n }\r\n this.httprequest.desktop.kvm.end();\r\n });\r\n }\r\n }\r\n this.httprequest.desktop.kvm.pipe(this, { dataTypeSkip: 1 });\r\n }\r\n\r\n this.removeAllListeners(\'data\');\r\n this.on(\'data\', onTunnelControlData);\r\n //this.write(\'MeshCore KVM Hello!1\');\r\n\r\n } else if (this.httprequest.protocol == 5) {\r\n //\r\n // Remote Files\r\n //\r\n\r\n // Check user access rights for files\r\n if (((this.httprequest.rights & MESHRIGHT_REMOTECONTROL) == 0) || ((this.httprequest.rights != 0xFFFFFFFF) && ((this.httprequest.rights & MESHRIGHT_NOFILES) != 0))) {\r\n // Disengage this tunnel, user does not have the rights to do this!!\r\n this.httprequest.protocol = 999999;\r\n this.httprequest.s.end();\r\n sendConsoleText("Error: No files control rights.");\r\n return;\r\n }\r\n\r\n this.descriptorMetadata = "Remote Files";\r\n\r\n // Add the files session to the count to update the server\r\n if (this.httprequest.userid != null) {\r\n if (tunnelUserCount.files[this.httprequest.userid] == null) { tunnelUserCount.files[this.httprequest.userid] = 1; } else { tunnelUserCount.files[this.httprequest.userid]++; }\r\n try { mesh.SendCommand({ action: \'sessions\', type: \'files\', value: tunnelUserCount.files }); } catch (e) { }\r\n broadcastSessionsToRegisteredApps();\r\n }\r\n\r\n this.end = function () {\r\n // Remove the files session from the count to update the server\r\n if (this.httprequest.userid != null) {\r\n if (tunnelUserCount.files[this.httprequest.userid] != null) { tunnelUserCount.files[this.httprequest.userid]--; if (tunnelUserCount.files[this.httprequest.userid] <= 0) { delete tunnelUserCount.files[this.httprequest.userid]; } }\r\n try { mesh.SendCommand({ action: \'sessions\', type: \'files\', value: tunnelUserCount.files }); } catch (e) { }\r\n broadcastSessionsToRegisteredApps();\r\n }\r\n };\r\n\r\n // Perform notification if needed. Toast messages may not be supported on all platforms.\r\n if (this.httprequest.consent && (this.httprequest.consent & 32)) {\r\n // User Consent Prompt is required\r\n // Send a console message back using the console channel, "\\n" is supported.\r\n this.write(JSON.stringify({ ctrlChannel: \'102938\', type: \'console\', msg: "Waiting for user to grant access...", msgid: 1 }));\r\n var consentMessage = this.httprequest.realname + " requesting remote file Access. Grant access?", consentTitle = \'MeshCentral\';\r\n if (this.httprequest.soptions != null) {\r\n if (this.httprequest.soptions.consentTitle != null) { consentTitle = this.httprequest.soptions.consentTitle; }\r\n if (this.httprequest.soptions.consentMsgFiles != null) { consentMessage = this.httprequest.soptions.consentMsgFiles.replace(\'{0}\', this.httprequest.realname).replace(\'{1}\', this.httprequest.username); }\r\n }\r\n var pr = require(\'message-box\').create(consentTitle, consentMessage, 30);\r\n pr.ws = this;\r\n this.pause();\r\n this._consentpromise = pr;\r\n this.prependOnceListener(\'end\', function () { if (this._consentpromise && this._consentpromise.close) { this._consentpromise.close(); } });\r\n pr.then(\r\n function () {\r\n // Success\r\n this.ws._consentpromise = null;\r\n MeshServerLogEx(40, null, "Starting remote files after local user accepted (" + this.ws.httprequest.remoteaddr + ")", this.ws.httprequest);\r\n this.ws.write(JSON.stringify({ ctrlChannel: \'102938\', type: \'console\', msg: null }));\r\n if (this.ws.httprequest.consent && (this.ws.httprequest.consent & 4)) {\r\n // User Notifications is required\r\n var notifyMessage = this.ws.httprequest.realname + " started a remote file session.", notifyTitle = "MeshCentral";\r\n if (this.ws.httprequest.soptions != null) {\r\n if (this.ws.httprequest.soptions.notifyTitle != null) { notifyTitle = this.ws.httprequest.soptions.notifyTitle; }\r\n if (this.ws.httprequest.soptions.notifyMsgFiles != null) { notifyMessage = this.ws.httprequest.soptions.notifyMsgFiles.replace(\'{0}\', this.ws.httprequest.realname).replace(\'{1}\', this.ws.httprequest.username); }\r\n }\r\n try { require(\'toaster\').Toast(notifyTitle, notifyMessage); } catch (e) { }\r\n }\r\n this.ws.resume();\r\n },\r\n function (e) {\r\n // User Consent Denied/Failed\r\n this.ws._consentpromise = null;\r\n MeshServerLogEx(41, null, "Failed to start remote files after local user rejected (" + this.ws.httprequest.remoteaddr + ")", this.ws.httprequest);\r\n this.ws.end(JSON.stringify({ ctrlChannel: \'102938\', type: \'console\', msg: e.toString(), msgid: 2 }));\r\n });\r\n } else {\r\n // User Consent Prompt is not required\r\n if (this.httprequest.consent && (this.httprequest.consent & 4)) {\r\n // User Notifications is required\r\n MeshServerLogEx(42, null, "Started remote files with toast notification (" + this.httprequest.remoteaddr + ")", this.httprequest);\r\n var notifyMessage = this.httprequest.realname + " started a remote file session.", notifyTitle = "MeshCentral";\r\n if (this.httprequest.soptions != null) {\r\n if (this.httprequest.soptions.notifyTitle != null) { notifyTitle = this.httprequest.soptions.notifyTitle; }\r\n if (this.httprequest.soptions.notifyMsgFiles != null) { notifyMessage = this.httprequest.soptions.notifyMsgFiles.replace(\'{0}\', this.httprequest.realname).replace(\'{1}\', this.httprequest.username); }\r\n }\r\n try { require(\'toaster\').Toast(notifyTitle, notifyMessage); } catch (e) { }\r\n } else {\r\n MeshServerLogEx(43, null, "Started remote files without notification (" + this.httprequest.remoteaddr + ")", this.httprequest);\r\n }\r\n this.resume();\r\n }\r\n\r\n // Setup files\r\n // NOP\r\n }\r\n } else if (this.httprequest.protocol == 1) {\r\n // Send data into terminal stdin\r\n //this.write(data); // Echo back the keys (Does not seem to be a good idea)\r\n } else if (this.httprequest.protocol == 2) {\r\n // Send data into remote desktop\r\n if (this.httprequest.desktop.state == 0) {\r\n this.write(Buffer.from(String.fromCharCode(0x11, 0xFE, 0x00, 0x00, 0x4D, 0x45, 0x53, 0x48, 0x00, 0x00, 0x00, 0x00, 0x02)));\r\n this.httprequest.desktop.state = 1;\r\n } else {\r\n this.httprequest.desktop.write(data);\r\n }\r\n } else if (this.httprequest.protocol == 5) {\r\n // Process files commands\r\n var cmd = null;\r\n try { cmd = JSON.parse(data); } catch (e) { };\r\n if (cmd == null) { return; }\r\n if ((cmd.ctrlChannel == \'102938\') || ((cmd.type == \'offer\') && (cmd.sdp != null))) { onTunnelControlData(cmd, this); return; } // If this is control data, handle it now.\r\n if (cmd.action == undefined) { return; }\r\n //sendConsoleText(\'CMD: \' + JSON.stringify(cmd));\r\n\r\n if ((cmd.path != null) && (process.platform != \'win32\') && (cmd.path[0] != \'/\')) { cmd.path = \'/\' + cmd.path; } // Add \'/\' to paths on non-windows\r\n //console.log(objToString(cmd, 0, \' \'));\r\n switch (cmd.action) {\r\n case \'ls\': {\r\n /*\r\n // Close the watcher if required\r\n var samepath = ((this.httprequest.watcher != undefined) && (cmd.path == this.httprequest.watcher.path));\r\n if ((this.httprequest.watcher != undefined) && (samepath == false)) {\r\n //console.log(\'Closing watcher: \' + this.httprequest.watcher.path);\r\n //this.httprequest.watcher.close(); // TODO: This line causes the agent to crash!!!!\r\n delete this.httprequest.watcher;\r\n }\r\n */\r\n\r\n // Send the folder content to the browser\r\n var response = getDirectoryInfo(cmd.path);\r\n if (cmd.reqid != undefined) { response.reqid = cmd.reqid; }\r\n this.write(Buffer.from(JSON.stringify(response)));\r\n\r\n /*\r\n // Start the directory watcher\r\n if ((cmd.path != \'\') && (samepath == false)) {\r\n var watcher = fs.watch(cmd.path, onFileWatcher);\r\n watcher.tunnel = this.httprequest;\r\n watcher.path = cmd.path;\r\n this.httprequest.watcher = watcher;\r\n //console.log(\'Starting watcher: \' + this.httprequest.watcher.path);\r\n }\r\n */\r\n break;\r\n }\r\n case \'mkdir\': {\r\n // Create a new empty folder\r\n fs.mkdirSync(cmd.path);\r\n MeshServerLogEx(44, [cmd.path], "Create folder: \\"" + cmd.path + "\\"", this.httprequest);\r\n break;\r\n }\r\n case \'rm\': {\r\n // Delete, possibly recursive delete\r\n for (var i in cmd.delfiles) {\r\n var p = obj.path.join(cmd.path, cmd.delfiles[i]), delcount = 0;\r\n try { delcount = deleteFolderRecursive(p, cmd.rec); } catch (e) { }\r\n if ((delcount == 1) && !cmd.rec) {\r\n MeshServerLogEx(45, [p], "Delete: \\"" + p + "\\"", this.httprequest);\r\n } else {\r\n if (cmd.rec) {\r\n MeshServerLogEx(46, [p, delcount], "Delete recursive: \\"" + p + "\\", " + delcount + " element(s) removed", this.httprequest);\r\n } else {\r\n MeshServerLogEx(47, [p, delcount], "Delete: \\"" + p + "\\", " + delcount + " element(s) removed", this.httprequest);\r\n }\r\n }\r\n }\r\n break;\r\n }\r\n case \'markcoredump\': {\r\n // If we are asking for the coredump file, set the right path.\r\n var coreDumpPath = null;\r\n if (process.platform == \'win32\') {\r\n if (fs.existsSync(process.coreDumpLocation)) { coreDumpPath = process.coreDumpLocation; }\r\n } else {\r\n if ((process.cwd() != \'//\') && fs.existsSync(process.cwd() + \'core\')) { coreDumpPath = process.cwd() + \'core\'; }\r\n }\r\n if (coreDumpPath != null) { db.Put(\'CoreDumpTime\', require(\'fs\').statSync(coreDumpPath).mtime); }\r\n break;\r\n }\r\n case \'rename\':\r\n {\r\n // Rename a file or folder\r\n var oldfullpath = obj.path.join(cmd.path, cmd.oldname);\r\n var newfullpath = obj.path.join(cmd.path, cmd.newname);\r\n MeshServerLogEx(48, [oldfullpath, cmd.newname], \'Rename: \\"\' + oldfullpath + \'\\" to \\"\' + cmd.newname + \'\\"\', this.httprequest);\r\n try { fs.renameSync(oldfullpath, newfullpath); } catch (e) { console.log(e); }\r\n break;\r\n }\r\n case \'findfile\':\r\n {\r\n // Search for files\r\n var r = require(\'file-search\').find(\'"\' + cmd.path + \'"\', cmd.filter);\r\n if (!r.cancel) { r.cancel = function cancel() { this.child.kill(); }; }\r\n this._search = r;\r\n r.socket = this;\r\n r.socket.reqid = cmd.reqid; // Search request id. This is used to send responses and cancel the request.\r\n r.socket.path = cmd.path; // Search path\r\n r.on(\'result\', function (str) { try { this.socket.write(Buffer.from(JSON.stringify({ action: \'findfile\', r: str.substring(this.socket.path.length), reqid: this.socket.reqid }))); } catch (ex) { } });\r\n r.then(function () { try { this.socket.write(Buffer.from(JSON.stringify({ action: \'findfile\', r: null, reqid: this.socket.reqid }))); } catch (ex) { } });\r\n break;\r\n }\r\n case \'cancelfindfile\':\r\n {\r\n if (this._search) { this._search.cancel(); this._search = null; }\r\n break;\r\n }\r\n case \'download\':\r\n {\r\n // Download a file\r\n var sendNextBlock = 0;\r\n if (cmd.sub == \'start\') { // Setup the download\r\n if ((cmd.path == null) && (cmd.ask == \'coredump\')) { // If we are asking for the coredump file, set the right path.\r\n if (process.platform == \'win32\') {\r\n if (fs.existsSync(process.coreDumpLocation)) { cmd.path = process.coreDumpLocation; }\r\n } else {\r\n if ((process.cwd() != \'//\') && fs.existsSync(process.cwd() + \'core\')) { cmd.path = process.cwd() + \'core\'; }\r\n }\r\n }\r\n MeshServerLogEx((cmd.ask == \'coredump\') ? 104 : 49, [cmd.path], \'Download: \\"\' + cmd.path + \'\\"\', this.httprequest);\r\n if ((cmd.path == null) || (this.filedownload != null)) { this.write({ action: \'download\', sub: \'cancel\', id: this.filedownload.id }); delete this.filedownload; }\r\n this.filedownload = { id: cmd.id, path: cmd.path, ptr: 0 }\r\n try { this.filedownload.f = fs.openSync(this.filedownload.path, \'rbN\'); } catch (e) { this.write({ action: \'download\', sub: \'cancel\', id: this.filedownload.id }); delete this.filedownload; }\r\n if (this.filedownload) { this.write({ action: \'download\', sub: \'start\', id: cmd.id }); }\r\n } else if ((this.filedownload != null) && (cmd.id == this.filedownload.id)) { // Download commands\r\n if (cmd.sub == \'startack\') { sendNextBlock = ((typeof cmd.ack == \'number\') ? cmd.ack : 8); } else if (cmd.sub == \'stop\') { delete this.filedownload; } else if (cmd.sub == \'ack\') { sendNextBlock = 1; }\r\n }\r\n // Send the next download block(s)\r\n while (sendNextBlock > 0) {\r\n sendNextBlock--;\r\n var buf = Buffer.alloc(16384);\r\n var len = fs.readSync(this.filedownload.f, buf, 4, 16380, null);\r\n this.filedownload.ptr += len;\r\n if (len < 16380) { buf.writeInt32BE(0x01000001, 0); fs.closeSync(this.filedownload.f); delete this.filedownload; sendNextBlock = 0; } else { buf.writeInt32BE(0x01000000, 0); }\r\n this.write(buf.slice(0, len + 4)); // Write as binary\r\n }\r\n break;\r\n }\r\n case \'upload\':\r\n {\r\n // Upload a file, browser to agent\r\n if (this.httprequest.uploadFile != null) { fs.closeSync(this.httprequest.uploadFile); delete this.httprequest.uploadFile; }\r\n if (cmd.path == undefined) break;\r\n var filepath = cmd.name ? obj.path.join(cmd.path, cmd.name) : cmd.path;\r\n this.httprequest.uploadFilePath = filepath;\r\n this.httprequest.uploadFileSize = 0;\r\n try { this.httprequest.uploadFile = fs.openSync(filepath, \'wbN\'); } catch (e) { this.write(Buffer.from(JSON.stringify({ action: \'uploaderror\', reqid: cmd.reqid }))); break; }\r\n this.httprequest.uploadFileid = cmd.reqid;\r\n if (this.httprequest.uploadFile) { this.write(Buffer.from(JSON.stringify({ action: \'uploadstart\', reqid: this.httprequest.uploadFileid }))); }\r\n break;\r\n }\r\n case \'uploaddone\':\r\n {\r\n // Indicates that an upload is done\r\n if (this.httprequest.uploadFile) {\r\n MeshServerLogEx(105, [this.httprequest.uploadFilePath, this.httprequest.uploadFileSize], \'Upload: \\"\' + this.httprequest.uploadFilePath + \'\\", Size: \' + this.httprequest.uploadFileSize, this.httprequest);\r\n fs.closeSync(this.httprequest.uploadFile);\r\n this.write(Buffer.from(JSON.stringify({ action: \'uploaddone\', reqid: this.httprequest.uploadFileid }))); // Indicate that we closed the file.\r\n delete this.httprequest.uploadFile;\r\n delete this.httprequest.uploadFileid;\r\n delete this.httprequest.uploadFilePath;\r\n delete this.httprequest.uploadFileSize;\r\n }\r\n break;\r\n }\r\n case \'uploadcancel\':\r\n {\r\n // Indicates that an upload is canceled\r\n if (this.httprequest.uploadFile) {\r\n fs.closeSync(this.httprequest.uploadFile);\r\n fs.unlinkSync(this.httprequest.uploadFilePath);\r\n this.write(Buffer.from(JSON.stringify({ action: \'uploadcancel\', reqid: this.httprequest.uploadFileid }))); // Indicate that we closed the file.\r\n delete this.httprequest.uploadFile;\r\n delete this.httprequest.uploadFileid;\r\n delete this.httprequest.uploadFilePath;\r\n delete this.httprequest.uploadFileSize;\r\n }\r\n break;\r\n }\r\n case \'copy\':\r\n {\r\n // Copy a bunch of files from scpath to dspath\r\n for (var i in cmd.names) {\r\n var sc = obj.path.join(cmd.scpath, cmd.names[i]), ds = obj.path.join(cmd.dspath, cmd.names[i]);\r\n MeshServerLogEx(51, [sc, ds], \'Copy: \\"\' + sc + \'\\" to \\"\' + ds + \'\\"\', this.httprequest);\r\n if (sc != ds) { try { fs.copyFileSync(sc, ds); } catch (e) { } }\r\n }\r\n break;\r\n }\r\n case \'move\':\r\n {\r\n // Move a bunch of files from scpath to dspath\r\n for (var i in cmd.names) {\r\n var sc = obj.path.join(cmd.scpath, cmd.names[i]), ds = obj.path.join(cmd.dspath, cmd.names[i]);\r\n MeshServerLogEx(52, [sc, ds], \'Move: \\"\' + sc + \'\\" to \\"\' + ds + \'\\"\', this.httprequest);\r\n if (sc != ds) { try { fs.copyFileSync(sc, ds); fs.unlinkSync(sc); } catch (e) { } }\r\n }\r\n break;\r\n }\r\n case \'zip\':\r\n // Zip a bunch of files\r\n if (this.zip != null) return; // Zip operating is currently running, exit now.\r\n\r\n // Check that the specified files exist & build full paths\r\n var fp, stat, p = [];\r\n for (var i in cmd.files) { fp = cmd.path + \'/\' + cmd.files[i]; stat = null; try { stat = fs.statSync(fp); } catch (e) { } if (stat != null) { p.push(fp); } }\r\n if (p.length == 0) return; // No files, quit now.\r\n\r\n // Setup file compression\r\n var ofile = cmd.path + \'/\' + cmd.output;\r\n this.write(Buffer.from(JSON.stringify({ action: \'dialogmessage\', msg: \'zipping\' })));\r\n this.zipfile = ofile;\r\n delete this.zipcancel;\r\n var out = require(\'fs\').createWriteStream(ofile, { flags: \'wb\' });\r\n out.xws = this;\r\n out.on(\'close\', function () {\r\n this.xws.write(Buffer.from(JSON.stringify({ action: \'dialogmessage\', msg: null })));\r\n this.xws.write(Buffer.from(JSON.stringify({ action: \'refresh\' })));\r\n if (this.xws.zipcancel === true) { fs.unlinkSync(this.xws.zipfile); } // Delete the complete file.\r\n delete this.xws.zipcancel;\r\n delete this.xws.zipfile;\r\n delete this.xws.zip;\r\n });\r\n this.zip = require(\'zip-writer\').write({ files: p, basePath: cmd.path });\r\n this.zip.xws = this;\r\n this.zip.on(\'progress\', require(\'events\').moderated(function (name, p) { this.xws.write(Buffer.from(JSON.stringify({ action: \'dialogmessage\', msg: \'zippingFile\', file: ((process.platform == \'win32\') ? (name.split(\'/\').join(\'\\\\\')) : name), progress: p }))); }, 1000));\r\n this.zip.pipe(out);\r\n break;\r\n case \'cancel\':\r\n // Cancel zip operation if present\r\n try { this.zipcancel = true; this.zip.cancel(function () { }); } catch (e) { }\r\n this.zip = null;\r\n break;\r\n default:\r\n // Unknown action, ignore it.\r\n break;\r\n }\r\n } else if (this.httprequest.protocol == 7) { // Plugin data exchange\r\n var cmd = null;\r\n try { cmd = JSON.parse(data); } catch (e) { };\r\n if (cmd == null) { return; }\r\n if ((cmd.ctrlChannel == \'102938\') || ((cmd.type == \'offer\') && (cmd.sdp != null))) { onTunnelControlData(cmd, this); return; } // If this is control data, handle it now.\r\n if (cmd.action == undefined) return;\r\n\r\n switch (cmd.action) {\r\n case \'plugin\': {\r\n try { require(cmd.plugin).consoleaction(cmd, null, null, this); } catch (e) { throw e; }\r\n break;\r\n }\r\n default: {\r\n // probably shouldn\'t happen, but just in case this feature is expanded\r\n }\r\n }\r\n\r\n }\r\n //sendConsoleText("Got tunnel #" + this.httprequest.index + " data: " + data, this.httprequest.sessionid);\r\n }\r\n}\r\n\r\n// Delete a directory with a files and directories within it\r\nfunction deleteFolderRecursive(path, rec) {\r\n var count = 0;\r\n if (fs.existsSync(path)) {\r\n if (rec == true) {\r\n fs.readdirSync(obj.path.join(path, \'*\')).forEach(function (file, index) {\r\n var curPath = obj.path.join(path, file);\r\n if (fs.statSync(curPath).isDirectory()) { // recurse\r\n count += deleteFolderRecursive(curPath, true);\r\n } else { // delete file\r\n fs.unlinkSync(curPath);\r\n count++;\r\n }\r\n });\r\n }\r\n fs.unlinkSync(path);\r\n count++;\r\n }\r\n return count;\r\n}\r\n\r\n// Called when receiving control data on WebRTC\r\nfunction onTunnelWebRTCControlData(data) {\r\n if (typeof data != \'string\') return;\r\n var obj;\r\n try { obj = JSON.parse(data); } catch (e) { sendConsoleText(\'Invalid control JSON on WebRTC: \' + data); return; }\r\n if (obj.type == \'close\') {\r\n //sendConsoleText(\'Tunnel #\' + this.xrtc.websocket.tunnel.index + \' WebRTC control close\');\r\n try { this.close(); } catch (e) { }\r\n try { this.xrtc.close(); } catch (e) { }\r\n }\r\n}\r\n\r\n// Called when receiving control data on websocket\r\nfunction onTunnelControlData(data, ws) {\r\n var obj;\r\n if (ws == null) { ws = this; }\r\n if (typeof data == \'string\') { try { obj = JSON.parse(data); } catch (e) { sendConsoleText(\'Invalid control JSON: \' + data); return; } }\r\n else if (typeof data == \'object\') { obj = data; } else { return; }\r\n //sendConsoleText(\'onTunnelControlData(\' + ws.httprequest.protocol + \'): \' + JSON.stringify(data));\r\n //console.log(\'onTunnelControlData: \' + JSON.stringify(data));\r\n\r\n switch (obj.type) {\r\n case \'lock\': {\r\n // Look for a TSID\r\n var tsid = null;\r\n if ((ws.httprequest.xoptions != null) && (typeof ws.httprequest.xoptions.tsid == \'number\')) { tsid = ws.httprequest.xoptions.tsid; }\r\n\r\n // Lock the current user out of the desktop\r\n try {\r\n if (process.platform == \'win32\') {\r\n MeshServerLogEx(53, null, "Locking remote user out of desktop", ws.httprequest);\r\n var child = require(\'child_process\');\r\n child.execFile(process.env[\'windir\'] + \'\\\\system32\\\\cmd.exe\', [\'/c\', \'RunDll32.exe user32.dll,LockWorkStation\'], { type: 1, uid: tsid });\r\n }\r\n } catch (e) { }\r\n break;\r\n }\r\n case \'options\': {\r\n // These are additional connection options passed in the control channel.\r\n //sendConsoleText(\'options: \' + JSON.stringify(obj));\r\n delete obj.type;\r\n ws.httprequest.xoptions = obj;\r\n\r\n // Set additional user consent options if present\r\n if ((obj != null) && (typeof obj.consent == \'number\')) { ws.httprequest.consent |= obj.consent; }\r\n\r\n break;\r\n }\r\n case \'close\': {\r\n // We received the close on the websocket\r\n //sendConsoleText(\'Tunnel #\' + ws.tunnel.index + \' WebSocket control close\');\r\n try { ws.close(); } catch (e) { }\r\n break;\r\n }\r\n case \'termsize\': {\r\n // Indicates a change in terminal size\r\n if (process.platform == \'win32\') {\r\n if (ws.httprequest._dispatcher == null) return;\r\n //sendConsoleText(\'Win32-TermSize: \' + obj.cols + \'x\' + obj.rows);\r\n if (ws.httprequest._dispatcher.invoke) { ws.httprequest._dispatcher.invoke(\'resizeTerminal\', [obj.cols, obj.rows]); }\r\n } else {\r\n if (ws.httprequest.process == null || ws.httprequest.process.pty == 0) return;\r\n //sendConsoleText(\'Linux Resize: \' + obj.cols + \'x\' + obj.rows);\r\n\r\n if (ws.httprequest.process.tcsetsize) { ws.httprequest.process.tcsetsize(obj.rows, obj.cols); }\r\n }\r\n break;\r\n }\r\n case \'webrtc0\': { // Browser indicates we can start WebRTC switch-over.\r\n if (ws.httprequest.protocol == 1) { // Terminal\r\n // This is a terminal data stream, unpipe the terminal now and indicate to the other side that terminal data will no longer be received over WebSocket\r\n if (process.platform == \'win32\') {\r\n ws.httprequest._term.unpipe(ws);\r\n } else {\r\n ws.httprequest.process.stdout.unpipe(ws);\r\n ws.httprequest.process.stderr.unpipe(ws);\r\n }\r\n } else if (ws.httprequest.protocol == 2) { // Desktop\r\n // This is a KVM data stream, unpipe the KVM now and indicate to the other side that KVM data will no longer be received over WebSocket\r\n ws.httprequest.desktop.kvm.unpipe(ws);\r\n } else {\r\n // Switch things around so all WebRTC data goes to onTunnelData().\r\n ws.rtcchannel.httprequest = ws.httprequest;\r\n ws.rtcchannel.removeAllListeners(\'data\');\r\n ws.rtcchannel.on(\'data\', onTunnelData);\r\n }\r\n ws.write("{\\"ctrlChannel\\":\\"102938\\",\\"type\\":\\"webrtc1\\"}"); // End of data marker\r\n break;\r\n }\r\n case \'webrtc1\': {\r\n if ((ws.httprequest.protocol == 1) || (ws.httprequest.protocol == 6)) { // Terminal\r\n // Switch the user input from websocket to webrtc at this point.\r\n if (process.platform == \'win32\') {\r\n ws.unpipe(ws.httprequest._term);\r\n ws.rtcchannel.pipe(ws.httprequest._term, { dataTypeSkip: 1 }); // 0 = Binary, 1 = Text.\r\n } else {\r\n ws.unpipe(ws.httprequest.process.stdin);\r\n ws.rtcchannel.pipe(ws.httprequest.process.stdin, { dataTypeSkip: 1 }); // 0 = Binary, 1 = Text.\r\n }\r\n ws.resume(); // Resume the websocket to keep receiving control data\r\n } else if (ws.httprequest.protocol == 2) { // Desktop\r\n // Switch the user input from websocket to webrtc at this point.\r\n ws.unpipe(ws.httprequest.desktop.kvm);\r\n try { ws.webrtc.rtcchannel.pipe(ws.httprequest.desktop.kvm, { dataTypeSkip: 1, end: false }); } catch (e) { sendConsoleText(\'EX2\'); } // 0 = Binary, 1 = Text.\r\n ws.resume(); // Resume the websocket to keep receiving control data\r\n }\r\n ws.write(\'{\\"ctrlChannel\\":\\"102938\\",\\"type\\":\\"webrtc2\\"}\'); // Indicates we will no longer get any data on websocket, switching to WebRTC at this point.\r\n break;\r\n }\r\n case \'webrtc2\': {\r\n // Other side received websocket end of data marker, start sending data on WebRTC channel\r\n if ((ws.httprequest.protocol == 1) || (ws.httprequest.protocol == 6)) { // Terminal\r\n if (process.platform == \'win32\') {\r\n ws.httprequest._term.pipe(ws.webrtc.rtcchannel, { dataTypeSkip: 1, end: false }); // 0 = Binary, 1 = Text.\r\n } else {\r\n ws.httprequest.process.stdout.pipe(ws.webrtc.rtcchannel, { dataTypeSkip: 1, end: false }); // 0 = Binary, 1 = Text.\r\n ws.httprequest.process.stderr.pipe(ws.webrtc.rtcchannel, { dataTypeSkip: 1, end: false }); // 0 = Binary, 1 = Text.\r\n }\r\n } else if (ws.httprequest.protocol == 2) { // Desktop\r\n ws.httprequest.desktop.kvm.pipe(ws.webrtc.rtcchannel, { dataTypeSkip: 1 }); // 0 = Binary, 1 = Text.\r\n }\r\n break;\r\n }\r\n case \'offer\': {\r\n // This is a WebRTC offer.\r\n if ((ws.httprequest.protocol == 1) || (ws.httprequest.protocol == 6)) return; // TODO: Terminal is currently broken with WebRTC. Reject WebRTC upgrade for now.\r\n ws.webrtc = rtc.createConnection();\r\n ws.webrtc.websocket = ws;\r\n ws.webrtc.on(\'connected\', function () { /*sendConsoleText(\'Tunnel #\' + this.websocket.tunnel.index + \' WebRTC connected\');*/ });\r\n ws.webrtc.on(\'disconnected\', function () { /*sendConsoleText(\'Tunnel #\' + this.websocket.tunnel.index + \' WebRTC disconnected\');*/ });\r\n ws.webrtc.on(\'dataChannel\', function (rtcchannel) {\r\n //sendConsoleText(\'WebRTC Datachannel open, protocol: \' + this.websocket.httprequest.protocol);\r\n rtcchannel.maxFragmentSize = 32768;\r\n rtcchannel.xrtc = this;\r\n rtcchannel.websocket = this.websocket;\r\n this.rtcchannel = rtcchannel;\r\n this.websocket.rtcchannel = rtcchannel;\r\n this.websocket.rtcchannel.on(\'data\', onTunnelWebRTCControlData);\r\n this.websocket.rtcchannel.on(\'end\', function () {\r\n // The WebRTC channel closed, unpipe the KVM now. This is also done when the web socket closes.\r\n //sendConsoleText(\'Tunnel #\' + this.websocket.tunnel.index + \' WebRTC data channel closed\');\r\n if (this.websocket.desktop && this.websocket.desktop.kvm) {\r\n try {\r\n this.unpipe(this.websocket.desktop.kvm);\r\n this.websocket.httprequest.desktop.kvm.unpipe(this);\r\n }\r\n catch (e) { }\r\n }\r\n });\r\n this.websocket.write(\'{\\"ctrlChannel\\":\\"102938\\",\\"type\\":\\"webrtc0\\"}\'); // Indicate we are ready for WebRTC switch-over.\r\n });\r\n var sdp = null;\r\n try { sdp = ws.webrtc.setOffer(obj.sdp); } catch (e) { }\r\n if (sdp != null) { ws.write({ type: \'answer\', ctrlChannel: \'102938\', sdp: sdp }); }\r\n break;\r\n }\r\n case \'ping\': {\r\n ws.write("{\\"ctrlChannel\\":\\"102938\\",\\"type\\":\\"pong\\"}"); // Send pong response\r\n break;\r\n }\r\n case \'pong\': { // NOP\r\n break;\r\n }\r\n case \'rtt\': {\r\n ws.write({ type: \'rtt\', ctrlChannel: \'102938\', time: obj.time });\r\n break;\r\n }\r\n }\r\n}\r\n\r\n// Console state\r\nvar consoleWebSockets = {};\r\nvar consoleHttpRequest = null;\r\n\r\n// Console HTTP response\r\nfunction consoleHttpResponse(response) {\r\n response.data = function (data) { sendConsoleText(rstr2hex(buf2rstr(data)), this.sessionid); consoleHttpRequest = null; }\r\n response.close = function () { sendConsoleText(\'httprequest.response.close\', this.sessionid); consoleHttpRequest = null; }\r\n}\r\n\r\n// Open a web browser to a specified URL on current user\'s desktop\r\nfunction openUserDesktopUrl(url) {\r\n if ((url.toLowerCase().startsWith(\'http://\') == false) && (url.toLowerCase().startsWith(\'https://\') == false)) { return null; }\r\n var child = null;\r\n try {\r\n switch (process.platform) {\r\n case \'win32\':\r\n var uid = require(\'user-sessions\').consoleUid();\r\n var user = require(\'user-sessions\').getUsername(uid);\r\n var domain = require(\'user-sessions\').getDomain(uid);\r\n var taskoptions = { env: { _target: process.env[\'windir\'] + \'\\\\system32\\\\cmd.exe\', _args: \'/C START \' + url.split(\'&\').join(\'^&\'), _user: \'"\' + domain + \'\\\\\' + user + \'"\' } };\r\n for (var c1e in process.env) {\r\n taskoptions.env[c1e] = process.env[c1e];\r\n }\r\n var child = require(\'child_process\').execFile(process.env[\'windir\'] + \'\\\\System32\\\\WindowsPowerShell\\\\v1.0\\\\powershell.exe\', [\'powershell\', \'-noprofile\', \'-nologo\', \'-command\', \'-\'], taskoptions);\r\n child.stderr.on(\'data\', function (c) { });\r\n child.stdout.on(\'data\', function (c) { });\r\n child.stdin.write(\'SCHTASKS /CREATE /F /TN MeshChatTask /SC ONCE /ST 00:00 \');\r\n if (user) { child.stdin.write(\'/RU $env:_user \'); }\r\n child.stdin.write(\'/TR "$env:_target $env:_args"\\r\\n\');\r\n child.stdin.write(\'$ts = New-Object -ComObject Schedule.service\\r\\n\');\r\n child.stdin.write(\'$ts.connect()\\r\\n\');\r\n child.stdin.write(\'$tsfolder = $ts.getfolder("\\\\")\\r\\n\');\r\n child.stdin.write(\'$task = $tsfolder.GetTask("MeshChatTask")\\r\\n\');\r\n child.stdin.write(\'$taskdef = $task.Definition\\r\\n\');\r\n child.stdin.write(\'$taskdef.Settings.StopIfGoingOnBatteries = $false\\r\\n\');\r\n child.stdin.write(\'$taskdef.Settings.DisallowStartIfOnBatteries = $false\\r\\n\');\r\n child.stdin.write(\'$taskdef.Actions.Item(1).Path = $env:_target\\r\\n\');\r\n child.stdin.write(\'$taskdef.Actions.Item(1).Arguments = $env:_args\\r\\n\');\r\n child.stdin.write(\'$tsfolder.RegisterTaskDefinition($task.Name, $taskdef, 4, $null, $null, $null)\\r\\n\');\r\n\r\n child.stdin.write(\'SCHTASKS /RUN /TN MeshChatTask\\r\\n\');\r\n child.stdin.write(\'SCHTASKS /DELETE /F /TN MeshChatTask\\r\\nexit\\r\\n\');\r\n child.waitExit();\r\n break;\r\n case \'linux\':\r\n child = require(\'child_process\').execFile(\'/usr/bin/xdg-open\', [\'xdg-open\', url], { uid: require(\'user-sessions\').consoleUid() });\r\n break;\r\n case \'darwin\':\r\n child = require(\'child_process\').execFile(\'/usr/bin/open\', [\'open\', url], { uid: require(\'user-sessions\').consoleUid() });\r\n break;\r\n default:\r\n // Unknown platform, ignore this command.\r\n break;\r\n }\r\n } catch (e) { }\r\n return child;\r\n}\r\n\r\n// Process a mesh agent console command\r\nfunction processConsoleCommand(cmd, args, rights, sessionid) {\r\n try {\r\n var response = null;\r\n switch (cmd) {\r\n case \'help\': { // Displays available commands\r\n var fin = \'\', f = \'\', availcommands = \'agentupdate,errorlog,msh,timerinfo,coreinfo,coredump,service,fdsnapshot,fdcount,startupoptions,alert,agentsize,versions,help,info,osinfo,args,print,type,dbkeys,dbget,dbset,dbcompact,eval,parseuri,httpget,wslist,plugin,wsconnect,wssend,wsclose,notify,ls,ps,kill,netinfo,location,power,wakeonlan,setdebug,smbios,rawsmbios,toast,lock,users,openurl,getscript,getclip,setclip,log,av,cpuinfo,sysinfo,apf,scanwifi,wallpaper,agentmsg\';\r\n if (require(\'os\').dns != null) { availcommands += \',dnsinfo\'; }\r\n if (process.platform == \'win32\') { availcommands += \',cs,safemode,wpfhwacceleration,uac\'; }\r\n if (amt != null) { availcommands += \',amt,amtconfig,amtevents\'; }\r\n if (process.platform != \'freebsd\') { availcommands += \',vm\'; }\r\n if (require(\'MeshAgent\').maxKvmTileSize != null) { availcommands += \',kvmmode\'; }\r\n try { require(\'zip-reader\'); availcommands += \',zip,unzip\'; } catch (e) { }\r\n\r\n availcommands = availcommands.split(\',\').sort();\r\n while (availcommands.length > 0) {\r\n if (f.length > 90) { fin += (f + \',\\r\\n\'); f = \'\'; }\r\n f += (((f != \'\') ? \', \' : \' \') + availcommands.shift());\r\n }\r\n if (f != \'\') { fin += f; }\r\n response = "Available commands: \\r\\n" + fin + ".";\r\n break;\r\n }\r\n case \'cs\':\r\n if (process.platform != \'win32\') {\r\n response = \'Unknown command "cs", type "help" for list of avaialble commands.\';\r\n break;\r\n }\r\n switch (args[\'_\'].length) {\r\n case 0:\r\n try {\r\n var cs = require(\'win-registry\').QueryKey(require(\'win-registry\').HKEY.LocalMachine, \'System\\\\CurrentControlSet\\\\Control\\\\Power\', \'CsEnabled\');\r\n response = "Connected Standby: " + (cs == 1 ? "ENABLED" : "DISABLED");\r\n }\r\n catch (e) {\r\n response = "This machine does not support Connected Standby";\r\n }\r\n break;\r\n case 1:\r\n if ((args[\'_\'][0].toUpperCase() != \'ENABLE\' && args[\'_\'][0].toUpperCase() != \'DISABLE\')) {\r\n response = "Proper usage:\\r\\n cs [ENABLE|DISABLE]";\r\n }\r\n else {\r\n try {\r\n var cs = require(\'win-registry\').QueryKey(require(\'win-registry\').HKEY.LocalMachine, \'System\\\\CurrentControlSet\\\\Control\\\\Power\', \'CsEnabled\');\r\n require(\'win-registry\').WriteKey(require(\'win-registry\').HKEY.LocalMachine, \'System\\\\CurrentControlSet\\\\Control\\\\Power\', \'CsEnabled\', args[\'_\'][0].toUpperCase() == \'ENABLE\' ? 1 : 0);\r\n\r\n cs = require(\'win-registry\').QueryKey(require(\'win-registry\').HKEY.LocalMachine, \'System\\\\CurrentControlSet\\\\Control\\\\Power\', \'CsEnabled\');\r\n response = "Connected Standby: " + (cs == 1 ? "ENABLED" : "DISABLED");\r\n }\r\n catch (e) {\r\n response = "This machine does not support Connected Standby";\r\n }\r\n }\r\n break;\r\n default:\r\n response = "Proper usage:\\r\\n cs [ENABLE|DISABLE]";\r\n break;\r\n }\r\n break;\r\n case \'assistant\':\r\n if (process.platform == \'win32\') {\r\n // Install MeshCentral Assistant on this device\r\n response = "Usage: Assistant [info|install|uninstall]";\r\n if (args[\'_\'].length == 1) {\r\n if ((args[\'_\'][0] == \'install\') || (args[\'_\'][0] == \'info\')) { response = \'\'; require(\'MeshAgent\').SendCommand({ action: \'meshToolInfo\', sessionid: sessionid, name: \'MeshCentralAssistant\', cookie: true, tag: args[\'_\'][0] }); }\r\n // TODO: Uninstall\r\n }\r\n } else {\r\n response = "MeshCentral Assistant is not supported on this platform.";\r\n }\r\n break;\r\n case \'agentupdate\':\r\n require(\'MeshAgent\').SendCommand({ action: \'agentupdate\', sessionid: sessionid });\r\n break;\r\n case \'agentupdateex\':\r\n // Perform an direct agent update without requesting any information from the server, this should not typically be used.\r\n if (args[\'_\'].length == 1) {\r\n if (args[\'_\'][0].startsWith(\'https://\')) { agentUpdate_Start(args[\'_\'][0], { sessionid: sessionid }); } else { response = "Usage: agentupdateex https://server/path"; }\r\n } else {\r\n agentUpdate_Start(null, { sessionid: sessionid });\r\n }\r\n break;\r\n case \'errorlog\':\r\n switch (args[\'_\'].length) {\r\n case 0:\r\n // All Error Logs\r\n response = JSON.stringify(require(\'util-agentlog\').read(), null, 1);\r\n break;\r\n case 1:\r\n // Error Logs, by either count or timestamp\r\n response = JSON.stringify(require(\'util-agentlog\').read(parseInt(args[\'_\'][0])), null, 1);\r\n break;\r\n default:\r\n response = "Proper usage:\\r\\n errorlog [lastCount|linuxEpoch]";\r\n break;\r\n }\r\n break;\r\n case \'msh\':\r\n response = JSON.stringify(_MSH(), null, 2);\r\n break;\r\n case \'dnsinfo\':\r\n if (require(\'os\').dns == null) {\r\n response = "Unknown command \\"" + cmd + "\\", type \\"help\\" for list of avaialble commands.";\r\n }\r\n else {\r\n response = \'DNS Servers: \';\r\n var dns = require(\'os\').dns();\r\n for (var i = 0; i < dns.length; ++i) {\r\n if (i > 0) { response += \', \'; }\r\n response += dns[i];\r\n }\r\n }\r\n break;\r\n case \'timerinfo\':\r\n response = require(\'ChainViewer\').getTimerInfo();\r\n break;\r\n case \'find\':\r\n if (args[\'_\'].length <= 1) {\r\n response = "Proper usage:\\r\\n find root criteria [criteria2] [criteria n...]";\r\n }\r\n else {\r\n var root = args[\'_\'][0];\r\n var p = args[\'_\'].slice(1);\r\n var r = require(\'file-search\').find(root, p);\r\n r.sid = sessionid;\r\n r.on(\'result\', function (str) { sendConsoleText(str, this.sid); });\r\n r.then(function () { sendConsoleText(\'*** End Results ***\', this.sid); });\r\n response = "Find: [" + root + "] " + JSON.stringify(p);\r\n }\r\n break;\r\n case \'coreinfo\': {\r\n response = JSON.stringify(meshCoreObj, null, 2);\r\n break;\r\n }\r\n case \'coreinfoupdate\': {\r\n sendPeriodicServerUpdate();\r\n break;\r\n }\r\n case \'agentmsg\': {\r\n if (args[\'_\'].length == 0) {\r\n response = "Proper usage:\\r\\n agentmsg add \\"[message]\\" [iconIndex]\\r\\n agentmsg remove [index]\\r\\n agentmsg list"; // Display usage\r\n } else {\r\n if ((args[\'_\'][0] == \'add\') && (args[\'_\'].length > 1)) {\r\n var msgIndex = 1, iconIndex = 0;\r\n while (tunnelUserCount.msg[msgIndex] != null) { msgIndex++; }\r\n if (args[\'_\'].length >= 3) { try { iconIndex = parseInt(args[\'_\'][2]); } catch (e) { } }\r\n if (typeof iconIndex != \'number\') { iconIndex = 0; }\r\n tunnelUserCount.msg[msgIndex] = { msg: args[\'_\'][1], icon: iconIndex };\r\n response = \'Agent message \' + msgIndex + \' added.\';\r\n } else if ((args[\'_\'][0] == \'remove\') && (args[\'_\'].length > 1)) {\r\n var msgIndex = 0;\r\n try { msgIndex = parseInt(args[\'_\'][1]); } catch (x) { }\r\n if (tunnelUserCount.msg[msgIndex] == null) { response = "Message not found."; } else { delete tunnelUserCount.msg[msgIndex]; response = "Message removed."; }\r\n } else if (args[\'_\'][0] == \'list\') {\r\n response = JSON.stringify(tunnelUserCount.msg, null, 2);\r\n }\r\n try { mesh.SendCommand({ action: \'sessions\', type: \'msg\', value: tunnelUserCount.msg }); } catch (x) { }\r\n broadcastSessionsToRegisteredApps();\r\n }\r\n break;\r\n }\r\n case \'clearagentmsg\': {\r\n tunnelUserCount.msg = {};\r\n try { mesh.SendCommand({ action: \'sessions\', type: \'msg\', value: tunnelUserCount.msg }); } catch (x) { }\r\n broadcastSessionsToRegisteredApps();\r\n break;\r\n }\r\n case \'coredump\':\r\n if (args[\'_\'].length != 1) {\r\n response = "Proper usage: coredump on|off|status|clear"; // Display usage\r\n } else {\r\n switch (args[\'_\'][0].toLowerCase()) {\r\n case \'on\':\r\n process.coreDumpLocation = (process.platform == \'win32\') ? (process.execPath.replace(\'.exe\', \'.dmp\')) : (process.execPath + \'.dmp\');\r\n response = \'coredump is now on\';\r\n break;\r\n case \'off\':\r\n process.coreDumpLocation = null;\r\n response = \'coredump is now off\';\r\n break;\r\n case \'status\':\r\n response = \'coredump is: \' + ((process.coreDumpLocation == null) ? \'off\' : \'on\');\r\n if (process.coreDumpLocation != null) {\r\n if (process.platform == \'win32\') {\r\n if (fs.existsSync(process.coreDumpLocation)) {\r\n response += \'\\r\\n CoreDump present at: \' + process.coreDumpLocation;\r\n response += \'\\r\\n CoreDump Time: \' + new Date(fs.statSync(process.coreDumpLocation).mtime).getTime();\r\n response += \'\\r\\n Agent Time : \' + new Date(fs.statSync(process.execPath).mtime).getTime();\r\n }\r\n } else {\r\n if ((process.cwd() != \'//\') && fs.existsSync(process.cwd() + \'core\')) {\r\n response += \'\\r\\n CoreDump present at: \' + process.cwd() + \'core\';\r\n response += \'\\r\\n CoreDump Time: \' + new Date(fs.statSync(process.cwd() + \'core\').mtime).getTime();\r\n response += \'\\r\\n Agent Time : \' + new Date(fs.statSync(process.execPath).mtime).getTime();\r\n }\r\n }\r\n }\r\n break;\r\n case \'clear\':\r\n db.Put(\'CoreDumpTime\', null);\r\n response = \'coredump db cleared\';\r\n break;\r\n default:\r\n response = "Proper usage: coredump on|off|status"; // Display usage\r\n break;\r\n }\r\n }\r\n break;\r\n case \'service\':\r\n if (args[\'_\'].length != 1) {\r\n response = "Proper usage: service status|restart"; // Display usage\r\n }\r\n else {\r\n var svcname = process.platform == \'win32\' ? \'Mesh Agent\' : \'meshagent\';\r\n try {\r\n svcname = require(\'MeshAgent\').serviceName;\r\n }\r\n catch (x) {\r\n }\r\n var s = require(\'service-manager\').manager.getService(svcname);\r\n switch (args[\'_\'][0].toLowerCase()) {\r\n case \'status\':\r\n response = \'Service \' + (s.isRunning() ? (s.isMe() ? \'[SELF]\' : \'[RUNNING]\') : (\'[NOT RUNNING]\'));\r\n break;\r\n case \'restart\':\r\n if (s.isMe()) {\r\n s.restart();\r\n }\r\n else {\r\n response = \'Restarting another agent instance is not allowed\';\r\n }\r\n break;\r\n default:\r\n response = "Proper usage: service status|restart"; // Display usage\r\n break;\r\n }\r\n if (process.platform == \'win32\') { s.close(); }\r\n }\r\n break;\r\n case \'zip\':\r\n if (args[\'_\'].length == 0) {\r\n response = "Proper usage: zip (output file name), input1 [, input n]"; // Display usage\r\n } else {\r\n var p = args[\'_\'].join(\' \').split(\',\');\r\n var ofile = p.shift();\r\n sendConsoleText(\'Writing \' + ofile + \'...\');\r\n var out = require(\'fs\').createWriteStream(ofile, { flags: \'wb\' });\r\n out.fname = ofile;\r\n out.sessionid = sessionid;\r\n out.on(\'close\', function () { sendConsoleText(\'DONE writing \' + this.fname, this.sessionid); });\r\n var zip = require(\'zip-writer\').write({ files: p });\r\n zip.pipe(out);\r\n }\r\n break;\r\n case \'unzip\':\r\n if (args[\'_\'].length == 0) {\r\n response = "Proper usage: unzip input, destination"; // Display usage\r\n } else {\r\n var p = args[\'_\'].join(\' \').split(\',\');\r\n if (p.length != 2) { response = "Proper usage: unzip input, destination"; break; } // Display usage\r\n var prom = require(\'zip-reader\').read(p[0]);\r\n prom._dest = p[1];\r\n prom.self = this;\r\n prom.sessionid = sessionid;\r\n prom.then(function (zipped) {\r\n sendConsoleText(\'Extracting to \' + this._dest + \'...\', this.sessionid);\r\n zipped.extractAll(this._dest).then(function () { sendConsoleText(\'finished unzipping\', this.sessionid); }, function (e) { sendConsoleText(\'Error unzipping: \' + e, this.sessionid); }).parentPromise.sessionid = this.sessionid;\r\n }, function (e) { sendConsoleText(\'Error unzipping: \' + e, this.sessionid); });\r\n }\r\n break;\r\n case \'setbattery\':\r\n // require(\'MeshAgent\').SendCommand({ action: \'battery\', state: \'dc\', level: 55 });\r\n if ((args[\'_\'].length > 0) && ((args[\'_\'][0] == \'ac\') || (args[\'_\'][0] == \'dc\'))) {\r\n var b = { action: \'battery\', state: args[\'_\'][0] };\r\n if (args[\'_\'].length == 2) { b.level = parseInt(args[\'_\'][1]); }\r\n require(\'MeshAgent\').SendCommand(b);\r\n } else {\r\n require(\'MeshAgent\').SendCommand({ action: \'battery\' });\r\n }\r\n break;\r\n case \'fdsnapshot\':\r\n require(\'ChainViewer\').getSnapshot().then(function (c) { sendConsoleText(c, this.sessionid); }).parentPromise.sessionid = sessionid;\r\n break;\r\n case \'fdcount\':\r\n require(\'DescriptorEvents\').getDescriptorCount().then(\r\n function (c) {\r\n sendConsoleText(\'Descriptor Count: \' + c, this.sessionid);\r\n }, function (e) {\r\n sendConsoleText(\'Error fetching descriptor count: \' + e, this.sessionid);\r\n }).parentPromise.sessionid = sessionid;\r\n break;\r\n case \'uac\':\r\n if (process.platform != \'win32\') {\r\n response = \'Unknown command "uac", type "help" for list of avaialble commands.\';\r\n break;\r\n }\r\n if (args[\'_\'].length != 1) {\r\n response = \'Proper usage: uac [get|interactive|secure]\';\r\n }\r\n else {\r\n switch (args[\'_\'][0].toUpperCase()) {\r\n case \'GET\':\r\n var secd = require(\'win-registry\').QueryKey(require(\'win-registry\').HKEY.LocalMachine, \'Software\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\Policies\\\\System\', \'PromptOnSecureDesktop\');\r\n response = "UAC mode: " + (secd == 0 ? "Interactive Desktop" : "Secure Desktop");\r\n break;\r\n case \'INTERACTIVE\':\r\n try {\r\n require(\'win-registry\').WriteKey(require(\'win-registry\').HKEY.LocalMachine, \'Software\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\Policies\\\\System\', \'PromptOnSecureDesktop\', 0);\r\n response = \'UAC mode changed to: Interactive Desktop\';\r\n }\r\n catch (e) {\r\n response = "Unable to change UAC Mode";\r\n }\r\n break;\r\n case \'SECURE\':\r\n try {\r\n require(\'win-registry\').WriteKey(require(\'win-registry\').HKEY.LocalMachine, \'Software\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\Policies\\\\System\', \'PromptOnSecureDesktop\', 1);\r\n response = \'UAC mode changed to: Secure Desktop\';\r\n }\r\n catch (e) {\r\n response = "Unable to change UAC Mode";\r\n }\r\n break;\r\n default:\r\n response = \'Proper usage: uac [get|interactive|secure]\';\r\n break;\r\n }\r\n }\r\n break;\r\n case \'vm\':\r\n response = \'Virtual Machine = \' + require(\'identifiers\').isVM();\r\n break;\r\n case \'startupoptions\':\r\n response = JSON.stringify(require(\'MeshAgent\').getStartupOptions());\r\n break;\r\n case \'kvmmode\':\r\n if (require(\'MeshAgent\').maxKvmTileSize == null) {\r\n response = "Unknown command \\"kvmmode\\", type \\"help\\" for list of avaialble commands.";\r\n }\r\n else {\r\n if (require(\'MeshAgent\').maxKvmTileSize == 0) {\r\n response = \'KVM Mode: Full JUMBO\';\r\n }\r\n else {\r\n response = \'KVM Mode: \' + (require(\'MeshAgent\').maxKvmTileSize <= 65500 ? \'NO JUMBO\' : \'Partial JUMBO\');\r\n response += (\', TileLimit: \' + (require(\'MeshAgent\').maxKvmTileSize < 1024 ? (require(\'MeshAgent\').maxKvmTileSize + \' bytes\') : (Math.round(require(\'MeshAgent\').maxKvmTileSize / 1024) + \' Kbytes\')));\r\n }\r\n }\r\n break;\r\n case \'alert\':\r\n if (args[\'_\'].length == 0) {\r\n response = "Proper usage: alert TITLE, CAPTION [, TIMEOUT]"; // Display usage\r\n }\r\n else {\r\n var p = args[\'_\'].join(\' \').split(\',\');\r\n if (p.length < 2) {\r\n response = "Proper usage: alert TITLE, CAPTION [, TIMEOUT]"; // Display usage\r\n }\r\n else {\r\n this._alert = require(\'message-box\').create(p[0], p[1], p.length == 3 ? parseInt(p[2]) : 9999, 1);\r\n }\r\n }\r\n break;\r\n case \'agentsize\':\r\n var actualSize = Math.floor(require(\'fs\').statSync(process.execPath).size / 1024);\r\n if (process.platform == \'win32\') {\r\n // Check the Agent Uninstall MetaData for correctness, as the installer may have written an incorrect value\r\n var writtenSize = 0;\r\n try { writtenSize = require(\'win-registry\').QueryKey(require(\'win-registry\').HKEY.LocalMachine, \'Software\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\Uninstall\\\\MeshCentralAgent\', \'EstimatedSize\'); } catch (e) { response = e; }\r\n if (writtenSize != actualSize) {\r\n response = "Size updated from: " + writtenSize + " to: " + actualSize;\r\n try { require(\'win-registry\').WriteKey(require(\'win-registry\').HKEY.LocalMachine, \'Software\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\Uninstall\\\\MeshCentralAgent\', \'EstimatedSize\', actualSize); } catch (e) { response = e; }\r\n } else\r\n { response = "Agent Size: " + actualSize + " kb"; }\r\n } else\r\n { response = "Agent Size: " + actualSize + " kb"; }\r\n break;\r\n case \'versions\':\r\n response = JSON.stringify(process.versions, null, \' \');\r\n break;\r\n case \'wpfhwacceleration\':\r\n if (process.platform != \'win32\') { throw ("wpfhwacceleration setting is only supported on Windows"); }\r\n if (args[\'_\'].length != 1) {\r\n response = "Proper usage: wpfhwacceleration (ON|OFF|STATUS)"; // Display usage\r\n }\r\n else {\r\n var reg = require(\'win-registry\');\r\n var uname = require(\'user-sessions\').getUsername(require(\'user-sessions\').consoleUid());\r\n var key = reg.usernameToUserKey(uname);\r\n\r\n switch (args[\'_\'][0].toUpperCase()) {\r\n default:\r\n response = "Proper usage: wpfhwacceleration (ON|OFF|STATUS|DEFAULT)"; // Display usage\r\n break;\r\n case \'ON\':\r\n try {\r\n reg.WriteKey(reg.HKEY.Users, key + \'\\\\SOFTWARE\\\\Microsoft\\\\Avalon.Graphics\', \'DisableHWAcceleration\', 0);\r\n response = "OK";\r\n } catch (e) { response = "FAILED"; }\r\n break;\r\n case \'OFF\':\r\n try {\r\n reg.WriteKey(reg.HKEY.Users, key + \'\\\\SOFTWARE\\\\Microsoft\\\\Avalon.Graphics\', \'DisableHWAcceleration\', 1);\r\n response = \'OK\';\r\n } catch (e) { response = \'FAILED\'; }\r\n break;\r\n case \'STATUS\':\r\n var s;\r\n try { s = reg.QueryKey(reg.HKEY.Users, key + \'\\\\SOFTWARE\\\\Microsoft\\\\Avalon.Graphics\', \'DisableHWAcceleration\') == 1 ? \'DISABLED\' : \'ENABLED\'; } catch (e) { s = \'DEFAULT\'; }\r\n response = "WPF Hardware Acceleration: " + s;\r\n break;\r\n case \'DEFAULT\':\r\n try { reg.DeleteKey(reg.HKEY.Users, key + \'\\\\SOFTWARE\\\\Microsoft\\\\Avalon.Graphics\', \'DisableHWAcceleration\'); } catch (e) { }\r\n response = \'OK\';\r\n break;\r\n }\r\n }\r\n break;\r\n case \'tsid\':\r\n if (process.platform == \'win32\') {\r\n if (args[\'_\'].length != 1) {\r\n response = "TSID: " + (require(\'MeshAgent\')._tsid == null ? "console" : require(\'MeshAgent\')._tsid);\r\n } else {\r\n var i = parseInt(args[\'_\'][0]);\r\n require(\'MeshAgent\')._tsid = (isNaN(i) ? null : i);\r\n response = "TSID set to: " + (require(\'MeshAgent\')._tsid == null ? "console" : require(\'MeshAgent\')._tsid);\r\n }\r\n } else\r\n { response = "TSID command only supported on Windows"; }\r\n break;\r\n case \'activeusers\':\r\n if (process.platform == \'win32\') {\r\n var p = require(\'user-sessions\').enumerateUsers();\r\n p.sessionid = sessionid;\r\n p.then(function (u) {\r\n var v = [];\r\n for (var i in u) {\r\n if (u[i].State == \'Active\') { v.push({ tsid: i, type: u[i].StationName, user: u[i].Username, domain: u[i].Domain }); }\r\n }\r\n sendConsoleText(JSON.stringify(v, null, 1), this.sessionid);\r\n });\r\n } else\r\n { response = "activeusers command only supported on Windows"; }\r\n break;\r\n case \'wallpaper\':\r\n if (process.platform != \'win32\' && !(process.platform == \'linux\' && require(\'linux-gnome-helpers\').available)) {\r\n response = "wallpaper command not supported on this platform";\r\n }\r\n else {\r\n if (args[\'_\'].length != 1) {\r\n response = \'Proper usage: wallpaper (GET|TOGGLE)\'; // Display usage\r\n }\r\n else {\r\n switch (args[\'_\'][0].toUpperCase()) {\r\n default:\r\n response = \'Proper usage: wallpaper (GET|TOGGLE)\'; // Display usage\r\n break;\r\n case \'GET\':\r\n case \'TOGGLE\':\r\n if (process.platform == \'win32\') {\r\n var id = require(\'user-sessions\').getProcessOwnerName(process.pid).tsid == 0 ? 1 : 0;\r\n var child = require(\'child_process\').execFile(process.execPath, [process.execPath.split(\'\\\\\').pop(), \'-b64exec\', \'dmFyIFNQSV9HRVRERVNLV0FMTFBBUEVSID0gMHgwMDczOwp2YXIgU1BJX1NFVERFU0tXQUxMUEFQRVIgPSAweDAwMTQ7CnZhciBHTSA9IHJlcXVpcmUoJ19HZW5lcmljTWFyc2hhbCcpOwp2YXIgdXNlcjMyID0gR00uQ3JlYXRlTmF0aXZlUHJveHkoJ3VzZXIzMi5kbGwnKTsKdXNlcjMyLkNyZWF0ZU1ldGhvZCgnU3lzdGVtUGFyYW1ldGVyc0luZm9BJyk7CgppZiAocHJvY2Vzcy5hcmd2Lmxlbmd0aCA9PSAzKQp7CiAgICB2YXIgdiA9IEdNLkNyZWF0ZVZhcmlhYmxlKDEwMjQpOwogICAgdXNlcjMyLlN5c3RlbVBhcmFtZXRlcnNJbmZvQShTUElfR0VUREVTS1dBTExQQVBFUiwgdi5fc2l6ZSwgdiwgMCk7CiAgICBjb25zb2xlLmxvZyh2LlN0cmluZyk7CiAgICBwcm9jZXNzLmV4aXQoKTsKfQplbHNlCnsKICAgIHZhciBuYiA9IEdNLkNyZWF0ZVZhcmlhYmxlKHByb2Nlc3MuYXJndlszXSk7CiAgICB1c2VyMzIuU3lzdGVtUGFyYW1ldGVyc0luZm9BKFNQSV9TRVRERVNLV0FMTFBBUEVSLCBuYi5fc2l6ZSwgbmIsIDApOwogICAgcHJvY2Vzcy5leGl0KCk7Cn0=\'], { type: id });\r\n child.stdout.str = \'\'; child.stdout.on(\'data\', function (c) { this.str += c.toString(); });\r\n child.stderr.on(\'data\', function () { });\r\n child.waitExit();\r\n var current = child.stdout.str.trim();\r\n if (args[\'_\'][0].toUpperCase() == \'GET\') {\r\n response = current;\r\n break;\r\n }\r\n if (current != \'\') {\r\n require(\'MeshAgent\')._wallpaper = current;\r\n response = \'Wallpaper cleared\';\r\n } else {\r\n response = \'Wallpaper restored\';\r\n }\r\n child = require(\'child_process\').execFile(process.execPath, [process.execPath.split(\'\\\\\').pop(), \'-b64exec\', \'dmFyIFNQSV9HRVRERVNLV0FMTFBBUEVSID0gMHgwMDczOwp2YXIgU1BJX1NFVERFU0tXQUxMUEFQRVIgPSAweDAwMTQ7CnZhciBHTSA9IHJlcXVpcmUoJ19HZW5lcmljTWFyc2hhbCcpOwp2YXIgdXNlcjMyID0gR00uQ3JlYXRlTmF0aXZlUHJveHkoJ3VzZXIzMi5kbGwnKTsKdXNlcjMyLkNyZWF0ZU1ldGhvZCgnU3lzdGVtUGFyYW1ldGVyc0luZm9BJyk7CgppZiAocHJvY2Vzcy5hcmd2Lmxlbmd0aCA9PSAzKQp7CiAgICB2YXIgdiA9IEdNLkNyZWF0ZVZhcmlhYmxlKDEwMjQpOwogICAgdXNlcjMyLlN5c3RlbVBhcmFtZXRlcnNJbmZvQShTUElfR0VUREVTS1dBTExQQVBFUiwgdi5fc2l6ZSwgdiwgMCk7CiAgICBjb25zb2xlLmxvZyh2LlN0cmluZyk7CiAgICBwcm9jZXNzLmV4aXQoKTsKfQplbHNlCnsKICAgIHZhciBuYiA9IEdNLkNyZWF0ZVZhcmlhYmxlKHByb2Nlc3MuYXJndlszXSk7CiAgICB1c2VyMzIuU3lzdGVtUGFyYW1ldGVyc0luZm9BKFNQSV9TRVRERVNLV0FMTFBBUEVSLCBuYi5fc2l6ZSwgbmIsIDApOwogICAgcHJvY2Vzcy5leGl0KCk7Cn0=\', current != \'\' ? \'""\' : require(\'MeshAgent\')._wallpaper], { type: id });\r\n child.stdout.str = \'\'; child.stdout.on(\'data\', function (c) { this.str += c.toString(); });\r\n child.stderr.on(\'data\', function () { });\r\n child.waitExit();\r\n }\r\n else {\r\n var id = require(\'user-sessions\').consoleUid();\r\n var current = require(\'linux-gnome-helpers\').getDesktopWallpaper(id);\r\n if (args[\'_\'][0].toUpperCase() == \'GET\') {\r\n response = current;\r\n break;\r\n }\r\n if (current != \'/dev/null\') {\r\n require(\'MeshAgent\')._wallpaper = current;\r\n response = \'Wallpaper cleared\';\r\n } else {\r\n response = \'Wallpaper restored\';\r\n }\r\n require(\'linux-gnome-helpers\').setDesktopWallpaper(id, current != \'/dev/null\' ? undefined : require(\'MeshAgent\')._wallpaper);\r\n }\r\n break;\r\n }\r\n }\r\n }\r\n break;\r\n case \'safemode\':\r\n if (process.platform != \'win32\') {\r\n response = \'safemode only supported on Windows Platforms\'\r\n }\r\n else {\r\n if (args[\'_\'].length != 1) {\r\n response = \'Proper usage: safemode (ON|OFF|STATUS)\'; // Display usage\r\n }\r\n else {\r\n var svcname = process.platform == \'win32\' ? \'Mesh Agent\' : \'meshagent\';\r\n try {\r\n svcname = require(\'MeshAgent\').serviceName;\r\n }\r\n catch (x) {\r\n }\r\n\r\n switch (args[\'_\'][0].toUpperCase()) {\r\n default:\r\n response = \'Proper usage: safemode (ON|OFF|STATUS)\'; // Display usage\r\n break;\r\n case \'ON\':\r\n require(\'win-bcd\').setKey(\'safeboot\', \'Network\');\r\n require(\'win-bcd\').enableSafeModeService(svcname);\r\n break;\r\n case \'OFF\':\r\n require(\'win-bcd\').deleteKey(\'safeboot\');\r\n break;\r\n case \'STATUS\':\r\n var nextboot = require(\'win-bcd\').getKey(\'safeboot\');\r\n if (nextboot) {\r\n switch (nextboot) {\r\n case \'Network\':\r\n case \'network\':\r\n nextboot = \'SAFE_MODE_NETWORK\';\r\n break;\r\n default:\r\n nextboot = \'SAFE_MODE\';\r\n break;\r\n }\r\n }\r\n response = \'Current: \' + require(\'win-bcd\').bootMode + \', NextBoot: \' + (nextboot ? nextboot : \'NORMAL\');\r\n break;\r\n }\r\n }\r\n }\r\n break;\r\n /*\r\n case \'border\':\r\n {\r\n if ((args[\'_\'].length == 1) && (args[\'_\'][0] == \'on\')) {\r\n if (meshCoreObj.users.length > 0) {\r\n obj.borderManager.Start(meshCoreObj.users[0]);\r\n response = \'Border blinking is on.\';\r\n } else {\r\n response = \'Cannot turn on border blinking, no logged in users.\';\r\n }\r\n } else if ((args[\'_\'].length == 1) && (args[\'_\'][0] == \'off\')) {\r\n obj.borderManager.Stop();\r\n response = \'Border blinking is off.\';\r\n } else {\r\n response = \'Proper usage: border "on|off"\'; // Display correct command usage\r\n }\r\n }\r\n break;\r\n */\r\n case \'av\':\r\n if (process.platform == \'win32\') {\r\n // Windows Command: "wmic /Namespace:\\\\root\\SecurityCenter2 Path AntiVirusProduct get /FORMAT:CSV"\r\n response = JSON.stringify(require(\'win-info\').av(), null, 1);\r\n } else {\r\n response = \'Not supported on the platform\';\r\n }\r\n break;\r\n case \'log\':\r\n if (args[\'_\'].length != 1) { response = \'Proper usage: log "sample text"\'; } else { MeshServerLog(args[\'_\'][0]); response = \'ok\'; }\r\n break;\r\n case \'getclip\':\r\n if (require(\'MeshAgent\').isService) {\r\n require(\'clipboard\').dispatchRead().then(function (str) { sendConsoleText(str, sessionid); });\r\n } else {\r\n require("clipboard").read().then(function (str) { sendConsoleText(str, sessionid); });\r\n }\r\n break;\r\n case \'setclip\': {\r\n if (args[\'_\'].length != 1) {\r\n response = \'Proper usage: setclip "sample text"\';\r\n } else {\r\n if (require(\'MeshAgent\').isService) {\r\n if (process.platform != \'win32\') {\r\n require(\'clipboard\').dispatchWrite(args[\'_\'][0]);\r\n }\r\n else {\r\n var tmp = "require(\'clipboard\')(\\"" + (args[\'_\'][0]).split(\'"\').join(\'\\\\"\') + \'");process.exit();\';\r\n tmp = Buffer.from(tmp).toString(\'base64\');\r\n\r\n var uid = require(\'user-sessions\').consoleUid();\r\n var user = require(\'user-sessions\').getUsername(uid);\r\n var domain = require(\'user-sessions\').getDomain(uid);\r\n\r\n var taskoptions = { env: { _target: process.execPath, _args: \'-b64exec \' + tmp, _user: domain + \'\\\\\' + user } };\r\n for (var c1e in process.env) {\r\n taskoptions.env[c1e] = process.env[c1e];\r\n }\r\n\r\n var child = require(\'child_process\').execFile(process.env[\'windir\'] + \'\\\\System32\\\\WindowsPowerShell\\\\v1.0\\\\powershell.exe\', [\'powershell\', \'-noprofile\', \'-nologo\', \'-command\', \'-\'], taskoptions);\r\n child.stderr.on(\'data\', function (c) { });\r\n child.stdout.on(\'data\', function (c) { });\r\n child.stdin.write(\'SCHTASKS /CREATE /F /TN MeshUserTask /SC ONCE /ST 00:00 \');\r\n child.stdin.write(\'/RU $env:_user \');\r\n\r\n child.stdin.write(\'/TR "$env:_target $env:_args"\\r\\n\');\r\n child.stdin.write(\'$ts = New-Object -ComObject Schedule.service\\r\\n\');\r\n child.stdin.write(\'$ts.connect()\\r\\n\');\r\n child.stdin.write(\'$tsfolder = $ts.getfolder("\\\\")\\r\\n\');\r\n child.stdin.write(\'$task = $tsfolder.GetTask("MeshUserTask")\\r\\n\');\r\n child.stdin.write(\'$taskdef = $task.Definition\\r\\n\');\r\n child.stdin.write(\'$taskdef.Settings.StopIfGoingOnBatteries = $false\\r\\n\');\r\n child.stdin.write(\'$taskdef.Settings.DisallowStartIfOnBatteries = $false\\r\\n\');\r\n child.stdin.write(\'$taskdef.Actions.Item(1).Path = $env:_target\\r\\n\');\r\n child.stdin.write(\'$taskdef.Actions.Item(1).Arguments = $env:_args\\r\\n\');\r\n child.stdin.write(\'$tsfolder.RegisterTaskDefinition($task.Name, $taskdef, 4, $null, $null, $null)\\r\\n\');\r\n\r\n child.stdin.write(\'SCHTASKS /RUN /TN MeshUserTask\\r\\n\');\r\n child.stdin.write(\'SCHTASKS /DELETE /F /TN MeshUserTask\\r\\nexit\\r\\n\');\r\n child.waitExit();\r\n }\r\n response = \'Setting clipboard to: "\' + args[\'_\'][0] + \'"\';\r\n }\r\n else {\r\n require("clipboard")(args[\'_\'][0]); response = \'Setting clipboard to: "\' + args[\'_\'][0] + \'"\';\r\n }\r\n }\r\n break;\r\n }\r\n case \'openurl\': {\r\n if (args[\'_\'].length != 1) { response = \'Proper usage: openurl (url)\'; } // Display usage\r\n else { if (openUserDesktopUrl(args[\'_\'][0]) == null) { response = \'Failed.\'; } else { response = \'Success.\'; } }\r\n break;\r\n }\r\n case \'users\': {\r\n if (meshCoreObj.users == null) { response = \'Active users are unknown.\'; } else { response = \'Active Users: \' + meshCoreObj.users.join(\', \') + \'.\'; }\r\n require(\'user-sessions\').enumerateUsers().then(function (u) { for (var i in u) { sendConsoleText(u[i]); } });\r\n break;\r\n }\r\n case \'toast\': {\r\n if (args[\'_\'].length < 1) { response = \'Proper usage: toast "message"\'; } else {\r\n if (require(\'MeshAgent\')._tsid == null) {\r\n require(\'toaster\').Toast(\'MeshCentral\', args[\'_\'][0]).then(sendConsoleText, sendConsoleText);\r\n }\r\n else {\r\n require(\'toaster\').Toast(\'MeshCentral\', args[\'_\'][0], require(\'MeshAgent\')._tsid).then(sendConsoleText, sendConsoleText);\r\n }\r\n }\r\n break;\r\n }\r\n case \'setdebug\': {\r\n if (args[\'_\'].length < 1) { response = \'Proper usage: setdebug (target), 0 = Disabled, 1 = StdOut, 2 = This Console, * = All Consoles, 4 = WebLog, 8 = Logfile\'; } // Display usage\r\n else { if (args[\'_\'][0] == \'*\') { console.setDestination(2); } else { console.setDestination(parseInt(args[\'_\'][0]), sessionid); } }\r\n break;\r\n }\r\n case \'ps\': {\r\n processManager.getProcesses(function (plist) {\r\n var x = \'\';\r\n for (var i in plist) { x += i + ((plist[i].user) ? (\', \' + plist[i].user) : \'\') + \', \' + plist[i].cmd + \'\\r\\n\'; }\r\n sendConsoleText(x, sessionid);\r\n });\r\n break;\r\n }\r\n case \'kill\': {\r\n if ((args[\'_\'].length < 1)) {\r\n response = \'Proper usage: kill [pid]\'; // Display correct command usage\r\n } else {\r\n process.kill(parseInt(args[\'_\'][0]));\r\n response = \'Killed process \' + args[\'_\'][0] + \'.\';\r\n }\r\n break;\r\n }\r\n case \'smbios\': {\r\n if (SMBiosTables == null) { response = \'SMBios tables not available.\'; } else { response = objToString(SMBiosTables, 0, \' \', true); }\r\n break;\r\n }\r\n case \'rawsmbios\': {\r\n if (SMBiosTablesRaw == null) { response = \'SMBios tables not available.\'; } else {\r\n response = \'\';\r\n for (var i in SMBiosTablesRaw) {\r\n var header = false;\r\n for (var j in SMBiosTablesRaw[i]) {\r\n if (SMBiosTablesRaw[i][j].length > 0) {\r\n if (header == false) { response += (\'Table type #\' + i + ((require(\'smbios\').smTableTypes[i] == null) ? \'\' : (\', \' + require(\'smbios\').smTableTypes[i]))) + \'\\r\\n\'; header = true; }\r\n response += (\' \' + SMBiosTablesRaw[i][j].toString(\'hex\')) + \'\\r\\n\';\r\n }\r\n }\r\n }\r\n }\r\n break;\r\n }\r\n case \'eval\': { // Eval JavaScript\r\n if (args[\'_\'].length < 1) {\r\n response = \'Proper usage: eval "JavaScript code"\'; // Display correct command usage\r\n } else {\r\n response = JSON.stringify(mesh.eval(args[\'_\'][0])); // This can only be run by trusted administrator.\r\n }\r\n break;\r\n }\r\n case \'uninstallagent\': // Uninstall this agent\r\n var agentName = process.platform == \'win32\' ? \'Mesh Agent\' : \'meshagent\';\r\n try {\r\n agentName = require(\'MeshAgent\').serviceName;\r\n }\r\n catch (x) {\r\n }\r\n\r\n if (!require(\'service-manager\').manager.getService(agentName).isMe()) {\r\n response = \'Uininstall failed, this instance is not the service instance\';\r\n } else {\r\n try { diagnosticAgent_uninstall(); } catch (e) { }\r\n var js = "require(\'service-manager\').manager.getService(\'" + agentName + "\').stop(); require(\'service-manager\').manager.uninstallService(\'" + agentName + "\'); process.exit();";\r\n this.child = require(\'child_process\').execFile(process.execPath, [process.platform == \'win32\' ? (process.execPath.split(\'\\\\\').pop()) : (process.execPath.split(\'/\').pop()), \'-b64exec\', Buffer.from(js).toString(\'base64\')], { type: 4, detached: true });\r\n }\r\n break;\r\n case \'notify\': { // Send a notification message to the mesh\r\n if (args[\'_\'].length != 1) {\r\n response = \'Proper usage: notify "message" [--session]\'; // Display correct command usage\r\n } else {\r\n var notification = { action: \'msg\', type: \'notify\', value: args[\'_\'][0], tag: \'console\' };\r\n if (args.session) { notification.sessionid = sessionid; } // If "--session" is specified, notify only this session, if not, the server will notify the mesh\r\n mesh.SendCommand(notification); // no sessionid or userid specified, notification will go to the entire mesh\r\n response = "ok";\r\n }\r\n break;\r\n }\r\n case \'cpuinfo\': { // Return system information\r\n // CPU & memory utilization\r\n pr = require(\'sysinfo\').cpuUtilization();\r\n pr.sessionid = sessionid;\r\n pr.then(function (data) {\r\n sendConsoleText(JSON.stringify(\r\n {\r\n cpu: data,\r\n memory: require(\'sysinfo\').memUtilization(),\r\n thermals: require(\'sysinfo\').thermals == null ? [] : require(\'sysinfo\').thermals()\r\n }, null, 1), this.sessionid);\r\n }, function (e) {\r\n sendConsoleText(e);\r\n });\r\n break;\r\n }\r\n case \'sysinfo\': { // Return system information\r\n getSystemInformation(function (results, err) {\r\n if (results == null) { sendConsoleText(err, this.sessionid); } else {\r\n sendConsoleText(JSON.stringify(results, null, 1), this.sessionid);\r\n }\r\n });\r\n break;\r\n }\r\n case \'info\': { // Return information about the agent and agent core module\r\n response = \'Current Core: \' + meshCoreObj.value + \'\\r\\nAgent Time: \' + Date() + \'.\\r\\nUser Rights: 0x\' + rights.toString(16) + \'.\\r\\nPlatform: \' + process.platform + \'.\\r\\nCapabilities: \' + meshCoreObj.caps + \'.\\r\\nServer URL: \' + mesh.ServerUrl + \'.\';\r\n if (amt != null) { response += \'\\r\\nBuilt-in LMS: \' + [\'Disabled\', \'Connecting..\', \'Connected\'][amt.lmsstate] + \'.\'; }\r\n if (meshCoreObj.osdesc) { response += \'\\r\\nOS: \' + meshCoreObj.osdesc + \'.\'; }\r\n response += \'\\r\\nModules: \' + addedModules.join(\', \') + \'.\';\r\n response += \'\\r\\nServer Connection: \' + mesh.isControlChannelConnected + \', State: \' + meshServerConnectionState + \'.\';\r\n var oldNodeId = db.Get(\'OldNodeId\');\r\n if (oldNodeId != null) { response += \'\\r\\nOldNodeID: \' + oldNodeId + \'.\'; }\r\n if (process.platform == \'linux\' || process.platform == \'freebsd\') { response += \'\\r\\nX11 support: \' + require(\'monitor-info\').kvm_x11_support + \'.\'; }\r\n //response += \'\\r\\Debug Console: \' + debugConsole + \'.\';\r\n break;\r\n }\r\n case \'osinfo\': { // Return the operating system information\r\n var i = 1;\r\n if (args[\'_\'].length > 0) { i = parseInt(args[\'_\'][0]); if (i > 8) { i = 8; } response = \'Calling \' + i + \' times.\'; }\r\n for (var j = 0; j < i; j++) {\r\n var pr = require(\'os\').name();\r\n pr.sessionid = sessionid;\r\n pr.then(function (v) {\r\n sendConsoleText("OS: " + v + (process.platform == \'win32\' ? (require(\'win-virtual-terminal\').supported ? \' [ConPTY: YES]\' : \' [ConPTY: NO]\') : \'\'), this.sessionid);\r\n });\r\n }\r\n break;\r\n }\r\n case \'args\': { // Displays parsed command arguments\r\n response = \'args \' + objToString(args, 0, \' \', true);\r\n break;\r\n }\r\n case \'print\': { // Print a message on the mesh agent console, does nothing when running in the background\r\n var r = [];\r\n for (var i in args[\'_\']) { r.push(args[\'_\'][i]); }\r\n console.log(r.join(\' \'));\r\n response = \'Message printed on agent console.\';\r\n break;\r\n }\r\n case \'type\': { // Returns the content of a file\r\n if (args[\'_\'].length == 0) {\r\n response = \'Proper usage: type (filepath) [maxlength]\'; // Display correct command usage\r\n } else {\r\n var max = 4096;\r\n if ((args[\'_\'].length > 1) && (typeof args[\'_\'][1] == \'number\')) { max = args[\'_\'][1]; }\r\n if (max > 4096) max = 4096;\r\n var buf = Buffer.alloc(max), fd = fs.openSync(args[\'_\'][0], "r"), r = fs.readSync(fd, buf, 0, max); // Read the file content\r\n response = buf.toString();\r\n var i = response.indexOf(\'\\n\');\r\n if ((i > 0) && (response[i - 1] != \'\\r\')) { response = response.split(\'\\n\').join(\'\\r\\n\'); }\r\n if (r == max) response += \'...\';\r\n fs.closeSync(fd);\r\n }\r\n break;\r\n }\r\n case \'dbkeys\': { // Return all data store keys\r\n response = JSON.stringify(db.Keys);\r\n break;\r\n }\r\n case \'dbget\': { // Return the data store value for a given key\r\n if (db == null) { response = \'Database not accessible.\'; break; }\r\n if (args[\'_\'].length != 1) {\r\n response = \'Proper usage: dbget (key)\'; // Display the value for a given database key\r\n } else {\r\n response = db.Get(args[\'_\'][0]);\r\n }\r\n break;\r\n }\r\n case \'dbset\': { // Set a data store key and value pair\r\n if (db == null) { response = \'Database not accessible.\'; break; }\r\n if (args[\'_\'].length != 2) {\r\n response = \'Proper usage: dbset (key) (value)\'; // Set a database key\r\n } else {\r\n var r = db.Put(args[\'_\'][0], args[\'_\'][1]);\r\n response = \'Key set: \' + r;\r\n }\r\n break;\r\n }\r\n case \'dbcompact\': { // Compact the data store\r\n if (db == null) { response = \'Database not accessible.\'; break; }\r\n var r = db.Compact();\r\n response = \'Database compacted: \' + r;\r\n break;\r\n }\r\n case \'httpget\': {\r\n if (consoleHttpRequest != null) {\r\n response = \'HTTP operation already in progress.\';\r\n } else {\r\n if (args[\'_\'].length != 1) {\r\n response = \'Proper usage: httpget (url)\';\r\n } else {\r\n var options = http.parseUri(args[\'_\'][0]);\r\n options.method = \'GET\';\r\n if (options == null) {\r\n response = \'Invalid url.\';\r\n } else {\r\n try { consoleHttpRequest = http.request(options, consoleHttpResponse); } catch (e) { response = \'Invalid HTTP GET request\'; }\r\n consoleHttpRequest.sessionid = sessionid;\r\n if (consoleHttpRequest != null) {\r\n consoleHttpRequest.end();\r\n response = \'HTTPGET \' + options.protocol + \'//\' + options.host + \':\' + options.port + options.path;\r\n }\r\n }\r\n }\r\n }\r\n break;\r\n }\r\n case \'wslist\': { // List all web sockets\r\n response = \'\';\r\n for (var i in consoleWebSockets) {\r\n var httprequest = consoleWebSockets[i];\r\n response += \'Websocket #\' + i + \', \' + httprequest.url + \'\\r\\n\';\r\n }\r\n if (response == \'\') { response = \'no websocket sessions.\'; }\r\n break;\r\n }\r\n case \'wsconnect\': { // Setup a web socket\r\n if (args[\'_\'].length == 0) {\r\n response = \'Proper usage: wsconnect (url)\\r\\nFor example: wsconnect wss://localhost:443/meshrelay.ashx?id=abc\'; // Display correct command usage\r\n } else {\r\n var httprequest = null;\r\n try {\r\n var options = http.parseUri(args[\'_\'][0].split(\'$\').join(\'%24\').split(\'@\').join(\'%40\')); // Escape the $ and @ characters in the URL\r\n options.rejectUnauthorized = 0;\r\n httprequest = http.request(options);\r\n } catch (e) { response = \'Invalid HTTP websocket request\'; }\r\n if (httprequest != null) {\r\n httprequest.upgrade = onWebSocketUpgrade;\r\n httprequest.on(\'error\', function (e) { sendConsoleText("ERROR: Unable to connect to: " + this.url + ", " + JSON.stringify(e)); });\r\n\r\n var index = 1;\r\n while (consoleWebSockets[index]) { index++; }\r\n httprequest.sessionid = sessionid;\r\n httprequest.index = index;\r\n httprequest.url = args[\'_\'][0];\r\n consoleWebSockets[index] = httprequest;\r\n response = \'New websocket session #\' + index;\r\n }\r\n }\r\n break;\r\n }\r\n case \'wssend\': { // Send data on a web socket\r\n if (args[\'_\'].length == 0) {\r\n response = \'Proper usage: wssend (socketnumber)\\r\\n\'; // Display correct command usage\r\n for (var i in consoleWebSockets) {\r\n var httprequest = consoleWebSockets[i];\r\n response += \'Websocket #\' + i + \', \' + httprequest.url + \'\\r\\n\';\r\n }\r\n } else {\r\n var i = parseInt(args[\'_\'][0]);\r\n var httprequest = consoleWebSockets[i];\r\n if (httprequest != undefined) {\r\n httprequest.s.write(args[\'_\'][1]);\r\n response = \'ok\';\r\n } else {\r\n response = \'Invalid web socket number\';\r\n }\r\n }\r\n break;\r\n }\r\n case \'wsclose\': { // Close a websocket\r\n if (args[\'_\'].length == 0) {\r\n response = \'Proper usage: wsclose (socketnumber)\'; // Display correct command usage\r\n } else {\r\n var i = parseInt(args[\'_\'][0]);\r\n var httprequest = consoleWebSockets[i];\r\n if (httprequest != undefined) {\r\n if (httprequest.s != null) { httprequest.s.end(); } else { httprequest.end(); }\r\n response = \'ok\';\r\n } else {\r\n response = \'Invalid web socket number\';\r\n }\r\n }\r\n break;\r\n }\r\n case \'tunnels\': { // Show the list of current tunnels\r\n response = \'\';\r\n for (var i in tunnels) { response += \'Tunnel #\' + i + \', \' + tunnels[i].url + \'\\r\\n\'; }\r\n if (response == \'\') { response = \'No websocket sessions.\'; }\r\n break;\r\n }\r\n case \'ls\': { // Show list of files and folders\r\n response = \'\';\r\n var xpath = \'*\';\r\n if (args[\'_\'].length > 0) { xpath = obj.path.join(args[\'_\'][0], \'*\'); }\r\n response = \'List of \' + xpath + \'\\r\\n\';\r\n var results = fs.readdirSync(xpath);\r\n for (var i = 0; i < results.length; ++i) {\r\n var stat = null, p = obj.path.join(args[\'_\'][0], results[i]);\r\n try { stat = fs.statSync(p); } catch (e) { }\r\n if ((stat == null) || (stat == undefined)) {\r\n response += (results[i] + "\\r\\n");\r\n } else {\r\n response += (results[i] + " " + ((stat.isDirectory()) ? "(Folder)" : "(File)") + "\\r\\n");\r\n }\r\n }\r\n break;\r\n }\r\n case \'lsx\': { // Show list of files and folders\r\n response = objToString(getDirectoryInfo(args[\'_\'][0]), 0, \' \', true);\r\n break;\r\n }\r\n case \'lock\': { // Lock the current user out of the desktop\r\n if (process.platform == \'win32\') { var child = require(\'child_process\'); child.execFile(process.env[\'windir\'] + \'\\\\system32\\\\cmd.exe\', [\'/c\', \'RunDll32.exe user32.dll,LockWorkStation\'], { type: 1 }); response = \'Ok\'; }\r\n else { response = \'Not supported on the platform\'; }\r\n break;\r\n }\r\n case \'amt\': { // Show Intel AMT status\r\n if (amt != null) {\r\n amt.getMeiState(9, function (state) {\r\n var resp = "Intel AMT not detected.";\r\n if (state != null) { resp = objToString(state, 0, \' \', true); }\r\n sendConsoleText(resp, sessionid);\r\n });\r\n } else {\r\n response = "Intel AMT not detected.";\r\n }\r\n break;\r\n }\r\n case \'netinfo\': { // Show network interface information\r\n var interfaces = require(\'os\').networkInterfaces();\r\n response = objToString(interfaces, 0, \' \', true);\r\n break;\r\n }\r\n case \'wakeonlan\': { // Send wake-on-lan\r\n if ((args[\'_\'].length != 1) || (args[\'_\'][0].length != 12)) {\r\n response = \'Proper usage: wakeonlan [mac], for example "wakeonlan 010203040506".\';\r\n } else {\r\n var count = sendWakeOnLanEx([args[\'_\'][0]]);\r\n sendWakeOnLanEx([args[\'_\'][0]]);\r\n sendWakeOnLanEx([args[\'_\'][0]]);\r\n response = \'Sending wake-on-lan on \' + count + \' interface(s).\';\r\n }\r\n break;\r\n }\r\n case \'sendall\': { // Send a message to all consoles on this mesh\r\n sendConsoleText(args[\'_\'].join(\' \'));\r\n break;\r\n }\r\n case \'power\': { // Execute a power action on this computer\r\n if (mesh.ExecPowerState == undefined) {\r\n response = \'Power command not supported on this agent.\';\r\n } else {\r\n if ((args[\'_\'].length == 0) || isNaN(Number(args[\'_\'][0]))) {\r\n response = \'Proper usage: power (actionNumber), where actionNumber is:\\r\\n LOGOFF = 1\\r\\n SHUTDOWN = 2\\r\\n REBOOT = 3\\r\\n SLEEP = 4\\r\\n HIBERNATE = 5\\r\\n DISPLAYON = 6\\r\\n KEEPAWAKE = 7\\r\\n BEEP = 8\\r\\n CTRLALTDEL = 9\\r\\n VIBRATE = 13\\r\\n FLASH = 14\'; // Display correct command usage\r\n } else {\r\n var r = mesh.ExecPowerState(Number(args[\'_\'][0]), Number(args[\'_\'][1]));\r\n response = \'Power action executed with return code: \' + r + \'.\';\r\n }\r\n }\r\n break;\r\n }\r\n case \'location\': {\r\n getIpLocationData(function (location) {\r\n sendConsoleText(objToString({ action: \'iplocation\', type: \'publicip\', value: location }, 0, \' \'));\r\n });\r\n break;\r\n }\r\n case \'parseuri\': {\r\n response = JSON.stringify(http.parseUri(args[\'_\'][0]));\r\n break;\r\n }\r\n case \'scanwifi\': {\r\n if (wifiScanner != null) {\r\n var wifiPresent = wifiScanner.hasWireless;\r\n if (wifiPresent) { response = "Perfoming Wifi scan..."; wifiScanner.Scan(); } else { response = "Wifi absent."; }\r\n } else\r\n { response = "Wifi module not present."; }\r\n break;\r\n }\r\n case \'modules\': {\r\n response = JSON.stringify(addedModules);\r\n break;\r\n }\r\n case \'listservices\': {\r\n var services = require(\'service-manager\').manager.enumerateService();\r\n response = JSON.stringify(services, null, 1);\r\n break;\r\n }\r\n case \'getscript\': {\r\n if (args[\'_\'].length != 1) {\r\n response = "Proper usage: getscript [scriptNumber].";\r\n } else {\r\n mesh.SendCommand({ action: \'getScript\', type: args[\'_\'][0] });\r\n }\r\n break;\r\n }\r\n case \'diagnostic\':\r\n {\r\n if (!mesh.DAIPC.listening) {\r\n response = \'Unable to bind to Diagnostic IPC, most likely because the path (\' + process.cwd() + \') is not on a local file system\';\r\n break;\r\n }\r\n var diag = diagnosticAgent_installCheck();\r\n if (diag) {\r\n if (args[\'_\'].length == 1 && args[\'_\'][0] == \'uninstall\') {\r\n diagnosticAgent_uninstall();\r\n response = \'Diagnostic Agent uninstalled\';\r\n }\r\n else {\r\n response = \'Diagnostic Agent installed at: \' + diag.appLocation();\r\n }\r\n }\r\n else {\r\n if (args[\'_\'].length == 1 && args[\'_\'][0] == \'install\') {\r\n diag = diagnosticAgent_installCheck(true);\r\n if (diag) {\r\n response = \'Diagnostic agent was installed at: \' + diag.appLocation();\r\n }\r\n else {\r\n response = \'Diagnostic agent installation failed\';\r\n }\r\n }\r\n else {\r\n response = \'Diagnostic Agent Not installed. To install: diagnostic install\';\r\n }\r\n }\r\n if (diag) { diag.close(); diag = null; }\r\n break;\r\n }\r\n case \'amtevents\': {\r\n if (obj.amtevents == null) { response = \'No events.\'; } else { response = obj.amtevents.join(\'\\r\\n\'); }\r\n break;\r\n }\r\n case \'amtconfig\': {\r\n if (amt == null) { response = "Intel AMT not detected."; break; }\r\n if (apftunnel != null) { response = "Intel AMT server tunnel already active"; break; }\r\n amt.getMeiState(15, function (state) {\r\n var rx = \'\';\r\n if ((state == null) || (state.ProvisioningState == null)) { rx = "Intel AMT not ready for configuration."; } else {\r\n var apfarg = {\r\n mpsurl: mesh.ServerUrl.replace(\'agent.ashx\', \'apf.ashx\'),\r\n mpsuser: Buffer.from(mesh.ServerInfo.MeshID, \'hex\').toString(\'base64\').substring(0, 16),\r\n mpspass: Buffer.from(mesh.ServerInfo.MeshID, \'hex\').toString(\'base64\').substring(0, 16),\r\n mpskeepalive: 60000,\r\n clientname: state.OsHostname,\r\n clientaddress: \'127.0.0.1\',\r\n clientuuid: state.UUID,\r\n conntype: 2, // 0 = CIRA, 1 = Relay, 2 = LMS. The correct value is 2 since we are performing an LMS relay, other values for testing.\r\n meiState: state // MEI state will be passed to MPS server\r\n };\r\n if ((state.UUID == null) || (state.UUID.length != 36)) {\r\n rx = "Unable to get Intel AMT UUID";\r\n } else {\r\n addAmtEvent(\'User LMS tunnel start.\');\r\n apftunnel = require(\'amt-apfclient\')({ debug: false }, apfarg);\r\n apftunnel.onJsonControl = handleApfJsonControl;\r\n apftunnel.onChannelClosed = function () { addAmtEvent(\'User LMS tunnel closed.\'); apftunnel = null; }\r\n try {\r\n apftunnel.connect();\r\n rx = "Started Intel AMT configuration";\r\n } catch (ex) {\r\n rx = JSON.stringify(ex);\r\n }\r\n }\r\n }\r\n if (rx != \'\') { require(\'MeshAgent\').SendCommand({ action: \'msg\', type: \'console\', value: rx }); }\r\n });\r\n break;\r\n }\r\n case \'apf\': {\r\n if (meshCoreObj.intelamt !== null) {\r\n if (args[\'_\'].length == 1) {\r\n var connType = -1, connTypeStr = args[\'_\'][0].toLowerCase();\r\n if (connTypeStr == \'lms\') { connType = 2; }\r\n if (connTypeStr == \'relay\') { connType = 1; }\r\n if (connTypeStr == \'cira\') { connType = 0; }\r\n if (connTypeStr == \'off\') { connType = -2; }\r\n if (connType >= 0) { // Connect\r\n var apfarg = {\r\n mpsurl: mesh.ServerUrl.replace(\'agent.ashx\', \'apf.ashx\'),\r\n mpsuser: Buffer.from(mesh.ServerInfo.MeshID, \'hex\').toString(\'base64\').substring(0, 16),\r\n mpspass: Buffer.from(mesh.ServerInfo.MeshID, \'hex\').toString(\'base64\').substring(0, 16),\r\n mpskeepalive: 60000,\r\n clientname: require(\'os\').hostname(),\r\n clientaddress: \'127.0.0.1\',\r\n clientuuid: meshCoreObj.intelamt.uuid,\r\n conntype: connType // 0 = CIRA, 1 = Relay, 2 = LMS. The correct value is 2 since we are performing an LMS relay, other values for testing.\r\n };\r\n if ((apfarg.clientuuid == null) || (apfarg.clientuuid.length != 36)) {\r\n response = "Unable to get Intel AMT UUID: " + apfarg.clientuuid;\r\n } else {\r\n apftunnel = require(\'amt-apfclient\')({ debug: false }, apfarg);\r\n apftunnel.onJsonControl = handleApfJsonControl;\r\n apftunnel.onChannelClosed = function () { apftunnel = null; }\r\n try {\r\n apftunnel.connect();\r\n response = "Started APF tunnel";\r\n } catch (e) {\r\n response = JSON.stringify(e);\r\n }\r\n }\r\n } else if (connType == -2) { // Disconnect\r\n try {\r\n apftunnel.disconnect();\r\n response = "Stopped APF tunnel";\r\n } catch (e) {\r\n response = JSON.stringify(e);\r\n }\r\n apftunnel = null;\r\n } else {\r\n response = "Invalid command.\\r\\nUse: apf lms|relay|cira|off";\r\n }\r\n } else {\r\n response = "APF tunnel is " + (apftunnel == null ? "off" : "on") + "\\r\\nUse: apf lms|relay|cira|off";\r\n }\r\n } else {\r\n response = "APF tunnel requires Intel AMT";\r\n }\r\n break;\r\n }\r\n case \'plugin\': {\r\n if (typeof args[\'_\'][0] == \'string\') {\r\n try {\r\n // Pass off the action to the plugin\r\n // for plugin creators, you\'ll want to have a plugindir/modules_meshcore/plugin.js\r\n // to control the output / actions here.\r\n response = require(args[\'_\'][0]).consoleaction(args, rights, sessionid, mesh);\r\n } catch (e) {\r\n response = "There was an error in the plugin (" + e + ")";\r\n }\r\n } else {\r\n response = "Proper usage: plugin [pluginName] [args].";\r\n }\r\n break;\r\n }\r\n default: { // This is an unknown command, return an error message\r\n response = "Unknown command \\"" + cmd + "\\", type \\"help\\" for list of avaialble commands.";\r\n break;\r\n }\r\n }\r\n } catch (e) { response = "Command returned an exception error: " + e; console.log(e); }\r\n if (response != null) { sendConsoleText(response, sessionid); }\r\n}\r\n\r\n// Send a mesh agent console command\r\nfunction sendConsoleText(text, sessionid) {\r\n if (typeof text == \'object\') { text = JSON.stringify(text); }\r\n if (debugConsole && ((sessionid == null) || (sessionid == \'pipe\'))) { broadcastToRegisteredApps({ cmd: \'console\', value: text }); }\r\n if (sessionid != \'pipe\') { require(\'MeshAgent\').SendCommand({ action: \'msg\', type: \'console\', value: text, sessionid: sessionid }); }\r\n}\r\n\r\n// Send a mesh agent message to server, placing a bubble/badge on the agent device\r\nfunction sendAgentMessage(msg, icon) {\r\n if (sendAgentMessage.messages == null) {\r\n sendAgentMessage.messages = {};\r\n sendAgentMessage.nextid = 1;\r\n }\r\n sendAgentMessage.messages[sendAgentMessage.nextid++] = { msg: msg, icon: icon };\r\n require(\'MeshAgent\').SendCommand({ action: \'sessions\', type: \'msg\', value: sendAgentMessage.messages });\r\n}\r\nfunction getOpenDescriptors() {\r\n switch (process.platform) {\r\n case "freebsd":\r\n var child = require(\'child_process\').execFile(\'/bin/sh\', [\'sh\']);\r\n child.stdout.str = \'\'; child.stdout.on(\'data\', function (c) { this.str += c.toString(); });\r\n child.stderr.on(\'data\', function (c) { });\r\n\r\n child.stdin.write("procstat -f " + process.pid + " | tr \'\\\\n\' \'`\' | awk -F\'`\' \'");\r\n child.stdin.write(\'{\');\r\n child.stdin.write(\' DEL="";\');\r\n child.stdin.write(\' printf "[";\');\r\n child.stdin.write(\' for(i=1;i 0) {\r\n fd = descriptors.pop();\r\n if (fd > 2) {\r\n libc.close(fd);\r\n }\r\n }\r\n}\r\nfunction linux_execv(name, agentfilename, sessionid) {\r\n var libs = require(\'monitor-info\').getLibInfo(\'libc\');\r\n var libc = null;\r\n\r\n if ((libs.length == 0 || libs.length == null) && require(\'MeshAgent\').ARCHID == 33) {\r\n var child = require(\'child_process\').execFile(\'/bin/sh\', [\'sh\']);\r\n child.stdout.str = \'\'; child.stdout.on(\'data\', function (c) { this.str += c.toString(); });\r\n child.stderr.str = \'\'; child.stderr.on(\'data\', function (c) { this.str += c.toString(); });\r\n child.stdin.write("ls /lib/libc.* | tr \'\\\\n\' \'`\' | awk -F\'`\' \'{ " + \' printf "["; DEL=""; for(i=1;i 0) {\r\n try {\r\n libc = require(\'_GenericMarshal\').CreateNativeProxy(libs.pop().path);\r\n break;\r\n }\r\n catch (e) {\r\n libc = null;\r\n continue;\r\n }\r\n }\r\n if (libc != null) {\r\n try {\r\n libc.CreateMethod(\'execv\');\r\n libc.CreateMethod(\'close\');\r\n }\r\n catch (e) {\r\n libc = null;\r\n }\r\n }\r\n\r\n if (libc == null) {\r\n // Couldn\'t find libc.so, fallback to using service manager to restart agent\r\n if (sessionid != null) { sendConsoleText(\'Restarting service via service-manager...\', sessionid) }\r\n try {\r\n // restart service\r\n var s = require(\'service-manager\').manager.getService(name);\r\n s.restart();\r\n }\r\n catch (zz) {\r\n sendConsoleText(\'Self Update encountered an error trying to restart service\', sessionid);\r\n sendAgentMessage(\'Self Update encountered an error trying to restart service\', 3);\r\n }\r\n return;\r\n }\r\n\r\n if (sessionid != null) { sendConsoleText(\'Restarting service via execv()...\', sessionid) }\r\n\r\n var i;\r\n var args;\r\n var argarr = [process.execPath];\r\n var argtmp = [];\r\n var path = require(\'_GenericMarshal\').CreateVariable(process.execPath);\r\n\r\n if (require(\'MeshAgent\').getStartupOptions != null) {\r\n var options = require(\'MeshAgent\').getStartupOptions();\r\n for (i in options) {\r\n argarr.push(\'--\' + i + \'="\' + options[i] + \'"\');\r\n }\r\n }\r\n\r\n args = require(\'_GenericMarshal\').CreateVariable((1 + argarr.length) * require(\'_GenericMarshal\').PointerSize);\r\n for (i = 0; i < argarr.length; ++i) {\r\n var arg = require(\'_GenericMarshal\').CreateVariable(argarr[i]);\r\n argtmp.push(arg);\r\n arg.pointerBuffer().copy(args.toBuffer(), i * require(\'_GenericMarshal\').PointerSize);\r\n }\r\n\r\n var descriptors = getOpenDescriptors();\r\n closeDescriptors(libc, descriptors);\r\n\r\n libc.execv(path, args);\r\n if (sessionid != null) { sendConsoleText(\'Self Update failed because execv() failed\', sessionid) }\r\n sendAgentMessage(\'Self Update failed because execv() failed\', 3);\r\n}\r\n\r\nfunction bsd_execv(name, agentfilename, sessionid) {\r\n var child = require(\'child_process\').execFile(\'/bin/sh\', [\'sh\']);\r\n child.stdout.str = \'\'; child.stdout.on(\'data\', function (c) { this.str += c.toString(); });\r\n child.stderr.str = \'\'; child.stderr.on(\'data\', function (c) { this.str += c.toString(); });\r\n child.stdin.write("cat /usr/lib/libc.so | awk \'");\r\n child.stdin.write(\'{\');\r\n child.stdin.write(\' a=split($0, tok, "(");\');\r\n child.stdin.write(\' if(a>1)\');\r\n child.stdin.write(\' {\');\r\n child.stdin.write(\' split(tok[2], b, ")");\');\r\n child.stdin.write(\' split(b[1], c, " ");\');\r\n child.stdin.write(\' print c[1];\');\r\n child.stdin.write(\' }\');\r\n child.stdin.write("}\'\\nexit\\n");\r\n child.waitExit();\r\n if (child.stdout.str.trim() == \'\') {\r\n if (sessionid != null) { sendConsoleText(\'Self Update failed because cannot find libc.so\', sessionid) }\r\n sendAgentMessage(\'Self Update failed because cannot find libc.so\', 3);\r\n return;\r\n }\r\n\r\n var libc = null;\r\n try {\r\n libc = require(\'_GenericMarshal\').CreateNativeProxy(child.stdout.str.trim());\r\n libc.CreateMethod(\'execv\');\r\n libc.CreateMethod(\'close\');\r\n }\r\n catch (e) {\r\n if (sessionid != null) { sendConsoleText(\'Self Update failed: \' + e.toString(), sessionid) }\r\n sendAgentMessage(\'Self Update failed: \' + e.toString(), 3);\r\n return;\r\n }\r\n\r\n var i;\r\n var path = require(\'_GenericMarshal\').CreateVariable(process.execPath);\r\n var argarr = [process.execPath];\r\n var argtmp = [];\r\n var args;\r\n var options = require(\'MeshAgent\').getStartupOptions();\r\n for (i in options) {\r\n argarr.push(\'--\' + i + \'="\' + options[i] + \'"\');\r\n }\r\n args = require(\'_GenericMarshal\').CreateVariable((1 + argarr.length) * require(\'_GenericMarshal\').PointerSize);\r\n for (i = 0; i < argarr.length; ++i) {\r\n var arg = require(\'_GenericMarshal\').CreateVariable(argarr[i]);\r\n argtmp.push(arg);\r\n arg.pointerBuffer().copy(args.toBuffer(), i * require(\'_GenericMarshal\').PointerSize);\r\n }\r\n\r\n if (sessionid != null) { sendConsoleText(\'Restarting service via execv()\', sessionid) }\r\n\r\n var descriptors = getOpenDescriptors();\r\n closeDescriptors(libc, descriptors);\r\n\r\n libc.execv(path, args);\r\n if (sessionid != null) { sendConsoleText(\'Self Update failed because execv() failed\', sessionid) }\r\n sendAgentMessage(\'Self Update failed because execv() failed\', 3);\r\n}\r\n\r\nfunction windows_execve(name, agentfilename, sessionid) {\r\n var libc;\r\n try {\r\n libc = require(\'_GenericMarshal\').CreateNativeProxy(\'msvcrt.dll\');\r\n libc.CreateMethod(\'_wexecve\');\r\n }\r\n catch (xx) {\r\n sendConsoleText(\'Self Update failed because msvcrt.dll is missing\', sessionid);\r\n sendAgentMessage(\'Self Update failed because msvcrt.dll is missing\', 3);\r\n return;\r\n }\r\n\r\n var cmd = require(\'_GenericMarshal\').CreateVariable(process.env[\'windir\'] + \'\\\\system32\\\\cmd.exe\', { wide: true });\r\n var args = require(\'_GenericMarshal\').CreateVariable(3 * require(\'_GenericMarshal\').PointerSize);\r\n var arg1 = require(\'_GenericMarshal\').CreateVariable(\'cmd.exe\', { wide: true });\r\n var arg2 = require(\'_GenericMarshal\').CreateVariable(\'/C wmic service "\' + name + \'" call stopservice & "\' + process.cwd() + agentfilename + \'.update.exe" -b64exec \' + \'dHJ5CnsKICAgIHZhciBzZXJ2aWNlTG9jYXRpb24gPSBwcm9jZXNzLmFyZ3YucG9wKCk7CiAgICByZXF1aXJlKCdwcm9jZXNzLW1hbmFnZXInKS5lbnVtZXJhdGVQcm9jZXNzZXMoKS50aGVuKGZ1bmN0aW9uIChwcm9jKQogICAgewogICAgICAgIGZvciAodmFyIHAgaW4gcHJvYykKICAgICAgICB7CiAgICAgICAgICAgIGlmIChwcm9jW3BdLnBhdGggPT0gc2VydmljZUxvY2F0aW9uKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBwcm9jZXNzLmtpbGwocHJvY1twXS5waWQpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHByb2Nlc3MuZXhpdCgpOwogICAgfSk7Cn0KY2F0Y2goZSkKewogICAgcHJvY2Vzcy5leGl0KCk7Cn0=\' +\r\n \' "\' + process.execPath + \'" & copy "\' + process.cwd() + agentfilename + \'.update.exe" "\' + process.execPath + \'" & wmic service "\' + name + \'" call startservice & erase "\' + process.cwd() + agentfilename + \'.update.exe"\', { wide: true });\r\n\r\n arg1.pointerBuffer().copy(args.toBuffer());\r\n arg2.pointerBuffer().copy(args.toBuffer(), require(\'_GenericMarshal\').PointerSize);\r\n\r\n libc._wexecve(cmd, args, 0);\r\n}\r\n\r\n// Start a JavaScript based Agent Self-Update\r\nfunction agentUpdate_Start(updateurl, updateoptions) {\r\n // If this value is null\r\n var sessionid = (updateoptions != null) ? updateoptions.sessionid : null; // If this is null, messages will be broadcast. Otherwise they will be unicasted\r\n\r\n // If the url starts with *, switch it to use the same protoco, host and port as the control channel.\r\n if (updateurl != null) {\r\n updateurl = getServerTargetUrlEx(updateurl);\r\n if (updateurl.startsWith("wss://")) { updateurl = "https://" + updateurl.substring(6); }\r\n }\r\n\r\n if (agentUpdate_Start._selfupdate != null) {\r\n // We were already called, so we will ignore this duplicate request\r\n if (sessionid != null) { sendConsoleText(\'Self update already in progress...\', sessionid); }\r\n }\r\n else {\r\n if (agentUpdate_Start._retryCount == null) { agentUpdate_Start._retryCount = 0; }\r\n if (require(\'MeshAgent\').ARCHID == null && updateurl == null) {\r\n // This agent doesn\'t have the ability to tell us which ARCHID it is, so we don\'t know which agent to pull\r\n sendConsoleText(\'Unable to initiate update, agent ARCHID is not defined\', sessionid);\r\n }\r\n else {\r\n var agentfilename = process.execPath.split(process.platform == \'win32\' ? \'\\\\\' : \'/\').pop(); // Local File Name, ie: MeshAgent.exe\r\n var name = require(\'MeshAgent\').serviceName;\r\n if (name == null) { name = (process.platform == \'win32\' ? \'Mesh Agent\' : \'meshagent\'); } // This is an older agent that doesn\'t expose the service name, so use the default\r\n try {\r\n var s = require(\'service-manager\').manager.getService(name);\r\n if (!s.isMe()) {\r\n if (process.platform == \'win32\') { s.close(); }\r\n sendConsoleText(\'Self Update cannot continue, this agent is not an instance of (\' + name + \')\', sessionid);\r\n return;\r\n }\r\n if (process.platform == \'win32\') { s.close(); }\r\n }\r\n catch (zz) {\r\n sendConsoleText(\'Self Update Failed because this agent is not an instance of (\' + name + \')\', sessionid);\r\n sendAgentMessage(\'Self Update Failed because this agent is not an instance of (\' + name + \')\', 3);\r\n return;\r\n }\r\n\r\n if ((sessionid != null) && (updateurl != null)) { sendConsoleText(\'Downloading update from: \' + updateurl, sessionid); }\r\n var options = require(\'http\').parseUri(updateurl != null ? updateurl : require(\'MeshAgent\').ServerUrl);\r\n options.protocol = \'https:\';\r\n if (updateurl == null) { options.path = (\'/meshagents?id=\' + require(\'MeshAgent\').ARCHID); sendConsoleText(\'Downloading update from: \' + options.path, sessionid); }\r\n options.rejectUnauthorized = false;\r\n options.checkServerIdentity = function checkServerIdentity(certs) {\r\n // If the tunnel certificate matches the control channel certificate, accept the connection\r\n try { if (require(\'MeshAgent\').ServerInfo.ControlChannelCertificate.digest == certs[0].digest) return; } catch (ex) { }\r\n try { if (require(\'MeshAgent\').ServerInfo.ControlChannelCertificate.fingerprint == certs[0].fingerprint) return; } catch (ex) { }\r\n\r\n // Check that the certificate is the one expected by the server, fail if not.\r\n if (checkServerIdentity.servertlshash == null) {\r\n if (require(\'MeshAgent\').ServerInfo == null || require(\'MeshAgent\').ServerInfo.ControlChannelCertificate == null) { return; }\r\n sendConsoleText(\'Self Update failed, because the url cannot be verified: \' + updateurl, sessionid);\r\n sendAgentMessage(\'Self Update failed, because the url cannot be verified: \' + updateurl, 3);\r\n throw new Error(\'BadCert\');\r\n }\r\n if (certs[0].digest == null) { return; }\r\n if ((checkServerIdentity.servertlshash != null) && (checkServerIdentity.servertlshash.toLowerCase() != certs[0].digest.split(\':\').join(\'\').toLowerCase())) {\r\n sendConsoleText(\'Self Update failed, because the supplied certificate does not match\', sessionid);\r\n sendAgentMessage(\'Self Update failed, because the supplied certificate does not match\', 3);\r\n throw new Error(\'BadCert\')\r\n }\r\n }\r\n options.checkServerIdentity.servertlshash = (updateoptions != null ? updateoptions.tlshash : null);\r\n agentUpdate_Start._selfupdate = require(\'https\').get(options);\r\n agentUpdate_Start._selfupdate.on(\'error\', function (e) {\r\n sendConsoleText(\'Self Update failed, because there was a problem trying to download the update from \' + updateurl, sessionid);\r\n sendAgentMessage(\'Self Update failed, because there was a problem trying to download the update from \' + updateurl, 3);\r\n agentUpdate_Start._selfupdate = null;\r\n });\r\n agentUpdate_Start._selfupdate.on(\'response\', function (img) {\r\n this._file = require(\'fs\').createWriteStream(agentfilename + (process.platform == \'win32\' ? \'.update.exe\' : \'.update\'), { flags: \'wb\' });\r\n this._filehash = require(\'SHA384Stream\').create();\r\n this._filehash.on(\'hash\', function (h) {\r\n if (updateoptions != null && updateoptions.hash != null) {\r\n if (updateoptions.hash.toLowerCase() == h.toString(\'hex\').toLowerCase()) {\r\n if (sessionid != null) { sendConsoleText(\'Download complete. HASH verified.\', sessionid); }\r\n }\r\n else {\r\n agentUpdate_Start._retryCount++;\r\n sendConsoleText(\'Self Update FAILED because the downloaded agent FAILED hash check (\' + agentUpdate_Start._retryCount + \'), URL: \' + updateurl, sessionid);\r\n sendAgentMessage(\'Self Update FAILED because the downloaded agent FAILED hash check (\' + agentUpdate_Start._retryCount + \'), URL: \' + updateurl, 3);\r\n agentUpdate_Start._selfupdate = null;\r\n\r\n if (agentUpdate_Start._retryCount < 4) {\r\n // Retry the download again\r\n sendConsoleText(\'Self Update will try again in 60 seconds...\', sessionid);\r\n agentUpdate_Start._timeout = setTimeout(agentUpdate_Start, 60000, updateurl, updateoptions);\r\n }\r\n else {\r\n sendConsoleText(\'Self Update giving up, too many failures...\', sessionid);\r\n sendAgentMessage(\'Self Update giving up, too many failures...\', 3);\r\n }\r\n return;\r\n }\r\n }\r\n else {\r\n sendConsoleText(\'Download complete. HASH=\' + h.toString(\'hex\'), sessionid);\r\n }\r\n\r\n // Send an indication to the server that we got the update download correctly.\r\n try { require(\'MeshAgent\').SendCommand({ action: \'agentupdatedownloaded\' }); } catch (e) { }\r\n\r\n if (sessionid != null) { sendConsoleText(\'Updating and restarting agent...\', sessionid); }\r\n if (process.platform == \'win32\') {\r\n // Use _wexecve() equivalent to perform the update\r\n windows_execve(name, agentfilename, sessionid);\r\n }\r\n else {\r\n var m = require(\'fs\').statSync(process.execPath).mode;\r\n require(\'fs\').chmodSync(process.cwd() + agentfilename + \'.update\', m);\r\n\r\n // remove binary\r\n require(\'fs\').unlinkSync(process.execPath);\r\n\r\n // copy update\r\n require(\'fs\').copyFileSync(process.cwd() + agentfilename + \'.update\', process.execPath);\r\n require(\'fs\').chmodSync(process.execPath, m);\r\n\r\n // erase update\r\n require(\'fs\').unlinkSync(process.cwd() + agentfilename + \'.update\');\r\n\r\n switch (process.platform) {\r\n case \'freebsd\':\r\n bsd_execv(name, agentfilename, sessionid);\r\n break;\r\n case \'linux\':\r\n linux_execv(name, agentfilename, sessionid);\r\n break;\r\n default:\r\n try {\r\n // restart service\r\n var s = require(\'service-manager\').manager.getService(name);\r\n s.restart();\r\n }\r\n catch (zz) {\r\n sendConsoleText(\'Self Update encountered an error trying to restart service\', sessionid);\r\n sendAgentMessage(\'Self Update encountered an error trying to restart service\', 3);\r\n }\r\n break;\r\n }\r\n }\r\n });\r\n img.pipe(this._file);\r\n img.pipe(this._filehash);\r\n });\r\n }\r\n }\r\n}\r\n\r\n\r\n\r\n\r\n// Called before the process exits\r\n//process.exit = function (code) { console.log("Exit with code: " + code.toString()); }\r\n\r\n// Called when the server connection state changes\r\nfunction handleServerConnection(state) {\r\n meshServerConnectionState = state;\r\n if (meshServerConnectionState == 0) {\r\n // Server disconnected\r\n if (selfInfoUpdateTimer != null) { clearInterval(selfInfoUpdateTimer); selfInfoUpdateTimer = null; }\r\n lastSelfInfo = null;\r\n } else {\r\n // Server connected, send mesh core information\r\n var oldNodeId = db.Get(\'OldNodeId\');\r\n if (oldNodeId != null) { mesh.SendCommand({ action: \'mc1migration\', oldnodeid: oldNodeId }); }\r\n\r\n // Send SMBios tables if present\r\n if (SMBiosTablesRaw != null) { mesh.SendCommand({ action: \'smbios\', value: SMBiosTablesRaw }); }\r\n\r\n // Update the server on with basic info, logged in users and more advanced stuff, like Intel ME and Network Settings\r\n meInfoStr = null;\r\n sendPeriodicServerUpdate(null, true);\r\n if (selfInfoUpdateTimer == null) {\r\n selfInfoUpdateTimer = setInterval(sendPeriodicServerUpdate, 1200000); // 20 minutes\r\n selfInfoUpdateTimer.metadata = \'meshcore (InfoUpdate Timer)\';\r\n }\r\n\r\n // Send any state messages\r\n if (Object.keys(tunnelUserCount.msg).length > 0) {\r\n try { mesh.SendCommand({ action: \'sessions\', type: \'msg\', value: tunnelUserCount.msg }); } catch (e) { }\r\n broadcastSessionsToRegisteredApps();\r\n }\r\n\r\n // Send update of registered applications to the server\r\n updateRegisteredAppsToServer();\r\n }\r\n\r\n // Send server state update to registered applications\r\n broadcastToRegisteredApps({ cmd: \'serverstate\', value: meshServerConnectionState, url: require(\'MeshAgent\').ConnectedServer });\r\n}\r\n\r\n// Update the server with the latest network interface information\r\nvar sendNetworkUpdateNagleTimer = null;\r\nfunction sendNetworkUpdateNagle() { if (sendNetworkUpdateNagleTimer != null) { clearTimeout(sendNetworkUpdateNagleTimer); sendNetworkUpdateNagleTimer = null; } sendNetworkUpdateNagleTimer = setTimeout(sendNetworkUpdate, 5000); }\r\nfunction sendNetworkUpdate(force) {\r\n sendNetworkUpdateNagleTimer = null;\r\n\r\n try {\r\n // Update the network interfaces information data\r\n var netInfo = { netif2: require(\'os\').networkInterfaces() };\r\n if (netInfo.netif2) {\r\n netInfo.action = \'netinfo\';\r\n var netInfoStr = JSON.stringify(netInfo);\r\n if ((force == true) || (clearGatewayMac(netInfoStr) != clearGatewayMac(lastNetworkInfo))) { mesh.SendCommand(netInfo); lastNetworkInfo = netInfoStr; }\r\n }\r\n } catch (ex) { }\r\n}\r\n\r\n// Called periodically to check if we need to send updates to the server\r\nfunction sendPeriodicServerUpdate(flags, force) {\r\n if (meshServerConnectionState == 0) return; // Not connected to server, do nothing.\r\n if (!flags) { flags = 0xFFFFFFFF; }\r\n\r\n // If we have a connected MEI, get Intel ME information\r\n if ((flags & 1) && (amt != null) && (amt.state == 2)) {\r\n delete meshCoreObj.intelamt;\r\n amt.getMeiState(9, function (meinfo) {\r\n meshCoreObj.intelamt = meinfo;\r\n meshCoreObj.intelamt.microlms = amt.lmsstate;\r\n meshCoreObjChanged();\r\n });\r\n }\r\n\r\n // Update network information\r\n if (flags & 2) { sendNetworkUpdateNagle(false); }\r\n\r\n // Update anti-virus information\r\n if ((flags & 4) && (process.platform == \'win32\')) {\r\n // Windows Command: "wmic /Namespace:\\\\root\\SecurityCenter2 Path AntiVirusProduct get /FORMAT:CSV"\r\n try { meshCoreObj.av = require(\'win-info\').av(); meshCoreObjChanged(); } catch (e) { av = null; } // Antivirus\r\n //if (process.platform == \'win32\') { try { meshCoreObj.pr = require(\'win-info\').pendingReboot(); meshCoreObjChanged(); } catch (e) { meshCoreObj.pr = null; } } // Pending reboot\r\n }\r\n if (process.platform == \'win32\') {\r\n if (require(\'MeshAgent\')._securitycenter == null) {\r\n try {\r\n require(\'MeshAgent\')._securitycenter = require(\'win-securitycenter\').status();\r\n meshCoreObj[\'wsc\'] = require(\'MeshAgent\')._securitycenter; // Windows Security Central (WSC)\r\n require(\'win-securitycenter\').on(\'changed\', function () {\r\n require(\'MeshAgent\')._securitycenter = require(\'win-securitycenter\').status();\r\n meshCoreObj[\'wsc\'] = require(\'MeshAgent\')._securitycenter; // Windows Security Central (WSC)\r\n require(\'MeshAgent\').SendCommand({ action: \'coreinfo\', wsc: require(\'MeshAgent\')._securitycenter });\r\n });\r\n } catch (e) { }\r\n }\r\n }\r\n\r\n // Send available data right now\r\n if (force) {\r\n meshCoreObj = sortObjRec(meshCoreObj);\r\n var x = JSON.stringify(meshCoreObj);\r\n if (x != LastPeriodicServerUpdate) {\r\n LastPeriodicServerUpdate = x;\r\n mesh.SendCommand(meshCoreObj);\r\n }\r\n }\r\n}\r\n\r\n// Once we are done collecting all the data, send to server if needed\r\nvar LastPeriodicServerUpdate = null;\r\nvar PeriodicServerUpdateNagleTimer = null;\r\nfunction meshCoreObjChanged() {\r\n if (PeriodicServerUpdateNagleTimer == null) {\r\n PeriodicServerUpdateNagleTimer = setTimeout(meshCoreObjChangedEx, 500);\r\n }\r\n}\r\nfunction meshCoreObjChangedEx() {\r\n PeriodicServerUpdateNagleTimer = null;\r\n meshCoreObj = sortObjRec(meshCoreObj);\r\n var x = JSON.stringify(meshCoreObj);\r\n if (x != LastPeriodicServerUpdate) {\r\n try { LastPeriodicServerUpdate = x; mesh.SendCommand(meshCoreObj); } catch (ex) { }\r\n }\r\n}\r\n\r\nfunction sortObjRec(o) { if ((typeof o != \'object\') || (Array.isArray(o))) return o; for (var i in o) { if (typeof o[i] == \'object\') { o[i] = sortObjRec(o[i]); } } return sortObj(o); }\r\nfunction sortObj(o) { return Object.keys(o).sort().reduce(function (result, key) { result[key] = o[key]; return result; }, {}); }\r\n\r\nfunction onWebSocketClosed() { sendConsoleText("WebSocket #" + this.httprequest.index + " closed.", this.httprequest.sessionid); delete consoleWebSockets[this.httprequest.index]; }\r\nfunction onWebSocketData(data) { sendConsoleText("Got WebSocket #" + this.httprequest.index + " data: " + data, this.httprequest.sessionid); }\r\nfunction onWebSocketSendOk() { sendConsoleText("WebSocket #" + this.index + " SendOK.", this.sessionid); }\r\n\r\nfunction onWebSocketUpgrade(response, s, head) {\r\n sendConsoleText("WebSocket #" + this.index + " connected.", this.sessionid);\r\n this.s = s;\r\n s.httprequest = this;\r\n s.end = onWebSocketClosed;\r\n s.data = onWebSocketData;\r\n}\r\n\r\nmesh.AddCommandHandler(handleServerCommand);\r\nmesh.AddConnectHandler(handleServerConnection);\r\n\r\n', - 'linux-noamt': '\u0000\u0000\u0000\u0000var addedModules = [];\r\ntry { addModule("monitor-border", "var red=255;var yellow=65535;var GXxor=6;var GXclear=0;var ExposureMask=(1<<15);function windows_monitorborder(){this._ObjectID=\\"monitor-info\\";var c=require(\\"monitor-info\\");var b=require(\\"_GenericMarshal\\");var g=b.CreateNativeProxy(\\"user32.dll\\");c.monitors=[];g.CreateMethod(\\"GetDC\\");g.CreateMethod(\\"ReleaseDC\\");g.CreateMethod(\\"FillRect\\");g.CreateMethod(\\"InvalidateRect\\");var a=b.CreateNativeProxy(\\"gdi32.dll\\");a.CreateMethod(\\"CreateSolidBrush\\");var d=a.CreateSolidBrush(red);var h=a.CreateSolidBrush(yellow);require(\\"events\\").EventEmitter.call(this);this.on(\\"~\\",function(){this.Stop()});this.Stop=function f(){c.redInterval=null;var j=b.CreateVariable(16);var k=j.toBuffer();for(var l in c.monitors){k.writeInt32LE(c.monitors[l].left,0);k.writeInt32LE(c.monitors[l].top,4);k.writeInt32LE(c.monitors[l].left+(c.monitors[l].right-c.monitors[l].left),8);k.writeInt32LE(c.monitors[l].bottom-c.monitors[l].top,12);g.InvalidateRect(0,j,0)}};this.Start=function e(){c.getInfo().then(function(j){var i=b.CreateVariable(16);c.monitors=j;c.dc=g.GetDC(0);c.state=0;c.redInterval=setInterval(function(){c.state=(c.state+1)%8;var k=i.toBuffer();for(var l in c.monitors){k.writeInt32LE(c.monitors[l].left,0);k.writeInt32LE(c.monitors[l].top,4);k.writeInt32LE(c.monitors[l].left+(c.monitors[l].right-c.monitors[l].left)/2,8);k.writeInt32LE(5,12);g.FillRect(c.dc,i,(c.state==0||c.state==4)?h:d);k.writeInt32LE(c.monitors[l].left+(c.monitors[l].right-c.monitors[l].left)/2,0);k.writeInt32LE(c.monitors[l].top,4);k.writeInt32LE(c.monitors[l].right,8);k.writeInt32LE(5,12);g.FillRect(c.dc,i,(c.state==1||c.state==5)?h:d);k.writeInt32LE(c.monitors[l].right-5,0);k.writeInt32LE(c.monitors[l].top,4);k.writeInt32LE(c.monitors[l].right,8);k.writeInt32LE(c.monitors[l].top+(c.monitors[l].bottom-c.monitors[l].top)/2,12);g.FillRect(c.dc,i,(c.state==2||c.state==6)?h:d);k.writeInt32LE(c.monitors[l].right-5,0);k.writeInt32LE(c.monitors[l].top+(c.monitors[l].bottom-c.monitors[l].top)/2,4);k.writeInt32LE(c.monitors[l].right,8);k.writeInt32LE(c.monitors[l].bottom,12);g.FillRect(c.dc,i,(c.state==3||c.state==7)?h:d);k.writeInt32LE(c.monitors[l].left+(c.monitors[l].right-c.monitors[l].left)/2,0);k.writeInt32LE(c.monitors[l].bottom-5,4);k.writeInt32LE(c.monitors[l].right,8);k.writeInt32LE(c.monitors[l].bottom,12);g.FillRect(c.dc,i,(c.state==4||c.state==0)?h:d);k.writeInt32LE(c.monitors[l].left,0);k.writeInt32LE(c.monitors[l].bottom-5,4);k.writeInt32LE(c.monitors[l].left+(c.monitors[l].right-c.monitors[l].left)/2,8);k.writeInt32LE(c.monitors[l].bottom,12);g.FillRect(c.dc,i,(c.state==5||c.state==1)?h:d);k.writeInt32LE(c.monitors[l].left,0);k.writeInt32LE(c.monitors[l].top+(c.monitors[l].bottom-c.monitors[l].top)/2,4);k.writeInt32LE(c.monitors[l].left+5,8);k.writeInt32LE(c.monitors[l].bottom,12);g.FillRect(c.dc,i,(c.state==6||c.state==2)?h:d);k.writeInt32LE(c.monitors[l].left,0);k.writeInt32LE(c.monitors[l].top,4);k.writeInt32LE(c.monitors[l].left+5,8);k.writeInt32LE(c.monitors[l].top+(c.monitors[l].bottom-c.monitors[l].top)/2,12);g.FillRect(c.dc,i,(c.state==7||c.state==3)?h:d)}},450)})}}function linux_monitorborder(){var a=this;this.displays=[];this._ObjectID=\\"monitor-info\\";this._info=require(\\"monitor-info\\");this._isUnity=this._info.isUnity();console.log(\\"isUnity = \\"+this._isUnity);require(\\"events\\").EventEmitter.call(this);this.on(\\"~\\",function(){this.Stop()});this.Stop=function c(){this._timeout=null;if(!this._isUnity){for(var e=0;e0){var f=c[0].split(\\":\\")[1];var a=f.split(\\",\\");var e=parseFloat(a[0].split(\\"%\\")[0].trim())+parseFloat(a[1].split(\\"%\\")[0].trim());d._res({total:e,cpus:[]})}else{d._rej(\\"parse error\\")}return(d)}function macos_memUtilization(){var d={};var e=new promise(function(h,g){this._res=h;this._rej=g});var b=require(\\"child_process\\").execFile(\\"/bin/sh\\",[\\"sh\\"]);b.stdout.str=\\"\\";b.stdout.on(\\"data\\",function(g){this.str+=g.toString()});b.stdin.write(\\\'top -l 1 | grep -E \\"^Phys\\"\\\\nexit\\\\n\\\');b.waitExit();var c=b.stdout.str.split(\\"\\\\n\\");if(c[0].length>0){var f=c[0].split(\\":\\")[1];var a=f.split(\\",\\");d.MemTotal=parseInt(a[0].trim().split(\\" \\")[0]);d.MemFree=parseInt(a[1].trim().split(\\" \\")[0]);d.percentFree=((d.MemFree/d.MemTotal)*100);d.percentConsumed=(((d.MemTotal-d.MemFree)/d.MemTotal)*100);return(d)}else{throw (\\"Parse Error\\")}}function windows_thermals(){var c=[];child=require(\\"child_process\\").execFile(process.env.windir+\\"\\\\\\\\System32\\\\\\\\wbem\\\\\\\\wmic.exe\\",[\\"wmic\\",\\"/namespace:\\\\\\\\\\\\\\\\root\\\\\\\\wmi\\",\\"PATH\\",\\"MSAcpi_ThermalZoneTemperature\\",\\"get\\",\\"CurrentTemperature\\"]);child.stdout.str=\\"\\";child.stdout.on(\\"data\\",function(d){this.str+=d.toString()});child.stderr.str=\\"\\";child.stderr.on(\\"data\\",function(d){this.str+=d.toString()});child.waitExit();if(child.stdout.str.trim!=\\"\\"){var b=child.stdout.str.trim().split(\\"\\\\r\\\\n\\");for(var a=1;a1){b.push(f[e].split(\\" \\")[3]);this.parent.kill()}}});a.stderr.str=\\"\\";a.stderr.on(\\"data\\",function(d){this.str+=d.toString()});a.stdin.write(\\"powermetrics -s smc\\\\n\\");a.waitExit(5000)}return(b)}switch(process.platform){case\\"linux\\":module.exports={cpuUtilization:linux_cpuUtilization,memUtilization:linux_memUtilization,thermals:linux_thermals};break;case\\"win32\\":module.exports={cpuUtilization:windows_cpuUtilization,memUtilization:windows_memUtilization,thermals:windows_thermals};break;case\\"darwin\\":module.exports={cpuUtilization:macos_cpuUtilization,memUtilization:macos_memUtilization,thermals:macos_thermals};break};"); addedModules.push("sysinfo"); } catch (e) { }\r\ntry { addModule("util-agentlog", "function parseLine(f){var n=f.match(/^\\\\[.*M\\\\]/);if(n==null){n=f.match(/\\\\[.+ => .+:[0-9]+\\\\]/);if(n!=null){var g=n[0].substring(1).match(/(?!.+ ).+(?=:)/);var j=n[0].match(/(?!:)[0-9]+(?=\\\\]$)/);var h=n[0].match(/(?!\\\\[).+(?= =>)/);if(g!=null){this.results.peek().f=g[0].trim()}if(j!=null){this.results.peek().l=j[0]}if(h!=null){this.results.peek().fn=h[0]}}else{n=f.match(/^[\\\\.\\\\/].+\\\\(\\\\) \\\\[0x[0-9a-fA-F]+\\\\]$/);if(n!=null){n=n[0].match(/(?!\\\\[)0x[0-9a-fA-F]+(?=\\\\]$)/);if(n!=null){if(this.results.peek().sx==null){this.results.peek().sx=[]}this.results.peek().sx.unshift(n[0])}}else{n=f.match(/^\\\\[.+_[0-9a-fA-F]{16}\\\\]$/);if(n!=null){n=n[0].match(/(?!_)[0-9a-fA-F]{16}(?=\\\\]$)/);this.results.peek().h=n[0]}}n=f.match(/(?!^=>)\\\\/+.+:[0-9]+$/);if(n!=null){if(this.results.peek().s==null){this.results.peek().s=[]}this.results.peek().s.unshift(n[0])}}return}n=n[0];var e=n.substring(1,n.length-1);var a=e.split(\\" \\");var m=a[1].split(\\":\\");if(a[2]==\\"PM\\"){m[0]=parseInt(m[0])+12;if(m[0]==24){m[0]=0}}var b=Date.parse(a[0]+\\"T\\"+m.join(\\":\\"));var l=f.substring(n.length).trim();var i=l.match(/^\\\\[[0-9a-fA-F]{16}\\\\]/);if(i!=null){i=i[0].substring(1,i[0].length-1);l=l.substring(i.length+2).trim()}else{i=l.match(/^\\\\[\\\\]/);if(i!=null){l=l.substring(2).trim();i=null}}var k={t:Math.floor(b/1000),m:l};if(i!=null){k.h=i}n=l.match(/^.+:[0-9]+ \\\\([0-9]+,[0-9]+\\\\)/);if(n!=null){k.m=k.m.substring(n[0].length).trim();k.f=n[0].match(/^.+(?=:[0-9]+)/)[0];k.l=n[0].match(/(?!:)[0-9]+(?= \\\\([0-9]+,[0-9]+\\\\)$)/)[0]}this.results.push(k)}function readLog_data(a){var c=a.toString();if(this.buffered!=null){c=this.buffered+c}c=c.split(\\"\\\\n\\");var b;for(b=0;b<(c.length-1);++b){parseLine.call(this,c[b])}if(c.length==1){parseLine.call(this,c[0]);this.buffered=null}else{this.buffered=c[c.length-1]}}function readLogEx(a){var b=[];try{var c=require(\\"fs\\").createReadStream(a);c.buffered=null;c.results=b;c.on(\\"data\\",readLog_data);c.resume();if(c.buffered!=null){readLog_data.call(c,c.buffered);c.buffered=null}c.removeAllListeners(\\"data\\");c=null}catch(d){}return(b)}function readLog(a,e){var d=readLogEx(e==null?(process.execPath.split(\\".exe\\").join(\\"\\")+\\".log\\"):e);var f=[];if(typeof(a)==\\"string\\"){try{var b=Date.parse(a);a=Math.floor(b/1000)}catch(g){}}if(typeof(a)==\\"number\\"){if(a<1000){f=d.slice(d.length-((a>d.length)?d.length:a))}else{var c;for(c=0;c\\"){g=\\"\\"}}if(j.startsWith(\\"Signal level=\\")){f=j.slice(13,j.length-4)}else{if(j.startsWith(\\"Quality=\\")){f=j.slice(8,10);var k=j.slice(11,13)}}}this.parent.parent.emit(\\"accessPoint\\",new AccessPoint(g,e,f))}})}}}}}module.exports=WiFiScanner;"); addedModules.push("wifi-scanner"); } catch (e) { }\r\n/*\r\nCopyright 2018-2021 Intel Corporation\r\n\r\nLicensed under the Apache License, Version 2.0 (the "License");\r\nyou may not use this file except in compliance with the License.\r\nYou may obtain a copy of the License at\r\n\r\n http://www.apache.org/licenses/LICENSE-2.0\r\n\r\nUnless required by applicable law or agreed to in writing, software\r\ndistributed under the License is distributed on an "AS IS" BASIS,\r\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\nSee the License for the specific language governing permissions and\r\nlimitations under the License.\r\n*/\r\n\r\nprocess.on(\'uncaughtException\', function (ex) {\r\n require(\'MeshAgent\').SendCommand({ action: \'msg\', type: \'console\', value: "uncaughtException1: " + ex });\r\n});\r\nif (process.platform == \'win32\' && require(\'user-sessions\').getDomain == null) {\r\n require(\'user-sessions\').getDomain = function getDomain(uid) {\r\n return (this.getSessionAttribute(uid, this.InfoClass.WTSDomainName));\r\n };\r\n}\r\n\r\n// NOTE: This seems to cause big problems, don\'t enable the debugger in the server\'s meshcore. \r\n//attachDebugger({ webport: 9999, wait: 1 }).then(function (prt) { console.log(\'Point Browser for Debug to port: \' + prt); });\r\n\r\n// Mesh Rights\r\nvar MNG_ERROR = 65;\r\nvar MESHRIGHT_EDITMESH = 1;\r\nvar MESHRIGHT_MANAGEUSERS = 2;\r\nvar MESHRIGHT_MANAGECOMPUTERS = 4;\r\nvar MESHRIGHT_REMOTECONTROL = 8;\r\nvar MESHRIGHT_AGENTCONSOLE = 16;\r\nvar MESHRIGHT_SERVERFILES = 32;\r\nvar MESHRIGHT_WAKEDEVICE = 64;\r\nvar MESHRIGHT_SETNOTES = 128;\r\nvar MESHRIGHT_REMOTEVIEW = 256;\r\nvar MESHRIGHT_NOTERMINAL = 512;\r\nvar MESHRIGHT_NOFILES = 1024;\r\nvar MESHRIGHT_NOAMT = 2048;\r\nvar MESHRIGHT_LIMITEDINPUT = 4096;\r\nvar MESHRIGHT_LIMITEVENTS = 8192;\r\nvar MESHRIGHT_CHATNOTIFY = 16384;\r\nvar MESHRIGHT_UNINSTALL = 32768;\r\nvar MESHRIGHT_NODESKTOP = 65536;\r\n\r\nif (require(\'MeshAgent\').ARCHID == null) {\r\n var id = null;\r\n switch (process.platform) {\r\n case \'win32\':\r\n id = require(\'_GenericMarshal\').PointerSize == 4 ? 3 : 4;\r\n break;\r\n case \'freebsd\':\r\n id = require(\'_GenericMarshal\').PointerSize == 4 ? 31 : 30;\r\n break;\r\n case \'darwin\':\r\n try {\r\n id = require(\'os\').arch() == \'x64\' ? 16 : 29;\r\n }\r\n catch (xx) {\r\n id = 16;\r\n }\r\n break; break;\r\n }\r\n if (id != null) { Object.defineProperty(require(\'MeshAgent\'), \'ARCHID\', { value: id }); }\r\n}\r\n\r\nvar obj = {};\r\nvar agentFileHttpRequests = {}; // Currently active agent HTTPS GET requests from the server.\r\nvar agentFileHttpPendingRequests = []; // Pending HTTPS GET requests from the server.\r\nvar debugConsole = (_MSH().debugConsole == 1);\r\n\r\nif (process.platform == \'win32\' && require(\'user-sessions\').isRoot()) {\r\n // Check the Agent Uninstall MetaData for correctness, as the installer may have written an incorrect value\r\n try {\r\n var writtenSize = 0, actualSize = Math.floor(require(\'fs\').statSync(process.execPath).size / 1024);\r\n try { writtenSize = require(\'win-registry\').QueryKey(require(\'win-registry\').HKEY.LocalMachine, \'Software\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\Uninstall\\\\MeshCentralAgent\', \'EstimatedSize\'); } catch (e) { }\r\n if (writtenSize != actualSize) { try { require(\'win-registry\').WriteKey(require(\'win-registry\').HKEY.LocalMachine, \'Software\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\Uninstall\\\\MeshCentralAgent\', \'EstimatedSize\', actualSize); } catch (e) { } }\r\n } catch (x) { }\r\n\r\n // Check to see if we are the Installed Mesh Agent Service, if we are, make sure we can run in Safe Mode\r\n var svcname = process.platform == \'win32\' ? \'Mesh Agent\' : \'meshagent\';\r\n try {\r\n svcname = require(\'MeshAgent\').serviceName;\r\n }\r\n catch (x) {\r\n }\r\n\r\n try {\r\n var meshCheck = false;\r\n try { meshCheck = require(\'service-manager\').manager.getService(svcname).isMe(); } catch (e) { }\r\n if (meshCheck && require(\'win-bcd\').isSafeModeService && !require(\'win-bcd\').isSafeModeService(svcname)) { require(\'win-bcd\').enableSafeModeService(svcname); }\r\n } catch (e) { }\r\n}\r\n\r\nif (process.platform == \'darwin\' && !process.versions) {\r\n // This is an older MacOS Agent, so we\'ll need to check the service definition so that Auto-Update will function correctly\r\n var child = require(\'child_process\').execFile(\'/bin/sh\', [\'sh\']);\r\n child.stdout.str = \'\';\r\n child.stdout.on(\'data\', function (chunk) { this.str += chunk.toString(); });\r\n child.stdin.write("cat /Library/LaunchDaemons/meshagent_osx64_LaunchDaemon.plist | tr \'\\n\' \'\\.\' | awk \'{split($0, a, \\"KeepAlive\\"); split(a[2], b, \\"<\\"); split(b[2], c, \\">\\"); ");\r\n child.stdin.write(" if(c[1]==\\"dict\\"){ split(a[2], d, \\"\\"); if(split(d[1], truval, \\"\\")>1) { split(truval[1], kn1, \\"\\"); split(kn1[2], kn2, \\"\\"); print kn2[1]; } }");\r\n child.stdin.write(" else { split(c[1], ka, \\"/\\"); if(ka[1]==\\"true\\") {print \\"ALWAYS\\";} } }\'\\nexit\\n");\r\n child.waitExit();\r\n if (child.stdout.str.trim() == \'Crashed\') {\r\n child = require(\'child_process\').execFile(\'/bin/sh\', [\'sh\']);\r\n child.stdout.str = \'\';\r\n child.stdout.on(\'data\', function (chunk) { this.str += chunk.toString(); });\r\n child.stdin.write("launchctl list | grep \'meshagent\' | awk \'{ if($3==\\"meshagent\\"){print $1;}}\'\\nexit\\n");\r\n child.waitExit();\r\n\r\n if (parseInt(child.stdout.str.trim()) == process.pid) {\r\n // The currently running MeshAgent is us, so we can continue with the update\r\n var plist = require(\'fs\').readFileSync(\'/Library/LaunchDaemons/meshagent_osx64_LaunchDaemon.plist\').toString();\r\n var tokens = plist.split(\'KeepAlive\');\r\n if (tokens[1].split(\'>\')[0].split(\'<\')[1] == \'dict\') {\r\n var tmp = tokens[1].split(\'\');\r\n tmp.shift();\r\n tokens[1] = \'\\n \' + tmp.join(\'\');\r\n tokens = tokens.join(\'KeepAlive\');\r\n\r\n require(\'fs\').writeFileSync(\'/Library/LaunchDaemons/meshagent_osx64_LaunchDaemon.plist\', tokens);\r\n\r\n var fix = \'\';\r\n fix += ("function macosRepair()\\n");\r\n fix += ("{\\n");\r\n fix += (" var child = require(\'child_process\').execFile(\'/bin/sh\', [\'sh\']);\\n");\r\n fix += (" child.stdout.str = \'\';\\n");\r\n fix += (" child.stdout.on(\'data\', function (chunk) { this.str += chunk.toString(); });\\n");\r\n fix += (" child.stderr.on(\'data\', function (chunk) { });\\n");\r\n fix += (" child.stdin.write(\'launchctl unload /Library/LaunchDaemons/meshagent_osx64_LaunchDaemon.plist\\\\n\');\\n");\r\n fix += (" child.stdin.write(\'launchctl load /Library/LaunchDaemons/meshagent_osx64_LaunchDaemon.plist\\\\n\');\\n");\r\n fix += (" child.stdin.write(\'rm /Library/LaunchDaemons/meshagentRepair.plist\\\\n\');\\n");\r\n fix += (" child.stdin.write(\'rm " + process.cwd() + "/macosRepair.js\\\\n\');\\n");\r\n fix += (" child.stdin.write(\'launchctl stop meshagentRepair\\\\nexit\\\\n\');\\n");\r\n fix += (" child.waitExit();\\n");\r\n fix += ("}\\n");\r\n fix += ("macosRepair();\\n");\r\n fix += ("process.exit();\\n");\r\n require(\'fs\').writeFileSync(process.cwd() + \'/macosRepair.js\', fix);\r\n\r\n var plist = \'\\n\';\r\n plist += \'\\n\';\r\n plist += \'\\n\';\r\n plist += \' \\n\';\r\n plist += \' Label\\n\';\r\n plist += (\' meshagentRepair\\n\');\r\n plist += \' ProgramArguments\\n\';\r\n plist += \' \\n\';\r\n plist += (\' \' + process.execPath + \'\\n\');\r\n plist += \' macosRepair.js\\n\';\r\n plist += \' \\n\';\r\n plist += \' WorkingDirectory\\n\';\r\n plist += (\' \' + process.cwd() + \'\\n\');\r\n plist += \' RunAtLoad\\n\';\r\n plist += \' \\n\';\r\n plist += \' \\n\';\r\n plist += \'\';\r\n require(\'fs\').writeFileSync(\'/Library/LaunchDaemons/meshagentRepair.plist\', plist);\r\n\r\n child = require(\'child_process\').execFile(\'/bin/sh\', [\'sh\']);\r\n child.stdout.str = \'\';\r\n child.stdout.on(\'data\', function (chunk) { this.str += chunk.toString(); });\r\n child.stdin.write("launchctl load /Library/LaunchDaemons/meshagentRepair.plist\\nexit\\n");\r\n child.waitExit();\r\n }\r\n }\r\n }\r\n}\r\n\r\n// Add an Intel AMT event to the log\r\nfunction addAmtEvent(msg) {\r\n if (obj.amtevents == null) { obj.amtevents = []; }\r\n var d = new Date();\r\n obj.amtevents.push(zeroPad(d.getHours(), 2) + \':\' + zeroPad(d.getMinutes(), 2) + \':\' + zeroPad(d.getSeconds(), 2) + \', \' + msg);\r\n if (obj.amtevents.length > 100) { obj.amtevents.splice(0, obj.amtevents.length - 100); }\r\n}\r\nfunction zeroPad(num, size) { var s = \'000000000\' + num; return s.substr(s.length - size); }\r\n\r\n\r\n// Create Secure IPC for Diagnostic Agent Communications\r\nobj.DAIPC = require(\'net\').createServer();\r\nif (process.platform != \'win32\') { try { require(\'fs\').unlinkSync(process.cwd() + \'/DAIPC\'); } catch (e) { } }\r\nobj.DAIPC.IPCPATH = process.platform == \'win32\' ? (\'\\\\\\\\.\\\\pipe\\\\\' + require(\'_agentNodeId\')() + \'-DAIPC\') : (process.cwd() + \'/DAIPC\');\r\ntry { obj.DAIPC.listen({ path: obj.DAIPC.IPCPATH, writableAll: true, maxConnections: 5 }); } catch (e) { }\r\nobj.DAIPC._daipc = [];\r\nobj.DAIPC.on(\'connection\', function (c) {\r\n c._send = function (j) {\r\n var data = JSON.stringify(j);\r\n var packet = Buffer.alloc(data.length + 4);\r\n packet.writeUInt32LE(data.length + 4, 0);\r\n Buffer.from(data).copy(packet, 4);\r\n this.write(packet);\r\n };\r\n this._daipc.push(c);\r\n c.parent = this;\r\n c.on(\'end\', function () { removeRegisteredApp(this); });\r\n c.on(\'data\', function (chunk) {\r\n if (chunk.length < 4) { this.unshift(chunk); return; }\r\n var len = chunk.readUInt32LE(0);\r\n if (len > 8192) { removeRegisteredApp(this); this.end(); return; }\r\n if (chunk.length < len) { this.unshift(chunk); return; }\r\n\r\n var data = chunk.slice(4, len);\r\n try { data = JSON.parse(data.toString()); } catch (e) { }\r\n if ((data == null) || (typeof data.cmd != \'string\')) return;\r\n\r\n try {\r\n switch (data.cmd) {\r\n case \'requesthelp\':\r\n if (this._registered == null) return;\r\n sendConsoleText(\'Request Help (\' + this._registered + \'): \' + data.value);\r\n var help = {};\r\n help[this._registered] = data.value;\r\n try { mesh.SendCommand({ action: \'sessions\', type: \'help\', value: help }); } catch (e) { }\r\n MeshServerLogEx(98, [this._registered, data.value], "Help Requested, user: " + this._registered + ", details: " + data.value, null);\r\n break;\r\n case \'cancelhelp\':\r\n if (this._registered == null) return;\r\n sendConsoleText(\'Cancel Help (\' + this._registered + \')\');\r\n try { mesh.SendCommand({ action: \'sessions\', type: \'help\', value: {} }); } catch (e) { }\r\n break;\r\n case \'register\':\r\n if (typeof data.value == \'string\') {\r\n this._registered = data.value;\r\n var apps = {};\r\n apps[data.value] = 1;\r\n try { mesh.SendCommand({ action: \'sessions\', type: \'app\', value: apps }); } catch (e) { }\r\n this._send({ cmd: \'serverstate\', value: meshServerConnectionState, url: require(\'MeshAgent\').ConnectedServer, amt: (amt != null) });\r\n }\r\n break;\r\n case \'query\':\r\n switch (data.value) {\r\n case \'connection\':\r\n data.result = require(\'MeshAgent\').ConnectedServer;\r\n this._send(data);\r\n break;\r\n case \'descriptors\':\r\n require(\'ChainViewer\').getSnapshot().then(function (f) {\r\n this.tag.payload.result = f;\r\n this.tag.ipc._send(this.tag.payload);\r\n }).parentPromise.tag = { ipc: this, payload: data };\r\n break;\r\n case \'timerinfo\':\r\n data.result = require(\'ChainViewer\').getTimerInfo();\r\n this._send(data);\r\n break;\r\n }\r\n break;\r\n case \'amtstate\':\r\n if (amt == null) return;\r\n var func = function amtStateFunc(state) { if (state != null) { amtStateFunc.pipe._send({ cmd: \'amtstate\', value: state }); } }\r\n func.pipe = this;\r\n amt.getMeiState(11, func);\r\n break;\r\n case \'sessions\':\r\n this._send({ cmd: \'sessions\', sessions: tunnelUserCount });\r\n break;\r\n case \'meshToolInfo\':\r\n try { mesh.SendCommand({ action: \'meshToolInfo\', name: data.name, hash: data.hash, cookie: data.cookie ? true : false, pipe: true }); } catch (e) { }\r\n break;\r\n case \'console\':\r\n if (debugConsole) {\r\n var args = splitArgs(data.value);\r\n processConsoleCommand(args[0].toLowerCase(), parseArgs(args), 0, \'pipe\');\r\n }\r\n break;\r\n }\r\n }\r\n catch (e) { removeRegisteredApp(this); this.end(); return; }\r\n });\r\n});\r\n\r\n// Send current sessions to registered apps\r\nfunction broadcastSessionsToRegisteredApps(x) {\r\n broadcastToRegisteredApps({ cmd: \'sessions\', sessions: tunnelUserCount });\r\n}\r\n\r\n// Send this object to all registered local applications\r\nfunction broadcastToRegisteredApps(x) {\r\n if ((obj.DAIPC == null) || (obj.DAIPC._daipc == null)) return;\r\n for (var i in obj.DAIPC._daipc) { if (obj.DAIPC._daipc[i]._registered != null) { obj.DAIPC._daipc[i]._send(x); } }\r\n}\r\n\r\n// Send this object to a specific registered local applications\r\nfunction sendToRegisteredApp(appid, x) {\r\n if ((obj.DAIPC == null) || (obj.DAIPC._daipc == null)) return;\r\n for (var i in obj.DAIPC._daipc) { if (obj.DAIPC._daipc[i]._registered == appid) { obj.DAIPC._daipc[i]._send(x); } }\r\n}\r\n\r\n// Send list of registered apps to the server\r\nfunction updateRegisteredAppsToServer() {\r\n if ((obj.DAIPC == null) || (obj.DAIPC._daipc == null)) return;\r\n var apps = {};\r\n for (var i in obj.DAIPC._daipc) { if (apps[obj.DAIPC._daipc[i]._registered] == null) { apps[obj.DAIPC._daipc[i]._registered] = 1; } else { apps[obj.DAIPC._daipc[i]._registered]++; } }\r\n try { mesh.SendCommand({ action: \'sessions\', type: \'app\', value: apps }); } catch (e) { }\r\n}\r\n\r\n// Remove a registered app\r\nfunction removeRegisteredApp(pipe) {\r\n for (var i = obj.DAIPC._daipc.length - 1; i >= 0; i--) { if (obj.DAIPC._daipc[i] === pipe) { obj.DAIPC._daipc.splice(i, 1); } }\r\n if (pipe._registered != null) updateRegisteredAppsToServer();\r\n}\r\n\r\nfunction diagnosticAgent_uninstall() {\r\n require(\'service-manager\').manager.uninstallService(\'meshagentDiagnostic\');\r\n require(\'task-scheduler\').delete(\'meshagentDiagnostic/periodicStart\');\r\n}\r\nfunction diagnosticAgent_installCheck(install) {\r\n try {\r\n var diag = require(\'service-manager\').manager.getService(\'meshagentDiagnostic\');\r\n return (diag);\r\n }\r\n catch (e) {\r\n }\r\n if (!install) { return (null); }\r\n\r\n var svc = null;\r\n try {\r\n require(\'service-manager\').manager.installService(\r\n {\r\n name: \'meshagentDiagnostic\',\r\n displayName: "Mesh Agent Diagnostic Service",\r\n description: "Mesh Agent Diagnostic Service",\r\n servicePath: process.execPath,\r\n parameters: [\'-recovery\']\r\n //files: [{ newName: \'diagnostic.js\', _buffer: Buffer.from(\'LyoNCkNvcHlyaWdodCAyMDE5IEludGVsIENvcnBvcmF0aW9uDQoNCkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQoNCiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCg0KVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQoqLw0KDQp2YXIgaG9zdCA9IHJlcXVpcmUoJ3NlcnZpY2UtaG9zdCcpLmNyZWF0ZSgnbWVzaGFnZW50RGlhZ25vc3RpYycpOw0KdmFyIFJlY292ZXJ5QWdlbnQgPSByZXF1aXJlKCdNZXNoQWdlbnQnKTsNCg0KaG9zdC5vbignc2VydmljZVN0YXJ0JywgZnVuY3Rpb24gKCkNCnsNCiAgICBjb25zb2xlLnNldERlc3RpbmF0aW9uKGNvbnNvbGUuRGVzdGluYXRpb25zLkxPR0ZJTEUpOw0KICAgIGhvc3Quc3RvcCA9IGZ1bmN0aW9uKCkNCiAgICB7DQogICAgICAgIHJlcXVpcmUoJ3NlcnZpY2UtbWFuYWdlcicpLm1hbmFnZXIuZ2V0U2VydmljZSgnbWVzaGFnZW50RGlhZ25vc3RpYycpLnN0b3AoKTsNCiAgICB9DQogICAgUmVjb3ZlcnlBZ2VudC5vbignQ29ubmVjdGVkJywgZnVuY3Rpb24gKHN0YXR1cykNCiAgICB7DQogICAgICAgIGlmIChzdGF0dXMgPT0gMCkNCiAgICAgICAgew0KICAgICAgICAgICAgY29uc29sZS5sb2coJ0RpYWdub3N0aWMgQWdlbnQ6IFNlcnZlciBjb25uZWN0aW9uIGxvc3QuLi4nKTsNCiAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgfQ0KICAgICAgICBjb25zb2xlLmxvZygnRGlhZ25vc3RpYyBBZ2VudDogQ29ubmVjdGlvbiBFc3RhYmxpc2hlZCB3aXRoIFNlcnZlcicpOw0KICAgICAgICBzdGFydCgpOw0KICAgIH0pOw0KfSk7DQpob3N0Lm9uKCdub3JtYWxTdGFydCcsIGZ1bmN0aW9uICgpDQp7DQogICAgaG9zdC5zdG9wID0gZnVuY3Rpb24gKCkNCiAgICB7DQogICAgICAgIHByb2Nlc3MuZXhpdCgpOw0KICAgIH0NCiAgICBjb25zb2xlLmxvZygnTm9uIFNlcnZpY2UgTW9kZScpOw0KICAgIFJlY292ZXJ5QWdlbnQub24oJ0Nvbm5lY3RlZCcsIGZ1bmN0aW9uIChzdGF0dXMpDQogICAgew0KICAgICAgICBpZiAoc3RhdHVzID09IDApDQogICAgICAgIHsNCiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdEaWFnbm9zdGljIEFnZW50OiBTZXJ2ZXIgY29ubmVjdGlvbiBsb3N0Li4uJyk7DQogICAgICAgICAgICByZXR1cm47DQogICAgICAgIH0NCiAgICAgICAgY29uc29sZS5sb2coJ0RpYWdub3N0aWMgQWdlbnQ6IENvbm5lY3Rpb24gRXN0YWJsaXNoZWQgd2l0aCBTZXJ2ZXInKTsNCiAgICAgICAgc3RhcnQoKTsNCiAgICB9KTsNCn0pOw0KaG9zdC5vbignc2VydmljZVN0b3AnLCBmdW5jdGlvbiAoKSB7IHByb2Nlc3MuZXhpdCgpOyB9KTsNCmhvc3QucnVuKCk7DQoNCg0KZnVuY3Rpb24gc3RhcnQoKQ0Kew0KDQp9Ow0K\', \'base64\') }]\r\n });\r\n svc = require(\'service-manager\').manager.getService(\'meshagentDiagnostic\');\r\n }\r\n catch (e) {\r\n return (null);\r\n }\r\n var proxyConfig = require(\'global-tunnel\').proxyConfig;\r\n var cert = require(\'MeshAgent\').GenerateAgentCertificate(\'CN=MeshNodeDiagnosticCertificate\');\r\n var nodeid = require(\'tls\').loadCertificate(cert.root).getKeyHash().toString(\'base64\');\r\n ddb = require(\'SimpleDataStore\').Create(svc.appWorkingDirectory().replace(\'\\\\\', \'/\') + \'/meshagentDiagnostic.db\');\r\n ddb.Put(\'disableUpdate\', \'1\');\r\n ddb.Put(\'MeshID\', Buffer.from(require(\'MeshAgent\').ServerInfo.MeshID, \'hex\'));\r\n ddb.Put(\'ServerID\', require(\'MeshAgent\').ServerInfo.ServerID);\r\n ddb.Put(\'MeshServer\', require(\'MeshAgent\').ServerInfo.ServerUri);\r\n if (cert.root.pfx) { ddb.Put(\'SelfNodeCert\', cert.root.pfx); }\r\n if (cert.tls) { ddb.Put(\'SelfNodeTlsCert\', cert.tls.pfx); }\r\n if (proxyConfig) {\r\n ddb.Put(\'WebProxy\', proxyConfig.host + \':\' + proxyConfig.port);\r\n }\r\n else {\r\n ddb.Put(\'ignoreProxyFile\', \'1\');\r\n }\r\n\r\n require(\'MeshAgent\').SendCommand({ action: \'diagnostic\', value: { command: \'register\', value: nodeid } });\r\n require(\'MeshAgent\').SendCommand({ action: \'msg\', type: \'console\', value: "Diagnostic Agent Registered [" + nodeid.length + "/" + nodeid + "]" });\r\n\r\n delete ddb;\r\n\r\n // Set a recurrent task, to run the Diagnostic Agent every 2 days\r\n require(\'task-scheduler\').create({ name: \'meshagentDiagnostic/periodicStart\', daily: 2, time: require(\'tls\').generateRandomInteger(\'0\', \'23\') + \':\' + require(\'tls\').generateRandomInteger(\'0\', \'59\').padStart(2, \'0\'), service: \'meshagentDiagnostic\' });\r\n //require(\'task-scheduler\').create({ name: \'meshagentDiagnostic/periodicStart\', daily: \'1\', time: \'17:16\', service: \'meshagentDiagnostic\' });\r\n\r\n return (svc);\r\n}\r\n\r\n// Monitor the file \'batterystate.txt\' in the agent\'s folder and sends battery update when this file is changed.\r\nif ((require(\'fs\').existsSync(process.cwd() + \'batterystate.txt\')) && (require(\'fs\').watch != null)) {\r\n // Setup manual battery monitoring\r\n require(\'MeshAgent\')._batteryFileWatcher = require(\'fs\').watch(process.cwd(), function () {\r\n if (require(\'MeshAgent\')._batteryFileTimer != null) return;\r\n require(\'MeshAgent\')._batteryFileTimer = setTimeout(function () {\r\n try {\r\n require(\'MeshAgent\')._batteryFileTimer = null;\r\n var data = null;\r\n try { data = require(\'fs\').readFileSync(process.cwd() + \'batterystate.txt\').toString(); } catch (e) { }\r\n if ((data != null) && (data.length < 10)) {\r\n data = data.split(\',\');\r\n if ((data.length == 2) && ((data[0] == \'ac\') || (data[0] == \'dc\'))) {\r\n var level = parseInt(data[1]);\r\n if ((level >= 0) && (level <= 100)) { require(\'MeshAgent\').SendCommand({ action: \'battery\', state: data[0], level: level }); }\r\n }\r\n }\r\n } catch (e) { }\r\n }, 1000);\r\n });\r\n}\r\nelse {\r\n // Setup normal battery monitoring\r\n if (require(\'identifiers\').isBatteryPowered && require(\'identifiers\').isBatteryPowered()) {\r\n require(\'MeshAgent\')._battLevelChanged = function _battLevelChanged(val) {\r\n _battLevelChanged.self._currentBatteryLevel = val;\r\n _battLevelChanged.self.SendCommand({ action: \'battery\', state: _battLevelChanged.self._currentPowerState, level: val });\r\n };\r\n require(\'MeshAgent\')._battLevelChanged.self = require(\'MeshAgent\');\r\n require(\'MeshAgent\')._powerChanged = function _powerChanged(val) {\r\n _powerChanged.self._currentPowerState = (val == \'AC\' ? \'ac\' : \'dc\');\r\n _powerChanged.self.SendCommand({ action: \'battery\', state: (val == \'AC\' ? \'ac\' : \'dc\'), level: _powerChanged.self._currentBatteryLevel });\r\n };\r\n require(\'MeshAgent\')._powerChanged.self = require(\'MeshAgent\');\r\n require(\'MeshAgent\').on(\'Connected\', function (status) {\r\n if (status == 0) {\r\n require(\'power-monitor\').removeListener(\'acdc\', this._powerChanged);\r\n require(\'power-monitor\').removeListener(\'batteryLevel\', this._battLevelChanged);\r\n } else {\r\n require(\'power-monitor\').on(\'acdc\', this._powerChanged);\r\n require(\'power-monitor\').on(\'batteryLevel\', this._battLevelChanged);\r\n }\r\n });\r\n }\r\n}\r\n\r\n\r\n// MeshAgent JavaScript Core Module. This code is sent to and running on the mesh agent.\r\nvar meshCoreObj = { action: \'coreinfo\', value: (require(\'MeshAgent\').coreHash ? (\'MeshCore CRC-\' + crc32c(require(\'MeshAgent\').coreHash)) : (\'MeshCore v6\')), caps: 14, root: require(\'user-sessions\').isRoot() }; // Capability bitmask: 1 = Desktop, 2 = Terminal, 4 = Files, 8 = Console, 16 = JavaScript, 32 = Temporary Agent, 64 = Recovery Agent\r\n\r\n// Get the operating system description string\r\ntry { require(\'os\').name().then(function (v) { meshCoreObj.osdesc = v; meshCoreObjChanged(); }); } catch (e) { }\r\n\r\n\r\n// Setup logged in user monitoring (THIS IS BROKEN IN WIN7)\r\ntry {\r\n var userSession = require(\'user-sessions\');\r\n userSession.on(\'changed\', function onUserSessionChanged() {\r\n userSession.enumerateUsers().then(function (users) {\r\n if (process.platform == \'linux\') {\r\n if (userSession._startTime == null) {\r\n userSession._startTime = Date.now();\r\n userSession._count = users.length;\r\n }\r\n else if (Date.now() - userSession._startTime < 10000 && users.length == userSession._count) {\r\n userSession.removeAllListeners(\'changed\');\r\n return;\r\n }\r\n }\r\n\r\n var u = [], a = users.Active;\r\n for (var i = 0; i < a.length; i++) {\r\n var un = a[i].Domain ? (a[i].Domain + \'\\\\\' + a[i].Username) : (a[i].Username);\r\n if (u.indexOf(un) == -1) { u.push(un); } // Only push users in the list once.\r\n }\r\n meshCoreObj.users = u;\r\n meshCoreObjChanged();\r\n });\r\n });\r\n userSession.emit(\'changed\');\r\n //userSession.on(\'locked\', function (user) { sendConsoleText(\'[\' + (user.Domain ? user.Domain + \'\\\\\' : \'\') + user.Username + \'] has LOCKED the desktop\'); });\r\n //userSession.on(\'unlocked\', function (user) { sendConsoleText(\'[\' + (user.Domain ? user.Domain + \'\\\\\' : \'\') + user.Username + \'] has UNLOCKED the desktop\'); });\r\n} catch (e) { }\r\n\r\nvar meshServerConnectionState = 0;\r\nvar tunnels = {};\r\nvar lastNetworkInfo = null;\r\nvar lastPublicLocationInfo = null;\r\nvar selfInfoUpdateTimer = null;\r\nvar http = require(\'http\');\r\nvar net = require(\'net\');\r\nvar fs = require(\'fs\');\r\nvar rtc = require(\'ILibWebRTC\');\r\nvar amt = null;\r\nvar processManager = require(\'process-manager\');\r\nvar wifiScannerLib = null;\r\nvar wifiScanner = null;\r\nvar networkMonitor = null;\r\nvar nextTunnelIndex = 1;\r\nvar apftunnel = null;\r\nvar tunnelUserCount = { terminal: {}, files: {}, tcp: {}, udp: {}, msg: {} }; // List of userid->count sessions for terminal, files and TCP/UDP routing\r\n\r\n// Add to the server event log\r\nfunction MeshServerLog(msg, state) {\r\n if (typeof msg == \'string\') { msg = { action: \'log\', msg: msg }; } else { msg.action = \'log\'; }\r\n if (state) {\r\n if (state.userid) { msg.userid = state.userid; }\r\n if (state.username) { msg.username = state.username; }\r\n if (state.sessionid) { msg.sessionid = state.sessionid; }\r\n if (state.remoteaddr) { msg.remoteaddr = state.remoteaddr; }\r\n }\r\n mesh.SendCommand(msg);\r\n}\r\n\r\n// Add to the server event log, use internationalized events\r\nfunction MeshServerLogEx(id, args, msg, state) {\r\n var msg = { action: \'log\', msgid: id, msgArgs: args, msg: msg };\r\n if (state) {\r\n if (state.userid) { msg.userid = state.userid; }\r\n if (state.username) { msg.username = state.username; }\r\n if (state.sessionid) { msg.sessionid = state.sessionid; }\r\n if (state.remoteaddr) { msg.remoteaddr = state.remoteaddr; }\r\n }\r\n mesh.SendCommand(msg);\r\n}\r\n\r\n// Import libraries\r\ndb = require(\'SimpleDataStore\').Shared();\r\nsha = require(\'SHA256Stream\');\r\nmesh = require(\'MeshAgent\');\r\nchildProcess = require(\'child_process\');\r\n\r\nif (mesh.hasKVM == 1) { // if the agent is compiled with KVM support\r\n // Check if this computer supports a desktop\r\n try {\r\n if ((process.platform == \'win32\') || (process.platform == \'darwin\') || (require(\'monitor-info\').kvm_x11_support)) {\r\n meshCoreObj.caps |= 1; meshCoreObjChanged();\r\n } else if (process.platform == \'linux\' || process.platform == \'freebsd\') {\r\n require(\'monitor-info\').on(\'kvmSupportDetected\', function (value) { meshCoreObj.caps |= 1; meshCoreObjChanged(); });\r\n }\r\n } catch (e) { }\r\n}\r\nmesh.DAIPC = obj.DAIPC;\r\n\r\n/*\r\n// Try to load up the network monitor\r\ntry {\r\n networkMonitor = require(\'NetworkMonitor\');\r\n networkMonitor.on(\'change\', function () { sendNetworkUpdateNagle(); });\r\n networkMonitor.on(\'add\', function (addr) { sendNetworkUpdateNagle(); });\r\n networkMonitor.on(\'remove\', function (addr) { sendNetworkUpdateNagle(); });\r\n} catch (e) { networkMonitor = null; }\r\n*/\r\n\r\n// Fetch the SMBios Tables\r\nvar SMBiosTables = null;\r\nvar SMBiosTablesRaw = null;\r\ntry {\r\n var SMBiosModule = null;\r\n try { SMBiosModule = require(\'smbios\'); } catch (e) { }\r\n if (SMBiosModule != null) {\r\n SMBiosModule.get(function (data) {\r\n if (data != null) {\r\n SMBiosTablesRaw = data;\r\n SMBiosTables = require(\'smbios\').parse(data)\r\n if (mesh.isControlChannelConnected) { mesh.SendCommand({ action: \'smbios\', value: SMBiosTablesRaw }); }\r\n\r\n // If SMBios tables say that Intel AMT is present, try to connect MEI\r\n if (SMBiosTables.amtInfo && (SMBiosTables.amtInfo.AMT == true)) {\r\n var amtmodule = require(\'amt-manage\');\r\n amt = new amtmodule(mesh, db, false);\r\n amt.on(\'portBinding_LMS\', function (map) { mesh.SendCommand({ action: \'lmsinfo\', value: { ports: map.keys() } }); });\r\n amt.on(\'stateChange_LMS\', function (v) { if (!meshCoreObj.intelamt) { meshCoreObj.intelamt = {}; } meshCoreObj.intelamt.microlms = v; meshCoreObjChanged(); }); // 0 = Disabled, 1 = Connecting, 2 = Connected\r\n amt.onStateChange = function (state) { if (state == 2) { sendPeriodicServerUpdate(1); } } // MEI State\r\n amt.reset();\r\n }\r\n }\r\n });\r\n }\r\n} catch (e) { sendConsoleText("ex1: " + e); }\r\n\r\n// Try to load up the WIFI scanner\r\ntry {\r\n var wifiScannerLib = require(\'wifi-scanner\');\r\n wifiScanner = new wifiScannerLib();\r\n wifiScanner.on(\'accessPoint\', function (data) { sendConsoleText("wifiScanner: " + data); });\r\n} catch (e) { wifiScannerLib = null; wifiScanner = null; }\r\n\r\n// Get our location (lat/long) using our public IP address\r\nvar getIpLocationDataExInProgress = false;\r\nvar getIpLocationDataExCounts = [0, 0];\r\nfunction getIpLocationDataEx(func) {\r\n if (getIpLocationDataExInProgress == true) { return false; }\r\n try {\r\n getIpLocationDataExInProgress = true;\r\n getIpLocationDataExCounts[0]++;\r\n var options = http.parseUri("http://ipinfo.io/json");\r\n options.method = \'GET\';\r\n http.request(options, function (resp) {\r\n if (resp.statusCode == 200) {\r\n var geoData = \'\';\r\n resp.data = function (geoipdata) { geoData += geoipdata; };\r\n resp.end = function () {\r\n var location = null;\r\n try {\r\n if (typeof geoData == \'string\') {\r\n var result = JSON.parse(geoData);\r\n if (result.ip && result.loc) { location = result; }\r\n }\r\n } catch (e) { }\r\n if (func) { getIpLocationDataExCounts[1]++; func(location); }\r\n }\r\n } else\r\n { func(null); }\r\n getIpLocationDataExInProgress = false;\r\n }).end();\r\n return true;\r\n }\r\n catch (e) { return false; }\r\n}\r\n\r\n// Remove all Gateway MAC addresses for interface list. This is useful because the gateway MAC is not always populated reliably.\r\nfunction clearGatewayMac(str) {\r\n if (typeof str != \'string\') return null;\r\n var x = JSON.parse(str);\r\n for (var i in x.netif) { try { if (x.netif[i].gatewaymac) { delete x.netif[i].gatewaymac } } catch (ex) { } }\r\n return JSON.stringify(x);\r\n}\r\n\r\nfunction getIpLocationData(func) {\r\n // Get the location information for the cache if possible\r\n var publicLocationInfo = db.Get(\'publicLocationInfo\');\r\n if (publicLocationInfo != null) { publicLocationInfo = JSON.parse(publicLocationInfo); }\r\n if (publicLocationInfo == null) {\r\n // Nothing in the cache, fetch the data\r\n getIpLocationDataEx(function (locationData) {\r\n if (locationData != null) {\r\n publicLocationInfo = {};\r\n publicLocationInfo.netInfoStr = lastNetworkInfo;\r\n publicLocationInfo.locationData = locationData;\r\n var x = db.Put(\'publicLocationInfo\', JSON.stringify(publicLocationInfo)); // Save to database\r\n if (func) func(locationData); // Report the new location\r\n }\r\n else {\r\n if (func) func(null); // Report no location\r\n }\r\n });\r\n }\r\n else {\r\n // Check the cache\r\n if (clearGatewayMac(publicLocationInfo.netInfoStr) == clearGatewayMac(lastNetworkInfo)) {\r\n // Cache match\r\n if (func) func(publicLocationInfo.locationData);\r\n }\r\n else {\r\n // Cache mismatch\r\n getIpLocationDataEx(function (locationData) {\r\n if (locationData != null) {\r\n publicLocationInfo = {};\r\n publicLocationInfo.netInfoStr = lastNetworkInfo;\r\n publicLocationInfo.locationData = locationData;\r\n var x = db.Put(\'publicLocationInfo\', JSON.stringify(publicLocationInfo)); // Save to database\r\n if (func) func(locationData); // Report the new location\r\n }\r\n else {\r\n if (func) func(publicLocationInfo.locationData); // Can\'t get new location, report the old location\r\n }\r\n });\r\n }\r\n }\r\n}\r\n\r\n// Polyfill String.endsWith\r\nif (!String.prototype.endsWith) {\r\n String.prototype.endsWith = function (searchString, position) {\r\n var subjectString = this.toString();\r\n if (typeof position !== \'number\' || !isFinite(position) || Math.floor(position) !== position || position > subjectString.length) { position = subjectString.length; }\r\n position -= searchString.length;\r\n var lastIndex = subjectString.lastIndexOf(searchString, position);\r\n return lastIndex !== -1 && lastIndex === position;\r\n };\r\n}\r\n\r\n// Polyfill path.join\r\nobj.path =\r\n {\r\n join: function () {\r\n var x = [];\r\n for (var i in arguments) {\r\n var w = arguments[i];\r\n if (w != null) {\r\n while (w.endsWith(\'/\') || w.endsWith(\'\\\\\')) { w = w.substring(0, w.length - 1); }\r\n if (i != 0) {\r\n while (w.startsWith(\'/\') || w.startsWith(\'\\\\\')) { w = w.substring(1); }\r\n }\r\n x.push(w);\r\n }\r\n }\r\n if (x.length == 0) return \'/\';\r\n return x.join(\'/\');\r\n }\r\n };\r\n\r\n// Replace a string with a number if the string is an exact number\r\nfunction toNumberIfNumber(x) { if ((typeof x == \'string\') && (+parseInt(x) === x)) { x = parseInt(x); } return x; }\r\n\r\n// Convert decimal to hex\r\nfunction char2hex(i) { return (i + 0x100).toString(16).substr(-2).toUpperCase(); }\r\n\r\n// Convert a raw string to a hex string\r\nfunction rstr2hex(input) { var r = \'\', i; for (i = 0; i < input.length; i++) { r += char2hex(input.charCodeAt(i)); } return r; }\r\n\r\n// Convert a buffer into a string\r\nfunction buf2rstr(buf) { var r = \'\'; for (var i = 0; i < buf.length; i++) { r += String.fromCharCode(buf[i]); } return r; }\r\n\r\n// Convert a hex string to a raw string // TODO: Do this using Buffer(), will be MUCH faster\r\nfunction hex2rstr(d) {\r\n if (typeof d != "string" || d.length == 0) return \'\';\r\n var r = \'\', m = (\'\' + d).match(/../g), t;\r\n while (t = m.shift()) r += String.fromCharCode(\'0x\' + t);\r\n return r\r\n}\r\n\r\n// Convert an object to string with all functions\r\nfunction objToString(x, p, pad, ret) {\r\n if (ret == undefined) ret = \'\';\r\n if (p == undefined) p = 0;\r\n if (x == null) { return \'[null]\'; }\r\n if (p > 8) { return \'[...]\'; }\r\n if (x == undefined) { return \'[undefined]\'; }\r\n if (typeof x == \'string\') { if (p == 0) return x; return \'"\' + x + \'"\'; }\r\n if (typeof x == \'buffer\') { return \'[buffer]\'; }\r\n if (typeof x != \'object\') { return x; }\r\n var r = \'{\' + (ret ? \'\\r\\n\' : \' \');\r\n for (var i in x) { if (i != \'_ObjectID\') { r += (addPad(p + 2, pad) + i + \': \' + objToString(x[i], p + 2, pad, ret) + (ret ? \'\\r\\n\' : \' \')); } }\r\n return r + addPad(p, pad) + \'}\';\r\n}\r\n\r\n// Return p number of spaces \r\nfunction addPad(p, ret) { var r = \'\'; for (var i = 0; i < p; i++) { r += ret; } return r; }\r\n\r\n// Split a string taking into account the quoats. Used for command line parsing\r\nfunction splitArgs(str) {\r\n var myArray = [], myRegexp = /[^\\s"]+|"([^"]*)"/gi;\r\n do { var match = myRegexp.exec(str); if (match != null) { myArray.push(match[1] ? match[1] : match[0]); } } while (match != null);\r\n return myArray;\r\n}\r\n\r\n// Parse arguments string array into an object\r\nfunction parseArgs(argv) {\r\n var results = { \'_\': [] }, current = null;\r\n for (var i = 1, len = argv.length; i < len; i++) {\r\n var x = argv[i];\r\n if (x.length > 2 && x[0] == \'-\' && x[1] == \'-\') {\r\n if (current != null) { results[current] = true; }\r\n current = x.substring(2);\r\n } else {\r\n if (current != null) { results[current] = toNumberIfNumber(x); current = null; } else { results[\'_\'].push(toNumberIfNumber(x)); }\r\n }\r\n }\r\n if (current != null) { results[current] = true; }\r\n return results;\r\n}\r\n\r\n// Get server target url with a custom path\r\nfunction getServerTargetUrl(path) {\r\n var x = mesh.ServerUrl;\r\n //sendConsoleText("mesh.ServerUrl: " + mesh.ServerUrl);\r\n if (x == null) { return null; }\r\n if (path == null) { path = \'\'; }\r\n x = http.parseUri(x);\r\n if (x == null) return null;\r\n return x.protocol + \'//\' + x.host + \':\' + x.port + \'/\' + path;\r\n}\r\n\r\n// Get server url. If the url starts with "*/..." change it, it not use the url as is.\r\nfunction getServerTargetUrlEx(url) {\r\n if (url.substring(0, 2) == \'*/\') { return getServerTargetUrl(url.substring(2)); }\r\n return url;\r\n}\r\n\r\nfunction sendWakeOnLanEx_interval() {\r\n var t = require(\'MeshAgent\').wakesockets;\r\n if (t.list.length == 0) {\r\n clearInterval(t);\r\n delete require(\'MeshAgent\').wakesockets;\r\n return;\r\n }\r\n\r\n var mac = t.list.shift().split(\':\').join(\'\')\r\n var magic = \'FFFFFFFFFFFF\';\r\n for (var x = 1; x <= 16; ++x) { magic += mac; }\r\n var magicbin = Buffer.from(magic, \'hex\');\r\n\r\n for (var i in t.sockets) {\r\n t.sockets[i].send(magicbin, 7, \'255.255.255.255\');\r\n //sendConsoleText(\'Sending wake packet on \' + JSON.stringify(t.sockets[i].address()));\r\n }\r\n}\r\nfunction sendWakeOnLanEx(hexMacList) {\r\n var ret = 0;\r\n\r\n if (require(\'MeshAgent\').wakesockets == null) {\r\n // Create a new interval timer\r\n require(\'MeshAgent\').wakesockets = setInterval(sendWakeOnLanEx_interval, 10);\r\n require(\'MeshAgent\').wakesockets.sockets = [];\r\n require(\'MeshAgent\').wakesockets.list = hexMacList;\r\n\r\n var interfaces = require(\'os\').networkInterfaces();\r\n for (var adapter in interfaces) {\r\n if (interfaces.hasOwnProperty(adapter)) {\r\n for (var i = 0; i < interfaces[adapter].length; ++i) {\r\n var addr = interfaces[adapter][i];\r\n if ((addr.family == \'IPv4\') && (addr.mac != \'00:00:00:00:00:00\')) {\r\n try {\r\n var socket = require(\'dgram\').createSocket({ type: \'udp4\' });\r\n socket.bind({ address: addr.address });\r\n socket.setBroadcast(true);\r\n socket.setMulticastInterface(addr.address);\r\n socket.setMulticastTTL(1);\r\n socket.descriptorMetadata = \'WoL (\' + addr.address + \')\';\r\n require(\'MeshAgent\').wakesockets.sockets.push(socket);\r\n ++ret;\r\n }\r\n catch (e) { }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n else {\r\n // Append to an existing interval timer\r\n for (var i in hexMacList) {\r\n require(\'MeshAgent\').wakesockets.list.push(hexMacList[i]);\r\n }\r\n ret = require(\'MeshAgent\').wakesockets.sockets.length;\r\n }\r\n\r\n return (ret);\r\n}\r\n\r\n// Handle a mesh agent command\r\nfunction handleServerCommand(data) {\r\n if (typeof data == \'object\') {\r\n // If this is a console command, parse it and call the console handler\r\n switch (data.action) {\r\n case \'agentupdate\':\r\n agentUpdate_Start(data.url, { hash: data.hash, tlshash: data.servertlshash, sessionid: data.sessionid });\r\n break;\r\n case \'msg\': {\r\n switch (data.type) {\r\n case \'console\': { // Process a console command\r\n if (data.value && data.sessionid) {\r\n MeshServerLogEx(17, [data.value], "Processing console command: " + data.value, data);\r\n var args = splitArgs(data.value);\r\n processConsoleCommand(args[0].toLowerCase(), parseArgs(args), data.rights, data.sessionid);\r\n }\r\n break;\r\n }\r\n case \'tunnel\': {\r\n if (data.value != null) { // Process a new tunnel connection request\r\n // Create a new tunnel object\r\n var xurl = getServerTargetUrlEx(data.value);\r\n if (xurl != null) {\r\n xurl = xurl.split(\'$\').join(\'%24\').split(\'@\').join(\'%40\'); // Escape the $ and @ characters\r\n var woptions = http.parseUri(xurl);\r\n woptions.perMessageDeflate = false;\r\n if (typeof data.perMessageDeflate == \'boolean\') { woptions.perMessageDeflate = data.perMessageDeflate; }\r\n\r\n // Perform manual server TLS certificate checking based on the certificate hash given by the server.\r\n woptions.rejectUnauthorized = 0;\r\n woptions.checkServerIdentity = function checkServerIdentity(certs) {\r\n /*\r\n try { sendConsoleText("certs[0].digest: " + certs[0].digest); } catch (ex) { sendConsoleText(ex); }\r\n try { sendConsoleText("certs[0].fingerprint: " + certs[0].fingerprint); } catch (ex) { sendConsoleText(ex); }\r\n try { sendConsoleText("control-digest: " + require(\'MeshAgent\').ServerInfo.ControlChannelCertificate.digest); } catch (ex) { sendConsoleText(ex); }\r\n try { sendConsoleText("control-fingerprint: " + require(\'MeshAgent\').ServerInfo.ControlChannelCertificate.fingerprint); } catch (ex) { sendConsoleText(ex); }\r\n */\r\n\r\n // If the tunnel certificate matches the control channel certificate, accept the connection\r\n try { if (require(\'MeshAgent\').ServerInfo.ControlChannelCertificate.digest == certs[0].digest) return; } catch (ex) { }\r\n try { if (require(\'MeshAgent\').ServerInfo.ControlChannelCertificate.fingerprint == certs[0].fingerprint) return; } catch (ex) { }\r\n // Check that the certificate is the one expected by the server, fail if not.\r\n if ((checkServerIdentity.servertlshash != null) && (checkServerIdentity.servertlshash.toLowerCase() != certs[0].digest.split(\':\').join(\'\').toLowerCase())) { throw new Error(\'BadCert\') }\r\n }\r\n woptions.checkServerIdentity.servertlshash = data.servertlshash;\r\n\r\n //sendConsoleText(JSON.stringify(woptions));\r\n //sendConsoleText(\'TUNNEL: \' + JSON.stringify(data));\r\n var tunnel = http.request(woptions);\r\n tunnel.upgrade = onTunnelUpgrade;\r\n tunnel.on(\'error\', function (e) { sendConsoleText("ERROR: Unable to connect relay tunnel to: " + this.url + ", " + JSON.stringify(e)); });\r\n tunnel.sessionid = data.sessionid;\r\n tunnel.rights = data.rights;\r\n tunnel.consent = data.consent;\r\n tunnel.privacybartext = data.privacybartext ? data.privacybartext : "Sharing desktop with: {0}";\r\n tunnel.username = data.username + (data.guestname ? (\' - \' + data.guestname) : \'\');\r\n tunnel.realname = (data.realname ? data.realname : data.username) + (data.guestname ? (\' - \' + data.guestname) : \'\');\r\n tunnel.userid = data.userid;\r\n tunnel.remoteaddr = data.remoteaddr;\r\n tunnel.state = 0;\r\n tunnel.url = xurl;\r\n tunnel.protocol = 0;\r\n tunnel.soptions = data.soptions;\r\n tunnel.tcpaddr = data.tcpaddr;\r\n tunnel.tcpport = data.tcpport;\r\n tunnel.udpaddr = data.udpaddr;\r\n tunnel.udpport = data.udpport;\r\n tunnel.end();\r\n // Put the tunnel in the tunnels list\r\n var index = nextTunnelIndex++;\r\n tunnel.index = index;\r\n tunnels[index] = tunnel;\r\n\r\n //sendConsoleText(\'New tunnel connection #\' + index + \': \' + tunnel.url + \', rights: \' + tunnel.rights, data.sessionid);\r\n }\r\n }\r\n break;\r\n }\r\n case \'messagebox\': {\r\n // Display a message box\r\n if (data.title && data.msg) {\r\n MeshServerLogEx(18, [data.title, data.msg], "Displaying message box, title=" + data.title + ", message=" + data.msg, data);\r\n try { require(\'message-box\').create(data.title, data.msg, 120).then(function () { }).catch(function () { }); } catch (e) { }\r\n }\r\n break;\r\n }\r\n case \'ps\': {\r\n // Return the list of running processes\r\n if (data.sessionid) {\r\n processManager.getProcesses(function (plist) {\r\n mesh.SendCommand({ action: \'msg\', type: \'ps\', value: JSON.stringify(plist), sessionid: data.sessionid });\r\n });\r\n }\r\n break;\r\n }\r\n case \'pskill\': {\r\n // Kill a process\r\n if (data.value) {\r\n MeshServerLogEx(19, [data.value], "Killing process " + data.value, data);\r\n try { process.kill(data.value); } catch (e) { sendConsoleText("pskill: " + JSON.stringify(e)); }\r\n }\r\n break;\r\n }\r\n case \'services\': {\r\n // Return the list of installed services\r\n var services = null;\r\n try { services = require(\'service-manager\').manager.enumerateService(); } catch (e) { }\r\n if (services != null) { mesh.SendCommand({ action: \'msg\', type: \'services\', value: JSON.stringify(services), sessionid: data.sessionid }); }\r\n break;\r\n }\r\n case \'serviceStop\': {\r\n // Stop a service\r\n try {\r\n var service = require(\'service-manager\').manager.getService(data.serviceName);\r\n if (service != null) { service.stop(); }\r\n } catch (e) { }\r\n break;\r\n }\r\n case \'serviceStart\': {\r\n // Start a service\r\n try {\r\n var service = require(\'service-manager\').manager.getService(data.serviceName);\r\n if (service != null) { service.start(); }\r\n } catch (e) { }\r\n break;\r\n }\r\n case \'serviceRestart\': {\r\n // Restart a service\r\n try {\r\n var service = require(\'service-manager\').manager.getService(data.serviceName);\r\n if (service != null) { service.restart(); }\r\n } catch (e) { }\r\n break;\r\n }\r\n case \'deskBackground\':\r\n {\r\n // Toggle desktop background\r\n try {\r\n if (process.platform == \'win32\') {\r\n var stype = require(\'user-sessions\').getProcessOwnerName(process.pid).tsid == 0 ? 1 : 0;\r\n var sid = undefined;\r\n if (stype == 1) {\r\n if (require(\'MeshAgent\')._tsid != null) {\r\n stype = 5;\r\n sid = require(\'MeshAgent\')._tsid;\r\n }\r\n }\r\n var id = require(\'user-sessions\').getProcessOwnerName(process.pid).tsid == 0 ? 1 : 0;\r\n var child = require(\'child_process\').execFile(process.execPath, [process.execPath.split(\'\\\\\').pop(), \'-b64exec\', \'dmFyIFNQSV9HRVRERVNLV0FMTFBBUEVSID0gMHgwMDczOwp2YXIgU1BJX1NFVERFU0tXQUxMUEFQRVIgPSAweDAwMTQ7CnZhciBHTSA9IHJlcXVpcmUoJ19HZW5lcmljTWFyc2hhbCcpOwp2YXIgdXNlcjMyID0gR00uQ3JlYXRlTmF0aXZlUHJveHkoJ3VzZXIzMi5kbGwnKTsKdXNlcjMyLkNyZWF0ZU1ldGhvZCgnU3lzdGVtUGFyYW1ldGVyc0luZm9BJyk7CgppZiAocHJvY2Vzcy5hcmd2Lmxlbmd0aCA9PSAzKQp7CiAgICB2YXIgdiA9IEdNLkNyZWF0ZVZhcmlhYmxlKDEwMjQpOwogICAgdXNlcjMyLlN5c3RlbVBhcmFtZXRlcnNJbmZvQShTUElfR0VUREVTS1dBTExQQVBFUiwgdi5fc2l6ZSwgdiwgMCk7CiAgICBjb25zb2xlLmxvZyh2LlN0cmluZyk7CiAgICBwcm9jZXNzLmV4aXQoKTsKfQplbHNlCnsKICAgIHZhciBuYiA9IEdNLkNyZWF0ZVZhcmlhYmxlKHByb2Nlc3MuYXJndlszXSk7CiAgICB1c2VyMzIuU3lzdGVtUGFyYW1ldGVyc0luZm9BKFNQSV9TRVRERVNLV0FMTFBBUEVSLCBuYi5fc2l6ZSwgbmIsIDApOwogICAgcHJvY2Vzcy5leGl0KCk7Cn0=\'], { type: stype, uid: sid });\r\n child.stdout.str = \'\'; child.stdout.on(\'data\', function (c) { this.str += c.toString(); });\r\n child.stderr.on(\'data\', function () { });\r\n child.waitExit();\r\n var current = child.stdout.str.trim();\r\n if (current != \'\') { require(\'MeshAgent\')._wallpaper = current; }\r\n child = require(\'child_process\').execFile(process.execPath, [process.execPath.split(\'\\\\\').pop(), \'-b64exec\', \'dmFyIFNQSV9HRVRERVNLV0FMTFBBUEVSID0gMHgwMDczOwp2YXIgU1BJX1NFVERFU0tXQUxMUEFQRVIgPSAweDAwMTQ7CnZhciBHTSA9IHJlcXVpcmUoJ19HZW5lcmljTWFyc2hhbCcpOwp2YXIgdXNlcjMyID0gR00uQ3JlYXRlTmF0aXZlUHJveHkoJ3VzZXIzMi5kbGwnKTsKdXNlcjMyLkNyZWF0ZU1ldGhvZCgnU3lzdGVtUGFyYW1ldGVyc0luZm9BJyk7CgppZiAocHJvY2Vzcy5hcmd2Lmxlbmd0aCA9PSAzKQp7CiAgICB2YXIgdiA9IEdNLkNyZWF0ZVZhcmlhYmxlKDEwMjQpOwogICAgdXNlcjMyLlN5c3RlbVBhcmFtZXRlcnNJbmZvQShTUElfR0VUREVTS1dBTExQQVBFUiwgdi5fc2l6ZSwgdiwgMCk7CiAgICBjb25zb2xlLmxvZyh2LlN0cmluZyk7CiAgICBwcm9jZXNzLmV4aXQoKTsKfQplbHNlCnsKICAgIHZhciBuYiA9IEdNLkNyZWF0ZVZhcmlhYmxlKHByb2Nlc3MuYXJndlszXSk7CiAgICB1c2VyMzIuU3lzdGVtUGFyYW1ldGVyc0luZm9BKFNQSV9TRVRERVNLV0FMTFBBUEVSLCBuYi5fc2l6ZSwgbmIsIDApOwogICAgcHJvY2Vzcy5leGl0KCk7Cn0=\', current != \'\' ? \'""\' : require(\'MeshAgent\')._wallpaper], { type: stype, uid: sid });\r\n child.stdout.str = \'\'; child.stdout.on(\'data\', function (c) { this.str += c.toString(); });\r\n child.stderr.on(\'data\', function () { });\r\n child.waitExit();\r\n } else {\r\n var id = require(\'user-sessions\').consoleUid();\r\n var current = require(\'linux-gnome-helpers\').getDesktopWallpaper(id);\r\n if (current != \'/dev/null\') { require(\'MeshAgent\')._wallpaper = current; }\r\n require(\'linux-gnome-helpers\').setDesktopWallpaper(id, current != \'/dev/null\' ? undefined : require(\'MeshAgent\')._wallpaper);\r\n }\r\n } catch (e) {\r\n sendConsoleText(e);\r\n }\r\n break;\r\n }\r\n case \'openUrl\': {\r\n // Open a local web browser and return success/fail\r\n MeshServerLogEx(20, [data.url], "Opening: " + data.url, data);\r\n sendConsoleText("OpenURL: " + data.url);\r\n if (data.url) { mesh.SendCommand({ action: \'msg\', type: \'openUrl\', url: data.url, sessionid: data.sessionid, success: (openUserDesktopUrl(data.url) != null) }); }\r\n break;\r\n }\r\n case \'getclip\': {\r\n // Send the load clipboard back to the user\r\n //sendConsoleText(\'getClip: \' + JSON.stringify(data));\r\n if (require(\'MeshAgent\').isService) {\r\n require(\'clipboard\').dispatchRead().then(function (str) {\r\n if (str) {\r\n MeshServerLogEx(21, [str.length], "Getting clipboard content, " + str.length + " byte(s)", data);\r\n mesh.SendCommand({ action: \'msg\', type: \'getclip\', sessionid: data.sessionid, data: str, tag: data.tag });\r\n }\r\n });\r\n } else {\r\n require("clipboard").read().then(function (str) {\r\n if (str) {\r\n MeshServerLogEx(21, [str.length], "Getting clipboard content, " + str.length + " byte(s)", data);\r\n mesh.SendCommand({ action: \'msg\', type: \'getclip\', sessionid: data.sessionid, data: str, tag: data.tag });\r\n }\r\n });\r\n }\r\n break;\r\n }\r\n case \'setclip\': {\r\n // Set the load clipboard to a user value\r\n //sendConsoleText(\'setClip: \' + JSON.stringify(data));\r\n if (typeof data.data == \'string\') {\r\n MeshServerLogEx(22, [data.data.length], "Setting clipboard content, " + data.data.length + " byte(s)", data);\r\n if (require(\'MeshAgent\').isService) {\r\n if (process.platform != \'win32\') {\r\n require(\'clipboard\').dispatchWrite(data.data);\r\n }\r\n else {\r\n var tmp = "require(\'clipboard\')(" + JSON.stringify(data.data) + \');process.exit();\';\r\n tmp = Buffer.from(tmp).toString(\'base64\');\r\n var uid = require(\'user-sessions\').consoleUid();\r\n var domain = require(\'user-sessions\').getDomain(uid);\r\n var user = domain + \'\\\\\' + require(\'user-sessions\').getUsername(uid);\r\n var taskoptions = { env: { _target: process.execPath, _args: \'-b64exec \' + tmp, _user: user } };\r\n for (var c1e in process.env) {\r\n taskoptions.env[c1e] = process.env[c1e];\r\n }\r\n\r\n var child = require(\'child_process\').execFile(process.env[\'windir\'] + \'\\\\System32\\\\WindowsPowerShell\\\\v1.0\\\\powershell.exe\', [\'powershell\', \'-noprofile\', \'-nologo\', \'-command\', \'-\'], taskoptions);\r\n child.stderr.on(\'data\', function (c) { });\r\n child.stdout.on(\'data\', function (c) { });\r\n child.stdin.write(\'SCHTASKS /CREATE /F /TN MeshUserTask /SC ONCE /ST 00:00 \');\r\n child.stdin.write(\'/RU $env:_user \');\r\n\r\n child.stdin.write(\'/TR "$env:_target $env:_args"\\r\\n\');\r\n child.stdin.write(\'$ts = New-Object -ComObject Schedule.service\\r\\n\');\r\n child.stdin.write(\'$ts.connect()\\r\\n\');\r\n child.stdin.write(\'$tsfolder = $ts.getfolder("\\\\")\\r\\n\');\r\n child.stdin.write(\'$task = $tsfolder.GetTask("MeshUserTask")\\r\\n\');\r\n child.stdin.write(\'$taskdef = $task.Definition\\r\\n\');\r\n child.stdin.write(\'$taskdef.Settings.StopIfGoingOnBatteries = $false\\r\\n\');\r\n child.stdin.write(\'$taskdef.Settings.DisallowStartIfOnBatteries = $false\\r\\n\');\r\n child.stdin.write(\'$taskdef.Actions.Item(1).Path = $env:_target\\r\\n\');\r\n child.stdin.write(\'$taskdef.Actions.Item(1).Arguments = $env:_args\\r\\n\');\r\n child.stdin.write(\'$tsfolder.RegisterTaskDefinition($task.Name, $taskdef, 4, $null, $null, $null)\\r\\n\');\r\n\r\n child.stdin.write(\'SCHTASKS /RUN /TN MeshUserTask\\r\\n\');\r\n child.stdin.write(\'SCHTASKS /DELETE /F /TN MeshUserTask\\r\\nexit\\r\\n\');\r\n child.waitExit();\r\n }\r\n }\r\n else {\r\n require("clipboard")(data.data);\r\n } // Set the clipboard\r\n mesh.SendCommand({ action: \'msg\', type: \'setclip\', sessionid: data.sessionid, success: true });\r\n }\r\n break;\r\n }\r\n case \'userSessions\': {\r\n // Send back current user sessions list, this is Windows only.\r\n //sendConsoleText(\'userSessions: \' + JSON.stringify(data));\r\n if (process.platform != \'win32\') break;\r\n var p = require(\'user-sessions\').enumerateUsers();\r\n p.sessionid = data.sessionid;\r\n p.then(function (u) { mesh.SendCommand({ action: \'msg\', type: \'userSessions\', sessionid: data.sessionid, data: u, tag: data.tag }); });\r\n break;\r\n }\r\n case \'cpuinfo\':\r\n // CPU & memory utilization\r\n var cpuuse = require(\'sysinfo\').cpuUtilization();\r\n cpuuse.sessionid = data.sessionid;\r\n cpuuse.tag = data.tag;\r\n cpuuse.then(function (data) {\r\n mesh.SendCommand(JSON.stringify(\r\n {\r\n action: \'msg\',\r\n type: \'cpuinfo\',\r\n cpu: data,\r\n memory: require(\'sysinfo\').memUtilization(),\r\n thermals: require(\'sysinfo\').thermals == null ? [] : require(\'sysinfo\').thermals(),\r\n sessionid: this.sessionid,\r\n tag: this.tag\r\n }));\r\n }, function (ex) { });\r\n break;\r\n case \'localapp\':\r\n // Send a message to a local application\r\n sendConsoleText(\'localappMsg: \' + data.appid + \', \' + JSON.stringify(data.value));\r\n if (data.appid != null) { sendToRegisteredApp(data.appid, data.value); } else { broadcastToRegisteredApps(data.value); }\r\n break;\r\n default:\r\n // Unknown action, ignore it.\r\n break;\r\n }\r\n break;\r\n }\r\n case \'acmactivate\': {\r\n if (amt != null) {\r\n MeshServerLogEx(23, null, "Attempting Intel AMT ACM mode activation", data);\r\n amt.setAcmResponse(data);\r\n }\r\n break;\r\n }\r\n case \'wakeonlan\': {\r\n // Send wake-on-lan on all interfaces for all MAC addresses in data.macs array. The array is a list of HEX MAC addresses.\r\n //sendConsoleText("Server requesting wake-on-lan for: " + data.macs.join(\', \'));\r\n sendWakeOnLanEx(data.macs);\r\n sendWakeOnLanEx(data.macs);\r\n sendWakeOnLanEx(data.macs);\r\n break;\r\n }\r\n case \'runcommands\': {\r\n if (mesh.cmdchild != null) { sendConsoleText("Run commands can\'t execute, already busy."); break; }\r\n sendConsoleText("Run commands (" + data.runAsUser + "): " + data.cmds);\r\n\r\n // data.runAsUser: 0=Agent,1=UserOrAgent,2=UserOnly\r\n var options = {};\r\n if (data.runAsUser > 0) {\r\n try { options.uid = require(\'user-sessions\').consoleUid(); } catch (e) { }\r\n options.type = require(\'child_process\').SpawnTypes.TERM;\r\n }\r\n if (data.runAsUser == 2) {\r\n if (options.uid == null) break;\r\n if (((require(\'user-sessions\').minUid != null) && (options.uid < require(\'user-sessions\').minUid()))) break; // This command can only run as user.\r\n }\r\n\r\n if (process.platform == \'win32\') {\r\n if (data.type == 1) {\r\n // Windows command shell\r\n mesh.cmdchild = require(\'child_process\').execFile(process.env[\'windir\'] + \'\\\\system32\\\\cmd.exe\', [\'cmd\'], options);\r\n mesh.cmdchild.descriptorMetadata = \'UserCommandsShell\';\r\n mesh.cmdchild.stdout.on(\'data\', function (c) { sendConsoleText(c.toString()); });\r\n mesh.cmdchild.stderr.on(\'data\', function (c) { sendConsoleText(c.toString()); });\r\n mesh.cmdchild.stdin.write(data.cmds + \'\\r\\nexit\\r\\n\');\r\n mesh.cmdchild.on(\'exit\', function () { sendConsoleText("Run commands completed."); delete mesh.cmdchild; });\r\n } else if (data.type == 2) {\r\n // Windows Powershell\r\n mesh.cmdchild = require(\'child_process\').execFile(process.env[\'windir\'] + \'\\\\System32\\\\WindowsPowerShell\\\\v1.0\\\\powershell.exe\', [\'powershell\', \'-noprofile\', \'-nologo\', \'-command\', \'-\'], options);\r\n mesh.cmdchild.descriptorMetadata = \'UserCommandsPowerShell\';\r\n mesh.cmdchild.stdout.on(\'data\', function (c) { sendConsoleText(c.toString()); });\r\n mesh.cmdchild.stderr.on(\'data\', function (c) { sendConsoleText(c.toString()); });\r\n mesh.cmdchild.stdin.write(data.cmds + \'\\r\\nexit\\r\\n\');\r\n mesh.cmdchild.on(\'exit\', function () { sendConsoleText("Run commands completed."); delete mesh.cmdchild; });\r\n }\r\n } else if (data.type == 3) {\r\n // Linux shell\r\n mesh.cmdchild = require(\'child_process\').execFile(\'/bin/sh\', [\'sh\'], options);\r\n mesh.cmdchild.descriptorMetadata = \'UserCommandsShell\';\r\n mesh.cmdchild.stdout.on(\'data\', function (c) { sendConsoleText(c.toString()); });\r\n mesh.cmdchild.stderr.on(\'data\', function (c) { sendConsoleText(c.toString()); });\r\n mesh.cmdchild.stdin.write(data.cmds.split(\'\\r\').join(\'\') + \'\\nexit\\n\');\r\n mesh.cmdchild.on(\'exit\', function () { sendConsoleText("Run commands completed."); delete mesh.cmdchild; });\r\n }\r\n break;\r\n }\r\n case \'uninstallagent\':\r\n // Uninstall this agent\r\n var agentName = process.platform == \'win32\' ? \'Mesh Agent\' : \'meshagent\';\r\n try {\r\n agentName = require(\'MeshAgent\').serviceName;\r\n }\r\n catch (x) {\r\n }\r\n\r\n if (require(\'service-manager\').manager.getService(agentName).isMe()) {\r\n try { diagnosticAgent_uninstall(); } catch (e) { }\r\n var js = "require(\'service-manager\').manager.getService(\'" + agentName + "\').stop(); require(\'service-manager\').manager.uninstallService(\'" + agentName + "\'); process.exit();";\r\n this.child = require(\'child_process\').execFile(process.execPath, [process.platform == \'win32\' ? (process.execPath.split(\'\\\\\').pop()) : (process.execPath.split(\'/\').pop()), \'-b64exec\', Buffer.from(js).toString(\'base64\')], { type: 4, detached: true });\r\n }\r\n break;\r\n case \'poweraction\': {\r\n // Server telling us to execute a power action\r\n if ((mesh.ExecPowerState != undefined) && (data.actiontype)) {\r\n var forced = 0;\r\n if (data.forced == 1) { forced = 1; }\r\n data.actiontype = parseInt(data.actiontype);\r\n MeshServerLogEx(25, [data.actiontype, forced], "Performing power action=" + data.actiontype + ", forced=" + forced, data);\r\n sendConsoleText("Performing power action=" + data.actiontype + ", forced=" + forced + \'.\');\r\n var r = mesh.ExecPowerState(data.actiontype, forced);\r\n sendConsoleText("ExecPowerState returned code: " + r);\r\n }\r\n break;\r\n }\r\n case \'iplocation\': {\r\n // Update the IP location information of this node. Only do this when requested by the server since we have a limited amount of time we can call this per day\r\n getIpLocationData(function (location) { mesh.SendCommand({ action: \'iplocation\', type: \'publicip\', value: location }); });\r\n break;\r\n }\r\n case \'toast\': {\r\n // Display a toast message\r\n if (data.title && data.msg) {\r\n MeshServerLogEx(26, [data.title, data.msg], "Displaying toast message, title=" + data.title + ", message=" + data.msg, data);\r\n data.msg = data.msg.split(\'\\r\').join(\'\\\\r\').split(\'\\n\').join(\'\\\\n\');\r\n try { require(\'toaster\').Toast(data.title, data.msg); } catch (e) { }\r\n }\r\n break;\r\n }\r\n case \'openUrl\': {\r\n // Open a local web browser and return success/fail\r\n //sendConsoleText(\'OpenURL: \' + data.url);\r\n MeshServerLogEx(20, [data.url], "Opening: " + data.url, data);\r\n if (data.url) { mesh.SendCommand({ action: \'openUrl\', url: data.url, sessionid: data.sessionid, success: (openUserDesktopUrl(data.url) != null) }); }\r\n break;\r\n }\r\n case \'amtconfig\': {\r\n // Perform Intel AMT activation and/or configuration\r\n if ((apftunnel != null) || (amt == null) || (typeof data.user != \'string\') || (typeof data.pass != \'string\')) break;\r\n amt.getMeiState(15, function (state) {\r\n if ((apftunnel != null) || (amt == null)) return;\r\n if ((state == null) || (state.ProvisioningState == null)) return;\r\n if ((state.UUID == null) || (state.UUID.length != 36)) return; // Bad UUID\r\n var apfarg = {\r\n mpsurl: mesh.ServerUrl.replace(\'/agent.ashx\', \'/apf.ashx\'),\r\n mpsuser: data.user, // Agent user name\r\n mpspass: data.pass, // Encrypted login cookie\r\n mpskeepalive: 60000,\r\n clientname: state.OsHostname,\r\n clientaddress: \'127.0.0.1\',\r\n clientuuid: state.UUID,\r\n conntype: 2, // 0 = CIRA, 1 = Relay, 2 = LMS. The correct value is 2 since we are performing an LMS relay, other values for testing.\r\n meiState: state // MEI state will be passed to MPS server\r\n };\r\n addAmtEvent(\'LMS tunnel start.\');\r\n apftunnel = require(\'amt-apfclient\')({ debug: false }, apfarg);\r\n apftunnel.onJsonControl = handleApfJsonControl;\r\n apftunnel.onChannelClosed = function () { addAmtEvent(\'LMS tunnel closed.\'); apftunnel = null; }\r\n try { apftunnel.connect(); } catch (ex) { }\r\n });\r\n break;\r\n }\r\n case \'getScript\': {\r\n // Received a configuration script from the server\r\n sendConsoleText(\'getScript: \' + JSON.stringify(data));\r\n break;\r\n }\r\n case \'sysinfo\': {\r\n // Fetch system information\r\n getSystemInformation(function (results) {\r\n if ((results != null) && (data.hash != results.hash)) { mesh.SendCommand({ action: \'sysinfo\', sessionid: this.sessionid, data: results }); }\r\n });\r\n break;\r\n }\r\n case \'ping\': { mesh.SendCommand(\'{"action":"pong"}\'); break; }\r\n case \'pong\': { break; }\r\n case \'plugin\': {\r\n try { require(data.plugin).consoleaction(data, data.rights, data.sessionid, this); } catch (e) { throw e; }\r\n break;\r\n }\r\n case \'coredump\':\r\n // Set the current agent coredump situation.s\r\n if (data.value === true) {\r\n if (process.platform == \'win32\') {\r\n // TODO: This replace() below is not ideal, would be better to remove the .exe at the end instead of replace.\r\n process.coreDumpLocation = process.execPath.replace(\'.exe\', \'.dmp\');\r\n } else {\r\n process.coreDumpLocation = (process.cwd() != \'//\') ? (process.cwd() + \'core\') : null;\r\n }\r\n } else if (data.value === false) {\r\n process.coreDumpLocation = null;\r\n }\r\n break;\r\n case \'getcoredump\':\r\n // Ask the agent if a core dump is currently available, if yes, also return the hash of the agent.\r\n var r = { action: \'getcoredump\', value: (process.coreDumpLocation != null) };\r\n var coreDumpPath = null;\r\n if (process.platform == \'win32\') { coreDumpPath = process.coreDumpLocation; } else { coreDumpPath = (process.cwd() != \'//\') ? fs.existsSync(process.cwd() + \'core\') : null; }\r\n if ((coreDumpPath != null) && (fs.existsSync(coreDumpPath))) {\r\n try {\r\n var coredate = fs.statSync(coreDumpPath).mtime;\r\n var coretime = new Date(coredate).getTime();\r\n var agenttime = new Date(fs.statSync(process.execPath).mtime).getTime();\r\n if (coretime > agenttime) { r.exists = (db.Get(\'CoreDumpTime\') != coredate); }\r\n } catch (ex) { }\r\n }\r\n if (r.exists == true) {\r\n r.agenthashhex = getSHA384FileHash(process.execPath).toString(\'hex\'); // Hash of current agent\r\n r.corehashhex = getSHA384FileHash(coreDumpPath).toString(\'hex\'); // Hash of core dump file\r\n }\r\n mesh.SendCommand(JSON.stringify(r));\r\n break;\r\n case \'meshToolInfo\':\r\n if (data.pipe == true) { delete data.pipe; delete data.action; data.cmd = \'meshToolInfo\'; broadcastToRegisteredApps(data); }\r\n if (data.tag == \'info\') { sendConsoleText(JSON.stringify(data, null, 2)); }\r\n if (data.tag == \'install\') {\r\n data.func = function (options, success) {\r\n sendConsoleText(\'Download of MeshCentral Assistant \' + (success?\'succeed\':\'failed\'));\r\n if (success) {\r\n // TODO: Install & Run\r\n }\r\n }\r\n data.filename = \'MeshAssistant.exe\';\r\n downloadFile(data);\r\n }\r\n break;\r\n case \'wget\': // Server uses this command to tell the agent to download a file using HTTPS/GET and place it in a given path. This is used for one-to-many file uploads.\r\n agentFileHttpPendingRequests.push(data);\r\n serverFetchFile();\r\n break;\r\n case \'errorlog\': // Return agent error log\r\n try { mesh.SendCommand(JSON.stringify({ action: \'errorlog\', log: require(\'util-agentlog\').read(data.startTime) })); } catch (ex) { }\r\n break;\r\n default:\r\n // Unknown action, ignore it.\r\n break;\r\n }\r\n }\r\n}\r\n\r\n// Download a file from the server and check the hash.\r\n// This download is similar to the one used for meshcore self-update.\r\nvar trustedDownloads = {};\r\nfunction downloadFile(downloadoptions) {\r\n var options = require(\'http\').parseUri(downloadoptions.url);\r\n options.rejectUnauthorized = false;\r\n options.checkServerIdentity = function checkServerIdentity(certs) {\r\n // If the tunnel certificate matches the control channel certificate, accept the connection\r\n try { if (require(\'MeshAgent\').ServerInfo.ControlChannelCertificate.digest == certs[0].digest) return; } catch (ex) { }\r\n try { if (require(\'MeshAgent\').ServerInfo.ControlChannelCertificate.fingerprint == certs[0].fingerprint) return; } catch (ex) { }\r\n // Check that the certificate is the one expected by the server, fail if not.\r\n if (checkServerIdentity.servertlshash == null) { if (require(\'MeshAgent\').ServerInfo == null || require(\'MeshAgent\').ServerInfo.ControlChannelCertificate == null) return; throw new Error(\'BadCert\'); }\r\n if (certs[0].digest == null) return;\r\n if ((checkServerIdentity.servertlshash != null) && (checkServerIdentity.servertlshash.toLowerCase() != certs[0].digest.split(\':\').join(\'\').toLowerCase())) { throw new Error(\'BadCert\') }\r\n }\r\n //options.checkServerIdentity.servertlshash = downloadoptions.serverhash;\r\n trustedDownloads[downloadoptions.name] = downloadoptions;\r\n trustedDownloads[downloadoptions.name].dl = require(\'https\').get(options);\r\n trustedDownloads[downloadoptions.name].dl.on(\'error\', function (e) { downloadoptions.func(downloadoptions, false); delete trustedDownloads[downloadoptions.name]; });\r\n trustedDownloads[downloadoptions.name].dl.on(\'response\', function (img) {\r\n this._file = require(\'fs\').createWriteStream(trustedDownloads[downloadoptions.name].filename, { flags: \'wb\' });\r\n this._filehash = require(\'SHA384Stream\').create();\r\n this._filehash.on(\'hash\', function (h) { if ((downloadoptions.hash != null) && (downloadoptions.hash.toLowerCase() != h.toString(\'hex\').toLowerCase())) { downloadoptions.func(downloadoptions, false); delete trustedDownloads[downloadoptions.name]; return; } downloadoptions.func(downloadoptions, true); });\r\n img.pipe(this._file);\r\n img.pipe(this._filehash);\r\n });\r\n}\r\n\r\n// Handle APF JSON control commands\r\nfunction handleApfJsonControl(data) {\r\n if (data.action == \'console\') { addAmtEvent(data.msg); } // Add console message to AMT event log\r\n if (data.action == \'mestate\') { amt.getMeiState(15, function (state) { apftunnel.updateMeiState(state); }); } // Update the MEI state\r\n if (data.action == \'close\') { try { apftunnel.disconnect(); } catch (e) { } apftunnel = null; } // Close the CIRA-LMS connection\r\n if (amt.amtMei != null) {\r\n if (data.action == \'deactivate\') { // Request CCM deactivation\r\n amt.amtMei.unprovision(1, function (status) { if (apftunnel) apftunnel.sendMeiDeactivationState(status); }); // 0 = Success\r\n }\r\n if (data.action == \'startTlsHostConfig\') { // Request start of host based TLS ACM activation\r\n amt.amtMei.startConfigurationHBased(Buffer.from(data.hash, \'hex\'), data.hostVpn, data.dnsSuffixList, function (response) { apftunnel.sendStartTlsHostConfigResponse(response); });\r\n }\r\n if (data.action == \'stopConfiguration\') { // Request Intel AMT stop configuration.\r\n amt.amtMei.stopConfiguration(function (status) { apftunnel.sendStopConfigurationResponse(status); });\r\n }\r\n }\r\n}\r\n\r\n// Agent just get a file from the server and save it locally.\r\nfunction serverFetchFile() {\r\n if ((Object.keys(agentFileHttpRequests).length > 4) || (agentFileHttpPendingRequests.length == 0)) return; // No more than 4 active HTTPS requests to the server.\r\n var data = agentFileHttpPendingRequests.shift();\r\n if ((data.overwrite !== true) && fs.existsSync(data.path)) return; // Don\'t overwrite an existing file.\r\n if (data.createFolder) { try { fs.mkdirSync(data.folder); } catch (ex) { } } // If requested, create the local folder.\r\n data.url = \'http\' + getServerTargetUrlEx(\'*/\').substring(2);\r\n var agentFileHttpOptions = http.parseUri(data.url);\r\n agentFileHttpOptions.path = data.urlpath;\r\n\r\n // Perform manual server TLS certificate checking based on the certificate hash given by the server.\r\n agentFileHttpOptions.rejectUnauthorized = 0;\r\n agentFileHttpOptions.checkServerIdentity = function checkServerIdentity(certs) {\r\n // If the tunnel certificate matches the control channel certificate, accept the connection\r\n try { if (require(\'MeshAgent\').ServerInfo.ControlChannelCertificate.digest == certs[0].digest) return; } catch (ex) { }\r\n try { if (require(\'MeshAgent\').ServerInfo.ControlChannelCertificate.fingerprint == certs[0].fingerprint) return; } catch (ex) { }\r\n // Check that the certificate is the one expected by the server, fail if not.\r\n if ((checkServerIdentity.servertlshash != null) && (checkServerIdentity.servertlshash.toLowerCase() != certs[0].digest.split(\':\').join(\'\').toLowerCase())) { throw new Error(\'BadCert\') }\r\n }\r\n agentFileHttpOptions.checkServerIdentity.servertlshash = data.servertlshash;\r\n\r\n if (agentFileHttpOptions == null) return;\r\n var agentFileHttpRequest = http.request(agentFileHttpOptions,\r\n function (response) {\r\n response.xparent = this;\r\n try {\r\n response.xfile = fs.createWriteStream(this.xpath, { flags: \'wbN\' })\r\n response.pipe(response.xfile);\r\n response.end = function () { delete agentFileHttpRequests[this.xparent.xurlpath]; delete this.xparent; serverFetchFile(); }\r\n } catch (ex) { delete agentFileHttpRequests[this.xurlpath]; delete response.xparent; serverFetchFile(); return; }\r\n }\r\n );\r\n agentFileHttpRequest.on(\'error\', function (ex) { delete agentFileHttpRequests[this.xurlpath]; serverFetchFile(); });\r\n agentFileHttpRequest.end();\r\n agentFileHttpRequest.xurlpath = data.urlpath;\r\n agentFileHttpRequest.xpath = data.path;\r\n agentFileHttpRequests[data.urlpath] = agentFileHttpRequest;\r\n}\r\n\r\n// Called when a file changed in the file system\r\n/*\r\nfunction onFileWatcher(a, b) {\r\n console.log(\'onFileWatcher\', a, b, this.path);\r\n var response = getDirectoryInfo(this.path);\r\n if ((response != undefined) && (response != null)) { this.tunnel.s.write(JSON.stringify(response)); }\r\n}\r\n*/\r\n\r\nfunction getSystemInformation(func) {\r\n try {\r\n var results = { hardware: require(\'identifiers\').get() }; // Hardware info\r\n\r\n if (results.hardware && results.hardware.windows) {\r\n // Remove extra entries and things that change quickly\r\n var x = results.hardware.windows.osinfo;\r\n try { delete x.FreePhysicalMemory; } catch (e) { }\r\n try { delete x.FreeSpaceInPagingFiles; } catch (e) { }\r\n try { delete x.FreeVirtualMemory; } catch (e) { }\r\n try { delete x.LocalDateTime; } catch (e) { }\r\n try { delete x.MaxProcessMemorySize; } catch (e) { }\r\n try { delete x.TotalVirtualMemorySize; } catch (e) { }\r\n try { delete x.TotalVisibleMemorySize; } catch (e) { }\r\n try {\r\n if (results.hardware.windows.memory) { for (var i in results.hardware.windows.memory) { delete results.hardware.windows.memory[i].Node; } }\r\n if (results.hardware.windows.osinfo) { delete results.hardware.windows.osinfo.Node; }\r\n if (results.hardware.windows.partitions) { for (var i in results.hardware.windows.partitions) { delete results.hardware.windows.partitions[i].Node; } }\r\n } catch (e) { }\r\n }\r\n results.hardware.agentvers = process.versions;\r\n var hasher = require(\'SHA384Stream\').create();\r\n results.hash = hasher.syncHash(JSON.stringify(results)).toString(\'hex\');\r\n func(results);\r\n\r\n /*\r\n // On Windows platforms, get volume information - Needs more testing.\r\n if (process.platform == \'win32\')\r\n {\r\n results.pendingReboot = require(\'win-info\').pendingReboot(); // Pending reboot\r\n\r\n if (require(\'identifiers\').volumes_promise != null)\r\n {\r\n var p = require(\'identifiers\').volumes_promise();\r\n p.then(function (res)\r\n {\r\n results.volumes = res;\r\n results.hash = hasher.syncHash(JSON.stringify(results)).toString(\'hex\');\r\n func(results);\r\n });\r\n }\r\n else if (require(\'identifiers\').volumes != null)\r\n {\r\n results.volumes = require(\'identifiers\').volumes();\r\n results.hash = hasher.syncHash(JSON.stringify(results)).toString(\'hex\');\r\n func(results);\r\n }\r\n else\r\n {\r\n results.hash = hasher.syncHash(JSON.stringify(results)).toString(\'hex\');\r\n func(results);\r\n }\r\n }\r\n else\r\n {\r\n results.hash = hasher.syncHash(JSON.stringify(results)).toString(\'hex\');\r\n func(results);\r\n }\r\n */\r\n } catch (e) { func(null, e); }\r\n}\r\n\r\n// Get a formated response for a given directory path\r\nfunction getDirectoryInfo(reqpath) {\r\n var response = { path: reqpath, dir: [] };\r\n if (((reqpath == undefined) || (reqpath == \'\')) && (process.platform == \'win32\')) {\r\n // List all the drives in the root, or the root itself\r\n var results = null;\r\n try { results = fs.readDrivesSync(); } catch (e) { } // TODO: Anyway to get drive total size and free space? Could draw a progress bar.\r\n if (results != null) {\r\n for (var i = 0; i < results.length; ++i) {\r\n var drive = { n: results[i].name, t: 1 };\r\n if (results[i].type == \'REMOVABLE\') { drive.dt = \'removable\'; } // TODO: See if this is USB/CDROM or something else, we can draw icons.\r\n response.dir.push(drive);\r\n }\r\n }\r\n } else {\r\n // List all the files and folders in this path\r\n if (reqpath == \'\') { reqpath = \'/\'; }\r\n var results = null, xpath = obj.path.join(reqpath, \'*\');\r\n //if (process.platform == "win32") { xpath = xpath.split(\'/\').join(\'\\\\\'); }\r\n try { results = fs.readdirSync(xpath); } catch (e) { }\r\n if (results != null) {\r\n for (var i = 0; i < results.length; ++i) {\r\n if ((results[i] != \'.\') && (results[i] != \'..\')) {\r\n var stat = null, p = obj.path.join(reqpath, results[i]);\r\n //if (process.platform == "win32") { p = p.split(\'/\').join(\'\\\\\'); }\r\n try { stat = fs.statSync(p); } catch (e) { } // TODO: Get file size/date\r\n if ((stat != null) && (stat != undefined)) {\r\n if (stat.isDirectory() == true) {\r\n response.dir.push({ n: results[i], t: 2, d: stat.mtime });\r\n } else {\r\n response.dir.push({ n: results[i], t: 3, s: stat.size, d: stat.mtime });\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n return response;\r\n}\r\n\r\n// Tunnel callback operations\r\nfunction onTunnelUpgrade(response, s, head) {\r\n this.s = s;\r\n s.httprequest = this;\r\n s.end = onTunnelClosed;\r\n s.tunnel = this;\r\n s.descriptorMetadata = "MeshAgent_relayTunnel";\r\n\r\n if (require(\'MeshAgent\').idleTimeout != null) {\r\n s.setTimeout(require(\'MeshAgent\').idleTimeout * 1000);\r\n s.on(\'timeout\', function () {\r\n this.ping();\r\n this.setTimeout(require(\'MeshAgent\').idleTimeout * 1000);\r\n });\r\n }\r\n\r\n //sendConsoleText(\'onTunnelUpgrade - \' + this.tcpport + \' - \' + this.udpport);\r\n\r\n if (this.tcpport != null) {\r\n // This is a TCP relay connection, pause now and try to connect to the target.\r\n s.pause();\r\n s.data = onTcpRelayServerTunnelData;\r\n var connectionOptions = { port: parseInt(this.tcpport) };\r\n if (this.tcpaddr != null) { connectionOptions.host = this.tcpaddr; } else { connectionOptions.host = \'127.0.0.1\'; }\r\n s.tcprelay = net.createConnection(connectionOptions, onTcpRelayTargetTunnelConnect);\r\n s.tcprelay.peerindex = this.index;\r\n\r\n // Add the TCP session to the count and update the server\r\n if (s.httprequest.userid != null) {\r\n if (tunnelUserCount.tcp[s.httprequest.userid] == null) { tunnelUserCount.tcp[s.httprequest.userid] = 1; } else { tunnelUserCount.tcp[s.httprequest.userid]++; }\r\n try { mesh.SendCommand({ action: \'sessions\', type: \'tcp\', value: tunnelUserCount.tcp }); } catch (e) { }\r\n broadcastSessionsToRegisteredApps();\r\n }\r\n } if (this.udpport != null) {\r\n // This is a UDP relay connection, get the UDP socket setup. // TODO: ***************\r\n s.data = onUdpRelayServerTunnelData;\r\n s.udprelay = require(\'dgram\').createSocket({ type: \'udp4\' });\r\n s.udprelay.bind({ port: 0 });\r\n s.udprelay.peerindex = this.index;\r\n s.udprelay.on(\'message\', onUdpRelayTargetTunnelConnect);\r\n s.udprelay.udpport = this.udpport;\r\n s.udprelay.udpaddr = this.udpaddr;\r\n s.udprelay.first = true;\r\n\r\n // Add the UDP session to the count and update the server\r\n if (s.httprequest.userid != null) {\r\n if (tunnelUserCount.udp[s.httprequest.userid] == null) { tunnelUserCount.udp[s.httprequest.userid] = 1; } else { tunnelUserCount.udp[s.httprequest.userid]++; }\r\n try { mesh.SendCommand({ action: \'sessions\', type: \'udp\', value: tunnelUserCount.tcp }); } catch (e) { }\r\n broadcastSessionsToRegisteredApps();\r\n }\r\n } else {\r\n // This is a normal connect for KVM/Terminal/Files\r\n s.data = onTunnelData;\r\n }\r\n}\r\n\r\n// Called when UDP relay data is received // TODO****\r\nfunction onUdpRelayTargetTunnelConnect(data) {\r\n var peerTunnel = tunnels[this.peerindex];\r\n peerTunnel.s.write(data);\r\n}\r\n\r\n// Called when we get data from the server for a TCP relay (We have to skip the first received \'c\' and pipe the rest)\r\nfunction onUdpRelayServerTunnelData(data) {\r\n if (this.udprelay.first === true) {\r\n delete this.udprelay.first; // Skip the first \'c\' that is received.\r\n } else {\r\n this.udprelay.send(data, parseInt(this.udprelay.udpport), this.udprelay.udpaddr ? this.udprelay.udpaddr : \'127.0.0.1\');\r\n }\r\n}\r\n\r\n// Called when the TCP relay target is connected\r\nfunction onTcpRelayTargetTunnelConnect() {\r\n var peerTunnel = tunnels[this.peerindex];\r\n this.pipe(peerTunnel.s); // Pipe Target --> Server\r\n peerTunnel.s.first = true;\r\n peerTunnel.s.resume();\r\n}\r\n\r\n// Called when we get data from the server for a TCP relay (We have to skip the first received \'c\' and pipe the rest)\r\nfunction onTcpRelayServerTunnelData(data) {\r\n if (this.first == true) {\r\n this.first = false;\r\n this.pipe(this.tcprelay, { dataTypeSkip: 1 }); // Pipe Server --> Target (don\'t pipe text type websocket frames)\r\n }\r\n}\r\n\r\nfunction onTunnelClosed() {\r\n var tunnel = tunnels[this.httprequest.index];\r\n if (tunnel == null) return; // Stop duplicate calls.\r\n\r\n // If this is a routing session, clean up and send the new session counts.\r\n if (this.httprequest.userid != null) {\r\n if (this.httprequest.tcpport != null) {\r\n if (tunnelUserCount.tcp[this.httprequest.userid] != null) { tunnelUserCount.tcp[this.httprequest.userid]--; if (tunnelUserCount.tcp[this.httprequest.userid] <= 0) { delete tunnelUserCount.tcp[this.httprequest.userid]; } }\r\n try { mesh.SendCommand({ action: \'sessions\', type: \'tcp\', value: tunnelUserCount.tcp }); } catch (e) { }\r\n broadcastSessionsToRegisteredApps();\r\n } else if (this.httprequest.udpport != null) {\r\n if (tunnelUserCount.udp[this.httprequest.userid] != null) { tunnelUserCount.udp[this.httprequest.userid]--; if (tunnelUserCount.udp[this.httprequest.userid] <= 0) { delete tunnelUserCount.udp[this.httprequest.userid]; } }\r\n try { mesh.SendCommand({ action: \'sessions\', type: \'udp\', value: tunnelUserCount.udp }); } catch (e) { }\r\n broadcastSessionsToRegisteredApps();\r\n }\r\n }\r\n\r\n // Sent tunnel statistics to the server, only send this if compression was used.\r\n if ((this.bytesSent_uncompressed) && (this.bytesSent_uncompressed.toString() != this.bytesSent_actual.toString())) {\r\n mesh.SendCommand({\r\n action: \'tunnelCloseStats\',\r\n url: tunnel.url,\r\n userid: tunnel.userid,\r\n protocol: tunnel.protocol,\r\n sessionid: tunnel.sessionid,\r\n sent: this.bytesSent_uncompressed.toString(),\r\n sentActual: this.bytesSent_actual.toString(),\r\n sentRatio: this.bytesSent_ratio,\r\n received: this.bytesReceived_uncompressed.toString(),\r\n receivedActual: this.bytesReceived_actual.toString(),\r\n receivedRatio: this.bytesReceived_ratio\r\n });\r\n }\r\n\r\n //sendConsoleText("Tunnel #" + this.httprequest.index + " closed. Sent -> " + this.bytesSent_uncompressed + \' bytes (uncompressed), \' + this.bytesSent_actual + \' bytes (actual), \' + this.bytesSent_ratio + \'% compression\', this.httprequest.sessionid);\r\n if (this.httprequest.index) { delete tunnels[this.httprequest.index]; }\r\n\r\n /*\r\n // Close the watcher if required\r\n if (this.httprequest.watcher != undefined) {\r\n //console.log(\'Closing watcher: \' + this.httprequest.watcher.path);\r\n //this.httprequest.watcher.close(); // TODO: This line causes the agent to crash!!!!\r\n delete this.httprequest.watcher;\r\n }\r\n */\r\n\r\n // If there is a upload or download active on this connection, close the file\r\n if (this.httprequest.uploadFile) { fs.closeSync(this.httprequest.uploadFile); delete this.httprequest.uploadFile; delete this.httprequest.uploadFileid; delete this.httprequest.uploadFilePath; delete this.httprequest.uploadFileSize; }\r\n if (this.httprequest.downloadFile) { delete this.httprequest.downloadFile; }\r\n\r\n // Clean up WebRTC\r\n if (this.webrtc != null) {\r\n if (this.webrtc.rtcchannel) { try { this.webrtc.rtcchannel.close(); } catch (e) { } this.webrtc.rtcchannel.removeAllListeners(\'data\'); this.webrtc.rtcchannel.removeAllListeners(\'end\'); delete this.webrtc.rtcchannel; }\r\n if (this.webrtc.websocket) { delete this.webrtc.websocket; }\r\n try { this.webrtc.close(); } catch (e) { }\r\n this.webrtc.removeAllListeners(\'connected\');\r\n this.webrtc.removeAllListeners(\'disconnected\');\r\n this.webrtc.removeAllListeners(\'dataChannel\');\r\n delete this.webrtc;\r\n }\r\n\r\n // Clean up WebSocket\r\n this.removeAllListeners(\'data\');\r\n}\r\nfunction onTunnelSendOk() { /*sendConsoleText("Tunnel #" + this.index + " SendOK.", this.sessionid);*/ }\r\nfunction onTunnelData(data) {\r\n //console.log("OnTunnelData");\r\n //sendConsoleText(\'OnTunnelData, \' + data.length + \', \' + typeof data + \', \' + data);\r\n\r\n // If this is upload data, save it to file\r\n if ((this.httprequest.uploadFile) && (typeof data == \'object\') && (data[0] != 123)) {\r\n // Save the data to file being uploaded.\r\n if (data[0] == 0) {\r\n // If data starts with zero, skip the first byte. This is used to escape binary file data from JSON.\r\n this.httprequest.uploadFileSize += (data.length - 1);\r\n try { fs.writeSync(this.httprequest.uploadFile, data, 1, data.length - 1); } catch (e) { sendConsoleText(\'FileUpload Error\'); this.write(Buffer.from(JSON.stringify({ action: \'uploaderror\' }))); return; } // Write to the file, if there is a problem, error out.\r\n } else {\r\n // If data does not start with zero, save as-is.\r\n this.httprequest.uploadFileSize += data.length;\r\n try { fs.writeSync(this.httprequest.uploadFile, data); } catch (e) { sendConsoleText(\'FileUpload Error\'); this.write(Buffer.from(JSON.stringify({ action: \'uploaderror\' }))); return; } // Write to the file, if there is a problem, error out.\r\n }\r\n this.write(Buffer.from(JSON.stringify({ action: \'uploadack\', reqid: this.httprequest.uploadFileid }))); // Ask for more data.\r\n return;\r\n }\r\n\r\n if (this.httprequest.state == 0) {\r\n // Check if this is a relay connection\r\n if ((data == \'c\') || (data == \'cr\')) { this.httprequest.state = 1; /*sendConsoleText("Tunnel #" + this.httprequest.index + " now active", this.httprequest.sessionid);*/ }\r\n }\r\n else {\r\n // Handle tunnel data\r\n if (this.httprequest.protocol == 0) { // 1 = Terminal (admin), 2 = Desktop, 5 = Files, 6 = PowerShell (admin), 7 = Plugin Data Exchange, 8 = Terminal (user), 9 = PowerShell (user), 10 = FileTransfer\r\n // Take a look at the protocol\r\n if ((data.length > 3) && (data[0] == \'{\')) { onTunnelControlData(data, this); return; }\r\n this.httprequest.protocol = parseInt(data);\r\n if (typeof this.httprequest.protocol != \'number\') { this.httprequest.protocol = 0; }\r\n\r\n // See if this protocol request is allowed.\r\n if ((this.httprequest.soptions != null) && (this.httprequest.soptions.usages != null) && (this.httprequest.soptions.usages.indexOf(this.httprequest.protocol) == -1)) { this.httprequest.protocol = 0; }\r\n\r\n if (this.httprequest.protocol == 10) {\r\n //\r\n // Basic file transfer\r\n //\r\n var stats = null;\r\n if ((process.platform != \'win32\') && (this.httprequest.xoptions.file.startsWith(\'/\') == false)) { this.httprequest.xoptions.file = \'/\' + this.httprequest.xoptions.file; }\r\n try { stats = require(\'fs\').statSync(this.httprequest.xoptions.file) } catch (e) { }\r\n try { if (stats) { this.httprequest.downloadFile = fs.createReadStream(this.httprequest.xoptions.file, { flags: \'rbN\' }); } } catch (e) { }\r\n if (this.httprequest.downloadFile) {\r\n MeshServerLogEx(106, [this.httprequest.xoptions.file, stats.size], \'Download: \\"\' + this.httprequest.xoptions.file + \'\\", Size: \' + stats.size, this.httprequest);\r\n //sendConsoleText(\'BasicFileTransfer, ok, \' + this.httprequest.xoptions.file + \', \' + JSON.stringify(stats));\r\n this.write(JSON.stringify({ op: \'ok\', size: stats.size }));\r\n this.httprequest.downloadFile.pipe(this);\r\n this.httprequest.downloadFile.end = function () { }\r\n } else {\r\n //sendConsoleText(\'BasicFileTransfer, cancel, \' + this.httprequest.xoptions.file);\r\n this.write(JSON.stringify({ op: \'cancel\' }));\r\n }\r\n }\r\n else if ((this.httprequest.protocol == 1) || (this.httprequest.protocol == 6) || (this.httprequest.protocol == 8) || (this.httprequest.protocol == 9)) {\r\n //\r\n // Remote Terminal\r\n //\r\n\r\n // Check user access rights for terminal\r\n if (((this.httprequest.rights & MESHRIGHT_REMOTECONTROL) == 0) || ((this.httprequest.rights != 0xFFFFFFFF) && ((this.httprequest.rights & MESHRIGHT_NOTERMINAL) != 0))) {\r\n // Disengage this tunnel, user does not have the rights to do this!!\r\n this.httprequest.protocol = 999999;\r\n this.httprequest.s.end();\r\n sendConsoleText("Error: No Terminal Control Rights.");\r\n return;\r\n }\r\n\r\n this.descriptorMetadata = "Remote Terminal";\r\n\r\n if (process.platform == \'win32\') {\r\n if (!require(\'win-terminal\').PowerShellCapable() && (this.httprequest.protocol == 6 || this.httprequest.protocol == 9)) {\r\n this.httprequest.write(JSON.stringify({ ctrlChannel: \'102938\', type: \'console\', msg: \'PowerShell is not supported on this version of windows\', msgid: 1 }));\r\n this.httprequest.s.end();\r\n return;\r\n }\r\n }\r\n\r\n var prom = require(\'promise\');\r\n this.httprequest.tpromise = new prom(function (res, rej) { this._res = res; this._rej = rej; });\r\n this.httprequest.tpromise.that = this;\r\n this.httprequest.tpromise.httprequest = this.httprequest;\r\n\r\n this.end = function () {\r\n if (this.httprequest.tpromise._consent) { this.httprequest.tpromise._consent.close(); }\r\n if (this.httprequest.connectionPromise) { this.httprequest.connectionPromise._rej(\'Closed\'); }\r\n\r\n // Remove the terminal session to the count to update the server\r\n if (this.httprequest.userid != null) {\r\n if (tunnelUserCount.terminal[this.httprequest.userid] != null) { tunnelUserCount.terminal[this.httprequest.userid]--; if (tunnelUserCount.terminal[this.httprequest.userid] <= 0) { delete tunnelUserCount.terminal[this.httprequest.userid]; } }\r\n try { mesh.SendCommand({ action: \'sessions\', type: \'terminal\', value: tunnelUserCount.terminal }); } catch (e) { }\r\n broadcastSessionsToRegisteredApps();\r\n }\r\n\r\n if (process.platform == \'win32\') {\r\n // Unpipe the web socket\r\n this.unpipe(this.httprequest._term);\r\n if (this.httprequest._term) { this.httprequest._term.unpipe(this); }\r\n\r\n // Unpipe the WebRTC channel if needed (This will also be done when the WebRTC channel ends).\r\n if (this.rtcchannel) {\r\n this.rtcchannel.unpipe(this.httprequest._term);\r\n if (this.httprequest._term) { this.httprequest._term.unpipe(this.rtcchannel); }\r\n }\r\n\r\n // Clean up\r\n if (this.httprequest._term) { this.httprequest._term.end(); }\r\n this.httprequest._term = null;\r\n }\r\n };\r\n\r\n // Perform User-Consent if needed. \r\n if (this.httprequest.consent && (this.httprequest.consent & 16)) {\r\n this.write(JSON.stringify({ ctrlChannel: \'102938\', type: \'console\', msg: "Waiting for user to grant access...", msgid: 1 }));\r\n var consentMessage = this.httprequest.username + " requesting remote terminal access. Grant access?", consentTitle = \'MeshCentral\';\r\n if (this.httprequest.soptions != null) {\r\n if (this.httprequest.soptions.consentTitle != null) { consentTitle = this.httprequest.soptions.consentTitle; }\r\n if (this.httprequest.soptions.consentMsgTerminal != null) { consentMessage = this.httprequest.soptions.consentMsgTerminal.replace(\'{0}\', this.httprequest.realname).replace(\'{1}\', this.httprequest.username); }\r\n }\r\n this.httprequest.tpromise._consent = require(\'message-box\').create(consentTitle, consentMessage, 30);\r\n this.httprequest.tpromise._consent.retPromise = this.httprequest.tpromise;\r\n this.httprequest.tpromise._consent.then(\r\n function () {\r\n // Success\r\n MeshServerLogEx(27, null, "Local user accepted remote terminal request (" + this.retPromise.httprequest.remoteaddr + ")", this.retPromise.that.httprequest);\r\n this.retPromise.that.write(JSON.stringify({ ctrlChannel: \'102938\', type: \'console\', msg: null, msgid: 0 }));\r\n this.retPromise._consent = null;\r\n this.retPromise._res();\r\n },\r\n function (e) {\r\n // Denied\r\n MeshServerLogEx(28, null, "Local user rejected remote terminal request (" + this.retPromise.that.httprequest.remoteaddr + ")", this.retPromise.that.httprequest);\r\n this.retPromise.that.write(JSON.stringify({ ctrlChannel: \'102938\', type: \'console\', msg: e.toString(), msgid: 2 }));\r\n this.retPromise._rej(e.toString());\r\n });\r\n }\r\n else {\r\n // User-Consent is not required, so just resolve this promise\r\n this.httprequest.tpromise._res();\r\n }\r\n\r\n\r\n this.httprequest.tpromise.then(\r\n function () {\r\n this.httprequest.connectionPromise = new prom(function (res, rej) { this._res = res; this._rej = rej; });\r\n this.httprequest.connectionPromise.ws = this.that;\r\n\r\n // Start Terminal\r\n if (process.platform == \'win32\') {\r\n try {\r\n var cols = 80, rows = 25;\r\n if (this.httprequest.xoptions) {\r\n if (this.httprequest.xoptions.rows) { rows = this.httprequest.xoptions.rows; }\r\n if (this.httprequest.xoptions.cols) { cols = this.httprequest.xoptions.cols; }\r\n }\r\n\r\n if ((this.httprequest.protocol == 1) || (this.httprequest.protocol == 6)) {\r\n // Admin Terminal\r\n if (require(\'win-virtual-terminal\').supported) {\r\n // ConPTY PseudoTerminal\r\n // this.httprequest._term = require(\'win-virtual-terminal\')[this.httprequest.protocol == 6 ? \'StartPowerShell\' : \'Start\'](80, 25);\r\n\r\n // The above line is commented out, because there is a bug with ClosePseudoConsole() API, so this is the workaround\r\n this.httprequest._dispatcher = require(\'win-dispatcher\').dispatch({ modules: [{ name: \'win-virtual-terminal\', script: getJSModule(\'win-virtual-terminal\') }], launch: { module: \'win-virtual-terminal\', method: (this.httprequest.protocol == 6 ? \'StartPowerShell\' : \'Start\'), args: [cols, rows] } });\r\n this.httprequest._dispatcher.httprequest = this.httprequest;\r\n this.httprequest._dispatcher.on(\'connection\', function (c) {\r\n if (this.httprequest.connectionPromise.completed) {\r\n c.end();\r\n }\r\n else {\r\n this.httprequest.connectionPromise._res(c);\r\n }\r\n });\r\n }\r\n else {\r\n // Legacy Terminal\r\n this.httprequest.connectionPromise._res(require(\'win-terminal\')[this.httprequest.protocol == 6 ? \'StartPowerShell\' : \'Start\'](cols, rows));\r\n }\r\n }\r\n else {\r\n // Logged in user\r\n var userPromise = require(\'user-sessions\').enumerateUsers();\r\n userPromise.that = this;\r\n userPromise.then(function (u) {\r\n var that = this.that;\r\n if (u.Active.length > 0) {\r\n var username = \'"\' + u.Active[0].Domain + \'\\\\\' + u.Active[0].Username + \'"\';\r\n sendConsoleText(\'Terminal: \' + username);\r\n if (require(\'win-virtual-terminal\').supported) {\r\n // ConPTY PseudoTerminal\r\n that.httprequest._dispatcher = require(\'win-dispatcher\').dispatch({ user: username, modules: [{ name: \'win-virtual-terminal\', script: getJSModule(\'win-virtual-terminal\') }], launch: { module: \'win-virtual-terminal\', method: (that.httprequest.protocol == 9 ? \'StartPowerShell\' : \'Start\'), args: [cols, rows] } });\r\n }\r\n else {\r\n // Legacy Terminal\r\n that.httprequest._dispatcher = require(\'win-dispatcher\').dispatch({ user: username, modules: [{ name: \'win-terminal\', script: getJSModule(\'win-terminal\') }], launch: { module: \'win-terminal\', method: (that.httprequest.protocol == 9 ? \'StartPowerShell\' : \'Start\'), args: [cols, rows] } });\r\n }\r\n that.httprequest._dispatcher.ws = that;\r\n that.httprequest._dispatcher.on(\'connection\', function (c) {\r\n if (this.ws.httprequest.connectionPromise.completed) {\r\n c.end();\r\n }\r\n else {\r\n this.ws.httprequest.connectionPromise._res(c);\r\n }\r\n });\r\n }\r\n });\r\n }\r\n }\r\n catch (e) {\r\n this.httprequest.connectionPromise._rej(\'Failed to start remote terminal session, \' + e.toString());\r\n }\r\n }\r\n else {\r\n try {\r\n var bash = fs.existsSync(\'/bin/bash\') ? \'/bin/bash\' : false;\r\n var sh = fs.existsSync(\'/bin/sh\') ? \'/bin/sh\' : false;\r\n var login = process.platform == \'linux\' ? \'/bin/login\' : \'/usr/bin/login\';\r\n\r\n var env = { HISTCONTROL: \'ignoreboth\' };\r\n if (this.httprequest.xoptions) {\r\n if (this.httprequest.xoptions.rows) { env.LINES = (\'\' + this.httprequest.xoptions.rows); }\r\n if (this.httprequest.xoptions.cols) { env.COLUMNS = (\'\' + this.httprequest.xoptions.cols); }\r\n }\r\n var options = { type: childProcess.SpawnTypes.TERM, uid: (this.httprequest.protocol == 8) ? require(\'user-sessions\').consoleUid() : null, env: env };\r\n if (this.httprequest.xoptions && this.httprequest.xoptions.requireLogin) {\r\n if (!require(\'fs\').existsSync(login)) { throw (\'Unable to spawn login process\'); }\r\n this.httprequest.connectionPromise._res(childProcess.execFile(login, [\'login\'], options)); // Start login shell\r\n }\r\n else if (bash) {\r\n var p = childProcess.execFile(bash, [\'bash\'], options); // Start bash\r\n // Spaces at the beginning of lines are needed to hide commands from the command history\r\n if (process.platform == \'linux\') { p.stdin.write(\' alias ls=\\\'ls --color=auto\\\';clear\\n\'); }\r\n this.httprequest.connectionPromise._res(p);\r\n }\r\n else if (sh) {\r\n var p = childProcess.execFile(sh, [\'sh\'], options); // Start sh\r\n // Spaces at the beginning of lines are needed to hide commands from the command history\r\n if (process.platform == \'linux\') { p.stdin.write(\' alias ls=\\\'ls --color=auto\\\';clear\\n\'); }\r\n this.httprequest.connectionPromise._res(p);\r\n }\r\n else {\r\n this.httprequest.connectionPromise._rej(\'Failed to start remote terminal session, no shell found\');\r\n }\r\n }\r\n catch (e) {\r\n this.httprequest.connectionPromise._rej(\'Failed to start remote terminal session, \' + e.toString());\r\n }\r\n }\r\n\r\n this.httprequest.connectionPromise.then(\r\n function (term) {\r\n // SUCCESS\r\n var stdoutstream;\r\n var stdinstream;\r\n if (process.platform == \'win32\') {\r\n this.ws.httprequest._term = term;\r\n this.ws.httprequest._term.tunnel = this.ws;\r\n stdoutstream = stdinstream = term;\r\n }\r\n else {\r\n term.descriptorMetadata = \'Remote Terminal\';\r\n this.ws.httprequest.process = term;\r\n this.ws.httprequest.process.tunnel = this.ws;\r\n term.stderr.stdout = term.stdout;\r\n term.stderr.on(\'data\', function (c) { this.stdout.write(c); });\r\n stdoutstream = term.stdout;\r\n stdinstream = term.stdin;\r\n this.ws.prependListener(\'end\', function () { this.httprequest.process.kill(); });\r\n term.prependListener(\'exit\', function () { this.tunnel.end(); });\r\n }\r\n\r\n this.ws.removeAllListeners(\'data\');\r\n this.ws.on(\'data\', onTunnelControlData);\r\n\r\n stdoutstream.pipe(this.ws, { dataTypeSkip: 1 }); // 0 = Binary, 1 = Text.\r\n this.ws.pipe(stdinstream, { dataTypeSkip: 1, end: false }); // 0 = Binary, 1 = Text. \r\n\r\n // Add the terminal session to the count to update the server\r\n if (this.ws.httprequest.userid != null) {\r\n if (tunnelUserCount.terminal[this.ws.httprequest.userid] == null) { tunnelUserCount.terminal[this.ws.httprequest.userid] = 1; } else { tunnelUserCount.terminal[this.ws.httprequest.userid]++; }\r\n try { mesh.SendCommand({ action: \'sessions\', type: \'terminal\', value: tunnelUserCount.terminal }); } catch (e) { }\r\n broadcastSessionsToRegisteredApps();\r\n }\r\n\r\n // Toast Notification, if required\r\n if (this.ws.httprequest.consent && (this.ws.httprequest.consent & 2)) {\r\n // User Notifications is required\r\n var notifyMessage = this.ws.httprequest.username + " started a remote terminal session.", notifyTitle = "MeshCentral";\r\n if (this.ws.httprequest.soptions != null) {\r\n if (this.ws.httprequest.soptions.notifyTitle != null) { notifyTitle = this.ws.httprequest.soptions.notifyTitle; }\r\n if (this.ws.httprequest.soptions.notifyMsgTerminal != null) { notifyMessage = this.ws.httprequest.soptions.notifyMsgTerminal.replace(\'{0}\', this.ws.httprequest.realname).replace(\'{1}\', this.ws.httprequest.username); }\r\n }\r\n try { require(\'toaster\').Toast(notifyTitle, notifyMessage); } catch (e) { }\r\n }\r\n },\r\n function (e) {\r\n // FAILED to connect terminal\r\n this.ws.write(JSON.stringify({ ctrlChannel: \'102938\', type: \'console\', msg: e.toString(), msgid: 2 }));\r\n this.ws.end();\r\n });\r\n },\r\n function (e) {\r\n // DO NOT start terminal\r\n this.that.write(JSON.stringify({ ctrlChannel: \'102938\', type: \'console\', msg: e.toString(), msgid: 2 }));\r\n this.that.end();\r\n });\r\n }\r\n else if (this.httprequest.protocol == 2) {\r\n //\r\n // Remote Desktop\r\n //\r\n\r\n // Check user access rights for desktop\r\n if ((((this.httprequest.rights & MESHRIGHT_REMOTECONTROL) == 0) && ((this.httprequest.rights & MESHRIGHT_REMOTEVIEW) == 0)) || ((this.httprequest.rights != 0xFFFFFFFF) && ((this.httprequest.rights & MESHRIGHT_NODESKTOP) != 0))) {\r\n // Disengage this tunnel, user does not have the rights to do this!!\r\n this.httprequest.protocol = 999999;\r\n this.httprequest.s.end();\r\n sendConsoleText("Error: No Desktop Control Rights.");\r\n return;\r\n }\r\n\r\n this.descriptorMetadata = "Remote KVM";\r\n\r\n // Look for a TSID\r\n var tsid = null;\r\n if ((this.httprequest.xoptions != null) && (typeof this.httprequest.xoptions.tsid == \'number\')) { tsid = this.httprequest.xoptions.tsid; }\r\n require(\'MeshAgent\')._tsid = tsid;\r\n\r\n // Remote desktop using native pipes\r\n this.httprequest.desktop = { state: 0, kvm: mesh.getRemoteDesktopStream(tsid), tunnel: this };\r\n this.httprequest.desktop.kvm.parent = this.httprequest.desktop;\r\n this.desktop = this.httprequest.desktop;\r\n\r\n // Add ourself to the list of remote desktop sessions\r\n if (this.httprequest.desktop.kvm.tunnels == null) { this.httprequest.desktop.kvm.tunnels = []; }\r\n this.httprequest.desktop.kvm.tunnels.push(this);\r\n\r\n // Send a metadata update to all desktop sessions\r\n var users = {};\r\n if (this.httprequest.desktop.kvm.tunnels != null) {\r\n for (var i in this.httprequest.desktop.kvm.tunnels) { try { var userid = this.httprequest.desktop.kvm.tunnels[i].httprequest.userid; if (users[userid] == null) { users[userid] = 1; } else { users[userid]++; } } catch (e) { } }\r\n for (var i in this.httprequest.desktop.kvm.tunnels) { try { this.httprequest.desktop.kvm.tunnels[i].write(JSON.stringify({ ctrlChannel: \'102938\', type: \'metadata\', users: users })); } catch (e) { } }\r\n tunnelUserCount.desktop = users;\r\n try { mesh.SendCommand({ action: \'sessions\', type: \'kvm\', value: users }); } catch (e) { }\r\n broadcastSessionsToRegisteredApps();\r\n }\r\n\r\n this.end = function () {\r\n --this.desktop.kvm.connectionCount;\r\n\r\n // Remove ourself from the list of remote desktop session\r\n var i = this.desktop.kvm.tunnels.indexOf(this);\r\n if (i >= 0) { this.desktop.kvm.tunnels.splice(i, 1); }\r\n\r\n // Send a metadata update to all desktop sessions\r\n var users = {};\r\n if (this.httprequest.desktop.kvm.tunnels != null) {\r\n for (var i in this.httprequest.desktop.kvm.tunnels) { try { var userid = this.httprequest.desktop.kvm.tunnels[i].httprequest.userid; if (users[userid] == null) { users[userid] = 1; } else { users[userid]++; } } catch (e) { } }\r\n for (var i in this.httprequest.desktop.kvm.tunnels) { try { this.httprequest.desktop.kvm.tunnels[i].write(JSON.stringify({ ctrlChannel: \'102938\', type: \'metadata\', users: users })); } catch (e) { } }\r\n tunnelUserCount.desktop = users;\r\n try { mesh.SendCommand({ action: \'sessions\', type: \'kvm\', value: users }); } catch (e) { }\r\n broadcastSessionsToRegisteredApps();\r\n }\r\n\r\n // Unpipe the web socket\r\n try {\r\n this.unpipe(this.httprequest.desktop.kvm);\r\n this.httprequest.desktop.kvm.unpipe(this);\r\n }\r\n catch (e) { }\r\n\r\n // Unpipe the WebRTC channel if needed (This will also be done when the WebRTC channel ends).\r\n if (this.rtcchannel) {\r\n try {\r\n this.rtcchannel.unpipe(this.httprequest.desktop.kvm);\r\n this.httprequest.desktop.kvm.unpipe(this.rtcchannel);\r\n }\r\n catch (e) { }\r\n }\r\n\r\n // Place wallpaper back if needed\r\n // TODO\r\n\r\n if (this.desktop.kvm.connectionCount == 0) {\r\n // Display a toast message. This may not be supported on all platforms.\r\n // try { require(\'toaster\').Toast(\'MeshCentral\', \'Remote Desktop Control Ended.\'); } catch (e) { }\r\n\r\n this.httprequest.desktop.kvm.end();\r\n if (this.httprequest.desktop.kvm.connectionBar) {\r\n this.httprequest.desktop.kvm.connectionBar.removeAllListeners(\'close\');\r\n this.httprequest.desktop.kvm.connectionBar.close();\r\n this.httprequest.desktop.kvm.connectionBar = null;\r\n }\r\n } else {\r\n for (var i in this.httprequest.desktop.kvm.users) {\r\n if ((this.httprequest.desktop.kvm.users[i] == this.httprequest.username) && this.httprequest.desktop.kvm.connectionBar) {\r\n for (var j in this.httprequest.desktop.kvm.rusers) { if (this.httprequest.desktop.kvm.rusers[j] == this.httprequest.realname) { this.httprequest.desktop.kvm.rusers.splice(j, 1); break; } }\r\n this.httprequest.desktop.kvm.users.splice(i, 1);\r\n this.httprequest.desktop.kvm.connectionBar.removeAllListeners(\'close\');\r\n this.httprequest.desktop.kvm.connectionBar.close();\r\n this.httprequest.desktop.kvm.connectionBar = require(\'notifybar-desktop\')(this.httprequest.privacybartext.replace(\'{0}\', this.httprequest.desktop.kvm.rusers.join(\', \')).replace(\'{1}\', this.httprequest.desktop.kvm.users.join(\', \')), require(\'MeshAgent\')._tsid);\r\n this.httprequest.desktop.kvm.connectionBar.httprequest = this.httprequest;\r\n this.httprequest.desktop.kvm.connectionBar.on(\'close\', function () {\r\n MeshServerLogEx(29, null, "Remote Desktop Connection forcefully closed by local user (" + this.httprequest.remoteaddr + ")", this.httprequest);\r\n for (var i in this.httprequest.desktop.kvm._pipedStreams) {\r\n this.httprequest.desktop.kvm._pipedStreams[i].end();\r\n }\r\n this.httprequest.desktop.kvm.end();\r\n });\r\n break;\r\n }\r\n }\r\n }\r\n };\r\n if (this.httprequest.desktop.kvm.hasOwnProperty(\'connectionCount\')) {\r\n this.httprequest.desktop.kvm.connectionCount++;\r\n this.httprequest.desktop.kvm.rusers.push(this.httprequest.realname);\r\n this.httprequest.desktop.kvm.users.push(this.httprequest.username);\r\n this.httprequest.desktop.kvm.rusers.sort();\r\n this.httprequest.desktop.kvm.users.sort();\r\n } else {\r\n this.httprequest.desktop.kvm.connectionCount = 1;\r\n this.httprequest.desktop.kvm.rusers = [this.httprequest.realname];\r\n this.httprequest.desktop.kvm.users = [this.httprequest.username];\r\n }\r\n\r\n if ((this.httprequest.rights == 0xFFFFFFFF) || (((this.httprequest.rights & MESHRIGHT_REMOTECONTROL) != 0) && ((this.httprequest.rights & MESHRIGHT_REMOTEVIEW) == 0))) {\r\n // If we have remote control rights, pipe the KVM input\r\n this.pipe(this.httprequest.desktop.kvm, { dataTypeSkip: 1, end: false }); // 0 = Binary, 1 = Text. Pipe the Browser --> KVM input.\r\n } else {\r\n // We need to only pipe non-mouse & non-keyboard inputs.\r\n //sendConsoleText(\'Warning: No Remote Desktop Input Rights.\');\r\n // TODO!!!\r\n }\r\n\r\n // Perform notification if needed. Toast messages may not be supported on all platforms.\r\n if (this.httprequest.consent && (this.httprequest.consent & 8)) {\r\n // User Consent Prompt is required\r\n // Send a console message back using the console channel, "\\n" is supported.\r\n this.write(JSON.stringify({ ctrlChannel: \'102938\', type: \'console\', msg: "Waiting for user to grant access...", msgid: 1 }));\r\n var consentMessage = this.httprequest.realname + " requesting remote desktop access. Grant access?", consentTitle = \'MeshCentral\';\r\n if (this.httprequest.soptions != null) {\r\n if (this.httprequest.soptions.consentTitle != null) { consentTitle = this.httprequest.soptions.consentTitle; }\r\n if (this.httprequest.soptions.consentMsgDesktop != null) { consentMessage = this.httprequest.soptions.consentMsgDesktop.replace(\'{0}\', this.httprequest.realname).replace(\'{1}\', this.httprequest.username); }\r\n }\r\n var pr = require(\'message-box\').create(consentTitle, consentMessage, 30, null, tsid);\r\n pr.ws = this;\r\n this.pause();\r\n this._consentpromise = pr;\r\n this.prependOnceListener(\'end\', function () { if (this._consentpromise && this._consentpromise.close) { this._consentpromise.close(); } });\r\n pr.then(\r\n function () {\r\n // Success\r\n this.ws._consentpromise = null;\r\n MeshServerLogEx(30, null, "Starting remote desktop after local user accepted (" + this.ws.httprequest.remoteaddr + ")", this.ws.httprequest);\r\n this.ws.write(JSON.stringify({ ctrlChannel: \'102938\', type: \'console\', msg: null, msgid: 0 }));\r\n if (this.ws.httprequest.consent && (this.ws.httprequest.consent & 1)) {\r\n // User Notifications is required\r\n var notifyMessage = this.ws.httprequest.realname + " started a remote desktop session.", notifyTitle = "MeshCentral";\r\n if (this.ws.httprequest.soptions != null) {\r\n if (this.ws.httprequest.soptions.notifyTitle != null) { notifyTitle = this.ws.httprequest.soptions.notifyTitle; }\r\n if (this.ws.httprequest.soptions.notifyMsgDesktop != null) { notifyMessage = this.ws.httprequest.soptions.notifyMsgDesktop.replace(\'{0}\', this.ws.httprequest.realname).replace(\'{1}\', this.ws.httprequest.username); }\r\n }\r\n try { require(\'toaster\').Toast(notifyTitle, notifyMessage, tsid); } catch (e) { }\r\n }\r\n if (this.ws.httprequest.consent && (this.ws.httprequest.consent & 0x40)) {\r\n // Connection Bar is required\r\n if (this.ws.httprequest.desktop.kvm.connectionBar) {\r\n this.ws.httprequest.desktop.kvm.connectionBar.removeAllListeners(\'close\');\r\n this.ws.httprequest.desktop.kvm.connectionBar.close();\r\n }\r\n try {\r\n this.ws.httprequest.desktop.kvm.connectionBar = require(\'notifybar-desktop\')(this.ws.httprequest.privacybartext.replace(\'{0}\', this.ws.httprequest.desktop.kvm.rusers.join(\', \')).replace(\'{1}\', this.ws.httprequest.desktop.kvm.users.join(\', \')), require(\'MeshAgent\')._tsid);\r\n MeshServerLogEx(31, null, "Remote Desktop Connection Bar Activated/Updated (" + this.ws.httprequest.remoteaddr + ")", this.ws.httprequest);\r\n }\r\n catch (e) {\r\n if (process.platform != \'darwin\') {\r\n MeshServerLogEx(32, null, "Remote Desktop Connection Bar Failed or Not Supported (" + this.ws.httprequest.remoteaddr + ")", this.ws.httprequest);\r\n }\r\n }\r\n if (this.ws.httprequest.desktop.kvm.connectionBar) {\r\n this.ws.httprequest.desktop.kvm.connectionBar.httprequest = this.ws.httprequest;\r\n this.ws.httprequest.desktop.kvm.connectionBar.on(\'close\', function () {\r\n MeshServerLogEx(33, null, "Remote Desktop Connection forcefully closed by local user (" + this.httprequest.remoteaddr + ")", this.httprequest);\r\n for (var i in this.httprequest.desktop.kvm._pipedStreams) {\r\n this.httprequest.desktop.kvm._pipedStreams[i].end();\r\n }\r\n this.httprequest.desktop.kvm.end();\r\n });\r\n }\r\n }\r\n this.ws.httprequest.desktop.kvm.pipe(this.ws, { dataTypeSkip: 1 });\r\n this.ws.resume();\r\n },\r\n function (e) {\r\n // User Consent Denied/Failed\r\n this.ws._consentpromise = null;\r\n MeshServerLogEx(34, null, "Failed to start remote desktop after local user rejected (" + this.ws.httprequest.remoteaddr + ")", this.ws.httprequest);\r\n this.ws.end(JSON.stringify({ ctrlChannel: \'102938\', type: \'console\', msg: e.toString(), msgid: 2 }));\r\n });\r\n } else {\r\n // User Consent Prompt is not required\r\n if (this.httprequest.consent && (this.httprequest.consent & 1)) {\r\n // User Notifications is required\r\n MeshServerLogEx(35, null, "Started remote desktop with toast notification (" + this.httprequest.remoteaddr + ")", this.httprequest);\r\n var notifyMessage = this.httprequest.realname + " started a remote desktop session.", notifyTitle = "MeshCentral";\r\n if (this.httprequest.soptions != null) {\r\n if (this.httprequest.soptions.notifyTitle != null) { notifyTitle = this.httprequest.soptions.notifyTitle; }\r\n if (this.httprequest.soptions.notifyMsgDesktop != null) { notifyMessage = this.httprequest.soptions.notifyMsgDesktop.replace(\'{0}\', this.httprequest.realname).replace(\'{1}\', this.httprequest.username); }\r\n }\r\n try { require(\'toaster\').Toast(notifyTitle, notifyMessage, tsid); } catch (e) { }\r\n } else {\r\n MeshServerLogEx(36, null, "Started remote desktop without notification (" + this.httprequest.remoteaddr + ")", this.httprequest);\r\n }\r\n if (this.httprequest.consent && (this.httprequest.consent & 0x40)) {\r\n // Connection Bar is required\r\n if (this.httprequest.desktop.kvm.connectionBar) {\r\n this.httprequest.desktop.kvm.connectionBar.removeAllListeners(\'close\');\r\n this.httprequest.desktop.kvm.connectionBar.close();\r\n }\r\n try {\r\n this.httprequest.desktop.kvm.connectionBar = require(\'notifybar-desktop\')(this.httprequest.privacybartext.replace(\'{0}\', this.httprequest.desktop.kvm.rusers.join(\', \')).replace(\'{1}\', this.httprequest.desktop.kvm.users.join(\', \')), require(\'MeshAgent\')._tsid);\r\n MeshServerLogEx(37, null, "Remote Desktop Connection Bar Activated/Updated (" + this.httprequest.remoteaddr + ")", this.httprequest);\r\n }\r\n catch (e) {\r\n MeshServerLogEx(38, null, "Remote Desktop Connection Bar Failed or not Supported (" + this.httprequest.remoteaddr + ")", this.httprequest);\r\n }\r\n if (this.httprequest.desktop.kvm.connectionBar) {\r\n this.httprequest.desktop.kvm.connectionBar.httprequest = this.httprequest;\r\n this.httprequest.desktop.kvm.connectionBar.on(\'close\', function () {\r\n MeshServerLogEx(39, null, "Remote Desktop Connection forcefully closed by local user (" + this.httprequest.remoteaddr + ")", this.httprequest);\r\n for (var i in this.httprequest.desktop.kvm._pipedStreams) {\r\n this.httprequest.desktop.kvm._pipedStreams[i].end();\r\n }\r\n this.httprequest.desktop.kvm.end();\r\n });\r\n }\r\n }\r\n this.httprequest.desktop.kvm.pipe(this, { dataTypeSkip: 1 });\r\n }\r\n\r\n this.removeAllListeners(\'data\');\r\n this.on(\'data\', onTunnelControlData);\r\n //this.write(\'MeshCore KVM Hello!1\');\r\n\r\n } else if (this.httprequest.protocol == 5) {\r\n //\r\n // Remote Files\r\n //\r\n\r\n // Check user access rights for files\r\n if (((this.httprequest.rights & MESHRIGHT_REMOTECONTROL) == 0) || ((this.httprequest.rights != 0xFFFFFFFF) && ((this.httprequest.rights & MESHRIGHT_NOFILES) != 0))) {\r\n // Disengage this tunnel, user does not have the rights to do this!!\r\n this.httprequest.protocol = 999999;\r\n this.httprequest.s.end();\r\n sendConsoleText("Error: No files control rights.");\r\n return;\r\n }\r\n\r\n this.descriptorMetadata = "Remote Files";\r\n\r\n // Add the files session to the count to update the server\r\n if (this.httprequest.userid != null) {\r\n if (tunnelUserCount.files[this.httprequest.userid] == null) { tunnelUserCount.files[this.httprequest.userid] = 1; } else { tunnelUserCount.files[this.httprequest.userid]++; }\r\n try { mesh.SendCommand({ action: \'sessions\', type: \'files\', value: tunnelUserCount.files }); } catch (e) { }\r\n broadcastSessionsToRegisteredApps();\r\n }\r\n\r\n this.end = function () {\r\n // Remove the files session from the count to update the server\r\n if (this.httprequest.userid != null) {\r\n if (tunnelUserCount.files[this.httprequest.userid] != null) { tunnelUserCount.files[this.httprequest.userid]--; if (tunnelUserCount.files[this.httprequest.userid] <= 0) { delete tunnelUserCount.files[this.httprequest.userid]; } }\r\n try { mesh.SendCommand({ action: \'sessions\', type: \'files\', value: tunnelUserCount.files }); } catch (e) { }\r\n broadcastSessionsToRegisteredApps();\r\n }\r\n };\r\n\r\n // Perform notification if needed. Toast messages may not be supported on all platforms.\r\n if (this.httprequest.consent && (this.httprequest.consent & 32)) {\r\n // User Consent Prompt is required\r\n // Send a console message back using the console channel, "\\n" is supported.\r\n this.write(JSON.stringify({ ctrlChannel: \'102938\', type: \'console\', msg: "Waiting for user to grant access...", msgid: 1 }));\r\n var consentMessage = this.httprequest.realname + " requesting remote file Access. Grant access?", consentTitle = \'MeshCentral\';\r\n if (this.httprequest.soptions != null) {\r\n if (this.httprequest.soptions.consentTitle != null) { consentTitle = this.httprequest.soptions.consentTitle; }\r\n if (this.httprequest.soptions.consentMsgFiles != null) { consentMessage = this.httprequest.soptions.consentMsgFiles.replace(\'{0}\', this.httprequest.realname).replace(\'{1}\', this.httprequest.username); }\r\n }\r\n var pr = require(\'message-box\').create(consentTitle, consentMessage, 30);\r\n pr.ws = this;\r\n this.pause();\r\n this._consentpromise = pr;\r\n this.prependOnceListener(\'end\', function () { if (this._consentpromise && this._consentpromise.close) { this._consentpromise.close(); } });\r\n pr.then(\r\n function () {\r\n // Success\r\n this.ws._consentpromise = null;\r\n MeshServerLogEx(40, null, "Starting remote files after local user accepted (" + this.ws.httprequest.remoteaddr + ")", this.ws.httprequest);\r\n this.ws.write(JSON.stringify({ ctrlChannel: \'102938\', type: \'console\', msg: null }));\r\n if (this.ws.httprequest.consent && (this.ws.httprequest.consent & 4)) {\r\n // User Notifications is required\r\n var notifyMessage = this.ws.httprequest.realname + " started a remote file session.", notifyTitle = "MeshCentral";\r\n if (this.ws.httprequest.soptions != null) {\r\n if (this.ws.httprequest.soptions.notifyTitle != null) { notifyTitle = this.ws.httprequest.soptions.notifyTitle; }\r\n if (this.ws.httprequest.soptions.notifyMsgFiles != null) { notifyMessage = this.ws.httprequest.soptions.notifyMsgFiles.replace(\'{0}\', this.ws.httprequest.realname).replace(\'{1}\', this.ws.httprequest.username); }\r\n }\r\n try { require(\'toaster\').Toast(notifyTitle, notifyMessage); } catch (e) { }\r\n }\r\n this.ws.resume();\r\n },\r\n function (e) {\r\n // User Consent Denied/Failed\r\n this.ws._consentpromise = null;\r\n MeshServerLogEx(41, null, "Failed to start remote files after local user rejected (" + this.ws.httprequest.remoteaddr + ")", this.ws.httprequest);\r\n this.ws.end(JSON.stringify({ ctrlChannel: \'102938\', type: \'console\', msg: e.toString(), msgid: 2 }));\r\n });\r\n } else {\r\n // User Consent Prompt is not required\r\n if (this.httprequest.consent && (this.httprequest.consent & 4)) {\r\n // User Notifications is required\r\n MeshServerLogEx(42, null, "Started remote files with toast notification (" + this.httprequest.remoteaddr + ")", this.httprequest);\r\n var notifyMessage = this.httprequest.realname + " started a remote file session.", notifyTitle = "MeshCentral";\r\n if (this.httprequest.soptions != null) {\r\n if (this.httprequest.soptions.notifyTitle != null) { notifyTitle = this.httprequest.soptions.notifyTitle; }\r\n if (this.httprequest.soptions.notifyMsgFiles != null) { notifyMessage = this.httprequest.soptions.notifyMsgFiles.replace(\'{0}\', this.httprequest.realname).replace(\'{1}\', this.httprequest.username); }\r\n }\r\n try { require(\'toaster\').Toast(notifyTitle, notifyMessage); } catch (e) { }\r\n } else {\r\n MeshServerLogEx(43, null, "Started remote files without notification (" + this.httprequest.remoteaddr + ")", this.httprequest);\r\n }\r\n this.resume();\r\n }\r\n\r\n // Setup files\r\n // NOP\r\n }\r\n } else if (this.httprequest.protocol == 1) {\r\n // Send data into terminal stdin\r\n //this.write(data); // Echo back the keys (Does not seem to be a good idea)\r\n } else if (this.httprequest.protocol == 2) {\r\n // Send data into remote desktop\r\n if (this.httprequest.desktop.state == 0) {\r\n this.write(Buffer.from(String.fromCharCode(0x11, 0xFE, 0x00, 0x00, 0x4D, 0x45, 0x53, 0x48, 0x00, 0x00, 0x00, 0x00, 0x02)));\r\n this.httprequest.desktop.state = 1;\r\n } else {\r\n this.httprequest.desktop.write(data);\r\n }\r\n } else if (this.httprequest.protocol == 5) {\r\n // Process files commands\r\n var cmd = null;\r\n try { cmd = JSON.parse(data); } catch (e) { };\r\n if (cmd == null) { return; }\r\n if ((cmd.ctrlChannel == \'102938\') || ((cmd.type == \'offer\') && (cmd.sdp != null))) { onTunnelControlData(cmd, this); return; } // If this is control data, handle it now.\r\n if (cmd.action == undefined) { return; }\r\n //sendConsoleText(\'CMD: \' + JSON.stringify(cmd));\r\n\r\n if ((cmd.path != null) && (process.platform != \'win32\') && (cmd.path[0] != \'/\')) { cmd.path = \'/\' + cmd.path; } // Add \'/\' to paths on non-windows\r\n //console.log(objToString(cmd, 0, \' \'));\r\n switch (cmd.action) {\r\n case \'ls\': {\r\n /*\r\n // Close the watcher if required\r\n var samepath = ((this.httprequest.watcher != undefined) && (cmd.path == this.httprequest.watcher.path));\r\n if ((this.httprequest.watcher != undefined) && (samepath == false)) {\r\n //console.log(\'Closing watcher: \' + this.httprequest.watcher.path);\r\n //this.httprequest.watcher.close(); // TODO: This line causes the agent to crash!!!!\r\n delete this.httprequest.watcher;\r\n }\r\n */\r\n\r\n // Send the folder content to the browser\r\n var response = getDirectoryInfo(cmd.path);\r\n if (cmd.reqid != undefined) { response.reqid = cmd.reqid; }\r\n this.write(Buffer.from(JSON.stringify(response)));\r\n\r\n /*\r\n // Start the directory watcher\r\n if ((cmd.path != \'\') && (samepath == false)) {\r\n var watcher = fs.watch(cmd.path, onFileWatcher);\r\n watcher.tunnel = this.httprequest;\r\n watcher.path = cmd.path;\r\n this.httprequest.watcher = watcher;\r\n //console.log(\'Starting watcher: \' + this.httprequest.watcher.path);\r\n }\r\n */\r\n break;\r\n }\r\n case \'mkdir\': {\r\n // Create a new empty folder\r\n fs.mkdirSync(cmd.path);\r\n MeshServerLogEx(44, [cmd.path], "Create folder: \\"" + cmd.path + "\\"", this.httprequest);\r\n break;\r\n }\r\n case \'rm\': {\r\n // Delete, possibly recursive delete\r\n for (var i in cmd.delfiles) {\r\n var p = obj.path.join(cmd.path, cmd.delfiles[i]), delcount = 0;\r\n try { delcount = deleteFolderRecursive(p, cmd.rec); } catch (e) { }\r\n if ((delcount == 1) && !cmd.rec) {\r\n MeshServerLogEx(45, [p], "Delete: \\"" + p + "\\"", this.httprequest);\r\n } else {\r\n if (cmd.rec) {\r\n MeshServerLogEx(46, [p, delcount], "Delete recursive: \\"" + p + "\\", " + delcount + " element(s) removed", this.httprequest);\r\n } else {\r\n MeshServerLogEx(47, [p, delcount], "Delete: \\"" + p + "\\", " + delcount + " element(s) removed", this.httprequest);\r\n }\r\n }\r\n }\r\n break;\r\n }\r\n case \'markcoredump\': {\r\n // If we are asking for the coredump file, set the right path.\r\n var coreDumpPath = null;\r\n if (process.platform == \'win32\') {\r\n if (fs.existsSync(process.coreDumpLocation)) { coreDumpPath = process.coreDumpLocation; }\r\n } else {\r\n if ((process.cwd() != \'//\') && fs.existsSync(process.cwd() + \'core\')) { coreDumpPath = process.cwd() + \'core\'; }\r\n }\r\n if (coreDumpPath != null) { db.Put(\'CoreDumpTime\', require(\'fs\').statSync(coreDumpPath).mtime); }\r\n break;\r\n }\r\n case \'rename\':\r\n {\r\n // Rename a file or folder\r\n var oldfullpath = obj.path.join(cmd.path, cmd.oldname);\r\n var newfullpath = obj.path.join(cmd.path, cmd.newname);\r\n MeshServerLogEx(48, [oldfullpath, cmd.newname], \'Rename: \\"\' + oldfullpath + \'\\" to \\"\' + cmd.newname + \'\\"\', this.httprequest);\r\n try { fs.renameSync(oldfullpath, newfullpath); } catch (e) { console.log(e); }\r\n break;\r\n }\r\n case \'findfile\':\r\n {\r\n // Search for files\r\n var r = require(\'file-search\').find(\'"\' + cmd.path + \'"\', cmd.filter);\r\n if (!r.cancel) { r.cancel = function cancel() { this.child.kill(); }; }\r\n this._search = r;\r\n r.socket = this;\r\n r.socket.reqid = cmd.reqid; // Search request id. This is used to send responses and cancel the request.\r\n r.socket.path = cmd.path; // Search path\r\n r.on(\'result\', function (str) { try { this.socket.write(Buffer.from(JSON.stringify({ action: \'findfile\', r: str.substring(this.socket.path.length), reqid: this.socket.reqid }))); } catch (ex) { } });\r\n r.then(function () { try { this.socket.write(Buffer.from(JSON.stringify({ action: \'findfile\', r: null, reqid: this.socket.reqid }))); } catch (ex) { } });\r\n break;\r\n }\r\n case \'cancelfindfile\':\r\n {\r\n if (this._search) { this._search.cancel(); this._search = null; }\r\n break;\r\n }\r\n case \'download\':\r\n {\r\n // Download a file\r\n var sendNextBlock = 0;\r\n if (cmd.sub == \'start\') { // Setup the download\r\n if ((cmd.path == null) && (cmd.ask == \'coredump\')) { // If we are asking for the coredump file, set the right path.\r\n if (process.platform == \'win32\') {\r\n if (fs.existsSync(process.coreDumpLocation)) { cmd.path = process.coreDumpLocation; }\r\n } else {\r\n if ((process.cwd() != \'//\') && fs.existsSync(process.cwd() + \'core\')) { cmd.path = process.cwd() + \'core\'; }\r\n }\r\n }\r\n MeshServerLogEx((cmd.ask == \'coredump\') ? 104 : 49, [cmd.path], \'Download: \\"\' + cmd.path + \'\\"\', this.httprequest);\r\n if ((cmd.path == null) || (this.filedownload != null)) { this.write({ action: \'download\', sub: \'cancel\', id: this.filedownload.id }); delete this.filedownload; }\r\n this.filedownload = { id: cmd.id, path: cmd.path, ptr: 0 }\r\n try { this.filedownload.f = fs.openSync(this.filedownload.path, \'rbN\'); } catch (e) { this.write({ action: \'download\', sub: \'cancel\', id: this.filedownload.id }); delete this.filedownload; }\r\n if (this.filedownload) { this.write({ action: \'download\', sub: \'start\', id: cmd.id }); }\r\n } else if ((this.filedownload != null) && (cmd.id == this.filedownload.id)) { // Download commands\r\n if (cmd.sub == \'startack\') { sendNextBlock = ((typeof cmd.ack == \'number\') ? cmd.ack : 8); } else if (cmd.sub == \'stop\') { delete this.filedownload; } else if (cmd.sub == \'ack\') { sendNextBlock = 1; }\r\n }\r\n // Send the next download block(s)\r\n while (sendNextBlock > 0) {\r\n sendNextBlock--;\r\n var buf = Buffer.alloc(16384);\r\n var len = fs.readSync(this.filedownload.f, buf, 4, 16380, null);\r\n this.filedownload.ptr += len;\r\n if (len < 16380) { buf.writeInt32BE(0x01000001, 0); fs.closeSync(this.filedownload.f); delete this.filedownload; sendNextBlock = 0; } else { buf.writeInt32BE(0x01000000, 0); }\r\n this.write(buf.slice(0, len + 4)); // Write as binary\r\n }\r\n break;\r\n }\r\n case \'upload\':\r\n {\r\n // Upload a file, browser to agent\r\n if (this.httprequest.uploadFile != null) { fs.closeSync(this.httprequest.uploadFile); delete this.httprequest.uploadFile; }\r\n if (cmd.path == undefined) break;\r\n var filepath = cmd.name ? obj.path.join(cmd.path, cmd.name) : cmd.path;\r\n this.httprequest.uploadFilePath = filepath;\r\n this.httprequest.uploadFileSize = 0;\r\n try { this.httprequest.uploadFile = fs.openSync(filepath, \'wbN\'); } catch (e) { this.write(Buffer.from(JSON.stringify({ action: \'uploaderror\', reqid: cmd.reqid }))); break; }\r\n this.httprequest.uploadFileid = cmd.reqid;\r\n if (this.httprequest.uploadFile) { this.write(Buffer.from(JSON.stringify({ action: \'uploadstart\', reqid: this.httprequest.uploadFileid }))); }\r\n break;\r\n }\r\n case \'uploaddone\':\r\n {\r\n // Indicates that an upload is done\r\n if (this.httprequest.uploadFile) {\r\n MeshServerLogEx(105, [this.httprequest.uploadFilePath, this.httprequest.uploadFileSize], \'Upload: \\"\' + this.httprequest.uploadFilePath + \'\\", Size: \' + this.httprequest.uploadFileSize, this.httprequest);\r\n fs.closeSync(this.httprequest.uploadFile);\r\n this.write(Buffer.from(JSON.stringify({ action: \'uploaddone\', reqid: this.httprequest.uploadFileid }))); // Indicate that we closed the file.\r\n delete this.httprequest.uploadFile;\r\n delete this.httprequest.uploadFileid;\r\n delete this.httprequest.uploadFilePath;\r\n delete this.httprequest.uploadFileSize;\r\n }\r\n break;\r\n }\r\n case \'uploadcancel\':\r\n {\r\n // Indicates that an upload is canceled\r\n if (this.httprequest.uploadFile) {\r\n fs.closeSync(this.httprequest.uploadFile);\r\n fs.unlinkSync(this.httprequest.uploadFilePath);\r\n this.write(Buffer.from(JSON.stringify({ action: \'uploadcancel\', reqid: this.httprequest.uploadFileid }))); // Indicate that we closed the file.\r\n delete this.httprequest.uploadFile;\r\n delete this.httprequest.uploadFileid;\r\n delete this.httprequest.uploadFilePath;\r\n delete this.httprequest.uploadFileSize;\r\n }\r\n break;\r\n }\r\n case \'copy\':\r\n {\r\n // Copy a bunch of files from scpath to dspath\r\n for (var i in cmd.names) {\r\n var sc = obj.path.join(cmd.scpath, cmd.names[i]), ds = obj.path.join(cmd.dspath, cmd.names[i]);\r\n MeshServerLogEx(51, [sc, ds], \'Copy: \\"\' + sc + \'\\" to \\"\' + ds + \'\\"\', this.httprequest);\r\n if (sc != ds) { try { fs.copyFileSync(sc, ds); } catch (e) { } }\r\n }\r\n break;\r\n }\r\n case \'move\':\r\n {\r\n // Move a bunch of files from scpath to dspath\r\n for (var i in cmd.names) {\r\n var sc = obj.path.join(cmd.scpath, cmd.names[i]), ds = obj.path.join(cmd.dspath, cmd.names[i]);\r\n MeshServerLogEx(52, [sc, ds], \'Move: \\"\' + sc + \'\\" to \\"\' + ds + \'\\"\', this.httprequest);\r\n if (sc != ds) { try { fs.copyFileSync(sc, ds); fs.unlinkSync(sc); } catch (e) { } }\r\n }\r\n break;\r\n }\r\n case \'zip\':\r\n // Zip a bunch of files\r\n if (this.zip != null) return; // Zip operating is currently running, exit now.\r\n\r\n // Check that the specified files exist & build full paths\r\n var fp, stat, p = [];\r\n for (var i in cmd.files) { fp = cmd.path + \'/\' + cmd.files[i]; stat = null; try { stat = fs.statSync(fp); } catch (e) { } if (stat != null) { p.push(fp); } }\r\n if (p.length == 0) return; // No files, quit now.\r\n\r\n // Setup file compression\r\n var ofile = cmd.path + \'/\' + cmd.output;\r\n this.write(Buffer.from(JSON.stringify({ action: \'dialogmessage\', msg: \'zipping\' })));\r\n this.zipfile = ofile;\r\n delete this.zipcancel;\r\n var out = require(\'fs\').createWriteStream(ofile, { flags: \'wb\' });\r\n out.xws = this;\r\n out.on(\'close\', function () {\r\n this.xws.write(Buffer.from(JSON.stringify({ action: \'dialogmessage\', msg: null })));\r\n this.xws.write(Buffer.from(JSON.stringify({ action: \'refresh\' })));\r\n if (this.xws.zipcancel === true) { fs.unlinkSync(this.xws.zipfile); } // Delete the complete file.\r\n delete this.xws.zipcancel;\r\n delete this.xws.zipfile;\r\n delete this.xws.zip;\r\n });\r\n this.zip = require(\'zip-writer\').write({ files: p, basePath: cmd.path });\r\n this.zip.xws = this;\r\n this.zip.on(\'progress\', require(\'events\').moderated(function (name, p) { this.xws.write(Buffer.from(JSON.stringify({ action: \'dialogmessage\', msg: \'zippingFile\', file: ((process.platform == \'win32\') ? (name.split(\'/\').join(\'\\\\\')) : name), progress: p }))); }, 1000));\r\n this.zip.pipe(out);\r\n break;\r\n case \'cancel\':\r\n // Cancel zip operation if present\r\n try { this.zipcancel = true; this.zip.cancel(function () { }); } catch (e) { }\r\n this.zip = null;\r\n break;\r\n default:\r\n // Unknown action, ignore it.\r\n break;\r\n }\r\n } else if (this.httprequest.protocol == 7) { // Plugin data exchange\r\n var cmd = null;\r\n try { cmd = JSON.parse(data); } catch (e) { };\r\n if (cmd == null) { return; }\r\n if ((cmd.ctrlChannel == \'102938\') || ((cmd.type == \'offer\') && (cmd.sdp != null))) { onTunnelControlData(cmd, this); return; } // If this is control data, handle it now.\r\n if (cmd.action == undefined) return;\r\n\r\n switch (cmd.action) {\r\n case \'plugin\': {\r\n try { require(cmd.plugin).consoleaction(cmd, null, null, this); } catch (e) { throw e; }\r\n break;\r\n }\r\n default: {\r\n // probably shouldn\'t happen, but just in case this feature is expanded\r\n }\r\n }\r\n\r\n }\r\n //sendConsoleText("Got tunnel #" + this.httprequest.index + " data: " + data, this.httprequest.sessionid);\r\n }\r\n}\r\n\r\n// Delete a directory with a files and directories within it\r\nfunction deleteFolderRecursive(path, rec) {\r\n var count = 0;\r\n if (fs.existsSync(path)) {\r\n if (rec == true) {\r\n fs.readdirSync(obj.path.join(path, \'*\')).forEach(function (file, index) {\r\n var curPath = obj.path.join(path, file);\r\n if (fs.statSync(curPath).isDirectory()) { // recurse\r\n count += deleteFolderRecursive(curPath, true);\r\n } else { // delete file\r\n fs.unlinkSync(curPath);\r\n count++;\r\n }\r\n });\r\n }\r\n fs.unlinkSync(path);\r\n count++;\r\n }\r\n return count;\r\n}\r\n\r\n// Called when receiving control data on WebRTC\r\nfunction onTunnelWebRTCControlData(data) {\r\n if (typeof data != \'string\') return;\r\n var obj;\r\n try { obj = JSON.parse(data); } catch (e) { sendConsoleText(\'Invalid control JSON on WebRTC: \' + data); return; }\r\n if (obj.type == \'close\') {\r\n //sendConsoleText(\'Tunnel #\' + this.xrtc.websocket.tunnel.index + \' WebRTC control close\');\r\n try { this.close(); } catch (e) { }\r\n try { this.xrtc.close(); } catch (e) { }\r\n }\r\n}\r\n\r\n// Called when receiving control data on websocket\r\nfunction onTunnelControlData(data, ws) {\r\n var obj;\r\n if (ws == null) { ws = this; }\r\n if (typeof data == \'string\') { try { obj = JSON.parse(data); } catch (e) { sendConsoleText(\'Invalid control JSON: \' + data); return; } }\r\n else if (typeof data == \'object\') { obj = data; } else { return; }\r\n //sendConsoleText(\'onTunnelControlData(\' + ws.httprequest.protocol + \'): \' + JSON.stringify(data));\r\n //console.log(\'onTunnelControlData: \' + JSON.stringify(data));\r\n\r\n switch (obj.type) {\r\n case \'lock\': {\r\n // Look for a TSID\r\n var tsid = null;\r\n if ((ws.httprequest.xoptions != null) && (typeof ws.httprequest.xoptions.tsid == \'number\')) { tsid = ws.httprequest.xoptions.tsid; }\r\n\r\n // Lock the current user out of the desktop\r\n try {\r\n if (process.platform == \'win32\') {\r\n MeshServerLogEx(53, null, "Locking remote user out of desktop", ws.httprequest);\r\n var child = require(\'child_process\');\r\n child.execFile(process.env[\'windir\'] + \'\\\\system32\\\\cmd.exe\', [\'/c\', \'RunDll32.exe user32.dll,LockWorkStation\'], { type: 1, uid: tsid });\r\n }\r\n } catch (e) { }\r\n break;\r\n }\r\n case \'options\': {\r\n // These are additional connection options passed in the control channel.\r\n //sendConsoleText(\'options: \' + JSON.stringify(obj));\r\n delete obj.type;\r\n ws.httprequest.xoptions = obj;\r\n\r\n // Set additional user consent options if present\r\n if ((obj != null) && (typeof obj.consent == \'number\')) { ws.httprequest.consent |= obj.consent; }\r\n\r\n break;\r\n }\r\n case \'close\': {\r\n // We received the close on the websocket\r\n //sendConsoleText(\'Tunnel #\' + ws.tunnel.index + \' WebSocket control close\');\r\n try { ws.close(); } catch (e) { }\r\n break;\r\n }\r\n case \'termsize\': {\r\n // Indicates a change in terminal size\r\n if (process.platform == \'win32\') {\r\n if (ws.httprequest._dispatcher == null) return;\r\n //sendConsoleText(\'Win32-TermSize: \' + obj.cols + \'x\' + obj.rows);\r\n if (ws.httprequest._dispatcher.invoke) { ws.httprequest._dispatcher.invoke(\'resizeTerminal\', [obj.cols, obj.rows]); }\r\n } else {\r\n if (ws.httprequest.process == null || ws.httprequest.process.pty == 0) return;\r\n //sendConsoleText(\'Linux Resize: \' + obj.cols + \'x\' + obj.rows);\r\n\r\n if (ws.httprequest.process.tcsetsize) { ws.httprequest.process.tcsetsize(obj.rows, obj.cols); }\r\n }\r\n break;\r\n }\r\n case \'webrtc0\': { // Browser indicates we can start WebRTC switch-over.\r\n if (ws.httprequest.protocol == 1) { // Terminal\r\n // This is a terminal data stream, unpipe the terminal now and indicate to the other side that terminal data will no longer be received over WebSocket\r\n if (process.platform == \'win32\') {\r\n ws.httprequest._term.unpipe(ws);\r\n } else {\r\n ws.httprequest.process.stdout.unpipe(ws);\r\n ws.httprequest.process.stderr.unpipe(ws);\r\n }\r\n } else if (ws.httprequest.protocol == 2) { // Desktop\r\n // This is a KVM data stream, unpipe the KVM now and indicate to the other side that KVM data will no longer be received over WebSocket\r\n ws.httprequest.desktop.kvm.unpipe(ws);\r\n } else {\r\n // Switch things around so all WebRTC data goes to onTunnelData().\r\n ws.rtcchannel.httprequest = ws.httprequest;\r\n ws.rtcchannel.removeAllListeners(\'data\');\r\n ws.rtcchannel.on(\'data\', onTunnelData);\r\n }\r\n ws.write("{\\"ctrlChannel\\":\\"102938\\",\\"type\\":\\"webrtc1\\"}"); // End of data marker\r\n break;\r\n }\r\n case \'webrtc1\': {\r\n if ((ws.httprequest.protocol == 1) || (ws.httprequest.protocol == 6)) { // Terminal\r\n // Switch the user input from websocket to webrtc at this point.\r\n if (process.platform == \'win32\') {\r\n ws.unpipe(ws.httprequest._term);\r\n ws.rtcchannel.pipe(ws.httprequest._term, { dataTypeSkip: 1 }); // 0 = Binary, 1 = Text.\r\n } else {\r\n ws.unpipe(ws.httprequest.process.stdin);\r\n ws.rtcchannel.pipe(ws.httprequest.process.stdin, { dataTypeSkip: 1 }); // 0 = Binary, 1 = Text.\r\n }\r\n ws.resume(); // Resume the websocket to keep receiving control data\r\n } else if (ws.httprequest.protocol == 2) { // Desktop\r\n // Switch the user input from websocket to webrtc at this point.\r\n ws.unpipe(ws.httprequest.desktop.kvm);\r\n try { ws.webrtc.rtcchannel.pipe(ws.httprequest.desktop.kvm, { dataTypeSkip: 1, end: false }); } catch (e) { sendConsoleText(\'EX2\'); } // 0 = Binary, 1 = Text.\r\n ws.resume(); // Resume the websocket to keep receiving control data\r\n }\r\n ws.write(\'{\\"ctrlChannel\\":\\"102938\\",\\"type\\":\\"webrtc2\\"}\'); // Indicates we will no longer get any data on websocket, switching to WebRTC at this point.\r\n break;\r\n }\r\n case \'webrtc2\': {\r\n // Other side received websocket end of data marker, start sending data on WebRTC channel\r\n if ((ws.httprequest.protocol == 1) || (ws.httprequest.protocol == 6)) { // Terminal\r\n if (process.platform == \'win32\') {\r\n ws.httprequest._term.pipe(ws.webrtc.rtcchannel, { dataTypeSkip: 1, end: false }); // 0 = Binary, 1 = Text.\r\n } else {\r\n ws.httprequest.process.stdout.pipe(ws.webrtc.rtcchannel, { dataTypeSkip: 1, end: false }); // 0 = Binary, 1 = Text.\r\n ws.httprequest.process.stderr.pipe(ws.webrtc.rtcchannel, { dataTypeSkip: 1, end: false }); // 0 = Binary, 1 = Text.\r\n }\r\n } else if (ws.httprequest.protocol == 2) { // Desktop\r\n ws.httprequest.desktop.kvm.pipe(ws.webrtc.rtcchannel, { dataTypeSkip: 1 }); // 0 = Binary, 1 = Text.\r\n }\r\n break;\r\n }\r\n case \'offer\': {\r\n // This is a WebRTC offer.\r\n if ((ws.httprequest.protocol == 1) || (ws.httprequest.protocol == 6)) return; // TODO: Terminal is currently broken with WebRTC. Reject WebRTC upgrade for now.\r\n ws.webrtc = rtc.createConnection();\r\n ws.webrtc.websocket = ws;\r\n ws.webrtc.on(\'connected\', function () { /*sendConsoleText(\'Tunnel #\' + this.websocket.tunnel.index + \' WebRTC connected\');*/ });\r\n ws.webrtc.on(\'disconnected\', function () { /*sendConsoleText(\'Tunnel #\' + this.websocket.tunnel.index + \' WebRTC disconnected\');*/ });\r\n ws.webrtc.on(\'dataChannel\', function (rtcchannel) {\r\n //sendConsoleText(\'WebRTC Datachannel open, protocol: \' + this.websocket.httprequest.protocol);\r\n rtcchannel.maxFragmentSize = 32768;\r\n rtcchannel.xrtc = this;\r\n rtcchannel.websocket = this.websocket;\r\n this.rtcchannel = rtcchannel;\r\n this.websocket.rtcchannel = rtcchannel;\r\n this.websocket.rtcchannel.on(\'data\', onTunnelWebRTCControlData);\r\n this.websocket.rtcchannel.on(\'end\', function () {\r\n // The WebRTC channel closed, unpipe the KVM now. This is also done when the web socket closes.\r\n //sendConsoleText(\'Tunnel #\' + this.websocket.tunnel.index + \' WebRTC data channel closed\');\r\n if (this.websocket.desktop && this.websocket.desktop.kvm) {\r\n try {\r\n this.unpipe(this.websocket.desktop.kvm);\r\n this.websocket.httprequest.desktop.kvm.unpipe(this);\r\n }\r\n catch (e) { }\r\n }\r\n });\r\n this.websocket.write(\'{\\"ctrlChannel\\":\\"102938\\",\\"type\\":\\"webrtc0\\"}\'); // Indicate we are ready for WebRTC switch-over.\r\n });\r\n var sdp = null;\r\n try { sdp = ws.webrtc.setOffer(obj.sdp); } catch (e) { }\r\n if (sdp != null) { ws.write({ type: \'answer\', ctrlChannel: \'102938\', sdp: sdp }); }\r\n break;\r\n }\r\n case \'ping\': {\r\n ws.write("{\\"ctrlChannel\\":\\"102938\\",\\"type\\":\\"pong\\"}"); // Send pong response\r\n break;\r\n }\r\n case \'pong\': { // NOP\r\n break;\r\n }\r\n case \'rtt\': {\r\n ws.write({ type: \'rtt\', ctrlChannel: \'102938\', time: obj.time });\r\n break;\r\n }\r\n }\r\n}\r\n\r\n// Console state\r\nvar consoleWebSockets = {};\r\nvar consoleHttpRequest = null;\r\n\r\n// Console HTTP response\r\nfunction consoleHttpResponse(response) {\r\n response.data = function (data) { sendConsoleText(rstr2hex(buf2rstr(data)), this.sessionid); consoleHttpRequest = null; }\r\n response.close = function () { sendConsoleText(\'httprequest.response.close\', this.sessionid); consoleHttpRequest = null; }\r\n}\r\n\r\n// Open a web browser to a specified URL on current user\'s desktop\r\nfunction openUserDesktopUrl(url) {\r\n if ((url.toLowerCase().startsWith(\'http://\') == false) && (url.toLowerCase().startsWith(\'https://\') == false)) { return null; }\r\n var child = null;\r\n try {\r\n switch (process.platform) {\r\n case \'win32\':\r\n var uid = require(\'user-sessions\').consoleUid();\r\n var user = require(\'user-sessions\').getUsername(uid);\r\n var domain = require(\'user-sessions\').getDomain(uid);\r\n var taskoptions = { env: { _target: process.env[\'windir\'] + \'\\\\system32\\\\cmd.exe\', _args: \'/C START \' + url.split(\'&\').join(\'^&\'), _user: \'"\' + domain + \'\\\\\' + user + \'"\' } };\r\n for (var c1e in process.env) {\r\n taskoptions.env[c1e] = process.env[c1e];\r\n }\r\n var child = require(\'child_process\').execFile(process.env[\'windir\'] + \'\\\\System32\\\\WindowsPowerShell\\\\v1.0\\\\powershell.exe\', [\'powershell\', \'-noprofile\', \'-nologo\', \'-command\', \'-\'], taskoptions);\r\n child.stderr.on(\'data\', function (c) { });\r\n child.stdout.on(\'data\', function (c) { });\r\n child.stdin.write(\'SCHTASKS /CREATE /F /TN MeshChatTask /SC ONCE /ST 00:00 \');\r\n if (user) { child.stdin.write(\'/RU $env:_user \'); }\r\n child.stdin.write(\'/TR "$env:_target $env:_args"\\r\\n\');\r\n child.stdin.write(\'$ts = New-Object -ComObject Schedule.service\\r\\n\');\r\n child.stdin.write(\'$ts.connect()\\r\\n\');\r\n child.stdin.write(\'$tsfolder = $ts.getfolder("\\\\")\\r\\n\');\r\n child.stdin.write(\'$task = $tsfolder.GetTask("MeshChatTask")\\r\\n\');\r\n child.stdin.write(\'$taskdef = $task.Definition\\r\\n\');\r\n child.stdin.write(\'$taskdef.Settings.StopIfGoingOnBatteries = $false\\r\\n\');\r\n child.stdin.write(\'$taskdef.Settings.DisallowStartIfOnBatteries = $false\\r\\n\');\r\n child.stdin.write(\'$taskdef.Actions.Item(1).Path = $env:_target\\r\\n\');\r\n child.stdin.write(\'$taskdef.Actions.Item(1).Arguments = $env:_args\\r\\n\');\r\n child.stdin.write(\'$tsfolder.RegisterTaskDefinition($task.Name, $taskdef, 4, $null, $null, $null)\\r\\n\');\r\n\r\n child.stdin.write(\'SCHTASKS /RUN /TN MeshChatTask\\r\\n\');\r\n child.stdin.write(\'SCHTASKS /DELETE /F /TN MeshChatTask\\r\\nexit\\r\\n\');\r\n child.waitExit();\r\n break;\r\n case \'linux\':\r\n child = require(\'child_process\').execFile(\'/usr/bin/xdg-open\', [\'xdg-open\', url], { uid: require(\'user-sessions\').consoleUid() });\r\n break;\r\n case \'darwin\':\r\n child = require(\'child_process\').execFile(\'/usr/bin/open\', [\'open\', url], { uid: require(\'user-sessions\').consoleUid() });\r\n break;\r\n default:\r\n // Unknown platform, ignore this command.\r\n break;\r\n }\r\n } catch (e) { }\r\n return child;\r\n}\r\n\r\n// Process a mesh agent console command\r\nfunction processConsoleCommand(cmd, args, rights, sessionid) {\r\n try {\r\n var response = null;\r\n switch (cmd) {\r\n case \'help\': { // Displays available commands\r\n var fin = \'\', f = \'\', availcommands = \'agentupdate,errorlog,msh,timerinfo,coreinfo,coredump,service,fdsnapshot,fdcount,startupoptions,alert,agentsize,versions,help,info,osinfo,args,print,type,dbkeys,dbget,dbset,dbcompact,eval,parseuri,httpget,wslist,plugin,wsconnect,wssend,wsclose,notify,ls,ps,kill,netinfo,location,power,wakeonlan,setdebug,smbios,rawsmbios,toast,lock,users,openurl,getscript,getclip,setclip,log,av,cpuinfo,sysinfo,apf,scanwifi,wallpaper,agentmsg\';\r\n if (require(\'os\').dns != null) { availcommands += \',dnsinfo\'; }\r\n if (process.platform == \'win32\') { availcommands += \',cs,safemode,wpfhwacceleration,uac\'; }\r\n if (amt != null) { availcommands += \',amt,amtconfig,amtevents\'; }\r\n if (process.platform != \'freebsd\') { availcommands += \',vm\'; }\r\n if (require(\'MeshAgent\').maxKvmTileSize != null) { availcommands += \',kvmmode\'; }\r\n try { require(\'zip-reader\'); availcommands += \',zip,unzip\'; } catch (e) { }\r\n\r\n availcommands = availcommands.split(\',\').sort();\r\n while (availcommands.length > 0) {\r\n if (f.length > 90) { fin += (f + \',\\r\\n\'); f = \'\'; }\r\n f += (((f != \'\') ? \', \' : \' \') + availcommands.shift());\r\n }\r\n if (f != \'\') { fin += f; }\r\n response = "Available commands: \\r\\n" + fin + ".";\r\n break;\r\n }\r\n case \'cs\':\r\n if (process.platform != \'win32\') {\r\n response = \'Unknown command "cs", type "help" for list of avaialble commands.\';\r\n break;\r\n }\r\n switch (args[\'_\'].length) {\r\n case 0:\r\n try {\r\n var cs = require(\'win-registry\').QueryKey(require(\'win-registry\').HKEY.LocalMachine, \'System\\\\CurrentControlSet\\\\Control\\\\Power\', \'CsEnabled\');\r\n response = "Connected Standby: " + (cs == 1 ? "ENABLED" : "DISABLED");\r\n }\r\n catch (e) {\r\n response = "This machine does not support Connected Standby";\r\n }\r\n break;\r\n case 1:\r\n if ((args[\'_\'][0].toUpperCase() != \'ENABLE\' && args[\'_\'][0].toUpperCase() != \'DISABLE\')) {\r\n response = "Proper usage:\\r\\n cs [ENABLE|DISABLE]";\r\n }\r\n else {\r\n try {\r\n var cs = require(\'win-registry\').QueryKey(require(\'win-registry\').HKEY.LocalMachine, \'System\\\\CurrentControlSet\\\\Control\\\\Power\', \'CsEnabled\');\r\n require(\'win-registry\').WriteKey(require(\'win-registry\').HKEY.LocalMachine, \'System\\\\CurrentControlSet\\\\Control\\\\Power\', \'CsEnabled\', args[\'_\'][0].toUpperCase() == \'ENABLE\' ? 1 : 0);\r\n\r\n cs = require(\'win-registry\').QueryKey(require(\'win-registry\').HKEY.LocalMachine, \'System\\\\CurrentControlSet\\\\Control\\\\Power\', \'CsEnabled\');\r\n response = "Connected Standby: " + (cs == 1 ? "ENABLED" : "DISABLED");\r\n }\r\n catch (e) {\r\n response = "This machine does not support Connected Standby";\r\n }\r\n }\r\n break;\r\n default:\r\n response = "Proper usage:\\r\\n cs [ENABLE|DISABLE]";\r\n break;\r\n }\r\n break;\r\n case \'assistant\':\r\n if (process.platform == \'win32\') {\r\n // Install MeshCentral Assistant on this device\r\n response = "Usage: Assistant [info|install|uninstall]";\r\n if (args[\'_\'].length == 1) {\r\n if ((args[\'_\'][0] == \'install\') || (args[\'_\'][0] == \'info\')) { response = \'\'; require(\'MeshAgent\').SendCommand({ action: \'meshToolInfo\', sessionid: sessionid, name: \'MeshCentralAssistant\', cookie: true, tag: args[\'_\'][0] }); }\r\n // TODO: Uninstall\r\n }\r\n } else {\r\n response = "MeshCentral Assistant is not supported on this platform.";\r\n }\r\n break;\r\n case \'agentupdate\':\r\n require(\'MeshAgent\').SendCommand({ action: \'agentupdate\', sessionid: sessionid });\r\n break;\r\n case \'agentupdateex\':\r\n // Perform an direct agent update without requesting any information from the server, this should not typically be used.\r\n if (args[\'_\'].length == 1) {\r\n if (args[\'_\'][0].startsWith(\'https://\')) { agentUpdate_Start(args[\'_\'][0], { sessionid: sessionid }); } else { response = "Usage: agentupdateex https://server/path"; }\r\n } else {\r\n agentUpdate_Start(null, { sessionid: sessionid });\r\n }\r\n break;\r\n case \'errorlog\':\r\n switch (args[\'_\'].length) {\r\n case 0:\r\n // All Error Logs\r\n response = JSON.stringify(require(\'util-agentlog\').read(), null, 1);\r\n break;\r\n case 1:\r\n // Error Logs, by either count or timestamp\r\n response = JSON.stringify(require(\'util-agentlog\').read(parseInt(args[\'_\'][0])), null, 1);\r\n break;\r\n default:\r\n response = "Proper usage:\\r\\n errorlog [lastCount|linuxEpoch]";\r\n break;\r\n }\r\n break;\r\n case \'msh\':\r\n response = JSON.stringify(_MSH(), null, 2);\r\n break;\r\n case \'dnsinfo\':\r\n if (require(\'os\').dns == null) {\r\n response = "Unknown command \\"" + cmd + "\\", type \\"help\\" for list of avaialble commands.";\r\n }\r\n else {\r\n response = \'DNS Servers: \';\r\n var dns = require(\'os\').dns();\r\n for (var i = 0; i < dns.length; ++i) {\r\n if (i > 0) { response += \', \'; }\r\n response += dns[i];\r\n }\r\n }\r\n break;\r\n case \'timerinfo\':\r\n response = require(\'ChainViewer\').getTimerInfo();\r\n break;\r\n case \'find\':\r\n if (args[\'_\'].length <= 1) {\r\n response = "Proper usage:\\r\\n find root criteria [criteria2] [criteria n...]";\r\n }\r\n else {\r\n var root = args[\'_\'][0];\r\n var p = args[\'_\'].slice(1);\r\n var r = require(\'file-search\').find(root, p);\r\n r.sid = sessionid;\r\n r.on(\'result\', function (str) { sendConsoleText(str, this.sid); });\r\n r.then(function () { sendConsoleText(\'*** End Results ***\', this.sid); });\r\n response = "Find: [" + root + "] " + JSON.stringify(p);\r\n }\r\n break;\r\n case \'coreinfo\': {\r\n response = JSON.stringify(meshCoreObj, null, 2);\r\n break;\r\n }\r\n case \'coreinfoupdate\': {\r\n sendPeriodicServerUpdate();\r\n break;\r\n }\r\n case \'agentmsg\': {\r\n if (args[\'_\'].length == 0) {\r\n response = "Proper usage:\\r\\n agentmsg add \\"[message]\\" [iconIndex]\\r\\n agentmsg remove [index]\\r\\n agentmsg list"; // Display usage\r\n } else {\r\n if ((args[\'_\'][0] == \'add\') && (args[\'_\'].length > 1)) {\r\n var msgIndex = 1, iconIndex = 0;\r\n while (tunnelUserCount.msg[msgIndex] != null) { msgIndex++; }\r\n if (args[\'_\'].length >= 3) { try { iconIndex = parseInt(args[\'_\'][2]); } catch (e) { } }\r\n if (typeof iconIndex != \'number\') { iconIndex = 0; }\r\n tunnelUserCount.msg[msgIndex] = { msg: args[\'_\'][1], icon: iconIndex };\r\n response = \'Agent message \' + msgIndex + \' added.\';\r\n } else if ((args[\'_\'][0] == \'remove\') && (args[\'_\'].length > 1)) {\r\n var msgIndex = 0;\r\n try { msgIndex = parseInt(args[\'_\'][1]); } catch (x) { }\r\n if (tunnelUserCount.msg[msgIndex] == null) { response = "Message not found."; } else { delete tunnelUserCount.msg[msgIndex]; response = "Message removed."; }\r\n } else if (args[\'_\'][0] == \'list\') {\r\n response = JSON.stringify(tunnelUserCount.msg, null, 2);\r\n }\r\n try { mesh.SendCommand({ action: \'sessions\', type: \'msg\', value: tunnelUserCount.msg }); } catch (x) { }\r\n broadcastSessionsToRegisteredApps();\r\n }\r\n break;\r\n }\r\n case \'clearagentmsg\': {\r\n tunnelUserCount.msg = {};\r\n try { mesh.SendCommand({ action: \'sessions\', type: \'msg\', value: tunnelUserCount.msg }); } catch (x) { }\r\n broadcastSessionsToRegisteredApps();\r\n break;\r\n }\r\n case \'coredump\':\r\n if (args[\'_\'].length != 1) {\r\n response = "Proper usage: coredump on|off|status|clear"; // Display usage\r\n } else {\r\n switch (args[\'_\'][0].toLowerCase()) {\r\n case \'on\':\r\n process.coreDumpLocation = (process.platform == \'win32\') ? (process.execPath.replace(\'.exe\', \'.dmp\')) : (process.execPath + \'.dmp\');\r\n response = \'coredump is now on\';\r\n break;\r\n case \'off\':\r\n process.coreDumpLocation = null;\r\n response = \'coredump is now off\';\r\n break;\r\n case \'status\':\r\n response = \'coredump is: \' + ((process.coreDumpLocation == null) ? \'off\' : \'on\');\r\n if (process.coreDumpLocation != null) {\r\n if (process.platform == \'win32\') {\r\n if (fs.existsSync(process.coreDumpLocation)) {\r\n response += \'\\r\\n CoreDump present at: \' + process.coreDumpLocation;\r\n response += \'\\r\\n CoreDump Time: \' + new Date(fs.statSync(process.coreDumpLocation).mtime).getTime();\r\n response += \'\\r\\n Agent Time : \' + new Date(fs.statSync(process.execPath).mtime).getTime();\r\n }\r\n } else {\r\n if ((process.cwd() != \'//\') && fs.existsSync(process.cwd() + \'core\')) {\r\n response += \'\\r\\n CoreDump present at: \' + process.cwd() + \'core\';\r\n response += \'\\r\\n CoreDump Time: \' + new Date(fs.statSync(process.cwd() + \'core\').mtime).getTime();\r\n response += \'\\r\\n Agent Time : \' + new Date(fs.statSync(process.execPath).mtime).getTime();\r\n }\r\n }\r\n }\r\n break;\r\n case \'clear\':\r\n db.Put(\'CoreDumpTime\', null);\r\n response = \'coredump db cleared\';\r\n break;\r\n default:\r\n response = "Proper usage: coredump on|off|status"; // Display usage\r\n break;\r\n }\r\n }\r\n break;\r\n case \'service\':\r\n if (args[\'_\'].length != 1) {\r\n response = "Proper usage: service status|restart"; // Display usage\r\n }\r\n else {\r\n var svcname = process.platform == \'win32\' ? \'Mesh Agent\' : \'meshagent\';\r\n try {\r\n svcname = require(\'MeshAgent\').serviceName;\r\n }\r\n catch (x) {\r\n }\r\n var s = require(\'service-manager\').manager.getService(svcname);\r\n switch (args[\'_\'][0].toLowerCase()) {\r\n case \'status\':\r\n response = \'Service \' + (s.isRunning() ? (s.isMe() ? \'[SELF]\' : \'[RUNNING]\') : (\'[NOT RUNNING]\'));\r\n break;\r\n case \'restart\':\r\n if (s.isMe()) {\r\n s.restart();\r\n }\r\n else {\r\n response = \'Restarting another agent instance is not allowed\';\r\n }\r\n break;\r\n default:\r\n response = "Proper usage: service status|restart"; // Display usage\r\n break;\r\n }\r\n if (process.platform == \'win32\') { s.close(); }\r\n }\r\n break;\r\n case \'zip\':\r\n if (args[\'_\'].length == 0) {\r\n response = "Proper usage: zip (output file name), input1 [, input n]"; // Display usage\r\n } else {\r\n var p = args[\'_\'].join(\' \').split(\',\');\r\n var ofile = p.shift();\r\n sendConsoleText(\'Writing \' + ofile + \'...\');\r\n var out = require(\'fs\').createWriteStream(ofile, { flags: \'wb\' });\r\n out.fname = ofile;\r\n out.sessionid = sessionid;\r\n out.on(\'close\', function () { sendConsoleText(\'DONE writing \' + this.fname, this.sessionid); });\r\n var zip = require(\'zip-writer\').write({ files: p });\r\n zip.pipe(out);\r\n }\r\n break;\r\n case \'unzip\':\r\n if (args[\'_\'].length == 0) {\r\n response = "Proper usage: unzip input, destination"; // Display usage\r\n } else {\r\n var p = args[\'_\'].join(\' \').split(\',\');\r\n if (p.length != 2) { response = "Proper usage: unzip input, destination"; break; } // Display usage\r\n var prom = require(\'zip-reader\').read(p[0]);\r\n prom._dest = p[1];\r\n prom.self = this;\r\n prom.sessionid = sessionid;\r\n prom.then(function (zipped) {\r\n sendConsoleText(\'Extracting to \' + this._dest + \'...\', this.sessionid);\r\n zipped.extractAll(this._dest).then(function () { sendConsoleText(\'finished unzipping\', this.sessionid); }, function (e) { sendConsoleText(\'Error unzipping: \' + e, this.sessionid); }).parentPromise.sessionid = this.sessionid;\r\n }, function (e) { sendConsoleText(\'Error unzipping: \' + e, this.sessionid); });\r\n }\r\n break;\r\n case \'setbattery\':\r\n // require(\'MeshAgent\').SendCommand({ action: \'battery\', state: \'dc\', level: 55 });\r\n if ((args[\'_\'].length > 0) && ((args[\'_\'][0] == \'ac\') || (args[\'_\'][0] == \'dc\'))) {\r\n var b = { action: \'battery\', state: args[\'_\'][0] };\r\n if (args[\'_\'].length == 2) { b.level = parseInt(args[\'_\'][1]); }\r\n require(\'MeshAgent\').SendCommand(b);\r\n } else {\r\n require(\'MeshAgent\').SendCommand({ action: \'battery\' });\r\n }\r\n break;\r\n case \'fdsnapshot\':\r\n require(\'ChainViewer\').getSnapshot().then(function (c) { sendConsoleText(c, this.sessionid); }).parentPromise.sessionid = sessionid;\r\n break;\r\n case \'fdcount\':\r\n require(\'DescriptorEvents\').getDescriptorCount().then(\r\n function (c) {\r\n sendConsoleText(\'Descriptor Count: \' + c, this.sessionid);\r\n }, function (e) {\r\n sendConsoleText(\'Error fetching descriptor count: \' + e, this.sessionid);\r\n }).parentPromise.sessionid = sessionid;\r\n break;\r\n case \'uac\':\r\n if (process.platform != \'win32\') {\r\n response = \'Unknown command "uac", type "help" for list of avaialble commands.\';\r\n break;\r\n }\r\n if (args[\'_\'].length != 1) {\r\n response = \'Proper usage: uac [get|interactive|secure]\';\r\n }\r\n else {\r\n switch (args[\'_\'][0].toUpperCase()) {\r\n case \'GET\':\r\n var secd = require(\'win-registry\').QueryKey(require(\'win-registry\').HKEY.LocalMachine, \'Software\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\Policies\\\\System\', \'PromptOnSecureDesktop\');\r\n response = "UAC mode: " + (secd == 0 ? "Interactive Desktop" : "Secure Desktop");\r\n break;\r\n case \'INTERACTIVE\':\r\n try {\r\n require(\'win-registry\').WriteKey(require(\'win-registry\').HKEY.LocalMachine, \'Software\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\Policies\\\\System\', \'PromptOnSecureDesktop\', 0);\r\n response = \'UAC mode changed to: Interactive Desktop\';\r\n }\r\n catch (e) {\r\n response = "Unable to change UAC Mode";\r\n }\r\n break;\r\n case \'SECURE\':\r\n try {\r\n require(\'win-registry\').WriteKey(require(\'win-registry\').HKEY.LocalMachine, \'Software\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\Policies\\\\System\', \'PromptOnSecureDesktop\', 1);\r\n response = \'UAC mode changed to: Secure Desktop\';\r\n }\r\n catch (e) {\r\n response = "Unable to change UAC Mode";\r\n }\r\n break;\r\n default:\r\n response = \'Proper usage: uac [get|interactive|secure]\';\r\n break;\r\n }\r\n }\r\n break;\r\n case \'vm\':\r\n response = \'Virtual Machine = \' + require(\'identifiers\').isVM();\r\n break;\r\n case \'startupoptions\':\r\n response = JSON.stringify(require(\'MeshAgent\').getStartupOptions());\r\n break;\r\n case \'kvmmode\':\r\n if (require(\'MeshAgent\').maxKvmTileSize == null) {\r\n response = "Unknown command \\"kvmmode\\", type \\"help\\" for list of avaialble commands.";\r\n }\r\n else {\r\n if (require(\'MeshAgent\').maxKvmTileSize == 0) {\r\n response = \'KVM Mode: Full JUMBO\';\r\n }\r\n else {\r\n response = \'KVM Mode: \' + (require(\'MeshAgent\').maxKvmTileSize <= 65500 ? \'NO JUMBO\' : \'Partial JUMBO\');\r\n response += (\', TileLimit: \' + (require(\'MeshAgent\').maxKvmTileSize < 1024 ? (require(\'MeshAgent\').maxKvmTileSize + \' bytes\') : (Math.round(require(\'MeshAgent\').maxKvmTileSize / 1024) + \' Kbytes\')));\r\n }\r\n }\r\n break;\r\n case \'alert\':\r\n if (args[\'_\'].length == 0) {\r\n response = "Proper usage: alert TITLE, CAPTION [, TIMEOUT]"; // Display usage\r\n }\r\n else {\r\n var p = args[\'_\'].join(\' \').split(\',\');\r\n if (p.length < 2) {\r\n response = "Proper usage: alert TITLE, CAPTION [, TIMEOUT]"; // Display usage\r\n }\r\n else {\r\n this._alert = require(\'message-box\').create(p[0], p[1], p.length == 3 ? parseInt(p[2]) : 9999, 1);\r\n }\r\n }\r\n break;\r\n case \'agentsize\':\r\n var actualSize = Math.floor(require(\'fs\').statSync(process.execPath).size / 1024);\r\n if (process.platform == \'win32\') {\r\n // Check the Agent Uninstall MetaData for correctness, as the installer may have written an incorrect value\r\n var writtenSize = 0;\r\n try { writtenSize = require(\'win-registry\').QueryKey(require(\'win-registry\').HKEY.LocalMachine, \'Software\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\Uninstall\\\\MeshCentralAgent\', \'EstimatedSize\'); } catch (e) { response = e; }\r\n if (writtenSize != actualSize) {\r\n response = "Size updated from: " + writtenSize + " to: " + actualSize;\r\n try { require(\'win-registry\').WriteKey(require(\'win-registry\').HKEY.LocalMachine, \'Software\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\Uninstall\\\\MeshCentralAgent\', \'EstimatedSize\', actualSize); } catch (e) { response = e; }\r\n } else\r\n { response = "Agent Size: " + actualSize + " kb"; }\r\n } else\r\n { response = "Agent Size: " + actualSize + " kb"; }\r\n break;\r\n case \'versions\':\r\n response = JSON.stringify(process.versions, null, \' \');\r\n break;\r\n case \'wpfhwacceleration\':\r\n if (process.platform != \'win32\') { throw ("wpfhwacceleration setting is only supported on Windows"); }\r\n if (args[\'_\'].length != 1) {\r\n response = "Proper usage: wpfhwacceleration (ON|OFF|STATUS)"; // Display usage\r\n }\r\n else {\r\n var reg = require(\'win-registry\');\r\n var uname = require(\'user-sessions\').getUsername(require(\'user-sessions\').consoleUid());\r\n var key = reg.usernameToUserKey(uname);\r\n\r\n switch (args[\'_\'][0].toUpperCase()) {\r\n default:\r\n response = "Proper usage: wpfhwacceleration (ON|OFF|STATUS|DEFAULT)"; // Display usage\r\n break;\r\n case \'ON\':\r\n try {\r\n reg.WriteKey(reg.HKEY.Users, key + \'\\\\SOFTWARE\\\\Microsoft\\\\Avalon.Graphics\', \'DisableHWAcceleration\', 0);\r\n response = "OK";\r\n } catch (e) { response = "FAILED"; }\r\n break;\r\n case \'OFF\':\r\n try {\r\n reg.WriteKey(reg.HKEY.Users, key + \'\\\\SOFTWARE\\\\Microsoft\\\\Avalon.Graphics\', \'DisableHWAcceleration\', 1);\r\n response = \'OK\';\r\n } catch (e) { response = \'FAILED\'; }\r\n break;\r\n case \'STATUS\':\r\n var s;\r\n try { s = reg.QueryKey(reg.HKEY.Users, key + \'\\\\SOFTWARE\\\\Microsoft\\\\Avalon.Graphics\', \'DisableHWAcceleration\') == 1 ? \'DISABLED\' : \'ENABLED\'; } catch (e) { s = \'DEFAULT\'; }\r\n response = "WPF Hardware Acceleration: " + s;\r\n break;\r\n case \'DEFAULT\':\r\n try { reg.DeleteKey(reg.HKEY.Users, key + \'\\\\SOFTWARE\\\\Microsoft\\\\Avalon.Graphics\', \'DisableHWAcceleration\'); } catch (e) { }\r\n response = \'OK\';\r\n break;\r\n }\r\n }\r\n break;\r\n case \'tsid\':\r\n if (process.platform == \'win32\') {\r\n if (args[\'_\'].length != 1) {\r\n response = "TSID: " + (require(\'MeshAgent\')._tsid == null ? "console" : require(\'MeshAgent\')._tsid);\r\n } else {\r\n var i = parseInt(args[\'_\'][0]);\r\n require(\'MeshAgent\')._tsid = (isNaN(i) ? null : i);\r\n response = "TSID set to: " + (require(\'MeshAgent\')._tsid == null ? "console" : require(\'MeshAgent\')._tsid);\r\n }\r\n } else\r\n { response = "TSID command only supported on Windows"; }\r\n break;\r\n case \'activeusers\':\r\n if (process.platform == \'win32\') {\r\n var p = require(\'user-sessions\').enumerateUsers();\r\n p.sessionid = sessionid;\r\n p.then(function (u) {\r\n var v = [];\r\n for (var i in u) {\r\n if (u[i].State == \'Active\') { v.push({ tsid: i, type: u[i].StationName, user: u[i].Username, domain: u[i].Domain }); }\r\n }\r\n sendConsoleText(JSON.stringify(v, null, 1), this.sessionid);\r\n });\r\n } else\r\n { response = "activeusers command only supported on Windows"; }\r\n break;\r\n case \'wallpaper\':\r\n if (process.platform != \'win32\' && !(process.platform == \'linux\' && require(\'linux-gnome-helpers\').available)) {\r\n response = "wallpaper command not supported on this platform";\r\n }\r\n else {\r\n if (args[\'_\'].length != 1) {\r\n response = \'Proper usage: wallpaper (GET|TOGGLE)\'; // Display usage\r\n }\r\n else {\r\n switch (args[\'_\'][0].toUpperCase()) {\r\n default:\r\n response = \'Proper usage: wallpaper (GET|TOGGLE)\'; // Display usage\r\n break;\r\n case \'GET\':\r\n case \'TOGGLE\':\r\n if (process.platform == \'win32\') {\r\n var id = require(\'user-sessions\').getProcessOwnerName(process.pid).tsid == 0 ? 1 : 0;\r\n var child = require(\'child_process\').execFile(process.execPath, [process.execPath.split(\'\\\\\').pop(), \'-b64exec\', \'dmFyIFNQSV9HRVRERVNLV0FMTFBBUEVSID0gMHgwMDczOwp2YXIgU1BJX1NFVERFU0tXQUxMUEFQRVIgPSAweDAwMTQ7CnZhciBHTSA9IHJlcXVpcmUoJ19HZW5lcmljTWFyc2hhbCcpOwp2YXIgdXNlcjMyID0gR00uQ3JlYXRlTmF0aXZlUHJveHkoJ3VzZXIzMi5kbGwnKTsKdXNlcjMyLkNyZWF0ZU1ldGhvZCgnU3lzdGVtUGFyYW1ldGVyc0luZm9BJyk7CgppZiAocHJvY2Vzcy5hcmd2Lmxlbmd0aCA9PSAzKQp7CiAgICB2YXIgdiA9IEdNLkNyZWF0ZVZhcmlhYmxlKDEwMjQpOwogICAgdXNlcjMyLlN5c3RlbVBhcmFtZXRlcnNJbmZvQShTUElfR0VUREVTS1dBTExQQVBFUiwgdi5fc2l6ZSwgdiwgMCk7CiAgICBjb25zb2xlLmxvZyh2LlN0cmluZyk7CiAgICBwcm9jZXNzLmV4aXQoKTsKfQplbHNlCnsKICAgIHZhciBuYiA9IEdNLkNyZWF0ZVZhcmlhYmxlKHByb2Nlc3MuYXJndlszXSk7CiAgICB1c2VyMzIuU3lzdGVtUGFyYW1ldGVyc0luZm9BKFNQSV9TRVRERVNLV0FMTFBBUEVSLCBuYi5fc2l6ZSwgbmIsIDApOwogICAgcHJvY2Vzcy5leGl0KCk7Cn0=\'], { type: id });\r\n child.stdout.str = \'\'; child.stdout.on(\'data\', function (c) { this.str += c.toString(); });\r\n child.stderr.on(\'data\', function () { });\r\n child.waitExit();\r\n var current = child.stdout.str.trim();\r\n if (args[\'_\'][0].toUpperCase() == \'GET\') {\r\n response = current;\r\n break;\r\n }\r\n if (current != \'\') {\r\n require(\'MeshAgent\')._wallpaper = current;\r\n response = \'Wallpaper cleared\';\r\n } else {\r\n response = \'Wallpaper restored\';\r\n }\r\n child = require(\'child_process\').execFile(process.execPath, [process.execPath.split(\'\\\\\').pop(), \'-b64exec\', \'dmFyIFNQSV9HRVRERVNLV0FMTFBBUEVSID0gMHgwMDczOwp2YXIgU1BJX1NFVERFU0tXQUxMUEFQRVIgPSAweDAwMTQ7CnZhciBHTSA9IHJlcXVpcmUoJ19HZW5lcmljTWFyc2hhbCcpOwp2YXIgdXNlcjMyID0gR00uQ3JlYXRlTmF0aXZlUHJveHkoJ3VzZXIzMi5kbGwnKTsKdXNlcjMyLkNyZWF0ZU1ldGhvZCgnU3lzdGVtUGFyYW1ldGVyc0luZm9BJyk7CgppZiAocHJvY2Vzcy5hcmd2Lmxlbmd0aCA9PSAzKQp7CiAgICB2YXIgdiA9IEdNLkNyZWF0ZVZhcmlhYmxlKDEwMjQpOwogICAgdXNlcjMyLlN5c3RlbVBhcmFtZXRlcnNJbmZvQShTUElfR0VUREVTS1dBTExQQVBFUiwgdi5fc2l6ZSwgdiwgMCk7CiAgICBjb25zb2xlLmxvZyh2LlN0cmluZyk7CiAgICBwcm9jZXNzLmV4aXQoKTsKfQplbHNlCnsKICAgIHZhciBuYiA9IEdNLkNyZWF0ZVZhcmlhYmxlKHByb2Nlc3MuYXJndlszXSk7CiAgICB1c2VyMzIuU3lzdGVtUGFyYW1ldGVyc0luZm9BKFNQSV9TRVRERVNLV0FMTFBBUEVSLCBuYi5fc2l6ZSwgbmIsIDApOwogICAgcHJvY2Vzcy5leGl0KCk7Cn0=\', current != \'\' ? \'""\' : require(\'MeshAgent\')._wallpaper], { type: id });\r\n child.stdout.str = \'\'; child.stdout.on(\'data\', function (c) { this.str += c.toString(); });\r\n child.stderr.on(\'data\', function () { });\r\n child.waitExit();\r\n }\r\n else {\r\n var id = require(\'user-sessions\').consoleUid();\r\n var current = require(\'linux-gnome-helpers\').getDesktopWallpaper(id);\r\n if (args[\'_\'][0].toUpperCase() == \'GET\') {\r\n response = current;\r\n break;\r\n }\r\n if (current != \'/dev/null\') {\r\n require(\'MeshAgent\')._wallpaper = current;\r\n response = \'Wallpaper cleared\';\r\n } else {\r\n response = \'Wallpaper restored\';\r\n }\r\n require(\'linux-gnome-helpers\').setDesktopWallpaper(id, current != \'/dev/null\' ? undefined : require(\'MeshAgent\')._wallpaper);\r\n }\r\n break;\r\n }\r\n }\r\n }\r\n break;\r\n case \'safemode\':\r\n if (process.platform != \'win32\') {\r\n response = \'safemode only supported on Windows Platforms\'\r\n }\r\n else {\r\n if (args[\'_\'].length != 1) {\r\n response = \'Proper usage: safemode (ON|OFF|STATUS)\'; // Display usage\r\n }\r\n else {\r\n var svcname = process.platform == \'win32\' ? \'Mesh Agent\' : \'meshagent\';\r\n try {\r\n svcname = require(\'MeshAgent\').serviceName;\r\n }\r\n catch (x) {\r\n }\r\n\r\n switch (args[\'_\'][0].toUpperCase()) {\r\n default:\r\n response = \'Proper usage: safemode (ON|OFF|STATUS)\'; // Display usage\r\n break;\r\n case \'ON\':\r\n require(\'win-bcd\').setKey(\'safeboot\', \'Network\');\r\n require(\'win-bcd\').enableSafeModeService(svcname);\r\n break;\r\n case \'OFF\':\r\n require(\'win-bcd\').deleteKey(\'safeboot\');\r\n break;\r\n case \'STATUS\':\r\n var nextboot = require(\'win-bcd\').getKey(\'safeboot\');\r\n if (nextboot) {\r\n switch (nextboot) {\r\n case \'Network\':\r\n case \'network\':\r\n nextboot = \'SAFE_MODE_NETWORK\';\r\n break;\r\n default:\r\n nextboot = \'SAFE_MODE\';\r\n break;\r\n }\r\n }\r\n response = \'Current: \' + require(\'win-bcd\').bootMode + \', NextBoot: \' + (nextboot ? nextboot : \'NORMAL\');\r\n break;\r\n }\r\n }\r\n }\r\n break;\r\n /*\r\n case \'border\':\r\n {\r\n if ((args[\'_\'].length == 1) && (args[\'_\'][0] == \'on\')) {\r\n if (meshCoreObj.users.length > 0) {\r\n obj.borderManager.Start(meshCoreObj.users[0]);\r\n response = \'Border blinking is on.\';\r\n } else {\r\n response = \'Cannot turn on border blinking, no logged in users.\';\r\n }\r\n } else if ((args[\'_\'].length == 1) && (args[\'_\'][0] == \'off\')) {\r\n obj.borderManager.Stop();\r\n response = \'Border blinking is off.\';\r\n } else {\r\n response = \'Proper usage: border "on|off"\'; // Display correct command usage\r\n }\r\n }\r\n break;\r\n */\r\n case \'av\':\r\n if (process.platform == \'win32\') {\r\n // Windows Command: "wmic /Namespace:\\\\root\\SecurityCenter2 Path AntiVirusProduct get /FORMAT:CSV"\r\n response = JSON.stringify(require(\'win-info\').av(), null, 1);\r\n } else {\r\n response = \'Not supported on the platform\';\r\n }\r\n break;\r\n case \'log\':\r\n if (args[\'_\'].length != 1) { response = \'Proper usage: log "sample text"\'; } else { MeshServerLog(args[\'_\'][0]); response = \'ok\'; }\r\n break;\r\n case \'getclip\':\r\n if (require(\'MeshAgent\').isService) {\r\n require(\'clipboard\').dispatchRead().then(function (str) { sendConsoleText(str, sessionid); });\r\n } else {\r\n require("clipboard").read().then(function (str) { sendConsoleText(str, sessionid); });\r\n }\r\n break;\r\n case \'setclip\': {\r\n if (args[\'_\'].length != 1) {\r\n response = \'Proper usage: setclip "sample text"\';\r\n } else {\r\n if (require(\'MeshAgent\').isService) {\r\n if (process.platform != \'win32\') {\r\n require(\'clipboard\').dispatchWrite(args[\'_\'][0]);\r\n }\r\n else {\r\n var tmp = "require(\'clipboard\')(\\"" + (args[\'_\'][0]).split(\'"\').join(\'\\\\"\') + \'");process.exit();\';\r\n tmp = Buffer.from(tmp).toString(\'base64\');\r\n\r\n var uid = require(\'user-sessions\').consoleUid();\r\n var user = require(\'user-sessions\').getUsername(uid);\r\n var domain = require(\'user-sessions\').getDomain(uid);\r\n\r\n var taskoptions = { env: { _target: process.execPath, _args: \'-b64exec \' + tmp, _user: domain + \'\\\\\' + user } };\r\n for (var c1e in process.env) {\r\n taskoptions.env[c1e] = process.env[c1e];\r\n }\r\n\r\n var child = require(\'child_process\').execFile(process.env[\'windir\'] + \'\\\\System32\\\\WindowsPowerShell\\\\v1.0\\\\powershell.exe\', [\'powershell\', \'-noprofile\', \'-nologo\', \'-command\', \'-\'], taskoptions);\r\n child.stderr.on(\'data\', function (c) { });\r\n child.stdout.on(\'data\', function (c) { });\r\n child.stdin.write(\'SCHTASKS /CREATE /F /TN MeshUserTask /SC ONCE /ST 00:00 \');\r\n child.stdin.write(\'/RU $env:_user \');\r\n\r\n child.stdin.write(\'/TR "$env:_target $env:_args"\\r\\n\');\r\n child.stdin.write(\'$ts = New-Object -ComObject Schedule.service\\r\\n\');\r\n child.stdin.write(\'$ts.connect()\\r\\n\');\r\n child.stdin.write(\'$tsfolder = $ts.getfolder("\\\\")\\r\\n\');\r\n child.stdin.write(\'$task = $tsfolder.GetTask("MeshUserTask")\\r\\n\');\r\n child.stdin.write(\'$taskdef = $task.Definition\\r\\n\');\r\n child.stdin.write(\'$taskdef.Settings.StopIfGoingOnBatteries = $false\\r\\n\');\r\n child.stdin.write(\'$taskdef.Settings.DisallowStartIfOnBatteries = $false\\r\\n\');\r\n child.stdin.write(\'$taskdef.Actions.Item(1).Path = $env:_target\\r\\n\');\r\n child.stdin.write(\'$taskdef.Actions.Item(1).Arguments = $env:_args\\r\\n\');\r\n child.stdin.write(\'$tsfolder.RegisterTaskDefinition($task.Name, $taskdef, 4, $null, $null, $null)\\r\\n\');\r\n\r\n child.stdin.write(\'SCHTASKS /RUN /TN MeshUserTask\\r\\n\');\r\n child.stdin.write(\'SCHTASKS /DELETE /F /TN MeshUserTask\\r\\nexit\\r\\n\');\r\n child.waitExit();\r\n }\r\n response = \'Setting clipboard to: "\' + args[\'_\'][0] + \'"\';\r\n }\r\n else {\r\n require("clipboard")(args[\'_\'][0]); response = \'Setting clipboard to: "\' + args[\'_\'][0] + \'"\';\r\n }\r\n }\r\n break;\r\n }\r\n case \'openurl\': {\r\n if (args[\'_\'].length != 1) { response = \'Proper usage: openurl (url)\'; } // Display usage\r\n else { if (openUserDesktopUrl(args[\'_\'][0]) == null) { response = \'Failed.\'; } else { response = \'Success.\'; } }\r\n break;\r\n }\r\n case \'users\': {\r\n if (meshCoreObj.users == null) { response = \'Active users are unknown.\'; } else { response = \'Active Users: \' + meshCoreObj.users.join(\', \') + \'.\'; }\r\n require(\'user-sessions\').enumerateUsers().then(function (u) { for (var i in u) { sendConsoleText(u[i]); } });\r\n break;\r\n }\r\n case \'toast\': {\r\n if (args[\'_\'].length < 1) { response = \'Proper usage: toast "message"\'; } else {\r\n if (require(\'MeshAgent\')._tsid == null) {\r\n require(\'toaster\').Toast(\'MeshCentral\', args[\'_\'][0]).then(sendConsoleText, sendConsoleText);\r\n }\r\n else {\r\n require(\'toaster\').Toast(\'MeshCentral\', args[\'_\'][0], require(\'MeshAgent\')._tsid).then(sendConsoleText, sendConsoleText);\r\n }\r\n }\r\n break;\r\n }\r\n case \'setdebug\': {\r\n if (args[\'_\'].length < 1) { response = \'Proper usage: setdebug (target), 0 = Disabled, 1 = StdOut, 2 = This Console, * = All Consoles, 4 = WebLog, 8 = Logfile\'; } // Display usage\r\n else { if (args[\'_\'][0] == \'*\') { console.setDestination(2); } else { console.setDestination(parseInt(args[\'_\'][0]), sessionid); } }\r\n break;\r\n }\r\n case \'ps\': {\r\n processManager.getProcesses(function (plist) {\r\n var x = \'\';\r\n for (var i in plist) { x += i + ((plist[i].user) ? (\', \' + plist[i].user) : \'\') + \', \' + plist[i].cmd + \'\\r\\n\'; }\r\n sendConsoleText(x, sessionid);\r\n });\r\n break;\r\n }\r\n case \'kill\': {\r\n if ((args[\'_\'].length < 1)) {\r\n response = \'Proper usage: kill [pid]\'; // Display correct command usage\r\n } else {\r\n process.kill(parseInt(args[\'_\'][0]));\r\n response = \'Killed process \' + args[\'_\'][0] + \'.\';\r\n }\r\n break;\r\n }\r\n case \'smbios\': {\r\n if (SMBiosTables == null) { response = \'SMBios tables not available.\'; } else { response = objToString(SMBiosTables, 0, \' \', true); }\r\n break;\r\n }\r\n case \'rawsmbios\': {\r\n if (SMBiosTablesRaw == null) { response = \'SMBios tables not available.\'; } else {\r\n response = \'\';\r\n for (var i in SMBiosTablesRaw) {\r\n var header = false;\r\n for (var j in SMBiosTablesRaw[i]) {\r\n if (SMBiosTablesRaw[i][j].length > 0) {\r\n if (header == false) { response += (\'Table type #\' + i + ((require(\'smbios\').smTableTypes[i] == null) ? \'\' : (\', \' + require(\'smbios\').smTableTypes[i]))) + \'\\r\\n\'; header = true; }\r\n response += (\' \' + SMBiosTablesRaw[i][j].toString(\'hex\')) + \'\\r\\n\';\r\n }\r\n }\r\n }\r\n }\r\n break;\r\n }\r\n case \'eval\': { // Eval JavaScript\r\n if (args[\'_\'].length < 1) {\r\n response = \'Proper usage: eval "JavaScript code"\'; // Display correct command usage\r\n } else {\r\n response = JSON.stringify(mesh.eval(args[\'_\'][0])); // This can only be run by trusted administrator.\r\n }\r\n break;\r\n }\r\n case \'uninstallagent\': // Uninstall this agent\r\n var agentName = process.platform == \'win32\' ? \'Mesh Agent\' : \'meshagent\';\r\n try {\r\n agentName = require(\'MeshAgent\').serviceName;\r\n }\r\n catch (x) {\r\n }\r\n\r\n if (!require(\'service-manager\').manager.getService(agentName).isMe()) {\r\n response = \'Uininstall failed, this instance is not the service instance\';\r\n } else {\r\n try { diagnosticAgent_uninstall(); } catch (e) { }\r\n var js = "require(\'service-manager\').manager.getService(\'" + agentName + "\').stop(); require(\'service-manager\').manager.uninstallService(\'" + agentName + "\'); process.exit();";\r\n this.child = require(\'child_process\').execFile(process.execPath, [process.platform == \'win32\' ? (process.execPath.split(\'\\\\\').pop()) : (process.execPath.split(\'/\').pop()), \'-b64exec\', Buffer.from(js).toString(\'base64\')], { type: 4, detached: true });\r\n }\r\n break;\r\n case \'notify\': { // Send a notification message to the mesh\r\n if (args[\'_\'].length != 1) {\r\n response = \'Proper usage: notify "message" [--session]\'; // Display correct command usage\r\n } else {\r\n var notification = { action: \'msg\', type: \'notify\', value: args[\'_\'][0], tag: \'console\' };\r\n if (args.session) { notification.sessionid = sessionid; } // If "--session" is specified, notify only this session, if not, the server will notify the mesh\r\n mesh.SendCommand(notification); // no sessionid or userid specified, notification will go to the entire mesh\r\n response = "ok";\r\n }\r\n break;\r\n }\r\n case \'cpuinfo\': { // Return system information\r\n // CPU & memory utilization\r\n pr = require(\'sysinfo\').cpuUtilization();\r\n pr.sessionid = sessionid;\r\n pr.then(function (data) {\r\n sendConsoleText(JSON.stringify(\r\n {\r\n cpu: data,\r\n memory: require(\'sysinfo\').memUtilization(),\r\n thermals: require(\'sysinfo\').thermals == null ? [] : require(\'sysinfo\').thermals()\r\n }, null, 1), this.sessionid);\r\n }, function (e) {\r\n sendConsoleText(e);\r\n });\r\n break;\r\n }\r\n case \'sysinfo\': { // Return system information\r\n getSystemInformation(function (results, err) {\r\n if (results == null) { sendConsoleText(err, this.sessionid); } else {\r\n sendConsoleText(JSON.stringify(results, null, 1), this.sessionid);\r\n }\r\n });\r\n break;\r\n }\r\n case \'info\': { // Return information about the agent and agent core module\r\n response = \'Current Core: \' + meshCoreObj.value + \'\\r\\nAgent Time: \' + Date() + \'.\\r\\nUser Rights: 0x\' + rights.toString(16) + \'.\\r\\nPlatform: \' + process.platform + \'.\\r\\nCapabilities: \' + meshCoreObj.caps + \'.\\r\\nServer URL: \' + mesh.ServerUrl + \'.\';\r\n if (amt != null) { response += \'\\r\\nBuilt-in LMS: \' + [\'Disabled\', \'Connecting..\', \'Connected\'][amt.lmsstate] + \'.\'; }\r\n if (meshCoreObj.osdesc) { response += \'\\r\\nOS: \' + meshCoreObj.osdesc + \'.\'; }\r\n response += \'\\r\\nModules: \' + addedModules.join(\', \') + \'.\';\r\n response += \'\\r\\nServer Connection: \' + mesh.isControlChannelConnected + \', State: \' + meshServerConnectionState + \'.\';\r\n var oldNodeId = db.Get(\'OldNodeId\');\r\n if (oldNodeId != null) { response += \'\\r\\nOldNodeID: \' + oldNodeId + \'.\'; }\r\n if (process.platform == \'linux\' || process.platform == \'freebsd\') { response += \'\\r\\nX11 support: \' + require(\'monitor-info\').kvm_x11_support + \'.\'; }\r\n //response += \'\\r\\Debug Console: \' + debugConsole + \'.\';\r\n break;\r\n }\r\n case \'osinfo\': { // Return the operating system information\r\n var i = 1;\r\n if (args[\'_\'].length > 0) { i = parseInt(args[\'_\'][0]); if (i > 8) { i = 8; } response = \'Calling \' + i + \' times.\'; }\r\n for (var j = 0; j < i; j++) {\r\n var pr = require(\'os\').name();\r\n pr.sessionid = sessionid;\r\n pr.then(function (v) {\r\n sendConsoleText("OS: " + v + (process.platform == \'win32\' ? (require(\'win-virtual-terminal\').supported ? \' [ConPTY: YES]\' : \' [ConPTY: NO]\') : \'\'), this.sessionid);\r\n });\r\n }\r\n break;\r\n }\r\n case \'args\': { // Displays parsed command arguments\r\n response = \'args \' + objToString(args, 0, \' \', true);\r\n break;\r\n }\r\n case \'print\': { // Print a message on the mesh agent console, does nothing when running in the background\r\n var r = [];\r\n for (var i in args[\'_\']) { r.push(args[\'_\'][i]); }\r\n console.log(r.join(\' \'));\r\n response = \'Message printed on agent console.\';\r\n break;\r\n }\r\n case \'type\': { // Returns the content of a file\r\n if (args[\'_\'].length == 0) {\r\n response = \'Proper usage: type (filepath) [maxlength]\'; // Display correct command usage\r\n } else {\r\n var max = 4096;\r\n if ((args[\'_\'].length > 1) && (typeof args[\'_\'][1] == \'number\')) { max = args[\'_\'][1]; }\r\n if (max > 4096) max = 4096;\r\n var buf = Buffer.alloc(max), fd = fs.openSync(args[\'_\'][0], "r"), r = fs.readSync(fd, buf, 0, max); // Read the file content\r\n response = buf.toString();\r\n var i = response.indexOf(\'\\n\');\r\n if ((i > 0) && (response[i - 1] != \'\\r\')) { response = response.split(\'\\n\').join(\'\\r\\n\'); }\r\n if (r == max) response += \'...\';\r\n fs.closeSync(fd);\r\n }\r\n break;\r\n }\r\n case \'dbkeys\': { // Return all data store keys\r\n response = JSON.stringify(db.Keys);\r\n break;\r\n }\r\n case \'dbget\': { // Return the data store value for a given key\r\n if (db == null) { response = \'Database not accessible.\'; break; }\r\n if (args[\'_\'].length != 1) {\r\n response = \'Proper usage: dbget (key)\'; // Display the value for a given database key\r\n } else {\r\n response = db.Get(args[\'_\'][0]);\r\n }\r\n break;\r\n }\r\n case \'dbset\': { // Set a data store key and value pair\r\n if (db == null) { response = \'Database not accessible.\'; break; }\r\n if (args[\'_\'].length != 2) {\r\n response = \'Proper usage: dbset (key) (value)\'; // Set a database key\r\n } else {\r\n var r = db.Put(args[\'_\'][0], args[\'_\'][1]);\r\n response = \'Key set: \' + r;\r\n }\r\n break;\r\n }\r\n case \'dbcompact\': { // Compact the data store\r\n if (db == null) { response = \'Database not accessible.\'; break; }\r\n var r = db.Compact();\r\n response = \'Database compacted: \' + r;\r\n break;\r\n }\r\n case \'httpget\': {\r\n if (consoleHttpRequest != null) {\r\n response = \'HTTP operation already in progress.\';\r\n } else {\r\n if (args[\'_\'].length != 1) {\r\n response = \'Proper usage: httpget (url)\';\r\n } else {\r\n var options = http.parseUri(args[\'_\'][0]);\r\n options.method = \'GET\';\r\n if (options == null) {\r\n response = \'Invalid url.\';\r\n } else {\r\n try { consoleHttpRequest = http.request(options, consoleHttpResponse); } catch (e) { response = \'Invalid HTTP GET request\'; }\r\n consoleHttpRequest.sessionid = sessionid;\r\n if (consoleHttpRequest != null) {\r\n consoleHttpRequest.end();\r\n response = \'HTTPGET \' + options.protocol + \'//\' + options.host + \':\' + options.port + options.path;\r\n }\r\n }\r\n }\r\n }\r\n break;\r\n }\r\n case \'wslist\': { // List all web sockets\r\n response = \'\';\r\n for (var i in consoleWebSockets) {\r\n var httprequest = consoleWebSockets[i];\r\n response += \'Websocket #\' + i + \', \' + httprequest.url + \'\\r\\n\';\r\n }\r\n if (response == \'\') { response = \'no websocket sessions.\'; }\r\n break;\r\n }\r\n case \'wsconnect\': { // Setup a web socket\r\n if (args[\'_\'].length == 0) {\r\n response = \'Proper usage: wsconnect (url)\\r\\nFor example: wsconnect wss://localhost:443/meshrelay.ashx?id=abc\'; // Display correct command usage\r\n } else {\r\n var httprequest = null;\r\n try {\r\n var options = http.parseUri(args[\'_\'][0].split(\'$\').join(\'%24\').split(\'@\').join(\'%40\')); // Escape the $ and @ characters in the URL\r\n options.rejectUnauthorized = 0;\r\n httprequest = http.request(options);\r\n } catch (e) { response = \'Invalid HTTP websocket request\'; }\r\n if (httprequest != null) {\r\n httprequest.upgrade = onWebSocketUpgrade;\r\n httprequest.on(\'error\', function (e) { sendConsoleText("ERROR: Unable to connect to: " + this.url + ", " + JSON.stringify(e)); });\r\n\r\n var index = 1;\r\n while (consoleWebSockets[index]) { index++; }\r\n httprequest.sessionid = sessionid;\r\n httprequest.index = index;\r\n httprequest.url = args[\'_\'][0];\r\n consoleWebSockets[index] = httprequest;\r\n response = \'New websocket session #\' + index;\r\n }\r\n }\r\n break;\r\n }\r\n case \'wssend\': { // Send data on a web socket\r\n if (args[\'_\'].length == 0) {\r\n response = \'Proper usage: wssend (socketnumber)\\r\\n\'; // Display correct command usage\r\n for (var i in consoleWebSockets) {\r\n var httprequest = consoleWebSockets[i];\r\n response += \'Websocket #\' + i + \', \' + httprequest.url + \'\\r\\n\';\r\n }\r\n } else {\r\n var i = parseInt(args[\'_\'][0]);\r\n var httprequest = consoleWebSockets[i];\r\n if (httprequest != undefined) {\r\n httprequest.s.write(args[\'_\'][1]);\r\n response = \'ok\';\r\n } else {\r\n response = \'Invalid web socket number\';\r\n }\r\n }\r\n break;\r\n }\r\n case \'wsclose\': { // Close a websocket\r\n if (args[\'_\'].length == 0) {\r\n response = \'Proper usage: wsclose (socketnumber)\'; // Display correct command usage\r\n } else {\r\n var i = parseInt(args[\'_\'][0]);\r\n var httprequest = consoleWebSockets[i];\r\n if (httprequest != undefined) {\r\n if (httprequest.s != null) { httprequest.s.end(); } else { httprequest.end(); }\r\n response = \'ok\';\r\n } else {\r\n response = \'Invalid web socket number\';\r\n }\r\n }\r\n break;\r\n }\r\n case \'tunnels\': { // Show the list of current tunnels\r\n response = \'\';\r\n for (var i in tunnels) { response += \'Tunnel #\' + i + \', \' + tunnels[i].url + \'\\r\\n\'; }\r\n if (response == \'\') { response = \'No websocket sessions.\'; }\r\n break;\r\n }\r\n case \'ls\': { // Show list of files and folders\r\n response = \'\';\r\n var xpath = \'*\';\r\n if (args[\'_\'].length > 0) { xpath = obj.path.join(args[\'_\'][0], \'*\'); }\r\n response = \'List of \' + xpath + \'\\r\\n\';\r\n var results = fs.readdirSync(xpath);\r\n for (var i = 0; i < results.length; ++i) {\r\n var stat = null, p = obj.path.join(args[\'_\'][0], results[i]);\r\n try { stat = fs.statSync(p); } catch (e) { }\r\n if ((stat == null) || (stat == undefined)) {\r\n response += (results[i] + "\\r\\n");\r\n } else {\r\n response += (results[i] + " " + ((stat.isDirectory()) ? "(Folder)" : "(File)") + "\\r\\n");\r\n }\r\n }\r\n break;\r\n }\r\n case \'lsx\': { // Show list of files and folders\r\n response = objToString(getDirectoryInfo(args[\'_\'][0]), 0, \' \', true);\r\n break;\r\n }\r\n case \'lock\': { // Lock the current user out of the desktop\r\n if (process.platform == \'win32\') { var child = require(\'child_process\'); child.execFile(process.env[\'windir\'] + \'\\\\system32\\\\cmd.exe\', [\'/c\', \'RunDll32.exe user32.dll,LockWorkStation\'], { type: 1 }); response = \'Ok\'; }\r\n else { response = \'Not supported on the platform\'; }\r\n break;\r\n }\r\n case \'amt\': { // Show Intel AMT status\r\n if (amt != null) {\r\n amt.getMeiState(9, function (state) {\r\n var resp = "Intel AMT not detected.";\r\n if (state != null) { resp = objToString(state, 0, \' \', true); }\r\n sendConsoleText(resp, sessionid);\r\n });\r\n } else {\r\n response = "Intel AMT not detected.";\r\n }\r\n break;\r\n }\r\n case \'netinfo\': { // Show network interface information\r\n var interfaces = require(\'os\').networkInterfaces();\r\n response = objToString(interfaces, 0, \' \', true);\r\n break;\r\n }\r\n case \'wakeonlan\': { // Send wake-on-lan\r\n if ((args[\'_\'].length != 1) || (args[\'_\'][0].length != 12)) {\r\n response = \'Proper usage: wakeonlan [mac], for example "wakeonlan 010203040506".\';\r\n } else {\r\n var count = sendWakeOnLanEx([args[\'_\'][0]]);\r\n sendWakeOnLanEx([args[\'_\'][0]]);\r\n sendWakeOnLanEx([args[\'_\'][0]]);\r\n response = \'Sending wake-on-lan on \' + count + \' interface(s).\';\r\n }\r\n break;\r\n }\r\n case \'sendall\': { // Send a message to all consoles on this mesh\r\n sendConsoleText(args[\'_\'].join(\' \'));\r\n break;\r\n }\r\n case \'power\': { // Execute a power action on this computer\r\n if (mesh.ExecPowerState == undefined) {\r\n response = \'Power command not supported on this agent.\';\r\n } else {\r\n if ((args[\'_\'].length == 0) || isNaN(Number(args[\'_\'][0]))) {\r\n response = \'Proper usage: power (actionNumber), where actionNumber is:\\r\\n LOGOFF = 1\\r\\n SHUTDOWN = 2\\r\\n REBOOT = 3\\r\\n SLEEP = 4\\r\\n HIBERNATE = 5\\r\\n DISPLAYON = 6\\r\\n KEEPAWAKE = 7\\r\\n BEEP = 8\\r\\n CTRLALTDEL = 9\\r\\n VIBRATE = 13\\r\\n FLASH = 14\'; // Display correct command usage\r\n } else {\r\n var r = mesh.ExecPowerState(Number(args[\'_\'][0]), Number(args[\'_\'][1]));\r\n response = \'Power action executed with return code: \' + r + \'.\';\r\n }\r\n }\r\n break;\r\n }\r\n case \'location\': {\r\n getIpLocationData(function (location) {\r\n sendConsoleText(objToString({ action: \'iplocation\', type: \'publicip\', value: location }, 0, \' \'));\r\n });\r\n break;\r\n }\r\n case \'parseuri\': {\r\n response = JSON.stringify(http.parseUri(args[\'_\'][0]));\r\n break;\r\n }\r\n case \'scanwifi\': {\r\n if (wifiScanner != null) {\r\n var wifiPresent = wifiScanner.hasWireless;\r\n if (wifiPresent) { response = "Perfoming Wifi scan..."; wifiScanner.Scan(); } else { response = "Wifi absent."; }\r\n } else\r\n { response = "Wifi module not present."; }\r\n break;\r\n }\r\n case \'modules\': {\r\n response = JSON.stringify(addedModules);\r\n break;\r\n }\r\n case \'listservices\': {\r\n var services = require(\'service-manager\').manager.enumerateService();\r\n response = JSON.stringify(services, null, 1);\r\n break;\r\n }\r\n case \'getscript\': {\r\n if (args[\'_\'].length != 1) {\r\n response = "Proper usage: getscript [scriptNumber].";\r\n } else {\r\n mesh.SendCommand({ action: \'getScript\', type: args[\'_\'][0] });\r\n }\r\n break;\r\n }\r\n case \'diagnostic\':\r\n {\r\n if (!mesh.DAIPC.listening) {\r\n response = \'Unable to bind to Diagnostic IPC, most likely because the path (\' + process.cwd() + \') is not on a local file system\';\r\n break;\r\n }\r\n var diag = diagnosticAgent_installCheck();\r\n if (diag) {\r\n if (args[\'_\'].length == 1 && args[\'_\'][0] == \'uninstall\') {\r\n diagnosticAgent_uninstall();\r\n response = \'Diagnostic Agent uninstalled\';\r\n }\r\n else {\r\n response = \'Diagnostic Agent installed at: \' + diag.appLocation();\r\n }\r\n }\r\n else {\r\n if (args[\'_\'].length == 1 && args[\'_\'][0] == \'install\') {\r\n diag = diagnosticAgent_installCheck(true);\r\n if (diag) {\r\n response = \'Diagnostic agent was installed at: \' + diag.appLocation();\r\n }\r\n else {\r\n response = \'Diagnostic agent installation failed\';\r\n }\r\n }\r\n else {\r\n response = \'Diagnostic Agent Not installed. To install: diagnostic install\';\r\n }\r\n }\r\n if (diag) { diag.close(); diag = null; }\r\n break;\r\n }\r\n case \'amtevents\': {\r\n if (obj.amtevents == null) { response = \'No events.\'; } else { response = obj.amtevents.join(\'\\r\\n\'); }\r\n break;\r\n }\r\n case \'amtconfig\': {\r\n if (amt == null) { response = "Intel AMT not detected."; break; }\r\n if (apftunnel != null) { response = "Intel AMT server tunnel already active"; break; }\r\n amt.getMeiState(15, function (state) {\r\n var rx = \'\';\r\n if ((state == null) || (state.ProvisioningState == null)) { rx = "Intel AMT not ready for configuration."; } else {\r\n var apfarg = {\r\n mpsurl: mesh.ServerUrl.replace(\'agent.ashx\', \'apf.ashx\'),\r\n mpsuser: Buffer.from(mesh.ServerInfo.MeshID, \'hex\').toString(\'base64\').substring(0, 16),\r\n mpspass: Buffer.from(mesh.ServerInfo.MeshID, \'hex\').toString(\'base64\').substring(0, 16),\r\n mpskeepalive: 60000,\r\n clientname: state.OsHostname,\r\n clientaddress: \'127.0.0.1\',\r\n clientuuid: state.UUID,\r\n conntype: 2, // 0 = CIRA, 1 = Relay, 2 = LMS. The correct value is 2 since we are performing an LMS relay, other values for testing.\r\n meiState: state // MEI state will be passed to MPS server\r\n };\r\n if ((state.UUID == null) || (state.UUID.length != 36)) {\r\n rx = "Unable to get Intel AMT UUID";\r\n } else {\r\n addAmtEvent(\'User LMS tunnel start.\');\r\n apftunnel = require(\'amt-apfclient\')({ debug: false }, apfarg);\r\n apftunnel.onJsonControl = handleApfJsonControl;\r\n apftunnel.onChannelClosed = function () { addAmtEvent(\'User LMS tunnel closed.\'); apftunnel = null; }\r\n try {\r\n apftunnel.connect();\r\n rx = "Started Intel AMT configuration";\r\n } catch (ex) {\r\n rx = JSON.stringify(ex);\r\n }\r\n }\r\n }\r\n if (rx != \'\') { require(\'MeshAgent\').SendCommand({ action: \'msg\', type: \'console\', value: rx }); }\r\n });\r\n break;\r\n }\r\n case \'apf\': {\r\n if (meshCoreObj.intelamt !== null) {\r\n if (args[\'_\'].length == 1) {\r\n var connType = -1, connTypeStr = args[\'_\'][0].toLowerCase();\r\n if (connTypeStr == \'lms\') { connType = 2; }\r\n if (connTypeStr == \'relay\') { connType = 1; }\r\n if (connTypeStr == \'cira\') { connType = 0; }\r\n if (connTypeStr == \'off\') { connType = -2; }\r\n if (connType >= 0) { // Connect\r\n var apfarg = {\r\n mpsurl: mesh.ServerUrl.replace(\'agent.ashx\', \'apf.ashx\'),\r\n mpsuser: Buffer.from(mesh.ServerInfo.MeshID, \'hex\').toString(\'base64\').substring(0, 16),\r\n mpspass: Buffer.from(mesh.ServerInfo.MeshID, \'hex\').toString(\'base64\').substring(0, 16),\r\n mpskeepalive: 60000,\r\n clientname: require(\'os\').hostname(),\r\n clientaddress: \'127.0.0.1\',\r\n clientuuid: meshCoreObj.intelamt.uuid,\r\n conntype: connType // 0 = CIRA, 1 = Relay, 2 = LMS. The correct value is 2 since we are performing an LMS relay, other values for testing.\r\n };\r\n if ((apfarg.clientuuid == null) || (apfarg.clientuuid.length != 36)) {\r\n response = "Unable to get Intel AMT UUID: " + apfarg.clientuuid;\r\n } else {\r\n apftunnel = require(\'amt-apfclient\')({ debug: false }, apfarg);\r\n apftunnel.onJsonControl = handleApfJsonControl;\r\n apftunnel.onChannelClosed = function () { apftunnel = null; }\r\n try {\r\n apftunnel.connect();\r\n response = "Started APF tunnel";\r\n } catch (e) {\r\n response = JSON.stringify(e);\r\n }\r\n }\r\n } else if (connType == -2) { // Disconnect\r\n try {\r\n apftunnel.disconnect();\r\n response = "Stopped APF tunnel";\r\n } catch (e) {\r\n response = JSON.stringify(e);\r\n }\r\n apftunnel = null;\r\n } else {\r\n response = "Invalid command.\\r\\nUse: apf lms|relay|cira|off";\r\n }\r\n } else {\r\n response = "APF tunnel is " + (apftunnel == null ? "off" : "on") + "\\r\\nUse: apf lms|relay|cira|off";\r\n }\r\n } else {\r\n response = "APF tunnel requires Intel AMT";\r\n }\r\n break;\r\n }\r\n case \'plugin\': {\r\n if (typeof args[\'_\'][0] == \'string\') {\r\n try {\r\n // Pass off the action to the plugin\r\n // for plugin creators, you\'ll want to have a plugindir/modules_meshcore/plugin.js\r\n // to control the output / actions here.\r\n response = require(args[\'_\'][0]).consoleaction(args, rights, sessionid, mesh);\r\n } catch (e) {\r\n response = "There was an error in the plugin (" + e + ")";\r\n }\r\n } else {\r\n response = "Proper usage: plugin [pluginName] [args].";\r\n }\r\n break;\r\n }\r\n default: { // This is an unknown command, return an error message\r\n response = "Unknown command \\"" + cmd + "\\", type \\"help\\" for list of avaialble commands.";\r\n break;\r\n }\r\n }\r\n } catch (e) { response = "Command returned an exception error: " + e; console.log(e); }\r\n if (response != null) { sendConsoleText(response, sessionid); }\r\n}\r\n\r\n// Send a mesh agent console command\r\nfunction sendConsoleText(text, sessionid) {\r\n if (typeof text == \'object\') { text = JSON.stringify(text); }\r\n if (debugConsole && ((sessionid == null) || (sessionid == \'pipe\'))) { broadcastToRegisteredApps({ cmd: \'console\', value: text }); }\r\n if (sessionid != \'pipe\') { require(\'MeshAgent\').SendCommand({ action: \'msg\', type: \'console\', value: text, sessionid: sessionid }); }\r\n}\r\n\r\n// Send a mesh agent message to server, placing a bubble/badge on the agent device\r\nfunction sendAgentMessage(msg, icon) {\r\n if (sendAgentMessage.messages == null) {\r\n sendAgentMessage.messages = {};\r\n sendAgentMessage.nextid = 1;\r\n }\r\n sendAgentMessage.messages[sendAgentMessage.nextid++] = { msg: msg, icon: icon };\r\n require(\'MeshAgent\').SendCommand({ action: \'sessions\', type: \'msg\', value: sendAgentMessage.messages });\r\n}\r\nfunction getOpenDescriptors() {\r\n switch (process.platform) {\r\n case "freebsd":\r\n var child = require(\'child_process\').execFile(\'/bin/sh\', [\'sh\']);\r\n child.stdout.str = \'\'; child.stdout.on(\'data\', function (c) { this.str += c.toString(); });\r\n child.stderr.on(\'data\', function (c) { });\r\n\r\n child.stdin.write("procstat -f " + process.pid + " | tr \'\\\\n\' \'`\' | awk -F\'`\' \'");\r\n child.stdin.write(\'{\');\r\n child.stdin.write(\' DEL="";\');\r\n child.stdin.write(\' printf "[";\');\r\n child.stdin.write(\' for(i=1;i 0) {\r\n fd = descriptors.pop();\r\n if (fd > 2) {\r\n libc.close(fd);\r\n }\r\n }\r\n}\r\nfunction linux_execv(name, agentfilename, sessionid) {\r\n var libs = require(\'monitor-info\').getLibInfo(\'libc\');\r\n var libc = null;\r\n\r\n if ((libs.length == 0 || libs.length == null) && require(\'MeshAgent\').ARCHID == 33) {\r\n var child = require(\'child_process\').execFile(\'/bin/sh\', [\'sh\']);\r\n child.stdout.str = \'\'; child.stdout.on(\'data\', function (c) { this.str += c.toString(); });\r\n child.stderr.str = \'\'; child.stderr.on(\'data\', function (c) { this.str += c.toString(); });\r\n child.stdin.write("ls /lib/libc.* | tr \'\\\\n\' \'`\' | awk -F\'`\' \'{ " + \' printf "["; DEL=""; for(i=1;i 0) {\r\n try {\r\n libc = require(\'_GenericMarshal\').CreateNativeProxy(libs.pop().path);\r\n break;\r\n }\r\n catch (e) {\r\n libc = null;\r\n continue;\r\n }\r\n }\r\n if (libc != null) {\r\n try {\r\n libc.CreateMethod(\'execv\');\r\n libc.CreateMethod(\'close\');\r\n }\r\n catch (e) {\r\n libc = null;\r\n }\r\n }\r\n\r\n if (libc == null) {\r\n // Couldn\'t find libc.so, fallback to using service manager to restart agent\r\n if (sessionid != null) { sendConsoleText(\'Restarting service via service-manager...\', sessionid) }\r\n try {\r\n // restart service\r\n var s = require(\'service-manager\').manager.getService(name);\r\n s.restart();\r\n }\r\n catch (zz) {\r\n sendConsoleText(\'Self Update encountered an error trying to restart service\', sessionid);\r\n sendAgentMessage(\'Self Update encountered an error trying to restart service\', 3);\r\n }\r\n return;\r\n }\r\n\r\n if (sessionid != null) { sendConsoleText(\'Restarting service via execv()...\', sessionid) }\r\n\r\n var i;\r\n var args;\r\n var argarr = [process.execPath];\r\n var argtmp = [];\r\n var path = require(\'_GenericMarshal\').CreateVariable(process.execPath);\r\n\r\n if (require(\'MeshAgent\').getStartupOptions != null) {\r\n var options = require(\'MeshAgent\').getStartupOptions();\r\n for (i in options) {\r\n argarr.push(\'--\' + i + \'="\' + options[i] + \'"\');\r\n }\r\n }\r\n\r\n args = require(\'_GenericMarshal\').CreateVariable((1 + argarr.length) * require(\'_GenericMarshal\').PointerSize);\r\n for (i = 0; i < argarr.length; ++i) {\r\n var arg = require(\'_GenericMarshal\').CreateVariable(argarr[i]);\r\n argtmp.push(arg);\r\n arg.pointerBuffer().copy(args.toBuffer(), i * require(\'_GenericMarshal\').PointerSize);\r\n }\r\n\r\n var descriptors = getOpenDescriptors();\r\n closeDescriptors(libc, descriptors);\r\n\r\n libc.execv(path, args);\r\n if (sessionid != null) { sendConsoleText(\'Self Update failed because execv() failed\', sessionid) }\r\n sendAgentMessage(\'Self Update failed because execv() failed\', 3);\r\n}\r\n\r\nfunction bsd_execv(name, agentfilename, sessionid) {\r\n var child = require(\'child_process\').execFile(\'/bin/sh\', [\'sh\']);\r\n child.stdout.str = \'\'; child.stdout.on(\'data\', function (c) { this.str += c.toString(); });\r\n child.stderr.str = \'\'; child.stderr.on(\'data\', function (c) { this.str += c.toString(); });\r\n child.stdin.write("cat /usr/lib/libc.so | awk \'");\r\n child.stdin.write(\'{\');\r\n child.stdin.write(\' a=split($0, tok, "(");\');\r\n child.stdin.write(\' if(a>1)\');\r\n child.stdin.write(\' {\');\r\n child.stdin.write(\' split(tok[2], b, ")");\');\r\n child.stdin.write(\' split(b[1], c, " ");\');\r\n child.stdin.write(\' print c[1];\');\r\n child.stdin.write(\' }\');\r\n child.stdin.write("}\'\\nexit\\n");\r\n child.waitExit();\r\n if (child.stdout.str.trim() == \'\') {\r\n if (sessionid != null) { sendConsoleText(\'Self Update failed because cannot find libc.so\', sessionid) }\r\n sendAgentMessage(\'Self Update failed because cannot find libc.so\', 3);\r\n return;\r\n }\r\n\r\n var libc = null;\r\n try {\r\n libc = require(\'_GenericMarshal\').CreateNativeProxy(child.stdout.str.trim());\r\n libc.CreateMethod(\'execv\');\r\n libc.CreateMethod(\'close\');\r\n }\r\n catch (e) {\r\n if (sessionid != null) { sendConsoleText(\'Self Update failed: \' + e.toString(), sessionid) }\r\n sendAgentMessage(\'Self Update failed: \' + e.toString(), 3);\r\n return;\r\n }\r\n\r\n var i;\r\n var path = require(\'_GenericMarshal\').CreateVariable(process.execPath);\r\n var argarr = [process.execPath];\r\n var argtmp = [];\r\n var args;\r\n var options = require(\'MeshAgent\').getStartupOptions();\r\n for (i in options) {\r\n argarr.push(\'--\' + i + \'="\' + options[i] + \'"\');\r\n }\r\n args = require(\'_GenericMarshal\').CreateVariable((1 + argarr.length) * require(\'_GenericMarshal\').PointerSize);\r\n for (i = 0; i < argarr.length; ++i) {\r\n var arg = require(\'_GenericMarshal\').CreateVariable(argarr[i]);\r\n argtmp.push(arg);\r\n arg.pointerBuffer().copy(args.toBuffer(), i * require(\'_GenericMarshal\').PointerSize);\r\n }\r\n\r\n if (sessionid != null) { sendConsoleText(\'Restarting service via execv()\', sessionid) }\r\n\r\n var descriptors = getOpenDescriptors();\r\n closeDescriptors(libc, descriptors);\r\n\r\n libc.execv(path, args);\r\n if (sessionid != null) { sendConsoleText(\'Self Update failed because execv() failed\', sessionid) }\r\n sendAgentMessage(\'Self Update failed because execv() failed\', 3);\r\n}\r\n\r\nfunction windows_execve(name, agentfilename, sessionid) {\r\n var libc;\r\n try {\r\n libc = require(\'_GenericMarshal\').CreateNativeProxy(\'msvcrt.dll\');\r\n libc.CreateMethod(\'_wexecve\');\r\n }\r\n catch (xx) {\r\n sendConsoleText(\'Self Update failed because msvcrt.dll is missing\', sessionid);\r\n sendAgentMessage(\'Self Update failed because msvcrt.dll is missing\', 3);\r\n return;\r\n }\r\n\r\n var cmd = require(\'_GenericMarshal\').CreateVariable(process.env[\'windir\'] + \'\\\\system32\\\\cmd.exe\', { wide: true });\r\n var args = require(\'_GenericMarshal\').CreateVariable(3 * require(\'_GenericMarshal\').PointerSize);\r\n var arg1 = require(\'_GenericMarshal\').CreateVariable(\'cmd.exe\', { wide: true });\r\n var arg2 = require(\'_GenericMarshal\').CreateVariable(\'/C wmic service "\' + name + \'" call stopservice & "\' + process.cwd() + agentfilename + \'.update.exe" -b64exec \' + \'dHJ5CnsKICAgIHZhciBzZXJ2aWNlTG9jYXRpb24gPSBwcm9jZXNzLmFyZ3YucG9wKCk7CiAgICByZXF1aXJlKCdwcm9jZXNzLW1hbmFnZXInKS5lbnVtZXJhdGVQcm9jZXNzZXMoKS50aGVuKGZ1bmN0aW9uIChwcm9jKQogICAgewogICAgICAgIGZvciAodmFyIHAgaW4gcHJvYykKICAgICAgICB7CiAgICAgICAgICAgIGlmIChwcm9jW3BdLnBhdGggPT0gc2VydmljZUxvY2F0aW9uKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBwcm9jZXNzLmtpbGwocHJvY1twXS5waWQpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHByb2Nlc3MuZXhpdCgpOwogICAgfSk7Cn0KY2F0Y2goZSkKewogICAgcHJvY2Vzcy5leGl0KCk7Cn0=\' +\r\n \' "\' + process.execPath + \'" & copy "\' + process.cwd() + agentfilename + \'.update.exe" "\' + process.execPath + \'" & wmic service "\' + name + \'" call startservice & erase "\' + process.cwd() + agentfilename + \'.update.exe"\', { wide: true });\r\n\r\n arg1.pointerBuffer().copy(args.toBuffer());\r\n arg2.pointerBuffer().copy(args.toBuffer(), require(\'_GenericMarshal\').PointerSize);\r\n\r\n libc._wexecve(cmd, args, 0);\r\n}\r\n\r\n// Start a JavaScript based Agent Self-Update\r\nfunction agentUpdate_Start(updateurl, updateoptions) {\r\n // If this value is null\r\n var sessionid = (updateoptions != null) ? updateoptions.sessionid : null; // If this is null, messages will be broadcast. Otherwise they will be unicasted\r\n\r\n // If the url starts with *, switch it to use the same protoco, host and port as the control channel.\r\n if (updateurl != null) {\r\n updateurl = getServerTargetUrlEx(updateurl);\r\n if (updateurl.startsWith("wss://")) { updateurl = "https://" + updateurl.substring(6); }\r\n }\r\n\r\n if (agentUpdate_Start._selfupdate != null) {\r\n // We were already called, so we will ignore this duplicate request\r\n if (sessionid != null) { sendConsoleText(\'Self update already in progress...\', sessionid); }\r\n }\r\n else {\r\n if (agentUpdate_Start._retryCount == null) { agentUpdate_Start._retryCount = 0; }\r\n if (require(\'MeshAgent\').ARCHID == null && updateurl == null) {\r\n // This agent doesn\'t have the ability to tell us which ARCHID it is, so we don\'t know which agent to pull\r\n sendConsoleText(\'Unable to initiate update, agent ARCHID is not defined\', sessionid);\r\n }\r\n else {\r\n var agentfilename = process.execPath.split(process.platform == \'win32\' ? \'\\\\\' : \'/\').pop(); // Local File Name, ie: MeshAgent.exe\r\n var name = require(\'MeshAgent\').serviceName;\r\n if (name == null) { name = (process.platform == \'win32\' ? \'Mesh Agent\' : \'meshagent\'); } // This is an older agent that doesn\'t expose the service name, so use the default\r\n try {\r\n var s = require(\'service-manager\').manager.getService(name);\r\n if (!s.isMe()) {\r\n if (process.platform == \'win32\') { s.close(); }\r\n sendConsoleText(\'Self Update cannot continue, this agent is not an instance of (\' + name + \')\', sessionid);\r\n return;\r\n }\r\n if (process.platform == \'win32\') { s.close(); }\r\n }\r\n catch (zz) {\r\n sendConsoleText(\'Self Update Failed because this agent is not an instance of (\' + name + \')\', sessionid);\r\n sendAgentMessage(\'Self Update Failed because this agent is not an instance of (\' + name + \')\', 3);\r\n return;\r\n }\r\n\r\n if ((sessionid != null) && (updateurl != null)) { sendConsoleText(\'Downloading update from: \' + updateurl, sessionid); }\r\n var options = require(\'http\').parseUri(updateurl != null ? updateurl : require(\'MeshAgent\').ServerUrl);\r\n options.protocol = \'https:\';\r\n if (updateurl == null) { options.path = (\'/meshagents?id=\' + require(\'MeshAgent\').ARCHID); sendConsoleText(\'Downloading update from: \' + options.path, sessionid); }\r\n options.rejectUnauthorized = false;\r\n options.checkServerIdentity = function checkServerIdentity(certs) {\r\n // If the tunnel certificate matches the control channel certificate, accept the connection\r\n try { if (require(\'MeshAgent\').ServerInfo.ControlChannelCertificate.digest == certs[0].digest) return; } catch (ex) { }\r\n try { if (require(\'MeshAgent\').ServerInfo.ControlChannelCertificate.fingerprint == certs[0].fingerprint) return; } catch (ex) { }\r\n\r\n // Check that the certificate is the one expected by the server, fail if not.\r\n if (checkServerIdentity.servertlshash == null) {\r\n if (require(\'MeshAgent\').ServerInfo == null || require(\'MeshAgent\').ServerInfo.ControlChannelCertificate == null) { return; }\r\n sendConsoleText(\'Self Update failed, because the url cannot be verified: \' + updateurl, sessionid);\r\n sendAgentMessage(\'Self Update failed, because the url cannot be verified: \' + updateurl, 3);\r\n throw new Error(\'BadCert\');\r\n }\r\n if (certs[0].digest == null) { return; }\r\n if ((checkServerIdentity.servertlshash != null) && (checkServerIdentity.servertlshash.toLowerCase() != certs[0].digest.split(\':\').join(\'\').toLowerCase())) {\r\n sendConsoleText(\'Self Update failed, because the supplied certificate does not match\', sessionid);\r\n sendAgentMessage(\'Self Update failed, because the supplied certificate does not match\', 3);\r\n throw new Error(\'BadCert\')\r\n }\r\n }\r\n options.checkServerIdentity.servertlshash = (updateoptions != null ? updateoptions.tlshash : null);\r\n agentUpdate_Start._selfupdate = require(\'https\').get(options);\r\n agentUpdate_Start._selfupdate.on(\'error\', function (e) {\r\n sendConsoleText(\'Self Update failed, because there was a problem trying to download the update from \' + updateurl, sessionid);\r\n sendAgentMessage(\'Self Update failed, because there was a problem trying to download the update from \' + updateurl, 3);\r\n agentUpdate_Start._selfupdate = null;\r\n });\r\n agentUpdate_Start._selfupdate.on(\'response\', function (img) {\r\n this._file = require(\'fs\').createWriteStream(agentfilename + (process.platform == \'win32\' ? \'.update.exe\' : \'.update\'), { flags: \'wb\' });\r\n this._filehash = require(\'SHA384Stream\').create();\r\n this._filehash.on(\'hash\', function (h) {\r\n if (updateoptions != null && updateoptions.hash != null) {\r\n if (updateoptions.hash.toLowerCase() == h.toString(\'hex\').toLowerCase()) {\r\n if (sessionid != null) { sendConsoleText(\'Download complete. HASH verified.\', sessionid); }\r\n }\r\n else {\r\n agentUpdate_Start._retryCount++;\r\n sendConsoleText(\'Self Update FAILED because the downloaded agent FAILED hash check (\' + agentUpdate_Start._retryCount + \'), URL: \' + updateurl, sessionid);\r\n sendAgentMessage(\'Self Update FAILED because the downloaded agent FAILED hash check (\' + agentUpdate_Start._retryCount + \'), URL: \' + updateurl, 3);\r\n agentUpdate_Start._selfupdate = null;\r\n\r\n if (agentUpdate_Start._retryCount < 4) {\r\n // Retry the download again\r\n sendConsoleText(\'Self Update will try again in 60 seconds...\', sessionid);\r\n agentUpdate_Start._timeout = setTimeout(agentUpdate_Start, 60000, updateurl, updateoptions);\r\n }\r\n else {\r\n sendConsoleText(\'Self Update giving up, too many failures...\', sessionid);\r\n sendAgentMessage(\'Self Update giving up, too many failures...\', 3);\r\n }\r\n return;\r\n }\r\n }\r\n else {\r\n sendConsoleText(\'Download complete. HASH=\' + h.toString(\'hex\'), sessionid);\r\n }\r\n\r\n // Send an indication to the server that we got the update download correctly.\r\n try { require(\'MeshAgent\').SendCommand({ action: \'agentupdatedownloaded\' }); } catch (e) { }\r\n\r\n if (sessionid != null) { sendConsoleText(\'Updating and restarting agent...\', sessionid); }\r\n if (process.platform == \'win32\') {\r\n // Use _wexecve() equivalent to perform the update\r\n windows_execve(name, agentfilename, sessionid);\r\n }\r\n else {\r\n var m = require(\'fs\').statSync(process.execPath).mode;\r\n require(\'fs\').chmodSync(process.cwd() + agentfilename + \'.update\', m);\r\n\r\n // remove binary\r\n require(\'fs\').unlinkSync(process.execPath);\r\n\r\n // copy update\r\n require(\'fs\').copyFileSync(process.cwd() + agentfilename + \'.update\', process.execPath);\r\n require(\'fs\').chmodSync(process.execPath, m);\r\n\r\n // erase update\r\n require(\'fs\').unlinkSync(process.cwd() + agentfilename + \'.update\');\r\n\r\n switch (process.platform) {\r\n case \'freebsd\':\r\n bsd_execv(name, agentfilename, sessionid);\r\n break;\r\n case \'linux\':\r\n linux_execv(name, agentfilename, sessionid);\r\n break;\r\n default:\r\n try {\r\n // restart service\r\n var s = require(\'service-manager\').manager.getService(name);\r\n s.restart();\r\n }\r\n catch (zz) {\r\n sendConsoleText(\'Self Update encountered an error trying to restart service\', sessionid);\r\n sendAgentMessage(\'Self Update encountered an error trying to restart service\', 3);\r\n }\r\n break;\r\n }\r\n }\r\n });\r\n img.pipe(this._file);\r\n img.pipe(this._filehash);\r\n });\r\n }\r\n }\r\n}\r\n\r\n\r\n\r\n\r\n// Called before the process exits\r\n//process.exit = function (code) { console.log("Exit with code: " + code.toString()); }\r\n\r\n// Called when the server connection state changes\r\nfunction handleServerConnection(state) {\r\n meshServerConnectionState = state;\r\n if (meshServerConnectionState == 0) {\r\n // Server disconnected\r\n if (selfInfoUpdateTimer != null) { clearInterval(selfInfoUpdateTimer); selfInfoUpdateTimer = null; }\r\n lastSelfInfo = null;\r\n } else {\r\n // Server connected, send mesh core information\r\n var oldNodeId = db.Get(\'OldNodeId\');\r\n if (oldNodeId != null) { mesh.SendCommand({ action: \'mc1migration\', oldnodeid: oldNodeId }); }\r\n\r\n // Send SMBios tables if present\r\n if (SMBiosTablesRaw != null) { mesh.SendCommand({ action: \'smbios\', value: SMBiosTablesRaw }); }\r\n\r\n // Update the server on with basic info, logged in users and more advanced stuff, like Intel ME and Network Settings\r\n meInfoStr = null;\r\n sendPeriodicServerUpdate(null, true);\r\n if (selfInfoUpdateTimer == null) {\r\n selfInfoUpdateTimer = setInterval(sendPeriodicServerUpdate, 1200000); // 20 minutes\r\n selfInfoUpdateTimer.metadata = \'meshcore (InfoUpdate Timer)\';\r\n }\r\n\r\n // Send any state messages\r\n if (Object.keys(tunnelUserCount.msg).length > 0) {\r\n try { mesh.SendCommand({ action: \'sessions\', type: \'msg\', value: tunnelUserCount.msg }); } catch (e) { }\r\n broadcastSessionsToRegisteredApps();\r\n }\r\n\r\n // Send update of registered applications to the server\r\n updateRegisteredAppsToServer();\r\n }\r\n\r\n // Send server state update to registered applications\r\n broadcastToRegisteredApps({ cmd: \'serverstate\', value: meshServerConnectionState, url: require(\'MeshAgent\').ConnectedServer });\r\n}\r\n\r\n// Update the server with the latest network interface information\r\nvar sendNetworkUpdateNagleTimer = null;\r\nfunction sendNetworkUpdateNagle() { if (sendNetworkUpdateNagleTimer != null) { clearTimeout(sendNetworkUpdateNagleTimer); sendNetworkUpdateNagleTimer = null; } sendNetworkUpdateNagleTimer = setTimeout(sendNetworkUpdate, 5000); }\r\nfunction sendNetworkUpdate(force) {\r\n sendNetworkUpdateNagleTimer = null;\r\n\r\n try {\r\n // Update the network interfaces information data\r\n var netInfo = { netif2: require(\'os\').networkInterfaces() };\r\n if (netInfo.netif2) {\r\n netInfo.action = \'netinfo\';\r\n var netInfoStr = JSON.stringify(netInfo);\r\n if ((force == true) || (clearGatewayMac(netInfoStr) != clearGatewayMac(lastNetworkInfo))) { mesh.SendCommand(netInfo); lastNetworkInfo = netInfoStr; }\r\n }\r\n } catch (ex) { }\r\n}\r\n\r\n// Called periodically to check if we need to send updates to the server\r\nfunction sendPeriodicServerUpdate(flags, force) {\r\n if (meshServerConnectionState == 0) return; // Not connected to server, do nothing.\r\n if (!flags) { flags = 0xFFFFFFFF; }\r\n\r\n // If we have a connected MEI, get Intel ME information\r\n if ((flags & 1) && (amt != null) && (amt.state == 2)) {\r\n delete meshCoreObj.intelamt;\r\n amt.getMeiState(9, function (meinfo) {\r\n meshCoreObj.intelamt = meinfo;\r\n meshCoreObj.intelamt.microlms = amt.lmsstate;\r\n meshCoreObjChanged();\r\n });\r\n }\r\n\r\n // Update network information\r\n if (flags & 2) { sendNetworkUpdateNagle(false); }\r\n\r\n // Update anti-virus information\r\n if ((flags & 4) && (process.platform == \'win32\')) {\r\n // Windows Command: "wmic /Namespace:\\\\root\\SecurityCenter2 Path AntiVirusProduct get /FORMAT:CSV"\r\n try { meshCoreObj.av = require(\'win-info\').av(); meshCoreObjChanged(); } catch (e) { av = null; } // Antivirus\r\n //if (process.platform == \'win32\') { try { meshCoreObj.pr = require(\'win-info\').pendingReboot(); meshCoreObjChanged(); } catch (e) { meshCoreObj.pr = null; } } // Pending reboot\r\n }\r\n if (process.platform == \'win32\') {\r\n if (require(\'MeshAgent\')._securitycenter == null) {\r\n try {\r\n require(\'MeshAgent\')._securitycenter = require(\'win-securitycenter\').status();\r\n meshCoreObj[\'wsc\'] = require(\'MeshAgent\')._securitycenter; // Windows Security Central (WSC)\r\n require(\'win-securitycenter\').on(\'changed\', function () {\r\n require(\'MeshAgent\')._securitycenter = require(\'win-securitycenter\').status();\r\n meshCoreObj[\'wsc\'] = require(\'MeshAgent\')._securitycenter; // Windows Security Central (WSC)\r\n require(\'MeshAgent\').SendCommand({ action: \'coreinfo\', wsc: require(\'MeshAgent\')._securitycenter });\r\n });\r\n } catch (e) { }\r\n }\r\n }\r\n\r\n // Send available data right now\r\n if (force) {\r\n meshCoreObj = sortObjRec(meshCoreObj);\r\n var x = JSON.stringify(meshCoreObj);\r\n if (x != LastPeriodicServerUpdate) {\r\n LastPeriodicServerUpdate = x;\r\n mesh.SendCommand(meshCoreObj);\r\n }\r\n }\r\n}\r\n\r\n// Once we are done collecting all the data, send to server if needed\r\nvar LastPeriodicServerUpdate = null;\r\nvar PeriodicServerUpdateNagleTimer = null;\r\nfunction meshCoreObjChanged() {\r\n if (PeriodicServerUpdateNagleTimer == null) {\r\n PeriodicServerUpdateNagleTimer = setTimeout(meshCoreObjChangedEx, 500);\r\n }\r\n}\r\nfunction meshCoreObjChangedEx() {\r\n PeriodicServerUpdateNagleTimer = null;\r\n meshCoreObj = sortObjRec(meshCoreObj);\r\n var x = JSON.stringify(meshCoreObj);\r\n if (x != LastPeriodicServerUpdate) {\r\n try { LastPeriodicServerUpdate = x; mesh.SendCommand(meshCoreObj); } catch (ex) { }\r\n }\r\n}\r\n\r\nfunction sortObjRec(o) { if ((typeof o != \'object\') || (Array.isArray(o))) return o; for (var i in o) { if (typeof o[i] == \'object\') { o[i] = sortObjRec(o[i]); } } return sortObj(o); }\r\nfunction sortObj(o) { return Object.keys(o).sort().reduce(function (result, key) { result[key] = o[key]; return result; }, {}); }\r\n\r\nfunction onWebSocketClosed() { sendConsoleText("WebSocket #" + this.httprequest.index + " closed.", this.httprequest.sessionid); delete consoleWebSockets[this.httprequest.index]; }\r\nfunction onWebSocketData(data) { sendConsoleText("Got WebSocket #" + this.httprequest.index + " data: " + data, this.httprequest.sessionid); }\r\nfunction onWebSocketSendOk() { sendConsoleText("WebSocket #" + this.index + " SendOK.", this.sessionid); }\r\n\r\nfunction onWebSocketUpgrade(response, s, head) {\r\n sendConsoleText("WebSocket #" + this.index + " connected.", this.sessionid);\r\n this.s = s;\r\n s.httprequest = this;\r\n s.end = onWebSocketClosed;\r\n s.data = onWebSocketData;\r\n}\r\n\r\nmesh.AddCommandHandler(handleServerCommand);\r\nmesh.AddConnectHandler(handleServerConnection);\r\n\r\n', - 'windows-recovery': '\u0000\u0000\u0000\u0000var addedModules = [];\r\ntry { addModule("win-console", "var TrayIconFlags={NIF_MESSAGE:1,NIF_ICON:2,NIF_TIP:4,NIF_STATE:8,NIF_INFO:16,NIF_GUID:32,NIF_REALTIME:64,NIF_SHOWTIP:128,NIM_ADD:0,NIM_MODIFY:1,NIM_DELETE:2,NIM_SETFOCUS:3,NIM_SETVERSION:4};var NOTIFYICON_VERSION_4=4;var MessageTypes={WM_APP:32768,WM_USER:1024};function WindowsConsole(){if(process.platform==\\"win32\\"){this._ObjectID=\\"win-console\\";this._Marshal=require(\\"_GenericMarshal\\");this._kernel32=this._Marshal.CreateNativeProxy(\\"kernel32.dll\\");this._user32=this._Marshal.CreateNativeProxy(\\"user32.dll\\");this._kernel32.CreateMethod(\\"GetConsoleWindow\\");this._kernel32.CreateMethod(\\"GetCurrentThread\\");this._user32.CreateMethod(\\"ShowWindow\\");this._user32.CreateMethod(\\"LoadImageA\\");this._user32.CreateMethod({method:\\"GetMessageA\\",threadDispatch:1});this._shell32=this._Marshal.CreateNativeProxy(\\"Shell32.dll\\");this._shell32.CreateMethod(\\"Shell_NotifyIconA\\");this._handle=this._kernel32.GetConsoleWindow();this.minimize=function(){this._user32.ShowWindow(this._handle,6)};this.restore=function(){this._user32.ShowWindow(this._handle,9)};this.hide=function(){this._user32.ShowWindow(this._handle,0)};this.show=function(){this._user32.ShowWindow(this._handle,5)};this._loadicon=function(c){var b=this._user32.LoadImageA(0,this._Marshal.CreateVariable(c),1,0,0,16|32768|64);return(b)};this.SetTrayIcon=function a(h){var b=this._Marshal.CreateVariable(this._Marshal.PointerSize==4?508:528);b.toBuffer().writeUInt32LE(b._size,0);var n=TrayIconFlags.NIF_TIP|TrayIconFlags.NIF_MESSAGE;h.filter=MessageTypes.WM_APP+1;b.Deref(this._Marshal.PointerSize==4?16:24,4).toBuffer().writeUInt32LE(h.filter);if(!h.noBalloon){n|=TrayIconFlags.NIF_INFO}if(h.icon){n|=TrayIconFlags.NIF_ICON;var c=b.Deref(this._Marshal.PointerSize==4?20:32,this._Marshal.PointerSize);h.icon.pointerBuffer().copy(c.toBuffer())}b.Deref(this._Marshal.PointerSize*2,4).toBuffer().writeUInt32LE(1);b.Deref(this._Marshal.PointerSize==4?12:20,4).toBuffer().writeUInt32LE(n);b.Deref(this._Marshal.PointerSize==4?416:432,4).toBuffer().writeUInt32LE(NOTIFYICON_VERSION_4);var m=b.Deref(this._Marshal.PointerSize==4?24:40,128);var k=b.Deref(this._Marshal.PointerSize==4?160:176,256);var l=b.Deref(this._Marshal.PointerSize==4?420:436,64);if(h.szTip){Buffer.from(h.szTip).copy(m.toBuffer())}if(h.szInfo){Buffer.from(h.szInfo).copy(k.toBuffer())}if(h.szInfoTitle){Buffer.from(h.szInfoTitle).copy(l.toBuffer())}var d=require(\\"win-message-pump\\");retVal={_ObjectID:\\"WindowsConsole.TrayIcon\\",MessagePump:new d(h)};var j=require(\\"events\\").inherits(retVal);j.createEvent(\\"ToastClicked\\");j.createEvent(\\"IconHover\\");j.createEvent(\\"ToastDismissed\\");retVal.Options=h;retVal.MessagePump.TrayIcon=retVal;retVal.MessagePump.NotifyData=b;retVal.MessagePump.WindowsConsole=this;retVal.MessagePump.on(\\"exit\\",function e(o){console.log(\\"Pump Exited\\");if(this.TrayIcon){this.TrayIcon.remove()}});retVal.MessagePump.on(\\"hwnd\\",function f(o){h.hwnd=o;o.pointerBuffer().copy(this.NotifyData.Deref(this.WindowsConsole._Marshal.PointerSize,this.WindowsConsole._Marshal.PointerSize).toBuffer());if(this.WindowsConsole._shell32.Shell_NotifyIconA(TrayIconFlags.NIM_ADD,this.NotifyData).Val==0){}});retVal.MessagePump.on(\\"message\\",function g(p){if(p.message==this.TrayIcon.Options.filter){var o=false;if(p.wparam==1&&p.lparam==1029){this.TrayIcon.emit(\\"ToastClicked\\");o=true}if(p.wparam==1&&p.lparam==512){this.TrayIcon.emit(\\"IconHover\\");o=true}if(this.TrayIcon.Options.balloonOnly&&p.wparam==1&&(p.lparam==1028||p.lparam==1029)){this.TrayIcon.emit(\\"ToastDismissed\\");this.TrayIcon.remove();o=true}}});retVal.remove=function i(){this.MessagePump.WindowsConsole._shell32.Shell_NotifyIconA(TrayIconFlags.NIM_DELETE,this.MessagePump.NotifyData);this.MessagePump.stop();delete this.MessagePump.TrayIcon;delete this.MessagePump};return(retVal)}}}module.exports=new WindowsConsole();"); addedModules.push("win-console"); } catch (e) { }\r\ntry { addModule("win-terminal", "var promise=require(\\"promise\\");var duplex=require(\\"stream\\").Duplex;var SW_HIDE=0;var SW_MINIMIZE=6;var STARTF_USESHOWWINDOW=1;var STD_INPUT_HANDLE=-10;var STD_OUTPUT_HANDLE=-11;var EVENT_CONSOLE_CARET=16385;var EVENT_CONSOLE_END_APPLICATION=16391;var WINEVENT_OUTOFCONTEXT=0;var WINEVENT_SKIPOWNPROCESS=2;var CREATE_NEW_PROCESS_GROUP=512;var EVENT_CONSOLE_UPDATE_REGION=16386;var EVENT_CONSOLE_UPDATE_SIMPLE=16387;var EVENT_CONSOLE_UPDATE_SCROLL=16388;var EVENT_CONSOLE_LAYOUT=16389;var EVENT_CONSOLE_START_APPLICATION=16390;var KEY_EVENT=1;var MAPVK_VK_TO_VSC=0;var WM_QUIT=18;var GM=require(\\"_GenericMarshal\\");var si=GM.CreateVariable(GM.PointerSize==4?68:104);var pi=GM.CreateVariable(GM.PointerSize==4?16:24);si.Deref(0,4).toBuffer().writeUInt32LE(GM.PointerSize==4?68:104);si.Deref(GM.PointerSize==4?48:64,2).toBuffer().writeUInt16LE(SW_HIDE|SW_MINIMIZE);si.Deref(GM.PointerSize==4?44:60,4).toBuffer().writeUInt32LE(STARTF_USESHOWWINDOW);var MSG=GM.CreateVariable(GM.PointerSize==4?28:48);function windows_terminal(){this._ObjectID=\\"windows_terminal\\";this._user32=GM.CreateNativeProxy(\\"User32.dll\\");this._user32.CreateMethod(\\"DispatchMessageA\\");this._user32.CreateMethod(\\"GetMessageA\\");this._user32.CreateMethod(\\"MapVirtualKeyA\\");this._user32.CreateMethod(\\"PostThreadMessageA\\");this._user32.CreateMethod(\\"SetWinEventHook\\");this._user32.CreateMethod(\\"ShowWindow\\");this._user32.CreateMethod(\\"TranslateMessage\\");this._user32.CreateMethod(\\"UnhookWinEvent\\");this._user32.CreateMethod(\\"VkKeyScanA\\");this._user32.terminal=this;this._kernel32=GM.CreateNativeProxy(\\"Kernel32.dll\\");this._kernel32.CreateMethod(\\"AllocConsole\\");this._kernel32.CreateMethod(\\"CreateProcessA\\");this._kernel32.CreateMethod(\\"CloseHandle\\");this._kernel32.CreateMethod(\\"FillConsoleOutputAttribute\\");this._kernel32.CreateMethod(\\"FillConsoleOutputCharacterA\\");this._kernel32.CreateMethod(\\"GetConsoleScreenBufferInfo\\");this._kernel32.CreateMethod(\\"GetConsoleWindow\\");this._kernel32.CreateMethod(\\"GetLastError\\");this._kernel32.CreateMethod(\\"GetStdHandle\\");this._kernel32.CreateMethod(\\"GetThreadId\\");this._kernel32.CreateMethod(\\"ReadConsoleOutputA\\");this._kernel32.CreateMethod(\\"SetConsoleCursorPosition\\");this._kernel32.CreateMethod(\\"SetConsoleScreenBufferSize\\");this._kernel32.CreateMethod(\\"SetConsoleWindowInfo\\");this._kernel32.CreateMethod(\\"TerminateProcess\\");this._kernel32.CreateMethod(\\"WaitForSingleObject\\");this._kernel32.CreateMethod(\\"WriteConsoleInputA\\");var b=0;var c=0;this._scrx=0;this._scry=0;this.SendCursorUpdate=function(){var g=GM.CreateVariable(22);if(this._kernel32.GetConsoleScreenBufferInfo(this._stdoutput,g).Val==0){return}if(g.Deref(4,2).toBuffer().readUInt16LE()!=this.currentX||g.Deref(6,2).toBuffer().readUInt16LE()!=this.currentY){this.currentX=g.Deref(4,2).toBuffer().readUInt16LE();this.currentY=g.Deref(6,2).toBuffer().readUInt16LE()}};this.ClearScreen=function(){var h=GM.CreateVariable(22);if(this._kernel32.GetConsoleScreenBufferInfo(this._stdoutput,h).Val==0){return}var i=GM.CreateVariable(4);var j=h.Deref(0,2).toBuffer().readUInt16LE(0)*h.Deref(2,2).toBuffer().readUInt16LE(0);var g=GM.CreateVariable(4);if(this._kernel32.FillConsoleOutputCharacterA(this._stdoutput,32,j,i.Deref(0,4).toBuffer().readUInt32LE(),g).Val==0){return}if(this._kernel32.GetConsoleScreenBufferInfo(this._stdoutput,h).Val==0){return}if(this._kernel32.FillConsoleOutputAttribute(this._stdoutput,h.Deref(8,2).toBuffer().readUInt16LE(0),j,i.Deref(0,4).toBuffer().readUInt32LE(),g).Val==0){return}this._kernel32.SetConsoleCursorPosition(this._stdoutput,i.Deref(0,4).toBuffer().readUInt32LE());var k=GM.CreateVariable(8);var l=h.Deref(10,8).toBuffer();k.Deref(4,2).toBuffer().writeUInt16LE(l.readUInt16LE(4)-l.readUInt16LE(0));k.Deref(6,2).toBuffer().writeUInt16LE(l.readUInt16LE(6)-l.readUInt16LE(2));this._kernel32.SetConsoleWindowInfo(this._stdoutput,1,k)};this.PowerShellCapable=function(){if(require(\\"os\\").arch()==\\"x64\\"){return(require(\\"fs\\").existsSync(process.env.windir+\\"\\\\\\\\SysWow64\\\\\\\\WindowsPowerShell\\\\\\\\v1.0\\\\\\\\powershell.exe\\"))}else{return(require(\\"fs\\").existsSync(process.env.windir+\\"\\\\\\\\System32\\\\\\\\WindowsPowerShell\\\\\\\\v1.0\\\\\\\\powershell.exe\\"))}};this.StartEx=function d(h,g,k){h=80;g=25;if(this._stream!=null){throw (\\"Concurrent terminal sessions are not supported on Windows.\\")}this.stopping=null;if(this._kernel32.GetConsoleWindow().Val==0){if(this._kernel32.AllocConsole().Val==0){throw (\\"AllocConsole failed with: \\"+this._kernel32.GetLastError().Val)}}this._stdinput=this._kernel32.GetStdHandle(STD_INPUT_HANDLE);this._stdoutput=this._kernel32.GetStdHandle(STD_OUTPUT_HANDLE);this._connected=false;var i=GM.CreateVariable(4);i.Deref(0,2).toBuffer().writeUInt16LE(h);i.Deref(2,2).toBuffer().writeUInt16LE(g);var j=GM.CreateVariable(8);j.Deref(4,2).toBuffer().writeUInt16LE(h-1);j.Deref(6,2).toBuffer().writeUInt16LE(g-1);if(this._kernel32.SetConsoleWindowInfo(this._stdoutput,1,j).Val==0){throw (\\"Failed to set Console Screen Size\\")}if(this._kernel32.SetConsoleScreenBufferSize(this._stdoutput,i.Deref(0,4).toBuffer().readUInt32LE()).Val==0){throw (\\"Failed to set Console Buffer Size\\")}this._user32.ShowWindow(this._kernel32.GetConsoleWindow().Val,SW_HIDE);this.ClearScreen();this._hookThread(k).then(function(){this.terminal.StartCommand(this.userArgs[0])},console.log);this._stream=new duplex({write:function(l,m){if(!this.terminal.connected){if(!this._promise.chunk){this._promise.chunk=[]}if(typeof(l)==\\"string\\"){this._promise.chunk.push(l)}else{this._promise.chunk.push(Buffer.alloc(l.length));l.copy(this._promise.chunk.peek())}this._promise.chunk.peek().flush=m;this._promise.then(function(){var n;while(this.chunk.length>0){n=this.chunk.shift();this.terminal._WriteBuffer(n);n.flush()}})}else{this.terminal._WriteBuffer(l);m()}return(true)},\\"final\\":function(l){var m=this.terminal._stop();m.__flush=l;m.then(function(){this.__flush()})}});this._stream.terminal=this;this._stream._promise=new promise(function(m,l){this._res=m;this._rej=l});this._stream._promise.terminal=this;this._stream.prependOnceListener(\\"end\\",function(){this.terminal._stream=null});return(this._stream)};this.Start=function d(h,g){return(this.StartEx(h,g,process.env.windir+\\"\\\\\\\\System32\\\\\\\\cmd.exe\\"))};this.StartPowerShell=function f(h,g){if(require(\\"os\\").arch()==\\"x64\\"){if(require(\\"fs\\").existsSync(process.env.windir+\\"\\\\\\\\System32\\\\\\\\WindowsPowerShell\\\\\\\\v1.0\\\\\\\\powershell.exe\\")){return(this.StartEx(h,g,process.env.windir+\\"\\\\\\\\System32\\\\\\\\WindowsPowerShell\\\\\\\\v1.0\\\\\\\\powershell.exe\\"))}else{return(this.StartEx(h,g,process.env.windir+\\"\\\\\\\\SysWow64\\\\\\\\WindowsPowerShell\\\\\\\\v1.0\\\\\\\\powershell.exe\\"))}}else{return(this.StartEx(h,g,process.env.windir+\\"\\\\\\\\System32\\\\\\\\WindowsPowerShell\\\\\\\\v1.0\\\\\\\\powershell.exe\\"))}};this._stop=function(){if(this.stopping){return(this.stopping)}this._ConsoleWinEventProc.removeAllListeners(\\"GlobalCallback\\");this.stopping=new promise(function(i,h){this._res=i;this._rej=h});var g=this._kernel32.GetThreadId(this._user32.SetWinEventHook.async.thread()).Val;this._user32.PostThreadMessageA(g,WM_QUIT,0,0);this._stream.emit(\\"end\\");return(this.stopping)};this._hookThread=function(){var i=new promise(function(k,j){this._res=k;this._rej=j});i.userArgs=[];for(var g in arguments){i.userArgs.push(arguments[g])}i.terminal=this;this._ConsoleWinEventProc=GM.GetGenericGlobalCallback(7);this._ConsoleWinEventProc.terminal=this;var h=this._user32.SetWinEventHook.async(EVENT_CONSOLE_CARET,EVENT_CONSOLE_END_APPLICATION,0,this._ConsoleWinEventProc,0,0,WINEVENT_OUTOFCONTEXT|WINEVENT_SKIPOWNPROCESS);h.ready=i;h.terminal=this;h.then(function(j){if(j.Val==0){this.ready._rej(\\"Error calling SetWinEventHook\\")}else{this.terminal.hwinEventHook=j;this.ready._res();this.terminal._GetMessage()}});this._ConsoleWinEventProc.on(\\"GlobalCallback\\",function(l,k,m,p,n,o,r){if(!this.terminal.hwinEventHook||this.terminal.hwinEventHook.Val!=l.Val){return}var j=null;switch(k.Val){case EVENT_CONSOLE_CARET:break;case EVENT_CONSOLE_UPDATE_REGION:if(!this.terminal.connected){this.terminal.connected=true;this.terminal._stream._promise._res()}if(this.terminal._scrollTimer==null){j=this.terminal._GetScreenBuffer(LOWORD(p.Val),HIWORD(p.Val),LOWORD(n.Val),HIWORD(n.Val));this.terminal._SendDataBuffer(j)}break;case EVENT_CONSOLE_UPDATE_SIMPLE:var q={data:[Buffer.alloc(1,LOWORD(n.Val))],attributes:[HIWORD(n.Val)],width:1,height:1,x:LOWORD(p.Val),y:HIWORD(p.Val)};this.terminal._SendDataBuffer(q);break;case EVENT_CONSOLE_UPDATE_SCROLL:this.terminal._SendScroll(p.Val,n.Val);break;case EVENT_CONSOLE_LAYOUT:break;case EVENT_CONSOLE_START_APPLICATION:break;case EVENT_CONSOLE_END_APPLICATION:if(p.Val==this.terminal._hProcessID){this.terminal._hProcess=null;this.terminal._stop().then(function(){console.log(\\"STOPPED\\")})}break;default:console.log(\\"Unknown event: \\"+k.Val);break}});return(i)};this._GetMessage=function(){if(this._user32.abort){console.log(\\"aborting loop\\");return}this._user32.GetMessageA.async(this._user32.SetWinEventHook.async,MSG,0,0,0).then(function(g){if(g.Val!=0){if(g.Val==-1){}else{this.nativeProxy._user32.TranslateMessage.async(this.nativeProxy.user32.SetWinEventHook.async,MSG).then(function(){this.nativeProxy._user32.DispatchMessageA.async(this.nativeProxy.user32.SetWinEventHook.async,MSG).then(function(){this.nativeProxy.terminal._GetMessage()},console.log)},console.log)}}else{this.nativeProxy.UnhookWinEvent.async(this.nativeProxy.terminal._user32.SetWinEventHook.async,this.nativeProxy.terminal.hwinEventHook).then(function(){if(this.nativeProxy.terminal._hProcess==null){return}this.nativeProxy.terminal.stopping._res();if(this.nativeProxy.terminal._kernel32.TerminateProcess(this.nativeProxy.terminal._hProcess,1067).Val==0){var h=this.nativeProxy.terminal._kernel32.GetLastError().Val;console.log(\\"Unable to kill Terminal Process, error: \\"+h)}this.nativeProxy.terminal.stopping=null},function(h){console.log(\\"REJECTED_UnhookWinEvent: \\"+h)})}},function(g){console.log(\\"REJECTED_GETMessage: \\"+g)})};this._WriteBuffer=function(g){for(var h=0;hm;++k){this._stream.push(Buffer.from(\\"\\\\r\\\\n\\"))}var g=this._GetScreenBuffer(0,0,n-1,m-1);this._SendDataBuffer(g);this._scrollTimer=setTimeout(function(q,p,o){var i=q._GetScreenBuffer(0,0,p-1,o-1);q._SendDataBuffer(i);q._scrollTimer=null},250,this,n,m)};this.StartCommand=function e(g){if(this._kernel32.CreateProcessA(GM.CreateVariable(g),0,0,0,1,CREATE_NEW_PROCESS_GROUP,0,0,si,pi).Val==0){console.log(\\"Error Spawning CMD\\");return}this._kernel32.CloseHandle(pi.Deref(GM.PointerSize,GM.PointerSize).Deref());this._hProcess=pi.Deref(0,GM.PointerSize).Deref();this._hProcessID=pi.Deref(GM.PointerSize==4?8:16,4).toBuffer().readUInt32LE()}}function LOWORD(a){return(a&65535)}function HIWORD(a){return((a>>16)&65535)}function GetEsc(b,a){return(Buffer.from(\\"\\\\x1B[\\"+a.join(\\";\\")+b))}function MeshConsole(a){require(\\"MeshAgent\\").SendCommand({action:\\"msg\\",type:\\"console\\",value:JSON.stringify(a)})}function TranslateLine(r,s,f,a){var m,l,e,q,j,c,n,k,d,p,h,b,g=[],o=[GetEsc(\\"H\\",[s,r])];if(typeof a==\\"number\\"){a=[a]}for(m=0;m>2);d=(a[m]&112)>>4;d=((d&1)<<2)+(d&2)+((d&4)>>2);p=(a[m]&16384);h=(a[m]&8)>>3;b=(a[m]&128);if(p!=q){if(p!=0){g.push(7)}else{g.push(0);l=7;e=0;j=0;c=0}q=p}if(k!=l){g.push(k+30);l=k}if(d!=e){g.push(d+40);e=d}if(h!=j){g.push(2-h);j=h}if(b!=c){if(b==0){g.push(e+40)}else{g.push(e+100);c=b}}if(g.length>0){o.push(GetEsc(\\"m\\",g));g=[]}n=a[m]}o.push(Buffer.from(String.fromCharCode(f[m])))}return Buffer.concat(o)}module.exports=new windows_terminal();"); addedModules.push("win-terminal"); } catch (e) { }\r\ntry { addModule("win-virtual-terminal", "var PROC_THREAD_ATTRIBUTE_PSEUDOCONSOLE=131094;var EXTENDED_STARTUPINFO_PRESENT=524288;var HEAP_ZERO_MEMORY=8;var duplex=require(\\"stream\\").Duplex;function vt(){this._ObjectID=\\"win-virtual-terminal\\";Object.defineProperty(this,\\"supported\\",{value:(function(){var f=require(\\"_GenericMarshal\\");var g=f.CreateNativeProxy(\\"kernel32.dll\\");try{g.CreateMethod(\\"CreatePseudoConsole\\")}catch(d){return(false)}return(true)})()});this.Create=function a(k,o,i){if(!this.supported){throw (\\"This build of Windows does not have support for PseudoConsoles\\")}if(!o){o=80}if(!i){i=25}var h=require(\\"_GenericMarshal\\");var j=h.CreateNativeProxy(\\"kernel32.dll\\");j.CreateMethod(\\"CancelIoEx\\");j.CreateMethod(\\"CreatePipe\\");j.CreateMethod(\\"CreateProcessW\\");j.CreateMethod(\\"CreatePseudoConsole\\");j.CreateMethod(\\"CloseHandle\\");j.CreateMethod(\\"ClosePseudoConsole\\");j.CreateMethod(\\"GetProcessHeap\\");j.CreateMethod(\\"HeapAlloc\\");j.CreateMethod(\\"InitializeProcThreadAttributeList\\");j.CreateMethod(\\"ResizePseudoConsole\\");j.CreateMethod(\\"UpdateProcThreadAttribute\\");j.CreateMethod(\\"WriteFile\\");j.CreateMethod(\\"ReadFile\\");j.CreateMethod(\\"TerminateProcess\\");var m={_h:h.CreatePointer(),_consoleInput:h.CreatePointer(),_consoleOutput:h.CreatePointer(),_input:h.CreatePointer(),_output:h.CreatePointer(),k32:j};var f=h.CreateVariable(8);var e;var l=h.CreateVariable(h.PointerSize==4?16:24);if(j.CreatePipe(m._consoleInput,m._input,0,0).Val==0){console.log(\\"PIPE/FAIL\\")}if(j.CreatePipe(m._output,m._consoleOutput,0,0).Val==0){console.log(\\"PIPE/FAIL\\")}if(j.CreatePseudoConsole((i<<16)|o,m._consoleInput.Deref(),m._consoleOutput.Deref(),0,m._h).Val!=0){throw (\\"Error calling CreatePseudoConsole()\\")}j.InitializeProcThreadAttributeList(0,1,0,f);e=h.CreateVariable(f.toBuffer().readUInt32LE());var n=h.CreateVariable(h.PointerSize==8?112:72);n.toBuffer().writeUInt32LE(h.PointerSize==8?112:72,0);e.pointerBuffer().copy(n.Deref(h.PointerSize==8?104:68,h.PointerSize).toBuffer());if(j.InitializeProcThreadAttributeList(e,1,0,f).Val!=0){if(j.UpdateProcThreadAttribute(e,0,PROC_THREAD_ATTRIBUTE_PSEUDOCONSOLE,m._h.Deref(),h.PointerSize,0,0).Val!=0){if(j.CreateProcessW(0,h.CreateVariable(k,{wide:true}),0,0,1,EXTENDED_STARTUPINFO_PRESENT,0,0,n,l).Val!=0){m._startupinfoex=n;m._process=l.Deref(0);m._pid=l.Deref(h.PointerSize==4?8:16,4).toBuffer().readUInt32LE();var g=new duplex({write:function(p,q){var r=require(\\"_GenericMarshal\\").CreateVariable(4);this.terminal.k32.WriteFile(this.terminal._input.Deref(),require(\\"_GenericMarshal\\").CreateVariable(p),p.length,r,0);q();return(true)},\\"final\\":function(p){if(this.terminal._process){this.terminal._process=null;j.ClosePseudoConsole(this._obj._h.Deref())}p()}});g._obj=m;m._waiter=require(\\"DescriptorEvents\\").addDescriptor(l.Deref(0));m._waiter.ds=g;m._waiter._obj=m;m._waiter.on(\\"signaled\\",function(){j.CancelIoEx(this._obj._output.Deref(),0);this.ds.push(null);if(this._obj._process){this._obj._process=null;j.ClosePseudoConsole(this._obj._h.Deref())}j.CloseHandle(this._obj._input.Deref());j.CloseHandle(this._obj._output.Deref());j.CloseHandle(this._obj._consoleInput.Deref());j.CloseHandle(this._obj._consoleOutput.Deref())});g.resizeTerminal=function(r,p){console.setDestination(console.Destinations.LOGFILE);console.log(\\"resizeTerminal(\\"+r+\\", \\"+p+\\")\\");var q;if((q=j.ResizePseudoConsole(this._obj._h.Deref(),(p<<16)|r).Val)!=0){console.log(\\"HResult=\\"+q);throw (\\"Resize returned HRESULT: \\"+q)}console.log(\\"SUCCESS\\")};g.terminal=m;g._rpbuf=h.CreateVariable(4096);g._rpbufRead=h.CreateVariable(4);g.__read=function d(){this._rp=this.terminal.k32.ReadFile.async(this.terminal._output.Deref(),this._rpbuf,this._rpbuf._size,this._rpbufRead,0);this._rp.then(function(){var p=this.parent._rpbufRead.toBuffer().readUInt32LE();if(p<=0){return}this.parent.push(this.parent._rpbuf.toBuffer().slice(0,p));this.parent.__read()});this._rp.parent=this};g.__read();return(g)}else{}}}throw (\\"Internal Error\\")};this.PowerShellCapable=function(){if(require(\\"os\\").arch()==\\"x64\\"){return(require(\\"fs\\").existsSync(process.env.windir+\\"\\\\\\\\SysWow64\\\\\\\\WindowsPowerShell\\\\\\\\v1.0\\\\\\\\powershell.exe\\"))}else{return(require(\\"fs\\").existsSync(process.env.windir+\\"\\\\\\\\System32\\\\\\\\WindowsPowerShell\\\\\\\\v1.0\\\\\\\\powershell.exe\\"))}};this.Start=function b(e,d){return(this.Create(process.env.windir+\\"\\\\\\\\System32\\\\\\\\cmd.exe\\",e,d))};this.StartPowerShell=function c(e,d){if(require(\\"os\\").arch()==\\"x64\\"){if(require(\\"fs\\").existsSync(process.env.windir+\\"\\\\\\\\System32\\\\\\\\WindowsPowerShell\\\\\\\\v1.0\\\\\\\\powershell.exe\\")){return(this.Create(process.env.windir+\\"\\\\\\\\System32\\\\\\\\WindowsPowerShell\\\\\\\\v1.0\\\\\\\\powershell.exe\\",e,d))}else{return(this.Create(process.env.windir+\\"\\\\\\\\SysWow64\\\\\\\\WindowsPowerShell\\\\\\\\v1.0\\\\\\\\powershell.exe\\",e,d))}}else{return(this.Create(process.env.windir+\\"\\\\\\\\System32\\\\\\\\WindowsPowerShell\\\\\\\\v1.0\\\\\\\\powershell.exe\\",e,d))}}}if(process.platform==\\"win32\\"){module.exports=new vt()};"); addedModules.push("win-virtual-terminal"); } catch (e) { }\r\n\r\nvar http = require(\'http\');\r\nvar childProcess = require(\'child_process\');\r\nvar meshCoreObj = { action: \'coreinfo\', value: "MeshCore Recovery", caps: 14 }; // Capability bitmask: 1 = Desktop, 2 = Terminal, 4 = Files, 8 = Console, 16 = JavaScript\r\nvar nextTunnelIndex = 1;\r\nvar tunnels = {};\r\nvar fs = require(\'fs\');\r\n\r\nif (require(\'MeshAgent\').ARCHID == null) {\r\n var id = null;\r\n switch (process.platform) {\r\n case \'win32\':\r\n id = require(\'_GenericMarshal\').PointerSize == 4 ? 3 : 4;\r\n break;\r\n case \'freebsd\':\r\n id = require(\'_GenericMarshal\').PointerSize == 4 ? 31 : 30;\r\n break;\r\n case \'darwin\':\r\n try {\r\n id = require(\'os\').arch() == \'x64\' ? 16 : 29;\r\n }\r\n catch (xx) {\r\n id = 16;\r\n }\r\n break;\r\n }\r\n if (id != null) { Object.defineProperty(require(\'MeshAgent\'), \'ARCHID\', { value: id }); }\r\n}\r\n\r\n//attachDebugger({ webport: 9994, wait: 1 }).then(function (p) { console.log(\'Debug on port: \' + p); });\r\n\r\nfunction sendConsoleText(msg, sessionid) {\r\n if (sessionid != null) {\r\n require(\'MeshAgent\').SendCommand({ action: \'msg\', type: \'console\', value: msg, sessionid: sessionid });\r\n }\r\n else {\r\n require(\'MeshAgent\').SendCommand({ action: \'msg\', type: \'console\', value: msg });\r\n }\r\n}\r\n\r\nfunction sendAgentMessage(msg, icon) {\r\n if (sendAgentMessage.messages == null) {\r\n sendAgentMessage.messages = {};\r\n sendAgentMessage.nextid = 1;\r\n }\r\n sendAgentMessage.messages[sendAgentMessage.nextid++] = { msg: msg, icon: icon };\r\n require(\'MeshAgent\').SendCommand({ action: \'sessions\', type: \'msg\', value: sendAgentMessage.messages });\r\n}\r\n\r\n// Add to the server event log\r\nfunction MeshServerLog(msg, state) {\r\n if (typeof msg == \'string\') { msg = { action: \'log\', msg: msg }; } else { msg.action = \'log\'; }\r\n if (state) {\r\n if (state.userid) { msg.userid = state.userid; }\r\n if (state.username) { msg.username = state.username; }\r\n if (state.sessionid) { msg.sessionid = state.sessionid; }\r\n if (state.remoteaddr) { msg.remoteaddr = state.remoteaddr; }\r\n }\r\n require(\'MeshAgent\').SendCommand(msg);\r\n}\r\n\r\n// Add to the server event log, use internationalized events\r\nfunction MeshServerLogEx(id, args, msg, state) {\r\n var msg = { action: \'log\', msgid: id, msgArgs: args, msg: msg };\r\n if (state) {\r\n if (state.userid) { msg.userid = state.userid; }\r\n if (state.username) { msg.username = state.username; }\r\n if (state.sessionid) { msg.sessionid = state.sessionid; }\r\n if (state.remoteaddr) { msg.remoteaddr = state.remoteaddr; }\r\n }\r\n require(\'MeshAgent\').SendCommand(msg);\r\n}\r\n\r\nfunction getOpenDescriptors()\r\n{\r\n switch(process.platform)\r\n {\r\n case "freebsd":\r\n var child = require(\'child_process\').execFile(\'/bin/sh\', [\'sh\']);\r\n child.stdout.str = \'\'; child.stdout.on(\'data\', function (c) { this.str += c.toString(); });\r\n child.stderr.on(\'data\', function (c) { });\r\n\r\n child.stdin.write("procstat -f " + process.pid + " | tr \'\\\\n\' \'`\' | awk -F\'`\' \'");\r\n child.stdin.write(\'{\');\r\n child.stdin.write(\' DEL="";\');\r\n child.stdin.write(\' printf "[";\');\r\n child.stdin.write(\' for(i=1;i0)\r\n {\r\n fd = descriptors.pop();\r\n if(fd > 2)\r\n {\r\n libc.close(fd);\r\n }\r\n }\r\n}\r\n\r\nfunction linux_execv(name, agentfilename, sessionid)\r\n{\r\n var libs = require(\'monitor-info\').getLibInfo(\'libc\');\r\n var libc = null;\r\n\r\n if ((libs.length == 0 || libs.length == null) && require(\'MeshAgent\').ARCHID == 33)\r\n {\r\n var child = require(\'child_process\').execFile(\'/bin/sh\', [\'sh\']);\r\n child.stdout.str = \'\'; child.stdout.on(\'data\', function (c) { this.str += c.toString(); });\r\n child.stderr.str = \'\'; child.stderr.on(\'data\', function (c) { this.str += c.toString(); });\r\n child.stdin.write("ls /lib/libc.* | tr \'\\\\n\' \'`\' | awk -F\'`\' \'{ " + \' printf "["; DEL=""; for(i=1;i 0)\r\n {\r\n try {\r\n libc = require(\'_GenericMarshal\').CreateNativeProxy(libs.pop().path);\r\n break;\r\n }\r\n catch (e) {\r\n libc = null;\r\n continue;\r\n }\r\n }\r\n if (libc != null) {\r\n try\r\n {\r\n libc.CreateMethod(\'execv\');\r\n libc.CreateMethod(\'close\');\r\n }\r\n catch (e) {\r\n libc = null;\r\n }\r\n }\r\n\r\n if (libc == null) {\r\n // Couldn\'t find libc.so, fallback to using service manager to restart agent\r\n if (sessionid != null) { sendConsoleText(\'Restarting service via service-manager...\', sessionid) }\r\n try {\r\n // restart service\r\n var s = require(\'service-manager\').manager.getService(name);\r\n s.restart();\r\n }\r\n catch (zz) {\r\n sendConsoleText(\'Self Update encountered an error trying to restart service\', sessionid);\r\n sendAgentMessage(\'Self Update encountered an error trying to restart service\', 3);\r\n }\r\n return;\r\n }\r\n\r\n if (sessionid != null) { sendConsoleText(\'Restarting service via execv()...\', sessionid) }\r\n\r\n var i;\r\n var args;\r\n var argtmp = [];\r\n var argarr = [process.execPath];\r\n var path = require(\'_GenericMarshal\').CreateVariable(process.execPath);\r\n\r\n if (require(\'MeshAgent\').getStartupOptions != null) {\r\n var options = require(\'MeshAgent\').getStartupOptions();\r\n for (i in options) {\r\n argarr.push(\'--\' + i + \'="\' + options[i] + \'"\');\r\n }\r\n }\r\n\r\n args = require(\'_GenericMarshal\').CreateVariable((1 + argarr.length) * require(\'_GenericMarshal\').PointerSize);\r\n for (i = 0; i < argarr.length; ++i) {\r\n var arg = require(\'_GenericMarshal\').CreateVariable(argarr[i]);\r\n argtmp.push(arg);\r\n arg.pointerBuffer().copy(args.toBuffer(), i * require(\'_GenericMarshal\').PointerSize);\r\n }\r\n\r\n var descriptors = getOpenDescriptors();\r\n closeDescriptors(libc, descriptors);\r\n\r\n libc.execv(path, args);\r\n if (sessionid != null) { sendConsoleText(\'Self Update failed because execv() failed\', sessionid) }\r\n sendAgentMessage(\'Self Update failed because execv() failed\', 3);\r\n}\r\n\r\nfunction bsd_execv(name, agentfilename, sessionid) {\r\n var child = require(\'child_process\').execFile(\'/bin/sh\', [\'sh\']);\r\n child.stdout.str = \'\'; child.stdout.on(\'data\', function (c) { this.str += c.toString(); });\r\n child.stderr.str = \'\'; child.stderr.on(\'data\', function (c) { this.str += c.toString(); });\r\n child.stdin.write("cat /usr/lib/libc.so | awk \'");\r\n child.stdin.write(\'{\');\r\n child.stdin.write(\' a=split($0, tok, "(");\');\r\n child.stdin.write(\' if(a>1)\');\r\n child.stdin.write(\' {\');\r\n child.stdin.write(\' split(tok[2], b, ")");\');\r\n child.stdin.write(\' split(b[1], c, " ");\');\r\n child.stdin.write(\' print c[1];\');\r\n child.stdin.write(\' }\');\r\n child.stdin.write("}\'\\nexit\\n");\r\n child.waitExit();\r\n if (child.stdout.str.trim() == \'\') {\r\n if (sessionid != null) { sendConsoleText(\'Self Update failed because cannot find libc.so\', sessionid) }\r\n sendAgentMessage(\'Self Update failed because cannot find libc.so\', 3);\r\n return;\r\n }\r\n\r\n var libc = null;\r\n try\r\n {\r\n libc = require(\'_GenericMarshal\').CreateNativeProxy(child.stdout.str.trim());\r\n libc.CreateMethod(\'execv\');\r\n libc.CreateMethod(\'close\');\r\n }\r\n catch (e) {\r\n if (sessionid != null) { sendConsoleText(\'Self Update failed: \' + e.toString(), sessionid) }\r\n sendAgentMessage(\'Self Update failed: \' + e.toString(), 3);\r\n return;\r\n }\r\n\r\n var i;\r\n var path = require(\'_GenericMarshal\').CreateVariable(process.execPath);\r\n var argarr = [process.execPath];\r\n var argtmp = [];\r\n var args;\r\n var options = require(\'MeshAgent\').getStartupOptions();\r\n for (i in options) {\r\n argarr.push(\'--\' + i + \'="\' + options[i] + \'"\');\r\n }\r\n args = require(\'_GenericMarshal\').CreateVariable((1 + argarr.length) * require(\'_GenericMarshal\').PointerSize);\r\n for (i = 0; i < argarr.length; ++i) {\r\n var arg = require(\'_GenericMarshal\').CreateVariable(argarr[i]);\r\n argtmp.push(arg);\r\n arg.pointerBuffer().copy(args.toBuffer(), i * require(\'_GenericMarshal\').PointerSize);\r\n }\r\n\r\n if (sessionid != null) { sendConsoleText(\'Restarting service via execv()\', sessionid) }\r\n\r\n var descriptors = getOpenDescriptors();\r\n closeDescriptors(libc, descriptors);\r\n\r\n libc.execv(path, args);\r\n if (sessionid != null) { sendConsoleText(\'Self Update failed because execv() failed\', sessionid) }\r\n sendAgentMessage(\'Self Update failed because execv() failed\', 3);\r\n}\r\n\r\nfunction windows_execve(name, agentfilename, sessionid) {\r\n var libc;\r\n try {\r\n libc = require(\'_GenericMarshal\').CreateNativeProxy(\'msvcrt.dll\');\r\n libc.CreateMethod(\'_wexecve\');\r\n }\r\n catch (xx) {\r\n sendConsoleText(\'Self Update failed because msvcrt.dll is missing\', sessionid);\r\n sendAgentMessage(\'Self Update failed because msvcrt.dll is missing\', 3);\r\n return;\r\n }\r\n\r\n var cwd = process.cwd();\r\n if (!cwd.endsWith(\'\\\\\'))\r\n {\r\n cwd += \'\\\\\';\r\n }\r\n var cmd = require(\'_GenericMarshal\').CreateVariable(process.env[\'windir\'] + \'\\\\system32\\\\cmd.exe\', { wide: true });\r\n var args = require(\'_GenericMarshal\').CreateVariable(3 * require(\'_GenericMarshal\').PointerSize);\r\n var arg1 = require(\'_GenericMarshal\').CreateVariable(\'cmd.exe\', { wide: true });\r\n var arg2 = require(\'_GenericMarshal\').CreateVariable(\'/C wmic service "\' + name + \'" call stopservice & "\' + cwd + agentfilename + \'.update.exe" -b64exec \' + \'dHJ5CnsKICAgIHZhciBzZXJ2aWNlTG9jYXRpb24gPSBwcm9jZXNzLmFyZ3YucG9wKCk7CiAgICByZXF1aXJlKCdwcm9jZXNzLW1hbmFnZXInKS5lbnVtZXJhdGVQcm9jZXNzZXMoKS50aGVuKGZ1bmN0aW9uIChwcm9jKQogICAgewogICAgICAgIGZvciAodmFyIHAgaW4gcHJvYykKICAgICAgICB7CiAgICAgICAgICAgIGlmIChwcm9jW3BdLnBhdGggPT0gc2VydmljZUxvY2F0aW9uKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBwcm9jZXNzLmtpbGwocHJvY1twXS5waWQpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHByb2Nlc3MuZXhpdCgpOwogICAgfSk7Cn0KY2F0Y2goZSkKewogICAgcHJvY2Vzcy5leGl0KCk7Cn0=\' +\r\n \' "\' + process.execPath + \'" & copy "\' + cwd + agentfilename + \'.update.exe" "\' + process.execPath + \'" & wmic service "\' + name + \'" call startservice & erase "\' + cwd + agentfilename + \'.update.exe"\', { wide: true });\r\n\r\n arg1.pointerBuffer().copy(args.toBuffer());\r\n arg2.pointerBuffer().copy(args.toBuffer(), require(\'_GenericMarshal\').PointerSize);\r\n\r\n libc._wexecve(cmd, args, 0);\r\n}\r\n\r\n// Start a JavaScript based Agent Self-Update\r\nfunction agentUpdate_Start(updateurl, updateoptions) {\r\n // If this value is null\r\n var sessionid = (updateoptions != null) ? updateoptions.sessionid : null; // If this is null, messages will be broadcast. Otherwise they will be unicasted\r\n\r\n // If the url starts with *, switch it to use the same protoco, host and port as the control channel.\r\n if (updateurl != null) {\r\n updateurl = getServerTargetUrlEx(updateurl);\r\n if (updateurl.startsWith("wss://")) { updateurl = "https://" + updateurl.substring(6); }\r\n }\r\n\r\n if (agentUpdate_Start._selfupdate != null) {\r\n // We were already called, so we will ignore this duplicate request\r\n if (sessionid != null) { sendConsoleText(\'Self update already in progress...\', sessionid); }\r\n }\r\n else {\r\n if (agentUpdate_Start._retryCount == null) { agentUpdate_Start._retryCount = 0; }\r\n if (require(\'MeshAgent\').ARCHID == null && updateurl == null) {\r\n // This agent doesn\'t have the ability to tell us which ARCHID it is, so we don\'t know which agent to pull\r\n sendConsoleText(\'Unable to initiate update, agent ARCHID is not defined\', sessionid);\r\n }\r\n else {\r\n var agentfilename = process.execPath.split(process.platform == \'win32\' ? \'\\\\\' : \'/\').pop(); // Local File Name, ie: MeshAgent.exe\r\n var name = require(\'MeshAgent\').serviceName;\r\n if (name == null) { name = (process.platform == \'win32\' ? \'Mesh Agent\' : \'meshagent\'); } // This is an older agent that doesn\'t expose the service name, so use the default\r\n try {\r\n var s = require(\'service-manager\').manager.getService(name);\r\n if (!s.isMe()) {\r\n if (process.platform == \'win32\') { s.close(); }\r\n sendConsoleText(\'Self Update cannot continue, this agent is not an instance of (\' + name + \')\', sessionid);\r\n return;\r\n }\r\n if (process.platform == \'win32\') { s.close(); }\r\n }\r\n catch (zz) {\r\n sendConsoleText(\'Self Update Failed because this agent is not an instance of (\' + name + \')\', sessionid);\r\n sendAgentMessage(\'Self Update Failed because this agent is not an instance of (\' + name + \')\', 3);\r\n return;\r\n }\r\n\r\n if ((sessionid != null) && (updateurl != null)) { sendConsoleText(\'Downloading update from: \' + updateurl, sessionid); }\r\n var options = require(\'http\').parseUri(updateurl != null ? updateurl : require(\'MeshAgent\').ServerUrl);\r\n options.protocol = \'https:\';\r\n if (updateurl == null) { options.path = (\'/meshagents?id=\' + require(\'MeshAgent\').ARCHID); sendConsoleText(\'Downloading update from: \' + options.path, sessionid); }\r\n options.rejectUnauthorized = false;\r\n options.checkServerIdentity = function checkServerIdentity(certs) {\r\n // If the tunnel certificate matches the control channel certificate, accept the connection\r\n try { if (require(\'MeshAgent\').ServerInfo.ControlChannelCertificate.digest == certs[0].digest) return; } catch (ex) { }\r\n try { if (require(\'MeshAgent\').ServerInfo.ControlChannelCertificate.fingerprint == certs[0].fingerprint) return; } catch (ex) { }\r\n\r\n // Check that the certificate is the one expected by the server, fail if not.\r\n if (checkServerIdentity.servertlshash == null) {\r\n if (require(\'MeshAgent\').ServerInfo == null || require(\'MeshAgent\').ServerInfo.ControlChannelCertificate == null) { return; }\r\n sendConsoleText(\'Self Update failed, because the url cannot be verified: \' + updateurl, sessionid);\r\n sendAgentMessage(\'Self Update failed, because the url cannot be verified: \' + updateurl, 3);\r\n throw new Error(\'BadCert\');\r\n }\r\n if (certs[0].digest == null) { return; }\r\n if ((checkServerIdentity.servertlshash != null) && (checkServerIdentity.servertlshash.toLowerCase() != certs[0].digest.split(\':\').join(\'\').toLowerCase())) {\r\n sendConsoleText(\'Self Update failed, because the supplied certificate does not match\', sessionid);\r\n sendAgentMessage(\'Self Update failed, because the supplied certificate does not match\', 3);\r\n throw new Error(\'BadCert\')\r\n }\r\n }\r\n options.checkServerIdentity.servertlshash = (updateoptions != null ? updateoptions.tlshash : null);\r\n agentUpdate_Start._selfupdate = require(\'https\').get(options);\r\n agentUpdate_Start._selfupdate.on(\'error\', function (e) {\r\n sendConsoleText(\'Self Update failed, because there was a problem trying to download the update from \' + updateurl, sessionid);\r\n sendAgentMessage(\'Self Update failed, because there was a problem trying to download the update from \' + updateurl, 3);\r\n agentUpdate_Start._selfupdate = null;\r\n });\r\n agentUpdate_Start._selfupdate.on(\'response\', function (img) {\r\n this._file = require(\'fs\').createWriteStream(agentfilename + (process.platform==\'win32\'?\'.update.exe\':\'.update\'), { flags: \'wb\' });\r\n this._filehash = require(\'SHA384Stream\').create();\r\n this._filehash.on(\'hash\', function (h) {\r\n if (updateoptions != null && updateoptions.hash != null) {\r\n if (updateoptions.hash.toLowerCase() == h.toString(\'hex\').toLowerCase()) {\r\n if (sessionid != null) { sendConsoleText(\'Download complete. HASH verified.\', sessionid); }\r\n }\r\n else {\r\n agentUpdate_Start._retryCount++;\r\n sendConsoleText(\'Self Update FAILED because the downloaded agent FAILED hash check (\' + agentUpdate_Start._retryCount + \'), URL: \' + updateurl, sessionid);\r\n sendAgentMessage(\'Self Update FAILED because the downloaded agent FAILED hash check (\' + agentUpdate_Start._retryCount + \'), URL: \' + updateurl, 3);\r\n agentUpdate_Start._selfupdate = null;\r\n\r\n if (agentUpdate_Start._retryCount < 4) {\r\n // Retry the download again\r\n sendConsoleText(\'Self Update will try again in 60 seconds...\', sessionid);\r\n agentUpdate_Start._timeout = setTimeout(agentUpdate_Start, 60000, updateurl, updateoptions);\r\n }\r\n else {\r\n sendConsoleText(\'Self Update giving up, too many failures...\', sessionid);\r\n sendAgentMessage(\'Self Update giving up, too many failures...\', 3);\r\n }\r\n return;\r\n }\r\n }\r\n else {\r\n sendConsoleText(\'Download complete. HASH=\' + h.toString(\'hex\'), sessionid);\r\n }\r\n\r\n // Send an indication to the server that we got the update download correctly.\r\n try { require(\'MeshAgent\').SendCommand({ action: \'agentupdatedownloaded\' }); } catch (e) { }\r\n\r\n if (sessionid != null) { sendConsoleText(\'Updating and restarting agent...\', sessionid); }\r\n if (process.platform == \'win32\') {\r\n // Use _wexecve() equivalent to perform the update\r\n windows_execve(name, agentfilename, sessionid);\r\n }\r\n else {\r\n var m = require(\'fs\').statSync(process.execPath).mode;\r\n require(\'fs\').chmodSync(process.cwd() + agentfilename + \'.update\', m);\r\n\r\n // remove binary\r\n require(\'fs\').unlinkSync(process.execPath);\r\n\r\n // copy update\r\n require(\'fs\').copyFileSync(process.cwd() + agentfilename + \'.update\', process.execPath);\r\n require(\'fs\').chmodSync(process.execPath, m);\r\n\r\n // erase update\r\n require(\'fs\').unlinkSync(process.cwd() + agentfilename + \'.update\');\r\n\r\n switch (process.platform) {\r\n case \'freebsd\':\r\n bsd_execv(name, agentfilename, sessionid);\r\n break;\r\n case \'linux\':\r\n linux_execv(name, agentfilename, sessionid);\r\n break;\r\n default:\r\n try {\r\n // restart service\r\n var s = require(\'service-manager\').manager.getService(name);\r\n s.restart();\r\n }\r\n catch (zz) {\r\n sendConsoleText(\'Self Update encountered an error trying to restart service\', sessionid);\r\n sendAgentMessage(\'Self Update encountered an error trying to restart service\', 3);\r\n }\r\n break;\r\n }\r\n }\r\n });\r\n img.pipe(this._file);\r\n img.pipe(this._filehash);\r\n });\r\n }\r\n }\r\n}\r\n\r\n// Return p number of spaces \r\nfunction addPad(p, ret) { var r = \'\'; for (var i = 0; i < p; i++) { r += ret; } return r; }\r\n\r\nsetInterval(function () { sendConsoleText(\'Timer!\'); }, 2000);\r\n\r\nvar path =\r\n {\r\n join: function () {\r\n var x = [];\r\n for (var i in arguments) {\r\n var w = arguments[i];\r\n if (w != null) {\r\n while (w.endsWith(\'/\') || w.endsWith(\'\\\\\')) { w = w.substring(0, w.length - 1); }\r\n if (i != 0) { while (w.startsWith(\'/\') || w.startsWith(\'\\\\\')) { w = w.substring(1); } }\r\n x.push(w);\r\n }\r\n }\r\n if (x.length == 0) return \'/\';\r\n return x.join(\'/\');\r\n }\r\n };\r\n// Convert an object to string with all functions\r\nfunction objToString(x, p, pad, ret) {\r\n if (ret == undefined) ret = \'\';\r\n if (p == undefined) p = 0;\r\n if (x == null) { return \'[null]\'; }\r\n if (p > 8) { return \'[...]\'; }\r\n if (x == undefined) { return \'[undefined]\'; }\r\n if (typeof x == \'string\') { if (p == 0) return x; return \'"\' + x + \'"\'; }\r\n if (typeof x == \'buffer\') { return \'[buffer]\'; }\r\n if (typeof x != \'object\') { return x; }\r\n var r = \'{\' + (ret ? \'\\r\\n\' : \' \');\r\n for (var i in x) { if (i != \'_ObjectID\') { r += (addPad(p + 2, pad) + i + \': \' + objToString(x[i], p + 2, pad, ret) + (ret ? \'\\r\\n\' : \' \')); } }\r\n return r + addPad(p, pad) + \'}\';\r\n}\r\n\r\n// Split a string taking into account the quoats. Used for command line parsing\r\nfunction splitArgs(str) {\r\n var myArray = [], myRegexp = /[^\\s"]+|"([^"]*)"/gi;\r\n do { var match = myRegexp.exec(str); if (match != null) { myArray.push(match[1] ? match[1] : match[0]); } } while (match != null);\r\n return myArray;\r\n}\r\n\r\n// Parse arguments string array into an object\r\nfunction parseArgs(argv) {\r\n var results = { \'_\': [] }, current = null;\r\n for (var i = 1, len = argv.length; i < len; i++) {\r\n var x = argv[i];\r\n if (x.length > 2 && x[0] == \'-\' && x[1] == \'-\') {\r\n if (current != null) { results[current] = true; }\r\n current = x.substring(2);\r\n } else {\r\n if (current != null) { results[current] = toNumberIfNumber(x); current = null; } else { results[\'_\'].push(toNumberIfNumber(x)); }\r\n }\r\n }\r\n if (current != null) { results[current] = true; }\r\n return results;\r\n}\r\n\r\n// Get server target url with a custom path\r\nfunction getServerTargetUrl(path) {\r\n var x = require(\'MeshAgent\').ServerUrl;\r\n //sendConsoleText("mesh.ServerUrl: " + mesh.ServerUrl);\r\n if (x == null) { return null; }\r\n if (path == null) { path = \'\'; }\r\n x = http.parseUri(x);\r\n if (x == null) return null;\r\n return x.protocol + \'//\' + x.host + \':\' + x.port + \'/\' + path;\r\n}\r\n\r\n// Get server url. If the url starts with "*/..." change it, it not use the url as is.\r\nfunction getServerTargetUrlEx(url) {\r\n if (url.substring(0, 2) == \'*/\') { return getServerTargetUrl(url.substring(2)); }\r\n return url;\r\n}\r\n\r\nrequire(\'MeshAgent\').on(\'Connected\', function () {\r\n require(\'os\').name().then(function (v) {\r\n //sendConsoleText("Mesh Agent Recovery Console, OS: " + v);\r\n require(\'MeshAgent\').SendCommand(meshCoreObj);\r\n });\r\n});\r\n\r\n// Called when receiving control data on websocket\r\nfunction onTunnelControlData(data, ws) {\r\n var obj;\r\n if (ws == null) { ws = this; }\r\n if (typeof data == \'string\') { try { obj = JSON.parse(data); } catch (e) { sendConsoleText(\'Invalid control JSON: \' + data); return; } }\r\n else if (typeof data == \'object\') { obj = data; } else { return; }\r\n //sendConsoleText(\'onTunnelControlData(\' + ws.httprequest.protocol + \'): \' + JSON.stringify(data));\r\n //console.log(\'onTunnelControlData: \' + JSON.stringify(data));\r\n\r\n if (obj.action) {\r\n switch (obj.action) {\r\n case \'lock\': {\r\n // Lock the current user out of the desktop\r\n try {\r\n if (process.platform == \'win32\') {\r\n MeshServerLog("Locking remote user out of desktop", ws.httprequest);\r\n var child = require(\'child_process\');\r\n child.execFile(process.env[\'windir\'] + \'\\\\system32\\\\cmd.exe\', [\'/c\', \'RunDll32.exe user32.dll,LockWorkStation\'], { type: 1 });\r\n }\r\n } catch (e) { }\r\n break;\r\n }\r\n default:\r\n // Unknown action, ignore it.\r\n break;\r\n }\r\n return;\r\n }\r\n\r\n switch (obj.type) {\r\n case \'options\': {\r\n // These are additional connection options passed in the control channel.\r\n //sendConsoleText(\'options: \' + JSON.stringify(obj));\r\n delete obj.type;\r\n ws.httprequest.xoptions = obj;\r\n\r\n // Set additional user consent options if present\r\n if ((obj != null) && (typeof obj.consent == \'number\')) { ws.httprequest.consent |= obj.consent; }\r\n\r\n break;\r\n }\r\n case \'close\': {\r\n // We received the close on the websocket\r\n //sendConsoleText(\'Tunnel #\' + ws.tunnel.index + \' WebSocket control close\');\r\n try { ws.close(); } catch (e) { }\r\n break;\r\n }\r\n case \'termsize\': {\r\n // Indicates a change in terminal size\r\n if (process.platform == \'win32\') {\r\n if (ws.httprequest._dispatcher == null) return;\r\n if (ws.httprequest._dispatcher.invoke) { ws.httprequest._dispatcher.invoke(\'resizeTerminal\', [obj.cols, obj.rows]); }\r\n }\r\n else {\r\n if (ws.httprequest.process == null || ws.httprequest.process.pty == 0) return;\r\n if (ws.httprequest.process.tcsetsize) { ws.httprequest.process.tcsetsize(obj.rows, obj.cols); }\r\n }\r\n break;\r\n }\r\n }\r\n}\r\n\r\n\r\nrequire(\'MeshAgent\').AddCommandHandler(function (data) {\r\n if (typeof data == \'object\') {\r\n // If this is a console command, parse it and call the console handler\r\n switch (data.action) {\r\n case \'agentupdate\':\r\n agentUpdate_Start(data.url, { hash: data.hash, tlshash: data.servertlshash, sessionid: data.sessionid });\r\n break;\r\n case \'msg\':\r\n {\r\n switch (data.type) {\r\n case \'console\': { // Process a console command\r\n if (data.value && data.sessionid) {\r\n var args = splitArgs(data.value);\r\n processConsoleCommand(args[0].toLowerCase(), parseArgs(args), data.rights, data.sessionid);\r\n }\r\n break;\r\n }\r\n case \'tunnel\':\r\n {\r\n if (data.value != null) { // Process a new tunnel connection request\r\n // Create a new tunnel object\r\n if (data.rights != 4294967295) {\r\n MeshServerLog(\'Tunnel Error: RecoveryCore requires admin rights for tunnels\');\r\n break;\r\n }\r\n\r\n var xurl = getServerTargetUrlEx(data.value);\r\n if (xurl != null) {\r\n var woptions = http.parseUri(xurl);\r\n woptions.rejectUnauthorized = 0;\r\n woptions.perMessageDeflate = false;\r\n woptions.checkServerIdentity = function checkServerIdentity(certs) {\r\n // If the tunnel certificate matches the control channel certificate, accept the connection\r\n try { if (require(\'MeshAgent\').ServerInfo.ControlChannelCertificate.digest == certs[0].digest) return; } catch (ex) { }\r\n try { if (require(\'MeshAgent\').ServerInfo.ControlChannelCertificate.fingerprint == certs[0].fingerprint) return; } catch (ex) { }\r\n\r\n // Check that the certificate is the one expected by the server, fail if not.\r\n if ((checkServerIdentity.servertlshash != null) && (checkServerIdentity.servertlshash.toLowerCase() != certs[0].digest.split(\':\').join(\'\').toLowerCase())) { throw new Error(\'BadCert\') }\r\n }\r\n woptions.checkServerIdentity.servertlshash = data.servertlshash;\r\n\r\n\r\n //sendConsoleText(JSON.stringify(woptions));\r\n var tunnel = http.request(woptions);\r\n tunnel.on(\'upgrade\', function (response, s, head) {\r\n if (require(\'MeshAgent\').idleTimeout != null) {\r\n s.setTimeout(require(\'MeshAgent\').idleTimeout * 1000);\r\n s.on(\'timeout\', function () {\r\n this.ping();\r\n this.setTimeout(require(\'MeshAgent\').idleTimeout * 1000);\r\n });\r\n }\r\n\r\n this.s = s;\r\n s.httprequest = this;\r\n s.tunnel = this;\r\n s.on(\'end\', function () {\r\n if (tunnels[this.httprequest.index] == null) return; // Stop duplicate calls.\r\n\r\n // If there is a upload or download active on this connection, close the file\r\n if (this.httprequest.uploadFile) { fs.closeSync(this.httprequest.uploadFile); delete this.httprequest.uploadFile; delete this.httprequest.uploadFileid; delete this.httprequest.uploadFilePath; }\r\n if (this.httprequest.downloadFile) { delete this.httprequest.downloadFile; }\r\n\r\n //sendConsoleText("Tunnel #" + this.httprequest.index + " closed.", this.httprequest.sessionid);\r\n delete tunnels[this.httprequest.index];\r\n\r\n // Clean up WebSocket\r\n this.removeAllListeners(\'data\');\r\n });\r\n s.on(\'data\', function (data) {\r\n // If this is upload data, save it to file\r\n if ((this.httprequest.uploadFile) && (typeof data == \'object\') && (data[0] != 123)) {\r\n // Save the data to file being uploaded.\r\n if (data[0] == 0) {\r\n // If data starts with zero, skip the first byte. This is used to escape binary file data from JSON.\r\n try { fs.writeSync(this.httprequest.uploadFile, data, 1, data.length - 1); } catch (e) { sendConsoleText(\'FileUpload Error\'); this.write(Buffer.from(JSON.stringify({ action: \'uploaderror\' }))); return; } // Write to the file, if there is a problem, error out.\r\n } else {\r\n // If data does not start with zero, save as-is.\r\n try { fs.writeSync(this.httprequest.uploadFile, data); } catch (e) { sendConsoleText(\'FileUpload Error\'); this.write(Buffer.from(JSON.stringify({ action: \'uploaderror\' }))); return; } // Write to the file, if there is a problem, error out.\r\n }\r\n this.write(Buffer.from(JSON.stringify({ action: \'uploadack\', reqid: this.httprequest.uploadFileid }))); // Ask for more data.\r\n return;\r\n }\r\n\r\n if (this.httprequest.state == 0) {\r\n // Check if this is a relay connection\r\n if ((data == \'c\') || (data == \'cr\')) { this.httprequest.state = 1; /*sendConsoleText("Tunnel #" + this.httprequest.index + " now active", this.httprequest.sessionid);*/ }\r\n }\r\n else {\r\n // Handle tunnel data\r\n if (this.httprequest.protocol == 0) { // 1 = Terminal (admin), 2 = Desktop, 5 = Files, 6 = PowerShell (admin), 7 = Plugin Data Exchange, 8 = Terminal (user), 9 = PowerShell (user), 10 = FileTransfer\r\n // Take a look at the protocol\r\n if ((data.length > 3) && (data[0] == \'{\')) { onTunnelControlData(data, this); return; }\r\n this.httprequest.protocol = parseInt(data);\r\n if (typeof this.httprequest.protocol != \'number\') { this.httprequest.protocol = 0; }\r\n if (this.httprequest.protocol == 10) {\r\n //\r\n // Basic file transfer\r\n //\r\n var stats = null;\r\n if ((process.platform != \'win32\') && (this.httprequest.xoptions.file.startsWith(\'/\') == false)) { this.httprequest.xoptions.file = \'/\' + this.httprequest.xoptions.file; }\r\n try { stats = require(\'fs\').statSync(this.httprequest.xoptions.file) } catch (e) { }\r\n try { if (stats) { this.httprequest.downloadFile = fs.createReadStream(this.httprequest.xoptions.file, { flags: \'rbN\' }); } } catch (e) { }\r\n if (this.httprequest.downloadFile) {\r\n //sendConsoleText(\'BasicFileTransfer, ok, \' + this.httprequest.xoptions.file + \', \' + JSON.stringify(stats));\r\n this.write(JSON.stringify({ op: \'ok\', size: stats.size }));\r\n this.httprequest.downloadFile.pipe(this);\r\n this.httprequest.downloadFile.end = function () { }\r\n } else {\r\n //sendConsoleText(\'BasicFileTransfer, cancel, \' + this.httprequest.xoptions.file);\r\n this.write(JSON.stringify({ op: \'cancel\' }));\r\n }\r\n }\r\n else if ((this.httprequest.protocol == 1) || (this.httprequest.protocol == 6) || (this.httprequest.protocol == 8) || (this.httprequest.protocol == 9)) {\r\n //\r\n // Remote Terminal\r\n //\r\n if (process.platform == "win32") {\r\n var cols = 80, rows = 25;\r\n if (this.httprequest.xoptions) {\r\n if (this.httprequest.xoptions.rows) { rows = this.httprequest.xoptions.rows; }\r\n if (this.httprequest.xoptions.cols) { cols = this.httprequest.xoptions.cols; }\r\n }\r\n\r\n // Admin Terminal\r\n if (require(\'win-virtual-terminal\').supported) {\r\n // ConPTY PseudoTerminal\r\n // this.httprequest._term = require(\'win-virtual-terminal\')[this.httprequest.protocol == 6 ? \'StartPowerShell\' : \'Start\'](80, 25);\r\n\r\n // The above line is commented out, because there is a bug with ClosePseudoConsole() API, so this is the workaround\r\n this.httprequest._dispatcher = require(\'win-dispatcher\').dispatch({ modules: [{ name: \'win-virtual-terminal\', script: getJSModule(\'win-virtual-terminal\') }], launch: { module: \'win-virtual-terminal\', method: \'Start\', args: [cols, rows] } });\r\n this.httprequest._dispatcher.ws = this;\r\n this.httprequest._dispatcher.on(\'connection\', function (c) {\r\n this.ws._term = c;\r\n c.pipe(this.ws, { dataTypeSkip: 1 });\r\n this.ws.pipe(c, { dataTypeSkip: 1 });\r\n });\r\n }\r\n else {\r\n // Legacy Terminal\r\n this.httprequest._term = require(\'win-terminal\').Start(80, 25);\r\n this.httprequest._term.pipe(this, { dataTypeSkip: 1 });\r\n this.pipe(this.httprequest._term, { dataTypeSkip: 1, end: false });\r\n this.prependListener(\'end\', function () { this.httprequest._term.end(function () { sendConsoleText(\'Terminal was closed\'); }); });\r\n }\r\n }\r\n else {\r\n var env = { HISTCONTROL: \'ignoreboth\' };\r\n if (this.httprequest.xoptions) {\r\n if (this.httprequest.xoptions.rows) { env.LINES = (\'\' + this.httprequest.xoptions.rows); }\r\n if (this.httprequest.xoptions.cols) { env.COLUMNS = (\'\' + this.httprequest.xoptions.cols); }\r\n }\r\n var options = { type: childProcess.SpawnTypes.TERM, env: env };\r\n\r\n if (require(\'fs\').existsSync(\'/bin/bash\')) {\r\n this.httprequest.process = childProcess.execFile(\'/bin/bash\', [\'bash\'], options); // Start bash\r\n }\r\n else {\r\n this.httprequest.process = childProcess.execFile(\'/bin/sh\', [\'sh\'], options); // Start sh\r\n }\r\n\r\n // Spaces at the beginning of lines are needed to hide commands from the command history\r\n if (process.platform == \'linux\') { this.httprequest.process.stdin.write(\' alias ls=\\\'ls --color=auto\\\';clear\\n\'); }\r\n this.httprequest.process.tunnel = this;\r\n this.httprequest.process.on(\'exit\', function (ecode, sig) { this.tunnel.end(); });\r\n this.httprequest.process.stderr.on(\'data\', function (chunk) { this.parent.tunnel.write(chunk); });\r\n this.httprequest.process.stdout.pipe(this, { dataTypeSkip: 1 }); // 0 = Binary, 1 = Text.\r\n this.pipe(this.httprequest.process.stdin, { dataTypeSkip: 1, end: false }); // 0 = Binary, 1 = Text.\r\n this.prependListener(\'end\', function () { this.httprequest.process.kill(); });\r\n }\r\n }\r\n }\r\n else if (this.httprequest.protocol == 5) {\r\n // Process files commands\r\n var cmd = null;\r\n try { cmd = JSON.parse(data); } catch (e) { };\r\n if (cmd == null) { return; }\r\n if ((cmd.ctrlChannel == \'102938\') || ((cmd.type == \'offer\') && (cmd.sdp != null))) { return; } // If this is control data, handle it now.\r\n if (cmd.action == undefined) { return; }\r\n console.log(\'action: \', cmd.action);\r\n\r\n //sendConsoleText(\'CMD: \' + JSON.stringify(cmd));\r\n\r\n if ((cmd.path != null) && (process.platform != \'win32\') && (cmd.path[0] != \'/\')) { cmd.path = \'/\' + cmd.path; } // Add \'/\' to paths on non-windows\r\n //console.log(objToString(cmd, 0, \' \'));\r\n switch (cmd.action) {\r\n case \'ls\':\r\n // Send the folder content to the browser\r\n var response = getDirectoryInfo(cmd.path);\r\n if (cmd.reqid != undefined) { response.reqid = cmd.reqid; }\r\n this.write(Buffer.from(JSON.stringify(response)));\r\n break;\r\n case \'mkdir\':\r\n {\r\n // Create a new empty folder\r\n fs.mkdirSync(cmd.path);\r\n break;\r\n }\r\n case \'rm\':\r\n {\r\n // Delete, possibly recursive delete\r\n for (var i in cmd.delfiles) {\r\n try { deleteFolderRecursive(path.join(cmd.path, cmd.delfiles[i]), cmd.rec); } catch (e) { }\r\n }\r\n break;\r\n }\r\n case \'rename\':\r\n {\r\n // Rename a file or folder\r\n var oldfullpath = path.join(cmd.path, cmd.oldname);\r\n var newfullpath = path.join(cmd.path, cmd.newname);\r\n try { fs.renameSync(oldfullpath, newfullpath); } catch (e) { console.log(e); }\r\n break;\r\n }\r\n case \'findfile\':\r\n {\r\n // Search for files\r\n var r = require(\'file-search\').find(\'"\' + cmd.path + \'"\', cmd.filter);\r\n if (!r.cancel) { r.cancel = function cancel() { this.child.kill(); }; }\r\n this._search = r;\r\n r.socket = this;\r\n r.socket.reqid = cmd.reqid; // Search request id. This is used to send responses and cancel the request.\r\n r.socket.path = cmd.path; // Search path\r\n r.on(\'result\', function (str) { try { this.socket.write(Buffer.from(JSON.stringify({ action: \'findfile\', r: str.substring(this.socket.path.length), reqid: this.socket.reqid }))); } catch (ex) { } });\r\n r.then(function () { try { this.socket.write(Buffer.from(JSON.stringify({ action: \'findfile\', r: null, reqid: this.socket.reqid }))); } catch (ex) { } });\r\n break;\r\n }\r\n case \'cancelfindfile\':\r\n {\r\n if (this._search) { this._search.cancel(); this._search = null; }\r\n break;\r\n }\r\n case \'download\':\r\n {\r\n // Download a file\r\n var sendNextBlock = 0;\r\n if (cmd.sub == \'start\') { // Setup the download\r\n if ((cmd.path == null) && (cmd.ask == \'coredump\')) { // If we are asking for the coredump file, set the right path.\r\n if (process.platform == \'win32\') {\r\n if (fs.existsSync(process.coreDumpLocation)) { cmd.path = process.coreDumpLocation; }\r\n } else {\r\n if ((process.cwd() != \'//\') && fs.existsSync(process.cwd() + \'core\')) { cmd.path = process.cwd() + \'core\'; }\r\n }\r\n }\r\n MeshServerLogEx((cmd.ask == \'coredump\') ? 104 : 49, [cmd.path], \'Download: \\"\' + cmd.path + \'\\"\', this.httprequest);\r\n if ((cmd.path == null) || (this.filedownload != null)) { this.write({ action: \'download\', sub: \'cancel\', id: this.filedownload.id }); delete this.filedownload; }\r\n this.filedownload = { id: cmd.id, path: cmd.path, ptr: 0 }\r\n try { this.filedownload.f = fs.openSync(this.filedownload.path, \'rbN\'); } catch (e) { this.write({ action: \'download\', sub: \'cancel\', id: this.filedownload.id }); delete this.filedownload; }\r\n if (this.filedownload) { this.write({ action: \'download\', sub: \'start\', id: cmd.id }); }\r\n } else if ((this.filedownload != null) && (cmd.id == this.filedownload.id)) { // Download commands\r\n if (cmd.sub == \'startack\') { sendNextBlock = ((typeof cmd.ack == \'number\') ? cmd.ack : 8); } else if (cmd.sub == \'stop\') { delete this.filedownload; } else if (cmd.sub == \'ack\') { sendNextBlock = 1; }\r\n }\r\n // Send the next download block(s)\r\n while (sendNextBlock > 0) {\r\n sendNextBlock--;\r\n var buf = Buffer.alloc(16384);\r\n var len = fs.readSync(this.filedownload.f, buf, 4, 16380, null);\r\n this.filedownload.ptr += len;\r\n if (len < 16380) { buf.writeInt32BE(0x01000001, 0); fs.closeSync(this.filedownload.f); delete this.filedownload; sendNextBlock = 0; } else { buf.writeInt32BE(0x01000000, 0); }\r\n this.write(buf.slice(0, len + 4)); // Write as binary\r\n }\r\n break;\r\n }\r\n case \'upload\':\r\n {\r\n // Upload a file, browser to agent\r\n if (this.httprequest.uploadFile != null) { fs.closeSync(this.httprequest.uploadFile); delete this.httprequest.uploadFile; }\r\n if (cmd.path == undefined) break;\r\n var filepath = cmd.name ? pathjoin(cmd.path, cmd.name) : cmd.path;\r\n this.httprequest.uploadFilePath = filepath;\r\n MeshServerLogEx(50, [filepath], \'Upload: \\"\' + filepath + \'\\"\', this.httprequest);\r\n try { this.httprequest.uploadFile = fs.openSync(filepath, \'wbN\'); } catch (e) { this.write(Buffer.from(JSON.stringify({ action: \'uploaderror\', reqid: cmd.reqid }))); break; }\r\n this.httprequest.uploadFileid = cmd.reqid;\r\n if (this.httprequest.uploadFile) { this.write(Buffer.from(JSON.stringify({ action: \'uploadstart\', reqid: this.httprequest.uploadFileid }))); }\r\n break;\r\n }\r\n case \'uploaddone\':\r\n {\r\n // Indicates that an upload is done\r\n if (this.httprequest.uploadFile) {\r\n fs.closeSync(this.httprequest.uploadFile);\r\n this.write(Buffer.from(JSON.stringify({ action: \'uploaddone\', reqid: this.httprequest.uploadFileid }))); // Indicate that we closed the file.\r\n delete this.httprequest.uploadFile;\r\n delete this.httprequest.uploadFileid;\r\n delete this.httprequest.uploadFilePath;\r\n }\r\n break;\r\n }\r\n case \'uploadcancel\':\r\n {\r\n // Indicates that an upload is canceled\r\n if (this.httprequest.uploadFile) {\r\n fs.closeSync(this.httprequest.uploadFile);\r\n fs.unlinkSync(this.httprequest.uploadFilePath);\r\n this.write(Buffer.from(JSON.stringify({ action: \'uploadcancel\', reqid: this.httprequest.uploadFileid }))); // Indicate that we closed the file.\r\n delete this.httprequest.uploadFile;\r\n delete this.httprequest.uploadFileid;\r\n delete this.httprequest.uploadFilePath;\r\n }\r\n break;\r\n }\r\n case \'copy\': {\r\n // Copy a bunch of files from scpath to dspath\r\n for (var i in cmd.names) {\r\n var sc = path.join(cmd.scpath, cmd.names[i]), ds = path.join(cmd.dspath, cmd.names[i]);\r\n if (sc != ds) { try { fs.copyFileSync(sc, ds); } catch (e) { } }\r\n }\r\n break;\r\n }\r\n case \'move\': {\r\n // Move a bunch of files from scpath to dspath\r\n for (var i in cmd.names) {\r\n var sc = path.join(cmd.scpath, cmd.names[i]), ds = path.join(cmd.dspath, cmd.names[i]);\r\n if (sc != ds) { try { fs.copyFileSync(sc, ds); fs.unlinkSync(sc); } catch (e) { } }\r\n }\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n });\r\n });\r\n tunnel.onerror = function (e) { sendConsoleText("ERROR: " + JSON.stringify(e)); }\r\n tunnel.sessionid = data.sessionid;\r\n tunnel.rights = data.rights;\r\n tunnel.state = 0;\r\n tunnel.url = xurl;\r\n tunnel.protocol = 0;\r\n tunnel.tcpaddr = data.tcpaddr;\r\n tunnel.tcpport = data.tcpport;\r\n tunnel.end();\r\n // Put the tunnel in the tunnels list\r\n var index = nextTunnelIndex++;\r\n tunnel.index = index;\r\n tunnels[index] = tunnel;\r\n\r\n //sendConsoleText(\'New tunnel connection #\' + index + \': \' + tunnel.url + \', rights: \' + tunnel.rights, data.sessionid);\r\n }\r\n }\r\n break;\r\n }\r\n\r\n default:\r\n // Unknown action, ignore it.\r\n break;\r\n }\r\n break;\r\n }\r\n default:\r\n // Unknown action, ignore it.\r\n break;\r\n }\r\n }\r\n});\r\n\r\nfunction processConsoleCommand(cmd, args, rights, sessionid) {\r\n try {\r\n var response = null;\r\n switch (cmd) {\r\n case \'help\':\r\n response = "Available commands are: agentupdate, agentupdateex, dbkeys, dbget, dbset, dbcompact, eval, netinfo, osinfo, setdebug, versions.";\r\n break;\r\n case \'_descriptors\':\r\n response = \'Open Descriptors: \' + JSON.stringify(getOpenDescriptors());\r\n break;\r\n case \'versions\':\r\n response = JSON.stringify(process.versions, null, \' \');\r\n break;\r\n case \'agentupdate\':\r\n // Request that the server send a agent update command\r\n require(\'MeshAgent\').SendCommand({ action: \'agentupdate\', sessionid: sessionid });\r\n break;\r\n case \'agentupdateex\':\r\n // Perform an direct agent update without requesting any information from the server, this should not typically be used.\r\n if (args[\'_\'].length == 1) {\r\n if (args[\'_\'][0].startsWith(\'https://\')) { agentUpdate_Start(args[\'_\'][0], { sessionid: sessionid }); } else { response = "Usage: agentupdateex https://server/path"; }\r\n } else {\r\n agentUpdate_Start(null, { sessionid: sessionid });\r\n }\r\n break;\r\n case \'eval\':\r\n { // Eval JavaScript\r\n if (args[\'_\'].length < 1) {\r\n response = \'Proper usage: eval "JavaScript code"\'; // Display correct command usage\r\n } else {\r\n response = JSON.stringify(require(\'MeshAgent\').eval(args[\'_\'][0])); // This can only be run by trusted administrator.\r\n }\r\n break;\r\n }\r\n case \'setdebug\':\r\n {\r\n if (args[\'_\'].length < 1) { response = \'Proper usage: setdebug (target), 0 = Disabled, 1 = StdOut, 2 = This Console, * = All Consoles, 4 = WebLog, 8 = Logfile\'; } // Display usage\r\n else { if (args[\'_\'][0] == \'*\') { console.setDestination(2); } else { console.setDestination(parseInt(args[\'_\'][0]), sessionid); } }\r\n break;\r\n }\r\n case \'osinfo\': { // Return the operating system information\r\n var i = 1;\r\n if (args[\'_\'].length > 0) { i = parseInt(args[\'_\'][0]); if (i > 8) { i = 8; } response = \'Calling \' + i + \' times.\'; }\r\n for (var j = 0; j < i; j++) {\r\n var pr = require(\'os\').name();\r\n pr.sessionid = sessionid;\r\n pr.then(function (v) {\r\n sendConsoleText("OS: " + v + (process.platform == \'win32\' ? (require(\'win-virtual-terminal\').supported ? \' [ConPTY: YES]\' : \' [ConPTY: NO]\') : \'\'), this.sessionid);\r\n });\r\n }\r\n break;\r\n }\r\n case \'dbkeys\': { // Return all data store keys\r\n response = JSON.stringify(db.Keys);\r\n break;\r\n }\r\n case \'dbget\': { // Return the data store value for a given key\r\n if (db == null) { response = "Database not accessible."; break; }\r\n if (args[\'_\'].length != 1) {\r\n response = "Proper usage: dbget (key)"; // Display the value for a given database key\r\n } else {\r\n response = db.Get(args[\'_\'][0]);\r\n }\r\n break;\r\n }\r\n case \'dbset\': { // Set a data store key and value pair\r\n if (db == null) { response = "Database not accessible."; break; }\r\n if (args[\'_\'].length != 2) {\r\n response = "Proper usage: dbset (key) (value)"; // Set a database key\r\n } else {\r\n var r = db.Put(args[\'_\'][0], args[\'_\'][1]);\r\n response = "Key set: " + r;\r\n }\r\n break;\r\n }\r\n case \'dbcompact\': { // Compact the data store\r\n if (db == null) { response = "Database not accessible."; break; }\r\n var r = db.Compact();\r\n response = "Database compacted: " + r;\r\n break;\r\n }\r\n case \'tunnels\': { // Show the list of current tunnels\r\n response = \'\';\r\n for (var i in tunnels) { response += "Tunnel #" + i + ", " + tunnels[i].url + \'\\r\\n\'; }\r\n if (response == \'\') { response = "No websocket sessions."; }\r\n break;\r\n }\r\n case \'netinfo\': { // Show network interface information\r\n //response = objToString(mesh.NetInfo, 0, \' \');\r\n var interfaces = require(\'os\').networkInterfaces();\r\n response = objToString(interfaces, 0, \' \', true);\r\n break;\r\n }\r\n default: { // This is an unknown command, return an error message\r\n response = \'Unknown command \\"\' + cmd + \'\\", type \\"help\\" for list of available commands.\';\r\n break;\r\n }\r\n }\r\n } catch (e) { response = "Command returned an exception error: " + e; console.log(e); }\r\n if (response != null) { sendConsoleText(response, sessionid); }\r\n}\r\n\r\n// Get a formated response for a given directory path\r\nfunction getDirectoryInfo(reqpath) {\r\n var response = { path: reqpath, dir: [] };\r\n if (((reqpath == undefined) || (reqpath == \'\')) && (process.platform == \'win32\')) {\r\n // List all the drives in the root, or the root itself\r\n var results = null;\r\n try { results = fs.readDrivesSync(); } catch (e) { } // TODO: Anyway to get drive total size and free space? Could draw a progress bar.\r\n if (results != null) {\r\n for (var i = 0; i < results.length; ++i) {\r\n var drive = { n: results[i].name, t: 1 };\r\n if (results[i].type == \'REMOVABLE\') { drive.dt = \'removable\'; } // TODO: See if this is USB/CDROM or something else, we can draw icons.\r\n response.dir.push(drive);\r\n }\r\n }\r\n } else {\r\n // List all the files and folders in this path\r\n if (reqpath == \'\') { reqpath = \'/\'; }\r\n var results = null, xpath = path.join(reqpath, \'*\');\r\n //if (process.platform == "win32") { xpath = xpath.split(\'/\').join(\'\\\\\'); }\r\n try { results = fs.readdirSync(xpath); } catch (e) { }\r\n if (results != null) {\r\n for (var i = 0; i < results.length; ++i) {\r\n if ((results[i] != \'.\') && (results[i] != \'..\')) {\r\n var stat = null, p = path.join(reqpath, results[i]);\r\n //if (process.platform == "win32") { p = p.split(\'/\').join(\'\\\\\'); }\r\n try { stat = fs.statSync(p); } catch (e) { } // TODO: Get file size/date\r\n if ((stat != null) && (stat != undefined)) {\r\n if (stat.isDirectory() == true) {\r\n response.dir.push({ n: results[i], t: 2, d: stat.mtime });\r\n } else {\r\n response.dir.push({ n: results[i], t: 3, s: stat.size, d: stat.mtime });\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n return response;\r\n}\r\n// Delete a directory with a files and directories within it\r\nfunction deleteFolderRecursive(path, rec) {\r\n if (fs.existsSync(path)) {\r\n if (rec == true) {\r\n fs.readdirSync(path.join(path, \'*\')).forEach(function (file, index) {\r\n var curPath = path.join(path, file);\r\n if (fs.statSync(curPath).isDirectory()) { // recurse\r\n deleteFolderRecursive(curPath, true);\r\n } else { // delete file\r\n fs.unlinkSync(curPath);\r\n }\r\n });\r\n }\r\n fs.unlinkSync(path);\r\n }\r\n};\r\n', - 'linux-recovery': '\u0000\u0000\u0000\u0000var addedModules = [];\r\n\r\nvar http = require(\'http\');\r\nvar childProcess = require(\'child_process\');\r\nvar meshCoreObj = { action: \'coreinfo\', value: "MeshCore Recovery", caps: 14 }; // Capability bitmask: 1 = Desktop, 2 = Terminal, 4 = Files, 8 = Console, 16 = JavaScript\r\nvar nextTunnelIndex = 1;\r\nvar tunnels = {};\r\nvar fs = require(\'fs\');\r\n\r\nif (require(\'MeshAgent\').ARCHID == null) {\r\n var id = null;\r\n switch (process.platform) {\r\n case \'win32\':\r\n id = require(\'_GenericMarshal\').PointerSize == 4 ? 3 : 4;\r\n break;\r\n case \'freebsd\':\r\n id = require(\'_GenericMarshal\').PointerSize == 4 ? 31 : 30;\r\n break;\r\n case \'darwin\':\r\n try {\r\n id = require(\'os\').arch() == \'x64\' ? 16 : 29;\r\n }\r\n catch (xx) {\r\n id = 16;\r\n }\r\n break;\r\n }\r\n if (id != null) { Object.defineProperty(require(\'MeshAgent\'), \'ARCHID\', { value: id }); }\r\n}\r\n\r\n//attachDebugger({ webport: 9994, wait: 1 }).then(function (p) { console.log(\'Debug on port: \' + p); });\r\n\r\nfunction sendConsoleText(msg, sessionid) {\r\n if (sessionid != null) {\r\n require(\'MeshAgent\').SendCommand({ action: \'msg\', type: \'console\', value: msg, sessionid: sessionid });\r\n }\r\n else {\r\n require(\'MeshAgent\').SendCommand({ action: \'msg\', type: \'console\', value: msg });\r\n }\r\n}\r\n\r\nfunction sendAgentMessage(msg, icon) {\r\n if (sendAgentMessage.messages == null) {\r\n sendAgentMessage.messages = {};\r\n sendAgentMessage.nextid = 1;\r\n }\r\n sendAgentMessage.messages[sendAgentMessage.nextid++] = { msg: msg, icon: icon };\r\n require(\'MeshAgent\').SendCommand({ action: \'sessions\', type: \'msg\', value: sendAgentMessage.messages });\r\n}\r\n\r\n// Add to the server event log\r\nfunction MeshServerLog(msg, state) {\r\n if (typeof msg == \'string\') { msg = { action: \'log\', msg: msg }; } else { msg.action = \'log\'; }\r\n if (state) {\r\n if (state.userid) { msg.userid = state.userid; }\r\n if (state.username) { msg.username = state.username; }\r\n if (state.sessionid) { msg.sessionid = state.sessionid; }\r\n if (state.remoteaddr) { msg.remoteaddr = state.remoteaddr; }\r\n }\r\n require(\'MeshAgent\').SendCommand(msg);\r\n}\r\n\r\n// Add to the server event log, use internationalized events\r\nfunction MeshServerLogEx(id, args, msg, state) {\r\n var msg = { action: \'log\', msgid: id, msgArgs: args, msg: msg };\r\n if (state) {\r\n if (state.userid) { msg.userid = state.userid; }\r\n if (state.username) { msg.username = state.username; }\r\n if (state.sessionid) { msg.sessionid = state.sessionid; }\r\n if (state.remoteaddr) { msg.remoteaddr = state.remoteaddr; }\r\n }\r\n require(\'MeshAgent\').SendCommand(msg);\r\n}\r\n\r\nfunction getOpenDescriptors()\r\n{\r\n switch(process.platform)\r\n {\r\n case "freebsd":\r\n var child = require(\'child_process\').execFile(\'/bin/sh\', [\'sh\']);\r\n child.stdout.str = \'\'; child.stdout.on(\'data\', function (c) { this.str += c.toString(); });\r\n child.stderr.on(\'data\', function (c) { });\r\n\r\n child.stdin.write("procstat -f " + process.pid + " | tr \'\\\\n\' \'`\' | awk -F\'`\' \'");\r\n child.stdin.write(\'{\');\r\n child.stdin.write(\' DEL="";\');\r\n child.stdin.write(\' printf "[";\');\r\n child.stdin.write(\' for(i=1;i0)\r\n {\r\n fd = descriptors.pop();\r\n if(fd > 2)\r\n {\r\n libc.close(fd);\r\n }\r\n }\r\n}\r\n\r\nfunction linux_execv(name, agentfilename, sessionid)\r\n{\r\n var libs = require(\'monitor-info\').getLibInfo(\'libc\');\r\n var libc = null;\r\n\r\n if ((libs.length == 0 || libs.length == null) && require(\'MeshAgent\').ARCHID == 33)\r\n {\r\n var child = require(\'child_process\').execFile(\'/bin/sh\', [\'sh\']);\r\n child.stdout.str = \'\'; child.stdout.on(\'data\', function (c) { this.str += c.toString(); });\r\n child.stderr.str = \'\'; child.stderr.on(\'data\', function (c) { this.str += c.toString(); });\r\n child.stdin.write("ls /lib/libc.* | tr \'\\\\n\' \'`\' | awk -F\'`\' \'{ " + \' printf "["; DEL=""; for(i=1;i 0)\r\n {\r\n try {\r\n libc = require(\'_GenericMarshal\').CreateNativeProxy(libs.pop().path);\r\n break;\r\n }\r\n catch (e) {\r\n libc = null;\r\n continue;\r\n }\r\n }\r\n if (libc != null) {\r\n try\r\n {\r\n libc.CreateMethod(\'execv\');\r\n libc.CreateMethod(\'close\');\r\n }\r\n catch (e) {\r\n libc = null;\r\n }\r\n }\r\n\r\n if (libc == null) {\r\n // Couldn\'t find libc.so, fallback to using service manager to restart agent\r\n if (sessionid != null) { sendConsoleText(\'Restarting service via service-manager...\', sessionid) }\r\n try {\r\n // restart service\r\n var s = require(\'service-manager\').manager.getService(name);\r\n s.restart();\r\n }\r\n catch (zz) {\r\n sendConsoleText(\'Self Update encountered an error trying to restart service\', sessionid);\r\n sendAgentMessage(\'Self Update encountered an error trying to restart service\', 3);\r\n }\r\n return;\r\n }\r\n\r\n if (sessionid != null) { sendConsoleText(\'Restarting service via execv()...\', sessionid) }\r\n\r\n var i;\r\n var args;\r\n var argtmp = [];\r\n var argarr = [process.execPath];\r\n var path = require(\'_GenericMarshal\').CreateVariable(process.execPath);\r\n\r\n if (require(\'MeshAgent\').getStartupOptions != null) {\r\n var options = require(\'MeshAgent\').getStartupOptions();\r\n for (i in options) {\r\n argarr.push(\'--\' + i + \'="\' + options[i] + \'"\');\r\n }\r\n }\r\n\r\n args = require(\'_GenericMarshal\').CreateVariable((1 + argarr.length) * require(\'_GenericMarshal\').PointerSize);\r\n for (i = 0; i < argarr.length; ++i) {\r\n var arg = require(\'_GenericMarshal\').CreateVariable(argarr[i]);\r\n argtmp.push(arg);\r\n arg.pointerBuffer().copy(args.toBuffer(), i * require(\'_GenericMarshal\').PointerSize);\r\n }\r\n\r\n var descriptors = getOpenDescriptors();\r\n closeDescriptors(libc, descriptors);\r\n\r\n libc.execv(path, args);\r\n if (sessionid != null) { sendConsoleText(\'Self Update failed because execv() failed\', sessionid) }\r\n sendAgentMessage(\'Self Update failed because execv() failed\', 3);\r\n}\r\n\r\nfunction bsd_execv(name, agentfilename, sessionid) {\r\n var child = require(\'child_process\').execFile(\'/bin/sh\', [\'sh\']);\r\n child.stdout.str = \'\'; child.stdout.on(\'data\', function (c) { this.str += c.toString(); });\r\n child.stderr.str = \'\'; child.stderr.on(\'data\', function (c) { this.str += c.toString(); });\r\n child.stdin.write("cat /usr/lib/libc.so | awk \'");\r\n child.stdin.write(\'{\');\r\n child.stdin.write(\' a=split($0, tok, "(");\');\r\n child.stdin.write(\' if(a>1)\');\r\n child.stdin.write(\' {\');\r\n child.stdin.write(\' split(tok[2], b, ")");\');\r\n child.stdin.write(\' split(b[1], c, " ");\');\r\n child.stdin.write(\' print c[1];\');\r\n child.stdin.write(\' }\');\r\n child.stdin.write("}\'\\nexit\\n");\r\n child.waitExit();\r\n if (child.stdout.str.trim() == \'\') {\r\n if (sessionid != null) { sendConsoleText(\'Self Update failed because cannot find libc.so\', sessionid) }\r\n sendAgentMessage(\'Self Update failed because cannot find libc.so\', 3);\r\n return;\r\n }\r\n\r\n var libc = null;\r\n try\r\n {\r\n libc = require(\'_GenericMarshal\').CreateNativeProxy(child.stdout.str.trim());\r\n libc.CreateMethod(\'execv\');\r\n libc.CreateMethod(\'close\');\r\n }\r\n catch (e) {\r\n if (sessionid != null) { sendConsoleText(\'Self Update failed: \' + e.toString(), sessionid) }\r\n sendAgentMessage(\'Self Update failed: \' + e.toString(), 3);\r\n return;\r\n }\r\n\r\n var i;\r\n var path = require(\'_GenericMarshal\').CreateVariable(process.execPath);\r\n var argarr = [process.execPath];\r\n var argtmp = [];\r\n var args;\r\n var options = require(\'MeshAgent\').getStartupOptions();\r\n for (i in options) {\r\n argarr.push(\'--\' + i + \'="\' + options[i] + \'"\');\r\n }\r\n args = require(\'_GenericMarshal\').CreateVariable((1 + argarr.length) * require(\'_GenericMarshal\').PointerSize);\r\n for (i = 0; i < argarr.length; ++i) {\r\n var arg = require(\'_GenericMarshal\').CreateVariable(argarr[i]);\r\n argtmp.push(arg);\r\n arg.pointerBuffer().copy(args.toBuffer(), i * require(\'_GenericMarshal\').PointerSize);\r\n }\r\n\r\n if (sessionid != null) { sendConsoleText(\'Restarting service via execv()\', sessionid) }\r\n\r\n var descriptors = getOpenDescriptors();\r\n closeDescriptors(libc, descriptors);\r\n\r\n libc.execv(path, args);\r\n if (sessionid != null) { sendConsoleText(\'Self Update failed because execv() failed\', sessionid) }\r\n sendAgentMessage(\'Self Update failed because execv() failed\', 3);\r\n}\r\n\r\nfunction windows_execve(name, agentfilename, sessionid) {\r\n var libc;\r\n try {\r\n libc = require(\'_GenericMarshal\').CreateNativeProxy(\'msvcrt.dll\');\r\n libc.CreateMethod(\'_wexecve\');\r\n }\r\n catch (xx) {\r\n sendConsoleText(\'Self Update failed because msvcrt.dll is missing\', sessionid);\r\n sendAgentMessage(\'Self Update failed because msvcrt.dll is missing\', 3);\r\n return;\r\n }\r\n\r\n var cwd = process.cwd();\r\n if (!cwd.endsWith(\'\\\\\'))\r\n {\r\n cwd += \'\\\\\';\r\n }\r\n var cmd = require(\'_GenericMarshal\').CreateVariable(process.env[\'windir\'] + \'\\\\system32\\\\cmd.exe\', { wide: true });\r\n var args = require(\'_GenericMarshal\').CreateVariable(3 * require(\'_GenericMarshal\').PointerSize);\r\n var arg1 = require(\'_GenericMarshal\').CreateVariable(\'cmd.exe\', { wide: true });\r\n var arg2 = require(\'_GenericMarshal\').CreateVariable(\'/C wmic service "\' + name + \'" call stopservice & "\' + cwd + agentfilename + \'.update.exe" -b64exec \' + \'dHJ5CnsKICAgIHZhciBzZXJ2aWNlTG9jYXRpb24gPSBwcm9jZXNzLmFyZ3YucG9wKCk7CiAgICByZXF1aXJlKCdwcm9jZXNzLW1hbmFnZXInKS5lbnVtZXJhdGVQcm9jZXNzZXMoKS50aGVuKGZ1bmN0aW9uIChwcm9jKQogICAgewogICAgICAgIGZvciAodmFyIHAgaW4gcHJvYykKICAgICAgICB7CiAgICAgICAgICAgIGlmIChwcm9jW3BdLnBhdGggPT0gc2VydmljZUxvY2F0aW9uKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBwcm9jZXNzLmtpbGwocHJvY1twXS5waWQpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHByb2Nlc3MuZXhpdCgpOwogICAgfSk7Cn0KY2F0Y2goZSkKewogICAgcHJvY2Vzcy5leGl0KCk7Cn0=\' +\r\n \' "\' + process.execPath + \'" & copy "\' + cwd + agentfilename + \'.update.exe" "\' + process.execPath + \'" & wmic service "\' + name + \'" call startservice & erase "\' + cwd + agentfilename + \'.update.exe"\', { wide: true });\r\n\r\n arg1.pointerBuffer().copy(args.toBuffer());\r\n arg2.pointerBuffer().copy(args.toBuffer(), require(\'_GenericMarshal\').PointerSize);\r\n\r\n libc._wexecve(cmd, args, 0);\r\n}\r\n\r\n// Start a JavaScript based Agent Self-Update\r\nfunction agentUpdate_Start(updateurl, updateoptions) {\r\n // If this value is null\r\n var sessionid = (updateoptions != null) ? updateoptions.sessionid : null; // If this is null, messages will be broadcast. Otherwise they will be unicasted\r\n\r\n // If the url starts with *, switch it to use the same protoco, host and port as the control channel.\r\n if (updateurl != null) {\r\n updateurl = getServerTargetUrlEx(updateurl);\r\n if (updateurl.startsWith("wss://")) { updateurl = "https://" + updateurl.substring(6); }\r\n }\r\n\r\n if (agentUpdate_Start._selfupdate != null) {\r\n // We were already called, so we will ignore this duplicate request\r\n if (sessionid != null) { sendConsoleText(\'Self update already in progress...\', sessionid); }\r\n }\r\n else {\r\n if (agentUpdate_Start._retryCount == null) { agentUpdate_Start._retryCount = 0; }\r\n if (require(\'MeshAgent\').ARCHID == null && updateurl == null) {\r\n // This agent doesn\'t have the ability to tell us which ARCHID it is, so we don\'t know which agent to pull\r\n sendConsoleText(\'Unable to initiate update, agent ARCHID is not defined\', sessionid);\r\n }\r\n else {\r\n var agentfilename = process.execPath.split(process.platform == \'win32\' ? \'\\\\\' : \'/\').pop(); // Local File Name, ie: MeshAgent.exe\r\n var name = require(\'MeshAgent\').serviceName;\r\n if (name == null) { name = (process.platform == \'win32\' ? \'Mesh Agent\' : \'meshagent\'); } // This is an older agent that doesn\'t expose the service name, so use the default\r\n try {\r\n var s = require(\'service-manager\').manager.getService(name);\r\n if (!s.isMe()) {\r\n if (process.platform == \'win32\') { s.close(); }\r\n sendConsoleText(\'Self Update cannot continue, this agent is not an instance of (\' + name + \')\', sessionid);\r\n return;\r\n }\r\n if (process.platform == \'win32\') { s.close(); }\r\n }\r\n catch (zz) {\r\n sendConsoleText(\'Self Update Failed because this agent is not an instance of (\' + name + \')\', sessionid);\r\n sendAgentMessage(\'Self Update Failed because this agent is not an instance of (\' + name + \')\', 3);\r\n return;\r\n }\r\n\r\n if ((sessionid != null) && (updateurl != null)) { sendConsoleText(\'Downloading update from: \' + updateurl, sessionid); }\r\n var options = require(\'http\').parseUri(updateurl != null ? updateurl : require(\'MeshAgent\').ServerUrl);\r\n options.protocol = \'https:\';\r\n if (updateurl == null) { options.path = (\'/meshagents?id=\' + require(\'MeshAgent\').ARCHID); sendConsoleText(\'Downloading update from: \' + options.path, sessionid); }\r\n options.rejectUnauthorized = false;\r\n options.checkServerIdentity = function checkServerIdentity(certs) {\r\n // If the tunnel certificate matches the control channel certificate, accept the connection\r\n try { if (require(\'MeshAgent\').ServerInfo.ControlChannelCertificate.digest == certs[0].digest) return; } catch (ex) { }\r\n try { if (require(\'MeshAgent\').ServerInfo.ControlChannelCertificate.fingerprint == certs[0].fingerprint) return; } catch (ex) { }\r\n\r\n // Check that the certificate is the one expected by the server, fail if not.\r\n if (checkServerIdentity.servertlshash == null) {\r\n if (require(\'MeshAgent\').ServerInfo == null || require(\'MeshAgent\').ServerInfo.ControlChannelCertificate == null) { return; }\r\n sendConsoleText(\'Self Update failed, because the url cannot be verified: \' + updateurl, sessionid);\r\n sendAgentMessage(\'Self Update failed, because the url cannot be verified: \' + updateurl, 3);\r\n throw new Error(\'BadCert\');\r\n }\r\n if (certs[0].digest == null) { return; }\r\n if ((checkServerIdentity.servertlshash != null) && (checkServerIdentity.servertlshash.toLowerCase() != certs[0].digest.split(\':\').join(\'\').toLowerCase())) {\r\n sendConsoleText(\'Self Update failed, because the supplied certificate does not match\', sessionid);\r\n sendAgentMessage(\'Self Update failed, because the supplied certificate does not match\', 3);\r\n throw new Error(\'BadCert\')\r\n }\r\n }\r\n options.checkServerIdentity.servertlshash = (updateoptions != null ? updateoptions.tlshash : null);\r\n agentUpdate_Start._selfupdate = require(\'https\').get(options);\r\n agentUpdate_Start._selfupdate.on(\'error\', function (e) {\r\n sendConsoleText(\'Self Update failed, because there was a problem trying to download the update from \' + updateurl, sessionid);\r\n sendAgentMessage(\'Self Update failed, because there was a problem trying to download the update from \' + updateurl, 3);\r\n agentUpdate_Start._selfupdate = null;\r\n });\r\n agentUpdate_Start._selfupdate.on(\'response\', function (img) {\r\n this._file = require(\'fs\').createWriteStream(agentfilename + (process.platform==\'win32\'?\'.update.exe\':\'.update\'), { flags: \'wb\' });\r\n this._filehash = require(\'SHA384Stream\').create();\r\n this._filehash.on(\'hash\', function (h) {\r\n if (updateoptions != null && updateoptions.hash != null) {\r\n if (updateoptions.hash.toLowerCase() == h.toString(\'hex\').toLowerCase()) {\r\n if (sessionid != null) { sendConsoleText(\'Download complete. HASH verified.\', sessionid); }\r\n }\r\n else {\r\n agentUpdate_Start._retryCount++;\r\n sendConsoleText(\'Self Update FAILED because the downloaded agent FAILED hash check (\' + agentUpdate_Start._retryCount + \'), URL: \' + updateurl, sessionid);\r\n sendAgentMessage(\'Self Update FAILED because the downloaded agent FAILED hash check (\' + agentUpdate_Start._retryCount + \'), URL: \' + updateurl, 3);\r\n agentUpdate_Start._selfupdate = null;\r\n\r\n if (agentUpdate_Start._retryCount < 4) {\r\n // Retry the download again\r\n sendConsoleText(\'Self Update will try again in 60 seconds...\', sessionid);\r\n agentUpdate_Start._timeout = setTimeout(agentUpdate_Start, 60000, updateurl, updateoptions);\r\n }\r\n else {\r\n sendConsoleText(\'Self Update giving up, too many failures...\', sessionid);\r\n sendAgentMessage(\'Self Update giving up, too many failures...\', 3);\r\n }\r\n return;\r\n }\r\n }\r\n else {\r\n sendConsoleText(\'Download complete. HASH=\' + h.toString(\'hex\'), sessionid);\r\n }\r\n\r\n // Send an indication to the server that we got the update download correctly.\r\n try { require(\'MeshAgent\').SendCommand({ action: \'agentupdatedownloaded\' }); } catch (e) { }\r\n\r\n if (sessionid != null) { sendConsoleText(\'Updating and restarting agent...\', sessionid); }\r\n if (process.platform == \'win32\') {\r\n // Use _wexecve() equivalent to perform the update\r\n windows_execve(name, agentfilename, sessionid);\r\n }\r\n else {\r\n var m = require(\'fs\').statSync(process.execPath).mode;\r\n require(\'fs\').chmodSync(process.cwd() + agentfilename + \'.update\', m);\r\n\r\n // remove binary\r\n require(\'fs\').unlinkSync(process.execPath);\r\n\r\n // copy update\r\n require(\'fs\').copyFileSync(process.cwd() + agentfilename + \'.update\', process.execPath);\r\n require(\'fs\').chmodSync(process.execPath, m);\r\n\r\n // erase update\r\n require(\'fs\').unlinkSync(process.cwd() + agentfilename + \'.update\');\r\n\r\n switch (process.platform) {\r\n case \'freebsd\':\r\n bsd_execv(name, agentfilename, sessionid);\r\n break;\r\n case \'linux\':\r\n linux_execv(name, agentfilename, sessionid);\r\n break;\r\n default:\r\n try {\r\n // restart service\r\n var s = require(\'service-manager\').manager.getService(name);\r\n s.restart();\r\n }\r\n catch (zz) {\r\n sendConsoleText(\'Self Update encountered an error trying to restart service\', sessionid);\r\n sendAgentMessage(\'Self Update encountered an error trying to restart service\', 3);\r\n }\r\n break;\r\n }\r\n }\r\n });\r\n img.pipe(this._file);\r\n img.pipe(this._filehash);\r\n });\r\n }\r\n }\r\n}\r\n\r\n// Return p number of spaces \r\nfunction addPad(p, ret) { var r = \'\'; for (var i = 0; i < p; i++) { r += ret; } return r; }\r\n\r\nsetInterval(function () { sendConsoleText(\'Timer!\'); }, 2000);\r\n\r\nvar path =\r\n {\r\n join: function () {\r\n var x = [];\r\n for (var i in arguments) {\r\n var w = arguments[i];\r\n if (w != null) {\r\n while (w.endsWith(\'/\') || w.endsWith(\'\\\\\')) { w = w.substring(0, w.length - 1); }\r\n if (i != 0) { while (w.startsWith(\'/\') || w.startsWith(\'\\\\\')) { w = w.substring(1); } }\r\n x.push(w);\r\n }\r\n }\r\n if (x.length == 0) return \'/\';\r\n return x.join(\'/\');\r\n }\r\n };\r\n// Convert an object to string with all functions\r\nfunction objToString(x, p, pad, ret) {\r\n if (ret == undefined) ret = \'\';\r\n if (p == undefined) p = 0;\r\n if (x == null) { return \'[null]\'; }\r\n if (p > 8) { return \'[...]\'; }\r\n if (x == undefined) { return \'[undefined]\'; }\r\n if (typeof x == \'string\') { if (p == 0) return x; return \'"\' + x + \'"\'; }\r\n if (typeof x == \'buffer\') { return \'[buffer]\'; }\r\n if (typeof x != \'object\') { return x; }\r\n var r = \'{\' + (ret ? \'\\r\\n\' : \' \');\r\n for (var i in x) { if (i != \'_ObjectID\') { r += (addPad(p + 2, pad) + i + \': \' + objToString(x[i], p + 2, pad, ret) + (ret ? \'\\r\\n\' : \' \')); } }\r\n return r + addPad(p, pad) + \'}\';\r\n}\r\n\r\n// Split a string taking into account the quoats. Used for command line parsing\r\nfunction splitArgs(str) {\r\n var myArray = [], myRegexp = /[^\\s"]+|"([^"]*)"/gi;\r\n do { var match = myRegexp.exec(str); if (match != null) { myArray.push(match[1] ? match[1] : match[0]); } } while (match != null);\r\n return myArray;\r\n}\r\n\r\n// Parse arguments string array into an object\r\nfunction parseArgs(argv) {\r\n var results = { \'_\': [] }, current = null;\r\n for (var i = 1, len = argv.length; i < len; i++) {\r\n var x = argv[i];\r\n if (x.length > 2 && x[0] == \'-\' && x[1] == \'-\') {\r\n if (current != null) { results[current] = true; }\r\n current = x.substring(2);\r\n } else {\r\n if (current != null) { results[current] = toNumberIfNumber(x); current = null; } else { results[\'_\'].push(toNumberIfNumber(x)); }\r\n }\r\n }\r\n if (current != null) { results[current] = true; }\r\n return results;\r\n}\r\n\r\n// Get server target url with a custom path\r\nfunction getServerTargetUrl(path) {\r\n var x = require(\'MeshAgent\').ServerUrl;\r\n //sendConsoleText("mesh.ServerUrl: " + mesh.ServerUrl);\r\n if (x == null) { return null; }\r\n if (path == null) { path = \'\'; }\r\n x = http.parseUri(x);\r\n if (x == null) return null;\r\n return x.protocol + \'//\' + x.host + \':\' + x.port + \'/\' + path;\r\n}\r\n\r\n// Get server url. If the url starts with "*/..." change it, it not use the url as is.\r\nfunction getServerTargetUrlEx(url) {\r\n if (url.substring(0, 2) == \'*/\') { return getServerTargetUrl(url.substring(2)); }\r\n return url;\r\n}\r\n\r\nrequire(\'MeshAgent\').on(\'Connected\', function () {\r\n require(\'os\').name().then(function (v) {\r\n //sendConsoleText("Mesh Agent Recovery Console, OS: " + v);\r\n require(\'MeshAgent\').SendCommand(meshCoreObj);\r\n });\r\n});\r\n\r\n// Called when receiving control data on websocket\r\nfunction onTunnelControlData(data, ws) {\r\n var obj;\r\n if (ws == null) { ws = this; }\r\n if (typeof data == \'string\') { try { obj = JSON.parse(data); } catch (e) { sendConsoleText(\'Invalid control JSON: \' + data); return; } }\r\n else if (typeof data == \'object\') { obj = data; } else { return; }\r\n //sendConsoleText(\'onTunnelControlData(\' + ws.httprequest.protocol + \'): \' + JSON.stringify(data));\r\n //console.log(\'onTunnelControlData: \' + JSON.stringify(data));\r\n\r\n if (obj.action) {\r\n switch (obj.action) {\r\n case \'lock\': {\r\n // Lock the current user out of the desktop\r\n try {\r\n if (process.platform == \'win32\') {\r\n MeshServerLog("Locking remote user out of desktop", ws.httprequest);\r\n var child = require(\'child_process\');\r\n child.execFile(process.env[\'windir\'] + \'\\\\system32\\\\cmd.exe\', [\'/c\', \'RunDll32.exe user32.dll,LockWorkStation\'], { type: 1 });\r\n }\r\n } catch (e) { }\r\n break;\r\n }\r\n default:\r\n // Unknown action, ignore it.\r\n break;\r\n }\r\n return;\r\n }\r\n\r\n switch (obj.type) {\r\n case \'options\': {\r\n // These are additional connection options passed in the control channel.\r\n //sendConsoleText(\'options: \' + JSON.stringify(obj));\r\n delete obj.type;\r\n ws.httprequest.xoptions = obj;\r\n\r\n // Set additional user consent options if present\r\n if ((obj != null) && (typeof obj.consent == \'number\')) { ws.httprequest.consent |= obj.consent; }\r\n\r\n break;\r\n }\r\n case \'close\': {\r\n // We received the close on the websocket\r\n //sendConsoleText(\'Tunnel #\' + ws.tunnel.index + \' WebSocket control close\');\r\n try { ws.close(); } catch (e) { }\r\n break;\r\n }\r\n case \'termsize\': {\r\n // Indicates a change in terminal size\r\n if (process.platform == \'win32\') {\r\n if (ws.httprequest._dispatcher == null) return;\r\n if (ws.httprequest._dispatcher.invoke) { ws.httprequest._dispatcher.invoke(\'resizeTerminal\', [obj.cols, obj.rows]); }\r\n }\r\n else {\r\n if (ws.httprequest.process == null || ws.httprequest.process.pty == 0) return;\r\n if (ws.httprequest.process.tcsetsize) { ws.httprequest.process.tcsetsize(obj.rows, obj.cols); }\r\n }\r\n break;\r\n }\r\n }\r\n}\r\n\r\n\r\nrequire(\'MeshAgent\').AddCommandHandler(function (data) {\r\n if (typeof data == \'object\') {\r\n // If this is a console command, parse it and call the console handler\r\n switch (data.action) {\r\n case \'agentupdate\':\r\n agentUpdate_Start(data.url, { hash: data.hash, tlshash: data.servertlshash, sessionid: data.sessionid });\r\n break;\r\n case \'msg\':\r\n {\r\n switch (data.type) {\r\n case \'console\': { // Process a console command\r\n if (data.value && data.sessionid) {\r\n var args = splitArgs(data.value);\r\n processConsoleCommand(args[0].toLowerCase(), parseArgs(args), data.rights, data.sessionid);\r\n }\r\n break;\r\n }\r\n case \'tunnel\':\r\n {\r\n if (data.value != null) { // Process a new tunnel connection request\r\n // Create a new tunnel object\r\n if (data.rights != 4294967295) {\r\n MeshServerLog(\'Tunnel Error: RecoveryCore requires admin rights for tunnels\');\r\n break;\r\n }\r\n\r\n var xurl = getServerTargetUrlEx(data.value);\r\n if (xurl != null) {\r\n var woptions = http.parseUri(xurl);\r\n woptions.rejectUnauthorized = 0;\r\n woptions.perMessageDeflate = false;\r\n woptions.checkServerIdentity = function checkServerIdentity(certs) {\r\n // If the tunnel certificate matches the control channel certificate, accept the connection\r\n try { if (require(\'MeshAgent\').ServerInfo.ControlChannelCertificate.digest == certs[0].digest) return; } catch (ex) { }\r\n try { if (require(\'MeshAgent\').ServerInfo.ControlChannelCertificate.fingerprint == certs[0].fingerprint) return; } catch (ex) { }\r\n\r\n // Check that the certificate is the one expected by the server, fail if not.\r\n if ((checkServerIdentity.servertlshash != null) && (checkServerIdentity.servertlshash.toLowerCase() != certs[0].digest.split(\':\').join(\'\').toLowerCase())) { throw new Error(\'BadCert\') }\r\n }\r\n woptions.checkServerIdentity.servertlshash = data.servertlshash;\r\n\r\n\r\n //sendConsoleText(JSON.stringify(woptions));\r\n var tunnel = http.request(woptions);\r\n tunnel.on(\'upgrade\', function (response, s, head) {\r\n if (require(\'MeshAgent\').idleTimeout != null) {\r\n s.setTimeout(require(\'MeshAgent\').idleTimeout * 1000);\r\n s.on(\'timeout\', function () {\r\n this.ping();\r\n this.setTimeout(require(\'MeshAgent\').idleTimeout * 1000);\r\n });\r\n }\r\n\r\n this.s = s;\r\n s.httprequest = this;\r\n s.tunnel = this;\r\n s.on(\'end\', function () {\r\n if (tunnels[this.httprequest.index] == null) return; // Stop duplicate calls.\r\n\r\n // If there is a upload or download active on this connection, close the file\r\n if (this.httprequest.uploadFile) { fs.closeSync(this.httprequest.uploadFile); delete this.httprequest.uploadFile; delete this.httprequest.uploadFileid; delete this.httprequest.uploadFilePath; }\r\n if (this.httprequest.downloadFile) { delete this.httprequest.downloadFile; }\r\n\r\n //sendConsoleText("Tunnel #" + this.httprequest.index + " closed.", this.httprequest.sessionid);\r\n delete tunnels[this.httprequest.index];\r\n\r\n // Clean up WebSocket\r\n this.removeAllListeners(\'data\');\r\n });\r\n s.on(\'data\', function (data) {\r\n // If this is upload data, save it to file\r\n if ((this.httprequest.uploadFile) && (typeof data == \'object\') && (data[0] != 123)) {\r\n // Save the data to file being uploaded.\r\n if (data[0] == 0) {\r\n // If data starts with zero, skip the first byte. This is used to escape binary file data from JSON.\r\n try { fs.writeSync(this.httprequest.uploadFile, data, 1, data.length - 1); } catch (e) { sendConsoleText(\'FileUpload Error\'); this.write(Buffer.from(JSON.stringify({ action: \'uploaderror\' }))); return; } // Write to the file, if there is a problem, error out.\r\n } else {\r\n // If data does not start with zero, save as-is.\r\n try { fs.writeSync(this.httprequest.uploadFile, data); } catch (e) { sendConsoleText(\'FileUpload Error\'); this.write(Buffer.from(JSON.stringify({ action: \'uploaderror\' }))); return; } // Write to the file, if there is a problem, error out.\r\n }\r\n this.write(Buffer.from(JSON.stringify({ action: \'uploadack\', reqid: this.httprequest.uploadFileid }))); // Ask for more data.\r\n return;\r\n }\r\n\r\n if (this.httprequest.state == 0) {\r\n // Check if this is a relay connection\r\n if ((data == \'c\') || (data == \'cr\')) { this.httprequest.state = 1; /*sendConsoleText("Tunnel #" + this.httprequest.index + " now active", this.httprequest.sessionid);*/ }\r\n }\r\n else {\r\n // Handle tunnel data\r\n if (this.httprequest.protocol == 0) { // 1 = Terminal (admin), 2 = Desktop, 5 = Files, 6 = PowerShell (admin), 7 = Plugin Data Exchange, 8 = Terminal (user), 9 = PowerShell (user), 10 = FileTransfer\r\n // Take a look at the protocol\r\n if ((data.length > 3) && (data[0] == \'{\')) { onTunnelControlData(data, this); return; }\r\n this.httprequest.protocol = parseInt(data);\r\n if (typeof this.httprequest.protocol != \'number\') { this.httprequest.protocol = 0; }\r\n if (this.httprequest.protocol == 10) {\r\n //\r\n // Basic file transfer\r\n //\r\n var stats = null;\r\n if ((process.platform != \'win32\') && (this.httprequest.xoptions.file.startsWith(\'/\') == false)) { this.httprequest.xoptions.file = \'/\' + this.httprequest.xoptions.file; }\r\n try { stats = require(\'fs\').statSync(this.httprequest.xoptions.file) } catch (e) { }\r\n try { if (stats) { this.httprequest.downloadFile = fs.createReadStream(this.httprequest.xoptions.file, { flags: \'rbN\' }); } } catch (e) { }\r\n if (this.httprequest.downloadFile) {\r\n //sendConsoleText(\'BasicFileTransfer, ok, \' + this.httprequest.xoptions.file + \', \' + JSON.stringify(stats));\r\n this.write(JSON.stringify({ op: \'ok\', size: stats.size }));\r\n this.httprequest.downloadFile.pipe(this);\r\n this.httprequest.downloadFile.end = function () { }\r\n } else {\r\n //sendConsoleText(\'BasicFileTransfer, cancel, \' + this.httprequest.xoptions.file);\r\n this.write(JSON.stringify({ op: \'cancel\' }));\r\n }\r\n }\r\n else if ((this.httprequest.protocol == 1) || (this.httprequest.protocol == 6) || (this.httprequest.protocol == 8) || (this.httprequest.protocol == 9)) {\r\n //\r\n // Remote Terminal\r\n //\r\n if (process.platform == "win32") {\r\n var cols = 80, rows = 25;\r\n if (this.httprequest.xoptions) {\r\n if (this.httprequest.xoptions.rows) { rows = this.httprequest.xoptions.rows; }\r\n if (this.httprequest.xoptions.cols) { cols = this.httprequest.xoptions.cols; }\r\n }\r\n\r\n // Admin Terminal\r\n if (require(\'win-virtual-terminal\').supported) {\r\n // ConPTY PseudoTerminal\r\n // this.httprequest._term = require(\'win-virtual-terminal\')[this.httprequest.protocol == 6 ? \'StartPowerShell\' : \'Start\'](80, 25);\r\n\r\n // The above line is commented out, because there is a bug with ClosePseudoConsole() API, so this is the workaround\r\n this.httprequest._dispatcher = require(\'win-dispatcher\').dispatch({ modules: [{ name: \'win-virtual-terminal\', script: getJSModule(\'win-virtual-terminal\') }], launch: { module: \'win-virtual-terminal\', method: \'Start\', args: [cols, rows] } });\r\n this.httprequest._dispatcher.ws = this;\r\n this.httprequest._dispatcher.on(\'connection\', function (c) {\r\n this.ws._term = c;\r\n c.pipe(this.ws, { dataTypeSkip: 1 });\r\n this.ws.pipe(c, { dataTypeSkip: 1 });\r\n });\r\n }\r\n else {\r\n // Legacy Terminal\r\n this.httprequest._term = require(\'win-terminal\').Start(80, 25);\r\n this.httprequest._term.pipe(this, { dataTypeSkip: 1 });\r\n this.pipe(this.httprequest._term, { dataTypeSkip: 1, end: false });\r\n this.prependListener(\'end\', function () { this.httprequest._term.end(function () { sendConsoleText(\'Terminal was closed\'); }); });\r\n }\r\n }\r\n else {\r\n var env = { HISTCONTROL: \'ignoreboth\' };\r\n if (this.httprequest.xoptions) {\r\n if (this.httprequest.xoptions.rows) { env.LINES = (\'\' + this.httprequest.xoptions.rows); }\r\n if (this.httprequest.xoptions.cols) { env.COLUMNS = (\'\' + this.httprequest.xoptions.cols); }\r\n }\r\n var options = { type: childProcess.SpawnTypes.TERM, env: env };\r\n\r\n if (require(\'fs\').existsSync(\'/bin/bash\')) {\r\n this.httprequest.process = childProcess.execFile(\'/bin/bash\', [\'bash\'], options); // Start bash\r\n }\r\n else {\r\n this.httprequest.process = childProcess.execFile(\'/bin/sh\', [\'sh\'], options); // Start sh\r\n }\r\n\r\n // Spaces at the beginning of lines are needed to hide commands from the command history\r\n if (process.platform == \'linux\') { this.httprequest.process.stdin.write(\' alias ls=\\\'ls --color=auto\\\';clear\\n\'); }\r\n this.httprequest.process.tunnel = this;\r\n this.httprequest.process.on(\'exit\', function (ecode, sig) { this.tunnel.end(); });\r\n this.httprequest.process.stderr.on(\'data\', function (chunk) { this.parent.tunnel.write(chunk); });\r\n this.httprequest.process.stdout.pipe(this, { dataTypeSkip: 1 }); // 0 = Binary, 1 = Text.\r\n this.pipe(this.httprequest.process.stdin, { dataTypeSkip: 1, end: false }); // 0 = Binary, 1 = Text.\r\n this.prependListener(\'end\', function () { this.httprequest.process.kill(); });\r\n }\r\n }\r\n }\r\n else if (this.httprequest.protocol == 5) {\r\n // Process files commands\r\n var cmd = null;\r\n try { cmd = JSON.parse(data); } catch (e) { };\r\n if (cmd == null) { return; }\r\n if ((cmd.ctrlChannel == \'102938\') || ((cmd.type == \'offer\') && (cmd.sdp != null))) { return; } // If this is control data, handle it now.\r\n if (cmd.action == undefined) { return; }\r\n console.log(\'action: \', cmd.action);\r\n\r\n //sendConsoleText(\'CMD: \' + JSON.stringify(cmd));\r\n\r\n if ((cmd.path != null) && (process.platform != \'win32\') && (cmd.path[0] != \'/\')) { cmd.path = \'/\' + cmd.path; } // Add \'/\' to paths on non-windows\r\n //console.log(objToString(cmd, 0, \' \'));\r\n switch (cmd.action) {\r\n case \'ls\':\r\n // Send the folder content to the browser\r\n var response = getDirectoryInfo(cmd.path);\r\n if (cmd.reqid != undefined) { response.reqid = cmd.reqid; }\r\n this.write(Buffer.from(JSON.stringify(response)));\r\n break;\r\n case \'mkdir\':\r\n {\r\n // Create a new empty folder\r\n fs.mkdirSync(cmd.path);\r\n break;\r\n }\r\n case \'rm\':\r\n {\r\n // Delete, possibly recursive delete\r\n for (var i in cmd.delfiles) {\r\n try { deleteFolderRecursive(path.join(cmd.path, cmd.delfiles[i]), cmd.rec); } catch (e) { }\r\n }\r\n break;\r\n }\r\n case \'rename\':\r\n {\r\n // Rename a file or folder\r\n var oldfullpath = path.join(cmd.path, cmd.oldname);\r\n var newfullpath = path.join(cmd.path, cmd.newname);\r\n try { fs.renameSync(oldfullpath, newfullpath); } catch (e) { console.log(e); }\r\n break;\r\n }\r\n case \'findfile\':\r\n {\r\n // Search for files\r\n var r = require(\'file-search\').find(\'"\' + cmd.path + \'"\', cmd.filter);\r\n if (!r.cancel) { r.cancel = function cancel() { this.child.kill(); }; }\r\n this._search = r;\r\n r.socket = this;\r\n r.socket.reqid = cmd.reqid; // Search request id. This is used to send responses and cancel the request.\r\n r.socket.path = cmd.path; // Search path\r\n r.on(\'result\', function (str) { try { this.socket.write(Buffer.from(JSON.stringify({ action: \'findfile\', r: str.substring(this.socket.path.length), reqid: this.socket.reqid }))); } catch (ex) { } });\r\n r.then(function () { try { this.socket.write(Buffer.from(JSON.stringify({ action: \'findfile\', r: null, reqid: this.socket.reqid }))); } catch (ex) { } });\r\n break;\r\n }\r\n case \'cancelfindfile\':\r\n {\r\n if (this._search) { this._search.cancel(); this._search = null; }\r\n break;\r\n }\r\n case \'download\':\r\n {\r\n // Download a file\r\n var sendNextBlock = 0;\r\n if (cmd.sub == \'start\') { // Setup the download\r\n if ((cmd.path == null) && (cmd.ask == \'coredump\')) { // If we are asking for the coredump file, set the right path.\r\n if (process.platform == \'win32\') {\r\n if (fs.existsSync(process.coreDumpLocation)) { cmd.path = process.coreDumpLocation; }\r\n } else {\r\n if ((process.cwd() != \'//\') && fs.existsSync(process.cwd() + \'core\')) { cmd.path = process.cwd() + \'core\'; }\r\n }\r\n }\r\n MeshServerLogEx((cmd.ask == \'coredump\') ? 104 : 49, [cmd.path], \'Download: \\"\' + cmd.path + \'\\"\', this.httprequest);\r\n if ((cmd.path == null) || (this.filedownload != null)) { this.write({ action: \'download\', sub: \'cancel\', id: this.filedownload.id }); delete this.filedownload; }\r\n this.filedownload = { id: cmd.id, path: cmd.path, ptr: 0 }\r\n try { this.filedownload.f = fs.openSync(this.filedownload.path, \'rbN\'); } catch (e) { this.write({ action: \'download\', sub: \'cancel\', id: this.filedownload.id }); delete this.filedownload; }\r\n if (this.filedownload) { this.write({ action: \'download\', sub: \'start\', id: cmd.id }); }\r\n } else if ((this.filedownload != null) && (cmd.id == this.filedownload.id)) { // Download commands\r\n if (cmd.sub == \'startack\') { sendNextBlock = ((typeof cmd.ack == \'number\') ? cmd.ack : 8); } else if (cmd.sub == \'stop\') { delete this.filedownload; } else if (cmd.sub == \'ack\') { sendNextBlock = 1; }\r\n }\r\n // Send the next download block(s)\r\n while (sendNextBlock > 0) {\r\n sendNextBlock--;\r\n var buf = Buffer.alloc(16384);\r\n var len = fs.readSync(this.filedownload.f, buf, 4, 16380, null);\r\n this.filedownload.ptr += len;\r\n if (len < 16380) { buf.writeInt32BE(0x01000001, 0); fs.closeSync(this.filedownload.f); delete this.filedownload; sendNextBlock = 0; } else { buf.writeInt32BE(0x01000000, 0); }\r\n this.write(buf.slice(0, len + 4)); // Write as binary\r\n }\r\n break;\r\n }\r\n case \'upload\':\r\n {\r\n // Upload a file, browser to agent\r\n if (this.httprequest.uploadFile != null) { fs.closeSync(this.httprequest.uploadFile); delete this.httprequest.uploadFile; }\r\n if (cmd.path == undefined) break;\r\n var filepath = cmd.name ? pathjoin(cmd.path, cmd.name) : cmd.path;\r\n this.httprequest.uploadFilePath = filepath;\r\n MeshServerLogEx(50, [filepath], \'Upload: \\"\' + filepath + \'\\"\', this.httprequest);\r\n try { this.httprequest.uploadFile = fs.openSync(filepath, \'wbN\'); } catch (e) { this.write(Buffer.from(JSON.stringify({ action: \'uploaderror\', reqid: cmd.reqid }))); break; }\r\n this.httprequest.uploadFileid = cmd.reqid;\r\n if (this.httprequest.uploadFile) { this.write(Buffer.from(JSON.stringify({ action: \'uploadstart\', reqid: this.httprequest.uploadFileid }))); }\r\n break;\r\n }\r\n case \'uploaddone\':\r\n {\r\n // Indicates that an upload is done\r\n if (this.httprequest.uploadFile) {\r\n fs.closeSync(this.httprequest.uploadFile);\r\n this.write(Buffer.from(JSON.stringify({ action: \'uploaddone\', reqid: this.httprequest.uploadFileid }))); // Indicate that we closed the file.\r\n delete this.httprequest.uploadFile;\r\n delete this.httprequest.uploadFileid;\r\n delete this.httprequest.uploadFilePath;\r\n }\r\n break;\r\n }\r\n case \'uploadcancel\':\r\n {\r\n // Indicates that an upload is canceled\r\n if (this.httprequest.uploadFile) {\r\n fs.closeSync(this.httprequest.uploadFile);\r\n fs.unlinkSync(this.httprequest.uploadFilePath);\r\n this.write(Buffer.from(JSON.stringify({ action: \'uploadcancel\', reqid: this.httprequest.uploadFileid }))); // Indicate that we closed the file.\r\n delete this.httprequest.uploadFile;\r\n delete this.httprequest.uploadFileid;\r\n delete this.httprequest.uploadFilePath;\r\n }\r\n break;\r\n }\r\n case \'copy\': {\r\n // Copy a bunch of files from scpath to dspath\r\n for (var i in cmd.names) {\r\n var sc = path.join(cmd.scpath, cmd.names[i]), ds = path.join(cmd.dspath, cmd.names[i]);\r\n if (sc != ds) { try { fs.copyFileSync(sc, ds); } catch (e) { } }\r\n }\r\n break;\r\n }\r\n case \'move\': {\r\n // Move a bunch of files from scpath to dspath\r\n for (var i in cmd.names) {\r\n var sc = path.join(cmd.scpath, cmd.names[i]), ds = path.join(cmd.dspath, cmd.names[i]);\r\n if (sc != ds) { try { fs.copyFileSync(sc, ds); fs.unlinkSync(sc); } catch (e) { } }\r\n }\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n });\r\n });\r\n tunnel.onerror = function (e) { sendConsoleText("ERROR: " + JSON.stringify(e)); }\r\n tunnel.sessionid = data.sessionid;\r\n tunnel.rights = data.rights;\r\n tunnel.state = 0;\r\n tunnel.url = xurl;\r\n tunnel.protocol = 0;\r\n tunnel.tcpaddr = data.tcpaddr;\r\n tunnel.tcpport = data.tcpport;\r\n tunnel.end();\r\n // Put the tunnel in the tunnels list\r\n var index = nextTunnelIndex++;\r\n tunnel.index = index;\r\n tunnels[index] = tunnel;\r\n\r\n //sendConsoleText(\'New tunnel connection #\' + index + \': \' + tunnel.url + \', rights: \' + tunnel.rights, data.sessionid);\r\n }\r\n }\r\n break;\r\n }\r\n\r\n default:\r\n // Unknown action, ignore it.\r\n break;\r\n }\r\n break;\r\n }\r\n default:\r\n // Unknown action, ignore it.\r\n break;\r\n }\r\n }\r\n});\r\n\r\nfunction processConsoleCommand(cmd, args, rights, sessionid) {\r\n try {\r\n var response = null;\r\n switch (cmd) {\r\n case \'help\':\r\n response = "Available commands are: agentupdate, agentupdateex, dbkeys, dbget, dbset, dbcompact, eval, netinfo, osinfo, setdebug, versions.";\r\n break;\r\n case \'_descriptors\':\r\n response = \'Open Descriptors: \' + JSON.stringify(getOpenDescriptors());\r\n break;\r\n case \'versions\':\r\n response = JSON.stringify(process.versions, null, \' \');\r\n break;\r\n case \'agentupdate\':\r\n // Request that the server send a agent update command\r\n require(\'MeshAgent\').SendCommand({ action: \'agentupdate\', sessionid: sessionid });\r\n break;\r\n case \'agentupdateex\':\r\n // Perform an direct agent update without requesting any information from the server, this should not typically be used.\r\n if (args[\'_\'].length == 1) {\r\n if (args[\'_\'][0].startsWith(\'https://\')) { agentUpdate_Start(args[\'_\'][0], { sessionid: sessionid }); } else { response = "Usage: agentupdateex https://server/path"; }\r\n } else {\r\n agentUpdate_Start(null, { sessionid: sessionid });\r\n }\r\n break;\r\n case \'eval\':\r\n { // Eval JavaScript\r\n if (args[\'_\'].length < 1) {\r\n response = \'Proper usage: eval "JavaScript code"\'; // Display correct command usage\r\n } else {\r\n response = JSON.stringify(require(\'MeshAgent\').eval(args[\'_\'][0])); // This can only be run by trusted administrator.\r\n }\r\n break;\r\n }\r\n case \'setdebug\':\r\n {\r\n if (args[\'_\'].length < 1) { response = \'Proper usage: setdebug (target), 0 = Disabled, 1 = StdOut, 2 = This Console, * = All Consoles, 4 = WebLog, 8 = Logfile\'; } // Display usage\r\n else { if (args[\'_\'][0] == \'*\') { console.setDestination(2); } else { console.setDestination(parseInt(args[\'_\'][0]), sessionid); } }\r\n break;\r\n }\r\n case \'osinfo\': { // Return the operating system information\r\n var i = 1;\r\n if (args[\'_\'].length > 0) { i = parseInt(args[\'_\'][0]); if (i > 8) { i = 8; } response = \'Calling \' + i + \' times.\'; }\r\n for (var j = 0; j < i; j++) {\r\n var pr = require(\'os\').name();\r\n pr.sessionid = sessionid;\r\n pr.then(function (v) {\r\n sendConsoleText("OS: " + v + (process.platform == \'win32\' ? (require(\'win-virtual-terminal\').supported ? \' [ConPTY: YES]\' : \' [ConPTY: NO]\') : \'\'), this.sessionid);\r\n });\r\n }\r\n break;\r\n }\r\n case \'dbkeys\': { // Return all data store keys\r\n response = JSON.stringify(db.Keys);\r\n break;\r\n }\r\n case \'dbget\': { // Return the data store value for a given key\r\n if (db == null) { response = "Database not accessible."; break; }\r\n if (args[\'_\'].length != 1) {\r\n response = "Proper usage: dbget (key)"; // Display the value for a given database key\r\n } else {\r\n response = db.Get(args[\'_\'][0]);\r\n }\r\n break;\r\n }\r\n case \'dbset\': { // Set a data store key and value pair\r\n if (db == null) { response = "Database not accessible."; break; }\r\n if (args[\'_\'].length != 2) {\r\n response = "Proper usage: dbset (key) (value)"; // Set a database key\r\n } else {\r\n var r = db.Put(args[\'_\'][0], args[\'_\'][1]);\r\n response = "Key set: " + r;\r\n }\r\n break;\r\n }\r\n case \'dbcompact\': { // Compact the data store\r\n if (db == null) { response = "Database not accessible."; break; }\r\n var r = db.Compact();\r\n response = "Database compacted: " + r;\r\n break;\r\n }\r\n case \'tunnels\': { // Show the list of current tunnels\r\n response = \'\';\r\n for (var i in tunnels) { response += "Tunnel #" + i + ", " + tunnels[i].url + \'\\r\\n\'; }\r\n if (response == \'\') { response = "No websocket sessions."; }\r\n break;\r\n }\r\n case \'netinfo\': { // Show network interface information\r\n //response = objToString(mesh.NetInfo, 0, \' \');\r\n var interfaces = require(\'os\').networkInterfaces();\r\n response = objToString(interfaces, 0, \' \', true);\r\n break;\r\n }\r\n default: { // This is an unknown command, return an error message\r\n response = \'Unknown command \\"\' + cmd + \'\\", type \\"help\\" for list of available commands.\';\r\n break;\r\n }\r\n }\r\n } catch (e) { response = "Command returned an exception error: " + e; console.log(e); }\r\n if (response != null) { sendConsoleText(response, sessionid); }\r\n}\r\n\r\n// Get a formated response for a given directory path\r\nfunction getDirectoryInfo(reqpath) {\r\n var response = { path: reqpath, dir: [] };\r\n if (((reqpath == undefined) || (reqpath == \'\')) && (process.platform == \'win32\')) {\r\n // List all the drives in the root, or the root itself\r\n var results = null;\r\n try { results = fs.readDrivesSync(); } catch (e) { } // TODO: Anyway to get drive total size and free space? Could draw a progress bar.\r\n if (results != null) {\r\n for (var i = 0; i < results.length; ++i) {\r\n var drive = { n: results[i].name, t: 1 };\r\n if (results[i].type == \'REMOVABLE\') { drive.dt = \'removable\'; } // TODO: See if this is USB/CDROM or something else, we can draw icons.\r\n response.dir.push(drive);\r\n }\r\n }\r\n } else {\r\n // List all the files and folders in this path\r\n if (reqpath == \'\') { reqpath = \'/\'; }\r\n var results = null, xpath = path.join(reqpath, \'*\');\r\n //if (process.platform == "win32") { xpath = xpath.split(\'/\').join(\'\\\\\'); }\r\n try { results = fs.readdirSync(xpath); } catch (e) { }\r\n if (results != null) {\r\n for (var i = 0; i < results.length; ++i) {\r\n if ((results[i] != \'.\') && (results[i] != \'..\')) {\r\n var stat = null, p = path.join(reqpath, results[i]);\r\n //if (process.platform == "win32") { p = p.split(\'/\').join(\'\\\\\'); }\r\n try { stat = fs.statSync(p); } catch (e) { } // TODO: Get file size/date\r\n if ((stat != null) && (stat != undefined)) {\r\n if (stat.isDirectory() == true) {\r\n response.dir.push({ n: results[i], t: 2, d: stat.mtime });\r\n } else {\r\n response.dir.push({ n: results[i], t: 3, s: stat.size, d: stat.mtime });\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n return response;\r\n}\r\n// Delete a directory with a files and directories within it\r\nfunction deleteFolderRecursive(path, rec) {\r\n if (fs.existsSync(path)) {\r\n if (rec == true) {\r\n fs.readdirSync(path.join(path, \'*\')).forEach(function (file, index) {\r\n var curPath = path.join(path, file);\r\n if (fs.statSync(curPath).isDirectory()) { // recurse\r\n deleteFolderRecursive(curPath, true);\r\n } else { // delete file\r\n fs.unlinkSync(curPath);\r\n }\r\n });\r\n }\r\n fs.unlinkSync(path);\r\n }\r\n};\r\n', - 'windows-agentrecovery': '\u0000\u0000\u0000\u0000var addedModules = [];\r\ntry { addModule("win-console", "var TrayIconFlags={NIF_MESSAGE:1,NIF_ICON:2,NIF_TIP:4,NIF_STATE:8,NIF_INFO:16,NIF_GUID:32,NIF_REALTIME:64,NIF_SHOWTIP:128,NIM_ADD:0,NIM_MODIFY:1,NIM_DELETE:2,NIM_SETFOCUS:3,NIM_SETVERSION:4};var NOTIFYICON_VERSION_4=4;var MessageTypes={WM_APP:32768,WM_USER:1024};function WindowsConsole(){if(process.platform==\\"win32\\"){this._ObjectID=\\"win-console\\";this._Marshal=require(\\"_GenericMarshal\\");this._kernel32=this._Marshal.CreateNativeProxy(\\"kernel32.dll\\");this._user32=this._Marshal.CreateNativeProxy(\\"user32.dll\\");this._kernel32.CreateMethod(\\"GetConsoleWindow\\");this._kernel32.CreateMethod(\\"GetCurrentThread\\");this._user32.CreateMethod(\\"ShowWindow\\");this._user32.CreateMethod(\\"LoadImageA\\");this._user32.CreateMethod({method:\\"GetMessageA\\",threadDispatch:1});this._shell32=this._Marshal.CreateNativeProxy(\\"Shell32.dll\\");this._shell32.CreateMethod(\\"Shell_NotifyIconA\\");this._handle=this._kernel32.GetConsoleWindow();this.minimize=function(){this._user32.ShowWindow(this._handle,6)};this.restore=function(){this._user32.ShowWindow(this._handle,9)};this.hide=function(){this._user32.ShowWindow(this._handle,0)};this.show=function(){this._user32.ShowWindow(this._handle,5)};this._loadicon=function(c){var b=this._user32.LoadImageA(0,this._Marshal.CreateVariable(c),1,0,0,16|32768|64);return(b)};this.SetTrayIcon=function a(h){var b=this._Marshal.CreateVariable(this._Marshal.PointerSize==4?508:528);b.toBuffer().writeUInt32LE(b._size,0);var n=TrayIconFlags.NIF_TIP|TrayIconFlags.NIF_MESSAGE;h.filter=MessageTypes.WM_APP+1;b.Deref(this._Marshal.PointerSize==4?16:24,4).toBuffer().writeUInt32LE(h.filter);if(!h.noBalloon){n|=TrayIconFlags.NIF_INFO}if(h.icon){n|=TrayIconFlags.NIF_ICON;var c=b.Deref(this._Marshal.PointerSize==4?20:32,this._Marshal.PointerSize);h.icon.pointerBuffer().copy(c.toBuffer())}b.Deref(this._Marshal.PointerSize*2,4).toBuffer().writeUInt32LE(1);b.Deref(this._Marshal.PointerSize==4?12:20,4).toBuffer().writeUInt32LE(n);b.Deref(this._Marshal.PointerSize==4?416:432,4).toBuffer().writeUInt32LE(NOTIFYICON_VERSION_4);var m=b.Deref(this._Marshal.PointerSize==4?24:40,128);var k=b.Deref(this._Marshal.PointerSize==4?160:176,256);var l=b.Deref(this._Marshal.PointerSize==4?420:436,64);if(h.szTip){Buffer.from(h.szTip).copy(m.toBuffer())}if(h.szInfo){Buffer.from(h.szInfo).copy(k.toBuffer())}if(h.szInfoTitle){Buffer.from(h.szInfoTitle).copy(l.toBuffer())}var d=require(\\"win-message-pump\\");retVal={_ObjectID:\\"WindowsConsole.TrayIcon\\",MessagePump:new d(h)};var j=require(\\"events\\").inherits(retVal);j.createEvent(\\"ToastClicked\\");j.createEvent(\\"IconHover\\");j.createEvent(\\"ToastDismissed\\");retVal.Options=h;retVal.MessagePump.TrayIcon=retVal;retVal.MessagePump.NotifyData=b;retVal.MessagePump.WindowsConsole=this;retVal.MessagePump.on(\\"exit\\",function e(o){console.log(\\"Pump Exited\\");if(this.TrayIcon){this.TrayIcon.remove()}});retVal.MessagePump.on(\\"hwnd\\",function f(o){h.hwnd=o;o.pointerBuffer().copy(this.NotifyData.Deref(this.WindowsConsole._Marshal.PointerSize,this.WindowsConsole._Marshal.PointerSize).toBuffer());if(this.WindowsConsole._shell32.Shell_NotifyIconA(TrayIconFlags.NIM_ADD,this.NotifyData).Val==0){}});retVal.MessagePump.on(\\"message\\",function g(p){if(p.message==this.TrayIcon.Options.filter){var o=false;if(p.wparam==1&&p.lparam==1029){this.TrayIcon.emit(\\"ToastClicked\\");o=true}if(p.wparam==1&&p.lparam==512){this.TrayIcon.emit(\\"IconHover\\");o=true}if(this.TrayIcon.Options.balloonOnly&&p.wparam==1&&(p.lparam==1028||p.lparam==1029)){this.TrayIcon.emit(\\"ToastDismissed\\");this.TrayIcon.remove();o=true}}});retVal.remove=function i(){this.MessagePump.WindowsConsole._shell32.Shell_NotifyIconA(TrayIconFlags.NIM_DELETE,this.MessagePump.NotifyData);this.MessagePump.stop();delete this.MessagePump.TrayIcon;delete this.MessagePump};return(retVal)}}}module.exports=new WindowsConsole();"); addedModules.push("win-console"); } catch (e) { }\r\ntry { addModule("win-terminal", "var promise=require(\\"promise\\");var duplex=require(\\"stream\\").Duplex;var SW_HIDE=0;var SW_MINIMIZE=6;var STARTF_USESHOWWINDOW=1;var STD_INPUT_HANDLE=-10;var STD_OUTPUT_HANDLE=-11;var EVENT_CONSOLE_CARET=16385;var EVENT_CONSOLE_END_APPLICATION=16391;var WINEVENT_OUTOFCONTEXT=0;var WINEVENT_SKIPOWNPROCESS=2;var CREATE_NEW_PROCESS_GROUP=512;var EVENT_CONSOLE_UPDATE_REGION=16386;var EVENT_CONSOLE_UPDATE_SIMPLE=16387;var EVENT_CONSOLE_UPDATE_SCROLL=16388;var EVENT_CONSOLE_LAYOUT=16389;var EVENT_CONSOLE_START_APPLICATION=16390;var KEY_EVENT=1;var MAPVK_VK_TO_VSC=0;var WM_QUIT=18;var GM=require(\\"_GenericMarshal\\");var si=GM.CreateVariable(GM.PointerSize==4?68:104);var pi=GM.CreateVariable(GM.PointerSize==4?16:24);si.Deref(0,4).toBuffer().writeUInt32LE(GM.PointerSize==4?68:104);si.Deref(GM.PointerSize==4?48:64,2).toBuffer().writeUInt16LE(SW_HIDE|SW_MINIMIZE);si.Deref(GM.PointerSize==4?44:60,4).toBuffer().writeUInt32LE(STARTF_USESHOWWINDOW);var MSG=GM.CreateVariable(GM.PointerSize==4?28:48);function windows_terminal(){this._ObjectID=\\"windows_terminal\\";this._user32=GM.CreateNativeProxy(\\"User32.dll\\");this._user32.CreateMethod(\\"DispatchMessageA\\");this._user32.CreateMethod(\\"GetMessageA\\");this._user32.CreateMethod(\\"MapVirtualKeyA\\");this._user32.CreateMethod(\\"PostThreadMessageA\\");this._user32.CreateMethod(\\"SetWinEventHook\\");this._user32.CreateMethod(\\"ShowWindow\\");this._user32.CreateMethod(\\"TranslateMessage\\");this._user32.CreateMethod(\\"UnhookWinEvent\\");this._user32.CreateMethod(\\"VkKeyScanA\\");this._user32.terminal=this;this._kernel32=GM.CreateNativeProxy(\\"Kernel32.dll\\");this._kernel32.CreateMethod(\\"AllocConsole\\");this._kernel32.CreateMethod(\\"CreateProcessA\\");this._kernel32.CreateMethod(\\"CloseHandle\\");this._kernel32.CreateMethod(\\"FillConsoleOutputAttribute\\");this._kernel32.CreateMethod(\\"FillConsoleOutputCharacterA\\");this._kernel32.CreateMethod(\\"GetConsoleScreenBufferInfo\\");this._kernel32.CreateMethod(\\"GetConsoleWindow\\");this._kernel32.CreateMethod(\\"GetLastError\\");this._kernel32.CreateMethod(\\"GetStdHandle\\");this._kernel32.CreateMethod(\\"GetThreadId\\");this._kernel32.CreateMethod(\\"ReadConsoleOutputA\\");this._kernel32.CreateMethod(\\"SetConsoleCursorPosition\\");this._kernel32.CreateMethod(\\"SetConsoleScreenBufferSize\\");this._kernel32.CreateMethod(\\"SetConsoleWindowInfo\\");this._kernel32.CreateMethod(\\"TerminateProcess\\");this._kernel32.CreateMethod(\\"WaitForSingleObject\\");this._kernel32.CreateMethod(\\"WriteConsoleInputA\\");var b=0;var c=0;this._scrx=0;this._scry=0;this.SendCursorUpdate=function(){var g=GM.CreateVariable(22);if(this._kernel32.GetConsoleScreenBufferInfo(this._stdoutput,g).Val==0){return}if(g.Deref(4,2).toBuffer().readUInt16LE()!=this.currentX||g.Deref(6,2).toBuffer().readUInt16LE()!=this.currentY){this.currentX=g.Deref(4,2).toBuffer().readUInt16LE();this.currentY=g.Deref(6,2).toBuffer().readUInt16LE()}};this.ClearScreen=function(){var h=GM.CreateVariable(22);if(this._kernel32.GetConsoleScreenBufferInfo(this._stdoutput,h).Val==0){return}var i=GM.CreateVariable(4);var j=h.Deref(0,2).toBuffer().readUInt16LE(0)*h.Deref(2,2).toBuffer().readUInt16LE(0);var g=GM.CreateVariable(4);if(this._kernel32.FillConsoleOutputCharacterA(this._stdoutput,32,j,i.Deref(0,4).toBuffer().readUInt32LE(),g).Val==0){return}if(this._kernel32.GetConsoleScreenBufferInfo(this._stdoutput,h).Val==0){return}if(this._kernel32.FillConsoleOutputAttribute(this._stdoutput,h.Deref(8,2).toBuffer().readUInt16LE(0),j,i.Deref(0,4).toBuffer().readUInt32LE(),g).Val==0){return}this._kernel32.SetConsoleCursorPosition(this._stdoutput,i.Deref(0,4).toBuffer().readUInt32LE());var k=GM.CreateVariable(8);var l=h.Deref(10,8).toBuffer();k.Deref(4,2).toBuffer().writeUInt16LE(l.readUInt16LE(4)-l.readUInt16LE(0));k.Deref(6,2).toBuffer().writeUInt16LE(l.readUInt16LE(6)-l.readUInt16LE(2));this._kernel32.SetConsoleWindowInfo(this._stdoutput,1,k)};this.PowerShellCapable=function(){if(require(\\"os\\").arch()==\\"x64\\"){return(require(\\"fs\\").existsSync(process.env.windir+\\"\\\\\\\\SysWow64\\\\\\\\WindowsPowerShell\\\\\\\\v1.0\\\\\\\\powershell.exe\\"))}else{return(require(\\"fs\\").existsSync(process.env.windir+\\"\\\\\\\\System32\\\\\\\\WindowsPowerShell\\\\\\\\v1.0\\\\\\\\powershell.exe\\"))}};this.StartEx=function d(h,g,k){h=80;g=25;if(this._stream!=null){throw (\\"Concurrent terminal sessions are not supported on Windows.\\")}this.stopping=null;if(this._kernel32.GetConsoleWindow().Val==0){if(this._kernel32.AllocConsole().Val==0){throw (\\"AllocConsole failed with: \\"+this._kernel32.GetLastError().Val)}}this._stdinput=this._kernel32.GetStdHandle(STD_INPUT_HANDLE);this._stdoutput=this._kernel32.GetStdHandle(STD_OUTPUT_HANDLE);this._connected=false;var i=GM.CreateVariable(4);i.Deref(0,2).toBuffer().writeUInt16LE(h);i.Deref(2,2).toBuffer().writeUInt16LE(g);var j=GM.CreateVariable(8);j.Deref(4,2).toBuffer().writeUInt16LE(h-1);j.Deref(6,2).toBuffer().writeUInt16LE(g-1);if(this._kernel32.SetConsoleWindowInfo(this._stdoutput,1,j).Val==0){throw (\\"Failed to set Console Screen Size\\")}if(this._kernel32.SetConsoleScreenBufferSize(this._stdoutput,i.Deref(0,4).toBuffer().readUInt32LE()).Val==0){throw (\\"Failed to set Console Buffer Size\\")}this._user32.ShowWindow(this._kernel32.GetConsoleWindow().Val,SW_HIDE);this.ClearScreen();this._hookThread(k).then(function(){this.terminal.StartCommand(this.userArgs[0])},console.log);this._stream=new duplex({write:function(l,m){if(!this.terminal.connected){if(!this._promise.chunk){this._promise.chunk=[]}if(typeof(l)==\\"string\\"){this._promise.chunk.push(l)}else{this._promise.chunk.push(Buffer.alloc(l.length));l.copy(this._promise.chunk.peek())}this._promise.chunk.peek().flush=m;this._promise.then(function(){var n;while(this.chunk.length>0){n=this.chunk.shift();this.terminal._WriteBuffer(n);n.flush()}})}else{this.terminal._WriteBuffer(l);m()}return(true)},\\"final\\":function(l){var m=this.terminal._stop();m.__flush=l;m.then(function(){this.__flush()})}});this._stream.terminal=this;this._stream._promise=new promise(function(m,l){this._res=m;this._rej=l});this._stream._promise.terminal=this;this._stream.prependOnceListener(\\"end\\",function(){this.terminal._stream=null});return(this._stream)};this.Start=function d(h,g){return(this.StartEx(h,g,process.env.windir+\\"\\\\\\\\System32\\\\\\\\cmd.exe\\"))};this.StartPowerShell=function f(h,g){if(require(\\"os\\").arch()==\\"x64\\"){if(require(\\"fs\\").existsSync(process.env.windir+\\"\\\\\\\\System32\\\\\\\\WindowsPowerShell\\\\\\\\v1.0\\\\\\\\powershell.exe\\")){return(this.StartEx(h,g,process.env.windir+\\"\\\\\\\\System32\\\\\\\\WindowsPowerShell\\\\\\\\v1.0\\\\\\\\powershell.exe\\"))}else{return(this.StartEx(h,g,process.env.windir+\\"\\\\\\\\SysWow64\\\\\\\\WindowsPowerShell\\\\\\\\v1.0\\\\\\\\powershell.exe\\"))}}else{return(this.StartEx(h,g,process.env.windir+\\"\\\\\\\\System32\\\\\\\\WindowsPowerShell\\\\\\\\v1.0\\\\\\\\powershell.exe\\"))}};this._stop=function(){if(this.stopping){return(this.stopping)}this._ConsoleWinEventProc.removeAllListeners(\\"GlobalCallback\\");this.stopping=new promise(function(i,h){this._res=i;this._rej=h});var g=this._kernel32.GetThreadId(this._user32.SetWinEventHook.async.thread()).Val;this._user32.PostThreadMessageA(g,WM_QUIT,0,0);this._stream.emit(\\"end\\");return(this.stopping)};this._hookThread=function(){var i=new promise(function(k,j){this._res=k;this._rej=j});i.userArgs=[];for(var g in arguments){i.userArgs.push(arguments[g])}i.terminal=this;this._ConsoleWinEventProc=GM.GetGenericGlobalCallback(7);this._ConsoleWinEventProc.terminal=this;var h=this._user32.SetWinEventHook.async(EVENT_CONSOLE_CARET,EVENT_CONSOLE_END_APPLICATION,0,this._ConsoleWinEventProc,0,0,WINEVENT_OUTOFCONTEXT|WINEVENT_SKIPOWNPROCESS);h.ready=i;h.terminal=this;h.then(function(j){if(j.Val==0){this.ready._rej(\\"Error calling SetWinEventHook\\")}else{this.terminal.hwinEventHook=j;this.ready._res();this.terminal._GetMessage()}});this._ConsoleWinEventProc.on(\\"GlobalCallback\\",function(l,k,m,p,n,o,r){if(!this.terminal.hwinEventHook||this.terminal.hwinEventHook.Val!=l.Val){return}var j=null;switch(k.Val){case EVENT_CONSOLE_CARET:break;case EVENT_CONSOLE_UPDATE_REGION:if(!this.terminal.connected){this.terminal.connected=true;this.terminal._stream._promise._res()}if(this.terminal._scrollTimer==null){j=this.terminal._GetScreenBuffer(LOWORD(p.Val),HIWORD(p.Val),LOWORD(n.Val),HIWORD(n.Val));this.terminal._SendDataBuffer(j)}break;case EVENT_CONSOLE_UPDATE_SIMPLE:var q={data:[Buffer.alloc(1,LOWORD(n.Val))],attributes:[HIWORD(n.Val)],width:1,height:1,x:LOWORD(p.Val),y:HIWORD(p.Val)};this.terminal._SendDataBuffer(q);break;case EVENT_CONSOLE_UPDATE_SCROLL:this.terminal._SendScroll(p.Val,n.Val);break;case EVENT_CONSOLE_LAYOUT:break;case EVENT_CONSOLE_START_APPLICATION:break;case EVENT_CONSOLE_END_APPLICATION:if(p.Val==this.terminal._hProcessID){this.terminal._hProcess=null;this.terminal._stop().then(function(){console.log(\\"STOPPED\\")})}break;default:console.log(\\"Unknown event: \\"+k.Val);break}});return(i)};this._GetMessage=function(){if(this._user32.abort){console.log(\\"aborting loop\\");return}this._user32.GetMessageA.async(this._user32.SetWinEventHook.async,MSG,0,0,0).then(function(g){if(g.Val!=0){if(g.Val==-1){}else{this.nativeProxy._user32.TranslateMessage.async(this.nativeProxy.user32.SetWinEventHook.async,MSG).then(function(){this.nativeProxy._user32.DispatchMessageA.async(this.nativeProxy.user32.SetWinEventHook.async,MSG).then(function(){this.nativeProxy.terminal._GetMessage()},console.log)},console.log)}}else{this.nativeProxy.UnhookWinEvent.async(this.nativeProxy.terminal._user32.SetWinEventHook.async,this.nativeProxy.terminal.hwinEventHook).then(function(){if(this.nativeProxy.terminal._hProcess==null){return}this.nativeProxy.terminal.stopping._res();if(this.nativeProxy.terminal._kernel32.TerminateProcess(this.nativeProxy.terminal._hProcess,1067).Val==0){var h=this.nativeProxy.terminal._kernel32.GetLastError().Val;console.log(\\"Unable to kill Terminal Process, error: \\"+h)}this.nativeProxy.terminal.stopping=null},function(h){console.log(\\"REJECTED_UnhookWinEvent: \\"+h)})}},function(g){console.log(\\"REJECTED_GETMessage: \\"+g)})};this._WriteBuffer=function(g){for(var h=0;hm;++k){this._stream.push(Buffer.from(\\"\\\\r\\\\n\\"))}var g=this._GetScreenBuffer(0,0,n-1,m-1);this._SendDataBuffer(g);this._scrollTimer=setTimeout(function(q,p,o){var i=q._GetScreenBuffer(0,0,p-1,o-1);q._SendDataBuffer(i);q._scrollTimer=null},250,this,n,m)};this.StartCommand=function e(g){if(this._kernel32.CreateProcessA(GM.CreateVariable(g),0,0,0,1,CREATE_NEW_PROCESS_GROUP,0,0,si,pi).Val==0){console.log(\\"Error Spawning CMD\\");return}this._kernel32.CloseHandle(pi.Deref(GM.PointerSize,GM.PointerSize).Deref());this._hProcess=pi.Deref(0,GM.PointerSize).Deref();this._hProcessID=pi.Deref(GM.PointerSize==4?8:16,4).toBuffer().readUInt32LE()}}function LOWORD(a){return(a&65535)}function HIWORD(a){return((a>>16)&65535)}function GetEsc(b,a){return(Buffer.from(\\"\\\\x1B[\\"+a.join(\\";\\")+b))}function MeshConsole(a){require(\\"MeshAgent\\").SendCommand({action:\\"msg\\",type:\\"console\\",value:JSON.stringify(a)})}function TranslateLine(r,s,f,a){var m,l,e,q,j,c,n,k,d,p,h,b,g=[],o=[GetEsc(\\"H\\",[s,r])];if(typeof a==\\"number\\"){a=[a]}for(m=0;m>2);d=(a[m]&112)>>4;d=((d&1)<<2)+(d&2)+((d&4)>>2);p=(a[m]&16384);h=(a[m]&8)>>3;b=(a[m]&128);if(p!=q){if(p!=0){g.push(7)}else{g.push(0);l=7;e=0;j=0;c=0}q=p}if(k!=l){g.push(k+30);l=k}if(d!=e){g.push(d+40);e=d}if(h!=j){g.push(2-h);j=h}if(b!=c){if(b==0){g.push(e+40)}else{g.push(e+100);c=b}}if(g.length>0){o.push(GetEsc(\\"m\\",g));g=[]}n=a[m]}o.push(Buffer.from(String.fromCharCode(f[m])))}return Buffer.concat(o)}module.exports=new windows_terminal();"); addedModules.push("win-terminal"); } catch (e) { }\r\ntry { addModule("win-virtual-terminal", "var PROC_THREAD_ATTRIBUTE_PSEUDOCONSOLE=131094;var EXTENDED_STARTUPINFO_PRESENT=524288;var HEAP_ZERO_MEMORY=8;var duplex=require(\\"stream\\").Duplex;function vt(){this._ObjectID=\\"win-virtual-terminal\\";Object.defineProperty(this,\\"supported\\",{value:(function(){var f=require(\\"_GenericMarshal\\");var g=f.CreateNativeProxy(\\"kernel32.dll\\");try{g.CreateMethod(\\"CreatePseudoConsole\\")}catch(d){return(false)}return(true)})()});this.Create=function a(k,o,i){if(!this.supported){throw (\\"This build of Windows does not have support for PseudoConsoles\\")}if(!o){o=80}if(!i){i=25}var h=require(\\"_GenericMarshal\\");var j=h.CreateNativeProxy(\\"kernel32.dll\\");j.CreateMethod(\\"CancelIoEx\\");j.CreateMethod(\\"CreatePipe\\");j.CreateMethod(\\"CreateProcessW\\");j.CreateMethod(\\"CreatePseudoConsole\\");j.CreateMethod(\\"CloseHandle\\");j.CreateMethod(\\"ClosePseudoConsole\\");j.CreateMethod(\\"GetProcessHeap\\");j.CreateMethod(\\"HeapAlloc\\");j.CreateMethod(\\"InitializeProcThreadAttributeList\\");j.CreateMethod(\\"ResizePseudoConsole\\");j.CreateMethod(\\"UpdateProcThreadAttribute\\");j.CreateMethod(\\"WriteFile\\");j.CreateMethod(\\"ReadFile\\");j.CreateMethod(\\"TerminateProcess\\");var m={_h:h.CreatePointer(),_consoleInput:h.CreatePointer(),_consoleOutput:h.CreatePointer(),_input:h.CreatePointer(),_output:h.CreatePointer(),k32:j};var f=h.CreateVariable(8);var e;var l=h.CreateVariable(h.PointerSize==4?16:24);if(j.CreatePipe(m._consoleInput,m._input,0,0).Val==0){console.log(\\"PIPE/FAIL\\")}if(j.CreatePipe(m._output,m._consoleOutput,0,0).Val==0){console.log(\\"PIPE/FAIL\\")}if(j.CreatePseudoConsole((i<<16)|o,m._consoleInput.Deref(),m._consoleOutput.Deref(),0,m._h).Val!=0){throw (\\"Error calling CreatePseudoConsole()\\")}j.InitializeProcThreadAttributeList(0,1,0,f);e=h.CreateVariable(f.toBuffer().readUInt32LE());var n=h.CreateVariable(h.PointerSize==8?112:72);n.toBuffer().writeUInt32LE(h.PointerSize==8?112:72,0);e.pointerBuffer().copy(n.Deref(h.PointerSize==8?104:68,h.PointerSize).toBuffer());if(j.InitializeProcThreadAttributeList(e,1,0,f).Val!=0){if(j.UpdateProcThreadAttribute(e,0,PROC_THREAD_ATTRIBUTE_PSEUDOCONSOLE,m._h.Deref(),h.PointerSize,0,0).Val!=0){if(j.CreateProcessW(0,h.CreateVariable(k,{wide:true}),0,0,1,EXTENDED_STARTUPINFO_PRESENT,0,0,n,l).Val!=0){m._startupinfoex=n;m._process=l.Deref(0);m._pid=l.Deref(h.PointerSize==4?8:16,4).toBuffer().readUInt32LE();var g=new duplex({write:function(p,q){var r=require(\\"_GenericMarshal\\").CreateVariable(4);this.terminal.k32.WriteFile(this.terminal._input.Deref(),require(\\"_GenericMarshal\\").CreateVariable(p),p.length,r,0);q();return(true)},\\"final\\":function(p){if(this.terminal._process){this.terminal._process=null;j.ClosePseudoConsole(this._obj._h.Deref())}p()}});g._obj=m;m._waiter=require(\\"DescriptorEvents\\").addDescriptor(l.Deref(0));m._waiter.ds=g;m._waiter._obj=m;m._waiter.on(\\"signaled\\",function(){j.CancelIoEx(this._obj._output.Deref(),0);this.ds.push(null);if(this._obj._process){this._obj._process=null;j.ClosePseudoConsole(this._obj._h.Deref())}j.CloseHandle(this._obj._input.Deref());j.CloseHandle(this._obj._output.Deref());j.CloseHandle(this._obj._consoleInput.Deref());j.CloseHandle(this._obj._consoleOutput.Deref())});g.resizeTerminal=function(r,p){console.setDestination(console.Destinations.LOGFILE);console.log(\\"resizeTerminal(\\"+r+\\", \\"+p+\\")\\");var q;if((q=j.ResizePseudoConsole(this._obj._h.Deref(),(p<<16)|r).Val)!=0){console.log(\\"HResult=\\"+q);throw (\\"Resize returned HRESULT: \\"+q)}console.log(\\"SUCCESS\\")};g.terminal=m;g._rpbuf=h.CreateVariable(4096);g._rpbufRead=h.CreateVariable(4);g.__read=function d(){this._rp=this.terminal.k32.ReadFile.async(this.terminal._output.Deref(),this._rpbuf,this._rpbuf._size,this._rpbufRead,0);this._rp.then(function(){var p=this.parent._rpbufRead.toBuffer().readUInt32LE();if(p<=0){return}this.parent.push(this.parent._rpbuf.toBuffer().slice(0,p));this.parent.__read()});this._rp.parent=this};g.__read();return(g)}else{}}}throw (\\"Internal Error\\")};this.PowerShellCapable=function(){if(require(\\"os\\").arch()==\\"x64\\"){return(require(\\"fs\\").existsSync(process.env.windir+\\"\\\\\\\\SysWow64\\\\\\\\WindowsPowerShell\\\\\\\\v1.0\\\\\\\\powershell.exe\\"))}else{return(require(\\"fs\\").existsSync(process.env.windir+\\"\\\\\\\\System32\\\\\\\\WindowsPowerShell\\\\\\\\v1.0\\\\\\\\powershell.exe\\"))}};this.Start=function b(e,d){return(this.Create(process.env.windir+\\"\\\\\\\\System32\\\\\\\\cmd.exe\\",e,d))};this.StartPowerShell=function c(e,d){if(require(\\"os\\").arch()==\\"x64\\"){if(require(\\"fs\\").existsSync(process.env.windir+\\"\\\\\\\\System32\\\\\\\\WindowsPowerShell\\\\\\\\v1.0\\\\\\\\powershell.exe\\")){return(this.Create(process.env.windir+\\"\\\\\\\\System32\\\\\\\\WindowsPowerShell\\\\\\\\v1.0\\\\\\\\powershell.exe\\",e,d))}else{return(this.Create(process.env.windir+\\"\\\\\\\\SysWow64\\\\\\\\WindowsPowerShell\\\\\\\\v1.0\\\\\\\\powershell.exe\\",e,d))}}else{return(this.Create(process.env.windir+\\"\\\\\\\\System32\\\\\\\\WindowsPowerShell\\\\\\\\v1.0\\\\\\\\powershell.exe\\",e,d))}}}if(process.platform==\\"win32\\"){module.exports=new vt()};"); addedModules.push("win-virtual-terminal"); } catch (e) { }\r\n/*\r\nCopyright 2019 Intel Corporation\r\n\r\nLicensed under the Apache License, Version 2.0 (the "License");\r\nyou may not use this file except in compliance with the License.\r\nYou may obtain a copy of the License at\r\n\r\n http://www.apache.org/licenses/LICENSE-2.0\r\n\r\nUnless required by applicable law or agreed to in writing, software\r\ndistributed under the License is distributed on an "AS IS" BASIS,\r\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\nSee the License for the specific language governing permissions and\r\nlimitations under the License.\r\n*/\r\n\r\nrequire(\'MeshAgent\').on(\'Connected\', function (status)\r\n{\r\n if (status == 0)\r\n {\r\n return;\r\n }\r\n this.timeout = setTimeout(start, 10000);\r\n});\r\n\r\n\r\n\r\nfunction sendServerLog(msg)\r\n{\r\n require(\'MeshAgent\').SendCommand({ action: \'diagnostic\', value: { command: \'log\', value: msg } });\r\n}\r\nfunction getMeshAgentService()\r\n{\r\n try\r\n {\r\n var ret = require(\'service-manager\').manager.getService(process.platform == \'win32\' ? \'mesh agent\' : \'meshagent\');\r\n return(ret);\r\n }\r\n catch(e)\r\n {\r\n return (null);\r\n }\r\n}\r\n\r\nfunction getARCHID() {\r\n var ret = 0;\r\n switch (process.platform) {\r\n case \'linux\':\r\n // Need to detect Architecture ID\r\n var child = require(\'child_process\').execFile(\'/bin/sh\', [\'sh\']);\r\n child.stdout.str = \'\';\r\n child.stdout.on(\'data\', function (chunk) { this.str += chunk.toString(); });\r\n child.stdin.write("uname -m\\nexit\\n");\r\n child.waitExit();\r\n switch (child.stdout.str.trim()) {\r\n case \'x86_64\':\r\n case \'amd64\':\r\n ret = 6;\r\n break;\r\n case \'x86\':\r\n case \'i686\':\r\n case \'i586\':\r\n case \'i386\':\r\n ret = 5;\r\n break;\r\n case \'armv6l\':\r\n case \'armv7l\':\r\n ret = 25;\r\n break;\r\n default:\r\n break;\r\n }\r\n break;\r\n case \'darwin\':\r\n ret = 16;\r\n break;\r\n case \'win32\':\r\n ret = process.arch == \'x64\' ? 4 : 3;\r\n break;\r\n }\r\n return (ret);\r\n}\r\n\r\nfunction DownloadAgentBinary(path, ID)\r\n{\r\n var options = require(\'http\').parseUri(require(\'MeshAgent\').ServerInfo.ServerUri);\r\n var downloadUri = \'https://\' + options.host + \':\' + options.port + \'/meshagents?id=\' + (ID != null ? ID : getARCHID());\r\n sendServerLog(\'Diagnostic: Attempting to downlod agent from: \' + downloadUri);\r\n\r\n return (wget(downloadUri, path, { rejectUnauthorized: false }));\r\n}\r\n\r\nfunction giveup()\r\n{\r\n sendServerLog(\'Diagnostic: Unable to diagnose Mesh Agent\');\r\n finished();\r\n}\r\nfunction finished()\r\n{\r\n sendServerLog(\'Diagnostic: End\');\r\n require(\'service-manager\').manager.getService(\'meshagentDiagnostic\').stop();\r\n}\r\n\r\nfunction ConfigureAgent(agent)\r\n{\r\n sendServerLog(\'...Configuring Agent...\');\r\n var info = require(\'MeshAgent\').ServerInfo;\r\n\r\n var msh = \'MeshID=0x\' + info.MeshID + \'\\n\' + \'ServerID=\' + info.ServerID + \'\\n\' + \'MeshServer=\' + info.ServerUri + \'\\n\';\r\n var cfg = require(\'global-tunnel\').proxyConfig;\r\n if(cfg == null)\r\n {\r\n msh += \'ignoreProxyFile=1\\n\';\r\n }\r\n else\r\n {\r\n msh += (\'WebProxy=\' + cfg.host + \':\' + cfg.port + \'\\n\');\r\n }\r\n if(process.platform == \'win32\')\r\n {\r\n require(\'fs\').writeFileSync(agent.appLocation().replace(\'.exe\', \'.msh\'), msh);\r\n }\r\n else\r\n {\r\n require(\'fs\').writeFileSync(agent.appLocation() + \'.msh\', msh);\r\n }\r\n}\r\n\r\nfunction start()\r\n{\r\n sendServerLog(\'Diagnostic: Start\');\r\n\r\n var id = getARCHID();\r\n var s = getMeshAgentService();\r\n if (s == null)\r\n {\r\n DownloadAgentBinary(\'agent_temporary.bin\').then(function ()\r\n {\r\n // SUCCESS\r\n try\r\n {\r\n var agent = require(\'service-manager\').manager.installService(\r\n {\r\n name: process.platform == \'win32\' ? \'Mesh Agent\' : \'meshagent\',\r\n target: \'meshagent\',\r\n description: \'Mesh Central Agent v2 Background Service\',\r\n displayName: \'Mesh Agent v2 Background Service\',\r\n servicePath: \'agent_temporary.bin\',\r\n startType: \'DEMAND_START\'\r\n });\r\n require(\'fs\').unlinkSync(\'agent_temporary.bin\');\r\n ConfigureAgent(agent);\r\n }\r\n catch(e)\r\n {\r\n giveup();\r\n }\r\n },\r\n function ()\r\n {\r\n // FAILURE\r\n giveup();\r\n });\r\n }\r\n if(s!=null)\r\n {\r\n // Mesh Agent Installation Found\r\n sendServerLog(\'Diagnostic: Mesh Agent Service => \' + (s.isRunning() ? \'RUNNING\' : \'NOT-RUNNING\'));\r\n if(s.isRunning())\r\n {\r\n finished();\r\n }\r\n else\r\n {\r\n sendServerLog(\'Diagnostic: Attempting to start Mesh Agent\');\r\n s.start();\r\n sendServerLog(\'Diagnostic: \' + (s.isRunning() ? \'(SUCCESS)\' : \'(FAILED)\'));\r\n if (s.isRunning())\r\n {\r\n finished();\r\n return;\r\n }\r\n else\r\n {\r\n DownloadAgentBinary(s.appLocation()).then(\r\n function () {\r\n sendServerLog(\'Diagnostic: Downloaded Successfully\');\r\n sendServerLog(\'Diagnostic: Attempting to start Mesh Agent\');\r\n s.start();\r\n sendServerLog(\'Diagnostic: \' + (s.isRunning() ? \'(SUCCESS)\' : \'(FAILED)\'));\r\n if (s.isRunning()) {\r\n finished();\r\n return;\r\n }\r\n else {\r\n giveup();\r\n }\r\n },\r\n function () {\r\n sendServerLog(\'Diagnostic: Download Failed\');\r\n giveup();\r\n });\r\n }\r\n }\r\n }\r\n};\r\n', - 'linux-agentrecovery': '\u0000\u0000\u0000\u0000var addedModules = [];\r\n/*\r\nCopyright 2019 Intel Corporation\r\n\r\nLicensed under the Apache License, Version 2.0 (the "License");\r\nyou may not use this file except in compliance with the License.\r\nYou may obtain a copy of the License at\r\n\r\n http://www.apache.org/licenses/LICENSE-2.0\r\n\r\nUnless required by applicable law or agreed to in writing, software\r\ndistributed under the License is distributed on an "AS IS" BASIS,\r\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\nSee the License for the specific language governing permissions and\r\nlimitations under the License.\r\n*/\r\n\r\nrequire(\'MeshAgent\').on(\'Connected\', function (status)\r\n{\r\n if (status == 0)\r\n {\r\n return;\r\n }\r\n this.timeout = setTimeout(start, 10000);\r\n});\r\n\r\n\r\n\r\nfunction sendServerLog(msg)\r\n{\r\n require(\'MeshAgent\').SendCommand({ action: \'diagnostic\', value: { command: \'log\', value: msg } });\r\n}\r\nfunction getMeshAgentService()\r\n{\r\n try\r\n {\r\n var ret = require(\'service-manager\').manager.getService(process.platform == \'win32\' ? \'mesh agent\' : \'meshagent\');\r\n return(ret);\r\n }\r\n catch(e)\r\n {\r\n return (null);\r\n }\r\n}\r\n\r\nfunction getARCHID() {\r\n var ret = 0;\r\n switch (process.platform) {\r\n case \'linux\':\r\n // Need to detect Architecture ID\r\n var child = require(\'child_process\').execFile(\'/bin/sh\', [\'sh\']);\r\n child.stdout.str = \'\';\r\n child.stdout.on(\'data\', function (chunk) { this.str += chunk.toString(); });\r\n child.stdin.write("uname -m\\nexit\\n");\r\n child.waitExit();\r\n switch (child.stdout.str.trim()) {\r\n case \'x86_64\':\r\n case \'amd64\':\r\n ret = 6;\r\n break;\r\n case \'x86\':\r\n case \'i686\':\r\n case \'i586\':\r\n case \'i386\':\r\n ret = 5;\r\n break;\r\n case \'armv6l\':\r\n case \'armv7l\':\r\n ret = 25;\r\n break;\r\n default:\r\n break;\r\n }\r\n break;\r\n case \'darwin\':\r\n ret = 16;\r\n break;\r\n case \'win32\':\r\n ret = process.arch == \'x64\' ? 4 : 3;\r\n break;\r\n }\r\n return (ret);\r\n}\r\n\r\nfunction DownloadAgentBinary(path, ID)\r\n{\r\n var options = require(\'http\').parseUri(require(\'MeshAgent\').ServerInfo.ServerUri);\r\n var downloadUri = \'https://\' + options.host + \':\' + options.port + \'/meshagents?id=\' + (ID != null ? ID : getARCHID());\r\n sendServerLog(\'Diagnostic: Attempting to downlod agent from: \' + downloadUri);\r\n\r\n return (wget(downloadUri, path, { rejectUnauthorized: false }));\r\n}\r\n\r\nfunction giveup()\r\n{\r\n sendServerLog(\'Diagnostic: Unable to diagnose Mesh Agent\');\r\n finished();\r\n}\r\nfunction finished()\r\n{\r\n sendServerLog(\'Diagnostic: End\');\r\n require(\'service-manager\').manager.getService(\'meshagentDiagnostic\').stop();\r\n}\r\n\r\nfunction ConfigureAgent(agent)\r\n{\r\n sendServerLog(\'...Configuring Agent...\');\r\n var info = require(\'MeshAgent\').ServerInfo;\r\n\r\n var msh = \'MeshID=0x\' + info.MeshID + \'\\n\' + \'ServerID=\' + info.ServerID + \'\\n\' + \'MeshServer=\' + info.ServerUri + \'\\n\';\r\n var cfg = require(\'global-tunnel\').proxyConfig;\r\n if(cfg == null)\r\n {\r\n msh += \'ignoreProxyFile=1\\n\';\r\n }\r\n else\r\n {\r\n msh += (\'WebProxy=\' + cfg.host + \':\' + cfg.port + \'\\n\');\r\n }\r\n if(process.platform == \'win32\')\r\n {\r\n require(\'fs\').writeFileSync(agent.appLocation().replace(\'.exe\', \'.msh\'), msh);\r\n }\r\n else\r\n {\r\n require(\'fs\').writeFileSync(agent.appLocation() + \'.msh\', msh);\r\n }\r\n}\r\n\r\nfunction start()\r\n{\r\n sendServerLog(\'Diagnostic: Start\');\r\n\r\n var id = getARCHID();\r\n var s = getMeshAgentService();\r\n if (s == null)\r\n {\r\n DownloadAgentBinary(\'agent_temporary.bin\').then(function ()\r\n {\r\n // SUCCESS\r\n try\r\n {\r\n var agent = require(\'service-manager\').manager.installService(\r\n {\r\n name: process.platform == \'win32\' ? \'Mesh Agent\' : \'meshagent\',\r\n target: \'meshagent\',\r\n description: \'Mesh Central Agent v2 Background Service\',\r\n displayName: \'Mesh Agent v2 Background Service\',\r\n servicePath: \'agent_temporary.bin\',\r\n startType: \'DEMAND_START\'\r\n });\r\n require(\'fs\').unlinkSync(\'agent_temporary.bin\');\r\n ConfigureAgent(agent);\r\n }\r\n catch(e)\r\n {\r\n giveup();\r\n }\r\n },\r\n function ()\r\n {\r\n // FAILURE\r\n giveup();\r\n });\r\n }\r\n if(s!=null)\r\n {\r\n // Mesh Agent Installation Found\r\n sendServerLog(\'Diagnostic: Mesh Agent Service => \' + (s.isRunning() ? \'RUNNING\' : \'NOT-RUNNING\'));\r\n if(s.isRunning())\r\n {\r\n finished();\r\n }\r\n else\r\n {\r\n sendServerLog(\'Diagnostic: Attempting to start Mesh Agent\');\r\n s.start();\r\n sendServerLog(\'Diagnostic: \' + (s.isRunning() ? \'(SUCCESS)\' : \'(FAILED)\'));\r\n if (s.isRunning())\r\n {\r\n finished();\r\n return;\r\n }\r\n else\r\n {\r\n DownloadAgentBinary(s.appLocation()).then(\r\n function () {\r\n sendServerLog(\'Diagnostic: Downloaded Successfully\');\r\n sendServerLog(\'Diagnostic: Attempting to start Mesh Agent\');\r\n s.start();\r\n sendServerLog(\'Diagnostic: \' + (s.isRunning() ? \'(SUCCESS)\' : \'(FAILED)\'));\r\n if (s.isRunning()) {\r\n finished();\r\n return;\r\n }\r\n else {\r\n giveup();\r\n }\r\n },\r\n function () {\r\n sendServerLog(\'Diagnostic: Download Failed\');\r\n giveup();\r\n });\r\n }\r\n }\r\n }\r\n};\r\n', - 'windows-tiny': '\u0000\u0000\u0000\u0000var addedModules = [];\r\n/*\r\nCopyright 2018-2021 Intel Corporation\r\n\r\nLicensed under the Apache License, Version 2.0 (the "License");\r\nyou may not use this file except in compliance with the License.\r\nYou may obtain a copy of the License at\r\n\r\n\thttp://www.apache.org/licenses/LICENSE-2.0\r\n\r\nUnless required by applicable law or agreed to in writing, software\r\ndistributed under the License is distributed on an "AS IS" BASIS,\r\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\nSee the License for the specific language governing permissions and\r\nlimitations under the License.\r\n*/\r\n\r\nvar obj = { meshCoreInfo: \'TinyCore v1\' };\r\nvar mesh = null;\r\n\r\n// Replace a string with a number if the string is an exact number\r\nfunction toNumberIfNumber(x) { if ((typeof x == \'string\') && (+parseInt(x) === x)) { x = parseInt(x); } return x; }\r\n\r\n// Split a string taking into account the quoats. Used for command line parsing\r\nfunction splitArgs(str)\r\n{\r\n var myArray = [], myRegexp = /[^\\s"]+|"([^"]*)"/gi;\r\n do { var match = myRegexp.exec(str); if (match != null) { myArray.push(match[1] ? match[1] : match[0]); } } while (match != null);\r\n return myArray;\r\n}\r\n// Parse arguments string array into an object\r\nfunction parseArgs(argv)\r\n{\r\n var results = { \'_\': [] }, current = null;\r\n for (var i = 1, len = argv.length; i < len; i++)\r\n {\r\n var x = argv[i];\r\n if (x.length > 2 && x[0] == \'-\' && x[1] == \'-\')\r\n {\r\n if (current != null) { results[current] = true; }\r\n current = x.substring(2);\r\n } else\r\n {\r\n if (current != null) { results[current] = toNumberIfNumber(x); current = null; } else { results[\'_\'].push(toNumberIfNumber(x)); }\r\n }\r\n }\r\n if (current != null) { results[current] = true; }\r\n return results;\r\n}\r\nfunction sendConsoleText(msg, sessionid)\r\n{\r\n try\r\n {\r\n if (sessionid != null)\r\n {\r\n require(\'MeshAgent\').SendCommand({ action: \'msg\', type: \'console\', value: msg, sessionid: sessionid });\r\n }\r\n else\r\n {\r\n require(\'MeshAgent\').SendCommand({ action: \'msg\', type: \'console\', value: msg });\r\n }\r\n }\r\n catch(e)\r\n {\r\n }\r\n}\r\n\r\nfunction processConsoleCommand(cmd, args, rights, sessionid)\r\n{\r\n try\r\n {\r\n var response = null;\r\n switch (cmd)\r\n {\r\n case \'help\':\r\n response = "Available commands are: eval, osinfo, setdebug, versions.";\r\n break;\r\n case \'versions\':\r\n response = JSON.stringify(process.versions, null, \' \');\r\n break;\r\n case \'eval\':\r\n { // Eval JavaScript\r\n if (args[\'_\'].length < 1)\r\n {\r\n response = \'Proper usage: eval "JavaScript code"\'; // Display correct command usage\r\n } else\r\n {\r\n response = JSON.stringify(require(\'MeshAgent\').eval(args[\'_\'][0])); // This can only be run by trusted administrator.\r\n }\r\n break;\r\n }\r\n case \'setdebug\':\r\n {\r\n if (args[\'_\'].length < 1) { response = \'Proper usage: setdebug (target), 0 = Disabled, 1 = StdOut, 2 = This Console, * = All Consoles, 4 = WebLog, 8 = Logfile\'; } // Display usage\r\n else { if (args[\'_\'][0] == \'*\') { console.setDestination(2); } else { console.setDestination(parseInt(args[\'_\'][0]), sessionid); } }\r\n break;\r\n }\r\n case \'osinfo\': { // Return the operating system information\r\n var i = 1;\r\n if (args[\'_\'].length > 0) { i = parseInt(args[\'_\'][0]); if (i > 8) { i = 8; } response = \'Calling \' + i + \' times.\'; }\r\n for (var j = 0; j < i; j++)\r\n {\r\n var pr = require(\'os\').name();\r\n pr.sessionid = sessionid;\r\n pr.then(function (v)\r\n {\r\n sendConsoleText("OS: " + v, this.sessionid);\r\n });\r\n }\r\n break;\r\n }\r\n default: { // This is an unknown command, return an error message\r\n response = \'Unknown command \\"\' + cmd + \'\\", type \\"help\\" for list of available commands.\';\r\n break;\r\n }\r\n }\r\n } catch (e) { response = "Command returned an exception error: " + e; console.log(e); }\r\n if (response != null) { sendConsoleText(response, sessionid); }\r\n}\r\n\r\n\r\n// Handle a mesh agent command\r\nfunction handleServerCommand(data)\r\n{\r\n if ((typeof data == \'object\') && (data.action == \'msg\') && (data.type == \'console\') && data.value && data.sessionid)\r\n {\r\n if (data.value && data.sessionid)\r\n {\r\n try\r\n {\r\n var args = splitArgs(data.value);\r\n processConsoleCommand(args[0].toLowerCase(), parseArgs(args), data.rights, data.sessionid);\r\n }\r\n catch(e)\r\n {\r\n sendConsoleText(e);\r\n }\r\n }\r\n }\r\n else\r\n {\r\n console.log(JSON.stringify(data, null, 1));\r\n }\r\n}\r\n\r\n// Called when the server connection state changes\r\nfunction handleServerConnection(state)\r\n{\r\n if (state == 1) { mesh.SendCommand({ "action": "coreinfo", "value": obj.meshCoreInfo }); } // Server connected, send mesh core information\r\n}\r\n\r\nobj.start = function ()\r\n{\r\n // Hook up mesh agent events\r\n mesh.AddCommandHandler(handleServerCommand);\r\n mesh.AddConnectHandler(handleServerConnection);\r\n mesh.SendCommand({ action: \'coreinfo\', value: "TinyCore", caps: 0 }); \r\n}\r\n\r\nobj.stop = function ()\r\n{\r\n mesh.AddCommandHandler(null);\r\n mesh.AddConnectHandler(null);\r\n}\r\n\r\n\r\nvar xexports = null;\r\ntry { xexports = module.exports; } catch (e) { }\r\n\r\nif (xexports != null)\r\n{\r\n // If we are running within NodeJS, export the core\r\n module.exports.createMeshCore = function (agent) { mesh = agent.getMeshApi(); return (obj); };\r\n}\r\nelse\r\n{\r\n // If we are not running in NodeJS, launch the core\r\n sendConsoleText(\'TinyCore Started...\');\r\n mesh = require(\'MeshAgent\');\r\n obj.start();\r\n}\r\n', - 'linux-tiny': '\u0000\u0000\u0000\u0000var addedModules = [];\r\n/*\r\nCopyright 2018-2021 Intel Corporation\r\n\r\nLicensed under the Apache License, Version 2.0 (the "License");\r\nyou may not use this file except in compliance with the License.\r\nYou may obtain a copy of the License at\r\n\r\n\thttp://www.apache.org/licenses/LICENSE-2.0\r\n\r\nUnless required by applicable law or agreed to in writing, software\r\ndistributed under the License is distributed on an "AS IS" BASIS,\r\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\nSee the License for the specific language governing permissions and\r\nlimitations under the License.\r\n*/\r\n\r\nvar obj = { meshCoreInfo: \'TinyCore v1\' };\r\nvar mesh = null;\r\n\r\n// Replace a string with a number if the string is an exact number\r\nfunction toNumberIfNumber(x) { if ((typeof x == \'string\') && (+parseInt(x) === x)) { x = parseInt(x); } return x; }\r\n\r\n// Split a string taking into account the quoats. Used for command line parsing\r\nfunction splitArgs(str)\r\n{\r\n var myArray = [], myRegexp = /[^\\s"]+|"([^"]*)"/gi;\r\n do { var match = myRegexp.exec(str); if (match != null) { myArray.push(match[1] ? match[1] : match[0]); } } while (match != null);\r\n return myArray;\r\n}\r\n// Parse arguments string array into an object\r\nfunction parseArgs(argv)\r\n{\r\n var results = { \'_\': [] }, current = null;\r\n for (var i = 1, len = argv.length; i < len; i++)\r\n {\r\n var x = argv[i];\r\n if (x.length > 2 && x[0] == \'-\' && x[1] == \'-\')\r\n {\r\n if (current != null) { results[current] = true; }\r\n current = x.substring(2);\r\n } else\r\n {\r\n if (current != null) { results[current] = toNumberIfNumber(x); current = null; } else { results[\'_\'].push(toNumberIfNumber(x)); }\r\n }\r\n }\r\n if (current != null) { results[current] = true; }\r\n return results;\r\n}\r\nfunction sendConsoleText(msg, sessionid)\r\n{\r\n try\r\n {\r\n if (sessionid != null)\r\n {\r\n require(\'MeshAgent\').SendCommand({ action: \'msg\', type: \'console\', value: msg, sessionid: sessionid });\r\n }\r\n else\r\n {\r\n require(\'MeshAgent\').SendCommand({ action: \'msg\', type: \'console\', value: msg });\r\n }\r\n }\r\n catch(e)\r\n {\r\n }\r\n}\r\n\r\nfunction processConsoleCommand(cmd, args, rights, sessionid)\r\n{\r\n try\r\n {\r\n var response = null;\r\n switch (cmd)\r\n {\r\n case \'help\':\r\n response = "Available commands are: eval, osinfo, setdebug, versions.";\r\n break;\r\n case \'versions\':\r\n response = JSON.stringify(process.versions, null, \' \');\r\n break;\r\n case \'eval\':\r\n { // Eval JavaScript\r\n if (args[\'_\'].length < 1)\r\n {\r\n response = \'Proper usage: eval "JavaScript code"\'; // Display correct command usage\r\n } else\r\n {\r\n response = JSON.stringify(require(\'MeshAgent\').eval(args[\'_\'][0])); // This can only be run by trusted administrator.\r\n }\r\n break;\r\n }\r\n case \'setdebug\':\r\n {\r\n if (args[\'_\'].length < 1) { response = \'Proper usage: setdebug (target), 0 = Disabled, 1 = StdOut, 2 = This Console, * = All Consoles, 4 = WebLog, 8 = Logfile\'; } // Display usage\r\n else { if (args[\'_\'][0] == \'*\') { console.setDestination(2); } else { console.setDestination(parseInt(args[\'_\'][0]), sessionid); } }\r\n break;\r\n }\r\n case \'osinfo\': { // Return the operating system information\r\n var i = 1;\r\n if (args[\'_\'].length > 0) { i = parseInt(args[\'_\'][0]); if (i > 8) { i = 8; } response = \'Calling \' + i + \' times.\'; }\r\n for (var j = 0; j < i; j++)\r\n {\r\n var pr = require(\'os\').name();\r\n pr.sessionid = sessionid;\r\n pr.then(function (v)\r\n {\r\n sendConsoleText("OS: " + v, this.sessionid);\r\n });\r\n }\r\n break;\r\n }\r\n default: { // This is an unknown command, return an error message\r\n response = \'Unknown command \\"\' + cmd + \'\\", type \\"help\\" for list of available commands.\';\r\n break;\r\n }\r\n }\r\n } catch (e) { response = "Command returned an exception error: " + e; console.log(e); }\r\n if (response != null) { sendConsoleText(response, sessionid); }\r\n}\r\n\r\n\r\n// Handle a mesh agent command\r\nfunction handleServerCommand(data)\r\n{\r\n if ((typeof data == \'object\') && (data.action == \'msg\') && (data.type == \'console\') && data.value && data.sessionid)\r\n {\r\n if (data.value && data.sessionid)\r\n {\r\n try\r\n {\r\n var args = splitArgs(data.value);\r\n processConsoleCommand(args[0].toLowerCase(), parseArgs(args), data.rights, data.sessionid);\r\n }\r\n catch(e)\r\n {\r\n sendConsoleText(e);\r\n }\r\n }\r\n }\r\n else\r\n {\r\n console.log(JSON.stringify(data, null, 1));\r\n }\r\n}\r\n\r\n// Called when the server connection state changes\r\nfunction handleServerConnection(state)\r\n{\r\n if (state == 1) { mesh.SendCommand({ "action": "coreinfo", "value": obj.meshCoreInfo }); } // Server connected, send mesh core information\r\n}\r\n\r\nobj.start = function ()\r\n{\r\n // Hook up mesh agent events\r\n mesh.AddCommandHandler(handleServerCommand);\r\n mesh.AddConnectHandler(handleServerConnection);\r\n mesh.SendCommand({ action: \'coreinfo\', value: "TinyCore", caps: 0 }); \r\n}\r\n\r\nobj.stop = function ()\r\n{\r\n mesh.AddCommandHandler(null);\r\n mesh.AddConnectHandler(null);\r\n}\r\n\r\n\r\nvar xexports = null;\r\ntry { xexports = module.exports; } catch (e) { }\r\n\r\nif (xexports != null)\r\n{\r\n // If we are running within NodeJS, export the core\r\n module.exports.createMeshCore = function (agent) { mesh = agent.getMeshApi(); return (obj); };\r\n}\r\nelse\r\n{\r\n // If we are not running in NodeJS, launch the core\r\n sendConsoleText(\'TinyCore Started...\');\r\n mesh = require(\'MeshAgent\');\r\n obj.start();\r\n}\r\n' }, - defaultMeshCoresDeflate: - { 'linux-agentrecovery': , - 'windows-agentrecovery': , - 'windows-tiny': , - 'linux-tiny': , - 'linux-recovery': , - 'windows-recovery': , - 'linux-noamt': , - 'linux-amt': , - 'windows-amt': }, - defaultMeshCoresHash: - { 'windows-amt': ':ÔI÷ã­C²’¤ù÷¼îfzà”„EËÌ®€EAWœKtªÂÍã\'«›¶ð¼\u001f…"âÒ\t’', - 'linux-amt': '\u000fÍÆÿ|ϔ\\û\u0017šONÀ]m€!äÁ¬»[—ý« ŒØâ&\t\u0003>”Óî\u0002\u0015\nµ\u0016U\u001aàµqü', - 'linux-noamt': 'O\u0010w\'™Sè©°ÕÊL\u001e<ìCïª\u0004S\u0010"-4\u0000P‰\b\u0002©P{§ù\u0019÷Ù!!\u0003\u001eÞJqsçè\u001c', - 'windows-recovery': '£—xce¹þ\u0017MøFÛ|Ó÷WúWy†çYí\u001e«¯o*ú®öñ³‡êHíÓN/uþ¶q…÷\fÝ', - 'linux-recovery': 'òjÔ¨X#šyŠŽÙ†ËÙÞ@&&ë\u0006¨:ÀÏN‹¸eñ\u000f´Y´‚AÙN~B6©˜šzVó\u0000', - 'windows-agentrecovery': '\u0018Œ¤w·1‡t·Irú`\u000f3øú>]ÿð\b¢\n\u000eçì\u0013`\u0000£N5ÂßoŠ÷¹\u0012SabkEî\u000b', - 'linux-agentrecovery': '„\u0014ÕÔÔe‹\u0017âK¼¸g^¡çÁ\u0010\b\u0018Sk~•†\u0012\u0004É3(0¢5ìùy¦ÏÕs×X쮘äغ', - 'windows-tiny': '¬w\u0004Þ&—ÒìÌÚ3fmZ:òJ¶£Ì8\u0002,ôui\u0005ú2‹\u000eÿš”h^&V\u001aäþÆXº>q\u0018ú', - 'linux-tiny': '¬w\u0004Þ&—ÒìÌÚ3fmZ:òJ¶£Ì8\u0002,ôui\u0005ú2‹\u000eÿš”h^&V\u001aäþÆXº>q\u0018ú' }, - meshToolsBinaries: { MeshCentralAssistant: [Object], MeshCentralRouter: [Object] }, - meshAgentBinaries: - { '3': [Object], - '4': [Object], - '5': [Object], - '6': [Object], - '7': [Object], - '9': [Object], - '13': [Object], - '15': [Object], - '16': [Object], - '18': [Object], - '19': [Object], - '20': [Object], - '24': [Object], - '25': [Object], - '26': [Object], - '27': [Object], - '28': [Object], - '29': [Object], - '30': [Object], - '32': [Object], - '33': [Object], - '40': [Object], - '41': [Object], - '10003': [Object], - '10004': [Object], - '10005': [Object] }, - meshAgentInstallScripts: { '1': [Object], '2': [Object], '5': [Object], '6': [Object] }, - multiServer: null, - maintenanceTimer: - Timeout { - _called: false, - _idleTimeout: 3600000, - _idlePrev: [Object], - _idleNext: [Object], - _idleStart: 1585, - _onTimeout: [Function: wrapper], - _repeat: [Function] }, - serverId: null, - serverKey: , - loginCookieEncryptionKey: , - invitationLinkEncryptionKey: , - serverSelfWriteAllowed: true, - serverStatsCounter: 859, - taskLimiter: - { maxTasks: 50, - maxTaskTime: 20000, - nextTaskId: 16, - currentCount: 1, - current: [Object], - pending: [Object], - timer: [Object], - launch: [Function], - completed: [Function], - clean: [Function] }, - agentUpdateBlockSize: 65531, - serverWarnings: [], - cookieUseOnceTable: {}, - cookieUseOnceTableCleanCounter: 0, - firstStats: true, - currentVer: '0.8.27', - parentpath: 'C:\\Users\\Default.DESKTOP-9CGK2DI\\Desktop\\AmtWebApp\\meshcentral', - datapath: 'C:\\Users\\Default.DESKTOP-9CGK2DI\\Desktop\\AmtWebApp\\meshcentral-data', - filespath: 'C:\\Users\\Default.DESKTOP-9CGK2DI\\Desktop\\AmtWebApp\\meshcentral-files', - backuppath: 'C:\\Users\\Default.DESKTOP-9CGK2DI\\Desktop\\AmtWebApp\\meshcentral-backups', - recordpath: 'C:\\Users\\Default.DESKTOP-9CGK2DI\\Desktop\\AmtWebApp\\meshcentral-recordings', - webViewsPath: 'C:\\Users\\Default.DESKTOP-9CGK2DI\\Desktop\\AmtWebApp\\meshcentral\\views', - webPublicPath: 'C:\\Users\\Default.DESKTOP-9CGK2DI\\Desktop\\AmtWebApp\\meshcentral\\public', - webEmailsPath: 'C:\\Users\\Default.DESKTOP-9CGK2DI\\Desktop\\AmtWebApp\\meshcentral\\emails', - service: { [Function] super_: [Object] }, - servicelog: - { source: 'MeshCentral', - eventLog: [Getter/Setter], - info: [Function], - error: [Function], - warn: [Function], - auditSuccess: [Function], - auditFailure: [Function] }, - Start: [Function], - launchChildServer: [Function], - getLatestServerVersion: [Function], - getServerTags: [Function], - performServerUpdate: [Function], - performServerCertUpdate: [Function], - StartVault: [Function], - StartEx: [Function], - StartEx1b: [Function], - StartEx2: [Function], - StartEx3: [Function], - StartEx4: [Function], - pendingProxyCertificatesRequests: 0, - lastProxyCertificatesRequest: null, - supportsProxyCertificatesRequest: false, - updateProxyCertificates: [Function], - maintenanceActions: [Function], - Stop: [Function], - AddEventDispatch: [Function], - RemoveEventDispatch: [Function], - RemoveEventDispatchId: [Function], - RemoveAllEventDispatch: [Function], - DispatchEvent: [Function], - GetConnectivityState: [Function], - GetRoutingServerIdNotSelf: [Function], - GetRoutingServerId: [Function], - UpdateConnectivityState: [Function], - SetConnectivityState: [Function], - ClearConnectivityState: [Function], - escapeCodeString: [Function], - updateMeshCore: [Function], - updateMeshCmdTimer: null, - updateMeshCmd: [Function], - updateMeshTools: [Function], - updateMeshAgentInstallScripts: [Function], - meshAgentsArchitectureNumbers: - { '0': [Object], - '1': [Object], - '2': [Object], - '3': [Object], - '4': [Object], - '5': [Object], - '6': [Object], - '7': [Object], - '8': [Object], - '9': [Object], - '10': [Object], - '11': [Object], - '12': [Object], - '13': [Object], - '14': [Object], - '15': [Object], - '16': [Object], - '17': [Object], - '18': [Object], - '19': [Object], - '20': [Object], - '21': [Object], - '22': [Object], - '23': [Object], - '24': [Object], - '25': [Object], - '26': [Object], - '27': [Object], - '28': [Object], - '29': [Object], - '30': [Object], - '32': [Object], - '33': [Object], - '40': [Object], - '41': [Object], - '10003': [Object], - '10004': [Object], - '10005': [Object] }, - updateMeshAgentsTable: [Function], - getLoginToken: [Function], - showLoginTokenKey: [Function], - loadAmtActivationLogPasswords: [Function], - generateCookieKey: [Function], - encodeCookie: [Function], - decodeCookie: [Function], - decodeCookieAESGCM: [Function], - decodeCookieAESSHA: [Function], - debug: [Function], - updateServerState: [Function], - getServerWarnings: [Function], - addServerWarning: [Function], - authLog: [Function], - getConfigFilePath: [Function], - agentErrorLog: 3, - agentTranslations: '{"en":{"agent":"Agent","agentVersion":"New Agent Version","group":"Device Group","url":"Server URL","meshName":"Mesh Name","meshId":"Mesh Identifier","serverId":"Server Identifier","setup":"Setup","update":"Update","install":"Install","uninstall":"Uninstall","connect":"Connect","disconnect":"Disconnect","cancel":"Cancel","pressok":"Press OK to disconnect","elevation":"Elevated permissions is required to install/uninstall the agent.","sudo":"Please try again with sudo.","ctrlc":"Press Ctrl-C to exit.","commands":"You can run the text version from the command line with the following command(s)","graphicalerror":"The graphical version of this installer canot run on this system","zenity":"Try installing/updating Zenity, and run again","status":["NOT INSTALLED","RUNNING","NOT RUNNING"],"statusDescription":"Current Agent Status","description":"Click the buttons below to install or uninstall the mesh agent. When installed, this software runs in the background allowing this computer to be managed and controlled by a remote administrator."},"cs":{"agent":"Agent","group":"Skupina zařízení","install":"Instalace","uninstall":"Odinstalace","connect":"Připojit","disconnect":"Odpojit","cancel":"Storno","agentVersion":"Nová verze agenta","url":"URL serveru","meshName":"Název oka","meshId":"Identifikátor sítě","serverId":"Identifikátor serveru","setup":"Založit","update":"Aktualizace","pressok":"Stisknutím tlačítka OK se odpojíte","elevation":"K instalaci / odinstalování agenta je vyžadováno zvýšené oprávnění.","sudo":"Zkuste to prosím znovu s sudo.","ctrlc":"Ukončete stisknutím Ctrl-C.","commands":"Textovou verzi můžete spustit z příkazového řádku pomocí následujících příkazů","graphicalerror":"V tomto systému nelze spustit grafickou verzi tohoto instalačního programu","zenity":"Zkuste nainstalovat / aktualizovat Zenity a spustit znovu","status":["NENÍ INSTALOVÁN","BĚH","NEFUNGUJE"],"statusDescription":"Aktuální stav agenta","description":"Kliknutím na tlačítka níže nainstalujete nebo odinstalujete agenta sítě. Po instalaci je tento software spuštěn na pozadí, což umožňuje spravovat a ovládat tento počítač vzdáleným správcem."},"de":{"agent":"Agent","group":"Gerätegruppe","install":"Installieren","uninstall":"Deinstallation","connect":"Verbinden","disconnect":"Trennen","cancel":"Abbrechen","agentVersion":"Neue Agentenversion","url":"Server-URL","meshName":"Maschenname","meshId":"Netzkennung","serverId":"Server-ID","setup":"Konfiguration","update":"Updates","pressok":"Drücken Sie OK, um die Verbindung zu trennen","elevation":"Für die Installation / Deinstallation des Agenten sind erhöhte Berechtigungen erforderlich.","sudo":"Bitte versuchen Sie es erneut mit sudo.","ctrlc":"Drücken Sie Strg-C, um den Vorgang zu beenden.","commands":"Sie können die Textversion über die Befehlszeile mit den folgenden Befehlen ausführen.","graphicalerror":"Die grafische Version dieses Installationsprogramms kann auf diesem System nicht ausgeführt werden","zenity":"Versuchen Sie, Zenity zu installieren / zu aktualisieren, und führen Sie es erneut aus","status":["NICHT INSTALLIERT","LAUFEN","NICHT LAUFEN"],"statusDescription":"Aktueller Agentenstatus","description":"Klicken Sie auf die Schaltflächen unten, um den Mesh Agent zu installieren oder zu deinstallieren. Bei der Installation wird diese Software im Hintergrund ausgeführt, sodass dieser Computer von einem Remote-Administrator verwaltet und gesteuert werden kann."},"es":{"agent":"Agente","group":"Grupo de Dispositivos","install":"Instalar","uninstall":"Desinstalar","connect":"Conectar","disconnect":"Desconectar","cancel":"Cancelar","agentVersion":"Nueva versión del agente","url":"URL del servidor","meshName":"Nombre de malla","meshId":"Identificador de malla","serverId":"Identificador de servidor","setup":"Preparar","update":"Actualizar","pressok":"Presione OK para desconectar","elevation":"Se requieren permisos elevados para instalar / desinstalar el agente.","sudo":"Vuelve a intentarlo con sudo.","ctrlc":"Presione Ctrl-C para salir.","commands":"Puede ejecutar la versión de texto desde la línea de comandos con los siguientes comandos","graphicalerror":"La versión gráfica de este instalador no se puede ejecutar en este sistema.","zenity":"Intente instalar / actualizar Zenity y vuelva a ejecutar","status":["NO INSTALADO","CORRIENDO","NO CORRAS"],"statusDescription":"Estado actual del agente","description":"Haga clic en los botones a continuación para instalar o desinstalar el agente de malla. Cuando se instala, este software se ejecuta en segundo plano, lo que permite que este equipo sea administrado y controlado por un administrador remoto."},"fi":{"agent":"Agentti","group":"Laiteryhmä","install":"Asenna","uninstall":"Asennuksen poistaminen","connect":"Yhdistä","disconnect":"Katkaise yhteys","cancel":"Peruuta","agentVersion":"Uusi agenttiversio","url":"Palvelimen URL-osoite","meshName":"Verkon nimi","meshId":"Verkon tunniste","serverId":"Palvelimen tunniste","setup":"Perustaa","update":"Päivittää","pressok":"Katkaise yhteys painamalla OK","elevation":"Agentin asentaminen / poistaminen edellyttää korotettuja käyttöoikeuksia.","sudo":"Yritä uudelleen sudolla.","ctrlc":"Poistu painamalla Ctrl-C.","commands":"Voit suorittaa tekstiversio komentoriviltä seuraavilla komennoilla","graphicalerror":"Tämän asennusohjelman graafinen versio ei toimi tässä järjestelmässä","zenity":"Yritä asentaa / päivittää Zenity ja suorita uudelleen","status":["EI ASENNETTU","Juoksu","EI RUNNING"],"statusDescription":"Agentin nykyinen tila","description":"Napsauta alla olevia painikkeita asentaaksesi tai poistaaksesi verkkoagentin. Asennettuna tämä ohjelmisto toimii taustalla, jolloin etävalvoja hallitsee ja hallitsee tietokonetta."},"fr":{"agent":"Agent","group":"Groupe d\'appareils","setup":"Configuration","install":"Installer","uninstall":"Désinstaller","connect":"Se connecter","disconnect":"Déconnecter","cancel":"Annuler","agentVersion":"Nouvelle version de l\'agent","url":"URL du serveur","meshName":"Nom du maillage","meshId":"Identificateur de maillage","serverId":"Identifiant du serveur","update":"Mettre à jour","pressok":"Appuyez sur OK pour vous déconnecter","elevation":"Des autorisations élevées sont requises pour installer / désinstaller l\'agent.","sudo":"Veuillez réessayer avec sudo.","ctrlc":"Appuyez sur Ctrl-C pour quitter.","commands":"Vous pouvez exécuter la version texte à partir de la ligne de commande avec la ou les commandes suivantes","graphicalerror":"La version graphique de ce programme d\'installation ne peut pas s\'exécuter sur ce système","zenity":"Essayez d\'installer / mettre à jour Zenity et réexécutez","status":["PAS INSTALLÉ","FONCTIONNEMENT","NE PAS COURRIR"],"statusDescription":"Statut actuel de l\'agent","description":"Cliquez sur les boutons ci-dessous pour installer ou désinstaller l\'agent de maillage. Une fois installé, ce logiciel s\'exécute en arrière-plan permettant à cet ordinateur d\'être géré et contrôlé par un administrateur distant."},"hi":{"agent":"एजेंट","group":"डिवाइस समूह","install":"इंस्टॉल","uninstall":"स्थापना रद्द करें","connect":"जुडिये","disconnect":"डिस्कनेक्ट","cancel":"रद्द करना","agentVersion":"नया एजेंट संस्करण","url":"सर्वर URL","meshName":"मेष नाम","meshId":"मेष पहचानकर्ता","serverId":"सर्वर पहचानकर्ता","setup":"सेट अप","update":"अपडेट करें","pressok":"डिस्कनेक्ट करने के लिए ओके दबाएं","elevation":"एजेंट को इंस्टॉल / अनइंस्टॉल करने के लिए एलिवेटेड परमिशन की जरूरत होती है।","sudo":"कृपया सूडो के साथ फिर से प्रयास करें।","ctrlc":"बाहर निकलने के लिए Ctrl-C दबाएं।","commands":"आप निम्न कमांड के साथ कमांड लाइन से टेक्स्ट संस्करण चला सकते हैं","graphicalerror":"इस इंस्टॉलर का आलेखीय संस्करण इस सिस्टम पर चलता है","zenity":"ज़ेनिटी को स्थापित / अपडेट करने का प्रयास करें, और फिर से चलाएं","status":["स्थापित नहीं है","चल रहा है","चल नहीं रहा"],"statusDescription":"वर्तमान एजेंट की स्थिति","description":"मेष एजेंट को स्थापित या अनइंस्टॉल करने के लिए नीचे दिए गए बटन पर क्लिक करें। स्थापित होने पर, यह सॉफ़्टवेयर पृष्ठभूमि में चलता है, जिससे यह कंप्यूटर दूरस्थ व्यवस्थापक द्वारा प्रबंधित और नियंत्रित किया जा सकता है।"},"ja":{"agent":"エージェント","group":"デバイスグループ","install":"インストール","uninstall":"アンインストール","connect":"つなぐ","disconnect":"切断する","cancel":"キャンセル","agentVersion":"新しいエージェントバージョン","url":"サーバーのURL","meshName":"メッシュ名","meshId":"メッシュ識別子","serverId":"サーバー識別子","setup":"セットアップ","update":"更新","pressok":"OKを押して切断します","elevation":"エージェントをインストール/アンインストールするには、昇格された権限が必要です。","sudo":"sudoでもう一度やり直してください。","ctrlc":"Ctrl-Cを押して終了します。","commands":"次のコマンドを使用して、コマンドラインからテキストバージョンを実行できます。","graphicalerror":"このインストーラーのグラフィカルバージョンは、このシステムでは実行できません","zenity":"Zenityをインストール/更新して、もう一度実行してください","status":["インストールされていない","ランニング","走っていない"],"statusDescription":"現在のエージェントステータス","description":"下のボタンをクリックして、メッシュエージェントをインストールまたはアンインストールします。インストールすると、このソフトウェアはバックグラウンドで実行され、リモート管理者がこのコンピューターを管理および制御できるようになります。"},"ko":{"agent":"에이전트","agentVersion":"새에이전트 버전","group":"장치 그룹","url":"서버의 위치","meshName":"메시의 이름","meshId":"메시의 식별자","serverId":"서버의 식별자","setup":"설정하다","update":"개조하다","install":"설치","uninstall":"설치 제거","connect":"연결","disconnect":"연결 해제","cancel":"취소","pressok":"연결을 끊으려면 \\"OK\\"를 누르십시오","elevation":"관리자 권한은 에이전트 제거 / 설치하는 데 필요","sudo":"\\"sudo\\"로 다시 시도하십시오","ctrlc":"종료하려면 \\"Ctrl-C\\"를 누르십시오.","commands":"다음 명령을 사용하여 콘솔에서 텍스트 버전을 실행할 수 있습니다","zenity":"\\"Zenity\\"를 설치 또는 업데이트하고 다시 시도하십시오","status":["없다","운영","중지됨"],"statusDescription":"에이전트 상태","description":"메시 에이전트를 설치 또는 제거하려면 아래 버튼을 클릭하십시오. 이 프로그램은 설치하면 백그라운드에서 실행되므로 원격 관리자가이 컴퓨터를 관리하고 제어 할 수 있습니다.","graphicalerror":"이 설치 프로그램의 그래픽 버전은이 시스템에서 실행할 수 없습니다."},"nl":{"agent":"Agent","agentVersion":"Nieuwe agent versie","group":"Apparaat groep","url":"Server URL","meshName":"Mesh naam","meshId":"Mesh identificatie","serverId":"Server identificatie","setup":"Setup","update":"Bijwerken","install":"Installeren","uninstall":"Deïnstallatie","connect":"Verbinden","disconnect":"Verbreken","cancel":"Annuleren","pressok":"Druk op OK om de verbinding te verbreken","elevation":"Verhoogde machtigingen zijn vereist om de agent te installeren / verwijderen.","sudo":"Probeer het opnieuw met sudo.","ctrlc":"Druk op Ctrl-C om af te sluiten.","commands":"U kunt de tekstversie vanaf de opdrachtregel uitvoeren met de volgende opdracht(en)","zenity":"Probeer Zenity te installeren / bij te werken en voer het opnieuw uit","status":["NIET GEÏNSTALLEERD","ACTIEF","NIET ACTIEF"],"statusDescription":"Huidige agent status","description":"Klik op de onderstaande knoppen om de mesh-agent te installeren of te verwijderen. Na installatie wordt deze software op de achtergrond uitgevoerd, zodat deze computer kan worden beheerd en bestuurd door een externe beheerder.","graphicalerror":"De grafische versie van dit installatieprogramma kan niet op dit systeem worden uitgevoerd"},"pt":{"agent":"Agente","group":"Grupo de dispositivos","install":"Instalar","uninstall":"Desinstalar","connect":"Conectar","disconnect":"Desconectar","cancel":"Cancelar","agentVersion":"Nova versão do agente","url":"URL do servidor","meshName":"Nome da malha","meshId":"Identificador de malha","serverId":"Identificador de Servidor","setup":"Configuração","update":"Atualizar","pressok":"Pressione OK para desconectar","elevation":"Permissões elevadas são necessárias para instalar / desinstalar o agente.","sudo":"Por favor, tente novamente com sudo.","ctrlc":"Pressione Ctrl-C para sair.","commands":"Você pode executar a versão em texto a partir da linha de comando com o (s) seguinte (s) comando (s)","graphicalerror":"A versão gráfica deste instalador não pode ser executada neste sistema","zenity":"Tente instalar / atualizar o Zenity e execute novamente","status":["NÃO INSTALADO","CORRIDA","NÃO CORRENDO"],"statusDescription":"Status atual do agente","description":"Clique nos botões abaixo para instalar ou desinstalar o agente mesh. Quando instalado, este software é executado em segundo plano, permitindo que o computador seja gerenciado e controlado por um administrador remoto."},"ru":{"agent":"Агент","group":"Группа устройства","install":"Установка","uninstall":"Удаление","connect":"Подключиться","disconnect":"Разъединить","cancel":"Отмена","agentVersion":"Новая версия агента","url":"URL-адрес сервера","meshName":"Имя сетки","meshId":"Идентификатор сетки","serverId":"Идентификатор сервера","setup":"Настроить","update":"Обновить","pressok":"Нажмите ОК для отключения","elevation":"Для установки / удаления агента требуются повышенные разрешения.","sudo":"Пожалуйста, попробуйте еще раз с помощью sudo.","ctrlc":"Нажмите Ctrl-C для выхода.","commands":"Вы можете запустить текстовую версию из командной строки с помощью следующих команд","graphicalerror":"Графическая версия этого установщика не может работать в этой системе.","zenity":"Попробуйте установить / обновить Zenity и снова запустить","status":["НЕ УСТАНОВЛЕНО","БЕГ","НЕ БЕГАТЬ"],"statusDescription":"Текущий статус агента","description":"Нажмите кнопки ниже, чтобы установить или удалить агент сетки. После установки это программное обеспечение работает в фоновом режиме, позволяя управлять этим компьютером удаленным администратором."},"tr":{"agent":"Ajan","group":"Cihaz Grubu","install":"Yüklemek","uninstall":"Kaldır","connect":"Bağlan","disconnect":"Bağlantıyı kes","cancel":"İptal etmek","agentVersion":"Yeni Temsilci Sürümü","url":"Sunucu URL\'si","meshName":"Mesh Adı","meshId":"Mesh Tanımlayıcı","serverId":"Sunucu Tanımlayıcı","setup":"Kurmak","update":"Güncelleme","pressok":"Bağlantıyı kesmek için Tamam\'a basın","elevation":"Aracıyı yüklemek / kaldırmak için yükseltilmiş izinler gereklidir.","sudo":"Lütfen sudo ile tekrar deneyin.","ctrlc":"Çıkmak için Ctrl-C tuşlarına basın.","commands":"Metin sürümünü aşağıdaki komutlarla komut satırından çalıştırabilirsiniz.","graphicalerror":"Bu yükleyicinin grafik versiyonu bu sistemde çalışamaz","zenity":"Zenity\'yi kurmayı / güncellemeyi deneyin ve tekrar çalıştırın","status":["YÜKLÜ DEĞİL","KOŞU","KOŞMAK YOK"],"statusDescription":"Mevcut Temsilci Durumu","description":"Mesh aracısını yüklemek veya kaldırmak için aşağıdaki düğmelere tıklayın. Bu yazılım yüklendiğinde arka planda çalışarak bu bilgisayarın bir uzak yönetici tarafından yönetilmesine ve kontrol edilmesine olanak tanır."},"zh-hans":{"agent":"代理","group":"设备组","install":"安装","uninstall":"卸载","connect":"连接","disconnect":"断线","cancel":"取消","agentVersion":"新代理版本","url":"服务器网址","meshName":"网格名称","meshId":"网格标识符","serverId":"服务器标识符","setup":"设定","update":"更新资料","pressok":"按确定断开连接","elevation":"安装/卸载代理需要提升的权限。","sudo":"请使用sudo再试一次。","ctrlc":"按Ctrl-C退出。","commands":"您可以使用以下命令从命令行运行文本版本","graphicalerror":"此安装程序Canot的图形版本在此系统上运行","zenity":"尝试安装/更新Zenity,然后再次运行","status":["未安装","正在运行","不在运行"],"statusDescription":"当前代理状态","description":"单击下面的按钮以安装或卸载网状代理。安装后,该软件将在后台运行,从而允许该计算机由远程管理员进行管理和控制。"},"zh-hant":{"agent":"代理","group":"裝置群","install":"安裝","uninstall":"卸載","connect":"連接","disconnect":"斷線","cancel":"取消","agentVersion":"新代理版本","url":"服務器網址","meshName":"網格名稱","meshId":"網格標識符","serverId":"服務器標識符","setup":"設定","update":"更新資料","pressok":"按確定斷開連接","elevation":"安裝/卸載代理需要提升的權限。","sudo":"請使用sudo再試一次。","ctrlc":"按Ctrl-C退出。","commands":"您可以使用以下命令從命令行運行文本版本","graphicalerror":"此安裝程序Canot的圖形版本在此系統上運行","zenity":"嘗試安裝/更新Zenity,然後再次運行","status":["未安裝","正在運行","不在運行"],"statusDescription":"當前代理狀態","description":"單擊下面的按鈕以安裝或卸載網狀代理。安裝後,該軟件將在後台運行,從而允許該計算機由遠程管理員進行管理和控制。"}}', - webpush: - { WebPushError: [Object], - supportedContentEncodings: [Object], - encrypt: [Function], - getVapidHeaders: [Function: getVapidHeaders], - generateVAPIDKeys: [Function: generateVAPIDKeys], - setGCMAPIKey: [Function], - setVapidDetails: [Function], - generateRequestDetails: [Function], - sendNotification: [Function], - vapidPublicKey: 'BMWzSl5zZPWw_lAKVvQb8NZBQwCs83jQJc68cj04yQTYt_kAIvuCMte0wU7BXjODXuGn8ut5qwU0pR_44dZuAmQ' }, - firebase: - { messageId: 0, - stats: [Object], - log: [Function], - pushOnly: true, - sendToDevice: [Function], - sendToDeviceEx: [Function] }, - watchdogtime: 1620165643484, - watchdogmax: 20, - watchdogmaxtime: '5/4/2021, 2:58:17 PM', - watchdogtable: [], - watchdog: - Timeout { - _called: true, - _idleTimeout: 100, - _idlePrev: [Object], - _idleNext: [Object], - _idleStart: 151682, - _onTimeout: [Function: wrapper], - _repeat: [Function] }, - amtPasswords: - { '5663e44c-3388-11b2-a85c-9d59689fcf2b': [Object], - '7458d5e8-b1fe-11ea-9f26-f2232d32e500': [Object], - '8cbb2767-1feb-4808-9b52-27c909f18383': [Object], - '939b524b-13d4-1d18-e487-1c697a6b7a2b': [Object], - '9f0d1680-914a-11e4-981a-b8aeed79c392': [Object], - 'a8122cc0-82ac-4401-8e4b-8c0f6f72c505': [Object], - 'd2ffc23e-9dd1-412d-860a-54b2039b72ff': [Object], - 'e2c38100-34d4-11e1-a733-eca86bf985db': [Object] } }, - amtDevices: - { 'node//2CVYFrHQmq6q9a6Lyh0I62q0z4RxX@84zd5WV6YE2KeUaLGtB3lhF@ODKkeIne0h': [ [Object] ], - 'node//4QBHyPR0ZkKMnnKZaac7N24IDutPXdc1Sh3$2AM5vebsxjuLbsr$TSdtYRJ6cs0p': [ [Object] ], - 'node//8VDrC2pSedqIgAUaMRDyZ1t1H320RvdE36C9mHdHjIB9ar4UvavoMILwfHg3tr$E': [ [Object] ], - 'node//oR6CRpgM0YRNQHs$WmBvpmgdZBAASGP8diZncJbF$y4jHrpd6BdWo2kDc3TDWsUd': [ [Object] ], - 'node//yGBxJcIzRoFQJ2SuKVqnbAA2GrdxI0KYWj$sCFENHNrfwK0bHtQy1YaGkP5YbFcm': [ [Object] ], - 'node//xNzeDZR4d$qeWCTybNudPWnFzX9e8eXlgvm2paRgi@m6WO21F@LE4aCSNqX4Px2m': [ [Object] ], - 'node//4pIUaMC$T7tfPcozYgtDF2$AkxGfS16TA6$K8an0saNkhpwS$OSw6iICT2IUcMVt': [ [Object] ], - 'node//U5ffW1D6GeKWjcg@gj5tp$oDgaC5f1HkyyK7ShfM8LyxRiPObcmiOVsOs8rbM7OQ': [ [Object] ] }, - activeLocalConnections: {}, - amtAdminAccounts: {}, - rootCertBase64: 'MIIEQzCCAqugAwIBAgIDAYBAMA0GCSqGSIb3DQEBDAUAMEUxHzAdBgNVBAMTFk1lc2hDZW50cmFsUm9vdC0wNzEyMzMxEDAOBgNVBAoTB3Vua25vd24xEDAOBgNVBAYTB3Vua25vd24wHhcNMTcwNDEwMjEwMzQxWhcNNDgwNDEwMjEwMzQxWjBFMR8wHQYDVQQDExZNZXNoQ2VudHJhbFJvb3QtMDcxMjMzMRAwDgYDVQQKEwd1bmtub3duMRAwDgYDVQQGEwd1bmtub3duMIIBojANBgkqhkiG9w0BAQEFAAOCAY8AMIIBigKCAYEAlqH3OQLpm//AGhLlozV/tbdcQFjAAYaEhdbiUkellS93zRETSOw90poDbiNThXEr3ecHf0v9muTY+vqee4do61lGPG68xoAEwDYGqLm30yKcln4Czqnbo+po+ZIeIDNhiQ7RGdc0ewXW7NzIvygvS0YimjH+WdqO78S7Cy/BFDdcP4w814oQB3fYdK/jFWgD4UI8oorYSqLYjj+tmgEw01ESI+Hpq4vmUwjQCptZMaPTWnBhspi99Ffuh2YErTGeLXZ7MmFle7L5TM8jk3Bt3BCa4WFiPRPstQUJaYasKJEKq2kihRRdxjpZ41qMJKnfYg4fhmvXZX/n3NHZLISmp9M2V5+Xf2huv+dyq9S71rCU+hI4CbX+pXWk4OVlBdwJC9z/j7Mo3FvHBNxovA7oACn2Hi5k1ZKhTjUvnErHUr6LP7i+Do2ts1LWhOvhrTTVl0nJw5J4NECladZeOk26KushqXdT1rSR5Z2oHnWu1XKKFB2Exh5eJsyMdNpTwFMpAgMBAAGjPDA6MAwGA1UdEwQFMAMBAf8wHQYDVR0OBBYEFAcSM9wBe0lvvnQdZzAenzBxgOBiMAsGA1UdDwQEAwICBDANBgkqhkiG9w0BAQwFAAOCAYEAU2md5E8tsf9MdJVBSockZzdf2E1k314c6RZVpEiHjdZeP7Wj8iznOWXHGR86MSA87qrmvbbM/Zw9KVdbjKZf6gwI3Rf8UkWTJEvi3eisJMb/6AtN3gTrO63nLrn3fJdXuBd7cEukCVRQtUSpi/EoxnrD3G9wuS5vCEL3iDU2BlARHunwXPjsY8sDpZaSlCC4n6efLBRxgN2ScCwEMxXtnMNy/sP6kGL8nYZsH3AmbyMzOVxO81bJgfruLh2jZZompYOtPl3aLcd5oLSUpAGcugly5/x5QRQrnsIk9U2cjFNkxxOoTi2xNoo/2fxKQZQ1Q8sNrynkYL+i/qz7/jsSYoxVFWhNy2V5QAov3t+0QNm6V3BucdCzxe7ib3GWbth36Oi7Q7qQWYUsqju2kNU5uT2/QUfeAGjYy7l39Xdy8lgxdnm24kTglN5K3SAfLqGCXwo+j890NNvZ9Txz1XJNc0Uwh59XVdNiZU1QXn9PuWzTfxecKfqVm4mA7C/p0yzS', - rootCertCN: 'MeshCentralRoot-071233', - startAmtManagement: [Function], - stopAmtManagement: [Function], - getStatusString: [Function], - mpsControlMessage: [Function], - HandleEvent: [Function], - amtcert_createCertificate: [Function] } -ERR: {"name":"node-rdpjs","hostname":"Central","pid":11336,"level":40,"msg":"NODE_RDP_PROTOCOL_X224_NEG_FAILURE(Failure code:5 (see https://msdn.microsoft.com/en-us/library/cc240507.aspx))\nError: Failure code:5 (see https://msdn.microsoft.com/en-us/library/cc240507.aspx)\n at new ProtocolError (C:\\Users\\Default.DESKTOP-9CGK2DI\\Desktop\\AmtWebApp\\meshcentral\\node_modules\\node-rdpjs-2\\lib\\core\\error.js:40:8)\n at Client.recvConnectionConfirm (C:\\Users\\Default.DESKTOP-9CGK2DI\\Desktop\\AmtWebApp\\meshcentral\\node_modules\\node-rdpjs-2\\lib\\protocol\\x224.js:221:9)\n at TPKT. (C:\\Users\\Default.DESKTOP-9CGK2DI\\Desktop\\AmtWebApp\\meshcentral\\node_modules\\node-rdpjs-2\\lib\\protocol\\x224.js:202:8)\n at TPKT.g (events.js:286:16)\n at emitOne (events.js:96:13)\n at TPKT.emit (events.js:188:7)\n at TPKT.recvData (C:\\Users\\Default.DESKTOP-9CGK2DI\\Desktop\\AmtWebApp\\meshcentral\\node_modules\\node-rdpjs-2\\lib\\protocol\\tpkt.js:110:7)\n at BufferLayer. (C:\\Users\\Default.DESKTOP-9CGK2DI\\Desktop\\AmtWebApp\\meshcentral\\node_modules\\node-rdpjs-2\\lib\\protocol\\tpkt.js:101:8)\n at BufferLayer.g (events.js:286:16)\n at emitOne (events.js:96:13)","time":"2021-05-04T22:04:04.120Z","v":0} -ERR: {"name":"node-rdpjs","hostname":"Central","pid":11336,"level":40,"msg":"NODE_RDP_PROTOCOL_X224_NEG_FAILURE(Failure code:5 (see https://msdn.microsoft.com/en-us/library/cc240507.aspx))\nError: Failure code:5 (see https://msdn.microsoft.com/en-us/library/cc240507.aspx)\n at new ProtocolError (C:\\Users\\Default.DESKTOP-9CGK2DI\\Desktop\\AmtWebApp\\meshcentral\\node_modules\\node-rdpjs-2\\lib\\core\\error.js:40:8)\n at Client.recvConnectionConfirm (C:\\Users\\Default.DESKTOP-9CGK2DI\\Desktop\\AmtWebApp\\meshcentral\\node_modules\\node-rdpjs-2\\lib\\protocol\\x224.js:221:9)\n at TPKT. (C:\\Users\\Default.DESKTOP-9CGK2DI\\Desktop\\AmtWebApp\\meshcentral\\node_modules\\node-rdpjs-2\\lib\\protocol\\x224.js:202:8)\n at TPKT.g (events.js:286:16)\n at emitOne (events.js:96:13)\n at TPKT.emit (events.js:188:7)\n at TPKT.recvData (C:\\Users\\Default.DESKTOP-9CGK2DI\\Desktop\\AmtWebApp\\meshcentral\\node_modules\\node-rdpjs-2\\lib\\protocol\\tpkt.js:110:7)\n at BufferLayer. (C:\\Users\\Default.DESKTOP-9CGK2DI\\Desktop\\AmtWebApp\\meshcentral\\node_modules\\node-rdpjs-2\\lib\\protocol\\tpkt.js:101:8)\n at BufferLayer.g (events.js:286:16)\n at emitOne (events.js:96:13)","time":"2021-05-04T22:04:05.322Z","v":0} -Server Ctrl-C exit... -Server Ctrl-C exit...