Require setting the file name via file=/path/to/file for log file.

This commit is contained in:
Jan Vidar Krey 2011-08-16 12:59:17 +02:00
parent 169b8a4a75
commit bba7c0d05b
1 changed files with 128 additions and 21 deletions

View File

@ -1,7 +1,7 @@
/** /**
* This is a minimal example plugin for uhub. * A logging plugin for uhub.
* Logs to either file or syslog.
*/ */
#include "system.h" #include "system.h"
#include "adc/adcconst.h" #include "adc/adcconst.h"
#include "adc/sid.h" #include "adc/sid.h"
@ -9,40 +9,138 @@
#include "util/ipcalc.h" #include "util/ipcalc.h"
#include "plugin_api/handle.h" #include "plugin_api/handle.h"
#include "util/misc.h"
#include "util/config_token.h"
#include <syslog.h>
struct ip_addr_encap; struct ip_addr_encap;
struct log_data struct log_data
{ {
enum {
mode_file,
mode_syslog
} logmode;
char* logfile; char* logfile;
int fd; int fd;
}; };
static void reset(struct log_data* data)
{
/* set defaults */
data->logmode = mode_file;
data->logfile = NULL;
data->fd = -1;
}
static void set_error_message(struct plugin_handle* plugin, const char* msg) static void set_error_message(struct plugin_handle* plugin, const char* msg)
{ {
plugin->error_msg = msg; plugin->error_msg = msg;
} }
static int log_open_file(struct plugin_handle* plugin, struct log_data* data)
{
data->fd = open(data->logfile, O_CREAT | O_APPEND | O_NOATIME | O_LARGEFILE | O_WRONLY, 0664);
return (data->fd != -1);
}
static struct log_data* log_open(struct plugin_handle* plugin, const char* config) static int log_open_syslog(struct plugin_handle* plugin)
{
openlog("uhub", 0, LOG_USER);
return 1;
}
static struct log_data* parse_config(const char* line, struct plugin_handle* plugin)
{ {
struct log_data* data = (struct log_data*) hub_malloc(sizeof(struct log_data)); struct log_data* data = (struct log_data*) hub_malloc(sizeof(struct log_data));
data->logfile = strdup(config); struct cfg_tokens* tokens = cfg_tokenize(line);
data->fd = open(data->logfile, O_CREAT | O_APPEND | O_NOATIME | O_LARGEFILE | O_WRONLY, 0664); char* token = cfg_token_get_first(tokens);
if (data->fd == -1)
if (!data)
return 0;
reset(data);
while (token)
{ {
set_error_message(plugin, "Unable to open log file!"); struct cfg_settings* setting = cfg_settings_split(token);
hub_free(data->logfile);
hub_free(data); if (!setting)
return NULL; {
set_error_message(plugin, "Unable to parse startup parameters");
cfg_tokens_free(tokens);
hub_free(data);
return 0;
}
if (strcmp(cfg_settings_get_key(setting), "file") == 0)
{
data->logfile = strdup(cfg_settings_get_value(setting));
data->logmode = mode_file;
}
else if (strcmp(cfg_settings_get_key(setting), "syslog") == 0)
{
int use_syslog = 0;
if (!string_to_boolean(cfg_settings_get_value(setting), &use_syslog))
{
data->logmode = (use_syslog) ? mode_syslog : mode_file;
}
}
else
{
set_error_message(plugin, "Unknown startup parameters given");
cfg_tokens_free(tokens);
cfg_settings_free(setting);
hub_free(data);
return 0;
}
cfg_settings_free(setting);
token = cfg_token_get_next(tokens);
} }
if (data->logmode == mode_file)
{
if ((data->logmode == mode_file && !data->logfile))
{
set_error_message(plugin, "No log file is given, use file=<path>");
hub_free(data);
return 0;
}
if (!log_open_file(plugin, data))
{
hub_free(data->logfile);
hub_free(data);
set_error_message(plugin, "Unable to open log file");
return 0;
}
}
else
{
if (!log_open_syslog(plugin))
{
hub_free(data->logfile);
hub_free(data);
set_error_message(plugin, "Unable to open syslog");
return 0;
}
}
return data; return data;
} }
static void log_close(struct log_data* data) static void log_close(struct log_data* data)
{ {
hub_free(data->logfile); if (data->logmode == mode_file)
close(data->fd); {
hub_free(data->logfile);
close(data->fd);
}
else
{
closelog();
}
hub_free(data); hub_free(data);
} }
@ -54,16 +152,25 @@ static void log_message(struct log_data* data, const char *format, ...)
va_list args; va_list args;
ssize_t size = 0; ssize_t size = 0;
t = time(NULL); if (data->logmode == mode_file)
tmp = localtime(&t); {
strftime(logmsg, 32, "%Y-%m-%d %H:%M:%S ", tmp); t = time(NULL);
tmp = localtime(&t);
strftime(logmsg, 32, "%Y-%m-%d %H:%M:%S ", tmp);
va_start(args, format); va_start(args, format);
size = vsnprintf(logmsg + 20, 1004, format, args); size = vsnprintf(logmsg + 20, 1004, format, args);
va_end(args); va_end(args);
write(data->fd, logmsg, size + 20); write(data->fd, logmsg, size + 20);
fdatasync(data->fd); fdatasync(data->fd);
}
else
{
va_start(args, format);
vsyslog(LOG_INFO, format, args);
va_end(args);
}
} }
static void log_user_login(struct plugin_handle* plugin, struct plugin_user* user) static void log_user_login(struct plugin_handle* plugin, struct plugin_user* user)
@ -101,7 +208,7 @@ int plugin_register(struct plugin_handle* plugin, const char* config)
plugin->funcs.on_user_logout = log_user_logout; plugin->funcs.on_user_logout = log_user_logout;
plugin->funcs.on_user_nick_change = log_change_nick; plugin->funcs.on_user_nick_change = log_change_nick;
plugin->ptr = log_open(plugin, config); plugin->ptr = parse_config(config, plugin);
if (!plugin->ptr) if (!plugin->ptr)
return -1; return -1;
return 0; return 0;