[nagiosplug] More tests
Ton Voon
tonvoon at users.sourceforge.net
Mon Jun 21 14:08:18 CEST 2010
Module: nagiosplug
Branch: ton/state
Commit: 68eb836e527bdead1eea7fc281c95c86eab3164d
Author: Ton Voon <ton.voon at opsera.com>
Date: Fri Jun 18 14:45:02 2010 +0100
URL: http://nagiosplug.git.sf.net/git/gitweb.cgi?p=nagiosplug/nagiosplug;a=commit;h=68eb836
More tests
---
lib/tests/test_utils.c | 25 +++++++++-
lib/utils_base.c | 111 ++++++++++++++++++++++++++++++++++++++++++++---
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 aae358f..d7cdc33 100644
--- a/lib/tests/test_utils.c
+++ b/lib/tests/test_utils.c
@@ -34,6 +34,7 @@ main (int argc, char **argv)
time_t current_time;
char *temp_filename;
nagios_plugin *temp_nagios_plugin;
+ FILE *temp_fp;
plan_tests(81+23);
@@ -288,14 +289,14 @@ main (int argc, char **argv)
ok(temp_state_key==NULL, "temp_state_key initially empty");
- np_state_init(NULL, 51);
+ np_enable_state(NULL, 51);
temp_state_key = temp_nagios_plugin->state;
ok( !strcmp(temp_state_key->plugin_name, "check_test"), "Got plugin name" );
ok( !strcmp(temp_state_key->name, "Ahash"), "Got key name" );
printf("Filename=%s\n", temp_state_key->_filename);
- np_state_init("funnykeyname", 54);
+ np_enable_state("funnykeyname", 54);
temp_state_key = temp_nagios_plugin->state;
ok( !strcmp(temp_state_key->plugin_name, "check_test"), "Got plugin name" );
ok( !strcmp(temp_state_key->name, "funnykeyname"), "Got key name" );
@@ -309,11 +310,29 @@ main (int argc, char **argv)
temp_state_data = np_state_read(temp_state_key);
ok( temp_state_data==NULL, "Got no state data as file does not exist" );
+
+/*
+ temp_fp = fopen("var/statefile", "r");
+ if (temp_fp==NULL)
+ printf("Error opening. errno=%d\n", errno);
+ printf("temp_fp=%s\n", temp_fp);
+ ok( _np_state_read_file(temp_fp) == TRUE, "Can read state file" );
+ fclose(temp_fp);
+*/
+
temp_state_key->_filename="var/statefile";
temp_state_data = np_state_read(temp_state_key);
- ok( temp_state_data!=NULL, "Got state data now" );
+ ok( temp_nagios_plugin->state->state_data!=NULL, "Got state data now" );
+ ok( temp_nagios_plugin->state->state_data->time==1234567890, "Got time" );
+ ok( !strcmp((char *)temp_nagios_plugin->state->state_data->data, "String to read"), "Data as expected" );
+ printf("state_data=%s|\n", temp_nagios_plugin->state->state_data->data);
+ temp_state_key->_filename="var/nonexistant";
+ temp_state_data = np_state_read(temp_state_key);
+ ok( temp_state_data==NULL, "Missing file gives NULL" );
+ ok( temp_nagios_plugin->state->state_data==NULL, "No state information" );
+
time(¤t_time);
np_state_write_string(NULL, "New data");
diff --git a/lib/utils_base.c b/lib/utils_base.c
index fba383f..8550577 100644
--- a/lib/utils_base.c
+++ b/lib/utils_base.c
@@ -354,6 +354,14 @@ char *_np_state_generate_key() {
return "Ahash";
}
+void _cleanup_state_data() {
+ if (this_nagios_plugin->state->state_data!=NULL) {
+ np_free(this_nagios_plugin->state->state_data->data);
+ printf("***Setting\n");
+ np_free(this_nagios_plugin->state->state_data);
+ }
+}
+
/*
* Internal function. Returns either:
* envvar NAGIOS_PLUGIN_STATE_DIRECTORY
@@ -373,7 +381,7 @@ char* _np_state_calculate_location_prefix(){
* Sets variables. Generates filename. Returns np_state_key. die with
* UNKNOWN if exception
*/
-void np_state_init(char *keyname, int expected_data_version) {
+void np_enable_state(char *keyname, int expected_data_version) {
state_key *this_state = NULL;
char *temp_filename = NULL;
@@ -409,18 +417,105 @@ void np_state_init(char *keyname, int expected_data_version) {
state_data *np_state_read() {
state_key *my_state_key;
state_data *this_state_data=NULL;
- int statefile=0;
+ FILE *statefile;
+ int c;
+ int rc = FALSE;
- my_state_key = this_nagios_plugin->state;
- my_state_key->state_data = this_state_data;
+ if(this_nagios_plugin==NULL)
+ die(STATE_UNKNOWN, _("This requires np_init to be called"));
/* Open file. If this fails, no previous state found */
- statefile = open( my_state_key->_filename, O_RDONLY );
- if(statefile<0) {
- return NULL;
+ statefile = fopen( this_nagios_plugin->state->_filename, "r" );
+ if(statefile!=NULL) {
+
+ this_state_data = (state_data *) malloc(sizeof(state_data));
+
+ if(this_state_data==NULL)
+ die(STATE_UNKNOWN, _("Cannot allocate memory for state data"));
+
+ this_nagios_plugin->state->state_data = this_state_data;
+
+ rc = _np_state_read_file(statefile);
+
+ fclose(statefile);
+ }
+
+ if(rc==FALSE) {
+ printf("Called\n");
+ _cleanup_state_data();
+ }
+
+ return this_nagios_plugin->state->state_data;
+}
+
+/*
+ * Read the state file
+ */
+int _np_state_read_file(FILE *f) {
+ int c, status=FALSE;
+ size_t pos;
+ char *line;
+ int i;
+ int failure=0;
+ time_t current_time, data_time;
+ enum { STATE_FILE_VERSION, STATE_DATA_VERSION, STATE_DATA_TIME, STATE_DATA_TEXT, STATE_DATA_END } expected=STATE_FILE_VERSION;
+
+ time(¤t_time);
+
+ /* Note: This introduces a limit of 1024 bytes in the string data */
+ line = (char *) malloc(1024);
+
+ printf("Here\n");
+ while(!failure && (fgets(line,1024,f))!=NULL){
+ pos=strlen(line);
+ if(line[pos-1]=='\n') {
+ line[pos-1]='\0';
+ }
+ printf("Reading line |%s|\n", line);
+
+ if(line[0] == '#') continue;
+
+ switch(expected) {
+ case STATE_FILE_VERSION:
+ i=atoi(line);
+ //printf("line=|%d|, exp=|%d|\n", i, NP_STATE_FORMAT_VERSION);
+ //if(!strcmp(NP_STATE_FORMAT_VERSION, line)) {
+ if(i!=NP_STATE_FORMAT_VERSION)
+ failure++;
+ else
+ expected=STATE_DATA_VERSION;
+ break;
+ case STATE_DATA_VERSION:
+ i=atoi(line);
+ printf("i=%d, exp=%d\n", i, this_nagios_plugin->state->data_version);
+ if(i != this_nagios_plugin->state->data_version)
+ failure++;
+ else
+ expected=STATE_DATA_TIME;
+ break;
+ case STATE_DATA_TIME:
+ /* If time > now, error */
+ data_time=strtoul(line,NULL,10);
+ if(data_time > current_time)
+ failure++;
+ else {
+ this_nagios_plugin->state->state_data->time = data_time;
+ expected=STATE_DATA_TEXT;
+ }
+ break;
+ case STATE_DATA_TEXT:
+ this_nagios_plugin->state->state_data->data = strdup(line);
+ expected=STATE_DATA_END;
+ status=TRUE;
+ break;
+ case STATE_DATA_END:
+ ;
+ }
}
- return this_state_data;
+ np_free(line);
+ printf("Returning status=%d\n", status);
+ return status;
}
/*
diff --git a/lib/utils_base.h b/lib/utils_base.h
index 6a8af19..12576d7 100644
--- a/lib/utils_base.h
+++ b/lib/utils_base.h
@@ -30,7 +30,7 @@ typedef struct thresholds_struct {
} thresholds;
#define NP_SHAREDSTATE_DIR "/tmp"
-#define STATE_FORMAT_VERSION "1"
+#define NP_STATE_FORMAT_VERSION 1
typedef struct state_data_struct {
time_t time;
@@ -93,7 +93,7 @@ char *np_extract_value(const char*, const char*, char);
#define np_extract_ntpvar(l, n) np_extract_value(l, n, ',')
-void np_state_init(char *, int);
+void np_enable_state(char *, int);
state_data *np_state_read();
void np_state_write_string(time_t *, char *);
More information about the Commits
mailing list