# HG changeset patch # User Tero Marttila # Date 1239550516 -10800 # Node ID 978041c1c04d848471584584aa9b007b18170dd8 # Parent e2d0c0c23b3982c95c6ce588d41e100a2fc3691b update TODO, partially update error.c, rename module_get to modules_get, update config.lua diff -r e2d0c0c23b39 -r 978041c1c04d TODO --- a/TODO Sun Apr 12 17:42:34 2009 +0300 +++ b/TODO Sun Apr 12 18:35:16 2009 +0300 @@ -15,10 +15,20 @@ irc_net: * reconnect, maybe cycling servers? +irc_chan: + * strdup irc_chan_info strings, currently lua_irc just leaks them + config: * user-defined types * return values +lua_console: + * some kind of remote console + irc_log: + * log messages sent by ourself * recode to valid UTF8 +logwatch: + * figure out how to handle overflow + diff -r e2d0c0c23b39 -r 978041c1c04d config.lua --- a/config.lua Sun Apr 12 17:42:34 2009 +0300 +++ b/config.lua Sun Apr 12 18:35:16 2009 +0300 @@ -1,4 +1,87 @@ -local conf = { + +-- +-- Helper functions +-- + +-- match all lines and output them as-is +local function logwatch_filter_all () + return { pat=nil, fmt=nil } +end + +-- match using a regex pattern, but output the full line +local function logwatch_filter_raw (pat) + return { pat=pat, fmt=nil } +end + +-- match using a regexp pattern, and output a formatted line +local function logwatch_filter (pat, fmt) + return { pat=pat, fmt=fmt } +end + +-- match auth.log sudo entries +local function logwatch_filter_sudo () + return logwatch_filter( + "(?P\\S+)\\s+sudo:\\s*(?P\\S+) : TTY=(?P\\S+) ; PWD=(?P.+?) ; USER=(?P\\S+) ; COMMAND=(?P.*)", + "{username}:{tty} - {target_user}@{hostname}:{pwd} - {command:r}" + ) +end + +-- +-- Procedural config +-- +local function apply_config (conf) + -- apply general + log_level(conf.log_level) + + -- apply conf.name + client:set_defaults(conf.name.nickname, conf.name.username, conf.name.realname) + + -- apply conf.networks + for network, settings in pairs(conf.networks) do + -- establish the irc_net + net = client:connect(network, settings.hostname) + + -- join each channel + for i, channel in ipairs(settings.channels) do + net:join(channel) + end + end + + -- apply conf.modules_path + if conf.modules_path then + modules:path(conf.modules_path) + end + + -- apply conf.modules + for name, settings in pairs(conf.modules) do + -- load the module + module = modules:load(name, settings.path) + + -- apply confs + for key, value in pairs(settings.conf) do + module:conf(key, value) + end + end + + -- conf.mod_logwatch + if conf.mod_logwatch then + module = modules:load("logwatch") + + for fifo_path, settings in pairs(conf.mod_logwatch) do + module:conf("source_fifo", fifo_path) + source_name = fifo_path + + for filter_name, filter in pairs(settings.filters) do + module:conf("filter", filter_name, source_name, filter.pat, filter.fmt, settings.channel) + end + end + end +end + +-- +-- Declarative configuration settings +-- +apply_config{ log_level = "DEBUG", name = { @@ -27,38 +110,17 @@ } } }, + + mod_logwatch = { + ["test.fifo"] = { + channel = "PVLNet/#test", + + filters = { + ["test.foo"] = logwatch_filter_raw("foo"), + ["test.sudo"] = logwatch_filter_sudo(), + } + }, + }, } --- apply general -log_level(conf.log_level) - --- apply conf.name -client:set_defaults(conf.name.nickname, conf.name.username, conf.name.realname) - --- apply conf.networks -for network, settings in pairs(conf.networks) do - -- establish the irc_net - net = client:connect(network, settings.hostname) - -- join each channel - for i, channel in ipairs(settings.channels) do - net:join(channel) - end -end - --- apply conf.modules_path -if conf.modules_path then - modules:path(conf.modules_path) -end - --- apply conf.modules -for name, settings in pairs(conf.modules) do - -- load the module - module = modules:load(name, settings.path) - - -- apply confs - for key, value in pairs(settings.conf) do - module:conf(key, value) - end -end - diff -r e2d0c0c23b39 -r 978041c1c04d src/error.c --- a/src/error.c Sun Apr 12 17:42:34 2009 +0300 +++ b/src/error.c Sun Apr 12 18:35:16 2009 +0300 @@ -32,6 +32,8 @@ { ERR_WRITE_EOF, "write: EOF", ERR_EXTRA_NONE }, { ERR_FCNTL, "fcntl", ERR_EXTRA_ERRNO }, { ERR_CLOSE, "close", ERR_EXTRA_ERRNO }, + { ERR_GETSOCKOPT, "getsockopt", ERR_EXTRA_ERRNO }, + { ERR_OPEN, "open", ERR_EXTRA_ERRNO }, { _ERR_INVALID, NULL, 0 } }, _sock_gnutls_error_desc[] = { diff -r e2d0c0c23b39 -r 978041c1c04d src/lua_objs.c --- a/src/lua_objs.c Sun Apr 12 17:42:34 2009 +0300 +++ b/src/lua_objs.c Sun Apr 12 18:35:16 2009 +0300 @@ -342,7 +342,7 @@ const char *name = luaL_checkstring(L, 2); // look it up, as a new reference - if ((module = module_get(lua_modules->modules, name)) == NULL) + if ((module = modules_get(lua_modules->modules, name)) == NULL) return luaL_error(L, "module_get: %s: no such module", name); // wrap diff -r e2d0c0c23b39 -r 978041c1c04d src/module.c --- a/src/module.c Sun Apr 12 17:42:34 2009 +0300 +++ b/src/module.c Sun Apr 12 18:35:16 2009 +0300 @@ -41,7 +41,7 @@ /** * module_get without the refcount stuff */ -static struct module* module_lookup (struct modules *modules, const char *name) +static struct module* modules_lookup (struct modules *modules, const char *name) { struct module *module = NULL; @@ -57,12 +57,12 @@ return NULL; } -struct module* module_get (struct modules *modules, const char *name) +struct module* modules_get (struct modules *modules, const char *name) { struct module *module; // get it - if (!(module = module_lookup(modules, name))) + if (!(module = modules_lookup(modules, name))) return NULL; // up the refcount @@ -193,7 +193,7 @@ return SET_ERROR(err, ERR_MODULE_NAME); // already open with the same name? - if (module_lookup(modules, _info->name)) + if (modules_lookup(modules, _info->name)) return SET_ERROR(err, ERR_MODULE_DUP); // alloc diff -r e2d0c0c23b39 -r 978041c1c04d src/module.h --- a/src/module.h Sun Apr 12 17:42:34 2009 +0300 +++ b/src/module.h Sun Apr 12 18:35:16 2009 +0300 @@ -211,7 +211,7 @@ * @param name the module name to get * @return the module struct, or NULL if not found */ -struct module* module_get (struct modules *modules, const char *name); +struct module* modules_get (struct modules *modules, const char *name); /** * Unload all modules, this just calls module_unload for each module, logging errors as warnings. diff -r e2d0c0c23b39 -r 978041c1c04d src/modules/logwatch.c --- a/src/modules/logwatch.c Sun Apr 12 17:42:34 2009 +0300 +++ b/src/modules/logwatch.c Sun Apr 12 18:35:16 2009 +0300 @@ -119,6 +119,9 @@ // lookup the channel if ((chan = logwatch_get_chan(ctx, irc_chan)) == NULL) RETURN_SET_ERROR_STR(err, ERR_MODULE_CONF, "logwatch_get_chan failed"); + + log_info("add filter: name=%s, source=%s, pattern=%s, format=%s, chan=%s", + name, source_name, pattern, format, irc_chan_name(irc_chan)); // invoke if ((filter = logwatch_filter(ctx, name, source, pattern, format, chan, err)) == NULL) diff -r e2d0c0c23b39 -r 978041c1c04d src/nexus.c --- a/src/nexus.c Sun Apr 12 17:42:34 2009 +0300 +++ b/src/nexus.c Sun Apr 12 18:35:16 2009 +0300 @@ -258,7 +258,7 @@ conf_value = opt; // lookup the module - if ((module = module_get(nexus->modules, module_name)) == NULL) + if ((module = modules_get(nexus->modules, module_name)) == NULL) RETURN_SET_ERROR_STR(err, ERR_CMD_OPT, "unknown module for --config"); // do the config