Files
fastfetch/src/modules/netio/netio.c
T

241 lines
8.1 KiB
C
Raw Normal View History

2023-09-26 16:26:15 +08:00
#include "common/printing.h"
#include "common/jsonconfig.h"
#include "common/parsing.h"
2023-09-27 00:05:37 +08:00
#include "detection/netio/netio.h"
#include "modules/netio/netio.h"
2023-09-26 16:26:15 +08:00
#include "util/stringUtils.h"
2023-09-27 00:05:37 +08:00
#define FF_NETIO_DISPLAY_NAME "Network IO"
#define FF_NETIO_NUM_FORMAT_ARGS 12
2023-09-26 16:26:15 +08:00
2023-09-27 00:05:37 +08:00
static int sortInfs(const FFNetIOResult* left, const FFNetIOResult* right)
2023-09-26 16:26:15 +08:00
{
return ffStrbufComp(&left->name, &right->name);
}
2023-09-27 00:05:37 +08:00
static void formatKey(const FFNetIOOptions* options, FFNetIOResult* inf, uint32_t index, FFstrbuf* key)
2023-09-26 16:26:15 +08:00
{
if(options->moduleArgs.key.length == 0)
{
if(!inf->name.length)
ffStrbufSetF(&inf->name, "unknown %u", (unsigned) index);
2023-09-27 00:05:37 +08:00
ffStrbufSetF(key, FF_NETIO_DISPLAY_NAME " (%s)", inf->name.chars);
2023-09-26 16:26:15 +08:00
}
else
{
ffStrbufClear(key);
ffParseFormatString(key, &options->moduleArgs.key, 2, (FFformatarg[]){
{FF_FORMAT_ARG_TYPE_UINT, &index},
{FF_FORMAT_ARG_TYPE_STRBUF, &inf->name},
});
}
}
2023-09-27 00:05:37 +08:00
void ffPrintNetIO(FFNetIOOptions* options)
2023-09-26 16:26:15 +08:00
{
2023-09-27 00:05:37 +08:00
FF_LIST_AUTO_DESTROY result = ffListCreate(sizeof(FFNetIOResult));
const char* error = ffDetectNetIO(&result, options);
2023-09-26 16:26:15 +08:00
if(error)
{
2023-09-27 00:05:37 +08:00
ffPrintError(FF_NETIO_DISPLAY_NAME, 0, &options->moduleArgs, "%s", error);
2023-09-26 16:26:15 +08:00
return;
}
ffListSort(&result, (const void*) sortInfs);
uint32_t index = 0;
FF_STRBUF_AUTO_DESTROY key = ffStrbufCreate();
FF_STRBUF_AUTO_DESTROY buffer = ffStrbufCreate();
FF_STRBUF_AUTO_DESTROY buffer2 = ffStrbufCreate();
2023-09-27 00:05:37 +08:00
FF_LIST_FOR_EACH(FFNetIOResult, inf, result)
2023-09-26 16:26:15 +08:00
{
formatKey(options, inf, result.length == 1 ? 0 : index + 1, &key);
ffStrbufClear(&buffer);
if(options->moduleArgs.outputFormat.length == 0)
{
ffPrintLogoAndKey(key.chars, 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT);
ffParseSize(inf->rxBytes, &buffer);
2023-09-27 00:05:37 +08:00
ffStrbufAppendS(&buffer, "/s (IN) - ");
2023-09-26 16:26:15 +08:00
ffParseSize(inf->txBytes, &buffer);
2023-09-27 00:05:37 +08:00
ffStrbufAppendS(&buffer, "/s (OUT)");
2023-09-26 22:34:37 +08:00
if (!options->defaultRouteOnly && inf->defaultRoute)
ffStrbufAppendS(&buffer, " *");
2023-09-26 16:26:15 +08:00
ffStrbufPutTo(&buffer, stdout);
}
else
{
ffStrbufClear(&buffer2);
ffParseSize(inf->rxBytes, &buffer);
2023-09-26 23:18:19 +08:00
ffStrbufAppendS(&buffer, "/s");
2023-09-26 16:26:15 +08:00
ffParseSize(inf->txBytes, &buffer2);
2023-09-26 23:18:19 +08:00
ffStrbufAppendS(&buffer2, "/s");
2023-09-27 00:05:37 +08:00
ffPrintFormatString(key.chars, 0, &options->moduleArgs, FF_PRINT_TYPE_NO_CUSTOM_KEY, FF_NETIO_NUM_FORMAT_ARGS, (FFformatarg[]){
2023-09-26 16:26:15 +08:00
{FF_FORMAT_ARG_TYPE_STRBUF, &buffer},
{FF_FORMAT_ARG_TYPE_STRBUF, &buffer2},
2023-09-26 23:18:19 +08:00
{FF_FORMAT_ARG_TYPE_STRBUF, &inf->name},
{FF_FORMAT_ARG_TYPE_BOOL, &inf->defaultRoute},
2023-09-26 16:26:15 +08:00
{FF_FORMAT_ARG_TYPE_UINT64, &inf->txBytes},
{FF_FORMAT_ARG_TYPE_UINT64, &inf->rxBytes},
{FF_FORMAT_ARG_TYPE_UINT64, &inf->txPackets},
{FF_FORMAT_ARG_TYPE_UINT64, &inf->rxPackets},
{FF_FORMAT_ARG_TYPE_UINT64, &inf->rxErrors},
{FF_FORMAT_ARG_TYPE_UINT64, &inf->txErrors},
{FF_FORMAT_ARG_TYPE_UINT64, &inf->rxDrops},
{FF_FORMAT_ARG_TYPE_UINT64, &inf->txDrops},
});
}
++index;
}
2023-09-26 22:34:37 +08:00
2023-09-27 00:05:37 +08:00
FF_LIST_FOR_EACH(FFNetIOResult, inf, result)
2023-09-26 22:34:37 +08:00
{
ffStrbufDestroy(&inf->name);
}
2023-09-26 16:26:15 +08:00
}
2023-09-27 00:05:37 +08:00
bool ffParseNetIOCommandOptions(FFNetIOOptions* options, const char* key, const char* value)
2023-09-26 16:26:15 +08:00
{
2023-09-27 00:05:37 +08:00
const char* subKey = ffOptionTestPrefix(key, FF_NETIO_MODULE_NAME);
2023-09-26 16:26:15 +08:00
if (!subKey) return false;
if (ffOptionParseModuleArgs(key, subKey, value, &options->moduleArgs))
return true;
2023-09-26 22:34:37 +08:00
if (ffStrEqualsIgnCase(subKey, "name-prefix"))
{
ffOptionParseString(key, value, &options->namePrefix);
return true;
}
if (ffStrEqualsIgnCase(subKey, "default-route-only"))
{
options->defaultRouteOnly = ffOptionParseBoolean(value);
return true;
}
2023-09-26 16:26:15 +08:00
return false;
}
2023-09-27 00:05:37 +08:00
void ffParseNetIOJsonObject(FFNetIOOptions* options, yyjson_val* module)
2023-09-26 16:26:15 +08:00
{
yyjson_val *key_, *val;
size_t idx, max;
yyjson_obj_foreach(module, idx, max, key_, val)
{
const char* key = yyjson_get_str(key_);
if(ffStrEqualsIgnCase(key, "type"))
continue;
if (ffJsonConfigParseModuleArgs(key, val, &options->moduleArgs))
continue;
2023-09-26 22:34:37 +08:00
if (ffStrEqualsIgnCase(key, "namePrefix"))
{
ffStrbufSetS(&options->namePrefix, yyjson_get_str(val));
continue;
}
if (ffStrEqualsIgnCase(key, "defaultRouteOnly"))
{
options->defaultRouteOnly = yyjson_get_bool(val);
continue;
}
2023-09-27 00:05:37 +08:00
ffPrintError(FF_NETIO_MODULE_NAME, 0, &options->moduleArgs, "Unknown JSON key %s", key);
2023-09-26 16:26:15 +08:00
}
}
2023-10-24 14:41:29 +08:00
void ffGenerateNetIOJsonConfig(FFNetIOOptions* options, yyjson_mut_doc* doc, yyjson_mut_val* module)
{
__attribute__((__cleanup__(ffDestroyNetIOOptions))) FFNetIOOptions defaultOptions;
ffInitNetIOOptions(&defaultOptions);
ffJsonConfigGenerateModuleArgsConfig(doc, module, &defaultOptions.moduleArgs, &options->moduleArgs);
if (!ffStrbufEqual(&options->namePrefix, &defaultOptions.namePrefix))
yyjson_mut_obj_add_strbuf(doc, module, "namePrefix", &options->namePrefix);
if (options->defaultRouteOnly != defaultOptions.defaultRouteOnly)
yyjson_mut_obj_add_bool(doc, module, "defaultRouteOnly", options->defaultRouteOnly);
}
2023-10-23 10:14:22 +08:00
void ffGenerateNetIOJsonResult(FFNetIOOptions* options, yyjson_mut_doc* doc, yyjson_mut_val* module)
2023-09-26 16:26:15 +08:00
{
2023-09-27 00:05:37 +08:00
FF_LIST_AUTO_DESTROY result = ffListCreate(sizeof(FFNetIOResult));
const char* error = ffDetectNetIO(&result, options);
2023-09-26 16:26:15 +08:00
if(error)
{
yyjson_mut_obj_add_str(doc, module, "error", error);
return;
}
yyjson_mut_val* arr = yyjson_mut_obj_add_arr(doc, module, "result");
2023-09-27 00:05:37 +08:00
FF_LIST_FOR_EACH(FFNetIOResult, counter, result)
2023-09-26 16:26:15 +08:00
{
yyjson_mut_val* obj = yyjson_mut_arr_add_obj(doc, arr);
yyjson_mut_obj_add_strbuf(doc, obj, "name", &counter->name);
2023-09-26 23:18:19 +08:00
yyjson_mut_obj_add_bool(doc, obj, "defaultRoute", counter->defaultRoute);
2023-09-26 16:26:15 +08:00
yyjson_mut_obj_add_uint(doc, obj, "txBytes", counter->txBytes);
yyjson_mut_obj_add_uint(doc, obj, "rxBytes", counter->rxBytes);
yyjson_mut_obj_add_uint(doc, obj, "txPackets", counter->txPackets);
yyjson_mut_obj_add_uint(doc, obj, "rxPackets", counter->rxPackets);
yyjson_mut_obj_add_uint(doc, obj, "rxErrors", counter->rxErrors);
yyjson_mut_obj_add_uint(doc, obj, "txErrors", counter->txErrors);
yyjson_mut_obj_add_uint(doc, obj, "rxDrops", counter->rxDrops);
yyjson_mut_obj_add_uint(doc, obj, "txDrops", counter->txDrops);
2023-09-26 22:34:37 +08:00
}
2023-09-26 16:26:15 +08:00
2023-09-27 00:05:37 +08:00
FF_LIST_FOR_EACH(FFNetIOResult, inf, result)
2023-09-26 22:34:37 +08:00
{
ffStrbufDestroy(&inf->name);
2023-09-26 16:26:15 +08:00
}
}
2023-10-07 13:40:40 +08:00
void ffPrintNetIOHelpFormat(void)
{
2023-10-07 21:06:31 +08:00
ffPrintModuleFormatHelp(FF_NETIO_MODULE_NAME, "{1} (IN) - {2} (OUT)", FF_NETIO_NUM_FORMAT_ARGS, (const char* []) {
2023-10-07 13:40:40 +08:00
"Size of data received per second (formatted)",
"Size of data sent per second (formatted)",
"Interface name",
2023-10-07 21:06:31 +08:00
"Is default route",
"Size of data received per second (in bytes)",
"Size of data sent per second (in bytes)",
"Number of packets received per second",
"Number of packets sent per second",
"Number of errors received per second",
"Number of errors sent per second",
"Number of packets dropped when receiving per second",
"Number of packets dropped when sending per second",
2023-10-07 13:40:40 +08:00
});
}
2023-10-23 13:32:18 +08:00
void ffInitNetIOOptions(FFNetIOOptions* options)
{
ffOptionInitModuleBaseInfo(
&options->moduleInfo,
FF_NETIO_MODULE_NAME,
ffParseNetIOCommandOptions,
ffParseNetIOJsonObject,
ffPrintNetIO,
ffGenerateNetIOJsonResult,
ffPrintNetIOHelpFormat,
2023-10-24 14:41:29 +08:00
ffGenerateNetIOJsonConfig
);
2023-10-23 13:32:18 +08:00
ffOptionInitModuleArg(&options->moduleArgs);
ffStrbufInit(&options->namePrefix);
options->defaultRouteOnly = true;
2023-10-23 13:32:18 +08:00
}
void ffDestroyNetIOOptions(FFNetIOOptions* options)
{
ffOptionDestroyModuleArg(&options->moduleArgs);
ffStrbufDestroy(&options->namePrefix);
}