From: Lukáš Ježek Date: Fri, 28 May 2021 13:18:11 +0000 (+0200) Subject: log: groups lua interface X-Git-Tag: v5.4.0~2^2~55 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=b4c24c61acd78a8f34e2dae9559e43455e460a0a;p=thirdparty%2Fknot-resolver.git log: groups lua interface --- diff --git a/daemon/engine.c b/daemon/engine.c index 0ad23f902..6b4b5b82b 100644 --- a/daemon/engine.c +++ b/daemon/engine.c @@ -173,6 +173,48 @@ static int l_get_log_level(lua_State *L) return 0; } +static int handle_log_groups(lua_State *L, void (*action)(log_groups_t grp)) +{ + if (lua_gettop(L) != 1 || (!lua_isstring(L, 1) && !lua_istable(L, 1))) + lua_error_p(L, "takes string or table of strings"); + + if (lua_isstring(L, 1)) { + log_groups_t grp = kr_log_name2grp(lua_tostring(L, 1)); + if (grp == 0) + lua_error_p(L, "unknown group"); + action(grp); + } + + if (lua_istable(L, 1)) { + int idx = 1; + log_groups_t grp; + lua_pushnil(L); + while (lua_next(L, 1) != 0) { + if (!lua_isstring(L, -1)) + lua_error_p(L, "wrong value at index %d, must be string", idx); + grp = kr_log_name2grp(lua_tostring(L, -1)); + if (grp == 0) + lua_error_p(L, "unknown group \"%s\", type add_log_group() for help.", lua_tostring(L, -1)); + + action(grp); + ++idx; + lua_pop(L, 1); + } + } + + return 0; +} + +static int l_add_log_group(lua_State *L) +{ + return handle_log_groups(L, kr_log_add_group); +} + +static int l_del_log_group(lua_State *L) +{ + return handle_log_groups(L, kr_log_del_group); +} + char *engine_get_hostname(struct engine *engine) { static char hostname_str[KNOT_DNAME_MAXLEN]; if (!engine) { @@ -457,6 +499,10 @@ static int init_state(struct engine *engine) lua_setglobal(engine->L, "set_log_level"); lua_pushcfunction(engine->L, l_get_log_level); lua_setglobal(engine->L, "get_log_level"); + lua_pushcfunction(engine->L, l_add_log_group); + lua_setglobal(engine->L, "add_log_group"); + lua_pushcfunction(engine->L, l_del_log_group); + lua_setglobal(engine->L, "del_log_group"); lua_pushcfunction(engine->L, l_setuser); lua_setglobal(engine->L, "user"); lua_pushcfunction(engine->L, l_hint_root_file); diff --git a/lib/log.c b/lib/log.c index 72ce02940..4b335b3b4 100644 --- a/lib/log.c +++ b/lib/log.c @@ -20,6 +20,24 @@ log_level_t kr_log_level = LOG_CRIT; log_target_t kr_log_target = LOG_TARGET_STDOUT; log_groups_t kr_log_groups = 0; +log_group_names_t log_group_names[] = { + { "system", LOG_GRP_SYSTEM }, + { "cache", LOG_GRP_CACHE }, + { "io", LOG_GRP_IO }, + { "network", LOG_GRP_NETWORK }, + { "ta", LOG_GRP_TA }, + { "tls", LOG_GRP_TLS }, + { "gnutls", LOG_GRP_GNUTLS }, + { "tlsclient", LOG_GRP_TLSCLIENT }, + { "xdp", LOG_GRP_XDP }, + { "zimport", LOG_GRP_ZIMPORT }, + { "zscanner", LOG_GRP_ZSCANNER }, + { "doh", LOG_GRP_DOH }, + { "dnssec", LOG_GRP_DNSSEC }, + { "hint", LOG_GRP_HINT }, + { NULL, -1 }, +}; + #ifndef SYSLOG_NAMES syslog_code_t prioritynames[] = { { "alert", LOG_ALERT }, @@ -107,6 +125,33 @@ log_level_t kr_log_name2level(const char *name) return -1; } +char *kr_log_grp2name(log_groups_t group) +{ + for (int i = 0; log_group_names[i].g_val != -1; ++i) + { + if (log_group_names[i].g_val == group) + return log_group_names[i].g_name; + } + + return NULL; +} + +log_groups_t kr_log_name2grp(const char *name) +{ + if (!name) + return 0; + + for (int i = 0; log_group_names[i].g_name; ++i) + { + if (strcmp(log_group_names[i].g_name, name) == 0) + return log_group_names[i].g_val; + } + + return 0; +} + + + int kr_log_level_set(log_level_t level) { if (level < LOG_CRIT || level > LOG_DEBUG) diff --git a/lib/log.h b/lib/log.h index b5f76df56..18481272b 100644 --- a/lib/log.h +++ b/lib/log.h @@ -13,7 +13,6 @@ /* Targets */ -typedef int log_level_t; typedef enum { LOG_TARGET_SYSLOG = 0, LOG_TARGET_STDERR = 1, @@ -23,6 +22,10 @@ typedef enum { /* Groups */ typedef uint32_t log_groups_t; +typedef struct { + char *g_name; + log_groups_t g_val; +} log_group_names_t; /* Don't forget add name to log_group_names[] (log.c) */ #define LOG_GRP_SYSTEM (1 << 1) @@ -43,12 +46,20 @@ typedef uint32_t log_groups_t; KR_EXPORT extern log_groups_t kr_log_groups; KR_EXPORT +int group_is_set(log_groups_t group); +KR_EXPORT void kr_log_add_group(log_groups_t mask); KR_EXPORT void kr_log_del_group(log_groups_t mask); +KR_EXPORT +char *kr_log_grp2name(log_groups_t group); +KR_EXPORT +log_groups_t kr_log_name2grp(const char *name); /* Log */ +typedef int log_level_t; + KR_EXPORT extern log_level_t kr_log_level; KR_EXPORT