diff options
author | Dmitrijs Goloscapovs <dmitrijs.goloscapovs@zabbix.com> | 2021-10-22 09:57:01 +0300 |
---|---|---|
committer | Dmitrijs Goloscapovs <dmitrijs.goloscapovs@zabbix.com> | 2021-10-22 09:59:04 +0300 |
commit | 5149b7089c43e0f175e8304244b0be1899939600 (patch) | |
tree | 5e3a685e08c274c151b991d0ea3f2c2c7a24af81 | |
parent | fd1cada6756b3561e66b9db3d6be59922c694e31 (diff) |
...G...... [ZBXNEXT-6782] added new parameters for system.hostname
* commit '649bc4917e1cefe41f699c6b272bc0ff01351c25':
.......... [ZBXNEXT-6782] fixed style
...G...... [ZBXNEXT-6782] fixed win agent params
...G...... [ZBXNEXT-6782] removed duplicated code in win agent2
...G...... [ZBXNEXT-6782] win agent: made netbios default, fixed leak
..F....... [ZBXNEXT-6782] updated item help
...G...... [ZBXNEXT-6782] style fixes and restored comment
...G...... [ZBXNEXT-6782] added error handling
...G...... [ZBXNEXT-6782] fixed macro in sysinfo
...G...... [ZBXNEXT-6782] refactoring
...G...... [ZBXNEXT-6782] refactoring
...G...... [ZBXNEXT-6782] refactoring
...G...... [ZBXNEXT-6782] refactored
...G...... [ZBXNEXT-6782] refactored
...G...... [ZBXNEXT-6782] refactored
...G...... [ZBXNEXT-6782] fixed cpp check warning
...G...... [ZBXNEXT-6782] removed redundant defines
...G...... [ZBXNEXT-6782] fixed netbios retrieval on windows
...G...... [ZBXNEXT-6782] fixed subissues
...G...... [ZBXNEXT-6782] added new parameters for system.hostname
(cherry picked from commit ac96c6d96d3e0bdcef0f026b2d81c2bc1ec434ae)
-rw-r--r-- | ChangeLog.d/feature/ZBXNEXT-6782 | 1 | ||||
-rw-r--r-- | include/sysinfo.h | 5 | ||||
-rw-r--r-- | src/go/plugins/system/uname/uname_linux.go | 37 | ||||
-rw-r--r-- | src/go/plugins/system/uname/uname_windows.go | 34 | ||||
-rw-r--r-- | src/libs/zbxcomms/comms.c | 5 | ||||
-rw-r--r-- | src/libs/zbxsysinfo/aix/hostname.c | 17 | ||||
-rw-r--r-- | src/libs/zbxsysinfo/freebsd/hostname.c | 17 | ||||
-rw-r--r-- | src/libs/zbxsysinfo/hpux/hostname.c | 18 | ||||
-rw-r--r-- | src/libs/zbxsysinfo/linux/hostname.c | 17 | ||||
-rw-r--r-- | src/libs/zbxsysinfo/netbsd/hostname.c | 17 | ||||
-rw-r--r-- | src/libs/zbxsysinfo/openbsd/hostname.c | 18 | ||||
-rw-r--r-- | src/libs/zbxsysinfo/osf/hostname.c | 17 | ||||
-rw-r--r-- | src/libs/zbxsysinfo/osx/hostname.c | 17 | ||||
-rw-r--r-- | src/libs/zbxsysinfo/solaris/hostname.c | 17 | ||||
-rw-r--r-- | src/libs/zbxsysinfo/sysinfo.c | 48 | ||||
-rw-r--r-- | src/libs/zbxsysinfo/win32/hostname.c | 93 | ||||
-rw-r--r-- | ui/include/classes/items/CHelpItems.php | 4 |
17 files changed, 318 insertions, 64 deletions
diff --git a/ChangeLog.d/feature/ZBXNEXT-6782 b/ChangeLog.d/feature/ZBXNEXT-6782 new file mode 100644 index 00000000000..20a40b20db9 --- /dev/null +++ b/ChangeLog.d/feature/ZBXNEXT-6782 @@ -0,0 +1 @@ +...G...... [ZBXNEXT-6782] added new parameters for system.hostname (dgoloscapov) diff --git a/include/sysinfo.h b/include/sysinfo.h index 00e100bcf3c..cadee600def 100644 --- a/include/sysinfo.h +++ b/include/sysinfo.h @@ -372,4 +372,9 @@ void zbx_mpoints_free(zbx_mpoint_t *mpoint); zbx_uint32_t get_thread_global_mutex_flag(void); #endif +#ifndef _WINDOWS +int hostname_handle_params(AGENT_REQUEST *request, AGENT_RESULT *result, char *hostname); #endif + +#endif + diff --git a/src/go/plugins/system/uname/uname_linux.go b/src/go/plugins/system/uname/uname_linux.go index 6ec332811f8..5aea9426c22 100644 --- a/src/go/plugins/system/uname/uname_linux.go +++ b/src/go/plugins/system/uname/uname_linux.go @@ -22,6 +22,7 @@ package uname import ( "errors" "fmt" + "strings" "syscall" ) @@ -42,17 +43,49 @@ func getUname(params []string) (uname string, err error) { } func getHostname(params []string) (hostname string, err error) { - if len(params) > 0 { + if len(params) > 2 { return "", errors.New("Too many parameters.") } + var mode, transform string + + if len(params) > 0 { + mode = params[0] + if len(params) > 1 { + transform = params[1] + } + } + var utsname syscall.Utsname if err = syscall.Uname(&utsname); err != nil { err = fmt.Errorf("Cannot obtain system information: %s", err.Error()) return } - return arrayToString(&utsname.Nodename), nil + switch mode { + case "host", "": + hostname = arrayToString(&utsname.Nodename) + case "shorthost": + hostname = arrayToString(&utsname.Nodename) + if idx := strings.Index(hostname, "."); idx > 0 { + hostname = hostname[:idx] + } + case "netbios": + return "", errors.New("NetBIOS is not supported on the current platform.") + default: + return "", errors.New("Invalid first parameter.") + } + + switch transform { + case "lower": + hostname = strings.ToLower(hostname) + case "none", "": + break + default: + return "", errors.New("Invalid second parameter.") + } + + return } func getSwArch(params []string) (uname string, err error) { diff --git a/src/go/plugins/system/uname/uname_windows.go b/src/go/plugins/system/uname/uname_windows.go index a3721d19d78..eae7d820263 100644 --- a/src/go/plugins/system/uname/uname_windows.go +++ b/src/go/plugins/system/uname/uname_windows.go @@ -23,6 +23,7 @@ import ( "errors" "os" "runtime" + "strings" "syscall" "golang.org/x/sys/windows" @@ -30,12 +31,17 @@ import ( ) func getHostname(params []string) (uname string, err error) { - if len(params) > 1 { + if len(params) > 2 { return "", errors.New("Too many parameters.") } - var mode string + + var mode, transform string + if len(params) > 0 { mode = params[0] + if len(params) > 1 { + transform = params[1] + } } switch mode { @@ -45,12 +51,32 @@ func getHostname(params []string) (uname string, err error) { if err = syscall.GetComputerName(&w[0], &sz); err != nil { return "", err } - return windows.UTF16ToString(w), nil + uname = windows.UTF16ToString(w) case "host": - return os.Hostname() + if uname, err = os.Hostname(); err != nil { + return "", err + } + case "shorthost": + if uname, err = os.Hostname(); err != nil { + return "", err + } + if idx := strings.Index(uname, "."); idx > 0 { + uname = uname[:idx] + } default: return "", errors.New("Invalid first parameter.") } + + switch transform { + case "lower": + uname = strings.ToLower(uname) + case "none", "": + break + default: + return "", errors.New("Invalid second parameter.") + } + + return } func getArch() string { diff --git a/src/libs/zbxcomms/comms.c b/src/libs/zbxcomms/comms.c index 65fb3ac24ed..8d631e71017 100644 --- a/src/libs/zbxcomms/comms.c +++ b/src/libs/zbxcomms/comms.c @@ -1783,8 +1783,11 @@ ssize_t zbx_tcp_recv_ext(zbx_socket_t *s, int timeout, unsigned char flags) zbx_uint64_t expected_len = 16 * ZBX_MEBIBYTE, reserved = 0, max_len; unsigned char expect = ZBX_TCP_EXPECT_HEADER; int protocol_version; - +#if defined(_WINDOWS) + max_len = ZBX_MAX_RECV_DATA_SIZE; +#else max_len = 0 != (flags & ZBX_TCP_LARGE) ? ZBX_MAX_RECV_LARGE_DATA_SIZE : ZBX_MAX_RECV_DATA_SIZE; +#endif if (0 != timeout) zbx_socket_timeout_set(s, timeout); diff --git a/src/libs/zbxsysinfo/aix/hostname.c b/src/libs/zbxsysinfo/aix/hostname.c index 2bc87d45c9c..ac282888411 100644 --- a/src/libs/zbxsysinfo/aix/hostname.c +++ b/src/libs/zbxsysinfo/aix/hostname.c @@ -26,11 +26,19 @@ ZBX_METRIC parameter_hostname = /* KEY FLAG FUNCTION TEST PARAMETERS */ - {"system.hostname", 0, SYSTEM_HOSTNAME, NULL}; + {"system.hostname", CF_HAVEPARAMS, SYSTEM_HOSTNAME, NULL}; int SYSTEM_HOSTNAME(AGENT_REQUEST *request, AGENT_RESULT *result) { struct utsname name; + char *hostname; + int rc; + + if (2 < request->nparam) + { + SET_MSG_RESULT(result, zbx_strdup(NULL, "Too many parameters.")); + return SYSINFO_RET_FAIL; + } if (-1 == uname(&name)) { @@ -38,7 +46,10 @@ int SYSTEM_HOSTNAME(AGENT_REQUEST *request, AGENT_RESULT *result) return SYSINFO_RET_FAIL; } - SET_STR_RESULT(result, zbx_strdup(NULL, name.nodename)); + hostname = zbx_strdup(NULL, name.nodename); + + if (FAIL == (rc = hostname_handle_params(request, result, hostname))) + zbx_free(hostname); - return SYSINFO_RET_OK; + return rc; } diff --git a/src/libs/zbxsysinfo/freebsd/hostname.c b/src/libs/zbxsysinfo/freebsd/hostname.c index 2bc87d45c9c..ac282888411 100644 --- a/src/libs/zbxsysinfo/freebsd/hostname.c +++ b/src/libs/zbxsysinfo/freebsd/hostname.c @@ -26,11 +26,19 @@ ZBX_METRIC parameter_hostname = /* KEY FLAG FUNCTION TEST PARAMETERS */ - {"system.hostname", 0, SYSTEM_HOSTNAME, NULL}; + {"system.hostname", CF_HAVEPARAMS, SYSTEM_HOSTNAME, NULL}; int SYSTEM_HOSTNAME(AGENT_REQUEST *request, AGENT_RESULT *result) { struct utsname name; + char *hostname; + int rc; + + if (2 < request->nparam) + { + SET_MSG_RESULT(result, zbx_strdup(NULL, "Too many parameters.")); + return SYSINFO_RET_FAIL; + } if (-1 == uname(&name)) { @@ -38,7 +46,10 @@ int SYSTEM_HOSTNAME(AGENT_REQUEST *request, AGENT_RESULT *result) return SYSINFO_RET_FAIL; } - SET_STR_RESULT(result, zbx_strdup(NULL, name.nodename)); + hostname = zbx_strdup(NULL, name.nodename); + + if (FAIL == (rc = hostname_handle_params(request, result, hostname))) + zbx_free(hostname); - return SYSINFO_RET_OK; + return rc; } diff --git a/src/libs/zbxsysinfo/hpux/hostname.c b/src/libs/zbxsysinfo/hpux/hostname.c index 700fb5f19b4..90bab823f7d 100644 --- a/src/libs/zbxsysinfo/hpux/hostname.c +++ b/src/libs/zbxsysinfo/hpux/hostname.c @@ -22,12 +22,19 @@ ZBX_METRIC parameter_hostname = /* KEY FLAG FUNCTION TEST PARAMETERS */ - {"system.hostname", 0, SYSTEM_HOSTNAME, NULL}; + {"system.hostname", CF_HAVEPARAMS, SYSTEM_HOSTNAME, NULL}; int SYSTEM_HOSTNAME(AGENT_REQUEST *request, AGENT_RESULT *result) { - char *hostname; - long hostbufsize = 0; + int rc; + char *hostname; + long hostbufsize = 0; + + if (2 < request->nparam) + { + SET_MSG_RESULT(result, zbx_strdup(NULL, "Too many parameters.")); + return SYSINFO_RET_FAIL; + } #ifdef _SC_HOST_NAME_MAX hostbufsize = sysconf(_SC_HOST_NAME_MAX) + 1; @@ -44,7 +51,8 @@ int SYSTEM_HOSTNAME(AGENT_REQUEST *request, AGENT_RESULT *result) return SYSINFO_RET_FAIL; } - SET_STR_RESULT(result, hostname); + if (FAIL == (rc = hostname_handle_params(request, result, hostname))) + zbx_free(hostname); - return SYSINFO_RET_OK; + return rc; } diff --git a/src/libs/zbxsysinfo/linux/hostname.c b/src/libs/zbxsysinfo/linux/hostname.c index 55ff8b1f235..ac282888411 100644 --- a/src/libs/zbxsysinfo/linux/hostname.c +++ b/src/libs/zbxsysinfo/linux/hostname.c @@ -26,13 +26,19 @@ ZBX_METRIC parameter_hostname = /* KEY FLAG FUNCTION TEST PARAMETERS */ - {"system.hostname", 0, SYSTEM_HOSTNAME, NULL}; + {"system.hostname", CF_HAVEPARAMS, SYSTEM_HOSTNAME, NULL}; int SYSTEM_HOSTNAME(AGENT_REQUEST *request, AGENT_RESULT *result) { struct utsname name; + char *hostname; + int rc; - ZBX_UNUSED(request); + if (2 < request->nparam) + { + SET_MSG_RESULT(result, zbx_strdup(NULL, "Too many parameters.")); + return SYSINFO_RET_FAIL; + } if (-1 == uname(&name)) { @@ -40,7 +46,10 @@ int SYSTEM_HOSTNAME(AGENT_REQUEST *request, AGENT_RESULT *result) return SYSINFO_RET_FAIL; } - SET_STR_RESULT(result, zbx_strdup(NULL, name.nodename)); + hostname = zbx_strdup(NULL, name.nodename); + + if (FAIL == (rc = hostname_handle_params(request, result, hostname))) + zbx_free(hostname); - return SYSINFO_RET_OK; + return rc; } diff --git a/src/libs/zbxsysinfo/netbsd/hostname.c b/src/libs/zbxsysinfo/netbsd/hostname.c index 2bc87d45c9c..ac282888411 100644 --- a/src/libs/zbxsysinfo/netbsd/hostname.c +++ b/src/libs/zbxsysinfo/netbsd/hostname.c @@ -26,11 +26,19 @@ ZBX_METRIC parameter_hostname = /* KEY FLAG FUNCTION TEST PARAMETERS */ - {"system.hostname", 0, SYSTEM_HOSTNAME, NULL}; + {"system.hostname", CF_HAVEPARAMS, SYSTEM_HOSTNAME, NULL}; int SYSTEM_HOSTNAME(AGENT_REQUEST *request, AGENT_RESULT *result) { struct utsname name; + char *hostname; + int rc; + + if (2 < request->nparam) + { + SET_MSG_RESULT(result, zbx_strdup(NULL, "Too many parameters.")); + return SYSINFO_RET_FAIL; + } if (-1 == uname(&name)) { @@ -38,7 +46,10 @@ int SYSTEM_HOSTNAME(AGENT_REQUEST *request, AGENT_RESULT *result) return SYSINFO_RET_FAIL; } - SET_STR_RESULT(result, zbx_strdup(NULL, name.nodename)); + hostname = zbx_strdup(NULL, name.nodename); + + if (FAIL == (rc = hostname_handle_params(request, result, hostname))) + zbx_free(hostname); - return SYSINFO_RET_OK; + return rc; } diff --git a/src/libs/zbxsysinfo/openbsd/hostname.c b/src/libs/zbxsysinfo/openbsd/hostname.c index 2bc87d45c9c..3ec3d0f63ad 100644 --- a/src/libs/zbxsysinfo/openbsd/hostname.c +++ b/src/libs/zbxsysinfo/openbsd/hostname.c @@ -26,11 +26,19 @@ ZBX_METRIC parameter_hostname = /* KEY FLAG FUNCTION TEST PARAMETERS */ - {"system.hostname", 0, SYSTEM_HOSTNAME, NULL}; + {"system.hostname", CF_HAVEPARAMS, SYSTEM_HOSTNAME, NULL}; int SYSTEM_HOSTNAME(AGENT_REQUEST *request, AGENT_RESULT *result) { struct utsname name; + char *hostname; + int rc; + + if (2 < request->nparam) + { + SET_MSG_RESULT(result, zbx_strdup(NULL, "Too many parameters.")); + return SYSINFO_RET_FAIL; + } if (-1 == uname(&name)) { @@ -38,7 +46,11 @@ int SYSTEM_HOSTNAME(AGENT_REQUEST *request, AGENT_RESULT *result) return SYSINFO_RET_FAIL; } - SET_STR_RESULT(result, zbx_strdup(NULL, name.nodename)); + hostname = zbx_strdup(NULL, name.nodename); + + if (FAIL == (rc = hostname_handle_params(request, result, hostname))) + zbx_free(hostname); - return SYSINFO_RET_OK; + return rc; } + diff --git a/src/libs/zbxsysinfo/osf/hostname.c b/src/libs/zbxsysinfo/osf/hostname.c index 2bc87d45c9c..ac282888411 100644 --- a/src/libs/zbxsysinfo/osf/hostname.c +++ b/src/libs/zbxsysinfo/osf/hostname.c @@ -26,11 +26,19 @@ ZBX_METRIC parameter_hostname = /* KEY FLAG FUNCTION TEST PARAMETERS */ - {"system.hostname", 0, SYSTEM_HOSTNAME, NULL}; + {"system.hostname", CF_HAVEPARAMS, SYSTEM_HOSTNAME, NULL}; int SYSTEM_HOSTNAME(AGENT_REQUEST *request, AGENT_RESULT *result) { struct utsname name; + char *hostname; + int rc; + + if (2 < request->nparam) + { + SET_MSG_RESULT(result, zbx_strdup(NULL, "Too many parameters.")); + return SYSINFO_RET_FAIL; + } if (-1 == uname(&name)) { @@ -38,7 +46,10 @@ int SYSTEM_HOSTNAME(AGENT_REQUEST *request, AGENT_RESULT *result) return SYSINFO_RET_FAIL; } - SET_STR_RESULT(result, zbx_strdup(NULL, name.nodename)); + hostname = zbx_strdup(NULL, name.nodename); + + if (FAIL == (rc = hostname_handle_params(request, result, hostname))) + zbx_free(hostname); - return SYSINFO_RET_OK; + return rc; } diff --git a/src/libs/zbxsysinfo/osx/hostname.c b/src/libs/zbxsysinfo/osx/hostname.c index 2bc87d45c9c..ac282888411 100644 --- a/src/libs/zbxsysinfo/osx/hostname.c +++ b/src/libs/zbxsysinfo/osx/hostname.c @@ -26,11 +26,19 @@ ZBX_METRIC parameter_hostname = /* KEY FLAG FUNCTION TEST PARAMETERS */ - {"system.hostname", 0, SYSTEM_HOSTNAME, NULL}; + {"system.hostname", CF_HAVEPARAMS, SYSTEM_HOSTNAME, NULL}; int SYSTEM_HOSTNAME(AGENT_REQUEST *request, AGENT_RESULT *result) { struct utsname name; + char *hostname; + int rc; + + if (2 < request->nparam) + { + SET_MSG_RESULT(result, zbx_strdup(NULL, "Too many parameters.")); + return SYSINFO_RET_FAIL; + } if (-1 == uname(&name)) { @@ -38,7 +46,10 @@ int SYSTEM_HOSTNAME(AGENT_REQUEST *request, AGENT_RESULT *result) return SYSINFO_RET_FAIL; } - SET_STR_RESULT(result, zbx_strdup(NULL, name.nodename)); + hostname = zbx_strdup(NULL, name.nodename); + + if (FAIL == (rc = hostname_handle_params(request, result, hostname))) + zbx_free(hostname); - return SYSINFO_RET_OK; + return rc; } diff --git a/src/libs/zbxsysinfo/solaris/hostname.c b/src/libs/zbxsysinfo/solaris/hostname.c index 2bc87d45c9c..ac282888411 100644 --- a/src/libs/zbxsysinfo/solaris/hostname.c +++ b/src/libs/zbxsysinfo/solaris/hostname.c @@ -26,11 +26,19 @@ ZBX_METRIC parameter_hostname = /* KEY FLAG FUNCTION TEST PARAMETERS */ - {"system.hostname", 0, SYSTEM_HOSTNAME, NULL}; + {"system.hostname", CF_HAVEPARAMS, SYSTEM_HOSTNAME, NULL}; int SYSTEM_HOSTNAME(AGENT_REQUEST *request, AGENT_RESULT *result) { struct utsname name; + char *hostname; + int rc; + + if (2 < request->nparam) + { + SET_MSG_RESULT(result, zbx_strdup(NULL, "Too many parameters.")); + return SYSINFO_RET_FAIL; + } if (-1 == uname(&name)) { @@ -38,7 +46,10 @@ int SYSTEM_HOSTNAME(AGENT_REQUEST *request, AGENT_RESULT *result) return SYSINFO_RET_FAIL; } - SET_STR_RESULT(result, zbx_strdup(NULL, name.nodename)); + hostname = zbx_strdup(NULL, name.nodename); + + if (FAIL == (rc = hostname_handle_params(request, result, hostname))) + zbx_free(hostname); - return SYSINFO_RET_OK; + return rc; } diff --git a/src/libs/zbxsysinfo/sysinfo.c b/src/libs/zbxsysinfo/sysinfo.c index 872ed360218..a76fc8992ad 100644 --- a/src/libs/zbxsysinfo/sysinfo.c +++ b/src/libs/zbxsysinfo/sysinfo.c @@ -2077,3 +2077,51 @@ void zbx_mpoints_free(zbx_mpoint_t *mpoint) { zbx_free(mpoint); } + +#ifndef _WINDOWS +int hostname_handle_params(AGENT_REQUEST *request, AGENT_RESULT *result, char *hostname) +{ + char *type, *transform; + + type = get_rparam(request, 0); + transform = get_rparam(request, 1); + + if (NULL != type && '\0' != *type && 0 != strcmp(type, "host")) + { + if (0 == strcmp(type, "shorthost")) + { + char *dot; + + if (NULL != (dot = strchr(hostname, '.'))) + *dot = '\0'; + } + else if (0 == strcmp(type, "netbios")) + { + SET_MSG_RESULT(result, zbx_strdup(NULL, "NetBIOS is not supported on the current platform.")); + return FAIL; + } + else + { + SET_MSG_RESULT(result, zbx_strdup(NULL, "Invalid first parameter.")); + return FAIL; + } + } + + if (NULL != transform && '\0' != *transform && 0 != strcmp(transform, "none")) + { + if (0 == strcmp(transform, "lower")) + { + zbx_strlower(hostname); + } + else + { + SET_MSG_RESULT(result, zbx_strdup(NULL, "Invalid second parameter.")); + return FAIL; + } + } + + SET_STR_RESULT(result, hostname); + + return SUCCEED; +} +#endif diff --git a/src/libs/zbxsysinfo/win32/hostname.c b/src/libs/zbxsysinfo/win32/hostname.c index 5fd14def653..7ce08b85406 100644 --- a/src/libs/zbxsysinfo/win32/hostname.c +++ b/src/libs/zbxsysinfo/win32/hostname.c @@ -24,58 +24,101 @@ ZBX_METRIC parameter_hostname = /* KEY FLAG FUNCTION TEST PARAMETERS */ {"system.hostname", CF_HAVEPARAMS, SYSTEM_HOSTNAME, NULL}; + +static void retrieve_hostname(char *buffer, int len, char **error) +{ + if (SUCCEED != gethostname(buffer, len)) + { + zabbix_log(LOG_LEVEL_ERR, "gethostname() failed: %s", strerror_from_system(WSAGetLastError())); + *error = zbx_dsprintf(NULL, "Cannot obtain host name: %s", strerror_from_system(WSAGetLastError())); + } +} + int SYSTEM_HOSTNAME(AGENT_REQUEST *request, AGENT_RESULT *result) { - DWORD dwSize = 256; - wchar_t computerName[256]; - char *type, buffer[256]; - int netbios; + DWORD dwSize = 256; + wchar_t computerName[256]; + char *type, *transform, buffer[256], *name, *error = NULL; - if (1 < request->nparam) + if (2 < request->nparam) { SET_MSG_RESULT(result, zbx_strdup(NULL, "Too many parameters.")); return SYSINFO_RET_FAIL; } type = get_rparam(request, 0); + transform = get_rparam(request, 1); if (NULL == type || '\0' == *type || 0 == strcmp(type, "netbios")) - netbios = 1; - else if (0 == strcmp(type, "host")) - netbios = 0; - else { - SET_MSG_RESULT(result, zbx_strdup(NULL, "Invalid first parameter.")); - return SYSINFO_RET_FAIL; - } - - if (1 == netbios) - { - /* Buffer size is chosen large enough to contain any DNS name, not just MAX_COMPUTERNAME_LENGTH + 1 */ - /* characters. MAX_COMPUTERNAME_LENGTH is usually less than 32, but it varies among systems, so we */ - /* cannot use the constant in a precompiled Windows agent, which is expected to work on any system. */ + /* Buffer size is chosen large enough to contain any DNS name, not just */ + /* MAX_COMPUTERNAME_LENGTH + 1 characters. MAX_COMPUTERNAME_LENGTH is usually less than 32, */ + /* but it varies among systems, so we cannot use the constant in a precompiled Windows agent,*/ + /* which is expected to work on any system. */ if (0 == GetComputerName(computerName, &dwSize)) { - zabbix_log(LOG_LEVEL_ERR, "GetComputerName() failed: %s", strerror_from_system(GetLastError())); + zabbix_log(LOG_LEVEL_ERR, "GetComputerName() failed: %s", + strerror_from_system(GetLastError())); + SET_MSG_RESULT(result, zbx_dsprintf(NULL, "Cannot obtain computer name: %s", strerror_from_system(GetLastError()))); + return SYSINFO_RET_FAIL; } - SET_STR_RESULT(result, zbx_unicode_to_utf8(computerName)); + name = zbx_unicode_to_utf8(computerName); } else { - if (SUCCEED != gethostname(buffer, sizeof(buffer))) + if (0 == strcmp(type, "shorthost")) { - zabbix_log(LOG_LEVEL_ERR, "gethostname() failed: %s", strerror_from_system(WSAGetLastError())); - SET_MSG_RESULT(result, zbx_dsprintf(NULL, "Cannot obtain host name: %s", - strerror_from_system(WSAGetLastError()))); + retrieve_hostname(buffer, sizeof(buffer), &error); + if (NULL != error) + { + SET_MSG_RESULT(result, error); + return SYSINFO_RET_FAIL; + } + + char *dot; + + if (NULL != (dot = strchr(buffer, '.'))) + *dot = '\0'; + + name = zbx_strdup(NULL, buffer); + } + else if (0 == strcmp(type, "host")) + { + retrieve_hostname(buffer, sizeof(buffer), &error); + if (NULL != error) + { + SET_MSG_RESULT(result, error); + return SYSINFO_RET_FAIL; + } + + name = zbx_strdup(NULL, buffer); + } + else + { + SET_MSG_RESULT(result, zbx_strdup(NULL, "Invalid first parameter.")); return SYSINFO_RET_FAIL; } + } - SET_STR_RESULT(result, zbx_strdup(NULL, buffer)); + if (NULL != transform && '\0' != *transform && 0 != strcmp(transform, "none")) + { + if (0 == strcmp(transform, "lower")) + { + zbx_strlower(name); + } + else + { + zbx_free(name); + SET_MSG_RESULT(result, zbx_strdup(NULL, "Invalid second parameter.")); + return SYSINFO_RET_FAIL; + } } + SET_STR_RESULT(result, name); + return SYSINFO_RET_OK; } diff --git a/ui/include/classes/items/CHelpItems.php b/ui/include/classes/items/CHelpItems.php index c61d15df77b..5937c1a532c 100644 --- a/ui/include/classes/items/CHelpItems.php +++ b/ui/include/classes/items/CHelpItems.php @@ -217,7 +217,7 @@ class CHelpItems { 'description' => _('CPU utilisation percentage. Returns float') ], [ - 'key' => 'system.hostname[<type>]', + 'key' => 'system.hostname[<type>,<transform>]', 'description' => _('System host name. Returns string') ], [ @@ -571,7 +571,7 @@ class CHelpItems { 'description' => _('CPU utilisation percentage. Returns float') ], [ - 'key' => 'system.hostname[<type>]', + 'key' => 'system.hostname[<type>,<transform>]', 'description' => _('System host name. Returns string') ], [ |