--- a/src/apinger.c +++ b/src/apinger.c @@ -826,26 +826,49 @@ char *buf1,*buf2; return; } tm=time(NULL); - fprintf(f,"%s\n",ctime(&tm)); + if(!config->status_format) fprintf(f,"%s\n",ctime(&tm)); for(t=targets;t;t=t->next){ - fprintf(f,"Target: %s\n",t->name); - fprintf(f,"Source: %s\n",t->config->srcip); - fprintf(f,"Description: %s\n",t->description); - fprintf(f,"Last reply received: #%i %s",t->last_received, - ctime(&t->last_received_tv.tv_sec)); - fprintf(f,"Average delay: %0.3fms\n",AVG_DELAY(t)); + if(config->status_format){ + fprintf(f,"%s|%s|%s|%i|%i|%" PRIu64 "|",t->name, t->config->srcip, t->description, t->last_sent+1, + t->received, (uint64_t)t->last_received_tv.tv_sec); + fprintf(f,"%0.3fms|", AVG_DELAY(t)); + } + else{ + fprintf(f,"Target: %s\n",t->name); + fprintf(f,"Source: %s\n",t->config->srcip); + fprintf(f,"Description: %s\n",t->description); + fprintf(f,"Last reply received: #%i %s",t->last_received, + ctime(&t->last_received_tv.tv_sec)); + fprintf(f,"Average delay: %0.3fms\n",AVG_DELAY(t)); + } if (AVG_LOSS_KNOWN(t)){ - fprintf(f,"Average packet loss: %0.1f%%\n",AVG_LOSS(t)); + if(config->status_format){ + fprintf(f,"%0.1f%%",AVG_LOSS(t)); + } + else{ + fprintf(f,"Average packet loss: %0.1f%%\n",AVG_LOSS(t)); + } + } + if(config->status_format){ + fprintf(f, "|"); + } + else{ + fprintf(f,"Active alarms: "); } - fprintf(f,"Active alarms:"); if (t->active_alarms){ for(al=t->active_alarms;al;al=al->next){ a=al->alarm; - fprintf(f," \"%s\"",a->name); + if(config->status_format){ + fprintf(f,"%s",a->name); + } + else{ + fprintf(f," \"%s\"",a->name); + } } - fprintf(f,"\n"); + if(!config->status_format) fprintf(f,"\n"); } - else fprintf(f," None\n"); + else fprintf(f,"none"); + if(!config->status_format) fprintf(f,"\n"); buf1=NEW(char,t->config->avg_loss_delay_samples+1); buf2=NEW(char,t->config->avg_loss_samples+1); --- a/src/apinger.conf +++ b/src/apinger.conf @@ -29,6 +29,10 @@ group "nogroup" # ## Interval between file updates # ## when 0 or not set, file is written only when SIGUSR1 is received # interval 5m +# +# ## Create status file in script parseable format (on) or human +# ## readable format (off) +# scriptformat off #} ######################################## --- a/src/cfgparser1.y +++ b/src/cfgparser1.y @@ -104,6 +104,7 @@ struct target_cfg *cur_target; %token AVG_LOSS_DELAY_SAMPLES %token FILE_ +%token SCRIPTFORMAT %token ERROR @@ -282,6 +283,8 @@ statuscfg: /* */ { cur_config.status_interval=$2; } | INTERVAL TIME { cur_config.status_interval=$2; } + | SCRIPTFORMAT boolean + { cur_config.status_format=$2; } | statuscfg separator statuscfg ; --- a/src/cfgparser2.l +++ b/src/cfgparser2.l @@ -85,6 +85,7 @@ srcip { LOC; LOCINC; return SRCIP; } down { LOC; LOCINC; return DOWN; } false { LOC; LOCINC; return FALSE; } file { LOC; LOCINC; return FILE_; } +scriptformat { LOC; LOCINC; return SCRIPTFORMAT; } group { LOC; LOCINC; return GROUP; } interval { LOC; LOCINC; return INTERVAL; } loss { LOC; LOCINC; return LOSS; } --- a/src/conf.h +++ b/src/conf.h @@ -97,6 +97,7 @@ struct config { char *pid_file; char *status_file; int status_interval; + int status_format; char *timestamp_format; }; --- a/src/main.c +++ b/src/main.c @@ -88,6 +88,7 @@ struct config default_config={ "/var/run/apinger.pid", /* pid file */ NULL, /* status file */ 0, /* status interval */ + 0, /* status format */ "%b %d %H:%M:%S" /* timestamp format */ };