diff options
| -rw-r--r-- | lib/tests/test_utils.c | 56 | ||||
| -rw-r--r-- | lib/utils_base.c | 81 | ||||
| -rw-r--r-- | lib/utils_base.h | 18 |
3 files changed, 126 insertions, 29 deletions
diff --git a/lib/tests/test_utils.c b/lib/tests/test_utils.c index 763392a8..aae358f3 100644 --- a/lib/tests/test_utils.c +++ b/lib/tests/test_utils.c | |||
| @@ -33,9 +33,19 @@ main (int argc, char **argv) | |||
| 33 | state_data *temp_state_data; | 33 | state_data *temp_state_data; |
| 34 | time_t current_time; | 34 | time_t current_time; |
| 35 | char *temp_filename; | 35 | char *temp_filename; |
| 36 | nagios_plugin *temp_nagios_plugin; | ||
| 36 | 37 | ||
| 37 | plan_tests(81+23); | 38 | plan_tests(81+23); |
| 38 | 39 | ||
| 40 | _get_nagios_plugin( &temp_nagios_plugin ); | ||
| 41 | ok( temp_nagios_plugin==NULL, "nagios_plugin not initialised"); | ||
| 42 | |||
| 43 | np_init( "check_test" ); | ||
| 44 | _get_nagios_plugin( &temp_nagios_plugin ); | ||
| 45 | ok( temp_nagios_plugin!=NULL, "nagios_plugin now initialised"); | ||
| 46 | ok( !strcmp(temp_nagios_plugin->plugin_name, "check_test"), "plugin name initialised" ); | ||
| 47 | |||
| 48 | |||
| 39 | range = parse_range_string("6"); | 49 | range = parse_range_string("6"); |
| 40 | ok( range != NULL, "'6' is valid range"); | 50 | ok( range != NULL, "'6' is valid range"); |
| 41 | ok( range->start == 0, "Start correct"); | 51 | ok( range->start == 0, "Start correct"); |
| @@ -257,33 +267,63 @@ main (int argc, char **argv) | |||
| 257 | ok(!test, "Empty string return NULL"); | 267 | ok(!test, "Empty string return NULL"); |
| 258 | 268 | ||
| 259 | 269 | ||
| 260 | temp_string = np_state_generate_key(argv); | 270 | temp_string = (char *) _np_state_generate_key(); |
| 261 | ok(!strcmp(temp_string, "Ahash"), "Got hash" ); | 271 | ok(!strcmp(temp_string, "Ahash"), "Got hash" ); |
| 262 | 272 | ||
| 263 | temp_string = _np_state_calculate_location_prefix(); | 273 | |
| 274 | |||
| 275 | unsetenv("NAGIOS_PLUGIN_STATE_DIRECTORY"); | ||
| 276 | temp_string = (char *) _np_state_calculate_location_prefix(); | ||
| 264 | ok(!strcmp(temp_string, NP_SHAREDSTATE_DIR), "Got default directory" ); | 277 | ok(!strcmp(temp_string, NP_SHAREDSTATE_DIR), "Got default directory" ); |
| 265 | 278 | ||
| 279 | setenv("NAGIOS_PLUGIN_STATE_DIRECTORY", "", 1); | ||
| 280 | temp_string = (char *) _np_state_calculate_location_prefix(); | ||
| 281 | ok(!strcmp(temp_string, NP_SHAREDSTATE_DIR), "Got default directory even with empty string" ); | ||
| 282 | |||
| 283 | setenv("NAGIOS_PLUGIN_STATE_DIRECTORY", "/usr/local/nagios/var", 1); | ||
| 284 | temp_string = (char *) _np_state_calculate_location_prefix(); | ||
| 285 | ok(!strcmp(temp_string, "/usr/local/nagios/var"), "Got default directory" ); | ||
| 286 | |||
| 287 | |||
| 288 | |||
| 266 | ok(temp_state_key==NULL, "temp_state_key initially empty"); | 289 | ok(temp_state_key==NULL, "temp_state_key initially empty"); |
| 267 | temp_state_key = np_state_init("check_test", temp_string, 54); | 290 | |
| 291 | np_state_init(NULL, 51); | ||
| 292 | temp_state_key = temp_nagios_plugin->state; | ||
| 268 | ok( !strcmp(temp_state_key->plugin_name, "check_test"), "Got plugin name" ); | 293 | ok( !strcmp(temp_state_key->plugin_name, "check_test"), "Got plugin name" ); |
| 269 | ok( !strcmp(temp_state_key->name, temp_string), "Got key name" ); | 294 | ok( !strcmp(temp_state_key->name, "Ahash"), "Got key name" ); |
| 295 | |||
| 296 | |||
| 297 | printf("Filename=%s\n", temp_state_key->_filename); | ||
| 298 | np_state_init("funnykeyname", 54); | ||
| 299 | temp_state_key = temp_nagios_plugin->state; | ||
| 300 | ok( !strcmp(temp_state_key->plugin_name, "check_test"), "Got plugin name" ); | ||
| 301 | ok( !strcmp(temp_state_key->name, "funnykeyname"), "Got key name" ); | ||
| 302 | |||
| 270 | printf("Filename=%s\n", temp_state_key->_filename); | 303 | printf("Filename=%s\n", temp_state_key->_filename); |
| 271 | 304 | ||
| 272 | ok( !strcmp(temp_state_key->_filename, "Tobedone"), "Got internal filename" ); | 305 | |
| 306 | ok( !strcmp(temp_state_key->_filename, "/usr/local/nagios/var/check_test/funnykeyname"), "Got internal filename" ); | ||
| 273 | ok( temp_state_key->data_version==54, "Version set" ); | 307 | ok( temp_state_key->data_version==54, "Version set" ); |
| 274 | 308 | ||
| 275 | temp_state_data = np_state_read(temp_state_key); | 309 | temp_state_data = np_state_read(temp_state_key); |
| 276 | ok( temp_state_data==NULL, "Got state data" ); | 310 | ok( temp_state_data==NULL, "Got no state data as file does not exist" ); |
| 311 | |||
| 312 | temp_state_key->_filename="var/statefile"; | ||
| 313 | temp_state_data = np_state_read(temp_state_key); | ||
| 314 | ok( temp_state_data!=NULL, "Got state data now" ); | ||
| 315 | |||
| 277 | 316 | ||
| 278 | time(¤t_time); | 317 | time(¤t_time); |
| 279 | np_state_write_string(temp_state_key, NULL, "New data"); | 318 | np_state_write_string(NULL, "New data"); |
| 280 | 319 | ||
| 281 | temp_state_data = np_state_read(temp_state_key); | 320 | temp_state_data = np_state_read(temp_state_key); |
| 282 | /* Check time is set to current_time */ | 321 | /* Check time is set to current_time */ |
| 283 | 322 | ||
| 284 | 323 | ||
| 285 | np_state_cleanup(temp_state_key); | 324 | np_cleanup(); |
| 286 | ok(temp_state_key==NULL, "temp_state_key cleared"); | 325 | ok(temp_state_key==NULL, "temp_state_key cleared"); |
| 326 | ok( temp_nagios_plugin==NULL, "Reset" ); | ||
| 287 | 327 | ||
| 288 | return exit_status(); | 328 | return exit_status(); |
| 289 | } | 329 | } |
diff --git a/lib/utils_base.c b/lib/utils_base.c index b717a99a..fba383f7 100644 --- a/lib/utils_base.c +++ b/lib/utils_base.c | |||
| @@ -27,9 +27,39 @@ | |||
| 27 | #include "common.h" | 27 | #include "common.h" |
| 28 | #include <stdarg.h> | 28 | #include <stdarg.h> |
| 29 | #include "utils_base.h" | 29 | #include "utils_base.h" |
| 30 | #include <fcntl.h> | ||
| 30 | 31 | ||
| 31 | #define np_free(ptr) { if(ptr) { free(ptr); ptr = NULL; } } | 32 | #define np_free(ptr) { if(ptr) { free(ptr); ptr = NULL; } } |
| 32 | 33 | ||
| 34 | nagios_plugin *this_nagios_plugin=NULL; | ||
| 35 | |||
| 36 | void np_init( char *plugin_name ) { | ||
| 37 | if (this_nagios_plugin==NULL) { | ||
| 38 | this_nagios_plugin = malloc(sizeof(nagios_plugin)); | ||
| 39 | if (this_nagios_plugin==NULL) { | ||
| 40 | die(STATE_UNKNOWN, _("Cannot allocate memory: %s\n"), | ||
| 41 | strerror(errno)); | ||
| 42 | } | ||
| 43 | this_nagios_plugin->plugin_name = strdup(plugin_name); | ||
| 44 | } | ||
| 45 | } | ||
| 46 | |||
| 47 | void np_cleanup() { | ||
| 48 | if (this_nagios_plugin!=NULL) { | ||
| 49 | if(this_nagios_plugin->state!=NULL) { | ||
| 50 | np_free(this_nagios_plugin->state); | ||
| 51 | } | ||
| 52 | np_free(this_nagios_plugin->plugin_name); | ||
| 53 | np_free(this_nagios_plugin); | ||
| 54 | } | ||
| 55 | this_nagios_plugin=NULL; | ||
| 56 | } | ||
| 57 | |||
| 58 | /* Hidden function to get a pointer to this_nagios_plugin for testing */ | ||
| 59 | void _get_nagios_plugin( nagios_plugin **pointer ){ | ||
| 60 | *pointer = this_nagios_plugin; | ||
| 61 | } | ||
| 62 | |||
| 33 | void | 63 | void |
| 34 | die (int result, const char *fmt, ...) | 64 | die (int result, const char *fmt, ...) |
| 35 | { | 65 | { |
| @@ -37,6 +67,9 @@ die (int result, const char *fmt, ...) | |||
| 37 | va_start (ap, fmt); | 67 | va_start (ap, fmt); |
| 38 | vprintf (fmt, ap); | 68 | vprintf (fmt, ap); |
| 39 | va_end (ap); | 69 | va_end (ap); |
| 70 | if(this_nagios_plugin!=NULL) { | ||
| 71 | np_cleanup(); | ||
| 72 | } | ||
| 40 | exit (result); | 73 | exit (result); |
| 41 | } | 74 | } |
| 42 | 75 | ||
| @@ -317,11 +350,21 @@ char *np_extract_value(const char *varlist, const char *name, char sep) { | |||
| 317 | * hopefully a unique key per service/plugin invocation. Use the extra-opts | 350 | * hopefully a unique key per service/plugin invocation. Use the extra-opts |
| 318 | * parse of argv, so that uniqueness in parameters are reflected there. | 351 | * parse of argv, so that uniqueness in parameters are reflected there. |
| 319 | */ | 352 | */ |
| 320 | char *np_state_generate_key(char **argv) { | 353 | char *_np_state_generate_key() { |
| 321 | return "Ahash"; | 354 | return "Ahash"; |
| 322 | } | 355 | } |
| 323 | 356 | ||
| 357 | /* | ||
| 358 | * Internal function. Returns either: | ||
| 359 | * envvar NAGIOS_PLUGIN_STATE_DIRECTORY | ||
| 360 | * statically compiled shared state directory | ||
| 361 | */ | ||
| 324 | char* _np_state_calculate_location_prefix(){ | 362 | char* _np_state_calculate_location_prefix(){ |
| 363 | char *env_dir; | ||
| 364 | |||
| 365 | env_dir = getenv("NAGIOS_PLUGIN_STATE_DIRECTORY"); | ||
| 366 | if(env_dir && env_dir[0] != '\0') | ||
| 367 | return env_dir; | ||
| 325 | return NP_SHAREDSTATE_DIR; | 368 | return NP_SHAREDSTATE_DIR; |
| 326 | } | 369 | } |
| 327 | 370 | ||
| @@ -330,24 +373,30 @@ char* _np_state_calculate_location_prefix(){ | |||
| 330 | * Sets variables. Generates filename. Returns np_state_key. die with | 373 | * Sets variables. Generates filename. Returns np_state_key. die with |
| 331 | * UNKNOWN if exception | 374 | * UNKNOWN if exception |
| 332 | */ | 375 | */ |
| 333 | state_key *np_state_init(char *plugin_name, char *keyname, int expected_data_version) { | 376 | void np_state_init(char *keyname, int expected_data_version) { |
| 334 | state_key *this_state = NULL; | 377 | state_key *this_state = NULL; |
| 335 | char *temp_filename = NULL; | 378 | char *temp_filename = NULL; |
| 336 | 379 | ||
| 380 | if(this_nagios_plugin==NULL) | ||
| 381 | die(STATE_UNKNOWN, _("This requires np_init to be called")); | ||
| 382 | |||
| 337 | this_state = (state_key *) malloc(sizeof(state_key)); | 383 | this_state = (state_key *) malloc(sizeof(state_key)); |
| 338 | 384 | ||
| 339 | if(this_state==NULL) | 385 | if(this_state==NULL) |
| 340 | die(STATE_UNKNOWN, _("Cannot allocate memory for state key")); | 386 | die(STATE_UNKNOWN, _("Cannot allocate memory for state key")); |
| 341 | 387 | ||
| 388 | if(keyname==NULL) { | ||
| 389 | keyname = _np_state_generate_key(); | ||
| 390 | } | ||
| 342 | this_state->name=keyname; | 391 | this_state->name=keyname; |
| 343 | this_state->plugin_name=plugin_name; | 392 | this_state->plugin_name=this_nagios_plugin->plugin_name; |
| 344 | this_state->data_version=expected_data_version; | 393 | this_state->data_version=expected_data_version; |
| 345 | 394 | ||
| 346 | /* Calculate filename */ | 395 | /* Calculate filename */ |
| 347 | asprintf(&temp_filename, "%s/%s", _np_state_calculate_location_prefix(), plugin_name); | 396 | asprintf(&temp_filename, "%s/%s/%s", _np_state_calculate_location_prefix(), this_nagios_plugin->plugin_name, keyname); |
| 348 | this_state->_filename=temp_filename; | 397 | this_state->_filename=temp_filename; |
| 349 | 398 | ||
| 350 | return this_state; | 399 | this_nagios_plugin->state = this_state; |
| 351 | } | 400 | } |
| 352 | 401 | ||
| 353 | /* | 402 | /* |
| @@ -357,11 +406,19 @@ state_key *np_state_init(char *plugin_name, char *keyname, int expected_data_ver | |||
| 357 | * If numerically lower, then return as no previous state. die with UNKNOWN | 406 | * If numerically lower, then return as no previous state. die with UNKNOWN |
| 358 | * if exceptional error. | 407 | * if exceptional error. |
| 359 | */ | 408 | */ |
| 360 | state_data *np_state_read(state_key *my_state_key) { | 409 | state_data *np_state_read() { |
| 410 | state_key *my_state_key; | ||
| 361 | state_data *this_state_data=NULL; | 411 | state_data *this_state_data=NULL; |
| 412 | int statefile=0; | ||
| 413 | |||
| 414 | my_state_key = this_nagios_plugin->state; | ||
| 362 | my_state_key->state_data = this_state_data; | 415 | my_state_key->state_data = this_state_data; |
| 363 | 416 | ||
| 364 | /* Open file */ | 417 | /* Open file. If this fails, no previous state found */ |
| 418 | statefile = open( my_state_key->_filename, O_RDONLY ); | ||
| 419 | if(statefile<0) { | ||
| 420 | return NULL; | ||
| 421 | } | ||
| 365 | 422 | ||
| 366 | return this_state_data; | 423 | return this_state_data; |
| 367 | } | 424 | } |
| @@ -373,14 +430,6 @@ state_data *np_state_read(state_key *my_state_key) { | |||
| 373 | * two things writing to same key at same time. | 430 | * two things writing to same key at same time. |
| 374 | * Will die with UNKNOWN if errors | 431 | * Will die with UNKNOWN if errors |
| 375 | */ | 432 | */ |
| 376 | void np_state_write_string(state_key *my_state_key, time_t *data_time, char *data_string) { | 433 | void np_state_write_string(time_t *data_time, char *data_string) { |
| 377 | } | ||
| 378 | |||
| 379 | /* | ||
| 380 | * Cleanup | ||
| 381 | */ | ||
| 382 | void np_state_cleanup(state_key *my_state_key) { | ||
| 383 | free(my_state_key); | ||
| 384 | my_state_key=NULL; | ||
| 385 | } | 434 | } |
| 386 | 435 | ||
diff --git a/lib/utils_base.h b/lib/utils_base.h index b6eb57e1..6a8af198 100644 --- a/lib/utils_base.h +++ b/lib/utils_base.h | |||
| @@ -2,6 +2,7 @@ | |||
| 2 | #define _UTILS_BASE_ | 2 | #define _UTILS_BASE_ |
| 3 | /* Header file for nagios plugins utils_base.c */ | 3 | /* Header file for nagios plugins utils_base.c */ |
| 4 | 4 | ||
| 5 | |||
| 5 | /* This file holds header information for thresholds - use this in preference to | 6 | /* This file holds header information for thresholds - use this in preference to |
| 6 | individual plugin logic */ | 7 | individual plugin logic */ |
| 7 | 8 | ||
| @@ -46,6 +47,12 @@ typedef struct state_key_struct { | |||
| 46 | state_data *state_data; | 47 | state_data *state_data; |
| 47 | } state_key; | 48 | } state_key; |
| 48 | 49 | ||
| 50 | typedef struct np_struct { | ||
| 51 | char *plugin_name; | ||
| 52 | state_key *state; | ||
| 53 | char **expanded_argv; | ||
| 54 | } nagios_plugin; | ||
| 55 | |||
| 49 | range *parse_range_string (char *); | 56 | range *parse_range_string (char *); |
| 50 | int _set_thresholds(thresholds **, char *, char *); | 57 | int _set_thresholds(thresholds **, char *, char *); |
| 51 | void set_thresholds(thresholds **, char *, char *); | 58 | void set_thresholds(thresholds **, char *, char *); |
| @@ -86,10 +93,11 @@ char *np_extract_value(const char*, const char*, char); | |||
| 86 | #define np_extract_ntpvar(l, n) np_extract_value(l, n, ',') | 93 | #define np_extract_ntpvar(l, n) np_extract_value(l, n, ',') |
| 87 | 94 | ||
| 88 | 95 | ||
| 89 | char *np_state_generate_key(char **); | 96 | void np_state_init(char *, int); |
| 90 | state_key *np_state_init(char *, char *, int); | 97 | state_data *np_state_read(); |
| 91 | state_data *np_state_read(state_key *); | 98 | void np_state_write_string(time_t *, char *); |
| 92 | void np_state_write_string(state_key *, time_t *, char *); | 99 | |
| 93 | void np_state_cleanup(state_key *); | 100 | void np_init(char *); |
| 101 | void np_cleanup(); | ||
| 94 | 102 | ||
| 95 | #endif /* _UTILS_BASE_ */ | 103 | #endif /* _UTILS_BASE_ */ |
