summaryrefslogtreecommitdiff
path: root/if_err_.c
diff options
context:
space:
mode:
authorHelmut Grohne <helmut@subdivi.de>2009-01-22 14:30:31 +0000
committerHelmut Grohne <helmut@subdivi.de>2009-01-22 14:30:31 +0000
commit1de74e3d850636058f7283af732bcd3475c2d721 (patch)
tree5f22fbf851854c13289eedb9a6f34046f9f662f1 /if_err_.c
parentadfe37d22173407301c542596140119cb351c55b (diff)
downloadmunin-plugins-busybox-1de74e3d850636058f7283af732bcd3475c2d721.tar.gz
added if_err_ plugin
Diffstat (limited to 'if_err_.c')
-rw-r--r--if_err_.c123
1 files changed, 123 insertions, 0 deletions
diff --git a/if_err_.c b/if_err_.c
new file mode 100644
index 0000000..caee6b3
--- /dev/null
+++ b/if_err_.c
@@ -0,0 +1,123 @@
+#include <ctype.h>
+#include <libgen.h>
+#include <stdio.h>
+#include <string.h>
+#include <unistd.h>
+
+#define PROC_NET_DEV "/proc/net/dev"
+
+int if_err_(int argc, char **argv) {
+ char *interface;
+ FILE *f;
+ char buff[256], *s;
+ int i;
+
+ interface = basename(argv[0]);
+ if(strncmp(interface, "if_err_", 7) != 0) {
+ fputs("if_err_ invoked with invalid basename\n", stderr);
+ return 1;
+ }
+ interface += 7;
+
+ if(argc > 1) {
+ if(!strcmp(argv[1], "autoconf")) {
+ if(access(PROC_NET_DEV, R_OK) == 0) {
+ puts("yes");
+ return 0;
+ } else {
+ puts("no (/proc/net/dev not found)");
+ return 1;
+ }
+ }
+ if(!strcmp(argv[1], "suggest")) {
+ if(NULL == (f = fopen(PROC_NET_DEV, "r")))
+ return 1;
+ while(fgets(buff, 256, f)) {
+ for(s=buff;*s == ' ';++s)
+ ;
+ i = 0;
+ if(!strncmp(s, "eth", 3))
+ i = 3;
+ else if(!strncmp(s, "wlan", 4))
+ i = 4;
+ else if(!strncmp(s, "ath", 3))
+ i = 3;
+ else if(!strncmp(s, "ra", 2))
+ i = 2;
+ if(i == 0)
+ continue;
+ while(isdigit(s[i]))
+ ++i;
+ if(s[i] != ':')
+ continue;
+ s[i] = '\0';
+ puts(s);
+ }
+ fclose(f);
+ return 0;
+ }
+ if(!strcmp(argv[1], "config")) {
+ puts("graph_order rcvd trans");
+ printf("graph_title %s errors\n", interface);
+ puts("graph_args --base 1000\n"
+ "graph_vlabel packets in (-) / out (+) per "
+ "${graph_period}\n"
+ "graph_category network");
+ printf("graph_info This graph shows the amount of "
+ "errors on the %s network interface.\n",
+ interface);
+ puts("rcvd.label packets\n"
+ "rcvd.type COUNTER\n"
+ "rcvd.graph no\n"
+ "rcvd.warning 1\n"
+ "trans.label packets\n"
+ "trans.type COUNTER\n"
+ "trans.negative rcvd\n"
+ "trans.warning 1");
+ return 0;
+ }
+ }
+ if(NULL == (f = fopen(PROC_NET_DEV, "r")))
+ return 1;
+ while(fgets(buff, 256, f)) {
+ for(s=buff;*s == ' ';++s)
+ ;
+ if(0 != strncmp(s, interface, strlen(interface)))
+ continue;
+ s += strlen(interface);
+ if(*s != ':')
+ continue;
+ ++s;
+
+ while(*s == ' ')
+ ++s;
+
+ for(i=1;i<3;++i) {
+ while(isdigit(*s))
+ ++s;
+ while(isspace(*s))
+ ++s;
+ }
+ for(i=0;isdigit(s[i]);++i)
+ ;
+ printf("rcvd.value ");
+ fwrite(s, 1, i, stdout);
+ putchar('\n');
+ s += i;
+ while(isspace(*s))
+ ++s;
+
+ for(i=4;i<11;++i) {
+ while(isdigit(*s))
+ ++s;
+ while(isspace(*s))
+ ++s;
+ }
+ for(i=0;isdigit(s[i]);++i)
+ ;
+ printf("trans.value ");
+ fwrite(s, 1, i, stdout);
+ putchar('\n');
+ }
+ return 0;
+}