diff options
author | osmiy <osmiy@97f52cf1-0a1b-0410-bd0e-c28be96e8082> | 2007-06-28 14:35:44 +0000 |
---|---|---|
committer | osmiy <osmiy@97f52cf1-0a1b-0410-bd0e-c28be96e8082> | 2007-06-28 14:35:44 +0000 |
commit | 8c13594d1bb50b44a708dbd3c0acaa19fa340660 (patch) | |
tree | fddca3b670cf005baec37c3ce523a3017e301a36 | |
parent | 5268a939d762eb782750151c17a58628cab0e9e8 (diff) | |
download | zabbix-8c13594d1bb50b44a708dbd3c0acaa19fa340660.tar.gz zabbix-8c13594d1bb50b44a708dbd3c0acaa19fa340660.tar.xz zabbix-8c13594d1bb50b44a708dbd3c0acaa19fa340660.zip |
- improoved UserParameters for Win32 (Eugene)
git-svn-id: svn://svn.zabbix.com/trunk@4376 97f52cf1-0a1b-0410-bd0e-c28be96e8082
-rw-r--r-- | ChangeLog | 1 | ||||
-rwxr-xr-x | bin/win32/zabbix_agentd.exe | bin | 159744 -> 159744 bytes | |||
-rwxr-xr-x | build/win32/include/config.h | 3 | ||||
-rw-r--r-- | include/alias.h | 1 | ||||
-rw-r--r-- | include/service.h | 10 | ||||
-rw-r--r-- | include/threads.h | 4 | ||||
-rw-r--r-- | src/libs/zbxcommon/alias.c | 48 | ||||
-rw-r--r-- | src/libs/zbxcomms/comms.c | 29 | ||||
-rw-r--r-- | src/libs/zbxsysinfo/common/common.c | 159 | ||||
-rw-r--r-- | src/libs/zbxsysinfo/sysinfo.c | 1 | ||||
-rw-r--r-- | src/libs/zbxwin32/service.c | 23 | ||||
-rw-r--r-- | src/zabbix_agent/perfstat.c | 1 | ||||
-rw-r--r-- | src/zabbix_agent/zabbix_agent.c | 2 | ||||
-rw-r--r-- | src/zabbix_agent/zabbix_agentd.c | 29 | ||||
-rw-r--r-- | src/zabbix_agent/zbxconf.c | 3 | ||||
-rw-r--r-- | src/zabbix_get/zabbix_get.c | 6 | ||||
-rw-r--r-- | src/zabbix_sender/zabbix_sender.c | 3 |
17 files changed, 194 insertions, 129 deletions
@@ -7,6 +7,7 @@ Changes for 1.5: Changes for 1.4.1: + - improoved UserParameters for Win32 (Eugene) - fixed several issues in housekeeper (Alexei) - changed properties of text files in SVN repository (Alexei) - removed text "Current node [N]" from node selector (Alexei) diff --git a/bin/win32/zabbix_agentd.exe b/bin/win32/zabbix_agentd.exe Binary files differindex a247e7b5..07a5962c 100755 --- a/bin/win32/zabbix_agentd.exe +++ b/bin/win32/zabbix_agentd.exe diff --git a/build/win32/include/config.h b/build/win32/include/config.h index 496e48d9..a0350487 100755 --- a/build/win32/include/config.h +++ b/build/win32/include/config.h @@ -51,3 +51,6 @@ /* Define to 1 if you have the <assert.h> header file. */ #define HAVE_ASSERT_H 1 + +/* Define to 1 if you have the <signal.h> header file. */ +#define HAVE_SIGNAL_H diff --git a/include/alias.h b/include/alias.h index d3b91214..fe43bad9 100644 --- a/include/alias.h +++ b/include/alias.h @@ -36,5 +36,4 @@ int add_alias_from_config(char *value); void alias_list_free(void); void alias_expand(const char *orig, char *expanded, int exp_buf_len); - #endif /* ZABBIX_ALIAS_H */ diff --git a/include/service.h b/include/service.h index e6fae036..2d9e1cbd 100644 --- a/include/service.h +++ b/include/service.h @@ -38,20 +38,20 @@ int ZabbixRemoveService(void); int ZabbixStartService(void); int ZabbixStopService(void); -#define init_main_process() +void init_main_process(void); /* APPLICATION running status */ /* requred for closing application from service */ -extern int application_is_runned; +int application_status; -#define ZBX_APP_STOPPED 1 +#define ZBX_APP_STOPPED 0 #define ZBX_APP_RUNNED 1 /* ask for running application of closing status */ -#define ZBX_IS_RUNNING (ZBX_APP_RUNNED == application_is_runned) +#define ZBX_IS_RUNNING (ZBX_APP_RUNNED == application_status) /* ask for application closing status */ -#define ZBX_DO_EXIT() (application_is_runned = ZBX_APP_STOPPED) +#define ZBX_DO_EXIT() zbx_error("[%s] [%li]", __FILE__, __LINE__); application_status = ZBX_APP_STOPPED #define START_MAIN_ZABBIX_ENTRY(a) service_start() diff --git a/include/threads.h b/include/threads.h index 982382a0..9d574a17 100644 --- a/include/threads.h +++ b/include/threads.h @@ -40,6 +40,8 @@ #define zbx_sleep(sec) Sleep(((DWORD)(sec))*((DWORD)1000)) + #define zbx_thread_kill(h) TerminateThread(h, SUCCEED); + #else /* not _WINDOWS */ int zbx_fork(); @@ -60,6 +62,8 @@ #define zbx_sleep(sec) sleep((sec)) + #define zbx_thread_kill(h) kill(h,SIGTERM); + #endif /* _WINDOWS */ ZBX_THREAD_HANDLE zbx_thread_start(ZBX_THREAD_ENTRY_POINTER(handler), void *args); diff --git a/src/libs/zbxcommon/alias.c b/src/libs/zbxcommon/alias.c index 46c4d321..e3df0efe 100644 --- a/src/libs/zbxcommon/alias.c +++ b/src/libs/zbxcommon/alias.c @@ -48,43 +48,44 @@ int add_alias_from_config(char *line) int add_alias(const char *name, const char *value) { - ALIAS *alias; + ALIAS *alias = NULL; + + assert(name); + assert(value); for(alias = aliasList; ; alias=alias->next) { /* Add new parameters */ - if(alias == NULL) + if ( NULL == alias ) { - alias = (ALIAS *)malloc(sizeof(ALIAS)); - if (NULL != alias) - { - memset(alias,0,sizeof(ALIAS)); - zbx_strlcpy(alias->name, name, MAX_ALIAS_NAME-1); - alias->value = (char *)malloc(strlen(value)+1); - strcpy(alias->value,value); - alias->next=aliasList; - aliasList=alias; - - zabbix_log( LOG_LEVEL_DEBUG, "Alias added. [%s] -> [%s]", name, value); - return SUCCEED; - } - break; + alias = (ALIAS *)zbx_malloc(alias, sizeof(ALIAS)); + memset(alias,0,sizeof(ALIAS)); + + zbx_strlcpy(alias->name, name, MAX_ALIAS_NAME-1); + + alias->value = strdup(value); + + alias->next=aliasList; + + aliasList=alias; + + zabbix_log( LOG_LEVEL_DEBUG, "Alias added. [%s] -> [%s]", name, value); + return SUCCEED; } /* Replace existing parameters */ if (strcmp(alias->name, name) == 0) { - if(alias->value) - free(alias->value); + zbx_free(alias->value); memset(alias, 0, sizeof(ALIAS)); zbx_strlcpy(alias->name, name, MAX_ALIAS_NAME-1); - - alias->value = (char *)malloc(strlen(value)+1); - strcpy(alias->value, value); + + alias->value = strdup(value); alias->next = aliasList; + aliasList = alias; zabbix_log( LOG_LEVEL_DEBUG, "Alias replaced. [%s] -> [%s]", name, value); @@ -105,9 +106,10 @@ void alias_list_free(void) { curr = next; next = curr->next; - free(curr->value); - free(curr); + zbx_free(curr->value); + zbx_free(curr); } + aliasList = NULL; } /* diff --git a/src/libs/zbxcomms/comms.c b/src/libs/zbxcomms/comms.c index b3ef8209..9327aca9 100644 --- a/src/libs/zbxcomms/comms.c +++ b/src/libs/zbxcomms/comms.c @@ -112,15 +112,19 @@ struct hostent *zbx_gethost(const char *hostname) assert(hostname); +zabbix_log( LOG_LEVEL_DEBUG, "gethostbyname"); /* TMP !!! */ host = gethostbyname(hostname); if(host) return host; addr = inet_addr(hostname); +zabbix_log( LOG_LEVEL_DEBUG, "gethostbyaddr"); /* TMP !!! */ host = gethostbyaddr((char *)&addr, 4, AF_INET); if(host) return host; +zabbix_log( LOG_LEVEL_DEBUG, "FAIL"); /* TMP !!! */ + ZBX_TCP_ERR_START "gethost() failed for address '%s' [%s]", hostname, strerror_from_system(zbx_sock_last_error()) ZBX_TCP_ERR_END; return (struct hostent*) NULL; @@ -313,6 +317,7 @@ int zbx_tcp_send_ext(zbx_sock_t *s, const char *data, unsigned char flags) /* Write header */ if( ZBX_TCP_ERROR == ZBX_TCP_WRITE(s->socket, ZBX_TCP_HEADER, ZBX_TCP_HEADER_LEN)) { + ZBX_TCP_ERR_START "ZBX_TCP_WRITE() failed [%s]", strerror_from_system(zbx_sock_last_error()) ZBX_TCP_ERR_END; return FAIL; } @@ -321,6 +326,7 @@ int zbx_tcp_send_ext(zbx_sock_t *s, const char *data, unsigned char flags) /* Write data length */ if( ZBX_TCP_ERROR == ZBX_TCP_WRITE(s->socket, (char *) &len64, sizeof(len64)) ) { + ZBX_TCP_ERR_START "ZBX_TCP_WRITE() failed [%s]", strerror_from_system(zbx_sock_last_error()) ZBX_TCP_ERR_END; return FAIL; } } @@ -329,6 +335,7 @@ int zbx_tcp_send_ext(zbx_sock_t *s, const char *data, unsigned char flags) { if( ZBX_TCP_ERROR == (i = ZBX_TCP_WRITE(s->socket, data+written,strlen(data)-written)) ) { + ZBX_TCP_ERR_START "ZBX_TCP_WRITE() failed [%s]", strerror_from_system(zbx_sock_last_error()) ZBX_TCP_ERR_END; return FAIL; } written += i; @@ -546,6 +553,8 @@ int zbx_tcp_recv_ext(zbx_sock_t *s, char **data, unsigned char flags) int allocated, offset; zbx_uint64_t expected_len; +zabbix_log(LOG_LEVEL_DEBUG, "zbx_tcp_recv_ext"); /* TMP !!! */ + ZBX_TCP_START(); zbx_free(s->buf_dyn); @@ -556,12 +565,18 @@ int zbx_tcp_recv_ext(zbx_sock_t *s, char **data, unsigned char flags) read_bytes = 0; s->buf_type = ZBX_BUF_TYPE_STAT; +zabbix_log(LOG_LEVEL_DEBUG, "ZBX_TCP_READ"); /* TMP !!! */ + left = ZBX_TCP_HEADER_LEN; nbytes = ZBX_TCP_READ(s->socket, s->buf_stat, left); +zabbix_log(LOG_LEVEL_DEBUG, "cmp"); /* TMP !!! */ if( ZBX_TCP_HEADER_LEN == nbytes && 0 == strncmp(s->buf_stat, ZBX_TCP_HEADER, ZBX_TCP_HEADER_LEN) ) { +zabbix_log(LOG_LEVEL_DEBUG, "new protocol"); /* TMP !!! */ + left = sizeof(zbx_uint64_t); +zabbix_log(LOG_LEVEL_DEBUG, "ZBX_TCP_READ - len"); /* TMP !!! */ nbytes = ZBX_TCP_READ(s->socket, (void *)&expected_len, left); /* The rest was already cleared */ @@ -571,6 +586,7 @@ int zbx_tcp_recv_ext(zbx_sock_t *s, char **data, unsigned char flags) } else if( ZBX_TCP_ERROR != nbytes ) { +zabbix_log(LOG_LEVEL_DEBUG, "raw protocol"); /* TMP !!! */ read_bytes = nbytes; expected_len = 16*1024*1024; } @@ -583,13 +599,16 @@ int zbx_tcp_recv_ext(zbx_sock_t *s, char **data, unsigned char flags) if(nbytes < left) return SUCCEED; } - left = sizeof(s->buf_stat) - read_bytes - 1; +zabbix_log(LOG_LEVEL_DEBUG, "ZBX_TCP_READ - static"); /* TMP !!! */ + /* fill static buffer */ while( read_bytes < expected_len && left > 0 && ZBX_TCP_ERROR != (nbytes = ZBX_TCP_READ( s->socket, s->buf_stat + read_bytes, left))) { +zabbix_log(LOG_LEVEL_DEBUG, "ZBX_TCP_READ - [%i]", nbytes); /* TMP !!! */ + read_bytes += nbytes; if( flags & ZBX_TCP_READ_UNTIL_CLOSE ) { @@ -612,6 +631,8 @@ int zbx_tcp_recv_ext(zbx_sock_t *s, char **data, unsigned char flags) memset(s->buf_dyn,0,allocated); memcpy(s->buf_dyn, s->buf_stat, sizeof(s->buf_stat)); +zabbix_log(LOG_LEVEL_DEBUG, "ZBX_TCP_READ - dynamic"); /* TMP !!! */ + offset = read_bytes; /* fill dynamic buffer */ while( read_bytes < expected_len && ZBX_TCP_ERROR != (nbytes = ZBX_TCP_READ(s->socket, s->buf_stat, sizeof(s->buf_stat)-1)) ) @@ -630,6 +651,7 @@ int zbx_tcp_recv_ext(zbx_sock_t *s, char **data, unsigned char flags) *data = s->buf_dyn; } } +zabbix_log(LOG_LEVEL_DEBUG, "zbx_tcp_recv_ext - end"); /* TMP !!! */ if( ZBX_TCP_ERROR == nbytes ) { @@ -683,7 +705,7 @@ int zbx_tcp_check_security( { return SUCCEED; } - +zabbix_log( LOG_LEVEL_DEBUG, "getpeername"); /* TMP !!! */ nlen = sizeof(ZBX_SOCKADDR); if( ZBX_TCP_ERROR == getpeername(s->socket, (struct sockaddr*)&name, &nlen)) { @@ -700,13 +722,14 @@ int zbx_tcp_check_security( while( NULL != host ) { +zabbix_log( LOG_LEVEL_DEBUG, "zbx_gethost"); /* TMP !!! */ /* Allow IP addresses or DNS names for authorization */ if( 0 != (hp = zbx_gethost(host))) { sip = inet_ntoa(*((struct in_addr *)hp->h_addr)); if( 0 == strcmp(sname, sip)) { - ZBX_TCP_ERR_START "Connection from [%s] accepted. Allowed servers [%s] ",sname, ip_list ZBX_TCP_ERR_END; +zabbix_log( LOG_LEVEL_DEBUG, "zbx_tcp_check_security - OK"); /* TMP !!! */ return SUCCEED; } } diff --git a/src/libs/zbxsysinfo/common/common.c b/src/libs/zbxsysinfo/common/common.c index 13658a3d..58b6ceb9 100644 --- a/src/libs/zbxsysinfo/common/common.c +++ b/src/libs/zbxsysinfo/common/common.c @@ -155,46 +155,41 @@ int EXECUTE_STR(const char *cmd, const char *param, unsigned flags, AGENT_RESULT STARTUPINFO si = {0}; PROCESS_INFORMATION pi = {0}; SECURITY_ATTRIBUTES sa; - HANDLE hOutput; - char szTempPath[MAX_PATH],szTempFile[MAX_PATH]; + HANDLE hWrite=NULL, hRead=NULL; #else /* not _WINDOWS */ - FILE *f; + FILE *hRead = NULL; #endif /* _WINDOWS */ - char cmd_result[MAX_STRING_LEN]; - char command[MAX_STRING_LEN]; - int i,len; + int ret = SYSINFO_RET_FAIL; + + char stat_buf[128]; + char *cmd_result=NULL; + char *command=NULL; + int len; assert(result); init_result(result); - - memset(cmd_result, 0, MAX_STRING_LEN); + + cmd_result = zbx_dsprintf(cmd_result,""); + memset(stat_buf, 0, sizeof(stat_buf)); #if defined(_WINDOWS) - /* Create temporary file to hold process output */ - GetTempPath( MAX_PATH-1, szTempPath); - GetTempFileName( szTempPath, "zbx", 0, szTempFile); - - sa.nLength = sizeof(SECURITY_ATTRIBUTES); - sa.lpSecurityDescriptor = NULL; - sa.bInheritHandle = TRUE; - - if(INVALID_HANDLE_VALUE == (hOutput = CreateFile( - szTempFile, - GENERIC_READ | GENERIC_WRITE, - 0, - &sa, - CREATE_ALWAYS, - FILE_ATTRIBUTE_TEMPORARY, - NULL))) + /* Set the bInheritHandle flag so pipe handles are inherited */ + sa.nLength = sizeof(SECURITY_ATTRIBUTES); + sa.bInheritHandle = TRUE; + sa.lpSecurityDescriptor = NULL; + + /* Create a pipe for the child process's STDOUT */ + if (! CreatePipe(&hRead, &hWrite, &sa, sizeof(cmd_result))) { - zabbix_log(LOG_LEVEL_DEBUG, "Unable to create temporary file: '%s' [%s]", szTempFile, strerror_from_system(GetLastError())); - return SYSINFO_RET_FAIL; + zabbix_log(LOG_LEVEL_DEBUG, "Unable to create pipe [%s]", strerror_from_system(GetLastError())); + ret = SYSINFO_RET_FAIL; + goto lbl_exit; } /* Fill in process startup info structure */ @@ -202,100 +197,113 @@ int EXECUTE_STR(const char *cmd, const char *param, unsigned flags, AGENT_RESULT si.cb = sizeof(STARTUPINFO); si.dwFlags = STARTF_USESTDHANDLES; si.hStdInput = GetStdHandle(STD_INPUT_HANDLE); - si.hStdOutput = hOutput; - si.hStdError = GetStdHandle(STD_ERROR_HANDLE); + si.hStdOutput = hWrite; + si.hStdError = hWrite; - zbx_snprintf(command, sizeof(command), "cmd /C \"%s\"", param); + command = zbx_dsprintf(command, "cmd /C \"%s\"", param); /* Create new process */ if (!CreateProcess(NULL,command,NULL,NULL,TRUE,0,NULL,NULL,&si,&pi)) { zabbix_log(LOG_LEVEL_DEBUG, "Unable to create process: '%s' [%s]", command, strerror_from_system(GetLastError())); - /* Remove temporary file */ - CloseHandle(hOutput); - DeleteFile(szTempFile); + ret = SYSINFO_RET_FAIL; + goto lbl_exit; + } + CloseHandle(hWrite); hWrite = NULL; - return SYSINFO_RET_FAIL; + /* Read process output */ + while( ReadFile(hRead, stat_buf, sizeof(stat_buf)-1, &len, NULL) && len > 0 ) + { + cmd_result = zbx_strdcat(cmd_result, stat_buf); + memset(stat_buf, 0, sizeof(stat_buf)); } - /* Wait for process termination and close all handles */ - WaitForSingleObject(pi.hProcess,INFINITE); - CloseHandle(pi.hThread); - CloseHandle(pi.hProcess); + /* Don't wait child process exiting. */ + /* WaitForSingleObject( pi.hProcess, INFINITE ); */ - /* Rewind temporary file for reading */ - SetFilePointer(hOutput,0,NULL,FILE_BEGIN); + /* Terminate child process */ + /* TerminateProcess(pi.hProcess, 0); */ - /* Read process output */ - ReadFile(hOutput, cmd_result, MAX_STRING_LEN-1, &len, NULL); + CloseHandle(pi.hProcess); + CloseHandle(pi.hThread); - cmd_result[len] = '\0'; - - /* Remove temporary file */ - CloseHandle(hOutput); - DeleteFile(szTempFile); + CloseHandle(hRead); hRead = NULL; + #else /* not _WINDOWS */ zbx_strlcpy(command, param, sizeof(command)); - if(0 == (f = popen(command,"r"))) + if(0 == (hRead = popen(command,"r"))) { switch (errno) { - case EINTR: - return SYSINFO_RET_TIMEOUT; - default: - return SYSINFO_RET_FAIL; + case EINTR: ret = SYSINFO_RET_TIMEOUT; + default: ret = SYSINFO_RET_FAIL; } + goto lbl_exit; } - len = fread(cmd_result, 1, sizeof(cmd_result)-1, f); + ; + /* Read process output */ + while( (len = fread(stat_buf, 1, sizeof(stat_buf)-1, hRead)) > 0 ) + { + cmd_result = zbx_strdcat(cmd_result, stat_buf); + memset(stat_buf, 0, sizeof(stat_buf)); + } - if(0 != ferror(f)) + if(0 != ferror(hRead)) { switch (errno) { - case EINTR: - pclose(f); - return SYSINFO_RET_TIMEOUT; - default: - pclose(f); - return SYSINFO_RET_FAIL; + case EINTR: ret = SYSINFO_RET_TIMEOUT; + default: ret = SYSINFO_RET_FAIL; } + goto lbl_exit; } - cmd_result[len] = '\0'; - - if(pclose(f) == -1) + if(pclose(hRead) == -1) { switch (errno) { - case EINTR: - return SYSINFO_RET_TIMEOUT; - default: - return SYSINFO_RET_FAIL; + case EINTR: ret = SYSINFO_RET_TIMEOUT; + default: ret = SYSINFO_RET_FAIL; } + goto lbl_exit; } #endif /* _WINDOWS */ zabbix_log(LOG_LEVEL_DEBUG, "Before"); - for(i=(int)strlen(cmd_result); i>0 && (cmd_result[i] == '\n' || cmd_result[i] == '\r' || cmd_result[i] == '\0'); cmd_result[i--] = '\0'); + zbx_rtrim(cmd_result,"\n\r\0"); /* We got EOL only */ if(cmd_result[0] == '\0') { - return SYSINFO_RET_FAIL; + ret = SYSINFO_RET_FAIL; + goto lbl_exit; } - zabbix_log(LOG_LEVEL_DEBUG, "Run remote command [%s] Result [%d] [%s]", command, strlen(cmd_result), cmd_result); + zabbix_log(LOG_LEVEL_DEBUG, "Run remote command [%s] Result [%d] [%.20s]...", command, strlen(cmd_result), cmd_result); SET_TEXT_RESULT(result, strdup(cmd_result)); - return SYSINFO_RET_OK; + ret = SYSINFO_RET_OK; + +lbl_exit: +#if defined(_WINDOWS) + if ( hWrite ) CloseHandle(hWrite); hWrite = NULL; + if ( hRead) CloseHandle(hRead); hRead = NULL; +#else /* not _WINDOWS */ + if ( hRead ) pclose(hRead); hRead = NULL; +#endif /* _WINDOWS */ + + zbx_free(command) + zbx_free(cmd_result); + + return ret; } int EXECUTE_INT(const char *cmd, const char *command, unsigned flags, AGENT_RESULT *result) @@ -307,11 +315,12 @@ int EXECUTE_INT(const char *cmd, const char *command, unsigned flags, AGENT_RESU if(SYSINFO_RET_OK == ret) { - sscanf(result->text, "%lf", &value); - - UNSET_TEXT_RESULT(result); - - SET_DBL_RESULT(result, value); + if( NULL == GET_DBL_RESULT(result) ) + { + zabbix_log(LOG_LEVEL_WARNING, "Remote command [%s] result is not double", command); + ret = SYSINFO_RET_FAIL; + } + UNSET_RESULT_EXCLUDING(result, AR_DOUBLE); } return ret; diff --git a/src/libs/zbxsysinfo/sysinfo.c b/src/libs/zbxsysinfo/sysinfo.c index 989d49ab..1d7b15ba 100644 --- a/src/libs/zbxsysinfo/sysinfo.c +++ b/src/libs/zbxsysinfo/sysinfo.c @@ -107,7 +107,6 @@ void add_user_parameter(char *key,char *command) commands[i].function = &EXECUTE_STR; commands[i].main_param = strdup(command); commands[i].test_param = 0; - commands = zbx_realloc(commands,(i+2)*sizeof(ZBX_METRIC)); commands[i+1].key=NULL; diff --git a/src/libs/zbxwin32/service.c b/src/libs/zbxwin32/service.c index 934082c3..9927a783 100644 --- a/src/libs/zbxwin32/service.c +++ b/src/libs/zbxwin32/service.c @@ -29,6 +29,8 @@ static int ZabbixRemoveEventSource(void); static int ZabbixInstallEventSource(char *path); +#define uninit() { zbx_on_exit(); } + /* * Static data */ @@ -36,7 +38,20 @@ static int ZabbixInstallEventSource(char *path); static SERVICE_STATUS serviceStatus; static SERVICE_STATUS_HANDLE serviceHandle; -int application_is_runned = ZBX_APP_RUNNED; +int application_status = ZBX_APP_RUNNED; + +static void parent_signal_handler(int sig) +{ + switch(sig) + { + case SIGINT: + case SIGTERM: + zabbix_log( LOG_LEVEL_INFORMATION, "Got signal. Exiting ..."); + uninit(); + ExitProcess( FAIL ); + break; + } +} /* * ZABBIX service control handler @@ -407,3 +422,9 @@ static int ZabbixRemoveEventSource(void) return SUCCEED; } + +void init_main_process(void) +{ + signal( SIGINT, parent_signal_handler); + signal( SIGTERM, parent_signal_handler ); +}
\ No newline at end of file diff --git a/src/zabbix_agent/perfstat.c b/src/zabbix_agent/perfstat.c index e4a68dc6..0904444f 100644 --- a/src/zabbix_agent/perfstat.c +++ b/src/zabbix_agent/perfstat.c @@ -213,6 +213,7 @@ void perfs_list_free(void) zbx_free(curr->rawValueArray); zbx_free(curr); } + statPerfCounterList = NULL; } diff --git a/src/zabbix_agent/zabbix_agent.c b/src/zabbix_agent/zabbix_agent.c index 1e67d221..eeff4d5b 100644 --- a/src/zabbix_agent/zabbix_agent.c +++ b/src/zabbix_agent/zabbix_agent.c @@ -178,8 +178,8 @@ int main(int argc, char **argv) #if !defined(_WINDOWS) signal( SIGINT, child_signal_handler); - signal( SIGQUIT, child_signal_handler ); signal( SIGTERM, child_signal_handler ); + signal( SIGQUIT, child_signal_handler ); signal( SIGALRM, child_signal_handler ); alarm(CONFIG_TIMEOUT); diff --git a/src/zabbix_agent/zabbix_agentd.c b/src/zabbix_agent/zabbix_agentd.c index 76abce4e..e9051634 100644 --- a/src/zabbix_agent/zabbix_agentd.c +++ b/src/zabbix_agent/zabbix_agentd.c @@ -275,15 +275,16 @@ int MAIN_ZABBIX_ENTRY(void) /* wait for all threads exiting */ for(i = 0; i < CONFIG_ZABBIX_FORKS; i++) { - zbx_thread_wait(threads[i]); - - zabbix_log( LOG_LEVEL_DEBUG, "%li: thread is terminated", threads[i]); - ZBX_DO_EXIT(); - } + if(threads && threads[i]) + { + zbx_thread_wait(threads[i]); - free_collector_data(); + if(threads) + zabbix_log( LOG_LEVEL_DEBUG, "thread [%i] is terminated", i); - zbx_free(threads); + ZBX_DO_EXIT(); + } + } zbx_on_exit(); @@ -293,22 +294,22 @@ int MAIN_ZABBIX_ENTRY(void) void zbx_on_exit() { -#if !defined(_WINDOWS) - int i = 0; + ZBX_DO_EXIT(); + if(threads != NULL) { for(i = 0; i<CONFIG_ZABBIX_FORKS ; i++) { if(threads[i]) { - kill(threads[i],SIGTERM); + zbx_thread_kill(threads[i]); threads[i] = (ZBX_THREAD_HANDLE)NULL; } } } -#endif /* not _WINDOWS */ + zbx_free(threads); zabbix_log(LOG_LEVEL_DEBUG, "zbx_on_exit() called."); @@ -319,17 +320,17 @@ void zbx_on_exit() #endif /* USE_PID_FILE */ free_metrics(); - free_collector_data(); alias_list_free(); perfs_list_free(); zbx_sleep(2); /* wait for all threads closing */ - + zabbix_log(LOG_LEVEL_INFORMATION, "ZABBIX Agent stopped"); + zabbix_close_log(); - exit(SUCCEED); + ExitProcess(SUCCEED); } #ifndef ZABBIX_TEST diff --git a/src/zabbix_agent/zbxconf.c b/src/zabbix_agent/zbxconf.c index 5dab12d5..9d64e9cc 100644 --- a/src/zabbix_agent/zbxconf.c +++ b/src/zabbix_agent/zbxconf.c @@ -80,7 +80,6 @@ void load_config() {"StartAgents", &CONFIG_ZABBIX_FORKS, 0,TYPE_INT, PARM_OPT, 1,16}, {"RefreshActiveChecks", &CONFIG_REFRESH_ACTIVE_CHECKS, 0,TYPE_INT, PARM_OPT,60,3600}, - {"EnableRemoteCommands",&CONFIG_ENABLE_REMOTE_COMMANDS, 0,TYPE_INT, PARM_OPT,0,1}, {"AllowRoot", &CONFIG_ALLOW_ROOT, 0,TYPE_INT, PARM_OPT,0,1}, {"LogUnresolvedSymbols",&CONFIG_LOG_UNRES_SYMB, 0, TYPE_STRING,PARM_OPT,0,1}, @@ -142,6 +141,8 @@ void load_user_parameters(void) { /* PARAMETER, VAR, FUNC, TYPE(0i,1s), MANDATORY,MIN,MAX */ + {"EnableRemoteCommands",&CONFIG_ENABLE_REMOTE_COMMANDS, 0,TYPE_INT, PARM_OPT,0,1}, + {"Alias", 0, &add_alias_from_config, TYPE_STRING,PARM_OPT,0,0}, {"UserParameter", 0, &add_parameter, 0, 0, 0, 0}, diff --git a/src/zabbix_get/zabbix_get.c b/src/zabbix_get/zabbix_get.c index 30db9b41..3bb0842e 100644 --- a/src/zabbix_get/zabbix_get.c +++ b/src/zabbix_get/zabbix_get.c @@ -219,10 +219,12 @@ int main(int argc, char **argv) if(ret == SUCCEED) { -#if !defined(_WINDOWS) + signal( SIGINT, signal_handler ); - signal( SIGQUIT, signal_handler ); signal( SIGTERM, signal_handler ); + +#if !defined(_WINDOWS) + signal( SIGQUIT, signal_handler ); signal( SIGALRM, signal_handler ); alarm(SENDER_TIMEOUT); diff --git a/src/zabbix_sender/zabbix_sender.c b/src/zabbix_sender/zabbix_sender.c index df915552..9010d703 100644 --- a/src/zabbix_sender/zabbix_sender.c +++ b/src/zabbix_sender/zabbix_sender.c @@ -165,10 +165,9 @@ static ZBX_THREAD_ENTRY(send_value, args) ); #if !defined(_WINDOWS) - signal( SIGINT, send_signal_handler ); - signal( SIGQUIT, send_signal_handler ); signal( SIGTERM, send_signal_handler ); + signal( SIGQUIT, send_signal_handler ); signal( SIGALRM, send_signal_handler ); alarm(SENDER_TIMEOUT); |