11 #define STATFILE "/proc/stat"
13 int cpu_parser(char *data, void *p)
17 FILE *file = fopen(STATFILE, "r");
18 long long user, nice, sys, idle, wait, irq, softirq;
21 pr_err("Failed to open file %s\n", STATFILE);
25 if (!fgets(buf, 1024, file)) {
26 pr_err("Failed to read file %s\n", STATFILE);
31 user = dec_to_longlong(str, &str);
32 nice = dec_to_longlong(str, &str);
33 sys = dec_to_longlong(str, &str);
34 idle = dec_to_longlong(str, &str);
35 wait = dec_to_longlong(str, &str);
36 irq = dec_to_longlong(str, &str);
37 softirq = dec_to_longlong(str, &str);
39 snprintf(data, RRD_DATA_MAX_LEN, "%lld:%lld:%lld:%lld:%lld:%lld:%lld",
40 user, nice, sys, idle, wait, irq, softirq);
46 #define MEMFILE "/proc/meminfo"
48 int mem_parser(char *data, void *p)
50 char buf[1024], word[1024];
51 int free = 0, buffered = 0, cache = 0, active = 0, inactive = 0,
52 swapfree = 0, anon = 0, slab = 0, tables = 0, other = 0,
53 swaptotal = 0, total = 0;
54 FILE *file = fopen(MEMFILE, "r");
57 pr_err("Failed to open file %s\n", MEMFILE);
61 while (fgets(buf, 1024, file)) {
62 get_word(buf, 0, word, 1024);
64 if (!strcmp(word, "MemFree:")) {
65 free = dec_to_int(buf, NULL);
66 } else if (!strcmp(word, "MemTotal:")) {
67 total = dec_to_int(buf, NULL);
68 } else if (!strcmp(word, "Buffers:")) {
69 buffered = dec_to_int(buf, NULL);
70 } else if (!strcmp(word, "Cached:")) {
71 cache = dec_to_int(buf, NULL);
72 } else if (!strcmp(word, "Active:")) {
73 active = dec_to_int(buf, NULL);
74 } else if (!strcmp(word, "Inactive:")) {
75 inactive = dec_to_int(buf, NULL);
76 } else if (!strcmp(word, "SwapFree:")) {
77 swapfree = dec_to_int(buf, NULL);
78 } else if (!strcmp(word, "AnonPages:")) {
79 anon = dec_to_int(buf, NULL);
80 } else if (!strcmp(word, "Slab:")) {
81 slab = dec_to_int(buf, NULL);
82 } else if (!strcmp(word, "PageTables:")) {
83 tables = dec_to_int(buf, NULL);
84 } else if (!strcmp(word, "SwapTotal:")) {
85 swaptotal = dec_to_int(buf, NULL);
90 other = total - free - buffered - cache - anon - slab - tables;
92 snprintf(data, RRD_DATA_MAX_LEN, "%f:%f:%f:%f:%f:%f:%f:%f:%f:%f:%f",
103 (swaptotal - swapfree) / 1024.0);
108 int cpu_mem_parser(char *data, void *p)
110 char cpu[1024], mem[1024];
114 snprintf(data, RRD_DATA_MAX_LEN, "%s:%s", cpu, mem);
119 int digitemp_parser(char *data, void *p)
121 const char digitemp_cmd[] = "/usr/bin/digitemp";
122 char *const digitemp_args[] = { "", "-o2", "-a", "-q", 0 };
125 float t1 = 0, t2 = 0, t3 = 0;
128 pid = run_piped_stream(digitemp_cmd, digitemp_args, 0, &readf, 0);
130 pr_err("Failed to parse digitemp\n");
131 sprintf(data, "U:U");
135 ret = fscanf(readf, "%f %f %f", &t1, &t2, &t3);
139 pr_err("Failed to parse digitemp output: %s\n",
141 sprintf(data, "U:U");
148 /* Read whatever the process might be still printing out */
149 while (fgets(buf, 1024, readf));
151 harvest_zombies(pid);
152 snprintf(data, RRD_DATA_MAX_LEN, "%.2f:%.2f", t3, t2);
156 int digitemp_parser_mod(char *data, void *p)
161 ret = digitemp_parser(buf, p);
162 snprintf(data, RRD_DATA_MAX_LEN, "U:%s", buf);
167 /* Run a command and feed the output from stdout directly to rrdtool */
168 int script_parser(char *rrd_data, void *parser_data)
171 char **cmd = parser_data;
174 pid = run_piped_stream(cmd[0], &cmd[1], NULL, &readf, NULL);
175 ret = fread(rrd_data, RRD_DATA_MAX_LEN, 1, readf);
177 pr_info("Read %d bytes :%s\n", ret, rrd_data);
180 harvest_zombies(pid);
187 long long rx_packets;
189 long long tx_packets;
192 #define PROC_NETDEV "/proc/net/dev"
194 static int get_iface_stats(const char *iface, struct iface_stats *stat)
202 netdev = fopen(PROC_NETDEV, "r");
204 if (netdev == NULL) {
206 pr_err("Failed to open file %s: %d (%s)\n",
207 PROC_NETDEV, error, strerror(error));
211 while (fgets(buf, sizeof(buf), netdev)) {
212 get_word(buf, &str, if_name, sizeof(if_name));
214 /* Remove the ':' at the end of the if_name */
215 if_name[strlen(if_name) - 1] = 0;
216 if (strncmp(iface, if_name, sizeof(if_name)))
219 stat->rx_bytes = dec_to_longlong(str, &str);
220 stat->rx_packets = dec_to_longlong(str, &str);
221 /* errs */ dec_to_longlong(str, &str);
222 /* drop */ dec_to_longlong(str, &str);
223 /* fifo */ dec_to_longlong(str, &str);
224 /* frame */ dec_to_longlong(str, &str);
225 /* compressed */ dec_to_longlong(str, &str);
226 /* multicast */ dec_to_longlong(str, &str);
227 stat->tx_bytes = dec_to_longlong(str, &str);
228 stat->tx_packets = dec_to_longlong(str, &str);
230 pr_info("rx_b %lld rx_p %lld tx_b %lld tx_p %lld\n",
231 stat->rx_bytes, stat->rx_packets,
232 stat->tx_bytes, stat->tx_packets);
237 pr_err("Interface %s not found\n", iface);
241 int netstats_parser(char *rrd_data, void *parser_data)
243 struct iface_stats stat;
244 char **iface_name = parser_data, *original = rrd_data;
245 int max_str = RRD_DATA_MAX_LEN;
249 pr_info("getting data for iface %s\n", *iface_name);
250 ret = get_iface_stats(*iface_name, &stat);
253 ret = snprintf(rrd_data, max_str, "%lld:%lld:%lld:%lld",
254 stat.rx_bytes, stat.rx_packets,
255 stat.tx_bytes, stat.tx_packets);
257 ret = snprintf(rrd_data, max_str, "U:U:U:U");
267 ret = snprintf(rrd_data, max_str, ":");
272 printf("result: %s\n", original);