mirror of
git://git.code.sf.net/p/dhcpd-pools/code
synced 2025-12-16 15:57:00 +00:00
output: make output_analysis() to be regular function
This commit makes it possible to define alarming thresholds at the same time with other output formats. Signed-off-by: Sami Kerola <kerolasa@iki.fi>
This commit is contained in:
parent
9deeae8c36
commit
abf5d04736
4 changed files with 73 additions and 74 deletions
|
|
@ -73,7 +73,6 @@ double (*get_range_size) (const struct range_t *r);
|
||||||
int (*xstrstr) (const char *restrict str);
|
int (*xstrstr) (const char *restrict str);
|
||||||
int (*ipcomp) (const union ipaddr_t *restrict a, const union ipaddr_t *restrict b);
|
int (*ipcomp) (const union ipaddr_t *restrict a, const union ipaddr_t *restrict b);
|
||||||
int (*leasecomp) (const struct leases_t *restrict a, const struct leases_t *restrict b);
|
int (*leasecomp) (const struct leases_t *restrict a, const struct leases_t *restrict b);
|
||||||
int (*output_analysis) (void);
|
|
||||||
void (*add_lease) (union ipaddr_t *ip, enum ltype type);
|
void (*add_lease) (union ipaddr_t *ip, enum ltype type);
|
||||||
struct leases_t *(*find_lease) (union ipaddr_t *ip);
|
struct leases_t *(*find_lease) (union ipaddr_t *ip);
|
||||||
|
|
||||||
|
|
@ -99,8 +98,9 @@ static int return_limit(const char c)
|
||||||
int main(int argc, char **argv)
|
int main(int argc, char **argv)
|
||||||
{
|
{
|
||||||
int option_index = 0;
|
int option_index = 0;
|
||||||
|
char output_format = '\0';
|
||||||
|
int alarming = 0;
|
||||||
char const *tmp;
|
char const *tmp;
|
||||||
const char *print_mac_addreses_tmp;
|
|
||||||
struct range_t *tmp_ranges;
|
struct range_t *tmp_ranges;
|
||||||
enum {
|
enum {
|
||||||
OPT_SNET_ALARMS = CHAR_MAX + 1,
|
OPT_SNET_ALARMS = CHAR_MAX + 1,
|
||||||
|
|
@ -159,8 +159,6 @@ int main(int argc, char **argv)
|
||||||
config.header_limit = (*tmp - '0');
|
config.header_limit = (*tmp - '0');
|
||||||
tmp++;
|
tmp++;
|
||||||
config.number_limit = (*tmp - '0');
|
config.number_limit = (*tmp - '0');
|
||||||
/* Make sure some output format is selected by default */
|
|
||||||
print_mac_addreses_tmp = OUTPUT_FORMAT;
|
|
||||||
/* Default sort order is by IPs small to big */
|
/* Default sort order is by IPs small to big */
|
||||||
config.reverse_order = 0;
|
config.reverse_order = 0;
|
||||||
config.backups_found = 0;
|
config.backups_found = 0;
|
||||||
|
|
@ -186,7 +184,7 @@ int main(int argc, char **argv)
|
||||||
break;
|
break;
|
||||||
case 'f':
|
case 'f':
|
||||||
/* Output format */
|
/* Output format */
|
||||||
print_mac_addreses_tmp = optarg;
|
output_format = optarg[0];
|
||||||
break;
|
break;
|
||||||
case 's':
|
case 's':
|
||||||
{
|
{
|
||||||
|
|
@ -225,19 +223,19 @@ int main(int argc, char **argv)
|
||||||
config.snet_alarms = 1;
|
config.snet_alarms = 1;
|
||||||
break;
|
break;
|
||||||
case OPT_WARN:
|
case OPT_WARN:
|
||||||
print_mac_addreses_tmp = "a";
|
alarming = 1;
|
||||||
config.warning = strtod_or_err(optarg, "illegal argument");
|
config.warning = strtod_or_err(optarg, "illegal argument");
|
||||||
break;
|
break;
|
||||||
case OPT_CRIT:
|
case OPT_CRIT:
|
||||||
print_mac_addreses_tmp = "a";
|
alarming = 1;
|
||||||
config.critical = strtod_or_err(optarg, "illegal argument");
|
config.critical = strtod_or_err(optarg, "illegal argument");
|
||||||
break;
|
break;
|
||||||
case OPT_WARN_COUNT:
|
case OPT_WARN_COUNT:
|
||||||
print_mac_addreses_tmp = "a";
|
alarming = 1;
|
||||||
config.warn_count = strtod_or_err(optarg, "illegal argument");
|
config.warn_count = strtod_or_err(optarg, "illegal argument");
|
||||||
break;
|
break;
|
||||||
case OPT_CRIT_COUNT:
|
case OPT_CRIT_COUNT:
|
||||||
print_mac_addreses_tmp = "a";
|
alarming = 1;
|
||||||
config.crit_count = strtod_or_err(optarg, "illegal argument");
|
config.crit_count = strtod_or_err(optarg, "illegal argument");
|
||||||
break;
|
break;
|
||||||
case OPT_MINSIZE:
|
case OPT_MINSIZE:
|
||||||
|
|
@ -274,50 +272,22 @@ int main(int argc, char **argv)
|
||||||
program_name);
|
program_name);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/* Output function selection */
|
/* Output format is not defined, if alarm thresholds are then it's
|
||||||
switch (print_mac_addreses_tmp[0]) {
|
* alarming, else use the default. */
|
||||||
case 't':
|
if (output_format == '\0') {
|
||||||
output_analysis = output_txt;
|
if (alarming == 1)
|
||||||
config.print_mac_addreses = 0;
|
output_format = 'a';
|
||||||
break;
|
else {
|
||||||
case 'a':
|
const char *const def = OUTPUT_FORMAT;
|
||||||
output_analysis = output_alarming;
|
output_format = def[0];
|
||||||
config.print_mac_addreses = 0;
|
}
|
||||||
break;
|
|
||||||
case 'h':
|
|
||||||
error(EXIT_FAILURE, 0, "html table only output format is deprecated");
|
|
||||||
break;
|
|
||||||
case 'H':
|
|
||||||
output_analysis = output_html;
|
|
||||||
config.print_mac_addreses = 0;
|
|
||||||
break;
|
|
||||||
case 'x':
|
|
||||||
output_analysis = output_xml;
|
|
||||||
config.print_mac_addreses = 0;
|
|
||||||
break;
|
|
||||||
case 'X':
|
|
||||||
output_analysis = output_xml;
|
|
||||||
config.print_mac_addreses = 1;
|
|
||||||
break;
|
|
||||||
case 'j':
|
|
||||||
output_analysis = output_json;
|
|
||||||
config.print_mac_addreses = 0;
|
|
||||||
break;
|
|
||||||
case 'J':
|
|
||||||
output_analysis = output_json;
|
|
||||||
config.print_mac_addreses = 1;
|
|
||||||
break;
|
|
||||||
case 'c':
|
|
||||||
output_analysis = output_csv;
|
|
||||||
config.print_mac_addreses = 0;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
clean_up();
|
|
||||||
error(EXIT_FAILURE, 0, "unknown output format: %s", quote(print_mac_addreses_tmp));
|
|
||||||
}
|
}
|
||||||
/* Do the job */
|
/* Do the job */
|
||||||
parse_config(1, config.dhcpdconf_file, shared_networks);
|
parse_config(1, config.dhcpdconf_file, shared_networks);
|
||||||
parse_leases();
|
if (output_format == 'X' || output_format == 'J')
|
||||||
|
parse_leases(1);
|
||||||
|
else
|
||||||
|
parse_leases(0);
|
||||||
prepare_data();
|
prepare_data();
|
||||||
do_counting();
|
do_counting();
|
||||||
tmp_ranges = xmalloc(sizeof(struct range_t) * num_ranges);
|
tmp_ranges = xmalloc(sizeof(struct range_t) * num_ranges);
|
||||||
|
|
@ -326,7 +296,7 @@ int main(int argc, char **argv)
|
||||||
if (config.reverse_order == 1)
|
if (config.reverse_order == 1)
|
||||||
flip_ranges(ranges, tmp_ranges);
|
flip_ranges(ranges, tmp_ranges);
|
||||||
free(tmp_ranges);
|
free(tmp_ranges);
|
||||||
ret_val = output_analysis();
|
ret_val = output_analysis(output_format);
|
||||||
clean_up();
|
clean_up();
|
||||||
return (ret_val);
|
return (ret_val);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -186,6 +186,7 @@ struct configuration_t {
|
||||||
enum dhcp_version ip_version;
|
enum dhcp_version ip_version;
|
||||||
char *dhcpdconf_file;
|
char *dhcpdconf_file;
|
||||||
char *dhcpdlease_file;
|
char *dhcpdlease_file;
|
||||||
|
int output_format;
|
||||||
struct output_sort *sorts;
|
struct output_sort *sorts;
|
||||||
char *output_file;
|
char *output_file;
|
||||||
double warning;
|
double warning;
|
||||||
|
|
@ -197,7 +198,6 @@ struct configuration_t {
|
||||||
reverse_order:1,
|
reverse_order:1,
|
||||||
backups_found:1,
|
backups_found:1,
|
||||||
snet_alarms:1,
|
snet_alarms:1,
|
||||||
print_mac_addreses:1,
|
|
||||||
perfdata:1,
|
perfdata:1,
|
||||||
all_as_shared:1,
|
all_as_shared:1,
|
||||||
header_limit:3,
|
header_limit:3,
|
||||||
|
|
@ -224,7 +224,7 @@ extern unsigned int RANGES;
|
||||||
/* Function prototypes */
|
/* Function prototypes */
|
||||||
extern void prepare_memory(void);
|
extern void prepare_memory(void);
|
||||||
extern void set_ipv_functions(int version);
|
extern void set_ipv_functions(int version);
|
||||||
extern int parse_leases(void);
|
extern int parse_leases(const int print_mac_addreses);
|
||||||
extern void parse_config(int, const char *restrict, struct shared_network_t *restrict)
|
extern void parse_config(int, const char *restrict, struct shared_network_t *restrict)
|
||||||
__attribute__ ((nonnull(2, 3)));
|
__attribute__ ((nonnull(2, 3)));
|
||||||
extern void prepare_data(void);
|
extern void prepare_data(void);
|
||||||
|
|
@ -301,14 +301,8 @@ extern double ret_tcperc(struct range_t r);
|
||||||
extern void mergesort_ranges(struct range_t *restrict orig, int size,
|
extern void mergesort_ranges(struct range_t *restrict orig, int size,
|
||||||
struct range_t *restrict temp)
|
struct range_t *restrict temp)
|
||||||
__attribute__ ((nonnull(1, 3)));
|
__attribute__ ((nonnull(1, 3)));
|
||||||
/* output function pointer and functions */
|
/* output function */
|
||||||
extern int (*output_analysis) (void);
|
extern int output_analysis(const char);
|
||||||
extern int output_txt(void);
|
|
||||||
extern int output_html(void);
|
|
||||||
extern int output_xml(void);
|
|
||||||
extern int output_json(void);
|
|
||||||
extern int output_csv(void);
|
|
||||||
extern int output_alarming(void);
|
|
||||||
/* Memory release, file closing etc */
|
/* Memory release, file closing etc */
|
||||||
extern void clean_up(void);
|
extern void clean_up(void);
|
||||||
/* Hash functions */
|
/* Hash functions */
|
||||||
|
|
|
||||||
|
|
@ -58,13 +58,12 @@
|
||||||
|
|
||||||
/*! \brief Lease file parser. The parser can only read ISC DHCPD
|
/*! \brief Lease file parser. The parser can only read ISC DHCPD
|
||||||
* dhcpd.leases file format. */
|
* dhcpd.leases file format. */
|
||||||
int parse_leases(void)
|
int parse_leases(const int print_mac_addreses)
|
||||||
{
|
{
|
||||||
FILE *dhcpd_leases;
|
FILE *dhcpd_leases;
|
||||||
char *line, *ipstring, macstring[20], *stop;
|
char *line, *ipstring, macstring[20], *stop;
|
||||||
union ipaddr_t addr;
|
union ipaddr_t addr;
|
||||||
struct stat lease_file_stats;
|
struct stat lease_file_stats;
|
||||||
int ethernets = 0; /* boolean */
|
|
||||||
struct leases_t *lease;
|
struct leases_t *lease;
|
||||||
|
|
||||||
dhcpd_leases = fopen(config.dhcpdlease_file, "r");
|
dhcpd_leases = fopen(config.dhcpdlease_file, "r");
|
||||||
|
|
@ -86,8 +85,6 @@ int parse_leases(void)
|
||||||
line[0] = '\0';
|
line[0] = '\0';
|
||||||
ipstring = xmalloc(sizeof(char) * MAXLEN);
|
ipstring = xmalloc(sizeof(char) * MAXLEN);
|
||||||
ipstring[0] = '\0';
|
ipstring[0] = '\0';
|
||||||
if (config.print_mac_addreses == 1)
|
|
||||||
ethernets = 1;
|
|
||||||
while (!feof(dhcpd_leases)) {
|
while (!feof(dhcpd_leases)) {
|
||||||
if (!fgets(line, MAXLEN, dhcpd_leases) && ferror(dhcpd_leases))
|
if (!fgets(line, MAXLEN, dhcpd_leases) && ferror(dhcpd_leases))
|
||||||
error(EXIT_FAILURE, errno, "parse_leases: %s", config.dhcpdlease_file);
|
error(EXIT_FAILURE, errno, "parse_leases: %s", config.dhcpdlease_file);
|
||||||
|
|
@ -126,7 +123,7 @@ int parse_leases(void)
|
||||||
config.backups_found = 1;
|
config.backups_found = 1;
|
||||||
break;
|
break;
|
||||||
case PREFIX_HARDWARE_ETHERNET:
|
case PREFIX_HARDWARE_ETHERNET:
|
||||||
if (ethernets == 0)
|
if (print_mac_addreses == 0)
|
||||||
break;
|
break;
|
||||||
memcpy(macstring, line + 20, 17);
|
memcpy(macstring, line + 20, 17);
|
||||||
macstring[17] = '\0';
|
macstring[17] = '\0';
|
||||||
|
|
|
||||||
54
src/output.c
54
src/output.c
|
|
@ -59,7 +59,7 @@
|
||||||
#include "dhcpd-pools.h"
|
#include "dhcpd-pools.h"
|
||||||
|
|
||||||
/*! \brief Text output format, which is the default. */
|
/*! \brief Text output format, which is the default. */
|
||||||
int output_txt(void)
|
static int output_txt(void)
|
||||||
{
|
{
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
struct range_t *range_p;
|
struct range_t *range_p;
|
||||||
|
|
@ -214,7 +214,7 @@ int output_txt(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
/*! \brief The xml output formats. */
|
/*! \brief The xml output formats. */
|
||||||
int output_xml(void)
|
static int output_xml(const int print_mac_addreses)
|
||||||
{
|
{
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
struct range_t *range_p;
|
struct range_t *range_p;
|
||||||
|
|
@ -238,7 +238,7 @@ int output_xml(void)
|
||||||
|
|
||||||
fprintf(outfile, "<dhcpstatus>\n");
|
fprintf(outfile, "<dhcpstatus>\n");
|
||||||
|
|
||||||
if (config.print_mac_addreses == 1) {
|
if (print_mac_addreses == 1) {
|
||||||
struct leases_t *l;
|
struct leases_t *l;
|
||||||
|
|
||||||
for (l = leases; l != NULL; l = l->hh.next) {
|
for (l = leases; l != NULL; l = l->hh.next) {
|
||||||
|
|
@ -317,7 +317,7 @@ int output_xml(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
/*! \brief The json output formats. */
|
/*! \brief The json output formats. */
|
||||||
int output_json(void)
|
static int output_json(const int print_mac_addreses)
|
||||||
{
|
{
|
||||||
unsigned int i = 0;
|
unsigned int i = 0;
|
||||||
struct range_t *range_p;
|
struct range_t *range_p;
|
||||||
|
|
@ -343,7 +343,7 @@ int output_json(void)
|
||||||
|
|
||||||
fprintf(outfile, "{\n");
|
fprintf(outfile, "{\n");
|
||||||
|
|
||||||
if (config.print_mac_addreses == 1) {
|
if (print_mac_addreses == 1) {
|
||||||
struct leases_t *l;
|
struct leases_t *l;
|
||||||
|
|
||||||
fprintf(outfile, " \"active_leases\": [");
|
fprintf(outfile, " \"active_leases\": [");
|
||||||
|
|
@ -595,7 +595,7 @@ static void newsection(FILE *restrict f, char const *restrict title)
|
||||||
}
|
}
|
||||||
|
|
||||||
/*! \brief Output html format. */
|
/*! \brief Output html format. */
|
||||||
int output_html(void)
|
static int output_html(void)
|
||||||
{
|
{
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
struct range_t *range_p;
|
struct range_t *range_p;
|
||||||
|
|
@ -783,7 +783,7 @@ int output_html(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
/*! \brief Output cvs format. */
|
/*! \brief Output cvs format. */
|
||||||
int output_csv(void)
|
static int output_csv(void)
|
||||||
{
|
{
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
struct range_t *range_p;
|
struct range_t *range_p;
|
||||||
|
|
@ -925,7 +925,7 @@ int output_csv(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
/*! \brief Output alarm text, and return program exit value. */
|
/*! \brief Output alarm text, and return program exit value. */
|
||||||
int output_alarming(void)
|
static int output_alarming(void)
|
||||||
{
|
{
|
||||||
FILE *outfile;
|
FILE *outfile;
|
||||||
struct range_t *range_p;
|
struct range_t *range_p;
|
||||||
|
|
@ -1093,3 +1093,41 @@ int output_alarming(void)
|
||||||
}
|
}
|
||||||
return ret_val;
|
return ret_val;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*! \brief Return output_format_names enum based on single char input. */
|
||||||
|
int output_analysis(const char c)
|
||||||
|
{
|
||||||
|
int ret = 1;
|
||||||
|
switch (c) {
|
||||||
|
case 't':
|
||||||
|
ret = output_txt();
|
||||||
|
break;
|
||||||
|
case 'a':
|
||||||
|
ret = output_alarming();
|
||||||
|
break;
|
||||||
|
case 'h':
|
||||||
|
error(EXIT_FAILURE, 0, "html table only output format is deprecated");
|
||||||
|
break;
|
||||||
|
case 'H':
|
||||||
|
ret = output_html();
|
||||||
|
break;
|
||||||
|
case 'x':
|
||||||
|
ret = output_xml(0);
|
||||||
|
break;
|
||||||
|
case 'X':
|
||||||
|
ret = output_xml(1);
|
||||||
|
break;
|
||||||
|
case 'j':
|
||||||
|
ret = output_json(0);
|
||||||
|
break;
|
||||||
|
case 'J':
|
||||||
|
ret = output_json(1);
|
||||||
|
break;
|
||||||
|
case 'c':
|
||||||
|
ret = output_csv();
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
error(EXIT_FAILURE, 0, "unknown output format: '%c'", c);
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue