summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLorenz Kästle <12514511+RincewindsHat@users.noreply.github.com>2025-08-30 14:18:42 +0200
committerLorenz Kästle <12514511+RincewindsHat@users.noreply.github.com>2025-08-30 14:18:42 +0200
commit7f1877f760a5ecdd0356010dd14c7606d44abfb0 (patch)
tree138c9ae13260b92bac0a0bff0911e249e4a541f7
parent77a5db04d7ccc954096c2d86c21fa7b05948072d (diff)
downloadmonitoring-plugins-7f1877f760a5ecdd0356010dd14c7606d44abfb0.tar.gz
check_snmp: Fix number processing (offset + multiplier)
-rw-r--r--plugins/check_snmp.c71
-rw-r--r--plugins/check_snmp.d/check_snmp_helpers.c2
-rw-r--r--plugins/check_snmp.d/config.h2
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;