aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLaurent Ghigonis <laurent@p1sec.com>2013-08-24 23:43:27 +0200
committerLaurent Ghigonis <laurent@p1sec.com>2013-08-24 23:43:27 +0200
commit060ad722fe2aeb89fd9890bf4466f26c99f79507 (patch)
treedc7515b49dc7d663af86aef4a3de2d4df3077112
parentWIP cleanup (diff)
downloadglouglou-060ad722fe2aeb89fd9890bf4466f26c99f79507.tar.xz
glouglou-060ad722fe2aeb89fd9890bf4466f26c99f79507.zip
WIP
-rw-r--r--v3/glougloud/Makefile2
-rw-r--r--v3/glougloud/probes.c69
-rw-r--r--v3/glougloud/redis.c15
-rw-r--r--v3/glougloud/viz.c31
-rw-r--r--v3/libglouglou/libglouglou.h2
-rw-r--r--v3/libglouglou/tests/test_exec_pipe.c5
-rw-r--r--v3/libglouglou/utils.c11
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 <dnet.h>
+#include <unistd.h>
+
+#include <libglouglou.h>
#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;
}