diff options
author | Lorenz Kästle <12514511+RincewindsHat@users.noreply.github.com> | 2025-08-30 14:18:42 +0200 |
---|---|---|
committer | Lorenz Kästle <12514511+RincewindsHat@users.noreply.github.com> | 2025-08-30 14:18:42 +0200 |
commit | 7f1877f760a5ecdd0356010dd14c7606d44abfb0 (patch) | |
tree | 138c9ae13260b92bac0a0bff0911e249e4a541f7 | |
parent | 77a5db04d7ccc954096c2d86c21fa7b05948072d (diff) | |
download | monitoring-plugins-7f1877f760a5ecdd0356010dd14c7606d44abfb0.tar.gz |
check_snmp: Fix number processing (offset + multiplier)
-rw-r--r-- | plugins/check_snmp.c | 71 | ||||
-rw-r--r-- | plugins/check_snmp.d/check_snmp_helpers.c | 2 | ||||
-rw-r--r-- | plugins/check_snmp.d/config.h | 2 |
3 files changed, 62 insertions, 13 deletions
diff --git a/plugins/check_snmp.c b/plugins/check_snmp.c index a939f078..0a9c6752 100644 --- a/plugins/check_snmp.c +++ b/plugins/check_snmp.c | |||
@@ -286,9 +286,21 @@ int main(int argc, char **argv) { | |||
286 | } | 286 | } |
287 | struct counter64 tmp = *(vars->val.counter64); | 287 | struct counter64 tmp = *(vars->val.counter64); |
288 | uint64_t counter = (tmp.high << 32) + tmp.low; | 288 | uint64_t counter = (tmp.high << 32) + tmp.low; |
289 | counter *= (uint64_t)config.multiplier; | 289 | |
290 | counter += (uint64_t)config.offset; | 290 | if (config.multiplier_set || config.offset_set) { |
291 | pd_result_val = mp_create_pd_value(counter); | 291 | double processed = 0; |
292 | if (config.multiplier_set) { | ||
293 | processed = (double)counter * config.multiplier; | ||
294 | } | ||
295 | |||
296 | if (config.offset_set) { | ||
297 | processed += config.offset; | ||
298 | } | ||
299 | pd_result_val = mp_create_pd_value(processed); | ||
300 | } else { | ||
301 | pd_result_val = mp_create_pd_value(counter); | ||
302 | } | ||
303 | |||
292 | } break; | 304 | } break; |
293 | /* Numerical values */ | 305 | /* Numerical values */ |
294 | case ASN_GAUGE: // same as ASN_UNSIGNED | 306 | case ASN_GAUGE: // same as ASN_UNSIGNED |
@@ -299,10 +311,20 @@ int main(int argc, char **argv) { | |||
299 | printf("Debug: Got a Integer like\n"); | 311 | printf("Debug: Got a Integer like\n"); |
300 | } | 312 | } |
301 | unsigned long tmp = (unsigned long)*(vars->val.integer); | 313 | unsigned long tmp = (unsigned long)*(vars->val.integer); |
302 | tmp *= (unsigned long)config.multiplier; | ||
303 | 314 | ||
304 | tmp += (unsigned long)config.offset; | 315 | if (config.multiplier_set || config.offset_set) { |
305 | pd_result_val = mp_create_pd_value(tmp); | 316 | double processed = 0; |
317 | if (config.multiplier_set) { | ||
318 | processed = (double)tmp * config.multiplier; | ||
319 | } | ||
320 | |||
321 | if (config.offset_set) { | ||
322 | processed += config.offset; | ||
323 | } | ||
324 | pd_result_val = mp_create_pd_value(processed); | ||
325 | } else { | ||
326 | pd_result_val = mp_create_pd_value(tmp); | ||
327 | } | ||
306 | break; | 328 | break; |
307 | } | 329 | } |
308 | case ASN_INTEGER: { | 330 | case ASN_INTEGER: { |
@@ -311,19 +333,36 @@ int main(int argc, char **argv) { | |||
311 | } | 333 | } |
312 | 334 | ||
313 | long tmp = *(vars->val.integer); | 335 | long tmp = *(vars->val.integer); |
314 | tmp *= (long)config.multiplier; | ||
315 | tmp += (long)config.offset; | ||
316 | 336 | ||
317 | pd_result_val = mp_create_pd_value(tmp); | 337 | if (config.multiplier_set || config.offset_set) { |
338 | double processed = 0; | ||
339 | if (config.multiplier_set) { | ||
340 | processed = (double)tmp * config.multiplier; | ||
341 | } | ||
342 | |||
343 | if (config.offset_set) { | ||
344 | processed += config.offset; | ||
345 | } | ||
346 | pd_result_val = mp_create_pd_value(processed); | ||
347 | } else { | ||
348 | pd_result_val = mp_create_pd_value(tmp); | ||
349 | } | ||
350 | |||
318 | } break; | 351 | } break; |
319 | case ASN_FLOAT: { | 352 | case ASN_FLOAT: { |
320 | if (verbose) { | 353 | if (verbose) { |
321 | printf("Debug: Got a float\n"); | 354 | printf("Debug: Got a float\n"); |
322 | } | 355 | } |
323 | double tmp = *(vars->val.floatVal); | 356 | double tmp = *(vars->val.floatVal); |
324 | tmp *= config.multiplier; | ||
325 | 357 | ||
326 | tmp += config.offset; | 358 | if (config.multiplier_set) { |
359 | tmp *= config.multiplier; | ||
360 | } | ||
361 | |||
362 | if (config.offset_set) { | ||
363 | tmp += config.offset; | ||
364 | } | ||
365 | |||
327 | pd_result_val = mp_create_pd_value(tmp); | 366 | pd_result_val = mp_create_pd_value(tmp); |
328 | break; | 367 | break; |
329 | } | 368 | } |
@@ -332,8 +371,14 @@ int main(int argc, char **argv) { | |||
332 | printf("Debug: Got a double\n"); | 371 | printf("Debug: Got a double\n"); |
333 | } | 372 | } |
334 | double tmp = *(vars->val.doubleVal); | 373 | double tmp = *(vars->val.doubleVal); |
335 | tmp *= config.multiplier; | 374 | if (config.multiplier_set) { |
336 | tmp += config.offset; | 375 | tmp *= config.multiplier; |
376 | } | ||
377 | |||
378 | if (config.offset_set) { | ||
379 | tmp += config.offset; | ||
380 | } | ||
381 | |||
337 | pd_result_val = mp_create_pd_value(tmp); | 382 | pd_result_val = mp_create_pd_value(tmp); |
338 | break; | 383 | break; |
339 | } | 384 | } |
diff --git a/plugins/check_snmp.d/check_snmp_helpers.c b/plugins/check_snmp.d/check_snmp_helpers.c index 7725cc18..8f4bcb9c 100644 --- a/plugins/check_snmp.d/check_snmp_helpers.c +++ b/plugins/check_snmp.d/check_snmp_helpers.c | |||
@@ -97,7 +97,9 @@ check_snmp_config check_snmp_config_init() { | |||
97 | .string_cmp_value = "", | 97 | .string_cmp_value = "", |
98 | 98 | ||
99 | .multiplier = 1.0, | 99 | .multiplier = 1.0, |
100 | .multiplier_set = false, | ||
100 | .offset = 0, | 101 | .offset = 0, |
102 | .offset_set = false, | ||
101 | 103 | ||
102 | .use_perf_data_labels_from_input = false, | 104 | .use_perf_data_labels_from_input = false, |
103 | }; | 105 | }; |
diff --git a/plugins/check_snmp.d/config.h b/plugins/check_snmp.d/config.h index e96dff5c..e68986e2 100644 --- a/plugins/check_snmp.d/config.h +++ b/plugins/check_snmp.d/config.h | |||
@@ -58,7 +58,9 @@ typedef struct check_snmp_config { | |||
58 | 58 | ||
59 | // Modify data | 59 | // Modify data |
60 | double multiplier; | 60 | double multiplier; |
61 | bool multiplier_set; | ||
61 | double offset; | 62 | double offset; |
63 | bool offset_set; | ||
62 | 64 | ||
63 | // Modify output | 65 | // Modify output |
64 | bool use_perf_data_labels_from_input; | 66 | bool use_perf_data_labels_from_input; |