From: Lukáš Ježek Date: Fri, 28 May 2021 13:18:11 +0000 (+0200) Subject: log: groups lua interface X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=fb31ed2877becf290a323f52c52bbae58789d5e2;p=thirdparty%2Fknot-resolver.git log: groups lua interface --- diff --git a/daemon/engine.c b/daemon/engine.c index ecdba86d0..fa3b73115 100644 --- a/daemon/engine.c +++ b/daemon/engine.c @@ -177,6 +177,63 @@ 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) == 0) { + int grp_b = 1; + char *grp_name = kr_log_grp2name(1 << grp_b); + printf("groups: \n\t"); + while (grp_name) { + printf("%s%s, ", group_is_set(1 << grp_b) ? "*":"", grp_name); + if (grp_b%8 == 0) + printf("\n\t"); + ++grp_b; + grp_name = kr_log_grp2name(1 << grp_b); + } + printf("\n* = groups logged in debug level\n"); + return 0; + } + + if (lua_gettop(L) != 1 || (!lua_isstring(L, 1) && !lua_istable(L, 1))) + lua_error_p(L, "takes string or table of strings, type add_log_group() for help."); + + 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, type add_log_group() for help."); + 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) { @@ -461,6 +518,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 114bc9b8b..94317f198 100644 --- a/lib/log.c +++ b/lib/log.c @@ -20,6 +20,23 @@ 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 }, + { "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 }, @@ -106,6 +123,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 ddd143834..252d24daa 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; #define LOG_GRP_SYSTEM (1 << 1) #define LOG_GRP_CACHE (1 << 2) @@ -41,12 +44,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