]> git.ipfire.org Git - thirdparty/knot-resolver.git/commitdiff
log: groups lua interface
authorLukáš Ježek <lukas.jezek@nic.cz>
Fri, 28 May 2021 13:18:11 +0000 (15:18 +0200)
committerLukáš Ježek <lukas.jezek@nic.cz>
Tue, 22 Jun 2021 12:39:43 +0000 (14:39 +0200)
daemon/engine.c
lib/log.c
lib/log.h

index ecdba86d095196d3bed089f857eed4ae30e7033c..fa3b7311539004f4e602631314c827722af8f144 100644 (file)
@@ -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);
index 114bc9b8b07b3495e81c74ca75c3479bfc2302dd..94317f198f34f376b616dd404c9fcb2d482a6a7e 100644 (file)
--- 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)
index ddd1438342bffa1669f1130e79c9cff19c050291..252d24daaf5df092f47b0bce7f4cc31d3a90f680 100644 (file)
--- 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