From 692d3a10c7c9066fc855faf1957f6bf57ec59e81 Mon Sep 17 00:00:00 2001 From: Aleksandrs Saveljevs Date: Wed, 27 May 2015 12:39:56 +0000 Subject: ...G...... [ZBXNEXT-1368] arranged service functions alphabetically --- include/sysinfo.h | 4 +- src/libs/zbxsysinfo/win32/services.c | 776 +++++++++++++++++------------------ src/libs/zbxsysinfo/win32/win32.c | 4 +- 3 files changed, 392 insertions(+), 392 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,279 +22,6 @@ #include "log.h" #include "zbxjson.h" -int SERVICE_STATE(AGENT_REQUEST *request, AGENT_RESULT *result) -{ - SC_HANDLE mgr, service; - char *name; - wchar_t *wname; - wchar_t service_name[MAX_STRING_LEN]; - DWORD max_len_name = MAX_STRING_LEN; - int i, ret = SYSINFO_RET_FAIL; - SERVICE_STATUS status; - - if (1 < request->nparam) - { - SET_MSG_RESULT(result, zbx_strdup(NULL, "Too many parameters.")); - return SYSINFO_RET_FAIL; - } - - name = get_rparam(request, 0); - - if (NULL == name || '\0' == *name) - { - SET_MSG_RESULT(result, zbx_strdup(NULL, "Invalid first parameter.")); - return SYSINFO_RET_FAIL; - } - - if (NULL == (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); - - service = OpenService(mgr, wname, SERVICE_QUERY_STATUS); - if (NULL == service && 0 != GetServiceKeyName(mgr, wname, service_name, &max_len_name)) - service = OpenService(mgr, service_name, SERVICE_QUERY_STATUS); - zbx_free(wname); - - if (NULL == service) - { - SET_UI64_RESULT(result, 255); - } - else - { - if (QueryServiceStatus(service, &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); - } - - CloseServiceHandle(service); - } - - CloseServiceHandle(mgr); - - return SYSINFO_RET_OK; -} - -#define ZBX_SRV_STARTTYPE_ALL 0x00 -#define ZBX_SRV_STARTTYPE_AUTOMATIC 0x01 -#define ZBX_SRV_STARTTYPE_MANUAL 0x02 -#define ZBX_SRV_STARTTYPE_DISABLED 0x03 -static int check_service_starttype(SC_HANDLE h_srv, int start_type) -{ - int ret = FAIL; - DWORD sz; - QUERY_SERVICE_CONFIG *qsc = NULL; - - if (ZBX_SRV_STARTTYPE_ALL == start_type) - return SUCCEED; - - QueryServiceConfig(h_srv, qsc, 0, &sz); - - if (ERROR_INSUFFICIENT_BUFFER != GetLastError()) - return FAIL; - - qsc = (QUERY_SERVICE_CONFIG *)zbx_malloc((void *)qsc, sz); - - if (0 != QueryServiceConfig(h_srv, qsc, sz, &sz)) - { - switch (start_type) { - case ZBX_SRV_STARTTYPE_AUTOMATIC: - if (qsc->dwStartType == SERVICE_AUTO_START) - ret = SUCCEED; - break; - case ZBX_SRV_STARTTYPE_MANUAL: - if (qsc->dwStartType == SERVICE_DEMAND_START) - ret = SUCCEED; - break; - case ZBX_SRV_STARTTYPE_DISABLED: - if (qsc->dwStartType == SERVICE_DISABLED) - ret = SUCCEED; - break; - } - } - - zbx_free(qsc); - - return ret; -} - -#define ZBX_SRV_STATE_STOPPED 0x0001 -#define ZBX_SRV_STATE_START_PENDING 0x0002 -#define ZBX_SRV_STATE_STOP_PENDING 0x0004 -#define ZBX_SRV_STATE_RUNNING 0x0008 -#define ZBX_SRV_STATE_CONTINUE_PENDING 0x0010 -#define ZBX_SRV_STATE_PAUSE_PENDING 0x0020 -#define ZBX_SRV_STATE_PAUSED 0x0040 -#define ZBX_SRV_STATE_STARTED 0x007e /* ZBX_SRV_STATE_START_PENDING | ZBX_SRV_STATE_STOP_PENDING | - * ZBX_SRV_STATE_RUNNING | ZBX_SRV_STATE_CONTINUE_PENDING | - * ZBX_SRV_STATE_PAUSE_PENDING | ZBX_SRV_STATE_PAUSED - */ -#define ZBX_SRV_STATE_ALL 0x007f /* ZBX_SRV_STATE_STOPPED | ZBX_SRV_STATE_STARTED - */ -static int check_service_state(SC_HANDLE h_srv, int service_state) -{ - SERVICE_STATUS status; - - if (0 != QueryServiceStatus(h_srv, &status)) - { - switch (status.dwCurrentState) { - case SERVICE_STOPPED: - if (service_state & ZBX_SRV_STATE_STOPPED) - return SUCCEED; - break; - case SERVICE_START_PENDING: - if (service_state & ZBX_SRV_STATE_START_PENDING) - return SUCCEED; - break; - case SERVICE_STOP_PENDING: - if (service_state & ZBX_SRV_STATE_STOP_PENDING) - return SUCCEED; - break; - case SERVICE_RUNNING: - if (service_state & ZBX_SRV_STATE_RUNNING) - return SUCCEED; - break; - case SERVICE_CONTINUE_PENDING: - if (service_state & ZBX_SRV_STATE_CONTINUE_PENDING) - return SUCCEED; - break; - case SERVICE_PAUSE_PENDING: - if (service_state & ZBX_SRV_STATE_PAUSE_PENDING) - return SUCCEED; - break; - case SERVICE_PAUSED: - if (service_state & ZBX_SRV_STATE_PAUSED) - return SUCCEED; - break; - } - } - - return FAIL; -} - -int SERVICES(AGENT_REQUEST *request, AGENT_RESULT *result) -{ - int start_type, service_state, ret; - char *type, *state, *exclude, *buf = NULL, *utf8; - SC_HANDLE h_mgr; - ENUM_SERVICE_STATUS_PROCESS *ssp = NULL; - DWORD sz = 0, szn, i, services, resume_handle = 0; - - if (3 < request->nparam) - { - SET_MSG_RESULT(result, zbx_strdup(NULL, "Too many parameters.")); - return SYSINFO_RET_FAIL; - } - - type = get_rparam(request, 0); - state = get_rparam(request, 1); - exclude = get_rparam(request, 2); - - if (NULL == type || '\0' == *type || 0 == strcmp(type, "all")) /* default parameter */ - start_type = ZBX_SRV_STARTTYPE_ALL; - else if (0 == strcmp(type, "automatic")) - start_type = ZBX_SRV_STARTTYPE_AUTOMATIC; - else if (0 == strcmp(type, "manual")) - start_type = ZBX_SRV_STARTTYPE_MANUAL; - else if (0 == strcmp(type, "disabled")) - start_type = ZBX_SRV_STARTTYPE_DISABLED; - else - { - SET_MSG_RESULT(result, zbx_strdup(NULL, "Invalid first parameter.")); - return SYSINFO_RET_FAIL; - } - - if (NULL == state || '\0' == *state || 0 == strcmp(state, "all")) /* default parameter */ - service_state = ZBX_SRV_STATE_ALL; - else if (0 == strcmp(state, "stopped")) - service_state = ZBX_SRV_STATE_STOPPED; - else if (0 == strcmp(state, "started")) - service_state = ZBX_SRV_STATE_STARTED; - else if (0 == strcmp(state, "start_pending")) - service_state = ZBX_SRV_STATE_START_PENDING; - else if (0 == strcmp(state, "stop_pending")) - service_state = ZBX_SRV_STATE_STOP_PENDING; - else if (0 == strcmp(state, "running")) - service_state = ZBX_SRV_STATE_RUNNING; - else if (0 == strcmp(state, "continue_pending")) - service_state = ZBX_SRV_STATE_CONTINUE_PENDING; - else if (0 == strcmp(state, "pause_pending")) - service_state = ZBX_SRV_STATE_PAUSE_PENDING; - else if (0 == strcmp(state, "paused")) - service_state = ZBX_SRV_STATE_PAUSED; - 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; - } - - while (0 != (ret = EnumServicesStatusEx(h_mgr, SC_ENUM_PROCESS_INFO, SERVICE_WIN32, SERVICE_STATE_ALL, - (unsigned char *)ssp, sz, &szn, &services, &resume_handle, NULL)) || ERROR_MORE_DATA == GetLastError()) - { - for (i = 0; i < services; i++) - { - SC_HANDLE h_srv; - - if (NULL == (h_srv = OpenService(h_mgr, ssp[i].lpServiceName, SERVICE_QUERY_STATUS | SERVICE_QUERY_CONFIG))) - continue; - - if (SUCCEED == check_service_starttype(h_srv, start_type)) - { - if (SUCCEED == check_service_state(h_srv, service_state)) - { - utf8 = zbx_unicode_to_utf8(ssp[i].lpServiceName); - - if (NULL == exclude || FAIL == str_in_list(exclude, utf8, ',')) - buf = zbx_strdcatf(buf, "%s\n", utf8); - - zbx_free(utf8); - } - } - - 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); - - if (NULL == buf) - buf = zbx_strdup(buf, "0"); - - SET_STR_RESULT(result, buf); - - return SYSINFO_RET_OK; -} - int SERVICE_DISCOVERY(AGENT_REQUEST *request, AGENT_RESULT *result) { ENUM_SERVICE_STATUS_PROCESS *ssp = NULL; @@ -387,81 +114,390 @@ int SERVICE_DISCOVERY(AGENT_REQUEST *request, AGENT_RESULT *result) else utf8 = "unknown"; - zbx_json_addstring(&j, "{#SERVICE.STARTUP}", utf8, ZBX_JSON_TYPE_STRING); - zbx_free(utf8); - } + 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; + char *name; + wchar_t *wname; + wchar_t service_name[MAX_STRING_LEN]; + DWORD max_len_name = MAX_STRING_LEN; + int i, ret = SYSINFO_RET_FAIL; + SERVICE_STATUS status; + + if (1 < request->nparam) + { + SET_MSG_RESULT(result, zbx_strdup(NULL, "Too many parameters.")); + return SYSINFO_RET_FAIL; + } + + name = get_rparam(request, 0); + + if (NULL == name || '\0' == *name) + { + SET_MSG_RESULT(result, zbx_strdup(NULL, "Invalid first parameter.")); + return SYSINFO_RET_FAIL; + } + + if (NULL == (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); + + service = OpenService(mgr, wname, SERVICE_QUERY_STATUS); + if (NULL == service && 0 != GetServiceKeyName(mgr, wname, service_name, &max_len_name)) + service = OpenService(mgr, service_name, SERVICE_QUERY_STATUS); + zbx_free(wname); + + if (NULL == service) + { + SET_UI64_RESULT(result, 255); + } + else + { + if (QueryServiceStatus(service, &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); + } + + CloseServiceHandle(service); + } + + CloseServiceHandle(mgr); + + return SYSINFO_RET_OK; +} + +#define ZBX_SRV_STARTTYPE_ALL 0x00 +#define ZBX_SRV_STARTTYPE_AUTOMATIC 0x01 +#define ZBX_SRV_STARTTYPE_MANUAL 0x02 +#define ZBX_SRV_STARTTYPE_DISABLED 0x03 +static int check_service_starttype(SC_HANDLE h_srv, int start_type) +{ + int ret = FAIL; + DWORD sz; + QUERY_SERVICE_CONFIG *qsc = NULL; + + if (ZBX_SRV_STARTTYPE_ALL == start_type) + return SUCCEED; - zbx_free(qsc); - } + QueryServiceConfig(h_srv, qsc, 0, &sz); - zbx_json_close(&j); + if (ERROR_INSUFFICIENT_BUFFER != GetLastError()) + return FAIL; - CloseServiceHandle(h_srv); - } + qsc = (QUERY_SERVICE_CONFIG *)zbx_malloc((void *)qsc, sz); - if (0 == szn) + if (0 != QueryServiceConfig(h_srv, qsc, sz, &sz)) + { + switch (start_type) { + case ZBX_SRV_STARTTYPE_AUTOMATIC: + if (qsc->dwStartType == SERVICE_AUTO_START) + ret = SUCCEED; + break; + case ZBX_SRV_STARTTYPE_MANUAL: + if (qsc->dwStartType == SERVICE_DEMAND_START) + ret = SUCCEED; + break; + case ZBX_SRV_STARTTYPE_DISABLED: + if (qsc->dwStartType == SERVICE_DISABLED) + ret = SUCCEED; break; - - if (NULL == ssp) - { - sz = szn; - ssp = (ENUM_SERVICE_STATUS_PROCESS *)zbx_malloc((void *)ssp, sz); } } - zbx_free(ssp); + zbx_free(qsc); - CloseServiceHandle(h_mgr); + return ret; +} - zbx_json_close(&j); - SET_STR_RESULT(result, strdup(j.buffer)); - zbx_json_free(&j); +#define ZBX_SRV_STATE_STOPPED 0x0001 +#define ZBX_SRV_STATE_START_PENDING 0x0002 +#define ZBX_SRV_STATE_STOP_PENDING 0x0004 +#define ZBX_SRV_STATE_RUNNING 0x0008 +#define ZBX_SRV_STATE_CONTINUE_PENDING 0x0010 +#define ZBX_SRV_STATE_PAUSE_PENDING 0x0020 +#define ZBX_SRV_STATE_PAUSED 0x0040 +#define ZBX_SRV_STATE_STARTED 0x007e /* ZBX_SRV_STATE_START_PENDING | ZBX_SRV_STATE_STOP_PENDING | + * ZBX_SRV_STATE_RUNNING | ZBX_SRV_STATE_CONTINUE_PENDING | + * ZBX_SRV_STATE_PAUSE_PENDING | ZBX_SRV_STATE_PAUSED + */ +#define ZBX_SRV_STATE_ALL 0x007f /* ZBX_SRV_STATE_STOPPED | ZBX_SRV_STATE_STARTED + */ +static int check_service_state(SC_HANDLE h_srv, int service_state) +{ + SERVICE_STATUS status; - return SYSINFO_RET_OK; -} + if (0 != QueryServiceStatus(h_srv, &status)) + { + switch (status.dwCurrentState) { + case SERVICE_STOPPED: + if (service_state & ZBX_SRV_STATE_STOPPED) + return SUCCEED; + break; + case SERVICE_START_PENDING: + if (service_state & ZBX_SRV_STATE_START_PENDING) + return SUCCEED; + break; + case SERVICE_STOP_PENDING: + if (service_state & ZBX_SRV_STATE_STOP_PENDING) + return SUCCEED; + break; + case SERVICE_RUNNING: + if (service_state & ZBX_SRV_STATE_RUNNING) + return SUCCEED; + break; + case SERVICE_CONTINUE_PENDING: + if (service_state & ZBX_SRV_STATE_CONTINUE_PENDING) + return SUCCEED; + break; + case SERVICE_PAUSE_PENDING: + if (service_state & ZBX_SRV_STATE_PAUSE_PENDING) + return SUCCEED; + break; + case SERVICE_PAUSED: + if (service_state & ZBX_SRV_STATE_PAUSED) + return SUCCEED; + break; + } + } -#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 + return FAIL; +} -int SERVICE_INFO(AGENT_REQUEST *request, AGENT_RESULT *result) +int SERVICES(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; + int start_type, service_state, ret; + char *type, *state, *exclude, *buf = NULL, *utf8; + SC_HANDLE h_mgr; + ENUM_SERVICE_STATUS_PROCESS *ssp = NULL; + DWORD sz = 0, szn, i, services, resume_handle = 0; - if (2 < request->nparam) + if (3 < 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); + type = get_rparam(request, 0); + state = get_rparam(request, 1); + exclude = get_rparam(request, 2); - if (NULL == name || '\0' == *name) + if (NULL == type || '\0' == *type || 0 == strcmp(type, "all")) /* default parameter */ + start_type = ZBX_SRV_STARTTYPE_ALL; + else if (0 == strcmp(type, "automatic")) + start_type = ZBX_SRV_STARTTYPE_AUTOMATIC; + else if (0 == strcmp(type, "manual")) + start_type = ZBX_SRV_STARTTYPE_MANUAL; + else if (0 == strcmp(type, "disabled")) + start_type = ZBX_SRV_STARTTYPE_DISABLED; + else { 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; + if (NULL == state || '\0' == *state || 0 == strcmp(state, "all")) /* default parameter */ + service_state = ZBX_SRV_STATE_ALL; + else if (0 == strcmp(state, "stopped")) + service_state = ZBX_SRV_STATE_STOPPED; + else if (0 == strcmp(state, "started")) + service_state = ZBX_SRV_STATE_STARTED; + else if (0 == strcmp(state, "start_pending")) + service_state = ZBX_SRV_STATE_START_PENDING; + else if (0 == strcmp(state, "stop_pending")) + service_state = ZBX_SRV_STATE_STOP_PENDING; + else if (0 == strcmp(state, "running")) + service_state = ZBX_SRV_STATE_RUNNING; + else if (0 == strcmp(state, "continue_pending")) + service_state = ZBX_SRV_STATE_CONTINUE_PENDING; + else if (0 == strcmp(state, "pause_pending")) + service_state = ZBX_SRV_STATE_PAUSE_PENDING; + else if (0 == strcmp(state, "paused")) + service_state = ZBX_SRV_STATE_PAUSED; else { SET_MSG_RESULT(result, zbx_strdup(NULL, "Invalid second parameter.")); @@ -474,86 +510,50 @@ int SERVICE_INFO(AGENT_REQUEST *request, AGENT_RESULT *result) 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 + while (0 != (ret = EnumServicesStatusEx(h_mgr, SC_ENUM_PROCESS_INFO, SERVICE_WIN32, SERVICE_STATE_ALL, + (unsigned char *)ssp, sz, &szn, &services, &resume_handle, NULL)) || ERROR_MORE_DATA == GetLastError()) { - if (ZBX_SRV_PARAM_STATE == param_type) + for (i = 0; i < services; i++) { - 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}; + SC_HANDLE h_srv; - for (i = 0; i < 7 && status.dwCurrentState != states[i]; i++) - ; + if (NULL == (h_srv = OpenService(h_mgr, ssp[i].lpServiceName, SERVICE_QUERY_STATUS | SERVICE_QUERY_CONFIG))) + continue; - SET_UI64_RESULT(result, i); - } - else + if (SUCCEED == check_service_starttype(h_srv, start_type)) { - SET_UI64_RESULT(result, 7); - } - } - else - { - QueryServiceConfig(h_srv, qsc, 0, &sz); + if (SUCCEED == check_service_state(h_srv, service_state)) + { + utf8 = zbx_unicode_to_utf8(ssp[i].lpServiceName); - 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; + if (NULL == exclude || FAIL == str_in_list(exclude, utf8, ',')) + buf = zbx_strdcatf(buf, "%s\n", utf8); + + zbx_free(utf8); + } } - qsc = (QUERY_SERVICE_CONFIG *)zbx_malloc((void *)qsc, sz); + CloseServiceHandle(h_srv); + } - 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; - } + if (0 == szn) + break; - 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); + if (NULL == ssp) + { + sz = szn; + ssp = (ENUM_SERVICE_STATUS_PROCESS *)zbx_malloc((void *)ssp, sz); } } - CloseServiceHandle(h_srv); + zbx_free(ssp); + CloseServiceHandle(h_mgr); + if (NULL == buf) + buf = zbx_strdup(buf, "0"); + + SET_STR_RESULT(result, buf); + 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"}, -- cgit v1.2.3