static int NET_IF_TOTAL_PACKETS(const char *if_name, AGENT_RESULT *result) { kstat_named_t ikn, okn; char *error = NULL; if (SUCCEED == get_kstat_named_field(if_name, "ipackets64", &ikn, &error) && SUCCEED == get_kstat_named_field(if_name, "opackets64", &okn, &error)) { SET_UI64_RESULT(result, get_kstat_numeric_value(&ikn) + get_kstat_numeric_value(&okn)); } else if (SUCCEED == get_kstat_named_field(if_name, "ipackets", &ikn, &error) && SUCCEED == get_kstat_named_field(if_name, "opackets", &okn, &error)) { SET_UI64_RESULT(result, get_kstat_numeric_value(&ikn) + get_kstat_numeric_value(&okn)); } else { SET_MSG_RESULT(result, error); return SYSINFO_RET_FAIL; } zbx_free(error); return SYSINFO_RET_OK; }
static int NET_IF_TOTAL_ERRORS(const char *if_name, AGENT_RESULT *result) { kstat_named_t ikn, okn; if (SUCCEED == get_kstat_named_field(if_name, "ierrors", &ikn) && SUCCEED == get_kstat_named_field(if_name, "oerrors", &okn)) { SET_UI64_RESULT(result, get_kstat_numeric_value(&ikn) + get_kstat_numeric_value(&okn)); } else return SYSINFO_RET_FAIL; return SYSINFO_RET_OK; }
int NET_IF_COLLISIONS(AGENT_REQUEST *request, AGENT_RESULT *result) { kstat_named_t kn; char *if_name, *error = NULL; if (1 < request->nparam) { SET_MSG_RESULT(result, zbx_strdup(NULL, "Too many parameters.")); return SYSINFO_RET_FAIL; } if_name = get_rparam(request, 0); if (NULL == if_name || '\0' == *if_name) { SET_MSG_RESULT(result, zbx_strdup(NULL, "Invalid first parameter.")); return SYSINFO_RET_FAIL; } if (SUCCEED != get_kstat_named_field(if_name, "collisions", &kn, &error)) { SET_MSG_RESULT(result, error); return SYSINFO_RET_FAIL; } SET_UI64_RESULT(result, get_kstat_numeric_value(&kn)); return SYSINFO_RET_OK; }
static int NET_IF_IN_ERRORS(const char *if_name, AGENT_RESULT *result) { kstat_named_t kn; if (SUCCEED == get_kstat_named_field(if_name, "ierrors", &kn)) SET_UI64_RESULT(result, get_kstat_numeric_value(&kn)); else return SYSINFO_RET_FAIL; return SYSINFO_RET_OK; }
static int NET_IF_OUT_BYTES(const char *if_name, AGENT_RESULT *result) { kstat_named_t kn; if (SUCCEED == get_kstat_named_field(if_name, "obytes64", &kn) || SUCCEED == get_kstat_named_field(if_name, "obytes", &kn)) { SET_UI64_RESULT(result, get_kstat_numeric_value(&kn)); } else return SYSINFO_RET_FAIL; return SYSINFO_RET_OK; }
static int NET_IF_OUT_ERRORS(const char *if_name, AGENT_RESULT *result) { kstat_named_t kn; char *error = NULL; if (SUCCEED == get_kstat_named_field(if_name, "oerrors", &kn, &error)) { SET_UI64_RESULT(result, get_kstat_numeric_value(&kn)); } else { SET_MSG_RESULT(result, error); return SYSINFO_RET_FAIL; } return SYSINFO_RET_OK; }
int NET_IF_COLLISIONS(const char *cmd, const char *param, unsigned flags, AGENT_RESULT *result) { kstat_named_t kn; char if_name[MAX_STRING_LEN]; if (1 < num_param(param)) return SYSINFO_RET_FAIL; if (0 != get_param(param, 1, if_name, sizeof(if_name))) return SYSINFO_RET_FAIL; if (SUCCEED == get_kstat_named_field(if_name, "collisions", &kn)) SET_UI64_RESULT(result, get_kstat_numeric_value(&kn)); else return SYSINFO_RET_FAIL; return SYSINFO_RET_OK; }
static int NET_IF_IN_BYTES(const char *if_name, AGENT_RESULT *result) { kstat_named_t kn; char *error = NULL; if (SUCCEED == get_kstat_named_field(if_name, "rbytes64", &kn, &error) || SUCCEED == get_kstat_named_field(if_name, "rbytes", &kn, &error)) { SET_UI64_RESULT(result, get_kstat_numeric_value(&kn)); } else { SET_MSG_RESULT(result, error); return SYSINFO_RET_FAIL; } zbx_free(error); return SYSINFO_RET_OK; }
static int get_kstat_system_misc(char *key, int *value, char **error) { kstat_ctl_t *kc; kstat_t *ksp; kstat_named_t *kn = NULL; int ret = FAIL; if (NULL == (kc = kstat_open())) { *error = zbx_dsprintf(NULL, "Cannot open kernel statistics facility: %s", zbx_strerror(errno)); return ret; } if (NULL == (ksp = kstat_lookup(kc, "unix", 0, "system_misc"))) { *error = zbx_dsprintf(NULL, "Cannot look up in kernel statistics facility: %s", zbx_strerror(errno)); goto close; } if (-1 == kstat_read(kc, ksp, NULL)) { *error = zbx_dsprintf(NULL, "Cannot read from kernel statistics facility: %s", zbx_strerror(errno)); goto close; } if (NULL == (kn = (kstat_named_t *)kstat_data_lookup(ksp, key))) { *error = zbx_dsprintf(NULL, "Cannot look up data in kernel statistics facility: %s", zbx_strerror(errno)); goto close; } *value = get_kstat_numeric_value(kn); ret = SUCCEED; close: kstat_close(kc); return ret; }
int SYSTEM_UPTIME(AGENT_REQUEST *request, AGENT_RESULT *result) { #if defined(HAVE_SYSINFO_UPTIME) struct sysinfo info; if (0 == sysinfo(&info)) { SET_UI64_RESULT(result, info.uptime); return SYSINFO_RET_OK; } else return SYSINFO_RET_FAIL; #elif defined(HAVE_FUNCTION_SYSCTL_KERN_BOOTTIME) int mib[2], now; size_t len; struct timeval uptime; mib[0] = CTL_KERN; mib[1] = KERN_BOOTTIME; len = sizeof(uptime); if (0 != sysctl(mib, 2, &uptime, &len, NULL, 0)) return SYSINFO_RET_FAIL; now = time(NULL); SET_UI64_RESULT(result, now - uptime.tv_sec); return SYSINFO_RET_OK; #elif defined(HAVE_KSTAT_H) /* Solaris */ kstat_ctl_t *kc; kstat_t *kp; kstat_named_t *kn; long hz; long secs; /* open kstat */ kc = kstat_open(); if (0 == kc) return SYSINFO_RET_FAIL; /* read uptime counter */ kp = kstat_lookup(kc, "unix", 0, "system_misc"); if (0 == kp) { kstat_close(kc); return SYSINFO_RET_FAIL; } if (-1 == kstat_read(kc, kp, 0)) { kstat_close(kc); return SYSINFO_RET_FAIL; } kn = (kstat_named_t*)kstat_data_lookup(kp, "clk_intr"); hz = sysconf(_SC_CLK_TCK); /* make sure we do not divide by 0 */ assert(hz); secs = get_kstat_numeric_value(kn) / hz; /* close kstat */ kstat_close(kc); SET_UI64_RESULT(result, secs); return SYSINFO_RET_OK; #else return SYSINFO_RET_FAIL; #endif }
int SYSTEM_BOOTTIME(AGENT_REQUEST *request, AGENT_RESULT *result) { int ret = SYSINFO_RET_FAIL; #ifdef HAVE_ZONE_H if (GLOBAL_ZONEID == getzoneid()) { #endif kstat_ctl_t *kc; kstat_t *kp; kstat_named_t *kn; if (NULL == (kc = kstat_open())) { SET_MSG_RESULT(result, zbx_dsprintf(NULL, "Cannot open kernel statistics facility: %s", zbx_strerror(errno))); return ret; } if (NULL == (kp = kstat_lookup(kc, "unix", 0, "system_misc"))) { SET_MSG_RESULT(result, zbx_dsprintf(NULL, "Cannot look up in kernel statistics facility: %s", zbx_strerror(errno))); goto clean; } if (-1 == kstat_read(kc, kp, 0)) { SET_MSG_RESULT(result, zbx_dsprintf(NULL, "Cannot read from kernel statistics facility: %s", zbx_strerror(errno))); goto clean; } if (NULL == (kn = (kstat_named_t *)kstat_data_lookup(kp, "boot_time"))) { SET_MSG_RESULT(result, zbx_dsprintf(NULL, "Cannot look up data in kernel statistics facility:" " %s", zbx_strerror(errno))); goto clean; } SET_UI64_RESULT(result, get_kstat_numeric_value(kn)); ret = SYSINFO_RET_OK; clean: kstat_close(kc); #ifdef HAVE_ZONE_H } else { struct utmpx utmpx_local, *utmpx; utmpx_local.ut_type = BOOT_TIME; setutxent(); if (NULL != (utmpx = getutxid(&utmpx_local))) { SET_UI64_RESULT(result, utmpx->ut_xtime); ret = SYSINFO_RET_OK; } else SET_MSG_RESULT(result, zbx_strdup(NULL, "Cannot obtain system boot time.")); endutxent(); } #endif return ret; }