From e5bd9e92b31ffaf3b605e454b6fd46e7b0b8b1f9 Mon Sep 17 00:00:00 2001 From: osmiy Date: Mon, 17 Oct 2005 07:23:49 +0000 Subject: - improved support of proc.num[,,] (Eugene) - added support of system.swap.in.num (Eugene) - added support of system.swap.in.pages (Eugene) - added support of system.swap.out.num (Eugene) - added support of system.swap.out.pages (Eugene) - added support of kernel.max.proc (Eugene) - added support of system.cpu.intr (Eugene) - added support of system.cpu.switches (Eugene) git-svn-id: svn://svn.zabbix.com/trunk@2189 97f52cf1-0a1b-0410-bd0e-c28be96e8082 --- src/libs/zbxsysinfo/linux/proc.c | 629 ++++++++++++++++++++++++++------------- 1 file changed, 420 insertions(+), 209 deletions(-) (limited to 'src/libs/zbxsysinfo/linux/proc.c') diff --git a/src/libs/zbxsysinfo/linux/proc.c b/src/libs/zbxsysinfo/linux/proc.c index 62a809c5..65f00bbe 100644 --- a/src/libs/zbxsysinfo/linux/proc.c +++ b/src/libs/zbxsysinfo/linux/proc.c @@ -41,6 +41,12 @@ #include "common.h" #include "sysinfo.h" +/* +#define FDI(f, m) fprintf(stderr, "DEBUG INFO: " f "\n" , m) // show debug info to stderr +#define SDI(m) FDI("%s", m) // string info +#define IDI(i) FDI("%i", i) // integer info +*/ + #define MAX(a, b) ((a)>(b) ? (a) : (b)) #define MIN(a, b) ((a)<(b) ? (a) : (b)) @@ -53,37 +59,31 @@ int PROC_MEMORY(const char *cmd, const char *param, double *value) { #if defined(HAVE_PROC_1_STATUS) -/* - * #define FDI(f, m) fprintf(stderr, "DEBUG INFO: " f "\n" , m) // show debug info to stderr - * #define SDI(m) FDI("'%s'", m) // string info - * #define IDI(i) FDI("%i", i) // integer info - */ + DIR *dir; + struct dirent *entries; + struct stat buf; + char filename[MAX_STRING_LEN]; + char line[MAX_STRING_LEN]; - DIR *dir; - struct dirent *entries; - struct stat buf; - char filename[MAX_STRING_LEN]; - char line[MAX_STRING_LEN]; + char name1[MAX_STRING_LEN]; + char name2[MAX_STRING_LEN]; - char name1[MAX_STRING_LEN]; - char name2[MAX_STRING_LEN]; + char procname[MAX_STRING_LEN]; + char usrname[MAX_STRING_LEN]; + char mode[MAX_STRING_LEN]; - char procname[MAX_STRING_LEN]; - char usrname[MAX_STRING_LEN]; - char mode[MAX_STRING_LEN]; + int proc_ok = 0; + int usr_ok = 0; + int do_task = DO_SUM; - int proc_ok = 0; - int usr_ok = 0; - int do_task = DO_SUM; - - struct passwd *usrinfo = NULL; - long int lvalue = 0; + struct passwd *usrinfo = NULL; + long int lvalue = 0; - FILE *f; + FILE *f; - double memsize = -1; - int proccount = 0; + double memsize = -1; + int proccount = 0; if(num_param(param) > 3) { @@ -94,207 +94,418 @@ int PROC_MEMORY(const char *cmd, const char *param, double *value) { return SYSINFO_RET_FAIL; } - + if(get_param(param, 2, usrname, MAX_STRING_LEN) != 0) { usrname[0] = 0; } else { - if(usrname[0] != 0) - { - usrinfo = getpwnam(usrname); - if(usrinfo == NULL) - { - /* incorrect user name */ - return SYSINFO_RET_FAIL; - } - } - } - - if(get_param(param, 3, mode, MAX_STRING_LEN) != 0) - { - strscpy(mode, "sum"); - } - - if(strcmp(mode,"avg") == 0) - { - do_task = DO_AVG; - } - else if(strcmp(mode,"max") == 0) - { - do_task = DO_MAX; - } - else if(strcmp(mode,"min") == 0) - { - do_task = DO_MIN; - } - else if(strcmp(mode,"sum") == 0) - { - do_task = DO_SUM; - } + if(usrname[0] != 0) + { + usrinfo = getpwnam(usrname); + if(usrinfo == NULL) + { + /* incorrect user name */ + return SYSINFO_RET_FAIL; + } + } + } + + if(get_param(param, 3, mode, MAX_STRING_LEN) != 0) + { + strscpy(mode, "sum"); + } + + if(strcmp(mode,"avg") == 0) + { + do_task = DO_AVG; + } + else if(strcmp(mode,"max") == 0) + { + do_task = DO_MAX; + } + else if(strcmp(mode,"min") == 0) + { + do_task = DO_MIN; + } + else if(strcmp(mode,"sum") == 0) + { + do_task = DO_SUM; + } + else + { + return SYSINFO_RET_FAIL; + } + + dir=opendir("/proc"); + if(NULL == dir) + { + return SYSINFO_RET_FAIL; + } + + while((entries=readdir(dir))!=NULL) + { + proc_ok = 0; + usr_ok = 0; + + strscpy(filename,"/proc/"); + strncat(filename,entries->d_name,MAX_STRING_LEN); + strncat(filename,"/status",MAX_STRING_LEN); + + /* Self is a symbolic link. It leads to incorrect results for proc_cnt[zabbix_agentd] */ + /* Better approach: check if /proc/x/ is symbolic link */ + if(strncmp(entries->d_name,"self",MAX_STRING_LEN) == 0) + { + continue; + } + + if(stat(filename,&buf)==0) + { + f=fopen(filename,"r"); + if(f==NULL) + { + continue; + } + + if(procname[0] != 0) + { + fgets(line,MAX_STRING_LEN,f); + if(sscanf(line,"%s\t%s\n",name1,name2)==2) + { + if(strcmp(name1,"Name:") == 0) + { + if(strcmp(procname,name2)==0) + { + proc_ok = 1; + } + } + } + + if(proc_ok == 0) + { + fclose(f); + continue; + } + } + else + { + proc_ok = 1; + } + + if(usrinfo != NULL) + { + while(fgets(line, MAX_STRING_LEN, f) != NULL) + { + + if(sscanf(line, "%s\t%li\n", name1, &lvalue) != 2) + { + continue; + } + + if(strcmp(name1,"Uid:") != 0) + { + continue; + } + + if(usrinfo->pw_uid == (uid_t)(lvalue)) + { + usr_ok = 1; + break; + } + } + } + else + { + usr_ok = 1; + } + + if(proc_ok && usr_ok) + { + while(fgets(line, MAX_STRING_LEN, f) != NULL) + { + + if(sscanf(line, "%s\t%li %s\n", name1, &lvalue, name2) != 3) + { + continue; + } + + if(strcmp(name1,"VmSize:") != 0) + { + continue; + } + + proccount++; + + if(strcasecmp(name2, "kB") == 0) + { + lvalue <<= 10; + } + else if(strcasecmp(name2, "mB") == 0) + { + lvalue <<= 20; + } + else if(strcasecmp(name2, "GB") == 0) + { + lvalue <<= 30; + } + else if(strcasecmp(name2, "TB") == 0) + { + lvalue <<= 40; + } + + if(memsize < 0) + { + memsize = (double) lvalue; + } + else + { + if(do_task == DO_MAX) + { + memsize = MAX(memsize, (double) lvalue); + } + else if(do_task == DO_MIN) + { + memsize = MIN(memsize, (double) lvalue); + } + else + { + memsize += (double) lvalue; + } + } + + break; + } + } + + + fclose(f); + } + } + closedir(dir); + + if(memsize < 0) + { + /* incorrect process name */ + memsize = 0; + } + + if(do_task == DO_AVG) + { + memsize /= (double)proccount; + } + + *value = memsize; + return SYSINFO_RET_OK; +#else + return SYSINFO_RET_FAIL; +#endif +} + +int PROC_NUM(const char *cmd, const char *param, double *value) +{ +#if defined(HAVE_PROC_1_STATUS) + + DIR *dir; + struct dirent *entries; + struct stat buf; + char filename[MAX_STRING_LEN]; + char line[MAX_STRING_LEN]; + + char name1[MAX_STRING_LEN]; + char name2[MAX_STRING_LEN]; + + char procname[MAX_STRING_LEN]; + char usrname[MAX_STRING_LEN]; + char procstat[MAX_STRING_LEN]; + + int proc_ok = 0; + int usr_ok = 0; + int stat_ok = 0; + + struct passwd *usrinfo = NULL; + long int lvalue = 0; + + FILE *f; + + int proccount = 0; + + if(num_param(param) > 3) + { + return SYSINFO_RET_FAIL; + } + + if(get_param(param, 1, procname, MAX_STRING_LEN) != 0) + { + return SYSINFO_RET_FAIL; + } + + if(get_param(param, 2, usrname, MAX_STRING_LEN) != 0) + { + usrname[0] = 0; + } + else + { + if(usrname[0] != 0) + { + usrinfo = getpwnam(usrname); + if(usrinfo == NULL) + { + /* incorrect user name */ + return SYSINFO_RET_FAIL; + } + } + } + + if(get_param(param, 3, procstat, MAX_STRING_LEN) != 0) + { + strscpy(procstat,"all"); + } + + if(strcmp(procstat,"run") == 0) + { + strscpy(procstat,"R"); + } + else if(strcmp(procstat,"sleep") == 0) + { + strscpy(procstat,"S"); + } + else if(strcmp(procstat,"zomb") == 0) + { + strscpy(procstat,"Z"); + } + else if(strcmp(procstat,"all") == 0) + { + procstat[0] = 0; + } + else + { + return SYSINFO_RET_FAIL; + } dir=opendir("/proc"); if(NULL == dir) { - return SYSINFO_RET_FAIL; + return SYSINFO_RET_FAIL; } while((entries=readdir(dir))!=NULL) { - proc_ok = 0; - usr_ok = 0; - - strscpy(filename,"/proc/"); - strncat(filename,entries->d_name,MAX_STRING_LEN); - strncat(filename,"/status",MAX_STRING_LEN); - + proc_ok = 0; + stat_ok = 0; + usr_ok = 0; + /* Self is a symbolic link. It leads to incorrect results for proc_cnt[zabbix_agentd] */ /* Better approach: check if /proc/x/ is symbolic link */ - if(strncmp(entries->d_name,"self",MAX_STRING_LEN) == 0) - { - continue; - } - - if(stat(filename,&buf)==0) - { - f=fopen(filename,"r"); - if(f==NULL) - { - continue; - } - - if(procname[0] != 0) - { - fgets(line,MAX_STRING_LEN,f); - if(sscanf(line,"%s\t%s\n",name1,name2)==2) - { - if(strcmp(name1,"Name:") == 0) - { - if(strcmp(procname,name2)==0) - { - proc_ok = 1; - } - } - } - - if(proc_ok == 0) - { - fclose(f); - continue; - } - } - else - { - proc_ok = 1; - } - - if(usrinfo != NULL) - { - while(fgets(line, MAX_STRING_LEN, f) != NULL) - { - - if(sscanf(line, "%s\t%li\n", name1, &lvalue) != 2) - { - continue; - } - - if(strcmp(name1,"Uid:") != 0) - { - continue; - } - - if(usrinfo->pw_uid == (uid_t)(lvalue)) - { - usr_ok = 1; - break; - } - } - } - else - { - usr_ok = 1; - } - - if(proc_ok && usr_ok) - { - while(fgets(line, MAX_STRING_LEN, f) != NULL) - { - - if(sscanf(line, "%s\t%li %s\n", name1, &lvalue, name2) != 3) - { - continue; - } - - if(strcmp(name1,"VmSize:") != 0) - { - continue; - } - - proccount++; - - if(strcasecmp(name2, "kB") == 0) - { - lvalue <<= 10; - } - else if(strcasecmp(name2, "mB") == 0) - { - lvalue <<= 20; - } - else if(strcasecmp(name2, "GB") == 0) - { - lvalue <<= 30; - } - else if(strcasecmp(name2, "TB") == 0) - { - lvalue <<= 40; - } - - if(memsize < 0) - { - memsize = (double) lvalue; - } - else - { - if(do_task == DO_MAX) - { - memsize = MAX(memsize, (double) lvalue); - } - else if(do_task == DO_MIN) - { - memsize = MIN(memsize, (double) lvalue); - } - else - { - memsize += (double) lvalue; - } - } - - break; - } - } - - - fclose(f); - } - } - closedir(dir); - - if(memsize < 0) - { - /* incorrect process name */ - memsize = 0; - } - - if(do_task == DO_AVG) - { - memsize /= (double)proccount; - } - - *value = memsize; - return SYSINFO_RET_OK; + if(strncmp(entries->d_name,"self",MAX_STRING_LEN) == 0) + { + continue; + } + + strscpy(filename,"/proc/"); + strncat(filename,entries->d_name,MAX_STRING_LEN); + strncat(filename,"/status",MAX_STRING_LEN); + + if(stat(filename,&buf)==0) + { + f=fopen(filename,"r"); + if(f==NULL) + { + continue; + } + + if(procname[0] != 0) + { + fgets(line,MAX_STRING_LEN,f); + if(sscanf(line,"%s\t%s\n",name1,name2)==2) + { + if(strcmp(name1,"Name:") == 0) + { + if(strcmp(procname,name2)==0) + { + proc_ok = 1; + } + } + } + + if(proc_ok == 0) + { + fclose(f); + continue; + } + } + else + { + proc_ok = 1; + } + + if(procstat[0] != 0) + { + while(fgets(line, MAX_STRING_LEN, f) != NULL) + { + + if(sscanf(line, "%s\t%s\n", name1, name2) != 2) + { + continue; + } + + if(strcmp(name1,"State:") != 0) + { + continue; + } + + if(strcmp(name2, procstat)) + { + stat_ok = 1; + break; + } + } + } + else + { + stat_ok = 1; + } + + if(usrinfo != NULL) + { + while(fgets(line, MAX_STRING_LEN, f) != NULL) + { + + if(sscanf(line, "%s\t%li\n", name1, &lvalue) != 2) + { + continue; + } + + if(strcmp(name1,"Uid:") != 0) + { + continue; + } + + if(usrinfo->pw_uid == (uid_t)(lvalue)) + { + usr_ok = 1; + break; + } + } + } + else + { + usr_ok = 1; + } + + if(proc_ok && stat_ok && usr_ok) + { + proccount++; + } + + fclose(f); + } + } + closedir(dir); + + *value = (double) proccount; + return SYSINFO_RET_OK; #else - return SYSINFO_RET_FAIL; + return SYSINFO_RET_FAIL; #endif } - -- cgit