]> git.itanic.dy.fi Git - rrdd/commitdiff
parser: Add network parser
authorTimo Kokkonen <kaapeli@itanic.dy.fi>
Sun, 27 Mar 2011 19:52:52 +0000 (22:52 +0300)
committerTimo Kokkonen <kaapeli@itanic.dy.fi>
Sun, 27 Mar 2011 20:00:55 +0000 (23:00 +0300)
This can be used for parsing network statistics from /proc/net/dev
interface. The desired interface is defined by giving string pointers
to interface names.

Signed-off-by: Timo Kokkonen <kaapeli@itanic.dy.fi>
parser.c
parser.h

index fe16aa8dc934fc79eac3d038c2f924aaae784a5c..65f264b167baea5bb59529779965b8c347d8daa7 100644 (file)
--- a/parser.c
+++ b/parser.c
@@ -175,3 +175,94 @@ int script_parser(char *rrd_data, void *parser_data)
 
        return 0;
 }
+
+struct iface_stats {
+       long int rx_bytes;
+       long int rx_packets;
+       long int tx_bytes;
+       long int tx_packets;
+};
+
+#define PROC_NETDEV    "/proc/net/dev"
+
+static int get_iface_stats(const char *iface, struct iface_stats *stat)
+{
+       FILE *netdev;
+       char buf[1024];
+       char if_name[16];
+       char *str;
+       int error;
+
+       netdev = fopen(PROC_NETDEV, "r");
+
+       if (netdev == NULL) {
+               error = errno;
+               pr_err("Failed to open file %s: %d (%s)\n",
+                       PROC_NETDEV, error, strerror(error));
+               return error;
+       }
+
+       while (fgets(buf, sizeof(buf), netdev)) {
+               get_word(buf, &str, if_name, sizeof(if_name));
+
+               /* Remove the ':' at the end of the if_name */
+               if_name[strlen(if_name) - 1] = 0;
+               if (strncmp(iface, if_name, sizeof(if_name)))
+                       continue;
+
+               stat->rx_bytes          = dec_to_longlong(str, &str);
+               stat->rx_packets        = dec_to_longlong(str, &str);
+               /* errs */                dec_to_longlong(str, &str);
+               /* drop */                dec_to_longlong(str, &str);
+               /* fifo */                dec_to_longlong(str, &str);
+               /* frame */               dec_to_longlong(str, &str);
+               /* compressed */          dec_to_longlong(str, &str);
+               /* multicast */           dec_to_longlong(str, &str);
+               stat->tx_bytes          = dec_to_longlong(str, &str);
+               stat->tx_packets        = dec_to_longlong(str, &str);
+
+               pr_info("rx_b %ld rx_p %ld tx_b %ld tx_p %ld\n",
+                       stat->rx_bytes, stat->rx_packets,
+                       stat->tx_bytes, stat->tx_packets);
+
+               return 0;
+       }
+
+       pr_err("Interface %s not found\n", iface);
+       return -ENODEV;
+}
+
+int netstats_parser(char *rrd_data, void *parser_data)
+{
+       struct iface_stats stat;
+       char **iface_name = parser_data, *original = rrd_data;
+       int max_str = RRD_DATA_MAX_LEN;
+       int ret;
+
+       while(*iface_name) {
+               pr_info("getting data for iface %s\n", *iface_name);
+               ret = get_iface_stats(*iface_name, &stat);
+
+               if (!ret) {
+                       ret = snprintf(rrd_data, max_str, "%ld:%ld:%ld:%ld",
+                               stat.rx_bytes, stat.rx_packets,
+                               stat.tx_bytes, stat.tx_packets);
+               } else {
+                       ret = snprintf(rrd_data, max_str, "U:U:U:U");
+               }
+
+               max_str -= ret;
+               rrd_data += ret;
+
+               iface_name++;
+               if (!*iface_name)
+                       break;
+
+               ret = snprintf(rrd_data, max_str, ":");
+               max_str -= ret;
+               rrd_data += ret;
+       }
+
+       printf("result: %s\n", original);
+       return 0;
+}
index a7ad7f05087116f69f87387351327ed68ed657af..bc28d7f193a755867d85dd86d515b8b7a0d4d18f 100644 (file)
--- a/parser.h
+++ b/parser.h
@@ -9,5 +9,6 @@ int cpu_mem_parser(char *data, void *p);
 int digitemp_parser(char *data, void *p);
 int digitemp_parser_mod(char *data, void *p);
 int script_parser(char *rrd_data, void *parser_data);
+int netstats_parser(char *rrd_data, void *parser_data);
 
 #endif