Users: JSON format support

This commit is contained in:
李通洲
2023-09-08 14:32:01 +08:00
parent aafd773fe7
commit 2c59a05dff
5 changed files with 42 additions and 8 deletions
+1 -1
View File
@@ -8,7 +8,7 @@
typedef struct FFUserResult
{
FFstrbuf name;
FFstrbuf hostname;
FFstrbuf hostName;
FFstrbuf clientIp;
FFstrbuf tty;
uint64_t loginTime; // ms
+1 -1
View File
@@ -30,7 +30,7 @@ next:
FFUserResult* user = (FFUserResult*) ffListAdd(users);
ffStrbufInitS(&user->name, n->ut_user);
ffStrbufInitS(&user->hostname, n->ut_host);
ffStrbufInitS(&user->hostName, n->ut_host);
ffStrbufInitS(&user->tty, n->ut_line);
#ifdef __linux__
if(n->ut_addr_v6[0] || n->ut_addr_v6[1] || n->ut_addr_v6[2] || n->ut_addr_v6[3])
+1 -1
View File
@@ -27,7 +27,7 @@ const char* ffDetectUsers(FFlist* users)
FFUserResult* user = (FFUserResult*) ffListAdd(users);
ffStrbufInitWS(&user->name, session->pUserName);
ffStrbufInitWS(&user->hostname, session->pHostName);
ffStrbufInitWS(&user->hostName, session->pHostName);
DWORD bytes = 0;
PWTS_CLIENT_ADDRESS address = NULL;
+38 -5
View File
@@ -51,8 +51,8 @@ void ffPrintUsers(FFUsersOptions* options)
ffPrintLogoAndKey(FF_USERS_MODULE_NAME, users.length == 1 ? 0 : (uint8_t) (i + 1), &options->moduleArgs, FF_PRINT_TYPE_DEFAULT);
FF_STRBUF_AUTO_DESTROY result = ffStrbufCreateCopy(&user->name);
if(user->hostname.length)
ffStrbufAppendF(&result, "@%s", user->hostname.chars);
if(user->hostName.length)
ffStrbufAppendF(&result, "@%s", user->hostName.chars);
if(user->loginTime)
{
@@ -74,7 +74,7 @@ void ffPrintUsers(FFUsersOptions* options)
ffPrintFormat(FF_USERS_MODULE_NAME, users.length == 1 ? 0 : (uint8_t) (i + 1), &options->moduleArgs, FF_USERS_NUM_FORMAT_ARGS, (FFformatarg[]){
{FF_FORMAT_ARG_TYPE_STRBUF, &user->name},
{FF_FORMAT_ARG_TYPE_STRBUF, &user->hostname},
{FF_FORMAT_ARG_TYPE_STRBUF, &user->hostName},
{FF_FORMAT_ARG_TYPE_STRBUF, &user->tty},
{FF_FORMAT_ARG_TYPE_STRBUF, &user->clientIp},
{FF_FORMAT_ARG_TYPE_UINT64, &user->loginTime},
@@ -85,7 +85,7 @@ void ffPrintUsers(FFUsersOptions* options)
FF_LIST_FOR_EACH(FFUserResult, user, users)
{
ffStrbufDestroy(&user->clientIp);
ffStrbufDestroy(&user->hostname);
ffStrbufDestroy(&user->hostName);
ffStrbufDestroy(&user->tty);
ffStrbufDestroy(&user->name);
}
@@ -93,7 +93,7 @@ void ffPrintUsers(FFUsersOptions* options)
void ffInitUsersOptions(FFUsersOptions* options)
{
ffOptionInitModuleBaseInfo(&options->moduleInfo, FF_USERS_MODULE_NAME, ffParseUsersCommandOptions, ffParseUsersJsonObject, ffPrintUsers, NULL);
ffOptionInitModuleBaseInfo(&options->moduleInfo, FF_USERS_MODULE_NAME, ffParseUsersCommandOptions, ffParseUsersJsonObject, ffPrintUsers, ffGenerateUsersJson);
ffOptionInitModuleArg(&options->moduleArgs);
options->compact = true;
@@ -142,3 +142,36 @@ void ffParseUsersJsonObject(FFUsersOptions* options, yyjson_val* module)
ffPrintError(FF_USERS_MODULE_NAME, 0, &options->moduleArgs, "Unknown JSON key %s", key);
}
}
void ffGenerateUsersJson(FF_MAYBE_UNUSED FFUsersOptions* options, yyjson_mut_doc* doc, yyjson_mut_val* module)
{
FF_LIST_AUTO_DESTROY results = ffListCreate(sizeof(FFUserResult));
const char* error = ffDetectUsers(&results);
if(error)
{
yyjson_mut_obj_add_str(doc, module, "error", error);
goto exit;
}
yyjson_mut_val* arr = yyjson_mut_obj_add_arr(doc, module, "result");
FF_LIST_FOR_EACH(FFUserResult, user, results)
{
yyjson_mut_val* obj = yyjson_mut_arr_add_obj(doc, arr);
yyjson_mut_obj_add_strbuf(doc, obj, "clientIp", &user->clientIp);
yyjson_mut_obj_add_strbuf(doc, obj, "hostName", &user->hostName);
yyjson_mut_obj_add_uint(doc, obj, "loginTime", user->loginTime);
yyjson_mut_obj_add_strbuf(doc, obj, "name", &user->name);
yyjson_mut_obj_add_strbuf(doc, obj, "tty", &user->tty);
}
exit:
FF_LIST_FOR_EACH(FFUserResult, user, results)
{
ffStrbufDestroy(&user->clientIp);
ffStrbufDestroy(&user->hostName);
ffStrbufDestroy(&user->tty);
ffStrbufDestroy(&user->name);
}
}
+1
View File
@@ -9,3 +9,4 @@ void ffInitUsersOptions(FFUsersOptions* options);
bool ffParseUsersCommandOptions(FFUsersOptions* options, const char* key, const char* value);
void ffDestroyUsersOptions(FFUsersOptions* options);
void ffParseUsersJsonObject(FFUsersOptions* options, yyjson_val* module);
void ffGenerateUsersJson(FFUsersOptions* options, yyjson_mut_doc* doc, yyjson_mut_val* module);