diff --git a/meshcore/agentcore.c b/meshcore/agentcore.c index d501ae4..afca018 100644 --- a/meshcore/agentcore.c +++ b/meshcore/agentcore.c @@ -1514,23 +1514,38 @@ duk_ret_t ILibDuktape_MeshAgent_NetInfo(duk_context *ctx) // Javascript ExecPowerState(int), executes power state command on the computer (Sleep, Hibernate...) duk_ret_t ILibDuktape_MeshAgent_ExecPowerState(duk_context *ctx) { -#ifdef __APPLE__ - duk_push_null(ctx); -#else int force = 0; int numArgs = (int)duk_get_top(ctx); - duk_push_this(ctx); // [MeshAgent] - if (numArgs == 2 && duk_is_number(ctx, 1)) { force = duk_get_int(ctx, 1); } + + + duk_push_this(ctx); // [MeshAgent] if (duk_is_number(ctx, 0)) { +#ifdef __APPLE__ + switch (duk_require_int(ctx, 0)) + { + case 2: // SHUTDOWN + duk_peval_string_noresult(ctx, "require('mac-powerutil').shutdown();"); + duk_push_int(ctx, 1); + break; + case 3: // REBOOT + duk_peval_string_noresult(ctx, "require('mac-powerutil').restart();"); + duk_push_int(ctx, 1); + break; + default: + duk_push_int(ctx, 0); + break; + } +#else duk_push_int(ctx, MeshInfo_PowerState((AgentPowerStateActions)duk_get_int(ctx, 0), force)); +#endif } else { duk_push_null(ctx); } -#endif + return 1; } @@ -2488,7 +2503,7 @@ void MeshServer_ProcessCommand(ILibWebClient_StateObject WebStateObject, MeshAge if (agent->controlChannelDebug != 0) { printf("ProcessCommand(%u)...\n", command); - ILIBLOGMESSAGEX("ProcessCommand(%u)...\n", command); + ILIBLOGMESSAGEX("ProcessCommand(%u)...", command); } #ifndef MICROSTACK_NOTLS @@ -2502,7 +2517,7 @@ void MeshServer_ProcessCommand(ILibWebClient_StateObject WebStateObject, MeshAge case MeshCommand_AuthRequest: // This is basic authentication information from the server, we need to sign this and return the signature. if (cmdLen == sizeof(MeshCommand_BinaryPacket_AuthRequest)) { - if (agent->controlChannelDebug != 0) { ILIBLOGMESSAGEX("Processing Authentication Request...\n"); } + if (agent->controlChannelDebug != 0) { ILIBLOGMESSAGEX("Processing Authentication Request..."); } MeshCommand_BinaryPacket_AuthRequest *AuthRequest = (MeshCommand_BinaryPacket_AuthRequest*)cmd; int signLen; SHA512_CTX c; @@ -2519,7 +2534,7 @@ void MeshServer_ProcessCommand(ILibWebClient_StateObject WebStateObject, MeshAge printf("Bad server certificate hash\r\n"); // TODO: Disconnect if (agent->controlChannelDebug != 0) { - ILIBLOGMESSAGEX("Bad server certificate hash\n"); + ILIBLOGMESSAGEX("Bad server certificate hash"); } break; } @@ -2577,7 +2592,7 @@ void MeshServer_ProcessCommand(ILibWebClient_StateObject WebStateObject, MeshAge case MeshCommand_AuthVerify: // This is the signature from the server. We need to check everything is ok. if (cmdLen > 8) { - if (agent->controlChannelDebug != 0) { ILIBLOGMESSAGEX("Processing Authentication Verification...\n"); } + if (agent->controlChannelDebug != 0) { ILIBLOGMESSAGEX("Processing Authentication Verification..."); } MeshCommand_BinaryPacket_AuthVerify_Header *avh = (MeshCommand_BinaryPacket_AuthVerify_Header*)cmd; #ifdef WIN32 @@ -2608,7 +2623,7 @@ void MeshServer_ProcessCommand(ILibWebClient_StateObject WebStateObject, MeshAge if (memcmp(ILibScratchPad, agent->serverHash, UTIL_SHA256_HASHSIZE) != 0) { printf("Server certificate mismatch\r\n"); break; // TODO: Disconnect - if (agent->controlChannelDebug != 0) { ILIBLOGMESSAGEX("Server certificate mismatch\n"); } + if (agent->controlChannelDebug != 0) { ILIBLOGMESSAGEX("Server certificate mismatch"); } } } @@ -2635,7 +2650,7 @@ void MeshServer_ProcessCommand(ILibWebClient_StateObject WebStateObject, MeshAge MeshServer_SendAgentInfo(agent, WebStateObject); } else { printf("Invalid server signature\r\n"); - if (agent->controlChannelDebug != 0) { ILIBLOGMESSAGEX("Invalid Server Signature\n"); } + if (agent->controlChannelDebug != 0) { ILIBLOGMESSAGEX("Invalid Server Signature"); } // TODO: Disconnect } @@ -2646,7 +2661,7 @@ void MeshServer_ProcessCommand(ILibWebClient_StateObject WebStateObject, MeshAge break; case MeshCommand_AuthConfirm: // Server indicates that we are authenticated, we can now send data. { - if (agent->controlChannelDebug != 0) { printf("Authentication Complete...\n"); ILIBLOGMESSAGEX("Authentication Complete...\n"); } + if (agent->controlChannelDebug != 0) { printf("Authentication Complete...\n"); ILIBLOGMESSAGEX("Authentication Complete..."); } // We have to wait for the server to indicate that it authenticated the agent (us) before sending any data to the server. // Node authentication requires the server make database calls, so we need to delay. @@ -2713,7 +2728,7 @@ void MeshServer_ProcessCommand(ILibWebClient_StateObject WebStateObject, MeshAge if (agent->controlChannelDebug != 0) { printf("BinaryCommand(%u, %u)...\n", command, requestid); - ILIBLOGMESSAGEX("BinaryCommand(%u, %u)...\n", command, requestid); + ILIBLOGMESSAGEX("BinaryCommand(%u, %u)...", command, requestid); } @@ -3043,7 +3058,7 @@ void MeshServer_OnResponse(ILibWebClient_StateObject WebStateObject, int Interru if (agent->controlChannelDebug != 0) { printf("Control Channel Connection Established...\n"); - ILIBLOGMESSAGEX("Control Channel Connection Established...\n"); + ILIBLOGMESSAGEX("Control Channel Connection Established..."); } #ifndef MICROSTACK_NOTLS int len; @@ -3094,7 +3109,7 @@ void MeshServer_OnResponse(ILibWebClient_StateObject WebStateObject, int Interru if (agent->controlChannelDebug != 0) { printf("TLS Server Cert matches Mesh Server Cert...\n"); - ILIBLOGMESSAGEX("TLS Server Cert matches Mesh Server Cert...\n"); + ILIBLOGMESSAGEX("TLS Server Cert matches Mesh Server Cert..."); } // The TLS certificate of this server is correct, no need to authenticate further. unsigned short response = htons(MeshCommand_AuthConfirm); // Send indication to the server that it's already authenticated @@ -3105,7 +3120,7 @@ void MeshServer_OnResponse(ILibWebClient_StateObject WebStateObject, int Interru if (agent->controlChannelDebug != 0) { printf("Sending Authentication Data...\n"); - ILIBLOGMESSAGEX("Sending Authentication Data...\n"); + ILIBLOGMESSAGEX("Sending Authentication Data..."); } // Start authentication by sending a auth nonce & server TLS cert hash - If we indicated AuthConfirm already, the server will use this data but not respond to it. @@ -3126,7 +3141,7 @@ void MeshServer_OnResponse(ILibWebClient_StateObject WebStateObject, int Interru if (agent->controlChannelDebug != 0) { printf("Control Channel Disconnected...\n"); - ILIBLOGMESSAGEX("Control Channel Disconnected...\n"); + ILIBLOGMESSAGEX("Control Channel Disconnected..."); } // If the channel had been authenticates, inform JavaScript core module that we are not disconnected @@ -3271,7 +3286,7 @@ void MeshServer_ConnectEx(MeshAgentHostContainer *agent) if (agent->controlChannelDebug != 0) { printf("Swapping [%s] for [%s]\n", agent->serveruri, "wss://meshcentral.com:443/agent.ashx"); - ILIBLOGMESSAGEX("Swapping [%s] for [%s]\n", agent->serveruri, "wss://meshcentral.com:443/agent.ashx"); + ILIBLOGMESSAGEX("Swapping [%s] for [%s]", agent->serveruri, "wss://meshcentral.com:443/agent.ashx"); } strcpy_s(agent->serveruri, sizeof(agent->serveruri), "wss://meshcentral.com:443/agent.ashx"); strcpy_s(serverUrl, serverUrlLen, "wss://meshcentral.com:443/agent.ashx"); @@ -3366,7 +3381,7 @@ void MeshServer_ConnectEx(MeshAgentHostContainer *agent) { strcpy_s(agent->serverip, sizeof(agent->serverip), ILibRemoteLogging_ConvertAddress((struct sockaddr*)&meshServer)); printf("Connecting to: %s\n", agent->serveruri); - if (agent->logUpdate != 0 || agent->controlChannelDebug != 0) { ILIBLOGMESSAGEX("Connecting to: %s\n", agent->serveruri); } + if (agent->logUpdate != 0 || agent->controlChannelDebug != 0) { ILIBLOGMESSAGEX("Connecting to: %s", agent->serveruri); } ILibWebClient_AddWebSocketRequestHeaders(req, 65535, MeshServer_OnSendOK); if (agent->webSocketMaskOverride != 0) { ILibHTTPPacket_Stash_Put(req, "_WebSocketMaskOverride", 22, (void*)(uintptr_t)0x01); } @@ -3454,8 +3469,8 @@ void MeshServer_Connect(MeshAgentHostContainer *agent) SLAVELOG = ILibSimpleDataStore_Get(agent->masterDb, "slaveKvmLog", NULL, 0); #endif - if (agent->logUpdate != 0) { ILIBLOGMESSAGEX("PLATFORM_TYPE: %d\n", agent->platformType); } - if (agent->logUpdate != 0) { ILIBLOGMESSAGEX("Running as Service: %d\n", agent->JSRunningAsService); } + if (agent->logUpdate != 0) { ILIBLOGMESSAGEX("PLATFORM_TYPE: %d", agent->platformType); } + if (agent->logUpdate != 0) { ILIBLOGMESSAGEX("Running as Service: %d", agent->JSRunningAsService); } if (agent->logUpdate != 0) { ILIBLOGMESSSAGE("Attempting to connect to Server..."); } if (agent->controlChannelDebug != 0) @@ -4007,6 +4022,20 @@ int MeshAgent_AgentMode(MeshAgentHostContainer *agentHost, int paramLen, char ** } #endif #if !defined(MICROSTACK_NOTLS) + +#if defined(__APPLE__) + if (ILibSimpleDataStore_Get(agentHost->masterDb, "controlChannelDebug", NULL, 0) != 0) + { + ILIBLOGMESSAGEX("Waiting for network..."); + } + duk_peval_string_noresult(tmpCtx, "process.stdout.write('waiting for network...');var child = require('child_process').execFile('/bin/sh', ['sh']);child.stdin.write('ipconfig waitall\\nexit\\n');child.waitExit();process.stdout.write('[OK]\\n');"); + if (ILibSimpleDataStore_Get(agentHost->masterDb, "controlChannelDebug", NULL, 0) != 0) + { + ILIBLOGMESSAGEX("...[OK]\n"); + } +#endif + + // Check the local MacAddresses, to see if we need to reset our NodeId if (duk_peval_string(tmpCtx, "(function _getMac() { var ret = ''; var ni = require('os').networkInterfaces(); for (var f in ni) { for (var i in ni[f]) { if(ni[f][i].type == 'ethernet' || ni[f][i].type == 'wireless') {ret += ('[' + ni[f][i].mac + ']');} } } return(ret); })();") == 0) { diff --git a/microscript/ILibDuktape_Polyfills.c b/microscript/ILibDuktape_Polyfills.c index 952a3ed..78fc644 100644 --- a/microscript/ILibDuktape_Polyfills.c +++ b/microscript/ILibDuktape_Polyfills.c @@ -2211,7 +2211,9 @@ void ILibDuktape_Polyfills_JS_Init(duk_context *ctx) // agent-instaler: Refer to modules/agent-installer.js duk_peval_string_noresult(ctx, "addModule('agent-installer', Buffer.from('LyoKQ29weXJpZ2h0IDIwMjAgSW50ZWwgQ29ycG9yYXRpb24KCkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwp5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQpkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZApsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKi8KCgpmdW5jdGlvbiBpbnN0YWxsU2VydmljZShwYXJhbXMpCnsKICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKCcuLi5JbnN0YWxsaW5nIHNlcnZpY2UnKTsKICAgIHRyeQogICAgewogICAgICAgIHJlcXVpcmUoJ3NlcnZpY2UtbWFuYWdlcicpLm1hbmFnZXIuaW5zdGFsbFNlcnZpY2UoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG5hbWU6IHByb2Nlc3MucGxhdGZvcm0gPT0gJ3dpbjMyJyA/ICdNZXNoIEFnZW50JyA6ICdtZXNoYWdlbnQnLAogICAgICAgICAgICAgICAgdGFyZ2V0OiBwcm9jZXNzLnBsYXRmb3JtID09ICd3aW4zMicgPyAnTWVzaEFnZW50JyA6ICdtZXNoYWdlbnQnLAogICAgICAgICAgICAgICAgZGlzcGxheU5hbWU6ICdNZXNoIEFnZW50IGJhY2tncm91bmQgc2VydmljZScsCiAgICAgICAgICAgICAgICBzZXJ2aWNlUGF0aDogcHJvY2Vzcy5leGVjUGF0aCwKICAgICAgICAgICAgICAgIHN0YXJ0VHlwZTogJ0FVVE9fU1RBUlQnLAogICAgICAgICAgICAgICAgcGFyYW1ldGVyczogcGFyYW1zCiAgICAgICAgICAgIH0pOwogICAgICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKCcgW0RPTkVdXG4nKTsKICAgIH0KICAgIGNhdGNoKHNpZSkKICAgIHsKICAgICAgICBwcm9jZXNzLnN0ZG91dC53cml0ZSgnIFtFUlJPUl0gJyArIHNpZSk7CiAgICAgICAgcHJvY2Vzcy5leGl0KCk7CiAgICB9CiAgICB2YXIgc3ZjID0gcmVxdWlyZSgnc2VydmljZS1tYW5hZ2VyJykubWFuYWdlci5nZXRTZXJ2aWNlKHByb2Nlc3MucGxhdGZvcm09PSd3aW4zMic/J01lc2ggQWdlbnQnOidtZXNoYWdlbnQnKTsKICAgIGlmIChwcm9jZXNzLnBsYXRmb3JtID09ICdkYXJ3aW4nKQogICAgewogICAgICAgIHN2Yy5sb2FkKCk7CiAgICAgICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoJyAgIC0+IHNldHRpbmcgdXAgbGF1bmNoIGFnZW50Li4uJyk7CiAgICAgICAgdHJ5CiAgICAgICAgewogICAgICAgICAgICByZXF1aXJlKCdzZXJ2aWNlLW1hbmFnZXInKS5tYW5hZ2VyLmluc3RhbGxMYXVuY2hBZ2VudCgKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBuYW1lOiAnbWVzaGFnZW50JywKICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlUGF0aDogc3ZjLmFwcExvY2F0aW9uKCksCiAgICAgICAgICAgICAgICAgICAgc3RhcnRUeXBlOiAnQVVUT19TVEFSVCcsCiAgICAgICAgICAgICAgICAgICAgc2Vzc2lvblR5cGVzOiBbJ0xvZ2luV2luZG93J10sCiAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyczogWycta3ZtMSddCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoJyBbRE9ORV1cbicpOwogICAgICAgIH0KICAgICAgICBjYXRjaCAoc2llKQogICAgICAgIHsKICAgICAgICAgICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoJyBbRVJST1JdICcgKyBzaWUpOwogICAgICAgIH0KICAgIH0KCgogICAgaWYocHJvY2Vzcy5wbGF0Zm9ybSA9PSAnd2luMzInKQogICAgewogICAgICAgIHZhciBsb2MgPSBzdmMuYXBwTG9jYXRpb24oKTsKICAgICAgICBwcm9jZXNzLnN0ZG91dC53cml0ZSgnICAgLT4gV3JpdGluZyBmaXJld2FsbCBydWxlcyBmb3IgTWVzaCBBZ2VudCBTZXJ2aWNlLi4uJyk7CgogICAgICAgIHZhciBydWxlID0gCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIERpc3BsYXlOYW1lOiAnTWVzaCBBZ2VudCBNYW5hZ2VtZW50IFRyYWZmaWMgKFRDUC0xKScsCiAgICAgICAgICAgICAgICBkaXJlY3Rpb246ICdpbmJvdW5kJywKICAgICAgICAgICAgICAgIFByb2dyYW06IGxvYywKICAgICAgICAgICAgICAgIFByb3RvY29sOiAnVENQJywKICAgICAgICAgICAgICAgIFByb2ZpbGU6ICdQdWJsaWMsIFByaXZhdGUsIERvbWFpbicsCiAgICAgICAgICAgICAgICBMb2NhbFBvcnQ6IDE2OTkwLAogICAgICAgICAgICAgICAgRGVzY3JpcHRpb246ICdNZXNoIENlbnRyYWwgQWdlbnQgTWFuYWdlbWVudCBUcmFmZmljJywKICAgICAgICAgICAgICAgIEVkZ2VUcmF2ZXJzYWxQb2xpY3k6ICdhbGxvdycsCiAgICAgICAgICAgICAgICBFbmFibGVkOiB0cnVlCiAgICAgICAgICAgIH07CiAgICAgICAgcmVxdWlyZSgnd2luLWZpcmV3YWxsJykuYWRkRmlyZXdhbGxSdWxlKHJ1bGUpOwoKICAgICAgICBydWxlID0gCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIERpc3BsYXlOYW1lOiAnTWVzaCBBZ2VudCBNYW5hZ2VtZW50IFRyYWZmaWMgKFRDUC0yKScsCiAgICAgICAgICAgICAgICBkaXJlY3Rpb246ICdpbmJvdW5kJywKICAgICAgICAgICAgICAgIFByb2dyYW06IGxvYywKICAgICAgICAgICAgICAgIFByb3RvY29sOiAnVENQJywKICAgICAgICAgICAgICAgIFByb2ZpbGU6ICdQdWJsaWMsIFByaXZhdGUsIERvbWFpbicsCiAgICAgICAgICAgICAgICBMb2NhbFBvcnQ6IDE2OTkxLAogICAgICAgICAgICAgICAgRGVzY3JpcHRpb246ICdNZXNoIENlbnRyYWwgQWdlbnQgTWFuYWdlbWVudCBUcmFmZmljJywKICAgICAgICAgICAgICAgIEVkZ2VUcmF2ZXJzYWxQb2xpY3k6ICdhbGxvdycsCiAgICAgICAgICAgICAgICBFbmFibGVkOiB0cnVlCiAgICAgICAgICAgIH07CiAgICAgICAgcmVxdWlyZSgnd2luLWZpcmV3YWxsJykuYWRkRmlyZXdhbGxSdWxlKHJ1bGUpOyAKCiAgICAgICAgcnVsZSA9CiAgICAgICAgewogICAgICAgICAgICBEaXNwbGF5TmFtZTogJ01lc2ggQWdlbnQgUGVlci10by1QZWVyIFRyYWZmaWMgKFVEUC0xKScsCiAgICAgICAgICAgIGRpcmVjdGlvbjogJ2luYm91bmQnLAogICAgICAgICAgICBQcm9ncmFtOiBsb2MsCiAgICAgICAgICAgIFByb3RvY29sOiAnVURQJywKICAgICAgICAgICAgUHJvZmlsZTogJ1B1YmxpYywgUHJpdmF0ZSwgRG9tYWluJywKICAgICAgICAgICAgTG9jYWxQb3J0OiAxNjk5MCwKICAgICAgICAgICAgRGVzY3JpcHRpb246ICdNZXNoIENlbnRyYWwgQWdlbnQgUGVlci10by1QZWVyIFRyYWZmaWMnLAogICAgICAgICAgICBFZGdlVHJhdmVyc2FsUG9saWN5OiAnYWxsb3cnLAogICAgICAgICAgICBFbmFibGVkOiB0cnVlCiAgICAgICAgfTsKICAgICAgICByZXF1aXJlKCd3aW4tZmlyZXdhbGwnKS5hZGRGaXJld2FsbFJ1bGUocnVsZSk7CgogICAgICAgIHJ1bGUgPQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBEaXNwbGF5TmFtZTogJ01lc2ggQWdlbnQgUGVlci10by1QZWVyIFRyYWZmaWMgKFVEUC0yKScsCiAgICAgICAgICAgICAgICBkaXJlY3Rpb246ICdpbmJvdW5kJywKICAgICAgICAgICAgICAgIFByb2dyYW06IGxvYywKICAgICAgICAgICAgICAgIFByb3RvY29sOiAnVURQJywKICAgICAgICAgICAgICAgIFByb2ZpbGU6ICdQdWJsaWMsIFByaXZhdGUsIERvbWFpbicsCiAgICAgICAgICAgICAgICBMb2NhbFBvcnQ6IDE2OTkxLAogICAgICAgICAgICAgICAgRGVzY3JpcHRpb246ICdNZXNoIENlbnRyYWwgQWdlbnQgUGVlci10by1QZWVyIFRyYWZmaWMnLAogICAgICAgICAgICAgICAgRWRnZVRyYXZlcnNhbFBvbGljeTogJ2FsbG93JywKICAgICAgICAgICAgICAgIEVuYWJsZWQ6IHRydWUKICAgICAgICAgICAgfTsKICAgICAgICByZXF1aXJlKCd3aW4tZmlyZXdhbGwnKS5hZGRGaXJld2FsbFJ1bGUocnVsZSk7CiAgICAgICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoJyBbRE9ORV1cbicpOwogICAgfQogICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoJyAgIC0+IFN0YXJ0aW5nIHNlcnZpY2UuLi4nKTsKICAgIHRyeQogICAgewogICAgICAgIHN2Yy5zdGFydCgpOwogICAgICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKCcgW09LXVxuJyk7CiAgICB9CiAgICBjYXRjaChlZSkKICAgIHsKICAgICAgICBwcm9jZXNzLnN0ZG91dC53cml0ZSgnIFtFUlJPUl1cbicpOwogICAgfQoKICAgIGlmIChwcm9jZXNzLnBsYXRmb3JtID09ICd3aW4zMicpIHsgc3ZjLmNsb3NlKCk7IH0KICAgIHByb2Nlc3MuZXhpdCgpOwp9CmZ1bmN0aW9uIHVuaW5zdGFsbFNlcnZpY2UyKHBhcmFtcykKewogICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoJyAgIC0+IFVuaW5zdGFsbGluZyBwcmV2aW91cyBpbnN0YWxsYXRpb24uLi4nKTsKICAgIHRyeQogICAgewogICAgICAgIHJlcXVpcmUoJ3NlcnZpY2UtbWFuYWdlcicpLm1hbmFnZXIudW5pbnN0YWxsU2VydmljZShwcm9jZXNzLnBsYXRmb3JtID09ICd3aW4zMicgPyAnTWVzaCBBZ2VudCcgOiAnbWVzaGFnZW50Jyk7CiAgICAgICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoJyBbRE9ORV1cbicpOwogICAgfQogICAgY2F0Y2ggKGUpCiAgICB7CiAgICAgICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoJyBbRVJST1JdXG4nKTsKICAgIH0KICAgIGlmIChwcm9jZXNzLnBsYXRmb3JtID09ICdkYXJ3aW4nKQogICAgewogICAgICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKCcgICAtPiBVbmluc3RhbGxpbmcgbGF1bmNoIGFnZW50Li4uJyk7CiAgICAgICAgdHJ5CiAgICAgICAgewogICAgICAgICAgICB2YXIgbGF1bmNoYWdlbnQgPSByZXF1aXJlKCdzZXJ2aWNlLW1hbmFnZXInKS5tYW5hZ2VyLmdldExhdW5jaEFnZW50KCdtZXNoYWdlbnQnKTsKICAgICAgICAgICAgbGF1bmNoYWdlbnQudW5sb2FkKCk7CiAgICAgICAgICAgIHJlcXVpcmUoJ2ZzJykudW5saW5rU3luYyhsYXVuY2hhZ2VudC5wbGlzdCk7CiAgICAgICAgICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKCcgW0RPTkVdXG4nKTsKICAgICAgICB9CiAgICAgICAgY2F0Y2ggKGUpCiAgICAgICAgewogICAgICAgICAgICBwcm9jZXNzLnN0ZG91dC53cml0ZSgnIFtFUlJPUl1cbicpOwogICAgICAgIH0KICAgIH0KICAgIGlmIChwYXJhbXMgIT0gbnVsbCkKICAgIHsKICAgICAgICBpbnN0YWxsU2VydmljZShwYXJhbXMpOwogICAgfQogICAgZWxzZQogICAgewogICAgICAgIHByb2Nlc3MuZXhpdCgpOwogICAgfQp9CmZ1bmN0aW9uIHVuaW5zdGFsbFNlcnZpY2UocGFyYW1zKQp7CiAgICB2YXIgc3ZjID0gcmVxdWlyZSgnc2VydmljZS1tYW5hZ2VyJykubWFuYWdlci5nZXRTZXJ2aWNlKHByb2Nlc3MucGxhdGZvcm0gPT0gJ3dpbjMyJyA/ICdNZXNoIEFnZW50JyA6ICdtZXNoYWdlbnQnKTsKICAgIGlmIChzdmMuaXNSdW5uaW5nKCkpCiAgICB7CiAgICAgICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoJyAgIC0+IFN0b3BwaW5nIFNlcnZpY2UuLi4nKTsKICAgICAgICBpZihwcm9jZXNzLnBsYXRmb3JtPT0nd2luMzInKQogICAgICAgIHsKICAgICAgICAgICAgc3ZjLnN0b3AoKS50aGVuKGZ1bmN0aW9uICgpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKCcgW1NUT1BQRURdXG4nKTsKICAgICAgICAgICAgICAgIHN2Yy5jbG9zZSgpOwogICAgICAgICAgICAgICAgdW5pbnN0YWxsU2VydmljZTIodGhpcy5fcGFyYW1zKTsKICAgICAgICAgICAgfSwgZnVuY3Rpb24gKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoJyBbRVJST1JdXG4nKTsKICAgICAgICAgICAgICAgIHN2Yy5jbG9zZSgpOwogICAgICAgICAgICAgICAgdW5pbnN0YWxsU2VydmljZTIodGhpcy5fcGFyYW1zKTsKICAgICAgICAgICAgfSkucGFyZW50UHJvbWlzZS5fcGFyYW1zID0gcGFyYW1zOwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICBpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PSAnZGFyd2luJykNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBzdmMudW5sb2FkKCk7DQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBzdmMuc3RvcCgpOw0KICAgICAgICAgICAgfQogICAgICAgICAgICBwcm9jZXNzLnN0ZG91dC53cml0ZSgnIFtTVE9QUEVEXVxuJyk7CiAgICAgICAgICAgIHVuaW5zdGFsbFNlcnZpY2UyKHBhcmFtcyk7CiAgICAgICAgfQogICAgfQogICAgZWxzZQogICAgewogICAgICAgIGlmIChwcm9jZXNzLnBsYXRmb3JtID09ICd3aW4zMicpIHsgc3ZjLmNsb3NlKCk7IH0KICAgICAgICB1bmluc3RhbGxTZXJ2aWNlMihwYXJhbXMpOwogICAgfQp9CmZ1bmN0aW9uIHNlcnZpY2VFeGlzdHMobG9jLCBwYXJhbXMpCnsKICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKCcgW0ZPVU5EOiAnICsgbG9jICsgJ11cbicpOwogICAgaWYocHJvY2Vzcy5wbGF0Zm9ybSA9PSAnd2luMzInKQogICAgewogICAgICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKCcgICAtPiBDaGVja2luZyBmaXJld2FsbCBydWxlcyBmb3IgcHJldmlvdXMgaW5zdGFsbGF0aW9uLi4uJyk7CiAgICAgICAgcmVxdWlyZSgnd2luLWZpcmV3YWxsJykucmVtb3ZlRmlyZXdhbGxSdWxlKHsgcHJvZ3JhbTogbG9jIH0pLnRoZW4oZnVuY3Rpb24gKCkKICAgICAgICB7CiAgICAgICAgICAgIC8vIFNVQ0NFU1MKICAgICAgICAgICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoJyBbREVMRVRFRF1cbicpOwogICAgICAgICAgICB1bmluc3RhbGxTZXJ2aWNlKHRoaXMuX3BhcmFtcyk7CiAgICAgICAgfSwgZnVuY3Rpb24gKCkKICAgICAgICB7CiAgICAgICAgICAgIC8vIEZBSUxFRAogICAgICAgICAgICBwcm9jZXNzLnN0ZG91dC53cml0ZSgnIFtObyBSdWxlcyBGb3VuZF1cbicpOwogICAgICAgICAgICB1bmluc3RhbGxTZXJ2aWNlKHRoaXMuX3BhcmFtcyk7CiAgICAgICAgfSkucGFyZW50UHJvbWlzZS5fcGFyYW1zID0gcGFyYW1zOwogICAgfQogICAgZWxzZQogICAgewogICAgICAgIHVuaW5zdGFsbFNlcnZpY2UocGFyYW1zKTsKICAgIH0KfQoKZnVuY3Rpb24gZnVsbFVuaW5zdGFsbCgpCnsKICAgIGNvbnNvbGUuc2V0RGVzdGluYXRpb24oY29uc29sZS5EZXN0aW5hdGlvbnMuRElTQUJMRUQpOwoKICAgIHRyeQogICAgewogICAgICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKCcuLi5DaGVja2luZyBmb3IgcHJldmlvdXMgaW5zdGFsbGF0aW9uJyk7CiAgICAgICAgdmFyIHMgPSByZXF1aXJlKCdzZXJ2aWNlLW1hbmFnZXInKS5tYW5hZ2VyLmdldFNlcnZpY2UocHJvY2Vzcy5wbGF0Zm9ybSA9PSAnd2luMzInID8gJ01lc2ggQWdlbnQnIDogJ21lc2hhZ2VudCcpOwogICAgICAgIHZhciBsb2MgPSBzLmFwcExvY2F0aW9uKCk7CiAgICAgICAgcy5jbG9zZSgpOwogICAgfQogICAgY2F0Y2ggKGUpCiAgICB7CiAgICAgICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoJyBbTk9ORV1cbicpOwogICAgICAgIHByb2Nlc3MuZXhpdCgpOwogICAgfQogICAgc2VydmljZUV4aXN0cyhsb2MsIG51bGwpOwp9CgpmdW5jdGlvbiBmdWxsSW5zdGFsbChqc29uU3RyaW5nKQp7CiAgICBjb25zb2xlLnNldERlc3RpbmF0aW9uKGNvbnNvbGUuRGVzdGluYXRpb25zLkRJU0FCTEVEKTsKICAgIHZhciBwYXJtcyA9IEpTT04ucGFyc2UoanNvblN0cmluZyk7CgogICAgdHJ5CiAgICB7CiAgICAgICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoJy4uLkNoZWNraW5nIGZvciBwcmV2aW91cyBpbnN0YWxsYXRpb24nKTsKICAgICAgICB2YXIgcyA9IHJlcXVpcmUoJ3NlcnZpY2UtbWFuYWdlcicpLm1hbmFnZXIuZ2V0U2VydmljZShwcm9jZXNzLnBsYXRmb3JtID09ICd3aW4zMicgPyAnTWVzaCBBZ2VudCcgOiAnbWVzaGFnZW50Jyk7CiAgICAgICAgdmFyIGxvYyA9IHMuYXBwTG9jYXRpb24oKTsKICAgICAgICBzLmNsb3NlKCk7CiAgICB9CiAgICBjYXRjaCAoZSkKICAgIHsKICAgICAgICBwcm9jZXNzLnN0ZG91dC53cml0ZSgnIFtOT05FXVxuJyk7CiAgICAgICAgaW5zdGFsbFNlcnZpY2UocGFybXMpOwogICAgICAgIHJldHVybjsKICAgIH0KICAgIHNlcnZpY2VFeGlzdHMobG9jLCBwYXJtcyk7Cn0KCgptb2R1bGUuZXhwb3J0cyA9CiAgICB7CiAgICAgICAgZnVsbEluc3RhbGw6IGZ1bGxJbnN0YWxsLAogICAgICAgIGZ1bGxVbmluc3RhbGw6IGZ1bGxVbmluc3RhbGwKICAgIH07', 'base64').toString());"); - +#ifdef __APPLE__ + duk_peval_string_noresult(ctx, "addModule('mac-powerutil', Buffer.from('LyoKQ29weXJpZ2h0IDIwMjAgSW50ZWwgQ29ycG9yYXRpb24KCkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwp5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQpkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZApsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKi8KCmZ1bmN0aW9uIHBvd2VydXRpbCgpCnsKICAgIHRoaXMuX09iamVjdElEID0gJ21hYy1wb3dlcnV0aWwnOwoKICAgIHRoaXMuc2xlZXAgPSBmdW5jdGlvbiBzbGVlcCgpCiAgICB7DQogICAgICAgIHZhciBjaGlsZDsNCiAgICAgICAgc3dpdGNoIChwcm9jZXNzLnBsYXRmb3JtKQ0KICAgICAgICB7DQogICAgICAgICAgICBjYXNlICdkYXJ3aW4nOg0KICAgICAgICAgICAgICAgIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsKICAgICAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IHRoaXMuc3RyICs9IGNodW5rLnRvU3RyaW5nKCk7IH0pOwogICAgICAgICAgICAgICAgY2hpbGQuc3RkZXJyLnN0ciA9ICcnOyBjaGlsZC5zdGRlcnIub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgdGhpcy5zdHIgKz0gY2h1bmsudG9TdHJpbmcoKTsgfSk7CiAgICAgICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgnb3Nhc2NyaXB0IC1lIFwndGVsbCBhcHBsaWNhdGlvbiAiU3lzdGVtIEV2ZW50cyIgdG8gc2xlZXBcJ1xuZXhpdFxuJyk7CiAgICAgICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOw0KICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgZGVmYXVsdDoNCiAgICAgICAgICAgICAgICB0aHJvdyAoJ3NsZWVwKCkgbm90IGltcGxlbWVudGVkIG9uIHRoaXMgcGxhdGZvcm0nKTsNCiAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgfQ0KICAgIH0KICAgIHRoaXMucmVzdGFydCA9IGZ1bmN0aW9uIHJlc3RhcnQoKQogICAgew0KICAgICAgICB2YXIgY2hpbGQ7DQogICAgICAgIHN3aXRjaChwcm9jZXNzLnBsYXRmb3JtKQ0KICAgICAgICB7DQogICAgICAgICAgICBjYXNlICdkYXJ3aW4nOg0KICAgICAgICAgICAgICAgIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsKICAgICAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IHRoaXMuc3RyICs9IGNodW5rLnRvU3RyaW5nKCk7IH0pOwogICAgICAgICAgICAgICAgY2hpbGQuc3RkZXJyLnN0ciA9ICcnOyBjaGlsZC5zdGRlcnIub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgdGhpcy5zdHIgKz0gY2h1bmsudG9TdHJpbmcoKTsgfSk7CiAgICAgICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgnc2h1dGRvd24gLXIgbm93XG4nKTsKICAgICAgICAgICAgICAgIGNoaWxkLndhaXRFeGl0KCk7DQogICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICBkZWZhdWx0Og0KICAgICAgICAgICAgICAgIHRocm93ICgncmVzdGFydCgpIG5vdCBpbXBsZW1lbnRlZCBvbiB0aGlzIHBsYXRmb3JtJyk7DQogICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgIH0NCiAgICB9CiAgICB0aGlzLnNodXRkb3duID0gZnVuY3Rpb24gc2h1dGRvd24oKQogICAgew0KICAgICAgICB2YXIgY2hpbGQ7DQogICAgICAgIHN3aXRjaCAocHJvY2Vzcy5wbGF0Zm9ybSkNCiAgICAgICAgew0KICAgICAgICAgICAgY2FzZSAnZGFyd2luJzoNCiAgICAgICAgICAgICAgICBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7CiAgICAgICAgICAgICAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7IGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB0aGlzLnN0ciArPSBjaHVuay50b1N0cmluZygpOyB9KTsKICAgICAgICAgICAgICAgIGNoaWxkLnN0ZGVyci5zdHIgPSAnJzsgY2hpbGQuc3RkZXJyLm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IHRoaXMuc3RyICs9IGNodW5rLnRvU3RyaW5nKCk7IH0pOwogICAgICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoJ3NodXRkb3duIC1oIG5vd1xuJyk7CiAgICAgICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOw0KICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgZGVmYXVsdDoNCiAgICAgICAgICAgICAgICB0aHJvdyAoJ3NodXRkb3duKCkgbm90IGltcGxlbWVudGVkIG9uIHRoaXMgcGxhdGZvcm0nKTsNCiAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgfQ0KICAgIH0KfQoKbW9kdWxlLmV4cG9ydHMgPSBuZXcgcG93ZXJ1dGlsKCk7', 'base64').toString());"); +#endif } void ILibDuktape_ChainViewer_PostSelect(void* object, int slct, fd_set *readset, fd_set *writeset, fd_set *errorset) diff --git a/modules/mac-powerutil.js b/modules/mac-powerutil.js new file mode 100644 index 0000000..df898b8 --- /dev/null +++ b/modules/mac-powerutil.js @@ -0,0 +1,74 @@ +/* +Copyright 2020 Intel Corporation + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +function powerutil() +{ + this._ObjectID = 'mac-powerutil'; + + this.sleep = function sleep() + { + var child; + switch (process.platform) + { + case 'darwin': + child = require('child_process').execFile('/bin/sh', ['sh']); + child.stdout.str = ''; child.stdout.on('data', function (chunk) { this.str += chunk.toString(); }); + child.stderr.str = ''; child.stderr.on('data', function (chunk) { this.str += chunk.toString(); }); + child.stdin.write('osascript -e \'tell application "System Events" to sleep\'\nexit\n'); + child.waitExit(); + break; + default: + throw ('sleep() not implemented on this platform'); + break; + } + } + this.restart = function restart() + { + var child; + switch(process.platform) + { + case 'darwin': + child = require('child_process').execFile('/bin/sh', ['sh']); + child.stdout.str = ''; child.stdout.on('data', function (chunk) { this.str += chunk.toString(); }); + child.stderr.str = ''; child.stderr.on('data', function (chunk) { this.str += chunk.toString(); }); + child.stdin.write('shutdown -r now\n'); + child.waitExit(); + break; + default: + throw ('restart() not implemented on this platform'); + break; + } + } + this.shutdown = function shutdown() + { + var child; + switch (process.platform) + { + case 'darwin': + child = require('child_process').execFile('/bin/sh', ['sh']); + child.stdout.str = ''; child.stdout.on('data', function (chunk) { this.str += chunk.toString(); }); + child.stderr.str = ''; child.stderr.on('data', function (chunk) { this.str += chunk.toString(); }); + child.stdin.write('shutdown -h now\n'); + child.waitExit(); + break; + default: + throw ('shutdown() not implemented on this platform'); + break; + } + } +} + +module.exports = new powerutil(); \ No newline at end of file