diff options
| author | sasha <sasha@97f52cf1-0a1b-0410-bd0e-c28be96e8082> | 2008-01-15 08:47:35 +0000 |
|---|---|---|
| committer | sasha <sasha@97f52cf1-0a1b-0410-bd0e-c28be96e8082> | 2008-01-15 08:47:35 +0000 |
| commit | e37a3325566f080ec6e2e53277e1bf1a3d14a013 (patch) | |
| tree | 0e7b78455a0a2a8cf89576aaacb029c768fa68f9 /src | |
| parent | cce52958601b3b1632e321def4fbcf010b7a2b08 (diff) | |
- [ZBX-268] added support of proc.num[], proc.mem[] & system.cpu.num[] for OpenBSD agents
[svn merge svn://svn.zabbix.com/branches/1.4 -r5243:5248]
git-svn-id: svn://svn.zabbix.com/trunk@5249 97f52cf1-0a1b-0410-bd0e-c28be96e8082
Diffstat (limited to 'src')
| -rw-r--r-- | src/libs/zbxsysinfo/freebsd/cpu.c | 24 | ||||
| -rw-r--r-- | src/libs/zbxsysinfo/openbsd/cpu.c | 40 | ||||
| -rw-r--r-- | src/libs/zbxsysinfo/openbsd/proc.c | 550 | ||||
| -rw-r--r-- | src/zabbix_agent/cpustat.c | 6 |
4 files changed, 335 insertions, 285 deletions
diff --git a/src/libs/zbxsysinfo/freebsd/cpu.c b/src/libs/zbxsysinfo/freebsd/cpu.c index 414c9b66..1dd5d3a4 100644 --- a/src/libs/zbxsysinfo/freebsd/cpu.c +++ b/src/libs/zbxsysinfo/freebsd/cpu.c @@ -25,25 +25,37 @@ int SYSTEM_CPU_NUM(const char *cmd, const char *param, unsigned flags, AGENT_RESULT *result) { #ifdef HAVE_FUNCTION_SYSCTL_HW_NCPU - size_t len; - int mib[2], ncpu; + size_t len; + int mib[2], ncpu; + char mode[MAX_STRING_LEN]; assert(result); init_result(result); - mib[0]=CTL_HW; - mib[1]=HW_NCPU; + if (num_param(param) > 1) + return SYSINFO_RET_FAIL; + + if (0 == get_param(param, 1, mode, sizeof(mode))) { + if (*mode != '\0') { + if (0 != strcmp(mode, "online")) + return SYSINFO_RET_FAIL; + } + } + + mib[0] = CTL_HW; + mib[1] = HW_NCPU; len = sizeof(ncpu); - if (0 != sysctl(mib, 2, &ncpu, &len, 0, 0)) + if (-1 == sysctl(mib, 2, &ncpu, &len, NULL, 0)) return SYSINFO_RET_FAIL; SET_UI64_RESULT(result, ncpu); + return SYSINFO_RET_OK; #else return SYSINFO_RET_FAIL; -#endif +#endif /*HAVE_FUNCTION_SYSCTL_HW_NCPU*/ } int SYSTEM_CPU_UTIL(const char *cmd, const char *param, unsigned flags, AGENT_RESULT *result) diff --git a/src/libs/zbxsysinfo/openbsd/cpu.c b/src/libs/zbxsysinfo/openbsd/cpu.c index ac3e5ae4..2f679929 100644 --- a/src/libs/zbxsysinfo/openbsd/cpu.c +++ b/src/libs/zbxsysinfo/openbsd/cpu.c @@ -18,19 +18,49 @@ **/ #include "common.h" - #include "sysinfo.h" int SYSTEM_CPU_NUM(const char *cmd, const char *param, unsigned flags, AGENT_RESULT *result) { +#ifdef HAVE_FUNCTION_SYSCTL_HW_NCPU + size_t len; + int mib[2], ncpu; + char mode[MAX_STRING_LEN]; + + assert(result); + + init_result(result); + + if (num_param(param) > 1) + return SYSINFO_RET_FAIL; + + if (0 == get_param(param, 1, mode, sizeof(mode))) { + if (*mode != '\0') { + if (0 != strcmp(mode, "online")) + return SYSINFO_RET_FAIL; + } + } + + mib[0] = CTL_HW; + mib[1] = HW_NCPU; + + len = sizeof(ncpu); + if (-1 == sysctl(mib, 2, &ncpu, &len, NULL, 0)) + return SYSINFO_RET_FAIL; + + SET_UI64_RESULT(result, ncpu); + + return SYSINFO_RET_OK; +#else return SYSINFO_RET_FAIL; +#endif /* HAVE_FUNCTION_SYSCTL_HW_NCPU */ } static int get_cpu_data(unsigned long long *idle, - unsigned long long *user, - unsigned long long *nice, - unsigned long long *system, - unsigned long long *intr) + unsigned long long *user, + unsigned long long *nice, + unsigned long long *system, + unsigned long long *intr) { u_int64_t value[CPUSTATES]; int ret = SYSINFO_RET_FAIL; diff --git a/src/libs/zbxsysinfo/openbsd/proc.c b/src/libs/zbxsysinfo/openbsd/proc.c index 794ac6d1..14b36b09 100644 --- a/src/libs/zbxsysinfo/openbsd/proc.c +++ b/src/libs/zbxsysinfo/openbsd/proc.c @@ -18,337 +18,345 @@ * **/ #include "common.h" - #include "sysinfo.h" +#include <sys/sysctl.h> + #define DO_SUM 0 #define DO_MAX 1 #define DO_MIN 2 #define DO_AVG 3 - + +#define ZBX_PROC_STAT_ALL 0 +#define ZBX_PROC_STAT_RUN 1 +#define ZBX_PROC_STAT_SLEEP 2 +#define ZBX_PROC_STAT_ZOMB 3 + +#define ARGS_START_SIZE 64 + +int proc_argv(pid_t pid, char ***argv, size_t *argv_alloc, int *argc) +{ + size_t sz; + int mib[4], ret; + + if (0 == *argv_alloc) { + *argv_alloc = ARGS_START_SIZE; + *argv = zbx_malloc(*argv, *argv_alloc); + } + + mib[0] = CTL_KERN; + mib[1] = KERN_PROC_ARGS; + mib[2] = (int)pid; + mib[3] = KERN_PROC_ARGV; +retry: + sz = *argv_alloc; + ret = sysctl(mib, 4, *argv, &sz, NULL, 0); + if (-1 == ret && errno == ENOMEM) { + *argv_alloc *= 2; + *argv = zbx_realloc(*argv, *argv_alloc); + goto retry; + } + + if (-1 == ret) + return FAIL; + + mib[3] = KERN_PROC_NARGV; + ret = sysctl(mib, 4, argc, &sz, NULL, 0); + + + if (-1 == ret) + return FAIL; + + return SUCCEED; +} + +void collect_args(char **argv, int argc, char **args, size_t *args_alloc) +{ + char *p; + int i; + size_t sz = 0; + + if (0 == *args_alloc) { + *args_alloc = ARGS_START_SIZE; + *args = zbx_malloc(*args, *args_alloc); + } + + p = *args; + + for (i = 1; i < argc; i ++ ) { + sz = strlen(argv[i]); + memcpy(p, argv[i], sz); + p += sz; + *p++ = ' '; + } + + if (p != *args) + p--; + + *p = '\0'; +} + int PROC_MEMORY(const char *cmd, const char *param, unsigned flags, AGENT_RESULT *result) { - struct kinfo_proc *proc; + struct kinfo_proc *proc = NULL; + int mib[4]; + size_t sz = 0; + char **argv = NULL, *args = NULL; + size_t argv_alloc = 0, args_alloc = 0; + int argc; 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; + char buffer[MAX_STRING_LEN]; + char proccomm[MAX_STRING_LEN]; + int do_task = DO_SUM, proc_ok, comm_ok; struct passwd *usrinfo = NULL; - kvm_t *kp; - double value = 0.0; double memsize = -1.0; + int pagesize; int proccount = 0; int count; int i; - int ret = SYSINFO_RET_FAIL; assert(result); - init_result(result); - - - if(num_param(param) > 3) - { + init_result(result); + + if (num_param(param) > 4) return SYSINFO_RET_FAIL; - } - - if(get_param(param, 1, procname, MAX_STRING_LEN) != 0) - { + + if (0 != get_param(param, 1, procname, sizeof(procname))) 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) - { - 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; + if (0 == get_param(param, 2, buffer, sizeof(buffer))) { + if (*buffer != '\0') { + usrinfo = getpwnam(buffer); + if (usrinfo == NULL) { + /* incorrect user name */ + return SYSINFO_RET_FAIL; + } + } } - else if(strcmp(mode,"min") == 0) - { - do_task = DO_MIN; + + if (0 == get_param(param, 3, buffer, sizeof(buffer))) { + if (*buffer != '\0') { + if (0 == strcmp(buffer, "avg")) + do_task = DO_AVG; + else if (0 == strcmp(buffer, "max")) + do_task = DO_MAX; + else if (0 == strcmp(buffer, "min")) + do_task = DO_MIN; + else if (0 != strcmp(buffer, "sum")) + return SYSINFO_RET_FAIL; + } } - else if(strcmp(mode,"sum") == 0) - { - do_task = DO_SUM; + + if (0 != get_param(param, 4, proccomm, sizeof(proccomm))) + *proccomm = '\0'; + + pagesize = getpagesize(); + + mib[0] = CTL_KERN; + mib[1] = KERN_PROC; + if (NULL != usrinfo) { + mib[2] = KERN_PROC_UID; + mib[3] = usrinfo->pw_uid; + } else { + mib[2] = KERN_PROC_ALL; + mib[3] = 0; } - else - { - return SYSINFO_RET_FAIL; + + if (-1 == sysctl(mib, 4, NULL, &sz, NULL, 0)) + return SYSINFO_RET_FAIL; + + proc = (struct kinfo_proc *)zbx_malloc(proc, sz); + if (-1 == sysctl(mib, 4, proc, &sz, NULL, 0)) { + zbx_free(proc); + return SYSINFO_RET_FAIL; } + count = sz / sizeof(struct kinfo_proc); + + for (i = 0; i < count; i++) { + proc_ok = 0; + comm_ok = 0; - kp = kvm_open(NULL,NULL,NULL,O_RDONLY,NULL); - if(kp) - { - proc = kvm_getprocs(kp, KERN_PROC_ALL, 0, &count); - if (proc) - { - for (i = 0; i < count; i++) - { - proc_ok = 0; - usr_ok = 0; + if (*procname != '\0') { + if (0 == strcmp(procname, proc[i].kp_proc.p_comm)) + proc_ok = 1; + } else + proc_ok = 1; + + if (*proccomm != '\0') { + if (SUCCEED == proc_argv(proc[i].kp_proc.p_pid, &argv, &argv_alloc, &argc)) { + collect_args(argv, argc, &args, &args_alloc); + if (zbx_regexp_match(args, proccomm, NULL) != NULL) + comm_ok = 1; + } + } else + comm_ok = 1; - if(procname[0] != 0) - { - if(strcmp(procname, proc[i].kp_proc.p_comm)==0) - { - proc_ok = 1; - } - } - else - { - proc_ok = 1; - } - - if(usrinfo != NULL) - { - if(usrinfo->pw_uid == proc[i].kp_proc.p_cred->p_ruid) - { - usr_ok = 1; - } - } + if (proc_ok && comm_ok) { + proccount++; + value = proc[i].kp_eproc.e_vm.vm_tsize + + proc[i].kp_eproc.e_vm.vm_dsize + + proc[i].kp_eproc.e_vm.vm_ssize; + value *= pagesize; + + if (memsize < 0) + memsize = value; + else { + if (do_task == DO_MAX) + memsize = MAX(memsize, value); + else if (do_task == DO_MIN) + memsize = MIN(memsize, value); else - { - usr_ok = 1; - } - - if(proc_ok && usr_ok) - { - proccount++; - - value = proc[i].kp_proc.p_vmspace->vm_tsize - + proc[i].kp_proc.p_vmspace->vm_dsize - + proc[i].kp_proc.p_vmspace->vm_ssize; - - if(memsize < 0) - { - memsize = value; - } - else - { - if(do_task == DO_MAX) - { - memsize = MAX(memsize, value); - } - else if(do_task == DO_MIN) - { - memsize = MIN(memsize, value); - } - else - { - memsize += value; - } - } - } + memsize += value; } } - - kvm_close(kp); - - 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); - } - ret = SYSINFO_RET_OK; } - return ret; + zbx_free(proc); + + if (memsize < 0) { + /* incorrect process name */ + memsize = 0; + } + + if (do_task == DO_AVG) { + SET_DBL_RESULT(result, proccount == 0 ? 0 : memsize/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) +int PROC_NUM(const char *cmd, const char *param, unsigned flags, AGENT_RESULT *result) { - struct kinfo_proc *proc; + struct kinfo_proc *proc = NULL; + int mib[4]; + size_t sz = 0; + char **argv = NULL, *args = NULL; + size_t argv_alloc = 0, args_alloc = 0; + int argc; char procname[MAX_STRING_LEN]; - char usrname[MAX_STRING_LEN]; - char procstat[MAX_STRING_LEN]; - - char p_stat = 0; - - int proc_ok = 0; - int usr_ok = 0; - int stat_ok = 0; + char buffer[MAX_STRING_LEN]; + char proccomm[MAX_STRING_LEN]; + char zbx_proc_stat = ZBX_PROC_STAT_ALL, proc_ok, stat_ok, comm_ok; struct passwd *usrinfo = NULL; - kvm_t *kp; - int proccount = 0; int count; int i; - int ret = SYSINFO_RET_FAIL; assert(result); init_result(result); - - - if(num_param(param) > 3) - { + + if (num_param(param) > 4) return SYSINFO_RET_FAIL; - } - - if(get_param(param, 1, procname, MAX_STRING_LEN) != 0) - { + + if (0 != get_param(param, 1, procname, sizeof(procname))) 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 (0 == get_param(param, 2, buffer, sizeof(buffer))) { + if (*buffer != '\0') { + usrinfo = getpwnam(buffer); + if (usrinfo == NULL) { + /* incorrect user name */ + return SYSINFO_RET_FAIL; + } + } + } - if(get_param(param, 3, procstat, MAX_STRING_LEN) != 0) - { - procstat[0] = '\0'; + if (0 == get_param(param, 3, buffer, sizeof(buffer))) { + if (*buffer != '\0') { + if (0 == strcmp(buffer, "run")) + zbx_proc_stat = ZBX_PROC_STAT_RUN; + else if (0 == strcmp(buffer, "sleep")) + zbx_proc_stat = ZBX_PROC_STAT_SLEEP; + else if (0 == strcmp(buffer, "zomb")) + zbx_proc_stat = ZBX_PROC_STAT_ZOMB; + else if (0 != strcmp(buffer, "all")) + return SYSINFO_RET_FAIL; + } } - if(procstat[0] == '\0') - { - strscpy(procstat, "all"); + if (0 != get_param(param, 4, proccomm, sizeof(proccomm))) + *proccomm = '\0'; + + mib[0] = CTL_KERN; + mib[1] = KERN_PROC; + if (NULL != usrinfo) { + mib[2] = KERN_PROC_UID; + mib[3] = usrinfo->pw_uid; + } else { + mib[2] = KERN_PROC_ALL; + mib[3] = 0; } - - if(strcmp(procstat,"run") == 0) - { - p_stat = SRUN; - } - else if(strcmp(procstat,"sleep") == 0) - { - p_stat = SSLEEP; - } - else if(strcmp(procstat,"zomb") == 0) - { - p_stat = SZOMB; - } - else if(strcmp(procstat,"all") == 0) - { - procstat[0] = 0; - } - else - { - return SYSINFO_RET_FAIL; - } - - kp = kvm_open(NULL,NULL,NULL,O_RDONLY,NULL); - if(kp) - { - proc = kvm_getprocs(kp, KERN_PROC_ALL, 0, &count); - if (proc) - { - for (i = 0; i < count; i++) - { - proc_ok = 0; - stat_ok = 0; - usr_ok = 0; - - if(procname[0] != 0) - { - if(strcmp(procname, proc[i].kp_proc.p_comm)==0) - { - proc_ok = 1; - } - } - else - { - proc_ok = 1; - } - - if(procstat[0] != 0) - { - if(p_stat == proc[i].kp_proc.p_stat - || (proc[i].kp_proc.p_stat == SDEAD && p_stat == SZOMB)) - { - stat_ok = 1; - } - } - else - { + + if (-1 == sysctl(mib, 4, NULL, &sz, NULL, 0)) + return SYSINFO_RET_FAIL; + + proc = (struct kinfo_proc *)zbx_malloc(proc, sz); + if (-1 == sysctl(mib, 4, proc, &sz, NULL, 0)) { + zbx_free(proc); + return SYSINFO_RET_FAIL; + } + + count = sz / sizeof(struct kinfo_proc); + + for (i = 0; i < count; i++) { + proc_ok = 0; + stat_ok = 0; + comm_ok = 0; + + if (*procname != '\0') { + if (0 == strcmp(procname, proc[i].kp_proc.p_comm)) + proc_ok = 1; + } else + proc_ok = 1; + + if (zbx_proc_stat != ZBX_PROC_STAT_ALL) { + switch (zbx_proc_stat) { + case ZBX_PROC_STAT_RUN: + if (proc[i].kp_proc.p_stat == SRUN || proc[i].kp_proc.p_stat == SONPROC) stat_ok = 1; - } - - if(usrinfo != NULL) - { - if(usrinfo->pw_uid == proc[i].kp_proc.p_cred->p_ruid) - { - usr_ok = 1; - } - } - else - { - usr_ok = 1; - } - - if(proc_ok && stat_ok && usr_ok) - { - proccount++; - } + break; + case ZBX_PROC_STAT_SLEEP: + if (proc[i].kp_proc.p_stat == SSLEEP) + stat_ok = 1; + break; + case ZBX_PROC_STAT_ZOMB: + if (proc[i].kp_proc.p_stat == SZOMB || proc[i].kp_proc.p_stat == SDEAD) + stat_ok = 1; + break; } - } - kvm_close(kp); - - SET_UI64_RESULT(result, proccount); - ret = SYSINFO_RET_OK; + } else + stat_ok = 1; + + if (*proccomm != '\0') { + if (SUCCEED == proc_argv(proc[i].kp_proc.p_pid, &argv, &argv_alloc, &argc)) { + collect_args(argv, argc, &args, &args_alloc); + if (zbx_regexp_match(args, proccomm, NULL) != NULL) + comm_ok = 1; + } + } else + comm_ok = 1; + + if (proc_ok && stat_ok && comm_ok) + proccount++; } + zbx_free(proc); + zbx_free(argv); + zbx_free(args); + + SET_UI64_RESULT(result, proccount); - return ret; + return SYSINFO_RET_OK; } diff --git a/src/zabbix_agent/cpustat.c b/src/zabbix_agent/cpustat.c index 01186df6..b17008d5 100644 --- a/src/zabbix_agent/cpustat.c +++ b/src/zabbix_agent/cpustat.c @@ -339,8 +339,8 @@ static int get_cpustat( return 1; } - #elif defined(HAVE_SYS_SYSCTL_H) /* HAVE_SYS_SYSCTL_H */ - + #elif defined(HAVE_FUNCTION_SYSCTLBYNAME) + if (sysctlbyname("kern.cp_time", &cp_time, &nlen, NULL, 0) == -1) return 1; @@ -352,7 +352,7 @@ static int get_cpustat( *cpu_system = (zbx_uint64_t)cp_time[2]; *cpu_idle = (zbx_uint64_t)cp_time[4]; - #endif /* HAVE_SYS_SYSCTL_H */ + #endif /* HAVE_FUNCTION_SYSCTLBYNAME */ return 0; } |
