diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..a01ee289 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +.*.swp diff --git a/tools/munin-node-c/.gitignore b/tools/munin-node-c/.gitignore new file mode 100644 index 00000000..91f33c2b --- /dev/null +++ b/tools/munin-node-c/.gitignore @@ -0,0 +1,4 @@ +# output files +/*.o +/munin-node-c +/plugins/* diff --git a/tools/munin-node-c/Makefile b/tools/munin-node-c/Makefile new file mode 100644 index 00000000..d4c79fdc --- /dev/null +++ b/tools/munin-node-c/Makefile @@ -0,0 +1,24 @@ +CC=gcc +CFLAGS=-W -Wall -pedantic -Wextra -g -O2 +OBJS=main.o +LINKS= + +%.o: %.c + ${CC} ${CFLAGS} -c $< -o $@ +all: munin-node-c + +munin-node-c: ${OBJS} + ${CC} ${CFLAGS} $^ -o $@ +clean: + rm -f munin-node-c ${OBJS} ${LINKS} + rm -Rf plugins + +plugins: plugins/.munin-plugins-busybox.installed + +plugins/.munin-plugins-busybox.installed: + mkdir -p plugins + cd ../munin-plugins-busybox && make + cd plugins && for i in $$(find ../../munin-plugins-busybox -type l); do ln -s $$i; done + touch plugins/.munin-plugins-busybox.installed + +.PHONY: all clean plugins diff --git a/tools/munin-node-c/README b/tools/munin-node-c/README new file mode 100644 index 00000000..67c1544f --- /dev/null +++ b/tools/munin-node-c/README @@ -0,0 +1,28 @@ +This is a rewrite of munin node in C. + +Pro: +---- + +The purpose is multiple: + + * reducing resource usage for embedded plateforms, specially when paired + with the C rewrite of the core plugins. + + * no need for Perl + + * Everything runs from inetd. + +Cons: +----- + + * You lose flexibility + + It is compiled code, so you have to create binaries. Even one for each + architecture. + + * Not all the features are implemented + + - root uid is not supported. All plugins are run with a single user, usually nobody. + - no socket is opened. Everything runs from inetd. + +GPLv2 - (C) 2013 Steve SCHNEPP diff --git a/tools/munin-node-c/main.c b/tools/munin-node-c/main.c new file mode 100644 index 00000000..483ca810 --- /dev/null +++ b/tools/munin-node-c/main.c @@ -0,0 +1,124 @@ +#include +#include +#include +#include +#include +#include +#include +#include + + +char VERSION[] = "1.0.0"; + +int verbose; + +char* host = ""; +char* plugin_dir = "plugins"; +char* spoolfetch_dir = ""; + +int main(int argc, char *argv[]) { + + int optch; + extern int opterr; + int optarg_len; + + char format[] = "vd:h:s:"; + + char line[LINE_MAX]; + + opterr = 1; + + while ((optch = getopt(argc, argv, format)) != -1) + switch (optch) { + case 'v': + verbose ++; + break; + case 'd': + optarg_len = strlen(optarg); + plugin_dir = (char *) malloc(optarg_len + 1); + strcpy(plugin_dir, optarg); + break; + case 'h': + optarg_len = strlen(optarg); + host = (char *) malloc(optarg_len + 1); + strcpy(host, optarg); + break; + case 's': + optarg_len = strlen(optarg); + spoolfetch_dir = (char *) malloc(optarg_len + 1); + strcpy(spoolfetch_dir, optarg); + break; + } + + /* get default hostname if not precised */ + if (! strlen(host)) { + host = (char *) malloc(HOST_NAME_MAX + 1); + gethostname(host, HOST_NAME_MAX); + } + + printf("# munin node at %s\n", host); + while (fgets(line, LINE_MAX, stdin) != NULL) { + char* cmd; + char* arg; + + line[LINE_MAX-1] = '\0'; + + cmd = strtok(line, " \t\n"); + arg = strtok(NULL, " \t\n"); + + if (!cmd || strlen(cmd) == 0) { + printf("# empty cmd\n"); + } else if (strcmp(cmd, "version") == 0) { + printf("munin c node version: %s\n", VERSION); + } else if (strcmp(cmd, "nodes") == 0) { + printf("%s\n", host); + printf(".\n"); + } else if (strcmp(cmd, "quit") == 0) { + return(0); + } else if (strcmp(cmd, "list") == 0) { + DIR* dirp = opendir(plugin_dir); + struct dirent* dp; + while ((dp = readdir(dirp)) != NULL) { + char cmdline[LINE_MAX]; + char* plugin_filename = dp->d_name;; + + if (plugin_filename[0] == '.') { + /* No dotted plugin */ + continue; + } + + sprintf(cmdline, "%s/%s", plugin_dir, plugin_filename); + if (access(cmdline, X_OK) == 0) { + printf("%s ", plugin_filename); + } + } + printf("\n"); + closedir(dirp); + } else if ( + strcmp(cmd, "config") == 0 || + strcmp(cmd, "fetch") == 0 + ) { + char cmdline[LINE_MAX]; + sprintf(cmdline, "%s/%s", plugin_dir, arg); + if (access(cmdline, X_OK) == -1) { + printf("# unknown plugin: %s\n", arg); + continue; + } + sprintf(cmdline, "exec %s/%s %s", plugin_dir, arg, cmd); + system(cmdline); + printf(".\n"); + } else if (strcmp(cmd, "cap") == 0) { + printf("cap "); + if (strlen(spoolfetch_dir)) { + printf("spool "); + } + printf("\n"); + } else if (strcmp(cmd, "spoolfetch") == 0) { + printf("# not implem yet cmd: %s\n", cmd); + } else { + printf("# unknown cmd: %s\n", cmd); + } + } + + return 0; +} diff --git a/tools/munin-plugins-busybox/.gitignore b/tools/munin-plugins-busybox/.gitignore new file mode 100644 index 00000000..5761abcf --- /dev/null +++ b/tools/munin-plugins-busybox/.gitignore @@ -0,0 +1 @@ +*.o