zabbix-extra-mac80211: fix mac80211.phydiscovery
authorHauke Mehrtens <hauke@hauke-m.de>
Wed, 5 Feb 2014 21:27:47 +0000 (21:27 +0000)
committerHauke Mehrtens <hauke@hauke-m.de>
Wed, 5 Feb 2014 21:27:47 +0000 (21:27 +0000)
/sys/kernel/debug/ is now only accessible to root,
use zabbix_helper_mac80211 (suid helper) to compute
mac80211.phydiscovery (the discovery rule)

Signed-off-by: Etienne CHAMPETIER <etienne.champetier@free.fr>
SVN-Revision: 39490

admin/zabbix/files/mac80211
admin/zabbix/files/zabbix_helper_mac80211.c

index 1e5c086410fff46123f406a8353ef286d9a0014f..93d8351898dfa42b59288270f71211b19829fc14 100644 (file)
@@ -7,7 +7,7 @@
 # mac80211 phy discovery (like 'phy0')
 # exemple: {"data":[{"{#PHY}":"phy0"}]}
 #
-UserParameter=mac80211.phydiscovery,for phy in $(ls /sys/kernel/debug/ieee80211/); do list="$list,"'{"{#PHY}":"'$phy'"}'; done; echo '{"data":['${list#,}']}'
+UserParameter=mac80211.phydiscovery,zabbix_helper_mac80211 discovery
 
 #phy statistics (you need {#PHY} as parameter)
 #
index cb6d622ccd2f52ae7d097858b018203892cbe158..1442d2743204c41f8624b11c8b0235502b1ae16f 100644 (file)
@@ -2,31 +2,76 @@
 #include <stdio.h>
 #include <string.h>
 #include <stdlib.h>
+#include <sys/types.h>
+#include <dirent.h>
+#include <stdbool.h>
 
-int main(int argc, char *argv[]) {
+int discovery()
+{
+    DIR *dir;
+    struct dirent *ent;
+    bool comma = false;
+    if ((dir = opendir ("/sys/kernel/debug/ieee80211/")) != NULL) {
+        printf("{\"data\":[");
+        while ((ent = readdir (dir)) != NULL) {
+            if (strcmp(".", ent->d_name) && strcmp("..", ent->d_name)) {
+                if (comma)
+                    printf(",");
+                printf("{\"{#PHY}\":\"%s\"}", ent->d_name);
+                comma = true;
+            }
+        }
+        printf("]}\n");
+        closedir(dir);
+    } else {
+        perror("");
+        return EXIT_FAILURE;
+    }
+    return EXIT_SUCCESS;
+}
 
-    if(argc == 3) {
-        char *phy = NULL;
-        char *stat = NULL;
-        char *filename = NULL;
-        FILE *f = NULL;
-        phy = basename(argv[1]);
-        stat = basename(argv[2]);
-        if(asprintf(&filename, "/sys/kernel/debug/ieee80211/%s/statistics/%s", phy, stat) > 0)
-            f = fopen(filename, "r");
+int get_param(char *phy, char *stat)
+{
+    char *filename = NULL;
+    FILE *f = NULL;
+    phy = basename(phy);
+    stat = basename(stat);
+    if (asprintf(&filename, "/sys/kernel/debug/ieee80211/%s/statistics/%s", phy, stat) > 0)
+        f = fopen(filename, "r");
 
-        if(f != NULL) {
-            char temp[256];
-            while (fgets(temp, 256, f) != NULL)
-                printf("%s",temp);
+    if (f != NULL) {
+        char temp[256];
+        while (fgets(temp, 256, f) != NULL)
+            printf("%s",temp);
 
-            fclose(f);
-        }
-        free(filename);
+        fclose(f);
     } else {
-        fprintf(stderr, "Usage: %s PHY STAT\n",argv[0]);
-        fprintf(stderr, " cat /sys/kernel/debug/ieee80211/PHY/statistics/STAT as root\n");
-        return 1;
-    } 
-    return 0;
+        perror("");
+        return EXIT_FAILURE;
+    }
+    free(filename);
+    return EXIT_SUCCESS;
+}
+
+int usage(char *name)
+{
+    fprintf(stderr, "Usage:\n");
+    fprintf(stderr, " %s discovery\n", name);
+    fprintf(stderr, " => print mac80211.phydiscovery discovery rule\n");
+    fprintf(stderr, " %s PHY STAT\n", name);
+    fprintf(stderr, " => cat /sys/kernel/debug/ieee80211/PHY/statistics/STAT as root\n");
+    return EXIT_FAILURE;
+}
+
+int main(int argc, char *argv[])
+{
+
+    switch (argc) {
+    case 2:
+        return discovery();
+    case 3:
+        return get_param(argv[1], argv[2]);
+    default:
+        return usage(argv[0]);
+    }
 }