From e59cd278cdd3d640371a350ec781716d9e1b3fd3 Mon Sep 17 00:00:00 2001 From: Bram Matthys Date: Sat, 7 Aug 2021 13:02:56 +0200 Subject: [PATCH] log { } now uses the new log system and is used for logging to disk, snomasks, opers, global (remote), .. For disk logs we currently ignore the sources and log everything. NOTE: REHASH is untested and will memory leak for sure. --- include/dynconf.h | 2 +- include/struct.h | 7 +- src/conf.c | 24 +---- src/log.c | 220 ++++++++++++++-------------------------------- 4 files changed, 76 insertions(+), 177 deletions(-) diff --git a/include/dynconf.h b/include/dynconf.h index 0dd7dabdb..6cb9c20ff 100644 --- a/include/dynconf.h +++ b/include/dynconf.h @@ -67,7 +67,7 @@ typedef enum BanTarget { BAN_TARGET_IP=1, BAN_TARGET_USERIP=2, BAN_TARGET_HOST=3 typedef enum HideIdleTimePolicy { HIDE_IDLE_TIME_NEVER=1, HIDE_IDLE_TIME_ALWAYS=2, HIDE_IDLE_TIME_USERMODE=3, HIDE_IDLE_TIME_OPER_USERMODE=4 } HideIdleTimePolicy; -typedef enum LogDestination { LOG_DEST_SNOMASK=0, LOG_DEST_OPER=1, LOG_DEST_GLOBAL=2, LOG_DEST_CHANNEL=3, LOG_DEST_DISK=4 } LogDestination; +typedef enum LogDestination { LOG_DEST_SNOMASK=0, LOG_DEST_OPER=1, LOG_DEST_GLOBAL=2, LOG_DEST_CHANNEL=3, LOG_DEST_OTHER=4 } LogDestination; /** The set { } block configuration */ typedef struct Configuration Configuration; diff --git a/include/struct.h b/include/struct.h index 960904cf7..79b53517d 100644 --- a/include/struct.h +++ b/include/struct.h @@ -274,8 +274,13 @@ struct LogSource { typedef struct Log Log; struct Log { Log *prev, *next; - char destination[CHANNELLEN+1]; LogSource *sources; + char destination[CHANNELLEN+1]; + char *file; + char *filefmt; + long maxsize; + int type; + int logfd; }; /* diff --git a/src/conf.c b/src/conf.c index f64ff2322..ff992684e 100644 --- a/src/conf.c +++ b/src/conf.c @@ -123,7 +123,6 @@ static ConfigCommand _ConfigCommands[] = { { "listen", _conf_listen, _test_listen }, { "loadmodule", NULL, _test_loadmodule}, { "log", config_run_log, config_test_log }, - { "logx", config_run_logx, config_test_logx }, { "me", _conf_me, _test_me }, { "official-channels", _conf_offchans, _test_offchans }, { "oper", _conf_oper, _test_oper }, @@ -238,7 +237,8 @@ ConfigItem_deny_channel *conf_deny_channel = NULL; ConfigItem_allow_channel *conf_allow_channel = NULL; ConfigItem_deny_link *conf_deny_link = NULL; ConfigItem_deny_version *conf_deny_version = NULL; -ConfigItem_log *conf_log = NULL; +Log *logs[5] = { NULL, NULL, NULL, NULL, NULL }; +Log *temp_logs[5] = { NULL, NULL, NULL, NULL, NULL }; ConfigItem_alias *conf_alias = NULL; ConfigItem_include *conf_include = NULL; ConfigItem_blacklist_module *conf_blacklist_module = NULL; @@ -1865,16 +1865,7 @@ void config_setdefaultsettings(Configuration *i) static void make_default_logblock(void) { - ConfigItem_log *ca = safe_alloc(sizeof(ConfigItem_log)); - - config_status("No log { } block found -- logging everything to 'ircd.log'"); - - safe_strdup(ca->file, "ircd.log"); - convert_to_absolute_path(&ca->file, LOGDIR); - ca->flags |= LOG_CHGCMDS|LOG_CLIENT|LOG_ERROR|LOG_KILL|LOG_KLINE|LOG_OPER|LOG_OVERRIDE|LOG_SACMDS|LOG_SERVER|LOG_SPAMFILTER|LOG_TKL; - ca->type = LOG_TYPE_TEXT; - ca->logfd = -1; - AddListItem(ca, conf_log); + // FIXME: move or don't move :) } /** Similar to config_setdefaultsettings but this one is applied *AFTER* @@ -2467,7 +2458,6 @@ void config_rehash() ConfigItem_allow_channel *allow_channel_ptr; ConfigItem_admin *admin_ptr; ConfigItem_deny_version *deny_version_ptr; - ConfigItem_log *log_ptr; ConfigItem_alias *alias_ptr; ConfigItem_help *help_ptr; ConfigItem_offchans *of_ptr; @@ -2658,14 +2648,6 @@ void config_rehash() conf_drpass->dieauth = NULL; safe_free(conf_drpass); } - for (log_ptr = conf_log; log_ptr; log_ptr = (ConfigItem_log *)next) { - next = (ListStruct *)log_ptr->next; - if (log_ptr->logfd != -1) - fd_close(log_ptr->logfd); - safe_free(log_ptr->file); - DelListItem(log_ptr, conf_log); - safe_free(log_ptr); - } for (alias_ptr = conf_alias; alias_ptr; alias_ptr = (ConfigItem_alias *)next) { RealCommand *cmptr = find_command(alias_ptr->alias, 0); ConfigItem_alias_format *fmt; diff --git a/src/log.c b/src/log.c index a6959f000..8b6989970 100644 --- a/src/log.c +++ b/src/log.c @@ -75,152 +75,6 @@ char *log_type_valtostring(LogType v) /***** CONFIGURATION ******/ -int config_test_log(ConfigFile *conf, ConfigEntry *ce) -{ - int fd, errors = 0; - ConfigEntry *cep, *cepp; - char has_flags = 0, has_maxsize = 0; - char *fname; - - if (!ce->value) - { - config_error("%s:%i: log block without filename", - ce->file->filename, ce->line_number); - return 1; - } - if (!ce->items) - { - config_error("%s:%i: empty log block", - ce->file->filename, ce->line_number); - return 1; - } - - /* Convert to absolute path (if needed) unless it's "syslog" */ - if (strcmp(ce->value, "syslog")) - convert_to_absolute_path(&ce->value, LOGDIR); - - for (cep = ce->items; cep; cep = cep->next) - { - if (!strcmp(cep->name, "flags")) - { - if (has_flags) - { - config_warn_duplicate(cep->file->filename, - cep->line_number, "log::flags"); - continue; - } - has_flags = 1; - if (!cep->items) - { - config_error_empty(cep->file->filename, - cep->line_number, "log", cep->name); - errors++; - continue; - } - for (cepp = cep->items; cepp; cepp = cepp->next) - { - // FIXME: old flags shit - } - } - else if (!strcmp(cep->name, "maxsize")) - { - if (has_maxsize) - { - config_warn_duplicate(cep->file->filename, - cep->line_number, "log::maxsize"); - continue; - } - has_maxsize = 1; - if (!cep->value) - { - config_error_empty(cep->file->filename, - cep->line_number, "log", cep->name); - errors++; - } - } - else if (!strcmp(cep->name, "type")) - { - if (!cep->value) - { - config_error_empty(cep->file->filename, - cep->line_number, "log", cep->name); - errors++; - continue; - } - if (!log_type_stringtoval(cep->value)) - { - config_error("%s:%i: unknown log type '%s'", - cep->file->filename, cep->line_number, - cep->value); - errors++; - } - } - else - { - config_error_unknown(cep->file->filename, cep->line_number, - "log", cep->name); - errors++; - continue; - } - } - - if (!has_flags) - { - config_error_missing(ce->file->filename, ce->line_number, - "log::flags"); - errors++; - } - - fname = unreal_strftime(ce->value); - if ((fd = fd_fileopen(fname, O_WRONLY|O_CREAT)) == -1) - { - config_error("%s:%i: Couldn't open logfile (%s) for writing: %s", - ce->file->filename, ce->line_number, - fname, strerror(errno)); - errors++; - } else - { - fd_close(fd); - } - - return errors; -} - -int config_run_log(ConfigFile *conf, ConfigEntry *ce) -{ - ConfigEntry *cep, *cepp; - ConfigItem_log *ca; - - ca = safe_alloc(sizeof(ConfigItem_log)); - ca->logfd = -1; - ca->type = LOG_TYPE_TEXT; /* default */ - if (strchr(ce->value, '%')) - safe_strdup(ca->filefmt, ce->value); - else - safe_strdup(ca->file, ce->value); - - for (cep = ce->items; cep; cep = cep->next) - { - if (!strcmp(cep->name, "maxsize")) - { - ca->maxsize = config_checkval(cep->value,CFG_SIZE); - } - else if (!strcmp(cep->name, "type")) - { - ca->type = log_type_stringtoval(cep->value); - } - else if (!strcmp(cep->name, "flags")) - { - for (cepp = cep->items; cepp; cepp = cepp->next) - { - // FIXME: old flags shit - } - } - } - AddListItem(ca, conf_log); - return 1; -} - LogSource *add_log_source(const char *str) { LogSource *ls; @@ -267,11 +121,11 @@ LogSource *add_log_source(const char *str) return ls; } -int config_test_logx(ConfigFile *conf, ConfigEntry *block) +int config_test_log(ConfigFile *conf, ConfigEntry *block) { int errors = 0; int any_sources = 0; - ConfigEntry *ce, *cep; + ConfigEntry *ce, *cep, *cepp; int destinations = 0; for (ce = block->items; ce; ce = ce->next) @@ -333,11 +187,45 @@ int config_test_logx(ConfigFile *conf, ConfigEntry *block) errors++; continue; } + convert_to_absolute_path(&cep->value, LOGDIR); + for (cepp = cep->items; cepp; cepp = cepp->next) + { + if (!strcmp(cepp->name, "type")) + { + if (!cepp->value) + { + config_error_empty(cepp->file->filename, + cepp->line_number, "log", cepp->name); + errors++; + continue; + } + if (!log_type_stringtoval(cepp->value)) + { + config_error("%s:%i: unknown log type '%s'", + cepp->file->filename, cepp->line_number, + cepp->value); + errors++; + } + } else + if (!strcmp(cepp->name, "maxsize")) + { + if (!cepp->value) + { + config_error_empty(cepp->file->filename, + cepp->line_number, "log", cepp->name); + errors++; + } + } else + { + config_error_unknown(cepp->file->filename, cepp->line_number, "log::destination::file", cepp->name); + errors++; + } + } } else if (!strcmp(cep->name, "global")) { destinations++; - } else + } else // TODO: re-add syslog support too { config_error_unknownopt(cep->file->filename, cep->line_number, "log::destination", cep->name); errors++; @@ -368,9 +256,9 @@ int config_test_logx(ConfigFile *conf, ConfigEntry *block) return errors; } -int config_run_logx(ConfigFile *conf, ConfigEntry *block) +int config_run_log(ConfigFile *conf, ConfigEntry *block) { - ConfigEntry *ce, *cep; + ConfigEntry *ce, *cep, *cepp; LogSource *sources = NULL; Log *log = safe_alloc(sizeof(Log)); int type; @@ -401,6 +289,7 @@ int config_run_logx(ConfigFile *conf, ConfigEntry *block) { if (!strcmp(cep->name, "snomask")) { + Log *log = safe_alloc(sizeof(Log)); strlcpy(log->destination, cep->value, sizeof(log->destination)); /* destination is the snomask */ log->sources = sources; if (!strcmp(cep->value, "all")) @@ -417,10 +306,33 @@ int config_run_logx(ConfigFile *conf, ConfigEntry *block) } else if (!strcmp(cep->name, "global")) { - Log *d = safe_alloc(sizeof(Log)); + Log *log = safe_alloc(sizeof(Log)); /* destination stays empty */ log->sources = sources; AddListItem(log, tempiConf.logs[LOG_DEST_GLOBAL]); + } else + if (!strcmp(cep->name, "file")) + { + Log *log = safe_alloc(sizeof(Log)); + log->sources = sources; + log->logfd = -1; + log->type = LOG_TYPE_TEXT; /* default */ + if (strchr(cep->value, '%')) + safe_strdup(log->filefmt, cep->value); + else + safe_strdup(log->file, cep->value); + for (cepp = cep->items; cepp; cepp = cepp->next) + { + if (!strcmp(cepp->name, "maxsize")) + { + log->maxsize = config_checkval(cepp->value,CFG_SIZE); + } + else if (!strcmp(cepp->name, "type")) + { + log->type = log_type_stringtoval(cepp->value); + } + } + AddListItem(log, tempiConf.logs[LOG_DEST_OTHER]); } } } @@ -985,7 +897,7 @@ literal: void do_unreal_log_disk(LogLevel loglevel, char *subsystem, char *event_id, char *msg, char *json_serialized) { static int last_log_file_warning = 0; - ConfigItem_log *l; + Log *l; char text_buf[2048], timebuf[128]; struct stat fstats; int n; @@ -1011,7 +923,7 @@ void do_unreal_log_disk(LogLevel loglevel, char *subsystem, char *event_id, char if (loop.config_test) return; - for (l = conf_log; l; l = l->next) + for (l = iConf.logs[LOG_DEST_OTHER]; l; l = l->next) { // FIXME: implement the proper log filters (eg what 'flags' previously was) //if (!(l->flags & flags))