]> arthur.barton.de Git - netdata.git/commitdiff
Merge remote-tracking branch 'upstream/master'
authorCosta Tsaousis (ktsaou) <costa@tsaousis.gr>
Sat, 16 Apr 2016 03:07:25 +0000 (06:07 +0300)
committerCosta Tsaousis (ktsaou) <costa@tsaousis.gr>
Sat, 16 Apr 2016 03:07:25 +0000 (06:07 +0300)
.gitignore
CMakeLists.txt [new file with mode: 0755]
src/apps_plugin.c
src/procfile.c
src/procfile.h

index d3d8aaf802627cab5b58d9eb7994ae47eeb19d5f..f4b9fe85e3ba6cab7bbe1b561feb812b530f9c80 100644 (file)
@@ -32,7 +32,6 @@ netdata.spec
 .cproject
 .idea/
 .project
-CMakeLists.txt
 README
 TODO.md
 asan_symbolize.py
@@ -67,5 +66,8 @@ netdata-uninstaller.sh
 
 gmon.out
 gmon.txt
-
 apps.plugin-profiler.sh
+
+CMakeCache.txt
+CMakeFiles/
+cmake_install.cmake
diff --git a/CMakeLists.txt b/CMakeLists.txt
new file mode 100755 (executable)
index 0000000..2c7abd2
--- /dev/null
@@ -0,0 +1,94 @@
+
+# This file is just a hack to make netdata
+# open in Clion
+# It cannot build netdata
+
+cmake_minimum_required(VERSION 3.3)
+project(netdata)
+
+set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
+
+set(NETDATA_SOURCE_FILES
+       src/appconfig.c
+       src/appconfig.h
+       src/avl.c
+       src/avl.h
+       src/common.c
+       src/common.h
+       src/daemon.c
+       src/daemon.h
+       src/dictionary.c
+       src/dictionary.h
+       src/global_statistics.c
+       src/global_statistics.h
+       src/log.c
+       src/log.h
+       src/main.c
+       src/main.h
+       src/plugin_checks.c
+       src/plugin_checks.h
+       src/plugin_idlejitter.c
+       src/plugin_idlejitter.h
+       src/plugin_nfacct.c
+       src/plugin_nfacct.h
+       src/plugin_proc.c
+       src/plugin_proc.h
+       src/plugins_d.c
+       src/plugins_d.h
+       src/plugin_tc.c
+       src/plugin_tc.h
+       src/popen.c
+       src/popen.h
+       src/proc_diskstats.c
+       src/procfile.c
+       src/procfile.h
+       src/proc_interrupts.c
+       src/proc_loadavg.c
+       src/proc_meminfo.c
+       src/proc_net_dev.c
+       src/proc_net_ip_vs_stats.c
+       src/proc_net_netstat.c
+       src/proc_net_rpc_nfsd.c
+       src/proc_net_snmp6.c
+       src/proc_net_snmp.c
+       src/proc_net_stat_conntrack.c
+       src/proc_net_stat_synproxy.c
+       src/proc_softirqs.c
+       src/proc_stat.c
+       src/proc_sys_kernel_random_entropy_avail.c
+       src/proc_vmstat.c
+       src/rrd2json.c
+       src/rrd2json.h
+       src/rrd.c
+       src/rrd.h
+       src/storage_number.c
+       src/storage_number.h
+       src/sys_kernel_mm_ksm.c
+       src/unit_test.c
+       src/unit_test.h
+       src/url.c
+       src/url.h
+       src/web_buffer.c
+       src/web_buffer.h
+       src/web_client.c
+       src/web_client.h
+       src/web_server.c
+       src/web_server.h
+        config.h)
+
+set(APPS_PLUGIN_SOURCE_FILES
+       src/appconfig.c
+       src/appconfig.h
+       src/apps_plugin.c
+       src/avl.c
+       src/avl.h
+       src/common.c
+       src/common.h
+       src/log.c
+       src/log.h
+        config.h)
+
+add_definitions(-DHAVE_CONFIG_H -DNETDATA_INTERNAL_CHECKS=1 -DCACHE_DIR="/tmp" -DCONFIG_DIR="/tmp" -DLOG_DIR="/tmp" -DPLUGINS_DIR="/tmp" -DWEB_DIR="/tmp")
+
+add_executable(netdata ${NETDATA_SOURCE_FILES})
+add_executable(apps.plugin ${APPS_PLUGIN_SOURCE_FILES})
index e0232361fc9407a2ae2a85d633a07c532a3a24e0..33ffcd96356ed6a7730c0fe86503156098eafabf 100644 (file)
@@ -37,6 +37,7 @@
 #include "common.h"
 #include "log.h"
 #include "procfile.h"
+#include "../config.h"
 
 #define MAX_COMPARE_NAME 15
 #define MAX_NAME 100
@@ -213,20 +214,20 @@ char *strdup_debug(const char *file, int line, const char *function, const char
 // system functions
 // to retrieve settings of the system
 
-procfile *ff = NULL;
-
 long get_system_cpus(void) {
+       procfile *ff = NULL;
+
        int processors = 0;
 
        char filename[FILENAME_MAX + 1];
        snprintf(filename, FILENAME_MAX, "%s/proc/stat", host_prefix);
 
-       ff = procfile_reopen(ff, filename, "", PROCFILE_FLAG_DEFAULT);
+       ff = procfile_open(filename, NULL, PROCFILE_FLAG_DEFAULT);
        if(!ff) return 1;
 
        ff = procfile_readall(ff);
        if(!ff) {
-               // procfile_close(ff);
+               procfile_close(ff);
                return 1;
        }
 
@@ -239,28 +240,29 @@ long get_system_cpus(void) {
        processors--;
        if(processors < 1) processors = 1;
 
-       // procfile_close(ff);
+       procfile_close(ff);
        return processors;
 }
 
 long get_system_pid_max(void) {
+       procfile *ff = NULL;
        long mpid = 32768;
 
        char filename[FILENAME_MAX + 1];
        snprintf(filename, FILENAME_MAX, "%s/proc/sys/kernel/pid_max", host_prefix);
-       ff = procfile_reopen(ff, filename, "", PROCFILE_FLAG_DEFAULT);
+       ff = procfile_open(filename, NULL, PROCFILE_FLAG_DEFAULT);
        if(!ff) return mpid;
 
        ff = procfile_readall(ff);
        if(!ff) {
-               // procfile_close(ff);
+               procfile_close(ff);
                return mpid;
        }
 
        mpid = atol(procfile_lineword(ff, 0, 0));
        if(!mpid) mpid = 32768;
 
-       // procfile_close(ff);
+       procfile_close(ff);
        return mpid;
 }
 
@@ -591,6 +593,7 @@ int read_apps_groups_conf(const char *name)
 struct pid_stat {
        int32_t pid;
        char comm[MAX_COMPARE_NAME + 1];
+
        // char state;
        int32_t ppid;
        // int32_t pgrp;
@@ -783,15 +786,22 @@ int read_proc_pid_ownership(struct pid_stat *p) {
 }
 
 int read_proc_pid_stat(struct pid_stat *p) {
+       static procfile *ff = NULL;
+
        char filename[FILENAME_MAX + 1];
 
        snprintf(filename, FILENAME_MAX, "%s/proc/%d/stat", host_prefix, p->pid);
 
        // ----------------------------------------
 
+       int set_quotes = (!ff)?1:0;
+
        ff = procfile_reopen(ff, filename, NULL, PROCFILE_FLAG_NO_ERROR_ON_FILE_IO);
        if(!ff) return 1;
 
+       // if(set_quotes) procfile_set_quotes(ff, "()");
+       if(set_quotes) procfile_set_open_close(ff, "(", ")");
+
        ff = procfile_readall(ff);
        if(!ff) {
                // procfile_close(ff);
@@ -800,27 +810,10 @@ int read_proc_pid_stat(struct pid_stat *p) {
 
        file_counter++;
 
-       p->comm[0] = '\0';
+       // parse the process name
+       unsigned int i = 1;
+       strncpy(p->comm, procfile_lineword(ff, 0, i), MAX_COMPARE_NAME);
        p->comm[MAX_COMPARE_NAME] = '\0';
-       size_t blen = 0;
-
-       char *s = procfile_lineword(ff, 0, 1);
-       if(*s == '(') s++;
-       size_t len = strlen(s);
-       unsigned int i = 0;
-       while(len && s[len - 1] != ')') {
-               if(blen < MAX_COMPARE_NAME) {
-                       strncpy(&p->comm[blen], s, MAX_COMPARE_NAME - blen);
-                       blen = strlen(p->comm);
-               }
-
-               i++;
-               s = procfile_lineword(ff, 0, 1+i);
-               len = strlen(s);
-       }
-       if(len && s[len - 1] == ')') s[len - 1] = '\0';
-       if(blen < MAX_COMPARE_NAME)
-               strncpy(&p->comm[blen], s, MAX_COMPARE_NAME - blen);
 
        // p->pid                       = atol(procfile_lineword(ff, 0, 0+i));
        // comm is at 1
@@ -867,13 +860,16 @@ int read_proc_pid_stat(struct pid_stat *p) {
        // p->guest_time        = strtoull(procfile_lineword(ff, 0, 42+i), NULL, 10);
        // p->cguest_time       = strtoull(procfile_lineword(ff, 0, 43), NULL, 10);
 
-       if(debug || (p->target && p->target->debug)) fprintf(stderr, "apps.plugin: VALUES: %s utime=%llu, stime=%llu, cutime=%llu, cstime=%llu, minflt=%llu, majflt=%llu, cminflt=%llu, cmajflt=%llu, threads=%d\n", p->comm, p->utime, p->stime, p->cutime, p->cstime, p->minflt, p->majflt, p->cminflt, p->cmajflt, p->num_threads);
+       if(debug || (p->target && p->target->debug))
+               fprintf(stderr, "apps.plugin: READ PROC/PID/STAT: %s/proc/%d/stat, process: '%s' VALUES: utime=%llu, stime=%llu, cutime=%llu, cstime=%llu, minflt=%llu, majflt=%llu, cminflt=%llu, cmajflt=%llu, threads=%d\n", host_prefix, p->pid, p->comm, p->utime, p->stime, p->cutime, p->cstime, p->minflt, p->majflt, p->cminflt, p->cmajflt, p->num_threads);
 
        // procfile_close(ff);
        return 0;
 }
 
 int read_proc_pid_statm(struct pid_stat *p) {
+       static procfile *ff = NULL;
+
        char filename[FILENAME_MAX + 1];
 
        snprintf(filename, FILENAME_MAX, "%s/proc/%d/statm", host_prefix, p->pid);
@@ -902,6 +898,8 @@ int read_proc_pid_statm(struct pid_stat *p) {
 }
 
 int read_proc_pid_io(struct pid_stat *p) {
+       static procfile *ff = NULL;
+
        char filename[FILENAME_MAX + 1];
 
        snprintf(filename, FILENAME_MAX, "%s/proc/%d/io", host_prefix, p->pid);
@@ -2367,6 +2365,9 @@ int main(int argc, char **argv)
        // set the name for logging
        program_name = "apps.plugin";
 
+       // disable syslog for apps.plugin
+       error_log_syslog = 0;
+
        host_prefix = getenv("NETDATA_HOST_PREFIX");
        if(host_prefix == NULL) {
                info("NETDATA_HOST_PREFIX is not passed from netdata");
index 7a48579593caceb6fdfccbab710f359acc5d1142..1fc33ef5f26625afe3acc4cb6db2e55791859011 100644 (file)
@@ -20,6 +20,7 @@
 #include "common.h"
 #include "log.h"
 #include "procfile.h"
+#include "../config.h"
 
 #define PF_PREFIX "PROCFILE"
 
@@ -142,6 +143,9 @@ void pflines_free(pflines *fl) {
 #define PF_CHAR_IS_SEPARATOR   ' '
 #define PF_CHAR_IS_NEWLINE             'N'
 #define PF_CHAR_IS_WORD                        'W'
+#define PF_CHAR_IS_QUOTE        'Q'
+#define PF_CHAR_IS_OPEN         'O'
+#define PF_CHAR_IS_CLOSE        'C'
 
 void procfile_close(procfile *ff) {
        debug(D_PROCFILE, PF_PREFIX ": Closing file '%s'", ff->filename);
@@ -156,17 +160,82 @@ void procfile_close(procfile *ff) {
 procfile *procfile_parser(procfile *ff) {
        debug(D_PROCFILE, PF_PREFIX ": Parsing file '%s'", ff->filename);
 
-       char *s = ff->data, *e = ff->data, *t = ff->data;
+       char *s = ff->data, *e = &ff->data[ff->len], *t = ff->data, quote = 0;
        uint32_t l = 0, w = 0;
-       e += ff->len;
+       int opened = 0;
 
        ff->lines = pflines_add(ff->lines, w);
        if(unlikely(!ff->lines)) goto cleanup;
 
        while(likely(s < e)) {
+               // we are not at the end
+
                switch(ff->separators[(int)(*s)]) {
+                       case PF_CHAR_IS_OPEN:
+                               if(s == t) {
+                                       opened++;
+                                       t = ++s;
+                               }
+                               else if(opened) {
+                                       opened++;
+                                       s++;
+                               }
+                               else
+                                       s++;
+                               continue;
+
+                       case PF_CHAR_IS_CLOSE:
+                               if(opened) {
+                                       opened--;
+
+                                       if(!opened) {
+                                               *s = '\0';
+                                               ff->words = pfwords_add(ff->words, t);
+                                               if(unlikely(!ff->words)) goto cleanup;
+
+                                               ff->lines->lines[l].words++;
+                                               w++;
+
+                                               t = ++s;
+                                       }
+                                       else
+                                               s++;
+                               }
+                               else
+                                       s++;
+                               continue;
+
+                       case PF_CHAR_IS_QUOTE:
+                               if(unlikely(!quote && s == t)) {
+                                       // quote opened at the beginning
+                                       quote = *s;
+                                       t = ++s;
+                               }
+                               else if(unlikely(quote && quote == *s)) {
+                                       // quote closed
+                                       quote = 0;
+
+                                       *s = '\0';
+                                       ff->words = pfwords_add(ff->words, t);
+                                       if(unlikely(!ff->words)) goto cleanup;
+
+                                       ff->lines->lines[l].words++;
+                                       w++;
+
+                                       t = ++s;
+                               }
+                               else
+                                       s++;
+                               continue;
+
                        case PF_CHAR_IS_SEPARATOR:
-                               if(likely(s == t)) {
+                               if(unlikely(quote || opened)) {
+                                       // we are inside a quote
+                                       s++;
+                                       continue;
+                               }
+
+                               if(unlikely(s == t)) {
                                        // skip all leading white spaces
                                        t = ++s;
                                        continue;
@@ -209,9 +278,10 @@ procfile *procfile_parser(procfile *ff) {
                }
        }
 
-       if(likely(s != t)) {
+       if(likely(s > t && t < e)) {
                // the last word
-               if(likely(ff->len < ff->size)) *s = '\0';
+               if(likely(ff->len < ff->size))
+                       *s = '\0';
                else {
                        // we are going to loose the last byte
                        ff->data[ff->size - 1] = '\0';
@@ -309,10 +379,53 @@ static void procfile_set_separators(procfile *ff, const char *separators) {
        while(likely(ffd != ffe)) *ffs++ = *ffd++;
 
        // set the separators
-       if(unlikely(!separators)) separators = " \t=|";
+       if(unlikely(!separators))
+               separators = " \t=|";
+
        ffs = ff->separators;
        const char *s = separators;
-       while(likely(*s)) ffs[(int)*s++] = PF_CHAR_IS_SEPARATOR;
+       while(likely(*s))
+               ffs[(int)*s++] = PF_CHAR_IS_SEPARATOR;
+}
+
+void procfile_set_quotes(procfile *ff, const char *quotes) {
+       // remove all quotes
+       int i;
+       for(i = 0; i < 256 ; i++)
+               if(ff->separators[i] == PF_CHAR_IS_QUOTE)
+                       ff->separators[i] = PF_CHAR_IS_WORD;
+
+       // if nothing given, return
+       if(unlikely(!quotes || !*quotes))
+               return;
+
+       // set the quotes
+       char *ffs = ff->separators;
+       const char *s = quotes;
+       while(likely(*s))
+               ffs[(int)*s++] = PF_CHAR_IS_QUOTE;
+}
+
+void procfile_set_open_close(procfile *ff, const char *open, const char *close) {
+       // remove all open/close
+       int i;
+       for(i = 0; i < 256 ; i++)
+               if(ff->separators[i] == PF_CHAR_IS_OPEN || ff->separators[i] == PF_CHAR_IS_CLOSE)
+                       ff->separators[i] = PF_CHAR_IS_WORD;
+
+       // if nothing given, return
+       if(unlikely(!open || !*open || !close || !*close))
+               return;
+
+       // set the openings
+       char *ffs = ff->separators;
+       const char *s = open;
+       while(likely(*s))
+               ffs[(int)*s++] = PF_CHAR_IS_OPEN;
+
+       s = close;
+       while(likely(*s))
+               ffs[(int)*s++] = PF_CHAR_IS_CLOSE;
 }
 
 procfile *procfile_open(const char *filename, const char *separators, uint32_t flags) {
index ce2f9bc927276fb09a141e6b32e5daa0df121404..122e153f1eb7c76bc320fa98ca90b38afaf8d34e 100644 (file)
@@ -86,6 +86,9 @@ extern procfile *procfile_reopen(procfile *ff, const char *filename, const char
 // example walk-through a procfile parsed file
 extern void procfile_print(procfile *ff);
 
+extern void procfile_set_quotes(procfile *ff, const char *quotes);
+extern void procfile_set_open_close(procfile *ff, const char *open, const char *close);
+
 // ----------------------------------------------------------------------------
 
 // set this to 1, to have procfile adapt its initial buffer allocation to the max allocation used so far