/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 <[email protected]>
---
 admin/zabbix/files/mac80211                 |  2 +-
 admin/zabbix/files/zabbix_helper_mac80211.c | 89 ++++++++++++++++++++++-------
 2 files changed, 68 insertions(+), 23 deletions(-)

diff --git a/admin/zabbix/files/mac80211 b/admin/zabbix/files/mac80211
index 1e5c086..93d8351 100644
--- a/admin/zabbix/files/mac80211
+++ b/admin/zabbix/files/mac80211
@@ -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)
 #
diff --git a/admin/zabbix/files/zabbix_helper_mac80211.c 
b/admin/zabbix/files/zabbix_helper_mac80211.c
index cb6d622..1442d27 100644
--- a/admin/zabbix/files/zabbix_helper_mac80211.c
+++ b/admin/zabbix/files/zabbix_helper_mac80211.c
@@ -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]);
+    }
 }
-- 
1.8.5.3
_______________________________________________
openwrt-devel mailing list
[email protected]
https://lists.openwrt.org/cgi-bin/mailman/listinfo/openwrt-devel

Reply via email to