diff --git a/package/gluon-respondd/src/respondd.c b/package/gluon-respondd/src/respondd.c index 1a3470735246cc0dcb4d5b734116ebd9f27114cc..5c038d181304b664563a0f4b05c2d1bb78cd1ca4 100644 --- a/package/gluon-respondd/src/respondd.c +++ b/package/gluon-respondd/src/respondd.c @@ -208,6 +208,82 @@ static struct json_object * get_memory(void) { return ret; } +static struct json_object * get_stat(void) { + FILE *f = fopen("/proc/stat", "r"); + if (!f) + return NULL; + + struct json_object *stat = json_object_new_object(); + struct json_object *ret = NULL; + + char *line = NULL; + size_t len = 0; + + while (getline(&line, &len, f) >= 0) { + char label[32]; + + if (sscanf(line, "%31s", label) != 1){ + goto invalid_stat_format; + } + + if (!strcmp(label, "cpu")) { + unsigned long long user, nice, system, idle, iowait, irq, softirq; + if(sscanf(line, "%*s %llu %llu %llu %llu %llu %llu %llu", + &user, &nice, &system, &idle, &iowait, &irq, &softirq) != 7) + goto invalid_stat_format; + + struct json_object *cpu = json_object_new_object(); + + json_object_object_add(cpu, "user", json_object_new_int64(user)); + json_object_object_add(cpu, "nice", json_object_new_int64(nice)); + json_object_object_add(cpu, "system", json_object_new_int64(system)); + json_object_object_add(cpu, "idle", json_object_new_int64(idle)); + json_object_object_add(cpu, "iowait", json_object_new_int64(iowait)); + json_object_object_add(cpu, "irq", json_object_new_int64(irq)); + json_object_object_add(cpu, "softirq", json_object_new_int64(softirq)); + + json_object_object_add(stat, "cpu", cpu); + } else if (!strcmp(label, "ctxt")) { + unsigned long long ctxt; + if(sscanf(line, "%*s %llu", &ctxt) != 1) + goto invalid_stat_format; + + json_object_object_add(stat, "ctxt", json_object_new_int64(ctxt)); + } else if (!strcmp(label, "intr")) { + unsigned long long total_intr; + if(sscanf(line, "%*s %llu", &total_intr) != 1) + goto invalid_stat_format; + + json_object_object_add(stat, "intr", json_object_new_int64(total_intr)); + } else if (!strcmp(label, "softirq")) { + unsigned long long total_softirq; + if(sscanf(line, "%*s %llu", &total_softirq) != 1) + goto invalid_stat_format; + + json_object_object_add(stat, "softirq", json_object_new_int64(total_softirq)); + } else if (!strcmp(label, "processes")) { + unsigned long long processes; + if(sscanf(line, "%*s %llu", &processes) != 1) + goto invalid_stat_format; + + json_object_object_add(stat, "processes", json_object_new_int64(processes)); + } + + } + + ret = stat; + +invalid_stat_format: + if (!ret) + json_object_put(stat); + + free(line); + fclose(f); + + return ret; +} + + static struct json_object * get_rootfs_usage(void) { struct statfs s; if (statfs("/", &s)) @@ -238,6 +314,7 @@ static struct json_object * respondd_provider_statistics(void) { json_object_object_add(ret, "rootfs_usage", get_rootfs_usage()); json_object_object_add(ret, "memory", get_memory()); + json_object_object_add(ret, "stat", get_stat()); add_uptime(ret); add_loadavg(ret);