diff options
| author | osmiy <osmiy@97f52cf1-0a1b-0410-bd0e-c28be96e8082> | 2006-04-24 14:31:31 +0000 |
|---|---|---|
| committer | osmiy <osmiy@97f52cf1-0a1b-0410-bd0e-c28be96e8082> | 2006-04-24 14:31:31 +0000 |
| commit | 22ea6c1ff9a7517df09389803ff88ba401214e99 (patch) | |
| tree | 205abafbd20758cb61d10616aad23e59f40fc484 /src/libs/zbxsysinfo/osf | |
| parent | da5caa108e947c1c55908ed0e49e2b55894164cd (diff) | |
| download | zabbix-22ea6c1ff9a7517df09389803ff88ba401214e99.tar.gz zabbix-22ea6c1ff9a7517df09389803ff88ba401214e99.tar.xz zabbix-22ea6c1ff9a7517df09389803ff88ba401214e99.zip | |
- added 'command line' parameter for Tru64 proc.mem[] (Eugene)
- improved proc.num[] for Tru64 (Eugene)
- added 'command line' parameter for Solaris proc.mem[] (Eugene)
- added 'command line' parameter for Solaris proc.num[] (Eugene)
git-svn-id: svn://svn.zabbix.com/trunk@2778 97f52cf1-0a1b-0410-bd0e-c28be96e8082
Diffstat (limited to 'src/libs/zbxsysinfo/osf')
| -rw-r--r-- | src/libs/zbxsysinfo/osf/proc.c | 565 |
1 files changed, 247 insertions, 318 deletions
diff --git a/src/libs/zbxsysinfo/osf/proc.c b/src/libs/zbxsysinfo/osf/proc.c index 268c0d97..b4c1715e 100644 --- a/src/libs/zbxsysinfo/osf/proc.c +++ b/src/libs/zbxsysinfo/osf/proc.c @@ -28,320 +28,232 @@ #define DO_AVG 3 int PROC_MEMORY(const char *cmd, const char *param, unsigned flags, AGENT_RESULT *result) -{ -#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 mode[MAX_STRING_LEN]; - - int proc_ok = 0; - int usr_ok = 0; - int do_task = DO_SUM; +{ // usage: <function name>[ <process name>, <user name>, <mode>, <command> ] + + DIR *dir; + int proc; + struct dirent *entries; + struct stat buf; + struct passwd *usrinfo = NULL; + struct prpsinfo psinfo; + + char filename[MAX_STRING_LEN]; - struct passwd *usrinfo = NULL; - long long int llvalue = 0; + char procname[MAX_STRING_LEN]; + char usrname[MAX_STRING_LEN]; + char mode[MAX_STRING_LEN]; + char proccomm[MAX_STRING_LEN]; - FILE *f; + int do_task = DO_SUM; double memsize = -1; - int proccount = 0; + int pgsize = getpagesize(); + int proccount = 0; + pid_t curr_pid = getpid(); - assert(result); + assert(result); - init_result(result); + init_result(result); - if(num_param(param) > 3) - { - return SYSINFO_RET_FAIL; - } + if(num_param(param) > 4) + { + return SYSINFO_RET_FAIL; + } - if(get_param(param, 1, procname, MAX_STRING_LEN) != 0) - { - 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) + if(get_param(param, 2, usrname, MAX_STRING_LEN) != 0) + { + usrname[0] = 0; + } + else { - usrinfo = getpwnam(usrname); - if(usrinfo == NULL) - { - /* incorrect user name */ - return SYSINFO_RET_FAIL; - } - } - } + 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) - { - mode[0] = '\0'; - } + if(get_param(param, 3, mode, MAX_STRING_LEN) != 0) + { + mode[0] = '\0'; + } - if(mode[0] == '\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%lli\n", name1, &llvalue) != 2) - { - continue; - } - - if(strcmp(name1,"Uid:") != 0) - { - continue; - } - - if(usrinfo->pw_uid == (uid_t)(llvalue)) - { - 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%lli %s\n", name1, &llvalue, name2) != 3) - { - continue; - } - - if(strcmp(name1,"VmSize:") != 0) - { - continue; - } - - proccount++; - - if(strcasecmp(name2, "kB") == 0) - { - llvalue <<= 10; - } - else if(strcasecmp(name2, "mB") == 0) - { - llvalue <<= 20; - } - else if(strcasecmp(name2, "GB") == 0) - { - llvalue <<= 30; - } - else if(strcasecmp(name2, "TB") == 0) - { - llvalue <<= 40; - } - - if(memsize < 0) - { - memsize = (double) llvalue; - } - else - { - if(do_task == DO_MAX) - { - memsize = MAX(memsize, (double) llvalue); - } - else if(do_task == DO_MIN) - { - memsize = MIN(memsize, (double) llvalue); - } - else - { - memsize += (double) llvalue; - } - } - - break; - } - } - - - fclose(f); - } - } - closedir(dir); - - if(memsize < 0) - { - /* incorrect process name */ - memsize = 0; - } + if(mode[0] == '\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; + } - if(do_task == DO_AVG) - { - SET_DBL_RESULT(result, proccount == 0 ? 0 : ((double)memsize/(double)proccount)); - } - else - { - SET_UI64_RESULT(result, memsize); - } - return SYSINFO_RET_OK; -#else - return SYSINFO_RET_FAIL; -#endif + if(get_param(param, 4, proccomm, MAX_STRING_LEN) != 0) + { + proccomm[0] = '\0'; + } + + dir=opendir("/proc"); + if(NULL == dir) + { + return SYSINFO_RET_FAIL; + } + + while((entries=readdir(dir))!=NULL) + { + strscpy(filename,"/proc/"); + strncat(filename,entries->d_name,MAX_STRING_LEN); + + if(stat(filename,&buf)==0) + { + proc = open(filename,O_RDONLY); + if(proc == -1) + goto lbl_skip_procces; + + if(ioctl(proc,PIOCPSINFO,&psinfo) == -1) + goto lbl_skip_procces; + + /* Self process information. It leads to incorrect results for proc_cnt[zabbix_agentd] */ + if(psinfo.pr_pid == curr_pid) + goto lbl_skip_procces; + + if(procname[0] != 0) + if(strcmp(procname,psinfo.pr_fname) != 0) + goto lbl_skip_procces; + + + if(usrinfo != NULL) + if(usrinfo->pw_uid != psinfo.pr_uid) + goto lbl_skip_procces; + + if(proccomm[0] != '\0') + if(zbx_regexp_match(psinfo.pr_psargs,proccomm,NULL) == NULL) + goto lbl_skip_procces; + + proccount++; + + if(memsize < 0) // First inicialization + { + memsize = (double) (psinfo.pr_rssize * pgsize); + } + else + { + if(do_task == DO_MAX) + { + memsize = MAX(memsize, (double) (psinfo.pr_rssize * pgsize)); + } + else if(do_task == DO_MIN) + { + memsize = MIN(memsize, (double) (psinfo.pr_rssize * pgsize)); + } + else // SUM + { + memsize += (double) (psinfo.pr_rssize * pgsize); + } + } +lbl_skip_procces: + if(proc) close(proc); + } + } + + closedir(dir); + + if(memsize < 0) + { + /* incorrect process name */ + memsize = 0; + } + + if(do_task == DO_AVG) + { + SET_DBL_RESULT(result, proccount == 0 ? 0 : ((double)memsize/(double)proccount)); + } + else + { + SET_UI64_RESULT(result, memsize); + } + + return SYSINFO_RET_OK; } int PROC_NUM(const char *cmd, const char *param, unsigned flags, AGENT_RESULT *result) -{ +{ // usage: <function name>[ <process name>, <user name>, <process state>, <command> ] + + DIR *dir; + int proc; + + struct dirent *entries; + struct stat buf; + struct passwd *usrinfo = NULL; + struct prpsinfo psinfo; + + char filename[MAX_STRING_LEN]; - char line[MAX_STRING_LEN]; + char procname[MAX_STRING_LEN]; + char usrname[MAX_STRING_LEN]; + char procstat[MAX_STRING_LEN]; + char proccomm[MAX_STRING_LEN]; - char proccomm[MAX_STRING_LEN]; - char procname[MAX_STRING_LEN]; - char usrname[MAX_STRING_LEN]; - char procstat[MAX_STRING_LEN]; + int do_task = DO_SUM; - struct passwd *usrinfo = NULL; + int proccount = 0; + pid_t curr_pid = getpid(); - assert(result); + assert(result); - init_result(result); + init_result(result); - - if(num_param(param) > 4) - { - return SYSINFO_RET_FAIL; - } - - if(get_param(param, 1, line, MAX_STRING_LEN) != 0) - { - line[0] = '\0'; - } - if(line[0] == '\0') + if(num_param(param) > 4) { - procname[0] = '\0'; + return SYSINFO_RET_FAIL; } - else + + if(get_param(param, 1, procname, MAX_STRING_LEN) != 0) { - snprintf(procname,MAX_STRING_LEN-1,"$3==\"%s\"",line); + return SYSINFO_RET_FAIL; } - if(get_param(param, 2, line, MAX_STRING_LEN) != 0) - { - line[0] = '\0'; - } - if(line[0] == '\0') + if(get_param(param, 2, usrname, MAX_STRING_LEN) != 0) { - usrname[0] = '\0'; + usrname[0] = 0; } else - { - usrinfo = getpwnam(line); - if(usrinfo == NULL) + { + if(usrname[0] != 0) { - /* incorrect user name */ - return SYSINFO_RET_FAIL; + usrinfo = getpwnam(usrname); + if(usrinfo == NULL) + { /* incorrect user name */ + return SYSINFO_RET_FAIL; + } } - if(procname[0]=='\0') - snprintf(usrname,MAX_STRING_LEN-1,"$2==\"%u\"",usrinfo->pw_uid); - else - snprintf(usrname,MAX_STRING_LEN-1,"&&$2==\"%u\"",usrinfo->pw_uid); } - + if(get_param(param, 3, procstat, MAX_STRING_LEN) != 0) { procstat[0] = '\0'; @@ -354,36 +266,15 @@ int PROC_NUM(const char *cmd, const char *param, unsigned flags, AGENT_RESUL if(strcmp(procstat,"run") == 0) { - if(procname[0] == '\0' && usrname[0] == '\0') - { - strscpy(procstat,"$1==\"R\""); - } - else - { - strscpy(procstat,"&&$1==\"R\""); - } + procstat[0] = PR_SRUN; procstat[1] = '\0'; } else if(strcmp(procstat,"sleep") == 0) { - if(procname[0] == '\0' && usrname[0] == '\0') - { - strscpy(procstat,"($1==\"U\"||$1==\"I\"||$1==\"S\")"); - } - else - { - strscpy(procstat,"&&($1==\"U\"||$1==\"I\"||$1==\"S\")"); - } + procstat[0] = PR_SSLEEP; procstat[1] = '\0'; } else if(strcmp(procstat,"zomb") == 0) { - if(procname[0] == '\0' && usrname[0] == '\0') - { - strscpy(procstat,"$1==\"T\""); - } - else - { - strscpy(procstat,"&&$1==\"T\""); - } + procstat[0] = PR_SZOMB; procstat[1] = '\0'; } else if(strcmp(procstat,"all") == 0) { @@ -393,24 +284,62 @@ int PROC_NUM(const char *cmd, const char *param, unsigned flags, AGENT_RESUL { return SYSINFO_RET_FAIL; } - - if(get_param(param, 4, line, MAX_STRING_LEN) != 0) - { - line[0] = '\0'; - } - if(line[0] == '\0') + + if(get_param(param, 4, proccomm, MAX_STRING_LEN) != 0) { proccomm[0] = '\0'; } - else + + dir=opendir("/proc"); + if(NULL == dir) { - snprintf(proccomm,MAX_STRING_LEN-1,"c=$4;for(i=5;i<=NF;i++)c=c" "$i;if(match(c,\"%s\")==0)next;",line); + return SYSINFO_RET_FAIL; } - - snprintf(line, MAX_STRING_LEN-1,"ps -eostate,uid,comm,args|tail -n+2|cut -b1,5-|awk 'BEGIN{j=0}%s%s%s{%sj++}END{print j}'",procname,usrname,procstat,proccomm); - - return EXECUTE(cmd, line, flags, result); - - return SYSINFO_RET_OK; + while((entries=readdir(dir))!=NULL) + { + strscpy(filename,"/proc/"); + strncat(filename,entries->d_name,MAX_STRING_LEN); + + if(stat(filename,&buf)==0) + { + proc = open(filename,O_RDONLY); + if(proc == -1) + goto lbl_skip_procces; + + if(ioctl(proc,PIOCPSINFO,&psinfo) == -1) + goto lbl_skip_procces; + + /* Self process information. It leads to incorrect results for proc_cnt[zabbix_agentd] */ + if(psinfo.pr_pid == curr_pid) + goto lbl_skip_procces; + + if(procname[0] != 0) + if(strcmp(procname,psinfo.pr_fname) != 0) + goto lbl_skip_procces; + + if(usrinfo != NULL) + if(usrinfo->pw_uid != psinfo.pr_uid) + goto lbl_skip_procces; + + if(procstat[0] != '\0') + if(psinfo.pr_sname != procstat[0]) + goto lbl_skip_procces; + + if(proccomm[0] != '\0') + if(zbx_regexp_match(psinfo.pr_psargs,proccomm,NULL) == NULL) + goto lbl_skip_procces; + + proccount++; + +lbl_skip_procces: + if(proc) close(proc); + } + } + + closedir(dir); + + SET_UI64_RESULT(result, proccount); + + return SYSINFO_RET_OK; } |
