summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorsasha <sasha@97f52cf1-0a1b-0410-bd0e-c28be96e8082>2008-01-15 08:47:35 +0000
committersasha <sasha@97f52cf1-0a1b-0410-bd0e-c28be96e8082>2008-01-15 08:47:35 +0000
commite37a3325566f080ec6e2e53277e1bf1a3d14a013 (patch)
tree0e7b78455a0a2a8cf89576aaacb029c768fa68f9 /src
parentcce52958601b3b1632e321def4fbcf010b7a2b08 (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.c24
-rw-r--r--src/libs/zbxsysinfo/openbsd/cpu.c40
-rw-r--r--src/libs/zbxsysinfo/openbsd/proc.c550
-rw-r--r--src/zabbix_agent/cpustat.c6
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;
}