event_log.c 2.59 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12
/* Icecast
 *
 * This program is distributed under the GNU General Public License, version 2.
 * A copy of this license is included with this source.
 *
 * Copyright 2014,      Philipp "ph3-der-loewe" Schafft <lion@lion.leolix.org>,
 */

#ifdef HAVE_CONFIG_H
#include <config.h>
#endif

13 14
#include <string.h>

15
#include "event.h"
16 17
#include "util.h"
#include "cfgfile.h"
18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61
#include "logging.h"
#define CATMODULE "event_log"


typedef struct event_log {
    char *prefix;
    int level;
} event_log_t;

static int event_log_emit(void *state, event_t *event) {
    event_log_t *self = state;

    ICECAST_LOG(self->level, "%s%strigger=\"%s\" uri=\"%s\" "
                             "connection_id=%lu connection_ip=\"%s\" connection_time=%lli "
                             "client_role=\"%s\" client_username=\"%s\" client_useragent=\"%s\" client_admin_command=%i",
                self->prefix ? self->prefix : "", self->prefix ? ": " : "",
                event->trigger,
                event->uri,
                event->connection_id, event->connection_ip, (long long int)event->connection_time,
                event->client_role, event->client_username, event->client_useragent, event->client_admin_command);
    return 0;
}

static void event_log_free(void *state) {
    event_log_t *self = state;
    free(self->prefix);
    free(self);
}

int event_get_log(event_registration_t *er, config_options_t *options) {
    event_log_t *self = calloc(1, sizeof(event_log_t));

    if (!self)
        return -1;

    self->prefix = strdup("Event");
    self->level  = ICECAST_LOGLEVEL_INFO;

    if (options) {
        do {
            if (options->type)
                continue;
            if (!options->name)
                continue;
62
            /* BEFORE RELEASE 2.5.0 DOCUMENT: Document supported options:
63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85
             * <option name="prefix" value="..." />
             * <option name="level" value="..." />
             */
            if (strcmp(options->name, "prefix") == 0) {
                free(self->prefix);
                self->prefix = NULL;
                if (options->value)
                    self->prefix = strdup(options->value);
            } else if (strcmp(options->name, "level") == 0) {
                self->level = ICECAST_LOGLEVEL_INFO;
                if (options->value)
                    self->level = util_str_to_loglevel(options->value);
            } else {
                ICECAST_LOG_ERROR("Unknown <option> tag with name %s.", options->name);
            }
        } while ((options = options->next));
    }

    er->state = self;
    er->emit = event_log_emit;
    er->free = event_log_free;
    return 0;
}