diff options
author | Laurent Ghigonis <laurent@p1sec.com> | 2013-08-21 03:19:45 +0200 |
---|---|---|
committer | Laurent Ghigonis <laurent@p1sec.com> | 2013-08-21 03:19:45 +0200 |
commit | b5d5d910984c2c52e14b1e05bab39e5128329325 (patch) | |
tree | 1754532e029d75934c17718ba276f1fa517ec7e4 | |
parent | architecture: progress (diff) | |
download | glouglou-b5d5d910984c2c52e14b1e05bab39e5128329325.tar.xz glouglou-b5d5d910984c2c52e14b1e05bab39e5128329325.zip |
v3 arch skeleton
-rwxr-xr-x | v3/Makefile | 7 | ||||
-rw-r--r-- | v3/glougloud/Makefile | 29 | ||||
-rw-r--r-- | v3/glougloud/glougloud.c | 121 | ||||
-rw-r--r-- | v3/glougloud/glougloud.h | 18 | ||||
-rw-r--r-- | v3/glougloud/probes.c | 12 | ||||
-rw-r--r-- | v3/glougloud/redis.c | 9 | ||||
-rw-r--r-- | v3/glougloud/viz.c | 12 | ||||
-rw-r--r-- | v3/libglouglou/Makefile | 27 | ||||
-rw-r--r-- | v3/libglouglou/libglouglou.h | 76 | ||||
-rw-r--r-- | v3/libglouglou/log.c | 117 | ||||
-rw-r--r-- | v3/libglouglou/probe.c | 0 | ||||
-rw-r--r-- | v3/libglouglou/proto.c | 0 | ||||
-rw-r--r-- | v3/libglouglou/server.c | 0 | ||||
-rw-r--r-- | v3/libglouglou/utils.c | 100 |
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(); +} + |