diff options
-rw-r--r-- | ChangeLog.d/feature/ZBXNEXT-3940 | 1 | ||||
-rw-r--r-- | include/common.h | 2 | ||||
-rw-r--r-- | man/zabbix_proxy.man | 5 | ||||
-rw-r--r-- | man/zabbix_server.man | 5 | ||||
-rw-r--r-- | src/libs/zbxnix/control.c | 12 | ||||
-rw-r--r-- | src/libs/zbxnix/daemon.c | 5 | ||||
-rw-r--r-- | src/zabbix_proxy/proxy.c | 1 | ||||
-rw-r--r-- | src/zabbix_server/poller/checks_snmp.c | 6 | ||||
-rw-r--r-- | src/zabbix_server/poller/checks_snmp.h | 1 | ||||
-rw-r--r-- | src/zabbix_server/poller/poller.c | 12 | ||||
-rw-r--r-- | src/zabbix_server/server.c | 1 |
11 files changed, 50 insertions, 1 deletions
diff --git a/ChangeLog.d/feature/ZBXNEXT-3940 b/ChangeLog.d/feature/ZBXNEXT-3940 new file mode 100644 index 00000000000..f1a903f322d --- /dev/null +++ b/ChangeLog.d/feature/ZBXNEXT-3940 @@ -0,0 +1 @@ +.......PS. [ZBXNEXT-3940] Provide a way to flush SNMP cache (arimdjonoks) diff --git a/include/common.h b/include/common.h index f229b4803a5..21e5b057264 100644 --- a/include/common.h +++ b/include/common.h @@ -431,6 +431,7 @@ zbx_graph_yaxis_types_t; #define ZBX_HOUSEKEEPER_EXECUTE "housekeeper_execute" #define ZBX_LOG_LEVEL_INCREASE "log_level_increase" #define ZBX_LOG_LEVEL_DECREASE "log_level_decrease" +#define ZBX_SNMP_CACHE_RELOAD "snmp_cache_reload" /* value for not supported items */ #define ZBX_NOTSUPPORTED "ZBX_NOTSUPPORTED" @@ -899,6 +900,7 @@ zbx_task_t; #define ZBX_RTC_LOG_LEVEL_DECREASE 2 #define ZBX_RTC_HOUSEKEEPER_EXECUTE 3 #define ZBX_RTC_CONFIG_CACHE_RELOAD 8 +#define ZBX_RTC_SNMP_CACHE_RELOAD 9 typedef enum { diff --git a/man/zabbix_proxy.man b/man/zabbix_proxy.man index 837bed87a7d..1d022a69660 100644 --- a/man/zabbix_proxy.man +++ b/man/zabbix_proxy.man @@ -73,6 +73,11 @@ Default configuration file (unless \fB\-c\fR option is specified) will be used t .RE .RS 4 .TP 4 +.B snmp_cache_reload +Clear snmp cache. +.RE +.RS 4 +.TP 4 .B housekeeper_execute Execute the housekeeper. Ignored if housekeeper is being currently executed. diff --git a/man/zabbix_server.man b/man/zabbix_server.man index 8b12525f358..889f7727502 100644 --- a/man/zabbix_server.man +++ b/man/zabbix_server.man @@ -72,6 +72,11 @@ Default configuration file (unless \fB\-c\fR option is specified) will be used t .RE .RS 4 .TP 4 +.B snmp_cache_reload +Clear snmp cache. +.RE +.RS 4 +.TP 4 .B housekeeper_execute Execute the housekeeper. Ignored if housekeeper is being currently executed. diff --git a/src/libs/zbxnix/control.c b/src/libs/zbxnix/control.c index 34dd390ef2f..581d3e36e7e 100644 --- a/src/libs/zbxnix/control.c +++ b/src/libs/zbxnix/control.c @@ -154,6 +154,18 @@ int parse_rtc_options(const char *opt, unsigned char program_type, int *message) scope = 0; data = 0; } + else if (0 != (program_type & (ZBX_PROGRAM_TYPE_SERVER | ZBX_PROGRAM_TYPE_PROXY)) && + 0 == strcmp(opt, ZBX_SNMP_CACHE_RELOAD)) + { +#ifdef HAVE_NETSNMP + command = ZBX_RTC_SNMP_CACHE_RELOAD; + scope = ZBX_PROCESS_TYPE_POLLER; + data = 0; +#else + zbx_error("invalid runtime control option: no SNMP support enabled"); + return FAIL; +#endif + } else { zbx_error("invalid runtime control option: %s", opt); diff --git a/src/libs/zbxnix/daemon.c b/src/libs/zbxnix/daemon.c index 6fa9253f7d9..d7f82b7edb8 100644 --- a/src/libs/zbxnix/daemon.c +++ b/src/libs/zbxnix/daemon.c @@ -227,13 +227,16 @@ static void user1_signal_handler(int sig, siginfo_t *siginfo, void *context) case ZBX_RTC_HOUSEKEEPER_EXECUTE: zbx_signal_process_by_type(ZBX_PROCESS_TYPE_HOUSEKEEPER, 1, flags); break; - case ZBX_RTC_LOG_LEVEL_INCREASE: + case ZBX_RTC_LOG_LEVEL_INCREASE: case ZBX_RTC_LOG_LEVEL_DECREASE: if ((ZBX_RTC_LOG_SCOPE_FLAG | ZBX_RTC_LOG_SCOPE_PID) == ZBX_RTC_GET_SCOPE(flags)) zbx_signal_process_by_pid(ZBX_RTC_GET_DATA(flags), flags); else zbx_signal_process_by_type(ZBX_RTC_GET_SCOPE(flags), ZBX_RTC_GET_DATA(flags), flags); break; + case ZBX_RTC_SNMP_CACHE_RELOAD: + zbx_signal_process_by_type(ZBX_RTC_GET_SCOPE(flags), ZBX_RTC_GET_DATA(flags), flags); + break; } #endif } diff --git a/src/zabbix_proxy/proxy.c b/src/zabbix_proxy/proxy.c index f2128a24538..1314f2192fb 100644 --- a/src/zabbix_proxy/proxy.c +++ b/src/zabbix_proxy/proxy.c @@ -93,6 +93,7 @@ const char *help_message[] = { " target is not specified", " " ZBX_LOG_LEVEL_DECREASE "=target Decrease log level, affects all processes if", " target is not specified", + " " ZBX_SNMP_CACHE_RELOAD " Reload SNMP cache", "", " Log level control targets:", " process-type All processes of specified type", diff --git a/src/zabbix_server/poller/checks_snmp.c b/src/zabbix_server/poller/checks_snmp.c index 32c6155f2ec..13471da5705 100644 --- a/src/zabbix_server/poller/checks_snmp.c +++ b/src/zabbix_server/poller/checks_snmp.c @@ -2129,4 +2129,10 @@ void zbx_init_snmp(void) sigprocmask(SIG_SETMASK, &orig_mask, NULL); } +void zbx_clear_cache_snmp(void) +{ + free_etimelist(); + clear_user_list(); +} + #endif /* HAVE_NETSNMP */ diff --git a/src/zabbix_server/poller/checks_snmp.h b/src/zabbix_server/poller/checks_snmp.h index f81963e9fa3..4917c775a11 100644 --- a/src/zabbix_server/poller/checks_snmp.h +++ b/src/zabbix_server/poller/checks_snmp.h @@ -32,6 +32,7 @@ extern int CONFIG_TIMEOUT; void zbx_init_snmp(void); int get_value_snmp(const DC_ITEM *item, AGENT_RESULT *result); void get_values_snmp(const DC_ITEM *items, AGENT_RESULT *results, int *errcodes, int num); +void zbx_clear_cache_snmp(void); #endif #endif diff --git a/src/zabbix_server/poller/poller.c b/src/zabbix_server/poller/poller.c index 33bcfdbf4cf..96aebfb7ad8 100644 --- a/src/zabbix_server/poller/poller.c +++ b/src/zabbix_server/poller/poller.c @@ -874,6 +874,16 @@ exit: return num; } +static void zbx_poller_sigusr_handler(int flags) +{ +#ifdef HAVE_NETSNMP + if (ZBX_RTC_SNMP_CACHE_RELOAD == ZBX_RTC_GET_MSG(flags)) + { + zbx_clear_cache_snmp(); + } +#endif +} + ZBX_THREAD_ENTRY(poller_thread, args) { int nextcheck, sleeptime = -1, processed = 0, old_processed = 0; @@ -905,6 +915,8 @@ ZBX_THREAD_ENTRY(poller_thread, args) DBconnect(ZBX_DB_CONNECT_NORMAL); + zbx_set_sigusr_handler(zbx_poller_sigusr_handler); + while (ZBX_IS_RUNNING()) { sec = zbx_time(); diff --git a/src/zabbix_server/server.c b/src/zabbix_server/server.c index d423140a2e1..5d01b1ebd84 100644 --- a/src/zabbix_server/server.c +++ b/src/zabbix_server/server.c @@ -104,6 +104,7 @@ const char *help_message[] = { " target is not specified", " " ZBX_LOG_LEVEL_DECREASE "=target Decrease log level, affects all processes if", " target is not specified", + " " ZBX_SNMP_CACHE_RELOAD " Reload SNMP cache", "", " Log level control targets:", " process-type All processes of specified type", |