Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/zabbix/zabbix.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDmitrijs Goloscapovs <dmitrijs.goloscapovs@zabbix.com>2021-10-22 09:57:01 +0300
committerDmitrijs Goloscapovs <dmitrijs.goloscapovs@zabbix.com>2021-10-22 09:59:04 +0300
commit5149b7089c43e0f175e8304244b0be1899939600 (patch)
tree5e3a685e08c274c151b991d0ea3f2c2c7a24af81
parentfd1cada6756b3561e66b9db3d6be59922c694e31 (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-67821
-rw-r--r--include/sysinfo.h5
-rw-r--r--src/go/plugins/system/uname/uname_linux.go37
-rw-r--r--src/go/plugins/system/uname/uname_windows.go34
-rw-r--r--src/libs/zbxcomms/comms.c5
-rw-r--r--src/libs/zbxsysinfo/aix/hostname.c17
-rw-r--r--src/libs/zbxsysinfo/freebsd/hostname.c17
-rw-r--r--src/libs/zbxsysinfo/hpux/hostname.c18
-rw-r--r--src/libs/zbxsysinfo/linux/hostname.c17
-rw-r--r--src/libs/zbxsysinfo/netbsd/hostname.c17
-rw-r--r--src/libs/zbxsysinfo/openbsd/hostname.c18
-rw-r--r--src/libs/zbxsysinfo/osf/hostname.c17
-rw-r--r--src/libs/zbxsysinfo/osx/hostname.c17
-rw-r--r--src/libs/zbxsysinfo/solaris/hostname.c17
-rw-r--r--src/libs/zbxsysinfo/sysinfo.c48
-rw-r--r--src/libs/zbxsysinfo/win32/hostname.c93
-rw-r--r--ui/include/classes/items/CHelpItems.php4
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')
],
[