diff --git a/meshcore/agentcore.c b/meshcore/agentcore.c index 5cd738e..37bf9da 100644 --- a/meshcore/agentcore.c +++ b/meshcore/agentcore.c @@ -4027,10 +4027,16 @@ int MeshAgent_AgentMode(MeshAgentHostContainer *agentHost, int paramLen, char ** int ixr = 0; int installFlag = 0; + int fetchstate = 0; + for (ri = 0; ri < paramLen; ++ri) { int len = (int)strnlen_s(param[ri], 4096); int ix; + if (strcmp("-state", param[ri]) == 0) + { + fetchstate = 1; + } if (strcmp("-finstall", param[ri]) == 0 || strcmp("-fullinstall", param[ri]) == 0) { installFlag = 1; @@ -4060,7 +4066,13 @@ int MeshAgent_AgentMode(MeshAgentHostContainer *agentHost, int paramLen, char ** } } paramLen -= ixr; - if (installFlag != 0) + if (fetchstate != 0) + { + duk_context *ctxx = ILibDuktape_ScriptContainer_InitializeJavaScriptEngineEx(0, 0, agentHost->chain, NULL, NULL, agentHost->exePath, NULL, MeshAgent_AgentInstallerCTX_Finalizer, agentHost->chain); + duk_eval_string(ctxx, "require('_agentStatus').start();"); + return(1); + } + else if (installFlag != 0) { int bufLen = 0; char *buf; diff --git a/meshservice/ServiceMain.c b/meshservice/ServiceMain.c index 8a7f388..b0471a6 100644 --- a/meshservice/ServiceMain.c +++ b/meshservice/ServiceMain.c @@ -527,7 +527,8 @@ int wmain(int argc, char* wargv[]) if (argc > 1 && (strcasecmp(argv[1], "-finstall") == 0 || strcasecmp(argv[1], "-funinstall") == 0 || strcasecmp(argv[1], "-fulluninstall") == 0 || strcasecmp(argv[1], "-fullinstall") == 0 || - strcasecmp(argv[1], "-install")==0 || strcasecmp(argv[1], "-uninstall") == 0)) + strcasecmp(argv[1], "-install")==0 || strcasecmp(argv[1], "-uninstall") == 0) || + strcasecmp(argv[1], "-state") == 0) { argv[argc] = argv[1]; argv[1] = (char*)ILibMemory_SmartAllocate(4); diff --git a/microscript/ILibDuktape_Polyfills.c b/microscript/ILibDuktape_Polyfills.c index be18085..5ca8332 100644 --- a/microscript/ILibDuktape_Polyfills.c +++ b/microscript/ILibDuktape_Polyfills.c @@ -2195,6 +2195,9 @@ void ILibDuktape_Polyfills_JS_Init(duk_context *ctx) // Mesh Agent NodeID helper, refer to modules/_agentNodeId.js duk_peval_string_noresult(ctx, "addModule('_agentNodeId', Buffer.from('LyoKQ29weXJpZ2h0IDIwMTkgSW50ZWwgQ29ycG9yYXRpb24KCkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwp5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQpkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZApsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKi8KCmZ1bmN0aW9uIF9tZXNoTm9kZUlkKCkKewogICAgdmFyIHJldCA9ICcnOwogICAgc3dpdGNoIChwcm9jZXNzLnBsYXRmb3JtKQogICAgewogICAgICAgIGNhc2UgJ2xpbnV4JzoKICAgICAgICBjYXNlICdkYXJ3aW4nOgogICAgICAgICAgICB0cnkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIGRiID0gcmVxdWlyZSgnU2ltcGxlRGF0YVN0b3JlJykuQ3JlYXRlKHByb2Nlc3MuZXhlY1BhdGggKyAnLmRiJywgeyByZWFkT25seTogdHJ1ZSB9KTsKICAgICAgICAgICAgICAgIHJldCA9IHJlcXVpcmUoJ3RscycpLmxvYWRDZXJ0aWZpY2F0ZSh7IHBmeDogZGIuR2V0QnVmZmVyKCdTZWxmTm9kZUNlcnQnKSwgcGFzc3BocmFzZTogJ2hpZGRlbicgfSkuZ2V0S2V5SGFzaCgpLnRvU3RyaW5nKCdoZXgnKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjYXRjaChlKQogICAgICAgICAgICB7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAnd2luMzInOgogICAgICAgICAgICAvLyBGaXJzdCBDaGVjayBpZiB0aGUgZGIgQ29udGFpbnMgdGhlIE5vZGVJRAogICAgICAgICAgICB0cnkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIGRiID0gcmVxdWlyZSgnU2ltcGxlRGF0YVN0b3JlJykuQ3JlYXRlKHByb2Nlc3MuZXhlY1BhdGgucmVwbGFjZSgnLmV4ZScsICcuZGInKSwgeyByZWFkT25seTogdHJ1ZSB9KTsKICAgICAgICAgICAgICAgIHZhciB2ID0gZGIuR2V0QnVmZmVyKCdTZWxmTm9kZUNlcnQnKTsKICAgICAgICAgICAgICAgIGlmICh2KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRyeQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gcmVxdWlyZSgndGxzJykubG9hZENlcnRpZmljYXRlKHsgcGZ4OiB2LCBwYXNzcGhyYXNlOiAnaGlkZGVuJyB9KS5nZXRLZXlIYXNoKCkudG9TdHJpbmcoJ2hleCcpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBjYXRjaChlKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdiA9IG51bGw7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHYgPT0gbnVsbCAmJiAodiA9IGRiLkdldEJ1ZmZlcignTm9kZUlEJykpICE9IG51bGwpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcmV0ID0gdi50b1N0cmluZygnaGV4Jyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2F0Y2ggKGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICBicmVhazsKICAgIH0KICAgIHJldHVybiAocmV0KTsKfQoKbW9kdWxlLmV4cG9ydHMgPSBfbWVzaE5vZGVJZDsKCv==', 'base64').toString());"); + // Mesh Agent Status Helper, refer to modules/_agentStatus.js + duk_peval_string_noresult(ctx, "addModule('_agentStatus', Buffer.from('DQp2YXIgcHJvbWlzZSA9IHJlcXVpcmUoJ3Byb21pc2UnKTsNCnZhciBub2RlaWQgPSByZXF1aXJlKCdfYWdlbnROb2RlSWQnKSgpOw0KdmFyIGlwY1BhdGggPSBwcm9jZXNzLnBsYXRmb3JtID09ICd3aW4zMicgPyAoJ1xcXFwuXFxwaXBlXFwnICsgbm9kZWlkICsgJy1EQUlQQycpIDogKHByb2Nlc3MuY3dkKCkgKyAnL0RBSVBDJyk7DQoNCmZ1bmN0aW9uIHF1ZXJ5QWdlbnQob2JqKQ0Kew0KICAgIHZhciByZXQgPSBuZXcgcHJvbWlzZShmdW5jdGlvbiAocmVzLCByZWopIHsgdGhpcy5fcmVzID0gcmVzOyB0aGlzLl9yZWogPSByZWo7IH0pOw0KICAgIHJldC5fb2JqID0geyBjbWQ6ICdxdWVyeScsIHZhbHVlOiBvYmogfTsNCiAgICByZXQuY2xpZW50ID0gcmVxdWlyZSgnbmV0JykuY3JlYXRlQ29ubmVjdGlvbih7IHBhdGg6IGlwY1BhdGggfSk7DQogICAgcmV0LmNsaWVudC5wcm9taXNlID0gcmV0Ow0KICAgIHJldC5jbGllbnQub24oJ2Nvbm5lY3QnLCBmdW5jdGlvbiAoKQ0KICAgIHsNCiAgICAgICAgdGhpcy5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykNCiAgICAgICAgew0KICAgICAgICAgICAgdmFyIGxlbjsNCiAgICAgICAgICAgIGlmIChjaHVuay5sZW5ndGggPCA0KSB7IHRoaXMudW5zaGlmdChjaHVuayk7IHJldHVybjsgfQ0KICAgICAgICAgICAgaWYgKChsZW4gPSBjaHVuay5yZWFkVUludDMyTEUoMCkpID4gY2h1bmsubGVuZ3RoKSB7IHRoaXMudW5zaGlmdChjaHVuayk7IHJldHVybjt9DQoNCiAgICAgICAgICAgIHZhciBkYXRhID0gY2h1bmsuc2xpY2UoNCwgbGVuICsgNCk7DQogICAgICAgICAgICB2YXIgcGF5bG9hZCA9IG51bGw7DQogICAgICAgICAgICB0cnkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBwYXlsb2FkID0gSlNPTi5wYXJzZShkYXRhLnRvU3RyaW5nKCkpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgY2F0Y2ggKGUpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdGhpcy5wcm9taXNlLl9yZWooJ0ludmFsaWQgUmVzcG9uc2UgUmVjZWl2ZWQnKTsNCiAgICAgICAgICAgICAgICByZXR1cm47DQogICAgICAgICAgICB9DQogICAgICAgICAgICB0cnkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAvL3RoaXMucHJvbWlzZS5fcmVzKHBheWxvYWQucmVzdWx0P3BheWxvYWQucmVzdWx0OicnKTsNCiAgICAgICAgICAgICAgICB0aGlzLnByb21pc2UuX3JlcyhwYXlsb2FkLnJlc3VsdCk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBjYXRjaCh4KQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgaWYgKChsZW4gKyA0KSA8IGNodW5rLmxlbmd0aCkgeyB0aGlzLnVuc2hpZnQoY2h1bmsuc2xpY2UoNCArIGxlbikpOyB9DQogICAgICAgIH0pOw0KICAgICAgICB0aGlzLm9uKCdlbmQnLCBmdW5jdGlvbiAoKQ0KICAgICAgICB7DQogICAgICAgICAgICB0aGlzLnByb21pc2UuX3JlaignY2xvc2VkJyk7DQogICAgICAgIH0pOw0KDQogICAgICAgIHZhciBqID0gQnVmZmVyLmZyb20oSlNPTi5zdHJpbmdpZnkodGhpcy5wcm9taXNlLl9vYmopKTsNCiAgICAgICAgdmFyIGJ1ZiA9IEJ1ZmZlci5hbGxvYyg0ICsgai5sZW5ndGgpOw0KICAgICAgICBidWYud3JpdGVVSW50MzJMRShqLmxlbmd0aCArIDQsIDApOw0KICAgICAgICBqLmNvcHkoYnVmLCA0KTsNCiAgICAgICAgdGhpcy53cml0ZShidWYpOw0KICAgIH0pOw0KICAgIHJldHVybiAocmV0KTsNCn0NCg0KZnVuY3Rpb24gc3RhcnQoKQ0Kew0KICAgIGNvbnNvbGUubG9nKCdRdWVyeWluZyBNZXNoIEFnZW50IHN0YXRlLi4uJyk7DQogICAgZ2xvYmFsLl9zdGF0dXN0bSA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkNCiAgICB7DQogICAgICAgIGNvbnNvbGUubG9nKCdVbmFibGUgdG8gY29udGFjdCBNZXNoIEFnZW50Li4uJyk7DQogICAgICAgIHByb2Nlc3MuX2V4aXQoKTsNCiAgICB9LCAzMDAwKTsNCg0KICAgIHF1ZXJ5QWdlbnQoJ2Nvbm5lY3Rpb24nKS50aGVuKGZ1bmN0aW9uIChyZXMpDQogICAgew0KICAgICAgICBpZiAocmVzID09IG51bGwpIHsgcmVzID0gJ1tOT1QgQ09OTkVDVEVEXSc7IH0NCiAgICAgICAgY29uc29sZS5sb2coJ01lc2ggQWdlbnQgY29ubmVjdGVkIHRvOiAnICsgcmVzKTsNCiAgICAgICAgcmV0dXJuIChxdWVyeUFnZW50KCdkZXNjcmlwdG9ycycpKTsNCiAgICB9KS50aGVuKGNvbnNvbGUubG9nKS50aGVuKGZ1bmN0aW9uICgpIHsgcHJvY2Vzcy5fZXhpdCgpOyB9KS5jYXRjaChmdW5jdGlvbiAoKSB7IHByb2Nlc3MuX2V4aXQoKTsgfSk7DQp9DQoNCm1vZHVsZS5leHBvcnRzID0geyBzdGFydDogc3RhcnQgfTs=', 'base64').toString());"); + // Task Scheduler, refer to modules/task-scheduler.js char *_taskscheduler = ILibMemory_Allocate(63464, 0, NULL, NULL); memcpy_s(_taskscheduler + 0, 36264, "LyoNCkNvcHlyaWdodCAyMDE5IEludGVsIENvcnBvcmF0aW9uDQoNCkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQoNCiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCg0KVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQoqLw0KDQp2YXIgcHJvbWlzZSA9IHJlcXVpcmUoJ3Byb21pc2UnKTsNCnZhciBzZXJ2aWNlbWFuYWdlciA9IHJlcXVpcmUoJ3NlcnZpY2UtbWFuYWdlcicpOw0KdmFyIG1nciA9IG5ldyBzZXJ2aWNlbWFuYWdlcigpOw0KDQovL2F0dGFjaERlYnVnZ2VyKHsgd2VicG9ydDogOTk5NSwgd2FpdDogMSB9KS50aGVuKGNvbnNvbGUubG9nKTsNCg0KZnVuY3Rpb24gdGFzaygpDQp7DQogICAgdGhpcy5fT2JqZWN0SUQgPSAndGFzay1zY2hlZHVsZXInOw0KDQogICAgaWYgKHByb2Nlc3MucGxhdGZvcm0gPT0gJ3dpbjMyJykNCiAgICB7DQogICAgICAgIHRoaXMuZ2V0VGFza1htbCA9IGZ1bmN0aW9uIGdldFRhc2tYbWwobmFtZSkNCiAgICAgICAgew0KICAgICAgICAgICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKHByb2Nlc3MuZW52Wyd3aW5kaXInXSArICdcXHN5c3RlbTMyXFxzY2h0YXNrcy5leGUnLCBbJ3NjaHRhc2tzJywgJy9RVUVSWScsICcvVE4gJyArIG5hbWUsICcvWE1MJ10pOw0KICAgICAgICAgICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOyBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoYykgeyB0aGlzLnN0ciArPSBjLnRvU3RyaW5nKCk7IH0pOw0KICAgICAgICAgICAgY2hpbGQuc3RkZXJyLnN0ciA9ICcnOyBjaGlsZC5zdGRlcnIub24oJ2RhdGEnLCBmdW5jdGlvbiAoYykgeyB0aGlzLnN0ciArPSBjLnRvU3RyaW5nKCk7IH0pOw0KICAgICAgICAgICAgY2hpbGQud2FpdEV4aXQoKTsNCiAgICAgICAgICAgIGlmIChjaGlsZC5zdGRlcnIuc3RyLnRyaW0oKSAhPSAnJykgeyB0aHJvdyAoJ1VuYWJsZSB0byBmZXRjaCB0YXNrOiAnICsgbmFtZSk7IH0NCiAgICAgICAgICAgIHJldHVybiAoY2hpbGQuc3Rkb3V0LnN0ci50cmltKCkpOw0KICAgICAgICB9DQogICAgICAgIHRoaXMuZ2V0QWN0aW9uQ29tbWFuZCA9IGZ1bmN0aW9uIGdldEFjdGlvbkNvbW1hbmQobmFtZSwgeG1sKQ0KICAgICAgICB7DQogICAgICAgICAgICBpZiAoIXhtbCkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB2YXIgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUocHJvY2Vzcy5lbnZbJ3dpbmRpciddICsgJ1xcc3lzdGVtMzJcXHNjaHRhc2tzLmV4ZScsIFsnc2NodGFza3MnLCAnL1FVRVJZJywgJy9UTiAnICsgbmFtZSwgJy9YTUwnXSk7DQogICAgICAgICAgICAgICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOyBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoYykgeyB0aGlzLnN0ciArPSBjLnRvU3RyaW5nKCk7IH0pOw0KICAgICAgICAgICAgICAgIGNoaWxkLnN0ZGVyci5zdHIgPSAnJzsgY2hpbGQuc3RkZXJyLm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpIHsgdGhpcy5zdHIgKz0gYy50b1N0cmluZygpOyB9KTsNCiAgICAgICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOw0KICAgICAgICAgICAgICAgIGlmIChjaGlsZC5zdGRlcnIuc3RyLnRyaW0oKSAhPSAnJykgeyB0aHJvdyAoJ1VuYWJsZSB0byBmZXRjaCB0YXNrOiAnICsgbmFtZSk7IH0NCiAgICAgICAgICAgICAgICB4bWwgPSBjaGlsZC5zdGRvdXQuc3RyOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgdmFyIHhFbGVtZW50ID0geG1sLnNwbGl0KCc8L0V4ZWM+JylbMF0uc3BsaXQoJzxFeGVjPicpWzFdOw0KICAgICAgICAgICAgdmFyIGNvbW1hbmQgPSB4RWxlbWVudC5zcGxpdCgnPC9Db21tYW5kPicpWzBdLnNwbGl0KCc8Q29tbWFuZD4nKVsxXTsNCiAgICAgICAgICAgIHJldHVybiAoY29tbWFuZCk7DQogICAgICAgIH07DQogICAgICAgIHRoaXMuZWRpdEFjdGlvbkNvbW1hbmQgPSBmdW5jdGlvbiBlZGl0QWN0aW9uQ29tbWFuZChuYW1lLCBhY3Rpb24sIGFyZ1N0cmluZywgeG1sKQ0KICAgICAgICB7DQogICAgICAgICAgICBpZiAoIXhtbCkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB2YXIgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUocHJvY2Vzcy5lbnZbJ3dpbmRpciddICsgJ1xcc3lzdGVtMzJcXHNjaHRhc2tzLmV4ZScsIFsnc2NodGFza3MnLCAnL1FVRVJZJywgJy9UTiAnICsgbmFtZSwgJy9YTUwnXSk7DQogICAgICAgICAgICAgICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOyBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoYykgeyB0aGlzLnN0ciArPSBjLnRvU3RyaW5nKCk7IH0pOw0KICAgICAgICAgICAgICAgIGNoaWxkLnN0ZGVyci5zdHIgPSAnJzsgY2hpbGQuc3RkZXJyLm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpIHsgdGhpcy5zdHIgKz0gYy50b1N0cmluZygpOyB9KTsNCiAgICAgICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOw0KICAgICAgICAgICAgICAgIGlmIChjaGlsZC5zdGRlcnIuc3RyLnRyaW0oKSAhPSAnJykgeyB0aHJvdyAoJ1VuYWJsZSB0byBmZXRjaCB0YXNrOiAnICsgbmFtZSk7IH0NCiAgICAgICAgICAgICAgICB4bWwgPSBjaGlsZC5zdGRvdXQuc3RyOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICB2YXIgcHQxID0geG1sLnNwbGl0KCc8L0V4ZWM+Jyk7ICAgICAgICAgICAgIC8vIHhtbCA9IHB0MS5qb2luKCc8L0V4ZWM+Jyk7DQogICAgICAgICAgICB2YXIgcHQyID0gcHQxWzBdLnNwbGl0KCc8RXhlYz4nKTsgICAgICAgICAgIC8vIHB0MVswXSA9IHB0Mi5qb2luKCc8RXhlYz4nKTsNCiAgICAgICAgICAgIHZhciB4RWxlbWVudCA9IHB0MlsxXTsgICAgICAgICAgICAgICAgICAgICAgLy8gcHQyWzFdID0geEVsZW1lbnQ7DQoNCiAgICAgICAgICAgIHZhciBwdDMgPSB4RWxlbWVudC5zcGxpdCgnPC9Db21tYW5kPicpOyAgICAgIC8vIHhFbGVtZW50ID0gcHQzLmpvaW4oJzwvQ29tbWFuZD4nKTsNCiAgICAgICAgICAgIHZhciBwdDQgPSBwdDNbMF0uc3BsaXQoJzxDb21tYW5kPicpOyAgICAgICAgLy8gcHQzWzBdID0gcHQ0LmpvaW4oJzxDb21tYW5kPicpOw0KICAgICAgICAgICAgdmFyIGNvbW1hbmQgPSBwdDRbMV07ICAgICAgICAgICAgICAgICAgICAgICAvLyBwdDRbMV0gPSBjb21tYW5kOw0KDQogICAgICAgICAgICBwdDRbMV0gPSBhY3Rpb247DQogICAgICAgICAgICBwdDNbMF0gPSBwdDQuam9pbignPENvbW1hbmQ+Jyk7DQogICAgICAgICAgICB4RWxlbWVudCA9IHB0My5qb2luKCc8L0NvbW1hbmQ+Jyk7DQoNCiAgICAgICAgICAgIHZhciBwdDUgPSB4RWxlbWVudC5zcGxpdCgnPC9Bcmd1bWVudHM+Jyk7ICAgLy8geEVsZW1lbnQgPSBwdDUuam9pbignPC9Bcmd1bWVudHM+Jyk7DQogICAgICAgICAgICB2YXIgcHQ2ID0gcHQ1WzBdLnNwbGl0KCc8QXJndW1lbnRzPicpOyAgICAgIC8vIHB0NVswXSA9IHB0Ni5qb2luKCc8QXJndW1lbnRzPicpOw0KICAgICAgICAgICAgdmFyIGFyZyA9IHB0NlsxXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwdDZbMV0gPSBhcmc7DQoNCiAgICAgICAgICAgIGFyZyA9IGFyZ1N0cmluZzsNCiAgICAgICAgICAgIHB0NlsxXSA9IGFyZzsNCiAgICAgICAgICAgIHB0NVswXSA9IHB0Ni5qb2luKCc8QXJndW1lbnRzPicpOw0KICAgICAgICAgICAgeEVsZW1lbnQgPSBwdDUuam9pbignPC9Bcmd1bWVudHM+Jyk7DQoNCiAgICAgICAgICAgIHB0MlsxXSA9IHhFbGVtZW50Ow0KICAgICAgICAgICAgcHQxWzBdID0gcHQyLmpvaW4oJzxFeGVjPicpOw0KICAgICAgICAgICAgeG1sID0gcHQxLmpvaW4oJzwvRXhlYz4nKTsNCg0KICAgICAgICAgICAgdmFyIHMgPSByZXF1aXJlKCdmcycpLmNyZWF0ZVdyaXRlU3RyZWFtKHJlcXVpcmUoJ29zJykudG1wZGlyKCkgKyBuYW1lICsgJy54bWwnLCB7IGZsYWdzOiAnd2InIH0pOw0KICAgICAgICAgICAgdmFyIGIgPSBCdWZmZXIuYWxsb2MoMik7DQogICAgICAgICAgICBiWzBdID0gMHhGRjsNCiAgICAgICAgICAgIGJbMV0gPSAweEZFOw0KDQogICAgICAgICAgICBzLndyaXRlKGIpOw0KICAgICAgICAgICAgcy53cml0ZShCdWZmZXIuZnJvbSh4bWwpLnRvU3RyaW5nKCd1dGYxNicpKTsNCiAgICAgICAgICAgIHMuZW5kKCk7DQoNCiAgICAgICAgICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZShwcm9jZXNzLmVudlsnd2luZGlyJ10gKyAnXFxzeXN0ZW0zMlxcY21kLmV4ZScsIFsnY21kJ10pOw0KICAgICAgICAgICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOyBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoYykgeyB0aGlzLnN0ciArPSBjLnRvU3RyaW5nKCk7IH0pOw0KICAgICAgICAgICAgY2hpbGQuc3RkZXJyLnN0ciA9ICcnOyBjaGlsZC5zdGRlcnIub24oJ2RhdGEnLCBmdW5jdGlvbiAoYykgeyB0aGlzLnN0ciArPSBjLnRvU3RyaW5nKCk7IH0pOw0KICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoJ1NDSFRBU0tTIC9ERUxFVEUgL1ROICcgKyBuYW1lICsgJyAvRiBcbicpOw0KICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoJ1NDSFRBU0tTIC9DUkVBVEUgL1ROICcgKyBuYW1lICsgJyAvWE1MICcgKyByZXF1aXJlKCdvcycpLnRtcGRpcigpICsgbmFtZSArICcueG1sXG4nKTsNCiAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCdlcmFzZSAnICsgcmVxdWlyZSgnb3MnKS50bXBkaXIoKSArIG5hbWUgKyAnLnhtbFxuZXhpdFxuJyk7DQogICAgICAgICAgICBjaGlsZC53YWl0RXhpdCgpOw0KDQogICAgICAgICAgICAvL2NvbnNvbGUubG9nKGNoaWxkLnN0ZG91dC5zdHIudHJpbSgpKTsNCiAgICAgICAgICAgIC8vY29uc29sZS5sb2coY2hpbGQuc3RkZXJyLnN0ci50cmltKCkpOw0KICAgICAgICB9Ow0KDQogICAgICAgIHRoaXMuYWR2YW5jZWRFZGl0QWN0aW9uQ29tbWFuZCA9IGZ1bmN0aW9uIGFkdmFuY2VkRWRpdEFjdGlvbkNvbW1hbmQobmFtZSwgYWN0aW9uLCBhcmdTdHJpbmcpDQogICAgICAgIHsNCiAgICAgICAgICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZShwcm9jZXNzLmVudlsnd2luZGlyJ10gKyAnXFxTeXN0ZW0zMlxcV2luZG93c1Bvd2VyU2hlbGxcXHYxLjBcXHBvd2Vyc2hlbGwuZXhlJywgWydwb3dlcnNoZWxsLmV4ZSddKTsNCiAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpIHsgdGhpcy5zdHIgKz0gYy50b1N0cmluZygpOyB9KTsNCiAgICAgICAgICAgIGNoaWxkLnN0ZGVyci5zdHIgPSAnJzsgY2hpbGQuc3RkZXJyLm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpIHsgdGhpcy5zdHIgKz0gYy50b1N0cmluZygpOyB9KTsNCiAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCckQWN0MSA9IE5ldy1TY2hlZHVsZWRUYXNrQWN0aW9uIC1FeGVjdXRlICInICsgYWN0aW9uICsgJyIgLUFyZ3VtZW50ICInICsgYXJnU3RyaW5nICsgJyJcbicpOw0KICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoJ1NldC1TY2hlZHVsZWRUYXNrICInICsgbmFtZSArICciIC1BY3Rpb24gJEFjdDFcbmV4aXRcbicpOw0KICAgICAgICAgICAgY2hpbGQud2FpdEV4aXQoKTsNCiAgICAgICAgICAgIGNvbnNvbGUubG9nKGNoaWxkLnN0ZG91dC5zdHIudHJpbSgpKTsNCiAgICAgICAgfTsNCiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICJhZHZhbmNlZFN1cHBvcnQiLCB7DQogICAgICAgICAgICB2YWx1ZTogKGZ1bmN0aW9uICgpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKHByb2Nlc3MuZW52Wyd3aW5kaXInXSArICdcXFN5c3RlbTMyXFxXaW5kb3dzUG93ZXJTaGVsbFxcdjEuMFxccG93ZXJzaGVsbC5leGUnLCBbJy9DICJHZXQtTW9kdWxlIC1MaXN0QXZhaWxhYmxlIC1OYW1lIFNjaGVkdWxlZFRhc2tzIiddKTsNCiAgICAgICAgICAgICAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7IGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7IHRoaXMuc3RyICs9IGMudG9TdHJpbmcoKTsgfSk7DQogICAgICAgICAgICAgICAgY2hpbGQuc3RkZXJyLnN0ciA9ICcnOyBjaGlsZC5zdGRlcnIub24oJ2RhdGEnLCBmdW5jdGlvbiAoYykgeyB0aGlzLnN0ciArPSBjLnRvU3RyaW5nKCk7IH0pOw0KICAgICAgICAgICAgICAgIGNoaWxkLndhaXRFeGl0KCk7DQogICAgICAgICAgICAgICAgcmV0dXJuIChjaGlsZC5zdGRvdXQuc3RyLnRyaW0oKSAhPSAnJyk7DQogICAgICAgICAgICB9KSgpDQogICAgICAgIH0pOw0KICAgIH0NCg0KDQogICAgdGhpcy5jcmVhdGUgPSBmdW5jdGlvbiBjcmVhdGUob3B0aW9ucykNCiAgICB7DQogICAgICAgIHZhciByZXQgPSBuZXcgcHJvbWlzZShmdW5jdGlvbiAocmVzLCByZWopIHsgdGhpcy5fcmVzID0gcmVzOyB0aGlzLl9yZWogPSByZWo7IH0pOw0KICAgICAgICBpZihvcHRpb25zLm5hbWUgJiYgb3B0aW9ucy5zZXJ2aWNlKQ0KICAgICAgICB7DQogICAgICAgICAgICBzd2l0Y2gocHJvY2Vzcy5wbGF0Zm9ybSkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBjYXNlICd3aW4zMic6DQogICAgICAgICAgICAgICAgICAgIHZhciBwYXJtcyA9IFsnc2NodGFza3MnLCAnL0NyZWF0ZScsICcvUlUgU1lTVEVNJ107DQogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGZ0eXBlIGluIG9wdGlvbnMpDQogICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaChmdHlwZS50b1VwcGVyQ2FzZSgpKQ0KICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ01JTlVURSc6DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnSE9VUkxZJzoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdEQUlMWSc6DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnV0VFS0xZJzoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdNT05USExZJzoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFybXMucHVzaCgnL1NDICcgKyBmdHlwZS50b1VwcGVyQ2FzZSgpKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFybXMucHVzaCgnL01PICcgKyBvcHRpb25zW2Z0eXBlXSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ0RBWSc6DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcm1zLnB1c2goJy9EICcgKyBvcHRpb25zW2Z0eXBlXSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ01PTlRIJzoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFybXMucHVzaCgnL00gJyArIG9wdGlvbnNbZnR5cGVdKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnVElNRSc6DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcm1zLnB1c2goJy9TVCAnICsgb3B0aW9uc1tmdHlwZV0pOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdOQU1FJzoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFybXMucHVzaCgnL1ROICInICsgb3B0aW9uc1tmdHlwZV0uc3BsaXQoJy8nKS5qb2luKCdcXCcpICsgJyInKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnU0VSVklDRSc6DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcm1zLnB1c2goJy9UUiAibmV0IHN0YXJ0ICcgKyBvcHRpb25zW2Z0eXBlXSArICciJyk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKHBhcm1zLmpvaW4oJyAnKSk7DQogICAgICAgICAgICAgICAgICAgIHJldC5jaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZShwcm9jZXNzLmVudlsnd2luZGlyJ10gKyAnXFxzeXN0ZW0zMlxcc2NodGFza3MuZXhlJywgcGFybXMpOw0KICAgICAgICAgICAgICAgICAgICByZXQuY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOw0KICAgICAgICAgICAgICAgICAgICByZXQuY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IHRoaXMuc3RyICs9IGNodW5rLnRvU3RyaW5nKCk7IH0pOw0KICAgICAgICAgICAgICAgICAgICByZXQuY2hpbGQuc3RkZXJyLm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IH0pOw0KICAgICAgICAgICAgICAgICAgICByZXQuY2hpbGQucHJvbWlzZSA9IHJldDsNCiAgICAgICAgICAgICAgICAgICAgcmV0LmNoaWxkLm9uKCdleGl0JywgZnVuY3Rpb24gKGNvZGUpIHsgaWYgKGNvZGUgPT0gMCkgeyB0aGlzLnByb21pc2UuX3JlcygpOyB9IGVsc2UgeyB0aGlzLnByb21pc2UuX3Jlaihjb2RlKTsgfX0pOyANCiAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgY2FzZSAnbGludXgnOg0KICAgICAgICAgICAgICAgICAgICBpZiAocmVxdWlyZSgnZnMnKS5leGlzdHNTeW5jKCcvZXRjL2Nyb24uZC8nICsgb3B0aW9ucy5uYW1lLnNwbGl0KCcvJykuam9pbignXycpLnNwbGl0KCcuJykuam9pbignJykpKQ0KICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICByZXQuX3JlaignVGFzayBbJyArIG9wdGlvbnMubmFtZSArICddIEFscmVhZHkgZXhpc3RzJyk7DQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHJldCk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgdmFyIG1pbnV0ZSA9ICcqJzsNCiAgICAgICAgICAgICAgICAgICAgdmFyIGhvdXIgPSAnKic7DQogICAgICAgICAgICAgICAgICAgIHZhciBkYXkgPSAnKic7DQogICAgICAgICAgICAgICAgICAgIHZhciBtb250aCA9ICcqJzsNCiAgICAgICAgICAgICAgICAgICAgdmFyIHdlZWtkYXkgPSAnKic7DQogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGZ0eXBlIGluIG9wdGlvbnMpDQogICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaChmdHlwZS50b1VwcGVyQ2FzZSgpKQ0KICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ01JTlVURSc6DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghb3B0aW9ucy5USU1FICYmICFvcHRpb25zLnRpbWUpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbnV0ZSA9ICcqLycgKyBvcHRpb25zW2Z0eXBlXTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdIT1VSTFknOg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW9wdGlvbnMuVElNRSAmJiAhb3B0aW9ucy50aW1lKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBob3VyID0gJyovJyArIG9wdGlvbnNbZnR5cGVdOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ0RBSUxZJzoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF5ID0gJyovJyArIG9wdGlvbnNbZnR5cGVdOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdXRUVLTFknOg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9uc1tmdHlwZV0gPT0gMSkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIW9wdGlvbnMuREFZICYmICFvcHRpb25zLmRheSkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZWVrZGF5ID0gMDsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldC5fcmVqKCdPbmx5IE9uY2UvV2Vla2x5IHN1cHBvcnRlZCBvbiBMaW51eCcpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChyZXQpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ0RBWSc6DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLndlZWtseSB8fCBvcHRpb25zLldFRUtMWSkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2Vla2RheSA9IG9wdGlvbnNbZnR5cGVdOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF5ID0gb3B0aW9uc1tmdHlwZV07DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnVElNRSc6DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvdXIgPSBvcHRpb25zW2Z0eXBlXS5zcGxpdCgnOicpWzBdOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW51dGUgPSBvcHRpb25zW2Z0eXBlXS5zcGxpdCgnOicpWzFdOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdNT05USExZJzoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9udGggPSAnKi8nICsgb3B0aW9uc1tm", 16000); diff --git a/modules/_agentStatus.js b/modules/_agentStatus.js new file mode 100644 index 0000000..838b122 --- /dev/null +++ b/modules/_agentStatus.js @@ -0,0 +1,72 @@ + +var promise = require('promise'); +var nodeid = require('_agentNodeId')(); +var ipcPath = process.platform == 'win32' ? ('\\\\.\\pipe\\' + nodeid + '-DAIPC') : (process.cwd() + '/DAIPC'); + +function queryAgent(obj) +{ + var ret = new promise(function (res, rej) { this._res = res; this._rej = rej; }); + ret._obj = { cmd: 'query', value: obj }; + ret.client = require('net').createConnection({ path: ipcPath }); + ret.client.promise = ret; + ret.client.on('connect', function () + { + this.on('data', function (chunk) + { + var len; + if (chunk.length < 4) { this.unshift(chunk); return; } + if ((len = chunk.readUInt32LE(0)) > chunk.length) { this.unshift(chunk); return;} + + var data = chunk.slice(4, len + 4); + var payload = null; + try + { + payload = JSON.parse(data.toString()); + } + catch (e) + { + this.promise._rej('Invalid Response Received'); + return; + } + try + { + //this.promise._res(payload.result?payload.result:''); + this.promise._res(payload.result); + } + catch(x) + { + } + if ((len + 4) < chunk.length) { this.unshift(chunk.slice(4 + len)); } + }); + this.on('end', function () + { + this.promise._rej('closed'); + }); + + var j = Buffer.from(JSON.stringify(this.promise._obj)); + var buf = Buffer.alloc(4 + j.length); + buf.writeUInt32LE(j.length + 4, 0); + j.copy(buf, 4); + this.write(buf); + }); + return (ret); +} + +function start() +{ + console.log('Querying Mesh Agent state...'); + global._statustm = setTimeout(function () + { + console.log('Unable to contact Mesh Agent...'); + process._exit(); + }, 3000); + + queryAgent('connection').then(function (res) + { + if (res == null) { res = '[NOT CONNECTED]'; } + console.log('Mesh Agent connected to: ' + res); + return (queryAgent('descriptors')); + }).then(console.log).then(function () { process._exit(); }).catch(function () { process._exit(); }); +} + +module.exports = { start: start }; \ No newline at end of file