aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLaurent Ghigonis <laurent@p1sec.com>2013-08-21 03:19:45 +0200
committerLaurent Ghigonis <laurent@p1sec.com>2013-08-21 03:19:45 +0200
commitb5d5d910984c2c52e14b1e05bab39e5128329325 (patch)
tree1754532e029d75934c17718ba276f1fa517ec7e4
parentarchitecture: progress (diff)
downloadglouglou-b5d5d910984c2c52e14b1e05bab39e5128329325.tar.xz
glouglou-b5d5d910984c2c52e14b1e05bab39e5128329325.zip
v3 arch skeleton
-rwxr-xr-xv3/Makefile7
-rw-r--r--v3/glougloud/Makefile29
-rw-r--r--v3/glougloud/glougloud.c121
-rw-r--r--v3/glougloud/glougloud.h18
-rw-r--r--v3/glougloud/probes.c12
-rw-r--r--v3/glougloud/redis.c9
-rw-r--r--v3/glougloud/viz.c12
-rw-r--r--v3/libglouglou/Makefile27
-rw-r--r--v3/libglouglou/libglouglou.h76
-rw-r--r--v3/libglouglou/log.c117
-rw-r--r--v3/libglouglou/probe.c0
-rw-r--r--v3/libglouglou/proto.c0
-rw-r--r--v3/libglouglou/server.c0
-rw-r--r--v3/libglouglou/utils.c100
14 files changed, 528 insertions, 0 deletions
diff --git a/v3/Makefile b/v3/Makefile
new file mode 100755
index 0000000..f3c2ca2
--- /dev/null
+++ b/v3/Makefile
@@ -0,0 +1,7 @@
+all:
+ cd libglouglou && $(MAKE) clean && $(MAKE) && sudo $(MAKE) install
+ cd glougloud && $(MAKE) clean && $(MAKE) && sudo $(MAKE) install
+
+clean:
+ cd libglouglou && $(MAKE) clean
+ cd glougloud && $(MAKE) clean
diff --git a/v3/glougloud/Makefile b/v3/glougloud/Makefile
new file mode 100644
index 0000000..bb62d67
--- /dev/null
+++ b/v3/glougloud/Makefile
@@ -0,0 +1,29 @@
+PROG = glougloud
+SOURCES = glougloud.c probes.c redis.c viz.c
+OBJECTS = $(SOURCES:.c=.o)
+CFLAGS+=-Wall -g
+LDFLAGS=-levent -ldnet -lglouglou
+USER_PROBES = _glougloud_probe
+USER_VIZ = _glougloud_viz
+
+PREFIX=/usr/local
+BINDIR=$(PREFIX)/bin
+
+all:
+ make $(OBJECTS)
+ $(CC) $(OBJECTS) -o $(PROG) $(LDFLAGS)
+
+install: $(PROG)
+ @echo "creating users $(USER_PROBES) and $(USER_VIZ)"
+ cmdp="useradd -r -d /var/empty/ -s /sbin/nologin $(USER_PROBES)" ;\
+ echo $$cmdp; $$($$cmdp) ;\
+ cmdp="useradd -r -d /var/empty/ -s /sbin/nologin $(USER_VIZ)" ;\
+ echo $$cmdp; $$($$cmdp) ;\
+ echo done
+ @echo "installation of $(PROG)"
+ mkdir -p $(BINDIR)
+ install -m 0755 $(PROG) $(BINDIR)
+
+clean:
+ rm -f $(PROG) $(OBJECTS) *~
+
diff --git a/v3/glougloud/glougloud.c b/v3/glougloud/glougloud.c
new file mode 100644
index 0000000..28a0a93
--- /dev/null
+++ b/v3/glougloud/glougloud.c
@@ -0,0 +1,121 @@
+#include <stdlib.h>
+#include <signal.h>
+#include <unistd.h>
+#include <err.h>
+#include <string.h>
+
+#include <event.h>
+#include <dnet.h>
+#include <libglouglou.h>
+
+#include "glougloud.h"
+
+struct event_base *ev_base;
+
+#if defined(__OPENBSD__)
+void __dead
+#else
+void
+#endif
+usage(void)
+{
+ extern char *__progname;
+
+ fprintf(stderr, "usage: %s [-Dhv] [-l probes_server_ip] [-L viz_server_ip]\n"
+ "\t\t[-p probes_server_port] [-P viz_server_port]\n", __progname);
+ exit(1);
+}
+
+static void
+sig_handler(int sig, short why, void *data)
+{
+ log_info("glougloud: got signal %d", sig);
+ if (sig == SIGINT || sig == SIGTERM)
+ event_base_loopexit(ev_base, NULL);
+}
+
+int
+main(int argc, char **argv)
+{
+ struct event *ev_sigint, *ev_sigterm, *ev_sigchld, *ev_sighup;
+ int pid, sr_pid, sp_pid, sv_pid;
+ struct addr sp_ip, sv_ip;
+ int sp_port = GLOUGLOU_PROBE_DEFAULT_PORT;
+ int sv_port = GLOUGLOU_VIZ_DEFAULT_PORT;
+ int daemonize = 1;
+ int loglevel = LOG_WARN;
+ int op;
+
+ addr_aton("127.0.0.1", &sp_ip);
+ addr_aton("127.0.0.1", &sv_ip);
+ while ((op = getopt(argc, argv, "Dhl:L:p:P:v")) != -1) {
+ switch (op) {
+ case 'D':
+ daemonize = 0;
+ break;
+ case 'h':
+ usage();
+ /* NOTREACHED */
+ case 'l':
+ if (addr_aton(optarg, &sp_ip) < 0)
+ err(1, "invalid probes server ip");
+ break;
+ case 'L':
+ if (addr_aton(optarg, &sv_ip) < 0)
+ err(1, "invalid vizualisation server ip");
+ break;
+ case 'p':
+ sp_port = atoi(optarg);
+ break;
+ case 'P':
+ sv_port = atoi(optarg);
+ break;
+ case 'v':
+ loglevel++;
+ break;
+ default:
+ usage();
+ /* NOTREACHED */
+ }
+ }
+
+ if (geteuid() != 0)
+ errx(1, "must be root");
+ log_init(GLOUGLOUD_LOGFILE, loglevel);
+
+ ev_base = event_base_new();
+ ev_sigint = evsignal_new(ev_base, SIGINT, sig_handler, NULL);
+ ev_sigterm = evsignal_new(ev_base, SIGTERM, sig_handler, NULL);
+ ev_sigchld = evsignal_new(ev_base, SIGCHLD, sig_handler, NULL);
+ ev_sighup = evsignal_new(ev_base, SIGHUP, sig_handler, NULL);
+ evsignal_add(ev_sigint, NULL);
+ evsignal_add(ev_sigterm, NULL);
+ evsignal_add(ev_sigchld, NULL);
+ evsignal_add(ev_sighup, NULL);
+ signal(SIGPIPE, SIG_IGN);
+
+ sr_pid = redis_init();
+ if (sr_pid < 0)
+ log_fatal("init redis failed");
+ sp_pid = probes_init(&sp_ip, sp_port);
+ if (sp_pid < 0)
+ log_fatal("init probes failed");
+ sv_pid = viz_init(&sv_ip, sv_port);
+ if (sv_pid < 0)
+ log_fatal("init viz failed");
+
+ if (daemonize) {
+ pid = fork();
+ log_info("daemonized, pid %d", pid);
+ if (pid > 0)
+ return 0;
+ }
+
+ event_base_dispatch(ev_base);
+
+ viz_shutdown();
+ probes_shutdown();
+ redis_shutdown();
+
+ return 0;
+}
diff --git a/v3/glougloud/glougloud.h b/v3/glougloud/glougloud.h
new file mode 100644
index 0000000..3a91b19
--- /dev/null
+++ b/v3/glougloud/glougloud.h
@@ -0,0 +1,18 @@
+/* glougloud internal */
+
+#define GLOUGLOUD_LOGFILE "/var/log/glougloud.log"
+
+/* redis.c */
+
+int redis_init();
+int redis_shutdown();
+
+/* probes.c */
+
+int probes_init(struct addr *ip, int port);
+int probes_shutdown();
+
+/* viz.c */
+
+int viz_init(struct addr *ip, int port);
+int viz_shutdown();
diff --git a/v3/glougloud/probes.c b/v3/glougloud/probes.c
new file mode 100644
index 0000000..f6a7134
--- /dev/null
+++ b/v3/glougloud/probes.c
@@ -0,0 +1,12 @@
+#include <dnet.h>
+
+int
+probes_init(struct addr *ip, int port) {
+ return -1;
+}
+
+int
+probes_shutdown() {
+ return -1;
+}
+
diff --git a/v3/glougloud/redis.c b/v3/glougloud/redis.c
new file mode 100644
index 0000000..7df7b35
--- /dev/null
+++ b/v3/glougloud/redis.c
@@ -0,0 +1,9 @@
+int
+redis_init() {
+ return -1;
+}
+
+int
+redis_shutdown() {
+ return -1;
+}
diff --git a/v3/glougloud/viz.c b/v3/glougloud/viz.c
new file mode 100644
index 0000000..7221642
--- /dev/null
+++ b/v3/glougloud/viz.c
@@ -0,0 +1,12 @@
+#include <dnet.h>
+
+int
+viz_init(struct addr *ip, int port) {
+ return -1;
+}
+
+int
+viz_shutdown() {
+ return -1;
+}
+
diff --git a/v3/libglouglou/Makefile b/v3/libglouglou/Makefile
new file mode 100644
index 0000000..520700e
--- /dev/null
+++ b/v3/libglouglou/Makefile
@@ -0,0 +1,27 @@
+#CFLAGS += -Wall -O2 -fPIC -shared -g
+CFLAGS += -Wall -O0 -fPIC -shared -g
+
+PREFIX=/usr/local
+INCLUDEDIR=$(PREFIX)/include
+LIBDIR=$(PREFIX)/lib
+LIBNAME=libglouglou
+
+TARGET = ${LIBNAME}.so
+SOURCES = log.c probe.c proto.c server.c utils.c
+HEADERS = libglouglou.h
+OBJECTS = $(SOURCES:.c=.o)
+
+all: $(TARGET)
+
+$(TARGET): $(OBJECTS)
+ $(CC) $(CFLAGS) -o $(TARGET) $(OBJECTS)
+
+install:
+ @echo "installation of $(LIBNAME)"
+ mkdir -p $(LIBDIR)
+ mkdir -p $(INCLUDEDIR)
+ install -m 0644 $(TARGET) $(LIBDIR)
+ install -m 0644 $(HEADERS) $(INCLUDEDIR)
+
+clean:
+ rm -f $(TARGET) $(OBJECTS)
diff --git a/v3/libglouglou/libglouglou.h b/v3/libglouglou/libglouglou.h
new file mode 100644
index 0000000..5a5fffd
--- /dev/null
+++ b/v3/libglouglou/libglouglou.h
@@ -0,0 +1,76 @@
+#ifndef _LIBGLOUGLOU_H_
+#define _LIBGLOUGLOU_H_
+
+#include <sys/types.h>
+#include <dnet.h>
+#include <event.h>
+
+#if defined(__OpenBSD__)
+#include <sys/queue.h>
+#else
+#include <bsd/sys/queue.h>
+#endif
+
+#define GLOUGLOU_PROBE_DEFAULT_PORT 4430
+#define GLOUGLOU_VIZ_DEFAULT_PORT 4431
+
+/* proto.c */
+
+struct gg_packet {
+
+};
+
+/* probe.c */
+
+struct gg_probe {
+
+};
+
+struct gg_probe *gg_probe_connect(struct addr *ip, int port,
+ int (*handle_conn)(struct gg_probe *prb),
+ int (*handle_pkt)(struct gg_probe *prb, struct gg_packet *pkt));
+void gg_probe_disconnect(struct gg_probe *);
+int gg_probe_send(struct gg_probe *probe, struct gg_packet *pkt);
+
+/* server.c */
+
+struct gg_server {
+
+};
+
+struct gg_server *gg_server_start(struct addr *ip, int port,
+ int (*handle_conn)(struct gg_server *srv),
+ int (*handle_pkt)(struct gg_server *srv, struct gg_packet *pkt));
+void gg_server_stop(struct gg_server *srv);
+
+/* log.c */
+
+#define LOG_FORCED -2
+#define LOG_FATAL -1
+#define LOG_WARN 0
+#define LOG_INFO 1
+#define LOG_DEBUG 2
+
+int log_init(char *, int);
+void log_shutdown(void);
+void log_tmp(const char *, ...);
+void log_debug(const char *, ...);
+void log_info(const char *, ...);
+void log_warn(const char *, ...);
+#if defined(__OpenBSD__)
+void __dead log_fatal(const char *, ...);
+#else
+void log_fatal(const char *, ...);
+#endif
+
+/* utils.c */
+
+void *xmalloc(size_t);
+void *xcalloc(size_t, size_t);
+void fd_nonblock(int);
+void addrcpy(struct sockaddr_in *, struct sockaddr_in *);
+int addrcmp(struct sockaddr_in *, struct sockaddr_in *);
+void droppriv(char *, int, char *);
+char *get_iface(char *);
+
+#endif /* _LIBGLOUGLOU_H_ */
diff --git a/v3/libglouglou/log.c b/v3/libglouglou/log.c
new file mode 100644
index 0000000..dfff7d5
--- /dev/null
+++ b/v3/libglouglou/log.c
@@ -0,0 +1,117 @@
+#include <sys/types.h>
+
+#if !defined(__OpenBSD__)
+#define __USE_GNU
+#define _GNU_SOURCE
+#endif
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <time.h>
+#include <err.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <time.h>
+
+#include "libglouglou.h"
+
+FILE *_logfile;
+static int _loglevel;
+
+static void logit(int, const char *, const char *, va_list);
+
+/*
+ * Log
+ * handles only one log file per process
+ */
+
+int
+log_init(char *filename, int level)
+{
+ _logfile = fopen(filename, "a+");
+ if (!_logfile) {
+ printf("cannot open log file %s!\n", filename);
+ return -1;
+ }
+ _loglevel = level;
+ return 0;
+}
+
+void
+log_shutdown(void)
+{
+ fclose(_logfile);
+}
+
+void
+log_tmp(const char *msg, ...)
+{
+ va_list ap;
+
+ va_start(ap, msg);
+ logit(LOG_FORCED, "XXX ", msg, ap);
+ va_end(ap);
+}
+
+void
+log_debug(const char *msg, ...)
+{
+ va_list ap;
+
+ va_start(ap, msg);
+ logit(LOG_DEBUG, "", msg, ap);
+ va_end(ap);
+}
+
+void
+log_info(const char *msg, ...)
+{
+ va_list ap;
+
+ va_start(ap, msg);
+ logit(LOG_INFO, "", msg, ap);
+ va_end(ap);
+}
+
+void
+log_warn(const char *msg, ...)
+{
+ va_list ap;
+
+ va_start(ap, msg);
+ logit(LOG_WARN, "", msg, ap);
+ va_end(ap);
+}
+
+#if defined(__OpenBSD__)
+void __dead
+#else
+void
+#endif
+log_fatal(const char *msg, ...)
+{
+ va_list ap;
+
+ va_start(ap, msg);
+ logit(LOG_FATAL, "fatal: ", msg, ap);
+ va_end(ap);
+
+ exit(1);
+}
+
+/* XXX mpsafe */
+static void
+logit(int level, const char *prefix, const char *msg, va_list ap)
+{
+ time_t clock;
+
+ if (level <= _loglevel) {
+ time(&clock);
+ fprintf(_logfile, "%d ", (int)clock);
+ vfprintf(_logfile, prefix, ap);
+ vfprintf(_logfile, msg, ap);
+ fprintf(_logfile, "\n");
+ fflush(_logfile);
+ }
+}
+
diff --git a/v3/libglouglou/probe.c b/v3/libglouglou/probe.c
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/v3/libglouglou/probe.c
diff --git a/v3/libglouglou/proto.c b/v3/libglouglou/proto.c
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/v3/libglouglou/proto.c
diff --git a/v3/libglouglou/server.c b/v3/libglouglou/server.c
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/v3/libglouglou/server.c
diff --git a/v3/libglouglou/utils.c b/v3/libglouglou/utils.c
new file mode 100644
index 0000000..42b2789
--- /dev/null
+++ b/v3/libglouglou/utils.c
@@ -0,0 +1,100 @@
+#include <sys/types.h>
+
+#if !defined(__OpenBSD__)
+#define __USE_GNU
+#define _GNU_SOURCE
+#endif
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <time.h>
+#include <err.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <time.h>
+#include <pwd.h>
+#include <grp.h>
+#include <string.h>
+
+#include "libglouglou.h"
+
+/*
+ * Various utils
+ */
+
+void *
+xmalloc(size_t size)
+{
+ void *data;
+
+ data = malloc(size);
+ if (!data)
+ err(1, "could not malloc %d", (int)size);
+ return data;
+}
+
+void *
+xcalloc(size_t nmemb, size_t size)
+{
+ void *data;
+
+ data = calloc(nmemb, size);
+ if (!data)
+ err(1, "could not calloc %d", (int)size);
+ return data;
+}
+
+void
+fd_nonblock(int fd)
+{
+ int flags = fcntl(fd, F_GETFL, 0);
+ int rc = fcntl(fd, F_SETFL, flags | O_NONBLOCK);
+ if (rc == -1)
+ err(1, "failed to set fd %i non-blocking", fd);
+}
+
+void
+addrcpy(struct sockaddr_in *dst, struct sockaddr_in *src)
+{
+ dst->sin_addr.s_addr = src->sin_addr.s_addr;
+ dst->sin_port = src->sin_port;
+ dst->sin_family = src->sin_family;
+}
+
+int
+addrcmp(struct sockaddr_in *a, struct sockaddr_in *b)
+{
+ if (a->sin_addr.s_addr != b->sin_addr.s_addr)
+ return -1;
+ if (a->sin_port != b->sin_port)
+ return -2;
+ if (a->sin_family != b->sin_family)
+ return -3;
+ return 0;
+}
+
+void
+droppriv(char *user, int do_chroot, char *chroot_path)
+{
+ struct passwd *pw;
+
+ pw = getpwnam(user);
+ if (!pw)
+ err(1, "unknown user %s", user);
+ if (do_chroot) {
+ if (!chroot_path)
+ chroot_path = pw->pw_dir;
+ if (chroot(chroot_path) != 0)
+ err(1, "unable to chroot");
+ }
+ if (chdir("/") != 0)
+ err(1, "unable to chdir");
+ if (setgroups(1, &pw->pw_gid) == -1)
+ err(1, "setgroups() failed");
+ if (setresgid(pw->pw_gid, pw->pw_gid, pw->pw_gid) == -1)
+ err(1, "setresgid failed");
+ if (setresuid(pw->pw_uid, pw->pw_uid, pw->pw_uid) == -1)
+ err(1, "setresuid() failed");
+ endpwent();
+}
+