From c16249ff5007a4be8347204a93507e0d5482dcb0 Mon Sep 17 00:00:00 2001 From: mrb Date: Sat, 1 Jan 2011 14:55:41 -0500 Subject: [PATCH 1/4] first pass at a simple log --- .gitignore | 1 + Makefile | 2 +- conf.c | 5 ++++- conf.h | 3 +++ server.c | 17 ++++++++++++----- slog.c | 29 +++++++++++++++++++++++++++++ slog.h | 16 ++++++++++++++++ 7 files changed, 66 insertions(+), 7 deletions(-) create mode 100644 .gitignore create mode 100644 slog.c create mode 100644 slog.h diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..397b4a7 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +*.log diff --git a/Makefile b/Makefile index 0101958..b481b5b 100644 --- a/Makefile +++ b/Makefile @@ -2,7 +2,7 @@ OUT=webdis HIREDIS_OBJ=hiredis/hiredis.o hiredis/sds.o hiredis/net.o hiredis/async.o hiredis/dict.o JANSSON_OBJ=jansson/src/dump.o jansson/src/error.o jansson/src/hashtable.o jansson/src/load.o jansson/src/strbuffer.o jansson/src/utf.o jansson/src/value.o jansson/src/variadic.o FORMAT_OBJS=formats/json.o formats/raw.o formats/common.o -OBJS=webdis.o conf.o $(FORMAT_OBJS) cmd.o server.o $(HIREDIS_OBJ) $(JANSSON_OBJ) libb64/cencode.o acl.o +OBJS=webdis.o conf.o $(FORMAT_OBJS) cmd.o slog.o server.o $(HIREDIS_OBJ) $(JANSSON_OBJ) libb64/cencode.o acl.o CFLAGS=-O3 -Wall -Wextra -I. -Ijansson/src LDFLAGS=-levent diff --git a/conf.c b/conf.c index 839192d..4ab33c8 100644 --- a/conf.c +++ b/conf.c @@ -32,6 +32,7 @@ conf_read(const char *filename) { conf->http_port = 7379; conf->user = getuid(); conf->group = getgid(); + conf->logfile = "webdis.log"; j = json_load_file(filename, 0, &error); if(!j) { @@ -66,7 +67,9 @@ conf_read(const char *filename) { if((g = getgrnam(json_string_value(jtmp)))) { conf->group = g->gr_gid; } - } + } else if(strcmp(json_object_iter_key(kv),"logfile") == 0 && json_typeof(jtmp) == JSON_STRING){ + conf->logfile = strdup(json_string_value(jtmp)); + } } json_decref(j); diff --git a/conf.h b/conf.h index d700fe8..3d96522 100644 --- a/conf.h +++ b/conf.h @@ -20,6 +20,9 @@ struct conf { /* user/group */ uid_t user; gid_t group; + + /* Logfile */ + char *logfile; }; struct conf * diff --git a/server.c b/server.c index a285eca..4370a1e 100644 --- a/server.c +++ b/server.c @@ -1,6 +1,7 @@ #include "server.h" #include "conf.h" #include "cmd.h" +#include "slog.h" #include #include @@ -96,24 +97,26 @@ server_copy(const struct server *s) { void on_request(struct evhttp_request *rq, void *ctx) { - const char *uri = evhttp_request_uri(rq); struct server *s = ctx; int ret; - + if(!s->ac) { /* redis is unavailable */ printf("503\n"); evhttp_send_reply(rq, 503, "Service Unavailable", NULL); return; } - - /* check that the command can be executed */ + + + /* check that the command can be executed */ switch(rq->type) { case EVHTTP_REQ_GET: - ret = cmd_run(s, rq, 1+uri, strlen(uri)-1); + slog(s->cfg->logfile,1, uri); + ret = cmd_run(s, rq, 1+uri, strlen(uri)-1); break; case EVHTTP_REQ_POST: + slog(s->cfg->logfile,1, uri); ret = cmd_run(s, rq, (const char*)EVBUFFER_DATA(rq->input_buffer), EVBUFFER_LENGTH(rq->input_buffer)); @@ -121,11 +124,13 @@ on_request(struct evhttp_request *rq, void *ctx) { default: printf("405\n"); + slog(s->cfg->logfile,2, uri); evhttp_send_reply(rq, 405, "Method Not Allowed", NULL); return; } if(ret < 0) { + slog(s->cfg->logfile,2, uri); evhttp_send_reply(rq, 403, "Forbidden", NULL); } } @@ -139,10 +144,12 @@ server_start(struct server *s) { #endif /* start http server */ + slog(s->cfg->logfile,1,"Starting HTTP Server"); evhttp_bind_socket(s->http, s->cfg->http_host, s->cfg->http_port); evhttp_set_gencb(s->http, on_request, s); /* drop privileges */ + slog(s->cfg->logfile,1,"Dropping Privileges"); setuid(s->cfg->user); setgid(s->cfg->group); diff --git a/slog.c b/slog.c new file mode 100644 index 0000000..639a1b0 --- /dev/null +++ b/slog.c @@ -0,0 +1,29 @@ +/* A slog is a simple log. Basically extracted from antirez/redis. */ +#include "conf.h" + +#include +#include +#include +#include +#include +#include + +void slog(const char *logfile, int level, const char *body) { + const char *c = ".-*#"; + time_t now = time(NULL); + FILE *fp; + char buf[64]; + char msg[1024]; + + snprintf(msg, sizeof(msg), "%s", body); + + fp = (logfile == NULL) ? stdout : fopen(logfile,"a"); + if (!fp) return; + + strftime(buf,sizeof(buf),"%d %b %H:%M:%S",localtime(&now)); + fprintf(fp,"[%d] %s %c %s\n",(int)getpid(),buf,c[level],msg); + fprintf(stdout,"[%d] %s %c %s\n",(int)getpid(),buf,c[level],msg); + fflush(fp); + + if (logfile) fclose(fp); +} diff --git a/slog.h b/slog.h new file mode 100644 index 0000000..ea83d4e --- /dev/null +++ b/slog.h @@ -0,0 +1,16 @@ +#ifndef SLOG_H +#define SLOG_H + +#include "conf.h" + +#include +#include +#include +#include +#include +#include + +void +slog(const char *logfile, int level, const char *body); + +#endif From 133ceccbc5f90950712dccdd240a4985a7b98c52 Mon Sep 17 00:00:00 2001 From: mrb Date: Sat, 1 Jan 2011 14:56:44 -0500 Subject: [PATCH 2/4] gitignore tweak --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index 397b4a7..0c6994b 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,3 @@ *.log +*.o +webdis From 8af4ac463e389672c49ff755253ef395ec134ee2 Mon Sep 17 00:00:00 2001 From: mrb Date: Sat, 1 Jan 2011 17:02:07 -0500 Subject: [PATCH 3/4] remove unnecessary conf include --- slog.c | 2 -- slog.h | 5 +---- 2 files changed, 1 insertion(+), 6 deletions(-) diff --git a/slog.c b/slog.c index 639a1b0..042c63c 100644 --- a/slog.c +++ b/slog.c @@ -1,6 +1,4 @@ /* A slog is a simple log. Basically extracted from antirez/redis. */ -#include "conf.h" - #include #include #include diff --git a/slog.h b/slog.h index ea83d4e..e3cb70d 100644 --- a/slog.h +++ b/slog.h @@ -1,8 +1,6 @@ #ifndef SLOG_H #define SLOG_H -#include "conf.h" - #include #include #include @@ -10,7 +8,6 @@ #include #include -void -slog(const char *logfile, int level, const char *body); +void slog(const char *logfile, int level, const char *body); #endif From 958c6f3295035eeba79c5c8160355b627f8401e0 Mon Sep 17 00:00:00 2001 From: mrb Date: Mon, 3 Jan 2011 20:07:19 -0500 Subject: [PATCH 4/4] logging tweaks --- Makefile | 8 ++------ conf.c | 3 +++ conf.h | 11 ++++++++++- server.c | 12 +++++++++--- server.h | 3 +++ webdis.json | 4 +++- 6 files changed, 30 insertions(+), 11 deletions(-) diff --git a/Makefile b/Makefile index 635ae37..32f62dc 100644 --- a/Makefile +++ b/Makefile @@ -1,13 +1,9 @@ OUT=webdis HIREDIS_OBJ=hiredis/hiredis.o hiredis/sds.o hiredis/net.o hiredis/async.o hiredis/dict.o JANSSON_OBJ=jansson/src/dump.o jansson/src/error.o jansson/src/hashtable.o jansson/src/load.o jansson/src/strbuffer.o jansson/src/utf.o jansson/src/value.o jansson/src/variadic.o -<<<<<<< HEAD -FORMAT_OBJS=formats/json.o formats/raw.o formats/common.o -OBJS=webdis.o conf.o $(FORMAT_OBJS) cmd.o slog.o server.o $(HIREDIS_OBJ) $(JANSSON_OBJ) libb64/cencode.o acl.o -======= FORMAT_OBJS=formats/json.o formats/raw.o formats/common.o formats/custom-type.o -OBJS=webdis.o conf.o $(FORMAT_OBJS) cmd.o server.o $(HIREDIS_OBJ) $(JANSSON_OBJ) libb64/cencode.o acl.o ->>>>>>> d8298c355662c701727ae270897923bdbfa58aac +OBJS=webdis.o conf.o $(FORMAT_OBJS) cmd.o slog.o server.o $(HIREDIS_OBJ) $(JANSSON_OBJ) libb64/cencode.o acl.o + CFLAGS=-O3 -Wall -Wextra -I. -Ijansson/src LDFLAGS=-levent diff --git a/conf.c b/conf.c index 4ab33c8..7b0b961 100644 --- a/conf.c +++ b/conf.c @@ -33,6 +33,7 @@ conf_read(const char *filename) { conf->user = getuid(); conf->group = getgid(); conf->logfile = "webdis.log"; + conf->verbosity = WEBDIS_VERBOSE; j = json_load_file(filename, 0, &error); if(!j) { @@ -69,6 +70,8 @@ conf_read(const char *filename) { } } else if(strcmp(json_object_iter_key(kv),"logfile") == 0 && json_typeof(jtmp) == JSON_STRING){ conf->logfile = strdup(json_string_value(jtmp)); + } else if(strcmp(json_object_iter_key(kv),"verbosity") == 0 && json_typeof(jtmp) == JSON_INTEGER){ + conf->verbosity = (short)json_integer_value(jtmp); } } diff --git a/conf.h b/conf.h index 3d96522..edfc35f 100644 --- a/conf.h +++ b/conf.h @@ -1,8 +1,16 @@ #ifndef CONF_H #define CONF_H +#define WEBDIS_VERBOSE 0 +#define WEBDIS_QUIET 1 +#define WEBDIS_SILENT 2 + #include +typedef enum { + WARNING = 0 +} log_level; + struct conf { /* connection to Redis */ @@ -21,8 +29,9 @@ struct conf { uid_t user; gid_t group; - /* Logfile */ + /* Logging */ char *logfile; + log_level verbosity; }; struct conf * diff --git a/server.c b/server.c index f574711..255ab60 100644 --- a/server.c +++ b/server.c @@ -131,12 +131,12 @@ on_request(struct evhttp_request *rq, void *ctx) { /* check that the command can be executed */ switch(rq->type) { case EVHTTP_REQ_GET: - slog(s->cfg->logfile,1, uri); + webdis_log(s,1,uri); ret = cmd_run(s, rq, 1+uri, strlen(uri)-1); break; case EVHTTP_REQ_POST: - slog(s->cfg->logfile,1, uri); + webdis_log(s,1,uri); ret = cmd_run(s, rq, (const char*)EVBUFFER_DATA(rq->input_buffer), EVBUFFER_LENGTH(rq->input_buffer)); @@ -144,7 +144,7 @@ on_request(struct evhttp_request *rq, void *ctx) { default: printf("405\n"); - slog(s->cfg->logfile,2, uri); + webdis_log(s,1,"405"); evhttp_send_reply(rq, 405, "Method Not Allowed", NULL); return; } @@ -181,3 +181,9 @@ server_start(struct server *s) { event_base_dispatch(s->base); } +void +webdis_log(struct server *s, int level, const char *body){ + if(level > (int)s->cfg->verbosity){ + slog(s->cfg->logfile,level,body); + } +} diff --git a/server.h b/server.h index 998c9a0..a4f9528 100644 --- a/server.h +++ b/server.h @@ -31,5 +31,8 @@ server_copy(const struct server *s); void server_start(struct server *s); +void +webdis_log(struct server *s, int level, const char *body); + #endif diff --git a/webdis.json b/webdis.json index 611c3f5..0e2e4e1 100644 --- a/webdis.json +++ b/webdis.json @@ -16,5 +16,7 @@ "http_basic_auth": "user:password", "enabled": ["DEBUG"] } - ] + ], + "verbosity": 0, + "logfile": "webdis.log" }