diff options
| -rw-r--r-- | lib/tests/test_utils.c | 25 | ||||
| -rw-r--r-- | lib/utils_base.c | 111 | ||||
| -rw-r--r-- | lib/utils_base.h | 4 |
3 files changed, 127 insertions, 13 deletions
diff --git a/lib/tests/test_utils.c b/lib/tests/test_utils.c index aae358f3..d7cdc336 100644 --- a/lib/tests/test_utils.c +++ b/lib/tests/test_utils.c | |||
| @@ -34,6 +34,7 @@ main (int argc, char **argv) | |||
| 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 | nagios_plugin *temp_nagios_plugin; |
| 37 | FILE *temp_fp; | ||
| 37 | 38 | ||
| 38 | plan_tests(81+23); | 39 | plan_tests(81+23); |
| 39 | 40 | ||
| @@ -288,14 +289,14 @@ main (int argc, char **argv) | |||
| 288 | 289 | ||
| 289 | ok(temp_state_key==NULL, "temp_state_key initially empty"); | 290 | ok(temp_state_key==NULL, "temp_state_key initially empty"); |
| 290 | 291 | ||
| 291 | np_state_init(NULL, 51); | 292 | np_enable_state(NULL, 51); |
| 292 | temp_state_key = temp_nagios_plugin->state; | 293 | temp_state_key = temp_nagios_plugin->state; |
| 293 | ok( !strcmp(temp_state_key->plugin_name, "check_test"), "Got plugin name" ); | 294 | ok( !strcmp(temp_state_key->plugin_name, "check_test"), "Got plugin name" ); |
| 294 | ok( !strcmp(temp_state_key->name, "Ahash"), "Got key name" ); | 295 | ok( !strcmp(temp_state_key->name, "Ahash"), "Got key name" ); |
| 295 | 296 | ||
| 296 | 297 | ||
| 297 | printf("Filename=%s\n", temp_state_key->_filename); | 298 | printf("Filename=%s\n", temp_state_key->_filename); |
| 298 | np_state_init("funnykeyname", 54); | 299 | np_enable_state("funnykeyname", 54); |
| 299 | temp_state_key = temp_nagios_plugin->state; | 300 | 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->plugin_name, "check_test"), "Got plugin name" ); |
| 301 | ok( !strcmp(temp_state_key->name, "funnykeyname"), "Got key name" ); | 302 | ok( !strcmp(temp_state_key->name, "funnykeyname"), "Got key name" ); |
| @@ -309,11 +310,29 @@ main (int argc, char **argv) | |||
| 309 | temp_state_data = np_state_read(temp_state_key); | 310 | temp_state_data = np_state_read(temp_state_key); |
| 310 | ok( temp_state_data==NULL, "Got no state data as file does not exist" ); | 311 | ok( temp_state_data==NULL, "Got no state data as file does not exist" ); |
| 311 | 312 | ||
| 313 | |||
| 314 | /* | ||
| 315 | temp_fp = fopen("var/statefile", "r"); | ||
| 316 | if (temp_fp==NULL) | ||
| 317 | printf("Error opening. errno=%d\n", errno); | ||
| 318 | printf("temp_fp=%s\n", temp_fp); | ||
| 319 | ok( _np_state_read_file(temp_fp) == TRUE, "Can read state file" ); | ||
| 320 | fclose(temp_fp); | ||
| 321 | */ | ||
| 322 | |||
| 312 | temp_state_key->_filename="var/statefile"; | 323 | temp_state_key->_filename="var/statefile"; |
| 313 | temp_state_data = np_state_read(temp_state_key); | 324 | temp_state_data = np_state_read(temp_state_key); |
| 314 | ok( temp_state_data!=NULL, "Got state data now" ); | 325 | ok( temp_nagios_plugin->state->state_data!=NULL, "Got state data now" ); |
| 326 | ok( temp_nagios_plugin->state->state_data->time==1234567890, "Got time" ); | ||
| 327 | ok( !strcmp((char *)temp_nagios_plugin->state->state_data->data, "String to read"), "Data as expected" ); | ||
| 328 | printf("state_data=%s|\n", temp_nagios_plugin->state->state_data->data); | ||
| 315 | 329 | ||
| 316 | 330 | ||
| 331 | temp_state_key->_filename="var/nonexistant"; | ||
| 332 | temp_state_data = np_state_read(temp_state_key); | ||
| 333 | ok( temp_state_data==NULL, "Missing file gives NULL" ); | ||
| 334 | ok( temp_nagios_plugin->state->state_data==NULL, "No state information" ); | ||
| 335 | |||
| 317 | time(¤t_time); | 336 | time(¤t_time); |
| 318 | np_state_write_string(NULL, "New data"); | 337 | np_state_write_string(NULL, "New data"); |
| 319 | 338 | ||
diff --git a/lib/utils_base.c b/lib/utils_base.c index fba383f7..85505779 100644 --- a/lib/utils_base.c +++ b/lib/utils_base.c | |||
| @@ -354,6 +354,14 @@ char *_np_state_generate_key() { | |||
| 354 | return "Ahash"; | 354 | return "Ahash"; |
| 355 | } | 355 | } |
| 356 | 356 | ||
| 357 | void _cleanup_state_data() { | ||
| 358 | if (this_nagios_plugin->state->state_data!=NULL) { | ||
| 359 | np_free(this_nagios_plugin->state->state_data->data); | ||
| 360 | printf("***Setting\n"); | ||
| 361 | np_free(this_nagios_plugin->state->state_data); | ||
| 362 | } | ||
| 363 | } | ||
| 364 | |||
| 357 | /* | 365 | /* |
| 358 | * Internal function. Returns either: | 366 | * Internal function. Returns either: |
| 359 | * envvar NAGIOS_PLUGIN_STATE_DIRECTORY | 367 | * envvar NAGIOS_PLUGIN_STATE_DIRECTORY |
| @@ -373,7 +381,7 @@ char* _np_state_calculate_location_prefix(){ | |||
| 373 | * Sets variables. Generates filename. Returns np_state_key. die with | 381 | * Sets variables. Generates filename. Returns np_state_key. die with |
| 374 | * UNKNOWN if exception | 382 | * UNKNOWN if exception |
| 375 | */ | 383 | */ |
| 376 | void np_state_init(char *keyname, int expected_data_version) { | 384 | void np_enable_state(char *keyname, int expected_data_version) { |
| 377 | state_key *this_state = NULL; | 385 | state_key *this_state = NULL; |
| 378 | char *temp_filename = NULL; | 386 | char *temp_filename = NULL; |
| 379 | 387 | ||
| @@ -409,18 +417,105 @@ void np_state_init(char *keyname, int expected_data_version) { | |||
| 409 | state_data *np_state_read() { | 417 | state_data *np_state_read() { |
| 410 | state_key *my_state_key; | 418 | state_key *my_state_key; |
| 411 | state_data *this_state_data=NULL; | 419 | state_data *this_state_data=NULL; |
| 412 | int statefile=0; | 420 | FILE *statefile; |
| 421 | int c; | ||
| 422 | int rc = FALSE; | ||
| 413 | 423 | ||
| 414 | my_state_key = this_nagios_plugin->state; | 424 | if(this_nagios_plugin==NULL) |
| 415 | my_state_key->state_data = this_state_data; | 425 | die(STATE_UNKNOWN, _("This requires np_init to be called")); |
| 416 | 426 | ||
| 417 | /* Open file. If this fails, no previous state found */ | 427 | /* Open file. If this fails, no previous state found */ |
| 418 | statefile = open( my_state_key->_filename, O_RDONLY ); | 428 | statefile = fopen( this_nagios_plugin->state->_filename, "r" ); |
| 419 | if(statefile<0) { | 429 | if(statefile!=NULL) { |
| 420 | return NULL; | 430 | |
| 431 | this_state_data = (state_data *) malloc(sizeof(state_data)); | ||
| 432 | |||
| 433 | if(this_state_data==NULL) | ||
| 434 | die(STATE_UNKNOWN, _("Cannot allocate memory for state data")); | ||
| 435 | |||
| 436 | this_nagios_plugin->state->state_data = this_state_data; | ||
| 437 | |||
| 438 | rc = _np_state_read_file(statefile); | ||
| 439 | |||
| 440 | fclose(statefile); | ||
| 441 | } | ||
| 442 | |||
| 443 | if(rc==FALSE) { | ||
| 444 | printf("Called\n"); | ||
| 445 | _cleanup_state_data(); | ||
| 446 | } | ||
| 447 | |||
| 448 | return this_nagios_plugin->state->state_data; | ||
| 449 | } | ||
| 450 | |||
| 451 | /* | ||
| 452 | * Read the state file | ||
| 453 | */ | ||
| 454 | int _np_state_read_file(FILE *f) { | ||
| 455 | int c, status=FALSE; | ||
| 456 | size_t pos; | ||
| 457 | char *line; | ||
| 458 | int i; | ||
| 459 | int failure=0; | ||
| 460 | time_t current_time, data_time; | ||
| 461 | enum { STATE_FILE_VERSION, STATE_DATA_VERSION, STATE_DATA_TIME, STATE_DATA_TEXT, STATE_DATA_END } expected=STATE_FILE_VERSION; | ||
| 462 | |||
| 463 | time(¤t_time); | ||
| 464 | |||
| 465 | /* Note: This introduces a limit of 1024 bytes in the string data */ | ||
| 466 | line = (char *) malloc(1024); | ||
| 467 | |||
| 468 | printf("Here\n"); | ||
| 469 | while(!failure && (fgets(line,1024,f))!=NULL){ | ||
| 470 | pos=strlen(line); | ||
| 471 | if(line[pos-1]=='\n') { | ||
| 472 | line[pos-1]='\0'; | ||
| 473 | } | ||
| 474 | printf("Reading line |%s|\n", line); | ||
| 475 | |||
| 476 | if(line[0] == '#') continue; | ||
| 477 | |||
| 478 | switch(expected) { | ||
| 479 | case STATE_FILE_VERSION: | ||
| 480 | i=atoi(line); | ||
| 481 | //printf("line=|%d|, exp=|%d|\n", i, NP_STATE_FORMAT_VERSION); | ||
| 482 | //if(!strcmp(NP_STATE_FORMAT_VERSION, line)) { | ||
| 483 | if(i!=NP_STATE_FORMAT_VERSION) | ||
| 484 | failure++; | ||
| 485 | else | ||
| 486 | expected=STATE_DATA_VERSION; | ||
| 487 | break; | ||
| 488 | case STATE_DATA_VERSION: | ||
| 489 | i=atoi(line); | ||
| 490 | printf("i=%d, exp=%d\n", i, this_nagios_plugin->state->data_version); | ||
| 491 | if(i != this_nagios_plugin->state->data_version) | ||
| 492 | failure++; | ||
| 493 | else | ||
| 494 | expected=STATE_DATA_TIME; | ||
| 495 | break; | ||
| 496 | case STATE_DATA_TIME: | ||
| 497 | /* If time > now, error */ | ||
| 498 | data_time=strtoul(line,NULL,10); | ||
| 499 | if(data_time > current_time) | ||
| 500 | failure++; | ||
| 501 | else { | ||
| 502 | this_nagios_plugin->state->state_data->time = data_time; | ||
| 503 | expected=STATE_DATA_TEXT; | ||
| 504 | } | ||
| 505 | break; | ||
| 506 | case STATE_DATA_TEXT: | ||
| 507 | this_nagios_plugin->state->state_data->data = strdup(line); | ||
| 508 | expected=STATE_DATA_END; | ||
| 509 | status=TRUE; | ||
| 510 | break; | ||
| 511 | case STATE_DATA_END: | ||
| 512 | ; | ||
| 513 | } | ||
| 421 | } | 514 | } |
| 422 | 515 | ||
| 423 | return this_state_data; | 516 | np_free(line); |
| 517 | printf("Returning status=%d\n", status); | ||
| 518 | return status; | ||
| 424 | } | 519 | } |
| 425 | 520 | ||
| 426 | /* | 521 | /* |
diff --git a/lib/utils_base.h b/lib/utils_base.h index 6a8af198..12576d7e 100644 --- a/lib/utils_base.h +++ b/lib/utils_base.h | |||
| @@ -30,7 +30,7 @@ typedef struct thresholds_struct { | |||
| 30 | } thresholds; | 30 | } thresholds; |
| 31 | 31 | ||
| 32 | #define NP_SHAREDSTATE_DIR "/tmp" | 32 | #define NP_SHAREDSTATE_DIR "/tmp" |
| 33 | #define STATE_FORMAT_VERSION "1" | 33 | #define NP_STATE_FORMAT_VERSION 1 |
| 34 | 34 | ||
| 35 | typedef struct state_data_struct { | 35 | typedef struct state_data_struct { |
| 36 | time_t time; | 36 | time_t time; |
| @@ -93,7 +93,7 @@ char *np_extract_value(const char*, const char*, char); | |||
| 93 | #define np_extract_ntpvar(l, n) np_extract_value(l, n, ',') | 93 | #define np_extract_ntpvar(l, n) np_extract_value(l, n, ',') |
| 94 | 94 | ||
| 95 | 95 | ||
| 96 | void np_state_init(char *, int); | 96 | void np_enable_state(char *, int); |
| 97 | state_data *np_state_read(); | 97 | state_data *np_state_read(); |
| 98 | void np_state_write_string(time_t *, char *); | 98 | void np_state_write_string(time_t *, char *); |
| 99 | 99 | ||
