From 7850c941c7f1c9e574edf0e3543a43755c97e1e5 Mon Sep 17 00:00:00 2001 From: lxsang Date: Wed, 3 Feb 2021 13:24:48 +0100 Subject: [PATCH] add unix domain socket support --- sysmon.c | 541 ++++++++++++++++++++++++++++----------------------- sysmond | Bin 86120 -> 93840 bytes sysmond.conf | 10 +- 3 files changed, 306 insertions(+), 245 deletions(-) diff --git a/sysmon.c b/sysmon.c index 257ec4e..951b880 100644 --- a/sysmon.c +++ b/sysmon.c @@ -14,59 +14,64 @@ #include #include #include +#include +#include #include "ini.h" - +#ifndef PREFIX +#define PREFIX +#endif #define DEFAULT_CONF_FILE (PREFIX "/etc/sysmond.conf") #define MODULE_NAME "sysmon" -// #define DEFAULT_INPUT "/sys/class/hwmon/hwmon2/device/in3_input" #define NET_INF_STAT_PT "/sys/class/net/%s/statistics/%s" -#define LOG_INIT(m) do { \ - setlogmask (LOG_UPTO (LOG_NOTICE)); \ - openlog ((m), LOG_CONS | LOG_PID | LOG_NDELAY, LOG_USER); \ - } while(0) +#define LOG_INIT(m) \ + do \ + { \ + setlogmask(LOG_UPTO(LOG_NOTICE)); \ + openlog((m), LOG_CONS | LOG_PID | LOG_NDELAY, LOG_USER); \ + } while (0) +#define M_LOG(m, a, ...) syslog((LOG_NOTICE), m "_log@[%s: %d]: " a "\n", __FILE__, \ + __LINE__, ##__VA_ARGS__) -#define M_LOG(m, a,...) syslog ((LOG_NOTICE),m "_log@[%s: %d]: " a "\n", __FILE__, \ - __LINE__, ##__VA_ARGS__) +#define M_ERROR(m, a, ...) syslog((LOG_ERR), m "_error@[%s: %d]: " a "\n", __FILE__, \ + __LINE__, ##__VA_ARGS__) -#define M_ERROR(m, a,...) syslog ((LOG_ERR),m "_error@[%s: %d]: " a "\n", __FILE__, \ - __LINE__, ##__VA_ARGS__) - -#define JSON_FMT "{" \ - "\"stamp_sec\": %lu," \ - "\"stamp_usec\": %lu," \ - "\"battery\": %.3f," \ - "\"battery_percent\": %.3f," \ - "\"battery_max_voltage\": %d," \ - "\"battery_min_voltage\": %d," \ - "\"cpu_temp\": %d," \ - "\"gpu_temp\": %d," \ - "\"cpu_usages\":[%s]," \ - "\"mem_total\": %lu," \ - "\"mem_free\": %lu," \ - "\"mem_used\": %lu," \ - "\"mem_buff_cache\": %lu," \ - "\"mem_available\": %lu," \ - "\"mem_swap_total\": %lu," \ - "\"mem_swap_free\": %lu," \ - "\"disk_total\": %lu," \ - "\"disk_free\": %lu," \ - "\"net\":[%s]" \ - "}" +#define JSON_FMT "{" \ + "\"stamp_sec\": %lu," \ + "\"stamp_usec\": %lu," \ + "\"battery\": %.3f," \ + "\"battery_percent\": %.3f," \ + "\"battery_max_voltage\": %d," \ + "\"battery_min_voltage\": %d," \ + "\"cpu_temp\": %d," \ + "\"gpu_temp\": %d," \ + "\"cpu_usages\":[%s]," \ + "\"mem_total\": %lu," \ + "\"mem_free\": %lu," \ + "\"mem_used\": %lu," \ + "\"mem_buff_cache\": %lu," \ + "\"mem_available\": %lu," \ + "\"mem_swap_total\": %lu," \ + "\"mem_swap_free\": %lu," \ + "\"disk_total\": %lu," \ + "\"disk_free\": %lu," \ + "\"net\":[%s]" \ + "}" -#define JSON_NET_FMT "{" \ - "\"name\":\"%s\"," \ - "\"rx\": %lu," \ - "\"tx\": %lu," \ - "\"rx_rate\": %.3f," \ - "\"tx_rate\": %.3f" \ - "}," +#define JSON_NET_FMT "{" \ + "\"name\":\"%s\"," \ + "\"rx\": %lu," \ + "\"tx\": %lu," \ + "\"rx_rate\": %.3f," \ + "\"tx_rate\": %.3f" \ + "}," #define MAX_BUF 256 -#define EQU(a,b) (strncmp(a,b,MAX_BUF) == 0) +#define EQU(a, b) (strncmp(a, b, MAX_BUF) == 0) #define MAX_NETWORK_INF 8 + typedef struct { char bat_in[MAX_BUF]; @@ -86,7 +91,8 @@ typedef struct uint16_t gpu; } sys_temp_t; -typedef struct { +typedef struct +{ char name[32]; unsigned long tx; unsigned long rx; @@ -94,7 +100,8 @@ typedef struct { float tx_rate; } sys_net_inf_t; -typedef struct { +typedef struct +{ uint8_t n_intf; /*Monitor up to 8 interfaces*/ sys_net_inf_t interfaces[MAX_NETWORK_INF]; @@ -107,13 +114,14 @@ typedef struct float percent; } sys_cpu_t; -typedef struct { +typedef struct +{ char mount_path[MAX_BUF]; unsigned long d_total; unsigned long d_free; } sys_disk_t; -typedef struct +typedef struct { unsigned long m_total; unsigned long m_free; @@ -124,11 +132,12 @@ typedef struct unsigned long m_swap_free; } sys_mem_t; -typedef struct { +typedef struct +{ char conf_file[MAX_BUF]; char data_file_out[MAX_BUF]; sys_bat_t bat_stat; - sys_cpu_t* cpus; + sys_cpu_t *cpus; sys_mem_t mem; sys_temp_t temp; sys_net_t net; @@ -158,39 +167,41 @@ static void help(const char *app) app); } -static void map(app_data_t* opt) +static void map(app_data_t *opt) { - float volt = opt->bat_stat.read_voltage*opt->bat_stat.ratio; - if(volt < opt->bat_stat.min_voltage) + float volt = opt->bat_stat.read_voltage * opt->bat_stat.ratio; + if (volt < opt->bat_stat.min_voltage) { opt->bat_stat.percent = 0.0; return; } float result = 101 - (101 / pow(1 + pow(1.33 * (volt - opt->bat_stat.min_voltage) / - (opt->bat_stat.max_voltage - opt->bat_stat.min_voltage), 4.5), 3)); - if(result > 100.0) + (opt->bat_stat.max_voltage - opt->bat_stat.min_voltage), + 4.5), + 3)); + if (result > 100.0) result = 100.0; - + opt->bat_stat.percent = result; } -static int guard_write(int fd, void* buffer, size_t size) +static int guard_write(int fd, void *buffer, size_t size) { int n = 0; int write_len; int st; - while(n != (int)size) + while (n != (int)size) { write_len = (int)size - n; - st = write(fd,buffer + n,write_len); - if(st == -1) + st = write(fd, buffer + n, write_len); + if (st == -1) { - M_ERROR(MODULE_NAME,"Unable to write to #%d: %s", fd, strerror(errno)); + M_ERROR(MODULE_NAME, "Unable to write to #%d: %s", fd, strerror(errno)); return -1; } - if(st == 0) + if (st == 0) { - M_ERROR(MODULE_NAME,"Endpoint %d is closed", fd); + M_ERROR(MODULE_NAME, "Endpoint %d is closed", fd); return -1; } n += st; @@ -198,6 +209,27 @@ static int guard_write(int fd, void* buffer, size_t size) return n; } +static int open_unix_socket(char *path) +{ + struct sockaddr_un address; + address.sun_family = AF_UNIX; + (void)memset(address.sun_path, 0, sizeof(address.sun_path)); + (void)memcpy(address.sun_path, path, sizeof(address.sun_path)); + int fd = socket(AF_UNIX, SOCK_STREAM, 0); + if (fd == -1) + { + M_ERROR(MODULE_NAME, "Unable to create Unix domain socket: %s", strerror(errno)); + return -1; + } + if (connect(fd, (struct sockaddr *)(&address), sizeof(address)) == -1) + { + M_ERROR(MODULE_NAME, "Unable to connect to socket '%s': %s", address.sun_path, strerror(errno)); + return -1; + } + M_LOG(MODULE_NAME, "Socket %s is created successfully", path); + return fd; +} + static int read_line(int fd, char *buf, int size) { int i = 0; @@ -218,22 +250,22 @@ static int read_line(int fd, char *buf, int size) return i; } -static int read_voltage(app_data_t* opts) +static int read_voltage(app_data_t *opts) { int fd, ret; - if(opts->bat_stat.bat_in[0] == '\0') + if (opts->bat_stat.bat_in[0] == '\0') { return 0; } fd = open(opts->bat_stat.bat_in, O_RDONLY); - if(fd < 0) + if (fd < 0) { M_ERROR(MODULE_NAME, "Unable to open input: %s", opts->bat_stat.bat_in); return -1; } (void)memset(buf, '\0', sizeof(buf)); ret = read(fd, buf, sizeof(buf)); - if(ret > 0) + if (ret > 0) { opts->bat_stat.read_voltage = atoi(buf); map(opts); @@ -242,14 +274,14 @@ static int read_voltage(app_data_t* opts) return 0; } -static int read_cpu_info(app_data_t* opts) +static int read_cpu_info(app_data_t *opts) { int fd, ret, j, i = 0; const char d[2] = " "; - char* token; + char *token; unsigned long sum = 0, idle = 0; fd = open("/proc/stat", O_RDONLY); - if(fd < 0) + if (fd < 0) { M_ERROR(MODULE_NAME, "Unable to open stat: %s", strerror(errno)); return -1; @@ -257,22 +289,23 @@ static int read_cpu_info(app_data_t* opts) for (i = 0; i < opts->n_cpus; i++) { ret = read_line(fd, buf, MAX_BUF); - if(ret > 0 && buf[0] == 'c' && buf[1] == 'p' && buf[2] == 'u') + if (ret > 0 && buf[0] == 'c' && buf[1] == 'p' && buf[2] == 'u') { - token = strtok(buf,d); + token = strtok(buf, d); sum = 0; j = 0; - while(token!=NULL) + while (token != NULL) { - token = strtok(NULL,d); - if(token!=NULL){ + token = strtok(NULL, d); + if (token != NULL) + { sum += strtoul(token, NULL, 10); - if(j==3) + if (j == 3) idle = strtoul(token, NULL, 10); j++; } } - opts->cpus[i].percent = 100 - (idle-opts->cpus[i].last_idle)*100.0/(sum-opts->cpus[i].last_sum); + opts->cpus[i].percent = 100 - (idle - opts->cpus[i].last_idle) * 100.0 / (sum - opts->cpus[i].last_sum); opts->cpus[i].last_idle = idle; opts->cpus[i].last_sum = sum; } @@ -282,8 +315,8 @@ static int read_cpu_info(app_data_t* opts) break; } } - (void) close(fd); - if(i==0) + (void)close(fd); + if (i == 0) { M_ERROR(MODULE_NAME, "No CPU info found"); return -1; @@ -291,23 +324,24 @@ static int read_cpu_info(app_data_t* opts) return i; } -static int read_mem_info(app_data_t* opts) +static int read_mem_info(app_data_t *opts) { int fd, ret; const char d[2] = " "; unsigned long data[7]; - char* token; + char *token; fd = open("/proc/meminfo", O_RDONLY); - if(fd < 0) + if (fd < 0) { M_ERROR(MODULE_NAME, "Unable to open meminfo: %s", strerror(errno)); return -1; } - for (int i = 0; i < 7; i++) { - ret = read_line(fd,buf,MAX_BUF); - token = strtok(buf,d); - token = strtok(NULL,d); - if(token != NULL) + for (int i = 0; i < 7; i++) + { + ret = read_line(fd, buf, MAX_BUF); + token = strtok(buf, d); + token = strtok(NULL, d); + if (token != NULL) { data[i] = (unsigned long)strtoul(token, NULL, 10); } @@ -315,25 +349,25 @@ static int read_mem_info(app_data_t* opts) { data[i] = 0; } - if(i == 4) + if (i == 4) { - for (int j = 0; j < 9; j++) { - ret = read_line(fd,buf,MAX_BUF); + for (int j = 0; j < 9; j++) + { + ret = read_line(fd, buf, MAX_BUF); // skip 10 line } } } - opts->mem.m_total = data[0]; - opts->mem.m_free = data[1]; - opts->mem.m_available = data[2]; - opts->mem.m_buffer = data[3]; - opts->mem.m_cache = data[4]; - opts->mem.m_swap_total = data[5]; - opts->mem.m_swap_free = data[6]; + opts->mem.m_total = data[0]; + opts->mem.m_free = data[1]; + opts->mem.m_available = data[2]; + opts->mem.m_buffer = data[3]; + opts->mem.m_cache = data[4]; + opts->mem.m_swap_total = data[5]; + opts->mem.m_swap_free = data[6]; (void)ret; (void)close(fd); - - + /*printf("total: %d used: %d, free: %d buffer/cache: %d, available: %d \n", opts->mem.m_total / 1024, (opts->mem.m_total - opts->mem.m_free - opts->mem.m_buffer-opts->mem.m_cache)/1024, @@ -343,98 +377,98 @@ static int read_mem_info(app_data_t* opts) return 0; } -static int read_temp_file(const char* file, uint16_t* output) +static int read_temp_file(const char *file, uint16_t *output) { int fd, ret; - if(file[0] != '\0') + if (file[0] != '\0') { - fd = open(file, O_RDONLY); - if(fd < 0) + fd = open(file, O_RDONLY); + if (fd < 0) { M_ERROR(MODULE_NAME, "Unable to open temp file %s : %s", file, strerror(errno)); return -1; } (void)memset(buf, '\0', sizeof(buf)); ret = read(fd, buf, MAX_BUF); - if(ret < 0) + if (ret < 0) { M_ERROR(MODULE_NAME, "Unable to read temperature: %s", strerror(errno)); - (void) close(fd); + (void)close(fd); return -1; } *output = (uint16_t)atoi(buf); - (void) close(fd); + (void)close(fd); } return 0; } -static int read_cpu_temp(app_data_t* opts) +static int read_cpu_temp(app_data_t *opts) { - if(read_temp_file(opts->temp.cpu_temp_file, &opts->temp.cpu) == -1) + if (read_temp_file(opts->temp.cpu_temp_file, &opts->temp.cpu) == -1) { return -1; } return read_temp_file(opts->temp.gpu_temp_file, &opts->temp.gpu); } -static int read_net_statistic(app_data_t* opts) +static int read_net_statistic(app_data_t *opts) { int fd, ret; float period; long unsigned int bytes; - + period = ((float)opts->sample_period.it_value.tv_nsec) / 1.0e9; for (int i = 0; i < opts->net.n_intf; i++) { // rx - (void)snprintf(buf, MAX_BUF-1, NET_INF_STAT_PT, opts->net.interfaces[i].name, "rx_bytes"); + (void)snprintf(buf, MAX_BUF - 1, NET_INF_STAT_PT, opts->net.interfaces[i].name, "rx_bytes"); fd = open(buf, O_RDONLY); - if(fd < 0) + if (fd < 0) { M_ERROR(MODULE_NAME, "Unable to open %s: %s", buf, strerror(errno)); return -1; } // read data to buff - (void)memset(buf,'\0', MAX_BUF); + (void)memset(buf, '\0', MAX_BUF); ret = read(fd, buf, MAX_BUF); (void)close(fd); - if(ret <= 0) + if (ret <= 0) { M_ERROR(MODULE_NAME, "Unable to read RX data of %s: %s", opts->net.interfaces[i].name, strerror(errno)); return -1; } - bytes = (unsigned long) strtoul(buf, NULL, 10); + bytes = (unsigned long)strtoul(buf, NULL, 10); opts->net.interfaces[i].rx_rate = ((float)(bytes - opts->net.interfaces[i].rx) / period); opts->net.interfaces[i].rx = bytes; - - (void)snprintf(buf, MAX_BUF-1, NET_INF_STAT_PT, opts->net.interfaces[i].name, "tx_bytes"); + + (void)snprintf(buf, MAX_BUF - 1, NET_INF_STAT_PT, opts->net.interfaces[i].name, "tx_bytes"); fd = open(buf, O_RDONLY); - if(fd < 0) + if (fd < 0) { M_ERROR(MODULE_NAME, "Unable to open %s: %s", buf, strerror(errno)); return -1; } // read data to buff - (void)memset(buf,'\0', MAX_BUF); + (void)memset(buf, '\0', MAX_BUF); ret = read(fd, buf, MAX_BUF); (void)close(fd); - if(ret <= 0) + if (ret <= 0) { M_ERROR(MODULE_NAME, "Unable to read TX data of %s: %s", opts->net.interfaces[i].name, strerror(errno)); return -1; } - bytes = (unsigned long) strtoul(buf, NULL, 10); + bytes = (unsigned long)strtoul(buf, NULL, 10); opts->net.interfaces[i].tx_rate = ((float)(bytes - opts->net.interfaces[i].tx) / period); - opts->net.interfaces[i].tx = bytes ; + opts->net.interfaces[i].tx = bytes; } return 0; } -static int read_disk_usage(app_data_t* opts) +static int read_disk_usage(app_data_t *opts) { struct statvfs stat; int ret = statvfs(opts->disk.mount_path, &stat); - if(ret < 0) + if (ret < 0) { M_ERROR(MODULE_NAME, "Unable to query disk usage of %s: %s", opts->disk.mount_path, strerror(errno)); return -1; @@ -444,96 +478,118 @@ static int read_disk_usage(app_data_t* opts) return 0; } -static int log_to_file(app_data_t* opts) +static int log_to_file(app_data_t *opts) { - int ret,fd; + int ret, fd = -1, use_stdout = 0; char out_buf[1024]; char net_buf[MAX_BUF]; - if(opts->data_file_out[0] == '\0') + (void)memset(out_buf, 0, sizeof(out_buf)); + (void)memset(net_buf, 0, sizeof(net_buf)); + if (opts->data_file_out[0] == '\0') { return 0; } - fd = open(opts->data_file_out, O_CREAT|O_WRONLY|O_APPEND | O_NONBLOCK, 0644); - if(fd < 0) + // check if we use stdout + if (strncmp(opts->data_file_out, "stdout", 6) == 0) + { + // out put to stdout + use_stdout = 1; + } + else if (strncmp(opts->data_file_out, "sock:", 5) == 0) + { + // Unix domain socket + fd = open_unix_socket(opts->data_file_out + 5); + } + else + { + // open regular file + fd = open(opts->data_file_out, O_CREAT | O_WRONLY | O_APPEND | O_NONBLOCK, 0644); + } + if (fd < 0 && !use_stdout) { M_ERROR(MODULE_NAME, "Unable to open output file: %s", strerror(errno)); return -1; } - (void)memset(buf,'\0',MAX_BUF); - char* ptr = buf; + (void)memset(buf, '\0', MAX_BUF); + char *ptr = buf; // CPU size_t len = 0; - for (int i = 0; i < opts->n_cpus; i++) { - if(MAX_BUF - len -1 <= 0) + for (int i = 0; i < opts->n_cpus; i++) + { + if (MAX_BUF - len - 1 <= 0) { break; } - snprintf(ptr, MAX_BUF - len -1, "%.3f,", opts->cpus[i].percent); + snprintf(ptr, MAX_BUF - len - 1, "%.3f,", opts->cpus[i].percent); len = strlen(buf); - ptr = buf+len; + ptr = buf + len; } buf[len - 1] = '\0'; - + // NET len = 0; ptr = net_buf; - for (int i = 0; i < opts->net.n_intf; i++) { - if(MAX_BUF - len -1 < strlen(JSON_NET_FMT)) + for (int i = 0; i < opts->net.n_intf; i++) + { + if (MAX_BUF - len - 1 < strlen(JSON_NET_FMT)) { break; } - snprintf(ptr, MAX_BUF - len -1, JSON_NET_FMT, - opts->net.interfaces[i].name, - opts->net.interfaces[i].rx, - opts->net.interfaces[i].tx, - opts->net.interfaces[i].rx_rate, - opts->net.interfaces[i].tx_rate - ); + snprintf(ptr, MAX_BUF - len - 1, JSON_NET_FMT, + opts->net.interfaces[i].name, + opts->net.interfaces[i].rx, + opts->net.interfaces[i].tx, + opts->net.interfaces[i].rx_rate, + opts->net.interfaces[i].tx_rate); len = strlen(net_buf); - ptr = net_buf+len; + ptr = net_buf + len; } net_buf[len - 1] = '\0'; - + struct timeval now; gettimeofday(&now, NULL); snprintf(out_buf, sizeof(out_buf), JSON_FMT, - now.tv_sec, - now.tv_usec, - opts->bat_stat.read_voltage* opts->bat_stat.ratio, - opts->bat_stat.percent, - opts->bat_stat.max_voltage, - opts->bat_stat.min_voltage, - opts->temp.cpu, - opts->temp.gpu, - buf, - opts->mem.m_total, - opts->mem.m_free, - (opts->mem.m_total - opts->mem.m_free - opts->mem.m_buffer-opts->mem.m_cache), - opts->mem.m_buffer+opts->mem.m_cache, - opts->mem.m_available, - opts->mem.m_swap_total, - opts->mem.m_swap_free, - opts->disk.d_total, - opts->disk.d_free, - net_buf - ); - ret = guard_write(fd,out_buf,strlen(out_buf)); - if(ret <= 0) + now.tv_sec, + now.tv_usec, + opts->bat_stat.read_voltage * opts->bat_stat.ratio, + opts->bat_stat.percent, + opts->bat_stat.max_voltage, + opts->bat_stat.min_voltage, + opts->temp.cpu, + opts->temp.gpu, + buf, + opts->mem.m_total, + opts->mem.m_free, + (opts->mem.m_total - opts->mem.m_free - opts->mem.m_buffer - opts->mem.m_cache), + opts->mem.m_buffer + opts->mem.m_cache, + opts->mem.m_available, + opts->mem.m_swap_total, + opts->mem.m_swap_free, + opts->disk.d_total, + opts->disk.d_free, + net_buf); + out_buf[strlen(out_buf)] = '\n'; + ret = 0; + if (use_stdout) { - M_ERROR(MODULE_NAME, "Unable to write data to output file"); - ret = -1; - } - if(ret != (int)strlen(out_buf)) - { - M_ERROR(MODULE_NAME, "Unable to write all battery info to output file"); - ret = -1; + printf("%s", out_buf); } else { - // M_LOG(MODULE_NAME, "written %d bytes to file: %s", strlen(out_buf), opts->data_file_out); - ret = 0; + ret = guard_write(fd, out_buf, strlen(out_buf)); + if (ret <= 0) + { + M_ERROR(MODULE_NAME, "Unable to write data to output file"); + ret = -1; + } + if (ret != (int)strlen(out_buf)) + { + M_ERROR(MODULE_NAME, "Unable to write all battery info to output file"); + ret = -1; + } } - (void) close(fd); + if (fd > 0) + (void)close(fd); return ret; } @@ -542,75 +598,75 @@ static int ini_handle(void *user_data, const char *section, const char *name, co (void)section; unsigned long period = 0; const char d[2] = ","; - char* token; - - app_data_t* opts = (app_data_t*) user_data; - if(EQU(name, "battery_max_voltage")) + char *token; + + app_data_t *opts = (app_data_t *)user_data; + if (EQU(name, "battery_max_voltage")) { opts->bat_stat.max_voltage = atoi(value); } - else if(EQU(name, "battery_min_voltage")) + else if (EQU(name, "battery_min_voltage")) { opts->bat_stat.min_voltage = atoi(value); } - else if(EQU(name, "battery_cutoff_votalge")) + else if (EQU(name, "battery_cutoff_votalge")) { opts->bat_stat.cutoff_voltage = atoi(value); } - else if(EQU(name, "battery_divide_ratio")) + else if (EQU(name, "battery_divide_ratio")) { opts->bat_stat.ratio = atof(value); } - else if(EQU(name, "battery_input")) + else if (EQU(name, "battery_input")) { strncpy(opts->bat_stat.bat_in, value, MAX_BUF - 1); } - else if(EQU(name, "sample_period")) + else if (EQU(name, "sample_period")) { - period = strtoul(value, NULL, 10)*1e6; + period = strtoul(value, NULL, 10) * 1e6; opts->sample_period.it_interval.tv_nsec = period; opts->sample_period.it_value.tv_nsec = period; } - else if(EQU(name, "cpu_core_number")) + else if (EQU(name, "cpu_core_number")) { opts->n_cpus = atoi(value) + 1; } - else if(EQU(name, "power_off_count_down")) + else if (EQU(name, "power_off_count_down")) { opts->pwoff_cd = atoi(value); } - else if(EQU(name, "power_off_percent")) + else if (EQU(name, "power_off_percent")) { opts->power_off_percent = (uint8_t)atoi(value); } - else if(EQU(name, "data_file_out")) + else if (EQU(name, "data_file_out")) { - (void)strncpy(opts->data_file_out, value, MAX_BUF-1); + (void)strncpy(opts->data_file_out, value, MAX_BUF - 1); } - else if(EQU(name, "cpu_temperature_input")) + else if (EQU(name, "cpu_temperature_input")) { - (void)strncpy(opts->temp.cpu_temp_file, value, MAX_BUF-1); + (void)strncpy(opts->temp.cpu_temp_file, value, MAX_BUF - 1); } - else if(EQU(name, "gpu_temperature_input")) + else if (EQU(name, "gpu_temperature_input")) { - (void)strncpy(opts->temp.gpu_temp_file, value, MAX_BUF-1); + (void)strncpy(opts->temp.gpu_temp_file, value, MAX_BUF - 1); } - else if(EQU(name, "disk_mount_point")) + else if (EQU(name, "disk_mount_point")) { - (void)strncpy(opts->disk.mount_path, value, MAX_BUF-1); + (void)strncpy(opts->disk.mount_path, value, MAX_BUF - 1); } - else if(EQU(name, "network_interfaces")) + else if (EQU(name, "network_interfaces")) { // parsing the network interfaces - token = strtok((char*)value,d); + token = strtok((char *)value, d); opts->net.n_intf = 0; - while(token != NULL) + while (token != NULL) { - (void) strncpy(opts->net.interfaces[opts->net.n_intf].name, token, sizeof(opts->net.interfaces[opts->net.n_intf].name) - 1); + (void)strncpy(opts->net.interfaces[opts->net.n_intf].name, token, sizeof(opts->net.interfaces[opts->net.n_intf].name) - 1); opts->net.n_intf++; - if(opts->net.n_intf >= MAX_NETWORK_INF) + if (opts->net.n_intf >= MAX_NETWORK_INF) break; - token = strtok(NULL,d); + token = strtok(NULL, d); } } else @@ -618,11 +674,11 @@ static int ini_handle(void *user_data, const char *section, const char *name, co M_ERROR(MODULE_NAME, "Ignore unknown configuration %s = %s", name, value); return 0; } - + return 1; } -static int load_config(app_data_t* opts) +static int load_config(app_data_t *opts) { // global (void)memset(opts->data_file_out, '\0', MAX_BUF); @@ -635,7 +691,7 @@ static int load_config(app_data_t* opts) opts->sample_period.it_value.tv_nsec = 3e+8; opts->cpus = NULL; opts->n_cpus = 2; - + //battery (void)memset(opts->bat_stat.bat_in, '\0', MAX_BUF); opts->bat_stat.max_voltage = 4200; @@ -645,14 +701,13 @@ static int load_config(app_data_t* opts) opts->bat_stat.read_voltage = 0.0; opts->bat_stat.percent = 0.0; opts->power_off_percent = 1; - - + (void)memset(&opts->mem, '\0', sizeof(opts->mem)); (void)memset(&opts->temp, '\0', sizeof(opts->temp)); (void)memset(&opts->net, '\0', sizeof(opts->net)); (void)memset(&opts->disk, '\0', sizeof(opts->disk)); opts->disk.mount_path[0] = '/'; - + M_LOG(MODULE_NAME, "Use configuration: %s", opts->conf_file); if (ini_parse(opts->conf_file, ini_handle, opts) < 0) { @@ -660,14 +715,14 @@ static int load_config(app_data_t* opts) return -1; } // check battery configuration - if((opts->bat_stat.max_voltage < opts->bat_stat.min_voltage) || + if ((opts->bat_stat.max_voltage < opts->bat_stat.min_voltage) || (opts->bat_stat.max_voltage < opts->bat_stat.cutoff_voltage) || (opts->bat_stat.min_voltage < opts->bat_stat.cutoff_voltage)) { M_ERROR(MODULE_NAME, "Battery configuration is invalid: max: %d, min: %d, cut off: %d", - opts->bat_stat.max_voltage, - opts->bat_stat.min_voltage, - opts->bat_stat.cutoff_voltage); + opts->bat_stat.max_voltage, + opts->bat_stat.min_voltage, + opts->bat_stat.cutoff_voltage); return -1; } return 0; @@ -689,26 +744,26 @@ int main(int argc, char *const *argv) switch (ret) { case 'f': - (void)strncpy(opts.conf_file, optarg, MAX_BUF-1); + (void)strncpy(opts.conf_file, optarg, MAX_BUF - 1); break; default: help(argv[0]); return -1; } } - - if(optind > argc) + + if (optind > argc) { help(argv[0]); return -1; } - - if(load_config(&opts) != 0) + + if (load_config(&opts) != 0) { - fprintf(stderr,"Unable to read config file\n"); + fprintf(stderr, "Unable to read config file\n"); return -1; } - + M_LOG(MODULE_NAME, "Data Output: %s", opts.data_file_out); M_LOG(MODULE_NAME, "Battery input: %s", opts.bat_stat.bat_in); M_LOG(MODULE_NAME, "Battery Max voltage: %d", opts.bat_stat.max_voltage); @@ -718,16 +773,16 @@ int main(int argc, char *const *argv) M_LOG(MODULE_NAME, "Sample period: %d", (int)(opts.sample_period.it_value.tv_nsec / 1e6)); M_LOG(MODULE_NAME, "CPU cores: %d", opts.n_cpus); M_LOG(MODULE_NAME, "Power off count down: %d", opts.pwoff_cd); - M_LOG(MODULE_NAME,"CPU temp. input: %s",opts.temp.cpu_temp_file); - M_LOG(MODULE_NAME,"GPU temp. input: %s",opts.temp.gpu_temp_file); + M_LOG(MODULE_NAME, "CPU temp. input: %s", opts.temp.cpu_temp_file); + M_LOG(MODULE_NAME, "GPU temp. input: %s", opts.temp.gpu_temp_file); M_LOG(MODULE_NAME, "Poweroff percent: %d", opts.power_off_percent); - + // init timerfd tfd = timerfd_create(CLOCK_MONOTONIC, TFD_CLOEXEC); if (tfd == -1) { M_ERROR(MODULE_NAME, "Unable to create timerfd: %s", strerror(errno)); - fprintf(stderr,"Unable to create timer fd: %s\n", strerror(errno)); + fprintf(stderr, "Unable to create timer fd: %s\n", strerror(errno)); return -1; } if (timerfd_settime(tfd, 0 /* no flags */, &opts.sample_period, NULL) == -1) @@ -737,8 +792,8 @@ int main(int argc, char *const *argv) return -1; } //init CPU monitors - opts.cpus = (sys_cpu_t*) malloc(opts.n_cpus*sizeof(sys_cpu_t)); - for(int i=0; i < opts.n_cpus; i++) + opts.cpus = (sys_cpu_t *)malloc(opts.n_cpus * sizeof(sys_cpu_t)); + for (int i = 0; i < opts.n_cpus; i++) { opts.cpus[i].last_sum = 0; opts.cpus[i].last_idle = 0; @@ -746,23 +801,23 @@ int main(int argc, char *const *argv) } // loop count_down = opts.pwoff_cd; - while(running) + while (running) { - if(opts.bat_stat.bat_in[0] != '\0') + if (opts.bat_stat.bat_in[0] != '\0') { // open the file - if(read_voltage(&opts) == -1) + if (read_voltage(&opts) == -1) { M_ERROR(MODULE_NAME, "Unable to read system voltage"); } - volt = opts.bat_stat.read_voltage*opts.bat_stat.ratio; - if(volt < opts.bat_stat.cutoff_voltage) + volt = opts.bat_stat.read_voltage * opts.bat_stat.ratio; + if (volt < opts.bat_stat.cutoff_voltage) { M_LOG(MODULE_NAME, "Invalid voltage read: %.3f", volt); } else { - if(opts.bat_stat.percent <= (float)opts.power_off_percent) + if (opts.bat_stat.percent <= (float)opts.power_off_percent) { count_down--; M_LOG(MODULE_NAME, "Out of battery. Will shutdown after %d count down", count_down); @@ -773,46 +828,46 @@ int main(int argc, char *const *argv) count_down = opts.pwoff_cd; } // check if we should shutdown - if(count_down <= 0) + if (count_down <= 0) { M_LOG(MODULE_NAME, "Shutting down system"); ret = system("poweroff"); - (void) ret; + (void)ret; // this should never happend return 0; } } } // read cpu info - if(read_cpu_info(&opts) == -1) + if (read_cpu_info(&opts) == -1) { M_ERROR(MODULE_NAME, "Unable to read CPU infos"); } // read memory usage - if(read_mem_info(&opts) == -1) + if (read_mem_info(&opts) == -1) { M_ERROR(MODULE_NAME, "Unable to read memory usage"); } // read CPU temperature - if(read_cpu_temp(&opts) == -1) + if (read_cpu_temp(&opts) == -1) { M_ERROR(MODULE_NAME, "Unable to read CPU temperature"); } - if(read_net_statistic(&opts) == -1) + if (read_net_statistic(&opts) == -1) { M_ERROR(MODULE_NAME, "Unable to query network statistic"); } - if(read_disk_usage(&opts) == -1) + if (read_disk_usage(&opts) == -1) { M_ERROR(MODULE_NAME, "Unable to query disk usage"); } // log to file - if(log_to_file(&opts) == -1) + if (log_to_file(&opts) == -1) { M_ERROR(MODULE_NAME, "Unable to write sysinfo to output"); } // check timeout - if(read(tfd, &expirations_count, sizeof(expirations_count)) != (int)sizeof(expirations_count)) + if (read(tfd, &expirations_count, sizeof(expirations_count)) != (int)sizeof(expirations_count)) { M_ERROR(MODULE_NAME, "Unable to read timer: %s", strerror(errno)); } @@ -821,10 +876,10 @@ int main(int argc, char *const *argv) M_ERROR(MODULE_NAME, "LOOP OVERFLOW COUNT: %lu", (long unsigned int)expirations_count); } } - - if(opts.cpus) + + if (opts.cpus) free(opts.cpus); - if(tfd > 0) + if (tfd > 0) { (void)close(tfd); } diff --git a/sysmond b/sysmond index d2778b983241903b4a298bacd3636ce3219904be..77e30984e4033b8a07c247825c7b8492d73e8782 100755 GIT binary patch literal 93840 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ú)N^1#au^jm}KzL0@Ip*KRt^`_AMsI*XMY4<`s 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 Rmqh=?HiyaM!buUO|G&DLY3l$0 literal 86120 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 diff --git a/sysmond.conf b/sysmond.conf index 6c31c19..fe63081 100644 --- a/sysmond.conf +++ b/sysmond.conf @@ -23,11 +23,17 @@ disk_mount_point = / # the system will be shutdown after n count down power_off_count_down = 10 # the system will bet shutdown if the battery voltage percent is below this value +# after `power_off_count_down` time power_off_percent = 3 cpu_temperature_input=/sys/devices/virtual/thermal/thermal_zone1/temp gpu_temperature_input=/sys/devices/virtual/thermal/thermal_zone2/temp -# output system info to file -data_file_out = /var/jarvis:fbf070ddea3ea90d07f456540b405d302554ec82 \ No newline at end of file +# output system info to file +# The output file may be: stdout, a regular file or name pipe, or a unix domain socket +# To print JSON data records to stdout use +# data_file_out = stdout +# To send data via unix domain socket use +# data_file_out = sock:/path/to/socket/file +data_file_out = sock:/var/sysmond.log \ No newline at end of file