diff --git a/meshconsole/main.c b/meshconsole/main.c index 4b472c4..720e1bb 100644 --- a/meshconsole/main.c +++ b/meshconsole/main.c @@ -138,6 +138,13 @@ char* crashMemory = ILib_POSIX_InstallCrashHandler(argv[0]); integratedJavaScript = ILibString_Copy(script, sizeof(script) - 1); integratedJavaScriptLen = (int)sizeof(script) - 1; } + if (argc > 1 && strcasecmp(argv[1], "-name") == 0 && integratedJavaScriptLen == 0) + { + char script[] = "console.log(require('_agentNodeId').serviceName());process.exit();"; + integratedJavaScript = ILibString_Copy(script, sizeof(script) - 1); + integratedJavaScriptLen = (int)sizeof(script) - 1; + } + if (argc > 1 && strcmp(argv[1], "-daemon") == 0 && integratedJavaScriptLen == 0) { integratedJavaScript = ILibString_Copy("require('daemon').agent();", 0); diff --git a/meshcore/agentcore.c b/meshcore/agentcore.c index 6dd056a..95172e7 100644 --- a/meshcore/agentcore.c +++ b/meshcore/agentcore.c @@ -1796,6 +1796,12 @@ void ILibDuktape_MeshAgent_PUSH(duk_context *ctx, void *chain) Duktape_CreateEnum(ctx, "ContainerPermissions", (char*[]) { "DEFAULT", "NO_AGENT", "NO_MARSHAL", "NO_PROCESS_SPAWNING", "NO_FILE_SYSTEM_ACCESS", "NO_NETWORK_ACCESS" }, (int[]) { 0x00, 0x10000000, 0x08000000, 0x04000000, 0x00000001, 0x00000002 }, 6); + if (agent->JSRunningAsService) + { + duk_push_string(ctx, agent->meshServiceName); + ILibDuktape_CreateReadonlyProperty(ctx, "serviceName"); + } + #ifdef WIN32 #ifdef _WINSERVICE duk_push_boolean(ctx, agent->runningAsConsole == 0); @@ -1893,8 +1899,16 @@ int agent_GenerateCertificates(MeshAgentHostContainer *agent, char* certfile) if (certfile == NULL) { #if defined(WIN32) - char *rootSubject = (agent->capabilities & MeshCommand_AuthInfo_CapabilitiesMask_RECOVERY) == MeshCommand_AuthInfo_CapabilitiesMask_RECOVERY ? "CN=MeshNodeDiagnosticCertificate" : "CN=MeshNodeCertificate"; - + char rootSubject[255]; + if (agent->noCertStore == 0 && agent->meshServiceName != NULL && strcmp(agent->meshServiceName, "Mesh Agent") == 0) + { + sprintf_s(rootSubject, sizeof(rootSubject), "CN=MeshNode%s", (agent->capabilities & MeshCommand_AuthInfo_CapabilitiesMask_RECOVERY) == MeshCommand_AuthInfo_CapabilitiesMask_RECOVERY ? "DiagnosticCertificate" : "Certificate"); + } + else + { + sprintf_s(rootSubject, sizeof(rootSubject), "CN=%s_Node%s", agent->meshServiceName, (agent->capabilities & MeshCommand_AuthInfo_CapabilitiesMask_RECOVERY) == MeshCommand_AuthInfo_CapabilitiesMask_RECOVERY ? "DiagnosticCertificate" : "Certificate"); + } + if (agent->noCertStore == 0 && (agent->certObject = wincrypto_open(TRUE, rootSubject)) != NULL) // Force certificate re-generation { int l; @@ -2003,7 +2017,15 @@ int agent_LoadCertificates(MeshAgentHostContainer *agent) if (len == 0 || util_from_p12(ILibScratchPad2, len, "hidden", &(agent->selfcert)) == 0) { #if defined(WIN32) - char *rootSubject = (agent->capabilities & MeshCommand_AuthInfo_CapabilitiesMask_RECOVERY) == MeshCommand_AuthInfo_CapabilitiesMask_RECOVERY ? "CN=MeshNodeDiagnosticCertificate" : "CN=MeshNodeCertificate"; + char rootSubject[255]; + if (agent->noCertStore == 0 && agent->meshServiceName != NULL && strcmp(agent->meshServiceName, "Mesh Agent") == 0) + { + sprintf_s(rootSubject, sizeof(rootSubject), "CN=MeshNode%s", (agent->capabilities & MeshCommand_AuthInfo_CapabilitiesMask_RECOVERY) == MeshCommand_AuthInfo_CapabilitiesMask_RECOVERY ? "DiagnosticCertificate" : "Certificate"); + } + else + { + sprintf_s(rootSubject, sizeof(rootSubject), "CN=%s_Node%s", agent->meshServiceName, (agent->capabilities & MeshCommand_AuthInfo_CapabilitiesMask_RECOVERY) == MeshCommand_AuthInfo_CapabilitiesMask_RECOVERY ? "DiagnosticCertificate" : "Certificate"); + } // No cert in this .db file. Try to load or generate a root certificate from a Windows crypto provider. This can be TPM backed which is great. // However, if we don't have the second cert created, we need to regen the root... @@ -3687,6 +3709,7 @@ void MeshServer_Connect(MeshAgentHostContainer *agent) agent->controlChannelDebug = ILibSimpleDataStore_Get(agent->masterDb, "controlChannelDebug", NULL, 0); ILibDuktape_HECI_Debug = (ILibSimpleDataStore_Get(agent->masterDb, "heciDebug", NULL, 0) != 0); + #if defined(_LINKVM) && defined(_POSIX) && !defined(__APPLE__) SLAVELOG = ILibSimpleDataStore_Get(agent->masterDb, "slaveKvmLog", NULL, 0); #endif @@ -3733,11 +3756,14 @@ int ValidateMeshServer(ILibWebClient_RequestToken sender, int preverify_ok, STAC } #endif - -void checkForEmbeddedMSH(MeshAgentHostContainer *agent) +#define checkForEmbeddedMSH(agent) checkForEmbeddedMSH_ex(agent, NULL) +void checkForEmbeddedMSH_ex(MeshAgentHostContainer *agent, char **eMSH) { FILE *tmpFile = NULL; int mshLen; + char *data = NULL; + + if (eMSH != NULL) { *eMSH = NULL; } #ifdef WIN32 _wfopen_s(&tmpFile, ILibUTF8ToWide(agent->exePath, -1), L"rb"); @@ -3756,26 +3782,39 @@ void checkForEmbeddedMSH(MeshAgentHostContainer *agent) { mshLen = ntohl(mshLen); fseek(tmpFile, -4 - mshLen, SEEK_CUR); - char *eMSH = ILibMemory_AllocateA(mshLen); - if (fread(eMSH, 1, mshLen, tmpFile) == mshLen) + + data = (char*)ILibMemory_SmartAllocate(mshLen); + if (eMSH != NULL) { *eMSH = data; } + if (fread(data, 1, mshLen, tmpFile) == mshLen) { - FILE *msh = NULL; -#ifdef WIN32 - _wfopen_s(&msh, ILibUTF8ToWide(MeshAgent_MakeAbsolutePath(agent->exePath, ".msh"), -1), L"wb"); -#else - msh = fopen(MeshAgent_MakeAbsolutePath(agent->exePath, ".msh"), "wb"); -#endif - if (msh != NULL) + if (eMSH == NULL) { - ignore_result(fwrite(eMSH, 1, mshLen, msh)); - fclose(msh); + FILE *msh = NULL; +#ifdef WIN32 + _wfopen_s(&msh, ILibUTF8ToWide(MeshAgent_MakeAbsolutePath(agent->exePath, ".msh"), -1), L"wb"); +#else + msh = fopen(MeshAgent_MakeAbsolutePath(agent->exePath, ".msh"), "wb"); +#endif + if (msh != NULL) + { + ignore_result(fwrite(data, 1, mshLen, msh)); + fclose(msh); + } + ILibMemory_Free(data); } } - } } fclose(tmpFile); } +void checkForEmbeddedMSH_ex2(char *binPath, char **eMSH) +{ + MeshAgentHostContainer tmp; + memset(&tmp, 0, sizeof(tmp)); + tmp.exePath = binPath; + checkForEmbeddedMSH_ex(&tmp, eMSH); +} + int importSettings(MeshAgentHostContainer *agent, char* fileName) { int eq; @@ -4348,16 +4387,35 @@ int MeshAgent_AgentMode(MeshAgentHostContainer *agentHost, int paramLen, char ** #if !defined(MICROSTACK_NOTLS) || defined(_POSIX) duk_context *tmpCtx = ILibDuktape_ScriptContainer_InitializeJavaScriptEngineEx(0, 0, agentHost->chain, NULL, NULL, agentHost->exePath, NULL, NULL, NULL); duk_peval_string_noresult(tmpCtx, "require('linux-pathfix')();"); + int msnlen; + char *tmpString; agentHost->platformType = MeshAgent_Posix_PlatformTypes_UNKNOWN; agentHost->JSRunningAsService = 0; agentHost->JSRunningWithAdmin = 0; + if ((msnlen = ILibSimpleDataStore_Get(agentHost->masterDb, "meshServiceName", NULL, 0)) != 0) + { + agentHost->meshServiceName = (char*)ILibMemory_SmartAllocate(msnlen+1); + ILibSimpleDataStore_Get(agentHost->masterDb, "meshServiceName", agentHost->meshServiceName, msnlen); + } + else + { +#ifdef WIN32 + agentHost->meshServiceName = "Mesh Agent"; +#else + agentHost->meshServiceName = "meshagent"; +#endif + } + + duk_push_sprintf(tmpCtx, "require('service-manager').manager.getService('%s').isMe();", agentHost->meshServiceName); + tmpString = (char*)duk_get_string(tmpCtx, -1); + if (duk_peval_string(tmpCtx, "(function foo() { var f = require('service-manager').manager.getServiceType(); switch(f){case 'procd': return(7); case 'windows': return(10); case 'launchd': return(3); case 'freebsd': return(5); case 'systemd': return(1); case 'init': return(2); case 'upstart': return(4); default: return(0);}})()") == 0) { agentHost->platformType = (MeshAgent_Posix_PlatformTypes)duk_get_int(tmpCtx, -1); } - if (duk_peval_string(tmpCtx, "require('service-manager').manager.getService(process.platform=='win32'?'Mesh Agent':'meshagent').isMe();") == 0) + if (duk_peval_string(tmpCtx, tmpString) == 0) { agentHost->JSRunningAsService = duk_get_boolean(tmpCtx, -1); } @@ -4484,88 +4542,104 @@ int MeshAgent_AgentMode(MeshAgentHostContainer *agentHost, int paramLen, char ** #ifdef WIN32 // If running as a Windows service, set basic values to the registry, this allows other applications to know what the mesh agent is doing. HKEY hKey; + size_t rlen = snprintf(NULL, 0, "Software\\Open Source\\%s", agentHost->meshServiceName); + char *tmp1 = (char*)ILibMemory_SmartAllocate(rlen + 1); + snprintf(tmp1, ILibMemory_Size(tmp1), "Software\\Open Source\\%s", agentHost->meshServiceName); + size_t wlen = ILibUTF8ToWideCount(tmp1) + 1; + WCHAR* wstr = (WCHAR*)ILibMemory_SmartAllocate(wlen * sizeof(WCHAR)); + + if (wlen < INT32_MAX && rlen <= INT32_MAX) + { + ILibUTF8ToWideEx(tmp1, (int)rlen, wstr, (int)wlen + 1); #if defined(_WINSERVICE) - // If running as a Windows Service, save the key in LOCAL_MACHINE - if (RegCreateKey(agentHost->runningAsConsole == 0 ? HKEY_LOCAL_MACHINE : HKEY_CURRENT_USER, TEXT("Software\\Open Source\\MeshAgent2"), &hKey) == ERROR_SUCCESS) + // If running as a Windows Service, save the key in LOCAL_MACHINE + if (RegCreateKeyW(agentHost->runningAsConsole == 0 ? HKEY_LOCAL_MACHINE : HKEY_CURRENT_USER, wstr, &hKey) == ERROR_SUCCESS) #else - // If running in Console mode, save the key in CURRENT_USER - if (RegCreateKey(HKEY_CURRENT_USER, TEXT("Software\\Open Source\\MeshAgent2"), &hKey) == ERROR_SUCCESS) + // If running in Console mode, save the key in CURRENT_USER + if (RegCreateKeyW(HKEY_CURRENT_USER, wstr, &hKey) == ERROR_SUCCESS) #endif - { - int i, len; - char* tmp = NULL; - - - - if ((agentHost->capabilities & MeshCommand_AuthInfo_CapabilitiesMask_RECOVERY) == 0) { - // Save the NodeId - len = ILibBase64Encode(agentHost->g_selfid, UTIL_SHA384_HASHSIZE, &tmp); - if ((len > 0) && (tmp != NULL)) + int i, len; + char* tmp = NULL; + + if ((agentHost->capabilities & MeshCommand_AuthInfo_CapabilitiesMask_RECOVERY) == 0) { - for (i = 0; i < len; i++) { if (tmp[i] == '+') { tmp[i] = '@'; } else if (tmp[i] == '/') { tmp[i] = '$'; } } // Replace + --> @ and / --> $ - RegSetValueExA(hKey, "NodeId", 0, REG_SZ, tmp, len); - free(tmp); - tmp = NULL; - } - else { RegDeleteKeyA(hKey, "NodeId"); } - + // Save the NodeId + len = ILibBase64Encode(agentHost->g_selfid, UTIL_SHA384_HASHSIZE, &tmp); + if ((len > 0) && (tmp != NULL)) + { + for (i = 0; i < len; i++) { if (tmp[i] == '+') { tmp[i] = '@'; } else if (tmp[i] == '/') { tmp[i] = '$'; } } // Replace + --> @ and / --> $ + RegSetValueExA(hKey, "NodeId", 0, REG_SZ, tmp, len); + free(tmp); + tmp = NULL; + } + else { RegDeleteKeyA(hKey, "NodeId"); } - // Save the AgentHash - util_tohex(agentHost->agentHash, UTIL_SHA384_HASHSIZE, ILibScratchPad); - RegSetValueExA(hKey, "AgentHash", 0, REG_SZ, ILibScratchPad, (int)strlen(ILibScratchPad)); - // Save the MeshId - if (ILibSimpleDataStore_Get(agentHost->masterDb, "MeshID", NULL, 0) == 0) { RegDeleteKeyA(hKey, "MeshId"); } else { - len = ILibSimpleDataStore_Get(agentHost->masterDb, "MeshID", ILibScratchPad2, (int)sizeof(ILibScratchPad2)); - if (len > 0) { - len = ILibBase64Encode(ILibScratchPad2, len, &tmp); - if ((len > 0) && (tmp != NULL)) { - for (i = 0; i < len; i++) { if (tmp[i] == '+') { tmp[i] = '@'; } else if (tmp[i] == '/') { tmp[i] = '$'; } } // Replace + --> @ and / --> $ - RegSetValueExA(hKey, "MeshId", 0, REG_SZ, tmp, len); - free(tmp); - tmp = NULL; + // Save the AgentHash + util_tohex(agentHost->agentHash, UTIL_SHA384_HASHSIZE, ILibScratchPad); + RegSetValueExA(hKey, "AgentHash", 0, REG_SZ, ILibScratchPad, (int)strlen(ILibScratchPad)); + + // Save the MeshId + if (ILibSimpleDataStore_Get(agentHost->masterDb, "MeshID", NULL, 0) == 0) { RegDeleteKeyA(hKey, "MeshId"); } + else { + len = ILibSimpleDataStore_Get(agentHost->masterDb, "MeshID", ILibScratchPad2, (int)sizeof(ILibScratchPad2)); + if (len > 0) { + len = ILibBase64Encode(ILibScratchPad2, len, &tmp); + if ((len > 0) && (tmp != NULL)) { + for (i = 0; i < len; i++) { if (tmp[i] == '+') { tmp[i] = '@'; } else if (tmp[i] == '/') { tmp[i] = '$'; } } // Replace + --> @ and / --> $ + RegSetValueExA(hKey, "MeshId", 0, REG_SZ, tmp, len); + free(tmp); + tmp = NULL; + } + else { RegDeleteKeyA(hKey, "MeshId"); } } else { RegDeleteKeyA(hKey, "MeshId"); } } - else { RegDeleteKeyA(hKey, "MeshId"); } - } - // Save a bunch of values in the registry - if ((pLen = ILibSimpleDataStore_Get(agentHost->masterDb, "MeshServer", ILibScratchPad2, (int)sizeof(ILibScratchPad2))) == 0) { RegDeleteKeyA(hKey, "MeshServerUrl"); } else { RegSetValueExA(hKey, "MeshServerUrl", 0, REG_SZ, (BYTE*)ILibScratchPad2, (int)strlen(ILibScratchPad2)); } // Save the mesh server URL - if ((pLen = ILibSimpleDataStore_Get(agentHost->masterDb, "ServerID", ILibScratchPad2, (int)sizeof(ILibScratchPad2))) == 0) { RegDeleteKeyA(hKey, "MeshServerId"); } else { RegSetValueExA(hKey, "MeshServerId", 0, REG_SZ, (BYTE*)ILibScratchPad2, (int)strlen(ILibScratchPad2)); } // Save the mesh server id - if ((pLen = ILibSimpleDataStore_Get(agentHost->masterDb, "WebProxy", ILibScratchPad2, (int)sizeof(ILibScratchPad2))) == 0) { RegDeleteKeyA(hKey, "Proxy"); } else { RegSetValueExA(hKey, "Proxy", 0, REG_SZ, (BYTE*)ILibScratchPad2, (int)strlen(ILibScratchPad2)); } // Save the proxy - if ((pLen = ILibSimpleDataStore_Get(agentHost->masterDb, "Tag", ILibScratchPad2, (int)sizeof(ILibScratchPad2))) == 0) { RegDeleteKeyA(hKey, "Tag"); } else { RegSetValueExA(hKey, "Tag", 0, REG_SZ, (BYTE*)ILibScratchPad2, (int)strlen(ILibScratchPad2)); } // Save the tag - } - else - { - // We're a Diagnostic Agent, so we only save a subset - // Save the NodeId - len = ILibBase64Encode(agentHost->g_selfid, UTIL_SHA384_HASHSIZE, &tmp); - if ((len > 0) && (tmp != NULL)) + // Save a bunch of values in the registry + if ((pLen = ILibSimpleDataStore_Get(agentHost->masterDb, "MeshServer", ILibScratchPad2, (int)sizeof(ILibScratchPad2))) == 0) { RegDeleteKeyA(hKey, "MeshServerUrl"); } + else { RegSetValueExA(hKey, "MeshServerUrl", 0, REG_SZ, (BYTE*)ILibScratchPad2, (int)strlen(ILibScratchPad2)); } // Save the mesh server URL + if ((pLen = ILibSimpleDataStore_Get(agentHost->masterDb, "ServerID", ILibScratchPad2, (int)sizeof(ILibScratchPad2))) == 0) { RegDeleteKeyA(hKey, "MeshServerId"); } + else { RegSetValueExA(hKey, "MeshServerId", 0, REG_SZ, (BYTE*)ILibScratchPad2, (int)strlen(ILibScratchPad2)); } // Save the mesh server id + if ((pLen = ILibSimpleDataStore_Get(agentHost->masterDb, "WebProxy", ILibScratchPad2, (int)sizeof(ILibScratchPad2))) == 0) { RegDeleteKeyA(hKey, "Proxy"); } + else { RegSetValueExA(hKey, "Proxy", 0, REG_SZ, (BYTE*)ILibScratchPad2, (int)strlen(ILibScratchPad2)); } // Save the proxy + if ((pLen = ILibSimpleDataStore_Get(agentHost->masterDb, "Tag", ILibScratchPad2, (int)sizeof(ILibScratchPad2))) == 0) { RegDeleteKeyA(hKey, "Tag"); } + else { RegSetValueExA(hKey, "Tag", 0, REG_SZ, (BYTE*)ILibScratchPad2, (int)strlen(ILibScratchPad2)); } // Save the tag + } + else { - for (i = 0; i < len; i++) { if (tmp[i] == '+') { tmp[i] = '@'; } else if (tmp[i] == '/') { tmp[i] = '$'; } } // Replace + --> @ and / --> $ - RegSetValueExA(hKey, "DiagnosticAgentNodeId", 0, REG_SZ, tmp, len); - free(tmp); - tmp = NULL; + // We're a Diagnostic Agent, so we only save a subset + // Save the NodeId + len = ILibBase64Encode(agentHost->g_selfid, UTIL_SHA384_HASHSIZE, &tmp); + if ((len > 0) && (tmp != NULL)) + { + for (i = 0; i < len; i++) { if (tmp[i] == '+') { tmp[i] = '@'; } else if (tmp[i] == '/') { tmp[i] = '$'; } } // Replace + --> @ and / --> $ + RegSetValueExA(hKey, "DiagnosticAgentNodeId", 0, REG_SZ, tmp, len); + free(tmp); + tmp = NULL; + } + else { RegDeleteKeyA(hKey, "DiagnosticAgentNodeId"); } } - else { RegDeleteKeyA(hKey, "DiagnosticAgentNodeId"); } - } - if (ILibSimpleDataStore_Get(agentHost->masterDb, "SelfNodeCert", NULL, 0) == 0) - { - int NodeIDLen = 0; - if ((NodeIDLen = ILibSimpleDataStore_Get(agentHost->masterDb, "NodeID", ILibScratchPad, (int)sizeof(ILibScratchPad))) == 0 || !(NodeIDLen == (int)sizeof(agentHost->g_selfid) && memcmp(agentHost->g_selfid, ILibScratchPad, NodeIDLen) == 0)) + if (ILibSimpleDataStore_Get(agentHost->masterDb, "SelfNodeCert", NULL, 0) == 0) { - // NodeID isn't saved to db, so let's put it there - ILibSimpleDataStore_PutEx(agentHost->masterDb, "NodeID", 6, agentHost->g_selfid, (int)sizeof(agentHost->g_selfid)); + int NodeIDLen = 0; + if ((NodeIDLen = ILibSimpleDataStore_Get(agentHost->masterDb, "NodeID", ILibScratchPad, (int)sizeof(ILibScratchPad))) == 0 || !(NodeIDLen == (int)sizeof(agentHost->g_selfid) && memcmp(agentHost->g_selfid, ILibScratchPad, NodeIDLen) == 0)) + { + // NodeID isn't saved to db, so let's put it there + ILibSimpleDataStore_PutEx(agentHost->masterDb, "NodeID", 6, agentHost->g_selfid, (int)sizeof(agentHost->g_selfid)); + } } - } - // Close the registry key - RegCloseKey(hKey); + // Close the registry key + RegCloseKey(hKey); + } } + + ILibMemory_Free(tmp1); + ILibMemory_Free(wstr); #endif #ifndef MICROSTACK_NOTLS @@ -5123,6 +5197,7 @@ void MeshAgent_ScriptMode(MeshAgentHostContainer *agentHost, int argc, char **ar agentHost->meshCoreCtx = ILibDuktape_ScriptContainer_InitializeJavaScriptEngineEx(secFlags, execTimeout, agentHost->chain, scriptArgs, connectAgent != 0 ? agentHost->masterDb : NULL, agentHost->exePath, agentHost->pipeManager, connectAgent == 0 ? MeshAgent_RunScriptOnly_Finalizer : NULL, agentHost); ILibDuktape_SetNativeUncaughtExceptionHandler(agentHost->meshCoreCtx, MeshAgent_ScriptMode_UncaughtExceptionSink, agentHost); + if (connectAgent != 0) { ILibDuktape_MeshAgent_Init(agentHost->meshCoreCtx, agentHost->chain, agentHost); @@ -5267,6 +5342,7 @@ int MeshAgent_System(char *cmd) int MeshAgent_Start(MeshAgentHostContainer *agentHost, int paramLen, char **param) { + char *startParms = NULL; char _exedata[ILibMemory_Init_Size(1024, sizeof(void*))]; char *exePath = ILibMemory_Init(_exedata, 1024, sizeof(void*), ILibMemory_Types_STACK); ((void**)ILibMemory_Extra(exePath))[0] = agentHost; @@ -5375,7 +5451,40 @@ int MeshAgent_Start(MeshAgentHostContainer *agentHost, int paramLen, char **para agentHost->chain = NULL; // Mesh agent has exited, set the chain to NULL // Close the database - if (agentHost->masterDb != NULL) { + if (agentHost->masterDb != NULL) + { + if (agentHost->performSelfUpdate != 0) + { + if (agentHost->JSRunningAsService == 0) + { + int jsonlen = ILibSimpleDataStore_Cached_GetJSONEx(agentHost->masterDb, NULL, 0); + if (jsonlen > 0) + { + startParms = (char*)ILibMemory_SmartAllocateEx(jsonlen, ILibBase64EncodeLength(jsonlen)); + unsigned char* tmp = (unsigned char*)ILibMemory_Extra(startParms); + ILibSimpleDataStore_Cached_GetJSONEx(agentHost->masterDb, startParms, jsonlen); + ILibBase64Encode((unsigned char*)startParms, jsonlen, &tmp); + if (agentHost->logUpdate != 0) { ILIBLOGMESSAGEX(" Service Parameters => %s", startParms); } + } + else + { + if (agentHost->logUpdate != 0) { ILIBLOGMESSAGEX(" Service Parameters => NONE"); } + } + } + else + { +#ifdef WIN32 + if(strcmp(agentHost->meshServiceName, "Mesh Agent") !=0) +#else + if (strcmp(agentHost->meshServiceName, "Mesh Agent") != 0) +#endif + { + startParms = ILibMemory_SmartAllocateEx(ILibMemory_Size(agentHost->meshServiceName) + 30, ILibBase64EncodeLength(ILibMemory_Size(agentHost->meshServiceName) + 30)); + unsigned char* tmp = (unsigned char*)ILibMemory_Extra(startParms); + ILibBase64Encode((unsigned char*)startParms, sprintf_s(startParms, ILibMemory_Size(startParms), "[\"--meshServiceName=\\\"%s\\\"\"]", agentHost->meshServiceName), &tmp); + } + } + } ILibSimpleDataStore_Close(agentHost->masterDb); agentHost->masterDb = NULL; } @@ -5383,7 +5492,6 @@ int MeshAgent_Start(MeshAgentHostContainer *agentHost, int paramLen, char **para // Check if we need to perform self-update (performSelfUpdate should indicate startup type on Liunx: 1 = systemd, 2 = upstart, 3 = sysv-init) if (agentHost->performSelfUpdate != 0) { - int i, ptr = 0; #ifdef WIN32 STARTUPINFOW info = { sizeof(info) }; PROCESS_INFORMATION processInfo; @@ -5394,20 +5502,13 @@ int MeshAgent_Start(MeshAgentHostContainer *agentHost, int paramLen, char **para #else char* updateFilePath = MeshAgent_MakeAbsolutePath(agentHost->exePath, ".update"); // uses ILibScratchPad2 #endif - char str[4096]; - if (agentHost->logUpdate != 0) { ILIBLOGMESSSAGE("SelfUpdate -> Updating..."); } - - // Build the argument list - str[0] = 0; - for (i = 1; i < paramLen && ptr >= 0; i++) ptr += sprintf_s(str + ptr, 4096 - ptr, " %s", param[i]); - #ifdef WIN32 // Windows version - sprintf_s(ILibScratchPad, sizeof(ILibScratchPad), "%s -update:\"%s\"%s", updateFilePath, agentHost->exePath, str); + sprintf_s(ILibScratchPad, sizeof(ILibScratchPad), "%s -update:*%s %s", updateFilePath, agentHost->JSRunningAsService!=0?"S":"C", startParms==NULL?"":(char*)ILibMemory_Extra(startParms)); if (!CreateProcessW(NULL, ILibUTF8ToWide(ILibScratchPad, -1), NULL, NULL, TRUE, CREATE_NO_WINDOW, NULL, NULL, &info, &processInfo)) { - // We tried to execute a bad executable... not good. Lets try to recover. + // We triedI to execute a bad executable... not good. Lets try to recover. if (agentHost->logUpdate != 0) { ILIBLOGMESSSAGE("SelfUpdate -> FAILED..."); } if (updateFilePath != NULL && agentHost->exePath != NULL) { @@ -5489,13 +5590,14 @@ int MeshAgent_Start(MeshAgentHostContainer *agentHost, int paramLen, char **para struct stat results; stat(agentHost->exePath, &results); // This the mode of the current executable chmod(updateFilePath, results.st_mode); // Set the new executable to the same mode as the current one. - sprintf_s(ILibScratchPad, sizeof(ILibScratchPad), "\"%s\" -update:\"%s\"%s &", updateFilePath, agentHost->exePath, str); // Launch the new executable for update. + sprintf_s(ILibScratchPad, sizeof(ILibScratchPad), "\"%s\" -update:* %s &", updateFilePath, startParms == NULL ? "" : (char*)ILibMemory_Extra(startParms)); if (system(ILibScratchPad)) {} } #endif } } + if (startParms != NULL) { ILibMemory_Free(startParms); } #ifndef MICROSTACK_NOTLS util_openssl_uninit(); @@ -5516,6 +5618,7 @@ void MeshAgent_Destroy(MeshAgentHostContainer* agent) if (agent->chain != NULL) { ILibChain_DestroyEx(agent->chain); agent->chain = NULL; } if (agent->multicastDiscoveryKey != NULL) { free(agent->multicastDiscoveryKey); agent->multicastDiscoveryKey = NULL; } if (agent->multicastServerUrl != NULL) { free(agent->multicastServerUrl); agent->multicastServerUrl = NULL; } + if (agent->meshServiceName != NULL) { ILibMemory_Free(agent->meshServiceName); agent->meshServiceName = NULL; } #ifdef WIN32 if (agent->shCore != NULL) { diff --git a/meshcore/agentcore.h b/meshcore/agentcore.h index 636603c..7b63b63 100644 --- a/meshcore/agentcore.h +++ b/meshcore/agentcore.h @@ -237,6 +237,7 @@ typedef struct MeshAgentHostContainer MeshAgent_Posix_PlatformTypes platformType; int JSRunningAsService; int JSRunningWithAdmin; + char *meshServiceName; #if defined(_WINSERVICE) int runningAsConsole; #endif diff --git a/meshservice/ServiceMain.c b/meshservice/ServiceMain.c index 0b258a9..da52274 100644 --- a/meshservice/ServiceMain.c +++ b/meshservice/ServiceMain.c @@ -109,27 +109,6 @@ BOOL RunAsAdmin(char* args, int isAdmin) return FALSE; } -void UpdateOwnerData() -{ - WCHAR str[_MAX_PATH]; - DWORD strLen; - strLen = GetModuleFileNameW(NULL, str, _MAX_PATH); - - int exePathLen = WideCharToMultiByte(CP_UTF8, 0, (LPCWCH)str, -1, NULL, 0, NULL, NULL); - char *exePath = (char*)ILibMemory_SmartAllocate(exePathLen); - WideCharToMultiByte(CP_UTF8, 0, (LPCWCH)str, -1, exePath, exePathLen, NULL, NULL); - - void *chain = ILibCreateChain(); - duk_context *ctx = ILibDuktape_ScriptContainer_InitializeJavaScriptEngineEx(0, 0, chain, NULL, NULL, exePath, NULL, NULL, NULL); - - duk_peval_string_noresult(ctx, "global._noMessagePump=true;var key=require('win-registry').usernameToUserKey(require('user-sessions').getProcessOwnerName(process.pid).name);var reg=require('win-registry');reg.WriteKey(reg.HKEY.LocalMachine, 'SYSTEM\\\\CurrentControlSet\\\\Services\\\\Mesh Agent', '_InstalledBy', key);"); - - Duktape_SafeDestroyHeap(ctx); - ILibChain_DestroyEx(chain); - ILibMemory_Free(exePath); -} - - DWORD WINAPI ServiceControlHandler( DWORD controlCode, DWORD eventType, void *eventData, void* eventContext ) { switch (controlCode) @@ -566,6 +545,13 @@ int wmain(int argc, char* wargv[]) integratedJavaScript = ILibString_Copy(script, sizeof(script) - 1); integragedJavaScriptLen = (int)sizeof(script) - 1; } + if (argc > 1 && strcasecmp(argv[1], "-name") == 0) + { + char script[] = "console.log(require('_agentNodeId').serviceName());process.exit();"; + integratedJavaScript = ILibString_Copy(script, sizeof(script) - 1); + integragedJavaScriptLen = (int)sizeof(script) - 1; + } + CoInitializeEx(NULL, COINIT_APARTMENTTHREADED); @@ -717,21 +703,31 @@ int wmain(int argc, char* wargv[]) else if (r == 2) { printf("Mesh agent failed to stop"); } } } -#ifdef _MINCORE - else if (argc > 1 && memcmp(argv[1], "-update:", 8) == 0) - { - // Attempt to copy our own exe over the original exe - while (util_CopyFile(argv[0], argv[1] + 8, FALSE) == FALSE) { Sleep(5000); } - - // Attempt to start the updated service up again - LaunchService(); - } -#endif -#ifndef _MINCORE else if (argc > 1 && memcmp(argv[1], "-update:", 8) == 0) { - char *update = ILibMemory_Allocate(512, 0, NULL, NULL); - int updateLen = sprintf_s(update, 512, "require('agent-installer').update();"); + char *update = ILibMemory_Allocate(1024, 0, NULL, NULL); + int updateLen; + + if (argv[1][8] == '*') + { + // New Style + updateLen = sprintf_s(update, 1024, "require('agent-installer').update(%s, '%s');", argv[1][9] == 'S' ? "true" : "false", argc > 1 ? argv[2] : "null"); + } + else + { + // Legacy + if (argc > 1 && (strcmp(argv[2], "run") == 0 || strcmp(argv[2], "connect") == 0)) + { + // Console Mode + updateLen = sprintf_s(update, 1024, "require('agent-installer').update(false, ['%s']);", argv[2]); + } + else + { + // Service + updateLen = sprintf_s(update, 1024, "require('agent-installer').update(true);"); + } + } + __try { agent = MeshAgent_Create(0); @@ -748,13 +744,8 @@ int wmain(int argc, char* wargv[]) } wmain_free(argv); return(retCode); - - //// Attempt to copy our own exe over the original exe - //while (util_CopyFile(argv[0], argv[1] + 8, FALSE) == FALSE) Sleep(5000); - - //// Attempt to start the updated service up again - //LaunchService(serviceFile); } +#ifndef _MINCORE else if (argc > 1 && (strcasecmp(argv[1], "-netinfo") == 0)) { char* data; diff --git a/microscript/ILibDuktape_Polyfills.c b/microscript/ILibDuktape_Polyfills.c index 657112a..dfbaf22 100644 --- a/microscript/ILibDuktape_Polyfills.c +++ b/microscript/ILibDuktape_Polyfills.c @@ -2277,9 +2277,9 @@ void ILibDuktape_Polyfills_JS_Init(duk_context *ctx) duk_peval_string_noresult(ctx, "addCompressedModule('linux-cpuflags', Buffer.from('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', 'base64'));"); duk_peval_string_noresult(ctx, "addCompressedModule('linux-acpi', Buffer.from('eJx9VVFvm0gQfkfiP8z5Bago5Ny3WHlwHJ8OXWWfQnJV1VbVGga8F7zL7S6xLSv//WYBO7h1ui8G9ttvvvlmZh2/c52ZrPeKl2sD46vxFSTCYAUzqWqpmOFSuI7rfOQZCo05NCJHBWaNMK1ZRj/9Tgj/oNKEhnF0Bb4FjPqtUTBxnb1sYMP2IKSBRiMxcA0FrxBwl2FtgAvI5KauOBMZwpabdRul54hc53PPIFeGEZgRvKa3YggDZqxaoLU2pr6O4+12G7FWaSRVGVcdTscfk9l8kc7fk1p74lFUqDUo/K/hitJc7YHVJCZjK5JYsS1IBaxUSHtGWrFbxQ0XZQhaFmbLFLpOzrVRfNWYM5+O0ijfIYCcYgJG0xSSdAS30zRJQ9f5lDz8uXx8gE/T+/vp4iGZp7C8h9lycZc8JMsFvf0B08Vn+CtZ3IWA5BJFwV2trHqSyK2DmJNdKeJZ+EJ2cnSNGS94RkmJsmElQimfUQnKBWpUG65tFTWJy12n4htu2ibQP2dEQd7F1jzXKRqRWRRUXDS77yyruR+4zqErha119H25+hczk9zBDXgt7L2FeZMO0zvve/iMwmgviOb2YU7xDaooY1XlW54QjGow6A7ZFWUKmcEW7XstZdBzdhGjHAsu8G8lKT2z71lGuqmpwakSoxAO8MyqBq9fVRRWAe6oXjrdi8z34memYtWI2EbIIy2zJzReAC/HYLxomaMTb6/x8Cq18yGjAglDLpyCCcvU5zGTQmDrpX+Ampn1NbwRO4QNGpYzw67PDIWXEE718AdODZSc1FAYz1J4wzPZuhFPwTn6h8N2kSpYVSRGTy5vNqumKKhnbkA0VfUGyMgnaibCtFEjI1MaEVH6QaSplamkX8WpoMPFC7pl2rNRhaKk6+LmBn4PqJZtYo3Qa16YPpcJvPySoUZ88gP4jVrTsxSvym/bh6hQcnMCy9oPLlNiRZN2gCHwIs4Oo2+z5/Yq6eDBz7ALptvVmU7iuoNf+LejV3DRKrtaUxSaCDf8OCe28QXbUN93jF+uvtF47Wv6MEy73xzTprfGHbUqdWr+SP8TH8a3cz8Ij9Nz4dCHtw69Ds5w/WDVGebsZThKNi1rBn3qEUTzYq+ljcybCmmO7URawwRuz66oyf8tuBKP', 'base64'));"); #endif - char *_servicemanager = ILibMemory_Allocate(29981, 0, NULL, NULL); - memcpy_s(_servicemanager + 0, 29980, "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", 16000); - memcpy_s(_servicemanager + 16000, 13980, "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", 13980); + char *_servicemanager = ILibMemory_Allocate(30005, 0, NULL, NULL); + memcpy_s(_servicemanager + 0, 30004, "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", 16000); + memcpy_s(_servicemanager + 16000, 14004, "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", 14004); ILibDuktape_AddCompressedModule(ctx, "service-manager", _servicemanager); free(_servicemanager); @@ -2287,7 +2287,7 @@ void ILibDuktape_Polyfills_JS_Init(duk_context *ctx) duk_peval_string_noresult(ctx, "addCompressedModule('user-sessions', Buffer.from('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', 'base64'));"); // Mesh Agent NodeID helper, refer to modules/_agentNodeId.js - duk_peval_string_noresult(ctx, "addCompressedModule('_agentNodeId', Buffer.from('eJy9Vd9v0zAQfo+U/+HYA0lGSWE80WoPXTcgGmrRMkB7Qm5ySay5drCd/tDU/51z06G1K6MIhF8qn8/3ffd957R77HtDVS81LysLJ69ev4VEWhQwVLpWmlmupO/53keeoTSYQyNz1GArhEHNMvrZnHTgC2pD2XASv4LQJRxtjo6ivu8tVQNTtgSpLDQGqQI3UHCBgIsMawtcQqamteBMZghzbqs1yqZG7Hs3mwpqYhklM0qvaVc8TANmHVugVVlb97rd+XweszXTWOmyK9o80/2YDC9G6cVLYutufJYCjQGN3xuuqc3JElhNZDI2IYqCzUFpYKVGOrPKkZ1rbrksO2BUYedMo+/l3FjNJ43d0umeGvX7MIGUYhKOBikk6RGcDdIk7fje1+T6w/jzNXwdXF0NRtfJRQrjKxiOR+fJdTIe0e4dDEY3cJmMzjuApBKh4KLWjj1R5E5BzEmuFHELvlAtHVNjxgueUVOybFiJUKoZakm9QI16yo1z0RC53PcEn3K7HgLzuCMCOe468YpGZi4Hvk3RVCOVY5KHke/dtU7MmCZhLZxCEPTbkCF/swrCWquMmMe1YJYITqP2eHPRrYwR90Bw2SyC3m44Z3rO5cO4W1YvtwN329t7TvmEKG0cD4PUSYfnzLLUKo1BFA81Mos/OeICs0+MxvIFBHE+CTpwR7dZPpZi2SPQBmEV9R9Dta3/xLHCUG2hWD5EbZ0TDuQO6mLRI0rxe7RnTVGgJkooCqemSwyiDtTMmLrS1HoPgornOcqAMOMS7SUuPzBThVFsVUozJsswqHAR7BJabW8JO6tCjJ7Ua+fOhJq+7e9aQT68Odl1otuFd1wbC8MKs1vg7Vsl3YdKukds1vv1wJz/Vw9jjTRyGV1xIbJy7Wh0qKUOeUbAT9m15xr1H86ix/E9ve3V4Df5bv3JsM3+yUTdr9X+8P4JO6ATp69shDgcbk9orTictpXg+fP1bse2dvyCKIJnbd7hDrVqzw5QaPX7Zwh/+Q5zLFgjbO/XWZsCxLrREkL6dVRX7hM+VXkjkB4D/elbQ009+JT3XcIP9UUm2g==', 'base64'));"); + duk_peval_string_noresult(ctx, "addCompressedModule('_agentNodeId', Buffer.from('eJy9V21P40YQ/h4p/2HKh7N9BIfSqlJJU4kLXIngQouhJwTotLHH8Qpn7e6u8yLEf++s7UAS7BDaqvshye7O7jzz9sym/bHZ6CXpXPJRpOFg//ufoS80xtBLZJpIpnkimo1m45z7KBQGkIkAJegI4ShlPn2VOy34E6UiaThw98E2Ajvl1o7TaTbmSQZjNgeRaMgU0g1cQchjBJz5mGrgAvxknMacCR9hynWUaynvcJuNm/KGZKgZCTMST2kWLosB0wYt0Ii0Tg/b7el06rIcqZvIUTsu5FT7vN87GXgne4TWnLgWMSoFEv/KuCQzh3NgKYHx2ZAgxmwKiQQ2kkh7OjFgp5JrLkYtUEmop0xisxFwpSUfZnrFTwtoZO+yAHmKCdg58qDv7cCnI6/vtZqNr/2r04vrK/h6dHl5NLjqn3hwcQm9i8Fx/6p/MaDZZzga3MBZf3DcAiQvkRacpdKgJ4jceBADcpeHuKI+TAo4KkWfh9wno8QoYyOEUTJBKcgWSFGOuTJRVAQuaDZiPuY6TwL12iJS8rFtnBdmwjcy8G2MKhokAfYD22k2HotITJgkx2rogmV1iiVF8fUjsFOZ+ITcTWOmCeDYKbbLg2b4jLBbMRfZzDpcXw6YnHKxvG6GlvPVhcfV6QJTMCRIZcRtyzOuw2OmmacTiZbj9iQyjc8YcYb+74zSchcsNxhaLXik0yy4EPH8kJRmCE9O57WqwvRnPTpWdHecsKCHUptIGCWPkIazQ4Lk/ob6UxaGKAkSxqHxphG0nBakTKk0kmT6IVgRDwIUFul0R6jPcH7KVGQ7rk48yjExsq0IZ9Y6oKfVKen2Ixudjf5aOzMkox8666GgOPxwsB6Jdhs+c6k09CL0H4AXtUp+7yXCFLHK53nCHP+vMXQlUsr5dMQsUSjziDrbhtRonpDiTeGqOEb22xPn9XqFbZU+eEPejPck2+Q/yajFeKpers6wLSwx/hVZHG+vrmIp9zh0i5vgw4d8tha2Iv0sx4HvCrntI1R4e7KFh57eLkP4l3UYYMiyWB/WS5UXEOpMCrDp20B9qqBwNsY1Ahe0RLZ+++KdUkoYIQ/lhBqBkS3v56FtxLrdJS8u2VCQfh3nVxi8gVnMIHY5EdkY6ZVStDqJI9Ng56ZDK2p/Jd9MkW4S9NgQ1HUzWfLN0kXVBU63LZcSwdhbKKgMce4lHhgnLbfBGskHnNfsKMLoG1/fkjr39Ozkxj1PfBZ/oUcMF/TQel7uZVKi0NcK5X0dSzFTQK/3ppF5etlFVF/Ko9DtxihG1Oh+hf3ta4E05e4auX9kKOdEH3Z5m4p4qG0iV8srn0p3dxcpCvDy/VpGMS8Wm/xE1+53jMPgF6PFVdmQJqpE2dndpdn7+aWWXd84Z4ahlTzUXShYxA1lMrZXjK8JXrUP7u4selYsGXdLH/ckXWSR6UzWkKrhpx+tV3xcY/qWpphR1va6+pqwLI91DqoaNY3hja0FJc42mLfBtJqbt+saVVZVs6sZec0WXLjMF+XS3pgJemRLilv5y8UFaZUMWskRZUwsQyV0SmirQiivEKOfFzXCqUJKvYvqgN1dvn0RE4OX52/5Pf1vSk3ymr5gO93u+iPq/TVXGrWkQrx0j6qxKb/+WSyfKluhgfHcC8dJkMVIZtIfYK1W+byzvu2qlzb4LFoY1Wz8DRJS1hQ=', 'base64'));"); // Mesh Agent Status Helper, refer to modules/_agentStatus.js duk_peval_string_noresult(ctx, "addCompressedModule('_agentStatus', Buffer.from('eJydVk1v4zYQvQfwf+CNFNZVgk1OdtNFmg3QFFtnu5s91YWhSGObLk1qScqJEfi/d0bWByU7Sbe8JCbffHHePGpwskksy61ZSwfskln4XkgLgldbPBoPSog2GcgsRMySBWg/wf3bjEeiBso8/Zz4JSLRRQrOxblK/NzYNbu8ZPxR6vP3nH1ggk9xxdNpLnOYTjl7V8d4x/hPH69uP1/ziI2YqN2kj5mI6PC0OsSAg5N5oVMvjWZZ4pPfEp0psCJdFvqfaHDyPDhhuCgtBXq8/yXnbA+IcW+Bmf7MLiL2zPxSurjQbinnvvIwxmp9YfWY7VpbgWZY3d6FhST7dqv9+ftPN+IsitgvLPT9X/y2OVIJjWenZAriYkiZY9UX0bgF5slWmYS6oQulqgNvt/t/qqpptcDfv95N4jyxDgSFib356q3UCxHVjqsS08SnSyYgOnBWFlLxIp5ZWAl+qzeJwpZ9AZcbjQz6AinIDWS89kqrKrYT5li2p6f9EE5UFeBFu0L5D92fI96J85b1sEQcr/epW2+/39QAJMrbva37hhYIw8slV7uAp98LsNsrGh1hHlZDnBLYdKmK10Wdhcd6LkVjLLCQIQJWTXAqs5xKN242VuXGCkPXtaLLeIbh8OCZpetsxHiZBx9iRFXAiNHhLpgQSosGlgh2SAXylyqJRYSKoMHzKE5xJjxcG62hTFo8Iw39ctQow67HjcpTjFCe7s0wr7bmqEUHKTQNJzOiNNoEGhDG6EBBZy95PxLhBd6nyrgeyUvW7DUp3KKG0rX/WsznYOM5uhHlLLpy/OR8K+rmRH13ZPtQzFvrRCmTltxa1STsmSA8frTSQyNKNZIoPGRnfYNVnJp8K9Bu2GpMp/LSHQHC011vikA5eJ0lRKjjfbewNhu4UuqTdB40WFc19AWeHMNTV1+h1ev86IFfYcgx/r3JjB4r/i8jfpANP8SEF1kQXM0BD3attlSQ8DvCt9KD4k/K5clw13m0nU+sF6384fg7oyBWZiH4n6RQeCPsD3BLVkomGXiI47i54IUyD4mKZ3RQOI8fGcyBv5drMIUXB00MGtiJ9U0nDwqYN7Ttk9QHQcNwtOoPkhk8SS+a2xiy87Ozs7bXgdDXsoaZoED6Jei+pLeAw0RJjkuVr9QYJXwv+vyvyd09u76bTG6u728+/s2b75SD+oIrrEJBhtXiO4BsQG+HzzUTYQEZuNTK3BvreCfbpvyDujaUaJjEhh7DAxih+jdKsPJdfhtXU2ptsgLjwFNurHflO1eSa7T/g2/bv6RlHoI=', 'base64'));"); @@ -2326,7 +2326,7 @@ void ILibDuktape_Polyfills_JS_Init(duk_context *ctx) duk_peval_string_noresult(ctx, "addCompressedModule('default_route', Buffer.from('eJztVttu4zYQfTfgf5gawUpKHDl2sgs0rltkc6vQxFnESRaLpghoaWQTK5NakoqcJvn3DmV5fY3bvvWhfLBM8nDmzBlyyMZ2tXIs0yfFB0MDrb3mjxAIgwkcS5VKxQyXolqpVi54iEJjBJmIUIEZIhylLKRPOVOHO1Sa0NDy98C1gFo5VfPa1cqTzGDEnkBIA5lGssA1xDxBwHGIqQEuIJSjNOFMhAg5N8PCS2nDr1a+lBZk3zACM4Kn1IvnYcCMZQvUhsakh41Gnuc+K5j6Ug0ayQSnGxfB8Wm3d7pLbO2KW5Gg1qDwW8YVhdl/ApYSmZD1iWLCcpAK2EAhzRlpyeaKGy4GddAyNjlTWK1EXBvF+5lZ0GlKjeKdB5BSTEDtqAdBrwYfj3pBr16tfA5ufr26vYHPR9fXR92b4LQHV9dwfNU9CW6Cqy71zuCo+wV+C7ondUBSibzgOFWWPVHkVkGMSK4e4oL7WE7o6BRDHvOQghKDjA0QBvIRlaBYIEU14tpmURO5qFpJ+IibYhPo1YjIyXbDihdnIrQYypqIZK4fIoxZlphrSZG6XrXyPEnJI1OksIEOiCxJ2rPB80saK7V3nYdzFKh4eMmUHrLE8Upk8IlQ55f+sUJmsEu0HvGTkuMn1wnSYZKylPtRMo8voZdohjJynXM0QXomFWUrurGJLaAzGpr/ifMu7pjiFuYeeO35CDTFRjiyv2LR3asXZurQnK7hsTtZ4t+xBDodaLZa3mSq1GVq2RSbbR0Ba9I38mMWx6hcz6fZ6JYO6n7r4tT1pp5s28yu8LDCcC3LPW82OcdzyhUF7WTU5Kiw6Z+gwthGf+C9TbS9akfJfGl0sUfb1rU43tlr859Kr+2dHe4t4pYoFlLIfIneAeyAy2Eb3n/w6vanvbqKx+DSyn8W0LJQG9jY1mjAyeRoQHE21qMsgx/sOXl5scfFHyEFHcLPMKO1/2EzrzWUNtAqxCrO5TNVNoMqZiEezrlr/o27Okw4Hv4LivC6RnzbXleHl4bmuuXf8kNBZEpQ/tDY1L4uFKeEi2y8qTSFQ55E84WoGHhIlQypujqej2MMz+jKcp1Gn4uGHjp1+N2hzx/TjVSs8LWhSql8KVwnYoYR6jsJN/RI5NcVPNGhjyLvjtNeHH7bjL1Di1U7HQhJ6R7lQAzomK1xwIVvbyzizlPKEkUPL0D3WQqlItRl+Ve4d55tLYCtZqdTK6dq8O4dbB0UA481sK5T8mRg6z25gtd7517gmJt74Sz6zRk3pzTx/eRPE7Qct0/MR5Pj5DjwS3E/wOHidnxjzWzvNSdhL2a9r6P/c+4INJrucdgl8XdjUtVWl7fSX+a2e/afzKymp2E4dMsM+WnCDN0Ro1laQ0avHYeeIvst53BWKUYyyugioLeSVMbeW+seK3MlqU/l6mt73mRRQDaaXC0xGw3G9Jyk/Tk1ORmMmCJmG90s7+k1Tgqp/gL2YXjV', 'base64'));"); // agent-instaler: Refer to modules/agent-installer.js - duk_peval_string_noresult(ctx, "addCompressedModule('agent-installer', Buffer.from('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', 'base64'));"); + duk_peval_string_noresult(ctx, "addCompressedModule('agent-installer', Buffer.from('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', 'base64'));"); // identifer: Refer to modules/identifers.js duk_peval_string_noresult(ctx, "addCompressedModule('identifiers', Buffer.from('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', 'base64'));"); @@ -2991,6 +2991,68 @@ duk_ret_t ILibDuktape_Polyfills_debugHang(duk_context *ctx) return(0); } +extern void checkForEmbeddedMSH_ex2(char *binPath, char **eMSH); +duk_ret_t ILibDuktape_Polyfills_MSH(duk_context *ctx) +{ + duk_eval_string(ctx, "process.execPath"); // [string] + char *exepath = (char*)duk_get_string(ctx, -1); + char *msh; + duk_size_t s = 0; + + checkForEmbeddedMSH_ex2(exepath, &msh); + if (msh == NULL) + { + duk_eval_string(ctx, "require('fs')"); // [fs] + duk_get_prop_string(ctx, -1, "readFileSync"); // [fs][readFileSync] + duk_swap_top(ctx, -2); // [readFileSync][this] +#ifdef _POSIX + duk_push_sprintf(ctx, "%s.msh", exepath); // [readFileSync][this][path] +#else + duk_push_string(ctx, exepath); // [readFileSync][this][path] + duk_string_split(ctx, -1, ".exe"); // [readFileSync][this][path][array] + duk_remove(ctx, -2); // [readFileSync][this][array] + duk_array_join(ctx, -1, ".msh"); // [readFileSync][this][array][path] + duk_remove(ctx, -2); // [readFileSync][this][path] +#endif + duk_push_object(ctx); // [readFileSync][this][path][options] + duk_push_string(ctx, "rb"); duk_put_prop_string(ctx, -2, "flags"); + if (duk_pcall_method(ctx, 2) == 0) // [buffer] + { + msh = Duktape_GetBuffer(ctx, -1, &s); + } + } + + duk_push_object(ctx); // [obj] + if (msh != NULL) + { + if (s == 0) { s = ILibMemory_Size(msh); } + parser_result *pr = ILibParseString(msh, 0, s, "\n", 1); + parser_result_field *f = pr->FirstResult; + int i; + while (f != NULL) + { + if (f->datalength > 0) + { + i = ILibString_IndexOf(f->data, f->datalength, "=", 1); + duk_push_lstring(ctx, f->data, (duk_size_t)i); // [obj][key] + if (f->data[f->datalength - 1] == '\r') + { + duk_push_lstring(ctx, f->data + i + 1, f->datalength - i - 2); // [obj][key][value] + } + else + { + duk_push_lstring(ctx, f->data + i + 1, f->datalength - i - 1); // [obj][key][value] + } + duk_put_prop(ctx, -3); // [obj] + } + f = f->NextResult; + } + ILibDestructParserResults(pr); + ILibMemory_Free(msh); + } + return(1); +} + void ILibDuktape_Polyfills_Init(duk_context *ctx) { ILibDuktape_ModSearch_AddHandler(ctx, "queue", ILibDuktape_Queue_Push); @@ -3036,6 +3098,7 @@ void ILibDuktape_Polyfills_Init(duk_context *ctx) ILibDuktape_CreateInstanceMethod(ctx, "getSHA384FileHash", ILibDuktape_Polyfills_filehash, 1); ILibDuktape_CreateInstanceMethod(ctx, "_ipv4From", ILibDuktape_Polyfills_ipv4From, 1); ILibDuktape_CreateInstanceMethod(ctx, "_isBuffer", ILibDuktape_Polyfills_isBuffer, 1); + ILibDuktape_CreateInstanceMethod(ctx, "_MSH", ILibDuktape_Polyfills_MSH, 0); #ifndef MICROSTACK_NOTLS ILibDuktape_CreateInstanceMethod(ctx, "crc32c", ILibDuktape_Polyfills_crc32c, DUK_VARARGS); diff --git a/modules/MSH_Installer.js b/modules/MSH_Installer.js index 1d441ae..2c36685 100644 --- a/modules/MSH_Installer.js +++ b/modules/MSH_Installer.js @@ -17,6 +17,26 @@ limitations under the License. const exeJavaScriptGuid = 'B996015880544A19B7F7E9BE44914C18'; const exeMeshPolicyGuid = 'B996015880544A19B7F7E9BE44914C19'; + + +function mshLength() +{ + var exesize = require('fs').statSync(process.execPath).size; + var fd = require('fs').openSync(process.execPath, "rb"); + var buffer = Buffer.alloc(20); + require('fs').readSync(fd, buffer, 0, buffer.length, exesize - 20); + + if(buffer.slice(4).toString('hex') == exeMeshPolicyGuid) + { + return (buffer.readUInt32BE(0)); + } + else + { + return (0); + } +} + + // Changes a Windows Executable to add the MSH inside of it. // This method will write to destination stream and close it. /* @@ -152,6 +172,7 @@ function addMsh(options) try { module.exports = addMsh; + module.exports.len = mshLength; } catch(e) { @@ -171,6 +192,10 @@ catch(e) case '-i': inputFile = process.argv[i + 1]; break; + case '-mshlen': + console.log('Integrated MSH Length: ' + mshLength()); + process.exit(); + break; default: console.log('unrecognized parameter: ' + process.argv[i]); break; diff --git a/modules/_agentNodeId.js b/modules/_agentNodeId.js index 3149d44..22ff7cb 100644 --- a/modules/_agentNodeId.js +++ b/modules/_agentNodeId.js @@ -62,5 +62,57 @@ function _meshNodeId() return (ret); } -module.exports = _meshNodeId; +function _meshName() +{ + var name = _MSH().meshServiceName; + if(name==null) + { + switch(process.platform) + { + case 'win32': + // Enumerate the registry to see if the we can find our NodeID + var reg = require('win-registry'); + var nid = _meshNodeId(); + var key; + var source = [reg.HKEY.LocalMachine, reg.HKEY.CurrentUser]; + var val; + + while (name == null && source.length > 0) + { + val = reg.QueryKey(source.shift(), 'Software\\Open Source'); + for (key = 0; key < val.subkeys.length;++key) + { + try + { + if (nid == Buffer.from(reg.QueryKey(reg.HKEY.LocalMachine, 'Software\\Open Source\\' + val.subkeys[key], 'NodeId'), 'base64').toString('hex')) + { + name = val.subkeys[key]; + break; + } + } + catch (ex) + { + } + } + } + break; + default: + var service = require('service-manager').manager.enumerateService(); + name = 'meshagent'; + for (var i = 0; i < service.length; ++i) + { + if(service[i].appLocation()==process.execPath) + { + name = service[i].name; + break; + } + } + break; + } + } + return (name); +} + +module.exports = _meshNodeId; +module.exports.serviceName = _meshName; diff --git a/modules/agent-installer.js b/modules/agent-installer.js index 4e4cf61..33e8a2c 100644 --- a/modules/agent-installer.js +++ b/modules/agent-installer.js @@ -14,22 +14,31 @@ See the License for the specific language governing permissions and limitations under the License. */ - -function getParameter(name, parms) -{ - var tokens; - for(var i=0;i= 0) { var mshFile = process.platform == 'win32' ? (process.execPath.split('.exe').join('.msh')) : (process.execPath + '.msh'); if (options.files == null) { options.files = []; } - options.files.push({ source: mshFile, newName: process.platform == 'win32' ? 'MeshAgent.msh' : 'meshagent.msh' }); + options.files.push({ source: mshFile, newName: options.target + '.msh' }); options.parameters.splice(i, 1); } - if ((i=params.indexOf('--_localService="1"'))>=0) { // install in place @@ -123,6 +133,10 @@ function installService(params) options.parameters.splice(i, 1); break; } + if(options.parameters[i].startsWith('--meshServiceName=')) + { + + } } try { @@ -134,7 +148,7 @@ function installService(params) process.stdout.write(' [ERROR] ' + sie); process.exit(); } - var svc = require('service-manager').manager.getService(process.platform=='win32'?'Mesh Agent':'meshagent'); + var svc = require('service-manager').manager.getService(options.name); if (process.platform == 'darwin') { svc.load(); @@ -143,7 +157,7 @@ function installService(params) { require('service-manager').manager.installLaunchAgent( { - name: 'meshagent', + name: options.name, servicePath: svc.appLocation(), startType: 'AUTO_START', sessionTypes: ['LoginWindow'], @@ -161,11 +175,11 @@ function installService(params) if(process.platform == 'win32') { var loc = svc.appLocation(); - process.stdout.write(' -> Writing firewall rules for Mesh Agent Service...'); + process.stdout.write(' -> Writing firewall rules for ' + options.name + ' Service...'); var rule = { - DisplayName: 'Mesh Agent Management Traffic (TCP-1)', + DisplayName: options.name + ' Management Traffic (TCP-1)', direction: 'inbound', Program: loc, Protocol: 'TCP', @@ -179,7 +193,7 @@ function installService(params) rule = { - DisplayName: 'Mesh Agent Management Traffic (TCP-2)', + DisplayName: options.name + ' Management Traffic (TCP-2)', direction: 'inbound', Program: loc, Protocol: 'TCP', @@ -193,7 +207,7 @@ function installService(params) rule = { - DisplayName: 'Mesh Agent Peer-to-Peer Traffic (UDP-1)', + DisplayName: options.name + ' Peer-to-Peer Traffic (UDP-1)', direction: 'inbound', Program: loc, Protocol: 'UDP', @@ -207,7 +221,7 @@ function installService(params) rule = { - DisplayName: 'Mesh Agent Peer-to-Peer Traffic (UDP-2)', + DisplayName: options.name + ' Peer-to-Peer Traffic (UDP-2)', direction: 'inbound', Program: loc, Protocol: 'UDP', @@ -242,7 +256,7 @@ function uninstallService3(params) process.stdout.write(' -> Uninstalling launch agent...'); try { - var launchagent = require('service-manager').manager.getLaunchAgent('meshagent'); + var launchagent = require('service-manager').manager.getLaunchAgent(params.getParameter('meshServiceName', 'meshagent')); launchagent.unload(); require('fs').unlinkSync(launchagent.plist); process.stdout.write(' [DONE]\n'); @@ -269,6 +283,7 @@ function uninstallService2(params, msh) var dataFolder = null; var appPrefix = null; var uninstallOptions = null; + var serviceName = params.getParameter('meshServiceName', process.platform == 'win32' ? 'Mesh Agent' : 'meshagent'); try { require('fs').unlinkSync(msh); } catch (mshe) { } if ((i = params.indexOf('__skipBinaryDelete')) >= 0) @@ -296,7 +311,7 @@ function uninstallService2(params, msh) process.stdout.write(' -> Uninstalling previous installation...'); try { - require('service-manager').manager.uninstallService(process.platform == 'win32' ? 'Mesh Agent' : 'meshagent', uninstallOptions); + require('service-manager').manager.uninstallService(serviceName, uninstallOptions); process.stdout.write(' [DONE]\n'); if (dataFolder && appPrefix) { @@ -341,7 +356,7 @@ function uninstallService2(params, msh) try { process.stdout.write(' -> Checking for secondary agent...'); - var s = require('service-manager').manager.getService('meshagentDiagnostic'); + var s = require('service-manager').manager.getService(serviceName + 'Diagnostic'); var loc = s.appLocation(); s.close(); process.stdout.write(' [FOUND]\n'); @@ -349,7 +364,7 @@ function uninstallService2(params, msh) secondaryagent = true; try { - require('service-manager').manager.uninstallService('meshagentDiagnostic'); + require('service-manager').manager.uninstallService(serviceName + 'Diagnostic'); process.stdout.write(' [DONE]\n'); } catch (e) @@ -365,7 +380,7 @@ function uninstallService2(params, msh) if(secondaryagent) { process.stdout.write(' -> removing secondary agent from task scheduler...'); - var p = require('task-scheduler').delete('meshagentDiagnostic/periodicStart'); + var p = require('task-scheduler').delete(serviceName + 'Diagnostic/periodicStart'); p._params = params; p.then(function () { @@ -384,7 +399,7 @@ function uninstallService2(params, msh) } function uninstallService(params) { - var svc = require('service-manager').manager.getService(process.platform == 'win32' ? 'Mesh Agent' : 'meshagent'); + var svc = require('service-manager').manager.getService(params.getParameter('meshServiceName', process.platform == 'win32' ? 'Mesh Agent' : 'meshagent')); var msh = svc.appLocation(); if (process.platform == 'win32') { @@ -462,10 +477,14 @@ function fullUninstall(jsonString) var parms = JSON.parse(jsonString); parms.push('_stop'); + checkParameters(parms); + + var name = parms.getParameter('meshServiceName', process.platform == 'win32' ? 'Mesh Agent' : 'meshagent'); + try { - process.stdout.write('...Checking for previous installation'); - var s = require('service-manager').manager.getService(process.platform == 'win32' ? 'Mesh Agent' : 'meshagent'); + process.stdout.write('...Checking for previous installation of "' + name + '"'); + var s = require('service-manager').manager.getService(name); var loc = s.appLocation(); var appPrefix = loc.split(process.platform == 'win32' ? '\\' : '/').pop(); if (process.platform == 'win32') { appPrefix = appPrefix.substring(0, appPrefix.length - 4); } @@ -486,9 +505,13 @@ function fullUninstall(jsonString) function fullInstall(jsonString) { var parms = JSON.parse(jsonString); - var loc = null; + checkParameters(parms); - if (!(getParameter('--verbose', parms) != null && parseInt(getParameter('--verbose', parms)) > 0)) + var loc = null; + var i; + var name = parms.getParameter('meshServiceName', process.platform == 'win32' ? 'Mesh Agent' : 'meshagent'); + + if (parseInt(parms.getParameter('verbose', 0)) == 0) { console.setDestination(console.Destinations.DISABLED); } @@ -499,8 +522,8 @@ function fullInstall(jsonString) try { - process.stdout.write('...Checking for previous installation'); - var s = require('service-manager').manager.getService(process.platform == 'win32' ? 'Mesh Agent' : 'meshagent'); + process.stdout.write('...Checking for previous installation of "' + name + '"'); + var s = require('service-manager').manager.getService(name); loc = s.appLocation(); global._workingpath = s.appWorkingDirectory(); @@ -528,59 +551,106 @@ module.exports = fullUninstall: fullUninstall }; -if (process.platform == 'win32') +function sys_update(isservice, b64) { - function win_update() + console.setDestination(console.Destinations.LOGFILE); + + var parm = b64 != null ? JSON.parse(Buffer.from(b64, 'base64').toString()) : null; + var service = null; + var serviceLocation = ""; + + console.log(isservice, parm); + + if (isservice) { - console.setDestination(console.Destinations.LOGFILE); - var updateLocation = process.argv[1].substring(8); - var service = null; - var serviceLocation = ""; + // + // Service Mode + // - if(!global._interval) + // Check if we have sufficient permission + if(!require('user-sessions').isRoot()) { - global._interval = setInterval(win_update, 60000); - } - - try - { - service = require('service-manager').manager.getService('Mesh Agent'); - serviceLocation = service.appLocation(); - } - catch(e) - { - console.log('Service Manager Error: ' + e); - console.log('Trying again in one minute...'); + // We don't have enough permissions, so copying the binary will likely fail, and we can't start... + // This is just to prevent looping, because agentcore.c should not call us in this scenario + console.log('* insufficient permission to continue with update'); + process._exit(); return; } - - service.stop().finally(function () + var servicename = parm!=null?(parm.getParameter('meshServiceName', process.platform=='win32'?'Mesh Agent' : 'meshagent')):(process.platform == 'win32' ? 'Mesh Agent' : 'meshagent'); + try { - require('process-manager').enumerateProcesses().then(function (proc) - { - for (var p in proc) - { - if (proc[p].path == serviceLocation) - { - process.kill(proc[p].pid); - } - } - - try - { - require('fs').copyFileSync(process.execPath, updateLocation); - } - catch (ce) - { - console.log('Could not copy file.. Trying again in 60 seconds'); - service.close(); - return; - } - - service.start(); - process._exit(); - }); - }); + service = require('service-manager').manager.getService(servicename) + serviceLocation = service.appLocation(); + console.log(' Updating service: ' + servicename); + } + catch(f) + { + console.log(' * ' + servicename + ' SERVICE NOT FOUND *'); + process._exit(); + } } - module.exports.update = win_update; -} \ No newline at end of file + + + + + if (!global._interval) + { + global._interval = setInterval(sys_update, 60000, isservice, b64); + } + + if (isservice === false) + { + // Console Mode + serviceLocation = process.execPath.split('.update.exe').join('.exe'); + if (serviceLocation != process.execPath) + { + try + { + require('fs').copyFileSync(process.execPath, serviceLocation); + } + catch (ce) + { + console.log('Could not copy file.. Trying again in 60 seconds'); + return; + } + } + + // Copied agent binary... Need to start agent in console mode + console.log('Agent update complete. Starting in console mode...'); + process._exit(); + return; + } + + + service.stop().finally(function () + { + require('process-manager').enumerateProcesses().then(function (proc) + { + for (var p in proc) + { + if (proc[p].path == serviceLocation) + { + process.kill(proc[p].pid); + } + } + + try + { + require('fs').copyFileSync(process.execPath, serviceLocation); + } + catch (ce) + { + console.log('Could not copy file.. Trying again in 60 seconds'); + service.close(); + return; + } + + console.log('Agent update complete. Starting service...'); + service.start(); + process._exit(); + }); + }); +} + + +module.exports.update = sys_update; diff --git a/modules/service-manager.js b/modules/service-manager.js index dc1c786..cb9988f 100644 --- a/modules/service-manager.js +++ b/modules/service-manager.js @@ -2029,9 +2029,9 @@ function serviceManager() reg.WriteKey(reg.HKEY.LocalMachine, 'SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\' + options.name, 'EstimatedSize', Math.floor(require('fs').statSync(options.servicePath).size / 1024)); reg.WriteKey(reg.HKEY.LocalMachine, 'SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\' + options.name, 'NoModify', 0x1); reg.WriteKey(reg.HKEY.LocalMachine, 'SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\' + options.name, 'NoRepair', 0x1); - if (options.name == 'Mesh Agent') + if (options.name == 'Mesh Agent' || options._installer == true) { - reg.WriteKey(reg.HKEY.LocalMachine, 'SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\' + options.name, 'UninstallString', options.servicePath + ' -funinstall'); + reg.WriteKey(reg.HKEY.LocalMachine, 'SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\' + options.name, 'UninstallString', options.servicePath + ' -funinstall --meshServiceName="' + options.name + '"'); } else {