From 060ad722fe2aeb89fd9890bf4466f26c99f79507 Mon Sep 17 00:00:00 2001 From: Laurent Ghigonis Date: Sat, 24 Aug 2013 23:43:27 +0200 Subject: WIP --- v3/glougloud/Makefile | 2 +- v3/glougloud/probes.c | 69 ++++++++++++++++++++++++++++++++++- v3/glougloud/redis.c | 15 +++++--- v3/glougloud/viz.c | 31 ++++++++-------- v3/libglouglou/libglouglou.h | 2 +- v3/libglouglou/tests/test_exec_pipe.c | 5 +-- v3/libglouglou/utils.c | 11 +++--- 7 files changed, 101 insertions(+), 34 deletions(-) diff --git a/v3/glougloud/Makefile b/v3/glougloud/Makefile index bb62d67..202b96c 100644 --- a/v3/glougloud/Makefile +++ b/v3/glougloud/Makefile @@ -2,7 +2,7 @@ PROG = glougloud SOURCES = glougloud.c probes.c redis.c viz.c OBJECTS = $(SOURCES:.c=.o) CFLAGS+=-Wall -g -LDFLAGS=-levent -ldnet -lglouglou +LDFLAGS=-levent -ldnet -lglouglou -ldl -lhiredis USER_PROBES = _glougloud_probe USER_VIZ = _glougloud_viz diff --git a/v3/glougloud/probes.c b/v3/glougloud/probes.c index e38a81f..7482a50 100644 --- a/v3/glougloud/probes.c +++ b/v3/glougloud/probes.c @@ -1,10 +1,75 @@ -#include +#include + +#include #include "glougloud.h" +struct glougloud_probes { + int pid; + struct event_base *evb; + struct modules *mods; + redisAsyncContext *rc; +}; + +struct glougloud *_ggd; +struct glougloud_probes *_probes; + +void cb_connect(const redisAsyncContext *c, int status) +{ + if (status != REDIS_OK) { + log_warn("redis error: %s", c->errstr); + return; + } + log_info("redis connected\n"); +} + +void cb_disconnect(const redisAsyncContext *c, int status) +{ + if (status != REDIS_OK) { + log_warn("redis error: %s", c->errstr); + return; + } + log_info("redis disconnected"); +} + +int +prb_handle_conn(struct gg_server *srv, struct gg_user *usr) +{ + // XXX + return 0; +} + +int +prb_handle_packet(struct gg_server *srv, struct gg_user *usr, struct gg_packet *pkt) +{ + // XXX + return 0; +} + int probes_init(struct glougloud *ggd) { - return -1; + _ggd = ggd; + _probes = xcalloc(1, sizeof(struct glougloud_probes)); + _probes->pid = fork(); + if (_probes->pid > 0) + return 0; + droppriv(GLOUGLOUD_USER_PROBES, 1, NULL); + + _probes->evb = event_base_new(); + _probes->mods = modules_load(GLOUGLOUD_MOD_PATH, NULL); + + _probes->rc = redis_connect(_probes->evb, cb_connect, cb_disconnect); + + // XXX libglouglou gg_server + _probes->server = gg_server_start(_probes->evb, + ggd->probes.serv_ip, ggd->probes.serv_port, + prb_handle_conn, prb_handle_packet, NULL); + + event_base_dispatch(_probes->evb); + + gg_server_stop(_probes); + + return 0; } void diff --git a/v3/glougloud/redis.c b/v3/glougloud/redis.c index c41c780..8589326 100644 --- a/v3/glougloud/redis.c +++ b/v3/glougloud/redis.c @@ -21,16 +21,20 @@ int redis_init(struct glougloud *ggd) { char redis_conf[4096]; char *echo_args[] = {"echo", redis_conf, NULL}; - char *echo_env[] = {NULL}; char *redis_args[] = {"redis-server", "-", NULL}; - char *redis_env[] = {NULL}; + char newpath[4096]; + char *path; _ggd = ggd; _redis = xcalloc(1, sizeof(struct glougloud_redis)); _redis->pid = fork(); if (_redis->pid > 0) return 0; - droppriv(GLOUGLOUD_USER_PROBES, 1, NULL); + droppriv(GLOUGLOUD_USER_PROBES, 0, NULL); + path = getenv("PATH"); + snprintf(newpath, sizeof(newpath), + "%s:/sbin:/usr/sbin:/usr/local/sbin", path); + setenv("PATH", newpath, 1); snprintf(redis_conf, sizeof(redis_conf), "daemonize no\n" @@ -40,6 +44,8 @@ redis_init(struct glougloud *ggd) { "unixsocketperm 750\n" "timeout 0\n" "loglevel notice\n" + /* XXX for the moment we log in glougloud log + * "logfile /var/log/glougloud/redis.log\n" */ "databases 16\n" "save 900 1\n" "save 300 10\n" @@ -50,8 +56,7 @@ redis_init(struct glougloud *ggd) { "slowlog-log-slower-than 10000\n" "slowlog-max-len 1024\n", _ggd->redis.socket); - exec_pipe("echo", echo_args, echo_env, - "redis-server", redis_args, redis_env); + exec_pipe("echo", echo_args, "redis-server", redis_args); log_warn("error starting redis server"); exit(EXIT_FAILURE); diff --git a/v3/glougloud/viz.c b/v3/glougloud/viz.c index daf87d1..182e086 100644 --- a/v3/glougloud/viz.c +++ b/v3/glougloud/viz.c @@ -6,11 +6,16 @@ struct glougloud_viz { int pid; + struct event_base *evb; + struct modules *mods; redisAsyncContext *rc; + struct { + struct event *ev; + } srv_tcp; }; struct glougloud *_ggd; -struct glougloud_viz *_ggdviz; +struct glougloud_viz *_viz; void cb_notification(redisAsyncContext *c, void *r, void *privdata) { @@ -47,29 +52,25 @@ cb_srv_conn(evutil_socket_t listener, short event, void *arg) int viz_init(struct glougloud *ggd) { - struct event_base *evb; - struct event *ev; - struct modules *mods; - redisAsyncContext *rc; - _ggd = ggd; - _ggdviz = xcalloc(1, sizeof(struct glougloud_viz)); - _ggdviz->pid = fork(); - if (_ggdviz->pid > 0) + _viz = xcalloc(1, sizeof(struct glougloud_viz)); + _viz->pid = fork(); + if (_viz->pid > 0) return 0; droppriv(GLOUGLOUD_USER_VIZ, 1, NULL); - evb = event_base_new(); + _viz->evb = event_base_new(); + _viz->mods = modules_load(GLOUGLOUD_MOD_PATH, NULL); - mods = modules_load(GLOUGLOUD_MOD_PATH, NULL); - - rc = redis_connect(evb, cb_connect, cb_disconnect); - redisAsyncCommand(rc, cb_notification, "event", + _viz->rc = redis_connect(_viz->evb, cb_connect, cb_disconnect); + redisAsyncCommand(_viz->rc, cb_notification, "event", "SUBSCRIBE __keyevent@ggd__:*"); - ev = tcp_server_create(evb, &_ggd->viz.serv_ip, + _viz->srv_tcp.ev = tcp_server_create(_viz->evb, &_ggd->viz.serv_ip, _ggd->viz.serv_port, cb_srv_conn, NULL); + event_base_dispatch(ev_base); + return 0; } diff --git a/v3/libglouglou/libglouglou.h b/v3/libglouglou/libglouglou.h index 034c232..3e2ebe6 100644 --- a/v3/libglouglou/libglouglou.h +++ b/v3/libglouglou/libglouglou.h @@ -81,7 +81,7 @@ void addrcpy(struct sockaddr_in *, struct sockaddr_in *); int addrcmp(struct sockaddr_in *, struct sockaddr_in *); void droppriv(char *, int, char *); struct modules *modules_load(char *, char *); -int exec_pipe(char *, char **, char **, char *, char **, char **); +int exec_pipe(char *, char **, char *, char **); void kill_wait(pid_t, int); struct event *tcp_server_create(struct event_base *, struct addr *, int, event_callback_fn, void *); struct event *udp_server_create(struct event_base *, struct addr *, int, event_callback_fn, void *); diff --git a/v3/libglouglou/tests/test_exec_pipe.c b/v3/libglouglou/tests/test_exec_pipe.c index f648bb2..0c49ad7 100644 --- a/v3/libglouglou/tests/test_exec_pipe.c +++ b/v3/libglouglou/tests/test_exec_pipe.c @@ -4,12 +4,9 @@ int main(int argc, char **argv) { char *echo_args[] = {"echo", "toto", NULL}; - char *echo_env[] = {NULL}; char *grep_args[] = {"grep", "-q", "toto", NULL}; - char *grep_env[] = {NULL}; - exec_pipe("/bin/echo", echo_args, echo_env, - "/bin/grep", grep_args, grep_env); + exec_pipe("echo", echo_args, "grep", grep_args); /* returns only on error */ return 1; diff --git a/v3/libglouglou/utils.c b/v3/libglouglou/utils.c index 3a936ad..1136869 100644 --- a/v3/libglouglou/utils.c +++ b/v3/libglouglou/utils.c @@ -149,8 +149,7 @@ err: /* pipe cmd1 stdout in cmd2 stdin * return only on error (execve cmd2) */ int -exec_pipe(char *cmd1, char **cmd1_args, char **cmd1_env, - char *cmd2, char **cmd2_args, char **cmd2_env) +exec_pipe(char *cmd1, char **cmd1_args, char *cmd2, char **cmd2_args) { int pfd[2]; @@ -160,15 +159,15 @@ exec_pipe(char *cmd1, char **cmd1_args, char **cmd1_env, dup2(pfd[1], 1); close(pfd[0]); close(pfd[1]); - execve(cmd1, cmd1_args, cmd1_env); - perror("execve"); + execvp(cmd1, cmd1_args); + perror("execvp"); exit(0); } dup2(pfd[0], 0); close(pfd[0]); close(pfd[1]); - execve(cmd2, cmd2_args, cmd2_env); - perror("execve"); + execvp(cmd2, cmd2_args); + perror("execvp"); return -1; } -- cgit v1.2.3-59-g8ed1b