1
0
mirror of https://github.com/Ylianst/MeshAgent synced 2025-12-06 00:13:33 +00:00

Fixed JSON serialization of parameters

This commit is contained in:
Bryan Roe
2020-11-17 15:14:33 -08:00
parent 9822aa8a31
commit ee0aaf4615
7 changed files with 109 additions and 195 deletions

View File

@@ -1667,11 +1667,7 @@ duk_ret_t ILibDuktape_MeshAgent_getStartupOptions(duk_context *ctx)
duk_push_this(ctx); // [MeshAgent]
agent = (MeshAgentHostContainer*)Duktape_GetPointerProperty(ctx, -1, MESH_AGENT_PTR);
int varLen = ILibSimpleDataStore_Cached_GetJSON(agent->masterDb, NULL, 0);
char *buffer = duk_push_fixed_buffer(ctx, varLen);
ILibSimpleDataStore_Cached_GetJSON(agent->masterDb, buffer, varLen);
duk_push_string(ctx, buffer);
duk_json_decode(ctx, -1);
ILibDuktape_SimpleDataStore_raw_GetCachedValues_Object(ctx, agent->masterDb);
return(1);
}
@@ -3726,17 +3722,9 @@ void MeshServer_Agent_SelfTest(MeshAgentHostContainer *agent)
//int CoreModuleTesterLen = ILibSimpleDataStore_Get(agent->masterDb, "CoreModuleTester", NULL, 0);
//char *CoreModule, *CoreModuleTester;
char *argarray;
size_t argarrayLen;
argarrayLen = (size_t)ILibSimpleDataStore_Cached_GetJSONEx(agent->masterDb, NULL, 0);
ILibMemory_AllocateRaw(argarray, argarrayLen);
ILibSimpleDataStore_Cached_GetJSONEx(agent->masterDb, argarray, (int)argarrayLen);
duk_push_heapptr(agent->meshCoreCtx, ILibDuktape_GetProcessObject(agent->meshCoreCtx)); // [process]
duk_push_string(agent->meshCoreCtx, argarray); // [process][string]
duk_json_decode(agent->meshCoreCtx, -1); // [process][json]
duk_put_prop_string(agent->meshCoreCtx, -2, "\xFF_argArray"); // [process]
duk_push_heapptr(agent->meshCoreCtx, ILibDuktape_GetProcessObject(agent->meshCoreCtx)); // [process]
ILibDuktape_SimpleDataStore_raw_GetCachedValues_Array(agent->meshCoreCtx, agent->masterDb); // [process][array]
duk_put_prop_string(agent->meshCoreCtx, -2, "\xFF_argArray"); // [process]
duk_pop(agent->meshCoreCtx);
printf("Agent Self Test...\n");
@@ -4335,8 +4323,6 @@ int MeshAgent_AgentMode(MeshAgentHostContainer *agentHost, int paramLen, char **
}
else if (installFlag != 0)
{
int bufLen = 0;
char *buf;
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('user-sessions').isRoot();");
if (!duk_get_boolean(ctxx, -1))
@@ -4346,19 +4332,15 @@ int MeshAgent_AgentMode(MeshAgentHostContainer *agentHost, int paramLen, char **
exit(0);
}
switch (installFlag)
{
case 1:
case 5:
bufLen = ILibSimpleDataStore_Cached_GetJSONEx(agentHost->masterDb, NULL, 0);
buf = (char*)ILibMemory_SmartAllocate(bufLen);
bufLen = ILibSimpleDataStore_Cached_GetJSONEx(agentHost->masterDb, buf, bufLen);
duk_eval_string(ctxx, "require('agent-installer');");
duk_get_prop_string(ctxx, -1, "fullInstall");
duk_swap_top(ctxx, -2);
duk_push_string(ctxx, buf);
duk_swap_top(ctxx, -2); // [func][this]
ILibDuktape_SimpleDataStore_raw_GetCachedValues_Array(ctxx, agentHost->masterDb); // [func][this][array]
duk_json_encode(ctxx, -1); // [func][this][json]
if (duk_pcall_method(ctxx, 1) != 0)
{
if (strcmp(duk_safe_to_string(ctxx, -1), "Process.exit() forced script termination") != 0)
@@ -4367,18 +4349,14 @@ int MeshAgent_AgentMode(MeshAgentHostContainer *agentHost, int paramLen, char **
}
}
duk_pop(ctxx);
ILibMemory_Free(buf);
return(1);
break;
case 2:
bufLen = ILibSimpleDataStore_Cached_GetJSONEx(agentHost->masterDb, NULL, 0);
buf = (char*)ILibMemory_SmartAllocate(bufLen);
bufLen = ILibSimpleDataStore_Cached_GetJSONEx(agentHost->masterDb, buf, bufLen);
duk_eval_string(ctxx, "require('agent-installer');");
duk_get_prop_string(ctxx, -1, "fullUninstall");
duk_swap_top(ctxx, -2);
duk_push_string(ctxx, buf);
duk_get_prop_string(ctxx, -1, "fullUninstall");
duk_swap_top(ctxx, -2); // [func][this]
ILibDuktape_SimpleDataStore_raw_GetCachedValues_Array(ctxx, agentHost->masterDb); // [func][this][array]
duk_json_encode(ctxx, -1); // [func][this][json]
if (duk_pcall_method(ctxx, 1) != 0)
{
if (strcmp(duk_safe_to_string(ctxx, -1), "Process.exit() forced script termination") != 0)
@@ -4387,7 +4365,6 @@ int MeshAgent_AgentMode(MeshAgentHostContainer *agentHost, int paramLen, char **
}
}
duk_pop(ctxx);
ILibMemory_Free(buf);
return(1);
break;
default:
@@ -5563,19 +5540,37 @@ int MeshAgent_Start(MeshAgentHostContainer *agentHost, int paramLen, char **para
{
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"); }
}
duk_context *ctxx = ILibDuktape_ScriptContainer_InitializeJavaScriptEngine_minimal();
duk_size_t jsonLen;
char *json = NULL;
ILibDuktape_SimpleDataStore_raw_GetCachedValues_Array(ctxx, agentHost->masterDb); // [array]
if (duk_get_length(ctxx, -1) > 0)
{
duk_json_encode(ctxx, -1); // [json]
json = (char*)duk_get_lstring(ctxx, -1, &jsonLen);
startParms = (char*)ILibMemory_SmartAllocateEx(jsonLen + 1, ILibBase64EncodeLength(jsonLen + 1));
unsigned char* tmp = (unsigned char*)ILibMemory_Extra(startParms);
memcpy_s(startParms, jsonLen + 1, json, jsonLen);
Duktape_SafeDestroyHeap(ctxx);
if (jsonLen > INT32_MAX)
{
ILibMemory_Free(startParms);
startParms = NULL;
if (agentHost->logUpdate != 0) { ILIBLOGMESSAGEX(" Service Parameters => ERROR"); }
}
else
{
ILibBase64Encode((unsigned char*)startParms, (int)jsonLen, &tmp);
if (agentHost->logUpdate != 0) { ILIBLOGMESSAGEX(" Service Parameters => %s", startParms); }
}
}
else
{
if (agentHost->logUpdate != 0) { ILIBLOGMESSAGEX(" Service Parameters => NONE"); }
}
}
else
{

File diff suppressed because one or more lines are too long

View File

@@ -270,6 +270,48 @@ void ILibDuktape_SimpleDataStore_init(duk_context * ctx, ILibSimpleDataStore sha
}
}
void ILibDuktape_SimpleDataStore_raw_GetCachedValues_Object_sink(ILibSimpleDataStore sender, char* Key, size_t KeyLen, char* Value, size_t ValueLen, void *user)
{
duk_context *ctx = (duk_context*)user;
duk_push_lstring(ctx, Key, KeyLen); // [obj][key]
duk_push_lstring(ctx, Value, ValueLen); // [obj][key][value]
duk_put_prop(ctx, -3); // [obj]
}
void ILibDuktape_SimpleDataStore_raw_GetCachedValues_Array_sink(ILibSimpleDataStore sender, char* Key, size_t KeyLen, char* Value, size_t ValueLen, void *user)
{
duk_context *ctx = (duk_context*)user;
duk_idx_t top = duk_get_top(ctx); // [array]
duk_push_lstring(ctx, Key, KeyLen); // [array][key]
char *k2 = (char*)duk_get_string(ctx, -1);
duk_push_object(ctx); // [array][key][object]
duk_dup(ctx, -2); // [array][key][obj][key]
duk_push_lstring(ctx, Value, ValueLen); // [array][key][obj][key][value]
duk_put_prop(ctx, -3); // [array][key][obj]
duk_json_encode(ctx, -1); // [array][key][json]
duk_size_t len;
char *json = (char*)duk_get_lstring(ctx, -1, &len);
int colon = ILibString_IndexOf(json, len, ":", 1);
duk_string_substring(ctx, -1, colon+1, (int)len - 1); // [array][key][json][val]
char *val = (char*)duk_get_lstring(ctx, -1, &len);
duk_push_sprintf(ctx, "--%s=%s", k2, val); // [array][key][json][val][string]
duk_array_push(ctx, -5); // [array][key][json][val]
duk_pop_3(ctx); // [array]
}
void ILibDuktape_SimpleDataStore_raw_GetCachedValues_Array(duk_context *ctx, ILibSimpleDataStore dataStore)
{
duk_push_array(ctx);
ILibSimpleDataStore_Cached_GetValues(dataStore, ILibDuktape_SimpleDataStore_raw_GetCachedValues_Array_sink, ctx);
}
void ILibDuktape_SimpleDataStore_raw_GetCachedValues_Object(duk_context *ctx, ILibSimpleDataStore dataStore)
{
duk_push_object(ctx);
ILibSimpleDataStore_Cached_GetValues(dataStore, ILibDuktape_SimpleDataStore_raw_GetCachedValues_Object_sink, ctx);
}
#ifdef __DOXY__
/*!
\brief Provides a compact Key/Value datastore. <b>Note:</b> To use, must <b>require('SimpleDataStore').Create() or require('SimpleDataStore').Shared()</b>

View File

@@ -22,6 +22,7 @@ limitations under the License.
#include "microstack/ILibSimpleDataStore.h"
void ILibDuktape_SimpleDataStore_init(duk_context *ctx, ILibSimpleDataStore sharedDb);
void ILibDuktape_SimpleDataStore_raw_GetCachedValues_Array(duk_context *ctx, ILibSimpleDataStore dataStore);
void ILibDuktape_SimpleDataStore_raw_GetCachedValues_Object(duk_context *ctx, ILibSimpleDataStore dataStore);
#endif

View File

@@ -178,50 +178,16 @@ typedef struct ILibSimpleDateStore_JSONCache
int bufferLen;
}ILibSimpleDateStore_JSONCache;
void ILibSimpleDataStore_Cached_GetJSON_count(ILibHashtable sender, void *Key1, char* Key2, int Key2Len, void *Data, void *user)
void ILibSimpleDataStore_Cached_GetValues_sink(ILibHashtable sender, void *Key1, char* Key2, int Key2Len, void *Data, void *user)
{
ILibSimpleDateStore_JSONCache *cache = (ILibSimpleDateStore_JSONCache*)user;
ILibSimpleDataStore_CacheEntry *entry = (ILibSimpleDataStore_CacheEntry*)Data;
ILibSimpleDataStore dataStore = (ILibSimpleDataStore)((void**)user)[0];
ILibSimpleDataStore_GetValuesHandler handler = (ILibSimpleDataStore_GetValuesHandler)((void**)user)[1];
void *userObject = ((void**)user)[2];
if (cache->bufferLen == 0)
{
cache->bufferLen = 3;
}
else
{
++cache->bufferLen;
}
cache->bufferLen += (Key2Len + 3);
cache->bufferLen += (entry->valueLength + 2);
}
void ILibSimpleDataStore_Cached_GetJSONEx_count(ILibHashtable sender, void *Key1, char* Key2, int Key2Len, void *Data, void *user)
{
ILibSimpleDateStore_JSONCache *cache = (ILibSimpleDateStore_JSONCache*)user;
ILibSimpleDataStore_CacheEntry *entry = (ILibSimpleDataStore_CacheEntry*)Data;
if (cache->bufferLen == 0)
{
cache->bufferLen = 3;
}
else
{
++cache->bufferLen;
}
cache->bufferLen += (Key2Len + 5);
cache->bufferLen += (entry->valueLength + 4);
}
void ILibSimpleDataStore_Cached_GetJSON_write(ILibHashtable sender, void *Key1, char* Key2, int Key2Len, void *Data, void *user)
{
ILibSimpleDateStore_JSONCache *cache = (ILibSimpleDateStore_JSONCache*)user;
ILibSimpleDataStore_CacheEntry *entry = (ILibSimpleDataStore_CacheEntry*)Data;
char *tmpbuffer = NULL;
size_t tmpbufferLen = 0;
char* value = entry->value;
size_t valueLen = entry->valueLength;
// check if this is a compressed record
if (Key2Len > sizeof(uint32_t))
{
@@ -233,119 +199,27 @@ void ILibSimpleDataStore_Cached_GetJSON_write(ILibHashtable sender, void *Key1,
{
tmpbuffer = (char*)ILibMemory_SmartAllocate(tmpbufferLen);
ILibInflate(entry->value, entry->valueLength, tmpbuffer, &tmpbufferLen, 0);
value = tmpbuffer;
valueLen = tmpbufferLen;
// Uncompressed Record
handler(dataStore, Key2, (size_t)Key2Len, tmpbuffer, tmpbufferLen, userObject);
ILibMemory_Free(tmpbuffer);
return;
}
}
}
if (cache->offset != 1) { cache->offset += sprintf_s(cache->buffer + cache->offset, cache->bufferLen - cache->offset, ","); }
cache->offset += sprintf_s(cache->buffer + cache->offset, cache->bufferLen - cache->offset, "\"");
memcpy_s(cache->buffer + cache->offset, cache->bufferLen - cache->offset, Key2, Key2Len); cache->offset += Key2Len;
cache->offset += sprintf_s(cache->buffer + cache->offset, cache->bufferLen - cache->offset, "\":\"");
memcpy_s(cache->buffer + cache->offset, cache->bufferLen - cache->offset, value, (int)valueLen); cache->offset += (int)valueLen;
cache->offset += sprintf_s(cache->buffer + cache->offset, cache->bufferLen - cache->offset, "\"");
if (tmpbuffer != NULL) { ILibMemory_Free(tmpbuffer); }
// Not a compressed record
handler(dataStore, Key2, (size_t)Key2Len, entry->value, entry->valueLength, userObject);
}
void ILibSimpleDataStore_Cached_GetJSONEx_write(ILibHashtable sender, void *Key1, char* Key2, int Key2Len, void *Data, void *user)
{
ILibSimpleDateStore_JSONCache *cache = (ILibSimpleDateStore_JSONCache*)user;
ILibSimpleDataStore_CacheEntry *entry = (ILibSimpleDataStore_CacheEntry*)Data;
char *tmpbuffer = NULL;
size_t tmpbufferLen = 0;
char* value = entry->value;
size_t valueLen = entry->valueLength;
// check if this is a compressed record
if (Key2Len > sizeof(uint32_t))
{
if (((uint32_t*)(Key2 + Key2Len - sizeof(uint32_t)))[0] == crc32c(0, (unsigned char*)Key2, Key2Len - sizeof(uint32_t)))
{
Key2Len -= sizeof(uint32_t);
ILibInflate(entry->value, entry->valueLength, NULL, &tmpbufferLen, 0);
if (tmpbufferLen > 0)
{
tmpbuffer = (char*)ILibMemory_SmartAllocate(tmpbufferLen);
ILibInflate(entry->value, entry->valueLength, tmpbuffer, &tmpbufferLen, 0);
value = tmpbuffer;
valueLen = tmpbufferLen;
}
}
}
if (cache->offset != 1) { cache->offset += sprintf_s(cache->buffer + cache->offset, cache->bufferLen - cache->offset, ","); }
cache->offset += sprintf_s(cache->buffer + cache->offset, cache->bufferLen - cache->offset, "\"--");
memcpy_s(cache->buffer + cache->offset, cache->bufferLen - cache->offset, Key2, Key2Len); cache->offset += Key2Len;
cache->offset += sprintf_s(cache->buffer + cache->offset, cache->bufferLen - cache->offset, "=\\\"");
memcpy_s(cache->buffer + cache->offset, cache->bufferLen - cache->offset, value, (int)valueLen); cache->offset += (int)valueLen;
cache->offset += sprintf_s(cache->buffer + cache->offset, cache->bufferLen - cache->offset, "\\\"\"");
}
int ILibSimpleDataStore_Cached_GetJSONEx(ILibSimpleDataStore dataStore, char *buffer, int bufferLen)
int ILibSimpleDataStore_Cached_GetValues(ILibSimpleDataStore dataStore, ILibSimpleDataStore_GetValuesHandler handler, void *user)
{
void *callback[] = { dataStore, handler, user };
ILibSimpleDataStore_Root *root = (ILibSimpleDataStore_Root*)dataStore;
if (root->cacheTable == NULL)
if (root->cacheTable != NULL && handler != NULL)
{
if (bufferLen < 3)
{
return(3);
}
else
{
return(sprintf_s(buffer, (size_t)bufferLen, "[]"));
}
ILibHashtable_Enumerate(root->cacheTable, ILibSimpleDataStore_Cached_GetValues_sink, callback);
}
ILibSimpleDateStore_JSONCache cache;
cache.buffer = NULL;
cache.offset = 0;
cache.bufferLen = 0;
ILibHashtable_Enumerate(root->cacheTable, ILibSimpleDataStore_Cached_GetJSONEx_count, &cache);
if (buffer == NULL || bufferLen < cache.bufferLen) { return(cache.bufferLen); }
cache.buffer = buffer;
cache.offset = sprintf_s(buffer, bufferLen, "[");
cache.bufferLen = bufferLen;
ILibHashtable_Enumerate(root->cacheTable, ILibSimpleDataStore_Cached_GetJSONEx_write, &cache);
cache.offset += sprintf_s(cache.buffer + cache.offset, cache.bufferLen - cache.offset, "]");
return(cache.offset);
}
int ILibSimpleDataStore_Cached_GetJSON(ILibSimpleDataStore dataStore, char *buffer, int bufferLen)
{
ILibSimpleDataStore_Root *root = (ILibSimpleDataStore_Root*)dataStore;
if (root->cacheTable == NULL)
{
if (bufferLen < 3)
{
return(3);
}
else
{
return(sprintf_s(buffer, (size_t)bufferLen, "{}"));
}
}
ILibSimpleDateStore_JSONCache cache;
cache.buffer = NULL;
cache.offset = 0;
cache.bufferLen = 0;
ILibHashtable_Enumerate(root->cacheTable, ILibSimpleDataStore_Cached_GetJSON_count, &cache);
if (buffer == NULL || bufferLen < cache.bufferLen) { return(cache.bufferLen); }
cache.buffer = buffer;
cache.offset = sprintf_s(buffer, bufferLen, "{");
cache.bufferLen = bufferLen;
ILibHashtable_Enumerate(root->cacheTable, ILibSimpleDataStore_Cached_GetJSON_write, &cache);
cache.offset += sprintf_s(cache.buffer + cache.offset, cache.bufferLen - cache.offset, "}");
return(cache.offset);
return(0);
}
// Write a key/value pair to file, the hash is already calculated

View File

@@ -41,6 +41,8 @@ const extern int ILibMemory_SimpleDataStore_CONTAINERSIZE;
typedef void(*ILibSimpleDataStore_KeyEnumerationHandler)(ILibSimpleDataStore sender, char* Key, int KeyLen, void *user);
typedef void(*ILibSimpleDataStore_SizeWarningHandler)(ILibSimpleDataStore sender, uint64_t size, void *user);
typedef void(*ILibSimpleDataStore_WriteErrorHandler)(ILibSimpleDataStore sender, void *user);
typedef void(*ILibSimpleDataStore_GetValuesHandler)(ILibSimpleDataStore sender, char* Key, size_t KeyLen, char* Value, size_t ValueLen, void *user);
// Create the data store.
__EXPORT_TYPE ILibSimpleDataStore ILibSimpleDataStore_CreateEx2(char* filePath, int userExtraMemorySize, int readonly);
@@ -57,8 +59,8 @@ int ILibSimpleDataStore_Exists(char *filePath);
__EXPORT_TYPE void ILibSimpleDataStore_Close(ILibSimpleDataStore dataStore);
__EXPORT_TYPE void ILibSimpleDataStore_CachedEx(ILibSimpleDataStore dataStore, char* key, size_t keyLen, char* value, size_t valueLen, char *vhash);
#define ILibSimpleDataStore_Cached(dataStore, key, keyLen, value, valueLen) ILibSimpleDataStore_CachedEx(dataStore, key, keyLen, value, valueLen, NULL)
__EXPORT_TYPE int ILibSimpleDataStore_Cached_GetJSON(ILibSimpleDataStore dataStore, char *buffer, int bufferLen);
__EXPORT_TYPE int ILibSimpleDataStore_Cached_GetJSONEx(ILibSimpleDataStore dataStore, char *buffer, int bufferLen);
__EXPORT_TYPE int ILibSimpleDataStore_Cached_GetValues(ILibSimpleDataStore dataStore, ILibSimpleDataStore_GetValuesHandler handler, void *user);
__EXPORT_TYPE void ILibSimpleDataStore_ConfigCompact(ILibSimpleDataStore dataStore, uint64_t minimumDirtySize);
__EXPORT_TYPE void ILibSimpleDataStore_ConfigSizeLimit(ILibSimpleDataStore dataStore, uint64_t sizeLimit, ILibSimpleDataStore_SizeWarningHandler handler, void *user);
void ILibSimpleDataStore_ConfigWriteErrorHandler(ILibSimpleDataStore dataStore, ILibSimpleDataStore_WriteErrorHandler handler, void *user);

View File

@@ -44,9 +44,9 @@ function Toaster()
this.Toast = function Toast(title, caption, tsid)
{
var retVal = new promise(function (res, rej) { this._res = res; this._rej = rej; });
retVal.title = title;
if (title == 'MeshCentral') { try { retVal.title = require('MeshAgent').displayName; } catch (x) { } }
if (title == 'MeshCentral') { try { title = require('MeshAgent').displayName; } catch (x) { } }
retVal.title = title;
retVal.caption = caption;
switch (process.platform)