158
158
/******************************************************************************
160
* Function: get_flexible_interval *
162
* Purpose: check for flexible delay value *
164
* Parameters: delay_flex - [IN] separeated flexible intervals *
165
* [dd/d1-d2,hh:mm-hh:mm;] *
166
* delay_val - [OUT] delay value *
168
* Return value: nextcheck value *
170
* Author: Alexei Vladishev, Alexander Vladishev *
172
******************************************************************************/
173
static int get_flexible_interval(char *delay_flex, int *delay_val, time_t now)
175
char *s, *c = NULL, delay_period[30];
176
int delay, ret = FAIL;
178
if (NULL == delay_flex || '\0' == *delay_flex)
181
for (s = delay_flex; '\0' != *s;)
183
if (NULL != (c = strchr(s, ';')))
186
zabbix_log(LOG_LEVEL_DEBUG, "Delay period [%s]", s);
188
if (2 == sscanf(s, "%d/%29s", &delay, delay_period))
190
zabbix_log(LOG_LEVEL_DEBUG, "%d sec at %s", delay, delay_period);
192
if (0 != check_time_period(delay_period, now))
200
zabbix_log(LOG_LEVEL_ERR, "Delay period format is wrong [%s]", s);
217
/******************************************************************************
219
* Function: get_next_flexible_interval *
221
* Purpose: return time of next flexible interval *
223
* Parameters: delay_flex - [IN] ';' separeated flexible intervals *
224
* [dd/d1-d2,hh:mm-hh:mm] *
225
* now = [IN] current time *
227
* Return value: start of next interval *
229
* Author: Alexei Vladishev, Alexander Vladishev *
231
******************************************************************************/
232
static time_t get_next_flexible_interval(char *delay_flex, time_t now)
236
int day, sec, sec1, sec2, delay, d1, d2, h1, h2, m1, m2;
239
if (NULL == delay_flex || '\0' == *delay_flex)
242
tm = localtime(&now);
243
day = 0 == tm->tm_wday ? 7 : tm->tm_wday;
244
sec = 3600 * tm->tm_hour + 60 * tm->tm_min + tm->tm_sec;
246
for (s = delay_flex; '\0' != *s;)
248
if (NULL != (c = strchr(s, ';')))
251
zabbix_log(LOG_LEVEL_DEBUG, "Delay period [%s]", s);
253
if (7 == sscanf(s, "%d/%d-%d,%d:%d-%d:%d", &delay, &d1, &d2, &h1, &m1, &h2, &m2))
255
zabbix_log(LOG_LEVEL_DEBUG, "%d/%d-%d,%d:%d-%d:%d", delay, d1, d2, h1, m1, h2, m2);
257
sec1 = 3600 * h1 + 60 * m1;
258
sec2 = 3600 * h2 + 60 * m2;
260
if (day >= d1 && day <= d2 && sec >= sec1 && sec <= sec2) /* working period */
262
if (next == 0 || next > now - sec + sec2)
263
next = now - sec + sec2;
267
if (day >= d1 && day <= d2 && sec < sec1) /* next period, same day */
269
if (next == 0 || next > now - sec + sec1)
270
next = now - sec + sec1;
272
else if (day + 1 >= d1 && day + 1 <= d2 && sec < sec1) /* next period, next day */
274
if (next == 0 || next > now - sec + sec1)
275
next = now - sec + 86400 + sec1;
279
zabbix_log(LOG_LEVEL_ERR, "Delay period format is wrong [%s]", s);
293
return next ? next : FAIL;
295
/******************************************************************************
160
297
* Function: calculate_item_nextcheck *
162
299
* Purpose: calculate nextcheck timespamp for item *
175
312
******************************************************************************/
176
313
int calculate_item_nextcheck(zbx_uint64_t itemid, int item_type, int delay, char *delay_flex, time_t now)
179
char *s, *c = NULL, delay_period[30];
315
int i, flex_delay2 = delay, flex_delay = delay;
181
318
zabbix_log(LOG_LEVEL_DEBUG, "In calculate_item_nextcheck (" ZBX_FS_UI64 ",%d,\"%s\",%d)",
182
319
itemid, delay, delay_flex, now);
199
if (NULL != delay_flex && '\0' != *delay_flex)
201
for (s = delay_flex; '\0' != *s;)
203
if (NULL != (c = strchr(s, ';')))
206
zabbix_log(LOG_LEVEL_DEBUG, "Delay period [%s]", s);
208
if (2 == sscanf(s, "%d/%29s", &delay_val, delay_period))
210
zabbix_log(LOG_LEVEL_DEBUG, "%d sec at %s", delay_val, delay_period);
212
if (check_time_period(delay_period, now))
219
zabbix_log(LOG_LEVEL_ERR, "Delay period format is wrong [%s]", s);
236
zabbix_log(LOG_LEVEL_ERR, "Invalid item update interval [%d], using default [%d]", delay, 30);
336
get_flexible_interval(delay_flex, &flex_delay, now);
338
if (FAIL != (next = get_next_flexible_interval(delay_flex, now)) && now + flex_delay > next)
340
get_flexible_interval(delay_flex, &flex_delay2, next + 1);
343
flex_delay = MIN(flex_delay, flex_delay2);
348
zabbix_log(LOG_LEVEL_ERR, "Invalid item update interval [%d], using default [%d]", flex_delay, 30);
240
353
i = delay * (int)(now / (time_t)delay) + (int)(itemid % (zbx_uint64_t)delay);