diff options
author | Aleksandrs Saveljevs <git-no-reply@zabbix.com> | 2015-05-27 15:39:56 +0300 |
---|---|---|
committer | Aleksandrs Saveljevs <git-no-reply@zabbix.com> | 2015-05-27 15:39:56 +0300 |
commit | 692d3a10c7c9066fc855faf1957f6bf57ec59e81 (patch) | |
tree | 835a8dc1ca07c2368c33be4d22e89c12ba3477b4 | |
parent | 37746d79b0761b7780b8f92355bfc0c91f5a779f (diff) |
...G...... [ZBXNEXT-1368] arranged service functions alphabetically
-rw-r--r-- | include/sysinfo.h | 4 | ||||
-rw-r--r-- | src/libs/zbxsysinfo/win32/services.c | 526 | ||||
-rw-r--r-- | src/libs/zbxsysinfo/win32/win32.c | 4 |
3 files changed, 267 insertions, 267 deletions
diff --git a/include/sysinfo.h b/include/sysinfo.h index 0e713b45722..c8401a0bab0 100644 --- a/include/sysinfo.h +++ b/include/sysinfo.h @@ -253,10 +253,10 @@ int VM_MEMORY_SIZE(AGENT_REQUEST *request, AGENT_RESULT *result); #ifdef _WINDOWS int USER_PERF_COUNTER(AGENT_REQUEST *request, AGENT_RESULT *result); int PERF_COUNTER(AGENT_REQUEST *request, AGENT_RESULT *result); -int SERVICE_STATE(AGENT_REQUEST *request, AGENT_RESULT *result); -int SERVICES(AGENT_REQUEST *request, AGENT_RESULT *result); int SERVICE_DISCOVERY(AGENT_REQUEST *request, AGENT_RESULT *result); int SERVICE_INFO(AGENT_REQUEST *request, AGENT_RESULT *result); +int SERVICE_STATE(AGENT_REQUEST *request, AGENT_RESULT *result); +int SERVICES(AGENT_REQUEST *request, AGENT_RESULT *result); int PROC_INFO(AGENT_REQUEST *request, AGENT_RESULT *result); int NET_IF_LIST(AGENT_REQUEST *request, AGENT_RESULT *result); int WMI_GET(AGENT_REQUEST *request, AGENT_RESULT *result); diff --git a/src/libs/zbxsysinfo/win32/services.c b/src/libs/zbxsysinfo/win32/services.c index 4aabea46665..a71fb78cb44 100644 --- a/src/libs/zbxsysinfo/win32/services.c +++ b/src/libs/zbxsysinfo/win32/services.c @@ -22,6 +22,269 @@ #include "log.h" #include "zbxjson.h" +int SERVICE_DISCOVERY(AGENT_REQUEST *request, AGENT_RESULT *result) +{ + ENUM_SERVICE_STATUS_PROCESS *ssp = NULL; + QUERY_SERVICE_CONFIG *qsc = NULL; + SC_HANDLE h_mgr, h_srv; + DWORD sz = 0, szn, i, services, resume_handle = 0; + char *utf8; + struct zbx_json j; + + if (0 < request->nparam) + return SYSINFO_RET_FAIL; + + if (NULL == (h_mgr = OpenSCManager(NULL, NULL, GENERIC_READ))) + { + SET_MSG_RESULT(result, zbx_strdup(NULL, "Cannot obtain system information.")); + return SYSINFO_RET_FAIL; + } + + zbx_json_init(&j, ZBX_JSON_STAT_BUF_LEN); + zbx_json_addarray(&j, ZBX_PROTO_TAG_DATA); + + while (0 != EnumServicesStatusEx(h_mgr, SC_ENUM_PROCESS_INFO, SERVICE_WIN32, SERVICE_STATE_ALL, + (LPBYTE)ssp, sz, &szn, &services, &resume_handle, NULL) || ERROR_MORE_DATA == GetLastError()) + { + for (i = 0; i < services; i++) + { + if (NULL == (h_srv = OpenService(h_mgr, ssp[i].lpServiceName, SERVICE_QUERY_STATUS | + SERVICE_QUERY_CONFIG))) + { + continue; + } + + zbx_json_addobject(&j, NULL); + + utf8 = zbx_unicode_to_utf8(ssp[i].lpServiceName); + zbx_json_addstring(&j, "{#SERVICE.NAME}", utf8, ZBX_JSON_TYPE_STRING); + zbx_free(utf8); + + utf8 = zbx_unicode_to_utf8(ssp[i].lpDisplayName); + zbx_json_addstring(&j, "{#SERVICE.DISPLAYNAME}", utf8, ZBX_JSON_TYPE_STRING); + zbx_free(utf8); + + if((SERVICE_FILE_SYSTEM_DRIVER | SERVICE_KERNEL_DRIVER) & + ssp[i].ServiceStatusProcess.dwServiceType) + { + utf8 = "driver"; + } + else if((SERVICE_WIN32_OWN_PROCESS | SERVICE_WIN32_SHARE_PROCESS) & + ssp[i].ServiceStatusProcess.dwServiceType) + { + utf8 = "service"; + } + else + utf8 = "unknown"; + + zbx_json_addstring(&j, "{#SERVICE.TYPE}", utf8, ZBX_JSON_TYPE_STRING); + zbx_free(utf8); + + zbx_json_adduint64(&j, "{#SERVICE.STATE}", ssp[i].ServiceStatusProcess.dwCurrentState); + + QueryServiceConfig(h_srv, qsc, 0, &sz); + if (ERROR_INSUFFICIENT_BUFFER == GetLastError()) + { + qsc = (QUERY_SERVICE_CONFIG *)zbx_malloc((void *)qsc, sz); + + if (0 != QueryServiceConfig(h_srv, qsc, sz, &sz)) + { + utf8 = zbx_unicode_to_utf8(qsc->lpBinaryPathName); + zbx_json_addstring(&j, "{#SERVICE.PATH}", utf8, ZBX_JSON_TYPE_STRING); + zbx_free(utf8); + + utf8 = zbx_unicode_to_utf8(qsc->lpServiceStartName); + zbx_json_addstring(&j, "{#SERVICE.USER}", utf8, ZBX_JSON_TYPE_STRING); + zbx_free(utf8); + + if(SERVICE_DEMAND_START == qsc->dwStartType) + { + utf8 = "manual"; + } + else if(SERVICE_DISABLED == qsc->dwStartType) + { + utf8 = "disabled"; + } + else if(SERVICE_AUTO_START == qsc->dwStartType || + SERVICE_BOOT_START == qsc->dwStartType || + SERVICE_SYSTEM_START == qsc->dwStartType) + { + utf8 = "automatic"; + } + else + utf8 = "unknown"; + + zbx_json_addstring(&j, "{#SERVICE.STARTUP}", utf8, ZBX_JSON_TYPE_STRING); + zbx_free(utf8); + } + + zbx_free(qsc); + } + + zbx_json_close(&j); + + CloseServiceHandle(h_srv); + } + + if (0 == szn) + break; + + if (NULL == ssp) + { + sz = szn; + ssp = (ENUM_SERVICE_STATUS_PROCESS *)zbx_malloc((void *)ssp, sz); + } + } + + zbx_free(ssp); + + CloseServiceHandle(h_mgr); + + zbx_json_close(&j); + SET_STR_RESULT(result, strdup(j.buffer)); + zbx_json_free(&j); + + return SYSINFO_RET_OK; +} + +#define ZBX_SRV_PARAM_STATE 0x01 +#define ZBX_SRV_PARAM_DISPLAYNAME 0x02 +#define ZBX_SRV_PARAM_PATH 0x03 +#define ZBX_SRV_PARAM_USER 0x04 +#define ZBX_SRV_PARAM_STARTUP 0x05 + +int SERVICE_INFO(AGENT_REQUEST *request, AGENT_RESULT *result) +{ + QUERY_SERVICE_CONFIG *qsc = NULL; + SERVICE_STATUS status; + SC_HANDLE h_mgr, h_srv; + DWORD sz = 0; + int param_type, i; + char *name, *param; + wchar_t *wname, service_name[MAX_STRING_LEN]; + DWORD max_len_name = MAX_STRING_LEN; + + if (2 < request->nparam) + { + SET_MSG_RESULT(result, zbx_strdup(NULL, "Too many parameters.")); + return SYSINFO_RET_FAIL; + } + + name = get_rparam(request, 0); + param = get_rparam(request, 1); + + if (NULL == name || '\0' == *name) + { + SET_MSG_RESULT(result, zbx_strdup(NULL, "Invalid first parameter.")); + return SYSINFO_RET_FAIL; + } + + if (NULL == param || '\0' == *param || 0 == strcmp(param, "state")) /* default second parameter */ + param_type = ZBX_SRV_PARAM_STATE; + else if (0 == strcmp(param, "displayname")) + param_type = ZBX_SRV_PARAM_DISPLAYNAME; + else if (0 == strcmp(param, "path")) + param_type = ZBX_SRV_PARAM_PATH; + else if (0 == strcmp(param, "user")) + param_type = ZBX_SRV_PARAM_USER; + else if (0 == strcmp(param, "startup")) + param_type = ZBX_SRV_PARAM_STARTUP; + else + { + SET_MSG_RESULT(result, zbx_strdup(NULL, "Invalid second parameter.")); + return SYSINFO_RET_FAIL; + } + + if (NULL == (h_mgr = OpenSCManager(NULL, NULL, GENERIC_READ))) + { + SET_MSG_RESULT(result, zbx_strdup(NULL, "Cannot obtain system information.")); + return SYSINFO_RET_FAIL; + } + + wname = zbx_utf8_to_unicode(name); + h_srv = OpenService(h_mgr, wname, SERVICE_QUERY_STATUS | SERVICE_QUERY_CONFIG); + + if (NULL == h_srv && 0 != GetServiceKeyName(h_mgr, wname, service_name, &max_len_name)) + h_srv = OpenService(h_mgr, service_name, SERVICE_QUERY_STATUS | SERVICE_QUERY_CONFIG); + + zbx_free(wname); + + if (NULL == h_srv) + { + SET_MSG_RESULT(result, zbx_dsprintf(NULL, "service \"%s\" could not be found", name)); + CloseServiceHandle(h_mgr); + return SYSINFO_RET_FAIL; + } + else + { + if (ZBX_SRV_PARAM_STATE == param_type) + { + if (0 != QueryServiceStatus(h_srv, &status)) + { + static DWORD states[7] = {SERVICE_RUNNING, SERVICE_PAUSED, SERVICE_START_PENDING, + SERVICE_PAUSE_PENDING,SERVICE_CONTINUE_PENDING, SERVICE_STOP_PENDING, + SERVICE_STOPPED}; + + for (i = 0; i < 7 && status.dwCurrentState != states[i]; i++) + ; + + SET_UI64_RESULT(result, i); + } + else + { + SET_UI64_RESULT(result, 7); + } + } + else + { + QueryServiceConfig(h_srv, qsc, 0, &sz); + + if (ERROR_INSUFFICIENT_BUFFER != GetLastError()) + { + SET_MSG_RESULT(result, zbx_dsprintf(NULL, "Cannot obtain service config: %s", + strerror_from_system(GetLastError()))); + CloseServiceHandle(h_srv); + CloseServiceHandle(h_mgr); + return SYSINFO_RET_FAIL; + } + + qsc = (QUERY_SERVICE_CONFIG *)zbx_malloc((void *)qsc, sz); + + if (0 == QueryServiceConfig(h_srv, qsc, sz, &sz)) + { + SET_MSG_RESULT(result, zbx_dsprintf(NULL, "Cannot obtain service config: %s", + strerror_from_system(GetLastError()))); + zbx_free(qsc); + CloseServiceHandle(h_srv); + CloseServiceHandle(h_mgr); + return SYSINFO_RET_FAIL; + } + + switch (param_type) + { + case ZBX_SRV_PARAM_DISPLAYNAME: + SET_STR_RESULT(result, zbx_unicode_to_utf8(qsc->lpDisplayName)); + break; + case ZBX_SRV_PARAM_PATH: + SET_STR_RESULT(result, zbx_unicode_to_utf8(qsc->lpBinaryPathName)); + break; + case ZBX_SRV_PARAM_USER: + SET_STR_RESULT(result, zbx_unicode_to_utf8(qsc->lpServiceStartName)); + break; + case ZBX_SRV_PARAM_STARTUP: + SET_UI64_RESULT(result, qsc->dwStartType); + break; + } + zbx_free(qsc); + } + } + + CloseServiceHandle(h_srv); + CloseServiceHandle(h_mgr); + + return SYSINFO_RET_OK; +} + int SERVICE_STATE(AGENT_REQUEST *request, AGENT_RESULT *result) { SC_HANDLE mgr, service; @@ -294,266 +557,3 @@ int SERVICES(AGENT_REQUEST *request, AGENT_RESULT *result) return SYSINFO_RET_OK; } - -int SERVICE_DISCOVERY(AGENT_REQUEST *request, AGENT_RESULT *result) -{ - ENUM_SERVICE_STATUS_PROCESS *ssp = NULL; - QUERY_SERVICE_CONFIG *qsc = NULL; - SC_HANDLE h_mgr, h_srv; - DWORD sz = 0, szn, i, services, resume_handle = 0; - char *utf8; - struct zbx_json j; - - if (0 < request->nparam) - return SYSINFO_RET_FAIL; - - if (NULL == (h_mgr = OpenSCManager(NULL, NULL, GENERIC_READ))) - { - SET_MSG_RESULT(result, zbx_strdup(NULL, "Cannot obtain system information.")); - return SYSINFO_RET_FAIL; - } - - zbx_json_init(&j, ZBX_JSON_STAT_BUF_LEN); - zbx_json_addarray(&j, ZBX_PROTO_TAG_DATA); - - while (0 != EnumServicesStatusEx(h_mgr, SC_ENUM_PROCESS_INFO, SERVICE_WIN32, SERVICE_STATE_ALL, - (LPBYTE)ssp, sz, &szn, &services, &resume_handle, NULL) || ERROR_MORE_DATA == GetLastError()) - { - for (i = 0; i < services; i++) - { - if (NULL == (h_srv = OpenService(h_mgr, ssp[i].lpServiceName, SERVICE_QUERY_STATUS | - SERVICE_QUERY_CONFIG))) - { - continue; - } - - zbx_json_addobject(&j, NULL); - - utf8 = zbx_unicode_to_utf8(ssp[i].lpServiceName); - zbx_json_addstring(&j, "{#SERVICE.NAME}", utf8, ZBX_JSON_TYPE_STRING); - zbx_free(utf8); - - utf8 = zbx_unicode_to_utf8(ssp[i].lpDisplayName); - zbx_json_addstring(&j, "{#SERVICE.DISPLAYNAME}", utf8, ZBX_JSON_TYPE_STRING); - zbx_free(utf8); - - if((SERVICE_FILE_SYSTEM_DRIVER | SERVICE_KERNEL_DRIVER) & - ssp[i].ServiceStatusProcess.dwServiceType) - { - utf8 = "driver"; - } - else if((SERVICE_WIN32_OWN_PROCESS | SERVICE_WIN32_SHARE_PROCESS) & - ssp[i].ServiceStatusProcess.dwServiceType) - { - utf8 = "service"; - } - else - utf8 = "unknown"; - - zbx_json_addstring(&j, "{#SERVICE.TYPE}", utf8, ZBX_JSON_TYPE_STRING); - zbx_free(utf8); - - zbx_json_adduint64(&j, "{#SERVICE.STATE}", ssp[i].ServiceStatusProcess.dwCurrentState); - - QueryServiceConfig(h_srv, qsc, 0, &sz); - if (ERROR_INSUFFICIENT_BUFFER == GetLastError()) - { - qsc = (QUERY_SERVICE_CONFIG *)zbx_malloc((void *)qsc, sz); - - if (0 != QueryServiceConfig(h_srv, qsc, sz, &sz)) - { - utf8 = zbx_unicode_to_utf8(qsc->lpBinaryPathName); - zbx_json_addstring(&j, "{#SERVICE.PATH}", utf8, ZBX_JSON_TYPE_STRING); - zbx_free(utf8); - - utf8 = zbx_unicode_to_utf8(qsc->lpServiceStartName); - zbx_json_addstring(&j, "{#SERVICE.USER}", utf8, ZBX_JSON_TYPE_STRING); - zbx_free(utf8); - - if(SERVICE_DEMAND_START == qsc->dwStartType) - { - utf8 = "manual"; - } - else if(SERVICE_DISABLED == qsc->dwStartType) - { - utf8 = "disabled"; - } - else if(SERVICE_AUTO_START == qsc->dwStartType || - SERVICE_BOOT_START == qsc->dwStartType || - SERVICE_SYSTEM_START == qsc->dwStartType) - { - utf8 = "automatic"; - } - else - utf8 = "unknown"; - - zbx_json_addstring(&j, "{#SERVICE.STARTUP}", utf8, ZBX_JSON_TYPE_STRING); - zbx_free(utf8); - } - - zbx_free(qsc); - } - - zbx_json_close(&j); - - CloseServiceHandle(h_srv); - } - - if (0 == szn) - break; - - if (NULL == ssp) - { - sz = szn; - ssp = (ENUM_SERVICE_STATUS_PROCESS *)zbx_malloc((void *)ssp, sz); - } - } - - zbx_free(ssp); - - CloseServiceHandle(h_mgr); - - zbx_json_close(&j); - SET_STR_RESULT(result, strdup(j.buffer)); - zbx_json_free(&j); - - return SYSINFO_RET_OK; -} - -#define ZBX_SRV_PARAM_STATE 0x01 -#define ZBX_SRV_PARAM_DISPLAYNAME 0x02 -#define ZBX_SRV_PARAM_PATH 0x03 -#define ZBX_SRV_PARAM_USER 0x04 -#define ZBX_SRV_PARAM_STARTUP 0x05 - -int SERVICE_INFO(AGENT_REQUEST *request, AGENT_RESULT *result) -{ - QUERY_SERVICE_CONFIG *qsc = NULL; - SERVICE_STATUS status; - SC_HANDLE h_mgr, h_srv; - DWORD sz = 0; - int param_type, i; - char *name, *param; - wchar_t *wname, service_name[MAX_STRING_LEN]; - DWORD max_len_name = MAX_STRING_LEN; - - if (2 < request->nparam) - { - SET_MSG_RESULT(result, zbx_strdup(NULL, "Too many parameters.")); - return SYSINFO_RET_FAIL; - } - - name = get_rparam(request, 0); - param = get_rparam(request, 1); - - if (NULL == name || '\0' == *name) - { - SET_MSG_RESULT(result, zbx_strdup(NULL, "Invalid first parameter.")); - return SYSINFO_RET_FAIL; - } - - if (NULL == param || '\0' == *param || 0 == strcmp(param, "state")) /* default second parameter */ - param_type = ZBX_SRV_PARAM_STATE; - else if (0 == strcmp(param, "displayname")) - param_type = ZBX_SRV_PARAM_DISPLAYNAME; - else if (0 == strcmp(param, "path")) - param_type = ZBX_SRV_PARAM_PATH; - else if (0 == strcmp(param, "user")) - param_type = ZBX_SRV_PARAM_USER; - else if (0 == strcmp(param, "startup")) - param_type = ZBX_SRV_PARAM_STARTUP; - else - { - SET_MSG_RESULT(result, zbx_strdup(NULL, "Invalid second parameter.")); - return SYSINFO_RET_FAIL; - } - - if (NULL == (h_mgr = OpenSCManager(NULL, NULL, GENERIC_READ))) - { - SET_MSG_RESULT(result, zbx_strdup(NULL, "Cannot obtain system information.")); - return SYSINFO_RET_FAIL; - } - - wname = zbx_utf8_to_unicode(name); - h_srv = OpenService(h_mgr, wname, SERVICE_QUERY_STATUS | SERVICE_QUERY_CONFIG); - - if (NULL == h_srv && 0 != GetServiceKeyName(h_mgr, wname, service_name, &max_len_name)) - h_srv = OpenService(h_mgr, service_name, SERVICE_QUERY_STATUS | SERVICE_QUERY_CONFIG); - - zbx_free(wname); - - if (NULL == h_srv) - { - SET_MSG_RESULT(result, zbx_dsprintf(NULL, "service \"%s\" could not be found", name)); - CloseServiceHandle(h_mgr); - return SYSINFO_RET_FAIL; - } - else - { - if (ZBX_SRV_PARAM_STATE == param_type) - { - if (0 != QueryServiceStatus(h_srv, &status)) - { - static DWORD states[7] = {SERVICE_RUNNING, SERVICE_PAUSED, SERVICE_START_PENDING, - SERVICE_PAUSE_PENDING,SERVICE_CONTINUE_PENDING, SERVICE_STOP_PENDING, - SERVICE_STOPPED}; - - for (i = 0; i < 7 && status.dwCurrentState != states[i]; i++) - ; - - SET_UI64_RESULT(result, i); - } - else - { - SET_UI64_RESULT(result, 7); - } - } - else - { - QueryServiceConfig(h_srv, qsc, 0, &sz); - - if (ERROR_INSUFFICIENT_BUFFER != GetLastError()) - { - SET_MSG_RESULT(result, zbx_dsprintf(NULL, "Cannot obtain service config: %s", - strerror_from_system(GetLastError()))); - CloseServiceHandle(h_srv); - CloseServiceHandle(h_mgr); - return SYSINFO_RET_FAIL; - } - - qsc = (QUERY_SERVICE_CONFIG *)zbx_malloc((void *)qsc, sz); - - if (0 == QueryServiceConfig(h_srv, qsc, sz, &sz)) - { - SET_MSG_RESULT(result, zbx_dsprintf(NULL, "Cannot obtain service config: %s", - strerror_from_system(GetLastError()))); - zbx_free(qsc); - CloseServiceHandle(h_srv); - CloseServiceHandle(h_mgr); - return SYSINFO_RET_FAIL; - } - - switch (param_type) - { - case ZBX_SRV_PARAM_DISPLAYNAME: - SET_STR_RESULT(result, zbx_unicode_to_utf8(qsc->lpDisplayName)); - break; - case ZBX_SRV_PARAM_PATH: - SET_STR_RESULT(result, zbx_unicode_to_utf8(qsc->lpBinaryPathName)); - break; - case ZBX_SRV_PARAM_USER: - SET_STR_RESULT(result, zbx_unicode_to_utf8(qsc->lpServiceStartName)); - break; - case ZBX_SRV_PARAM_STARTUP: - SET_UI64_RESULT(result, qsc->dwStartType); - break; - } - zbx_free(qsc); - } - } - - CloseServiceHandle(h_srv); - CloseServiceHandle(h_mgr); - - return SYSINFO_RET_OK; -} diff --git a/src/libs/zbxsysinfo/win32/win32.c b/src/libs/zbxsysinfo/win32/win32.c index 0309570d049..5fa0c83c3a2 100644 --- a/src/libs/zbxsysinfo/win32/win32.c +++ b/src/libs/zbxsysinfo/win32/win32.c @@ -53,10 +53,10 @@ ZBX_METRIC parameters_specific[] = {"system.uname", 0, SYSTEM_UNAME, NULL}, + {"service.discovery", CF_HAVEPARAMS, SERVICE_DISCOVERY, NULL}, + {"service.info", CF_HAVEPARAMS, SERVICE_INFO, ZABBIX_SERVICE_NAME}, {"service_state", CF_HAVEPARAMS, SERVICE_STATE, ZABBIX_SERVICE_NAME}, {"services", CF_HAVEPARAMS, SERVICES, NULL}, - {"service.info", CF_HAVEPARAMS, SERVICE_INFO, ZABBIX_SERVICE_NAME}, - {"service.discovery", CF_HAVEPARAMS, SERVICE_DISCOVERY, NULL}, {"perf_counter", CF_HAVEPARAMS, PERF_COUNTER, "\\System\\Processes"}, {"proc_info", CF_HAVEPARAMS, PROC_INFO, "svchost.exe"}, |