From 40edcd2aba43d71694388d3a38de1b67e26de663 Mon Sep 17 00:00:00 2001 From: Sami Kerola Date: Sat, 21 Jun 2008 00:00:00 +0200 Subject: [PATCH] Version 2.8 Signed-off-by: Sami Kerola --- ChangeLog | 7 ++ NEWS | 7 ++ THANKS | 11 +-- autom4te.cache/output.0 | 20 ++--- autom4te.cache/traces.0 | 2 +- bind.state.backup | 4 + configure | 20 ++--- configure.in | 2 +- man/dhcpd-pools.1 | 6 +- src/analyze.c | 33 +++++++- src/defaults.h | 3 - src/dhcpd-pools.c | 15 ++-- src/dhcpd-pools.h | 5 ++ src/getdata.c | 55 ++++++++++--- src/other.c | 16 ++-- src/output.c | 173 +++++++++++++++++++++++++++++++++++----- 16 files changed, 303 insertions(+), 76 deletions(-) create mode 100644 bind.state.backup diff --git a/ChangeLog b/ChangeLog index ec7fdfb..9803386 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +2008-06-21 Sami Kerola + * dhcpd-pools.c: Default will skip merge sorting. + * getdata.c: Interpretation of range wrote without spaces fixed. + * getdata.c: Shared network name ending to brace fixed. + * Failover backup IP counting. + * CSV output bug fixed. + 2008-05-18 Sami Kerola * Some automake files to help make install pass without complains. * Function names to error messages where they where missing. diff --git a/NEWS b/NEWS index 0faea9e..3c67be9 100644 --- a/NEWS +++ b/NEWS @@ -5,6 +5,13 @@ See the end for copying conditions. Please send dhcpd-pools bug reports to kerolasa@iki.fi. + +Version 2.8 +* dhcpd-pools.c: Default will skip merge sorting. +* getdata.c: Interpretation of range wrote without spaces fixed. +* getdata.c: Shared network name ending to brace fixed. +* Failover backup IP counting. +* CSV output bug fixed. Version 2.7 * Some automake files to help make install pass without complains. diff --git a/THANKS b/THANKS index 7e13416..115dbc6 100644 --- a/THANKS +++ b/THANKS @@ -1,12 +1,13 @@ dhcpd-pools THANKS file -dhcpd-pools has originally been written by Sami Kerola. Many -people have further contributed to dhcpd-pools by reporting -problems, suggesting various improvements, or submitting actual -code. Here is a list of these people. Help me keep it complete -and exempt of errors. +Project is originated by Sami Kerola. + +Many have reported problems, give improvement suggestions and +have some even contributed code. Here is a list of these people. Otto J. Mäkelä Mika Paananen Frank Bulk Roar Pettersen +Jeff Wieland +Rusty diff --git a/autom4te.cache/output.0 b/autom4te.cache/output.0 index 6d777be..399fa4e 100644 --- a/autom4te.cache/output.0 +++ b/autom4te.cache/output.0 @@ -1,6 +1,6 @@ @%:@! /bin/sh @%:@ Guess values for system-dependent variables and create Makefiles. -@%:@ Generated by GNU Autoconf 2.59 for dhcpd-pools 2.7. +@%:@ Generated by GNU Autoconf 2.59 for dhcpd-pools 2.8. @%:@ @%:@ Report bugs to . @%:@ @@ -269,8 +269,8 @@ SHELL=${CONFIG_SHELL-/bin/sh} # Identity of this package. PACKAGE_NAME='dhcpd-pools' PACKAGE_TARNAME='dhcpd-pools' -PACKAGE_VERSION='2.7' -PACKAGE_STRING='dhcpd-pools 2.7' +PACKAGE_VERSION='2.8' +PACKAGE_STRING='dhcpd-pools 2.8' PACKAGE_BUGREPORT='kerolasa@iki.fi' # Factoring default headers for most tests. @@ -779,7 +779,7 @@ if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF -\`configure' configures dhcpd-pools 2.7 to adapt to many kinds of systems. +\`configure' configures dhcpd-pools 2.8 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... @@ -841,7 +841,7 @@ fi if test -n "$ac_init_help"; then case $ac_init_help in - short | recursive ) echo "Configuration of dhcpd-pools 2.7:";; + short | recursive ) echo "Configuration of dhcpd-pools 2.8:";; esac cat <<\_ACEOF @@ -967,7 +967,7 @@ fi test -n "$ac_init_help" && exit 0 if $ac_init_version; then cat <<\_ACEOF -dhcpd-pools configure 2.7 +dhcpd-pools configure 2.8 generated by GNU Autoconf 2.59 Copyright (C) 2003 Free Software Foundation, Inc. @@ -981,7 +981,7 @@ cat >&5 <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. -It was created by dhcpd-pools $as_me 2.7, which was +It was created by dhcpd-pools $as_me 2.8, which was generated by GNU Autoconf 2.59. Invocation command line was $ $0 $@ @@ -1574,7 +1574,7 @@ fi # Define the identity of the package. PACKAGE=dhcpd-pools - VERSION=2.7 + VERSION=2.8 cat >>confdefs.h <<_ACEOF @@ -4712,7 +4712,7 @@ _ASBOX } >&5 cat >&5 <<_CSEOF -This file was extended by dhcpd-pools $as_me 2.7, which was +This file was extended by dhcpd-pools $as_me 2.8, which was generated by GNU Autoconf 2.59. Invocation command line was CONFIG_FILES = $CONFIG_FILES @@ -4775,7 +4775,7 @@ _ACEOF cat >>$CONFIG_STATUS <<_ACEOF ac_cs_version="\\ -dhcpd-pools config.status 2.7 +dhcpd-pools config.status 2.8 configured by $0, generated by GNU Autoconf 2.59, with options \\"`echo "$ac_configure_args" | sed 's/[\\""\`\$]/\\\\&/g'`\\" diff --git a/autom4te.cache/traces.0 b/autom4te.cache/traces.0 index 15a2e5e..317051b 100644 --- a/autom4te.cache/traces.0 +++ b/autom4te.cache/traces.0 @@ -1,5 +1,5 @@ m4trace:aclocal.m4:50: -1- m4_pattern_allow([^AM_[A-Z]+FLAGS$]) -m4trace:configure.in:5: -1- AC_INIT([dhcpd-pools], [2.7], [kerolasa@iki.fi]) +m4trace:configure.in:5: -1- AC_INIT([dhcpd-pools], [2.8], [kerolasa@iki.fi]) m4trace:configure.in:5: -1- m4_pattern_forbid([^_?A[CHUM]_]) m4trace:configure.in:5: -1- m4_pattern_forbid([_AC_]) m4trace:configure.in:5: -1- m4_pattern_forbid([^LIBOBJS$], [do not use LIBOBJS directly, use AC_LIBOBJ (see section `AC_LIBOBJ vs LIBOBJS']) diff --git a/bind.state.backup b/bind.state.backup new file mode 100644 index 0000000..dbd2053 --- /dev/null +++ b/bind.state.backup @@ -0,0 +1,4 @@ +No, 'backup' means that the secondary server in a failover pair can +allocate this address. The lease states should *always* be the same on both +servers + diff --git a/configure b/configure index 4dc30b5..0a3acda 100755 --- a/configure +++ b/configure @@ -1,6 +1,6 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.59 for dhcpd-pools 2.7. +# Generated by GNU Autoconf 2.59 for dhcpd-pools 2.8. # # Report bugs to . # @@ -269,8 +269,8 @@ SHELL=${CONFIG_SHELL-/bin/sh} # Identity of this package. PACKAGE_NAME='dhcpd-pools' PACKAGE_TARNAME='dhcpd-pools' -PACKAGE_VERSION='2.7' -PACKAGE_STRING='dhcpd-pools 2.7' +PACKAGE_VERSION='2.8' +PACKAGE_STRING='dhcpd-pools 2.8' PACKAGE_BUGREPORT='kerolasa@iki.fi' # Factoring default headers for most tests. @@ -779,7 +779,7 @@ if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF -\`configure' configures dhcpd-pools 2.7 to adapt to many kinds of systems. +\`configure' configures dhcpd-pools 2.8 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... @@ -841,7 +841,7 @@ fi if test -n "$ac_init_help"; then case $ac_init_help in - short | recursive ) echo "Configuration of dhcpd-pools 2.7:";; + short | recursive ) echo "Configuration of dhcpd-pools 2.8:";; esac cat <<\_ACEOF @@ -967,7 +967,7 @@ fi test -n "$ac_init_help" && exit 0 if $ac_init_version; then cat <<\_ACEOF -dhcpd-pools configure 2.7 +dhcpd-pools configure 2.8 generated by GNU Autoconf 2.59 Copyright (C) 2003 Free Software Foundation, Inc. @@ -981,7 +981,7 @@ cat >&5 <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. -It was created by dhcpd-pools $as_me 2.7, which was +It was created by dhcpd-pools $as_me 2.8, which was generated by GNU Autoconf 2.59. Invocation command line was $ $0 $@ @@ -1574,7 +1574,7 @@ fi # Define the identity of the package. PACKAGE=dhcpd-pools - VERSION=2.7 + VERSION=2.8 cat >>confdefs.h <<_ACEOF @@ -4712,7 +4712,7 @@ _ASBOX } >&5 cat >&5 <<_CSEOF -This file was extended by dhcpd-pools $as_me 2.7, which was +This file was extended by dhcpd-pools $as_me 2.8, which was generated by GNU Autoconf 2.59. Invocation command line was CONFIG_FILES = $CONFIG_FILES @@ -4775,7 +4775,7 @@ _ACEOF cat >>$CONFIG_STATUS <<_ACEOF ac_cs_version="\\ -dhcpd-pools config.status 2.7 +dhcpd-pools config.status 2.8 configured by $0, generated by GNU Autoconf 2.59, with options \\"`echo "$ac_configure_args" | sed 's/[\\""\`\$]/\\\\&/g'`\\" diff --git a/configure.in b/configure.in index 3dc4865..35d7967 100644 --- a/configure.in +++ b/configure.in @@ -2,7 +2,7 @@ dnl Process this file with autoconf to produce a configure script. AC_PREREQ(2.59) -AC_INIT([dhcpd-pools], [2.7], [kerolasa@iki.fi]) +AC_INIT([dhcpd-pools], [2.8], [kerolasa@iki.fi]) AM_INIT_AUTOMAKE([1.6 foreign]) diff --git a/man/dhcpd-pools.1 b/man/dhcpd-pools.1 index 9e3f34d..ab7d13e 100644 --- a/man/dhcpd-pools.1 +++ b/man/dhcpd-pools.1 @@ -2,7 +2,7 @@ .\" http://www.iki.fi/kerolasa/ .\" kerolasa@iki.fi .\" -.TH DHCPD-POOLS 1 "May 18 2008 - version 2.7" +.TH DHCPD-POOLS 1 "May 18 2008 - version 2.8" .SH NAME dhcpd-pools \- ISC dhcp pools usage analysis .SH SYNOPSIS @@ -40,6 +40,10 @@ Touched leases and currently in use together. .TP .I "t+c perc" Percent of touched and currently in use together compared to max. +.I "bu" +Failover pair can allocate these addresses. The count appears only if there is failover configuration. +.I "bu perc" +Percent of addresses that failover pair can allocate. The percent appears only if there is failover configuration. .SH ARGUMENTS .TP .I "\-c, \-\-config" diff --git a/src/analyze.c b/src/analyze.c index 27f995d..77f827e 100644 --- a/src/analyze.c +++ b/src/analyze.c @@ -64,6 +64,12 @@ prepare_data (void) /* Sort ranges */ qsort (ranges, (size_t) num_ranges, sizeof (struct range_t), &rangecomp); + /* Sort backups */ + if (num_backups > 0) + { + qsort (backups, (size_t) num_backups, sizeof (long int), &intcomp); + } + return 0; } @@ -72,9 +78,9 @@ int do_counting (void) { struct range_t *range_p; - unsigned int i, j, k, block_size; + unsigned int i, j, k, m, block_size; - i = j = 0; + i = j = m = 0; range_p = ranges; /* Walk through ranges */ @@ -112,6 +118,26 @@ do_counting (void) } } + /* Count backup IPs */ + if (num_backups > 0) + { + for (; + range_p->last_ip > backups[m] + && (unsigned long) m < num_touches; m++) + { + if (range_p->first_ip > touches[m]) + { + continue; + } + /* IP with in range */ + range_p->backups++; + if (range_p->shared_net) + { + range_p->shared_net->backups++; + } + } + } + /* Size of range, shared net & all networks */ block_size = (unsigned int) (range_p->last_ip - range_p->first_ip - 1); if (range_p->shared_net) @@ -139,8 +165,11 @@ do_counting (void) shared_networks->available += range_p->last_ip - range_p->first_ip - 1; shared_networks->used += range_p->count; shared_networks->touched += range_p->touched; + shared_networks->backups += range_p->backups; range_p++; } + + return 0; } diff --git a/src/defaults.h b/src/defaults.h index 07bf66e..0f0b980 100644 --- a/src/defaults.h +++ b/src/defaults.h @@ -32,9 +32,6 @@ #ifndef OUTPUT_FORMAT # define OUTPUT_FORMAT "text" #endif -#ifndef OUTPUT_ORDER -# define OUTPUT_ORDER 'i' -#endif #ifndef OUTPUT_LIMIT # define OUTPUT_LIMIT "77" #endif diff --git a/src/dhcpd-pools.c b/src/dhcpd-pools.c index 6fcb0bd..6631f8a 100644 --- a/src/dhcpd-pools.c +++ b/src/dhcpd-pools.c @@ -43,7 +43,7 @@ extern char *malloc (); int main (int argc, char **argv) { - int c, i, sorts = 1; + int c, i, sorts = 0; int option_index = 0; char *tmp; struct range_t *tmp_ranges; @@ -86,7 +86,6 @@ main (int argc, char **argv) strncpy (config.output_format, OUTPUT_FORMAT, (size_t) 1); /* Default sort order is by IPs small to big */ - config.sort[0] = OUTPUT_ORDER; config.reverse_order = false; /* Parse command line options */ @@ -260,10 +259,14 @@ main (int argc, char **argv) prepare_data (); do_counting (); tmp_ranges = safe_malloc (sizeof (struct range_t) * num_ranges); - mergesort_ranges (ranges, num_ranges, tmp_ranges); - if (config.reverse_order == true) { - flip_ranges(ranges, tmp_ranges); - } + if (sorts != 0) + { + mergesort_ranges (ranges, num_ranges, tmp_ranges); + } + if (config.reverse_order == true) + { + flip_ranges (ranges, tmp_ranges); + } free (tmp_ranges); output_analysis (); clean_up (); diff --git a/src/dhcpd-pools.h b/src/dhcpd-pools.h index 9f33312..01de822 100644 --- a/src/dhcpd-pools.h +++ b/src/dhcpd-pools.h @@ -47,6 +47,7 @@ struct shared_network_t unsigned long int available; unsigned long int used; unsigned long int touched; + unsigned long int backups; }; struct range_t { @@ -55,6 +56,7 @@ struct range_t unsigned long int last_ip; unsigned long int count; unsigned long int touched; + unsigned long int backups; }; /* Global variables */ static int true = 1; @@ -80,6 +82,9 @@ unsigned long int num_leases; unsigned long int *touches; unsigned long int num_touches; +unsigned long int *backups; +unsigned long int num_backups; + /* Function prototypes */ int prepare_memory (void); int parse_leases (void); diff --git a/src/getdata.c b/src/getdata.c index 7a7adab..5a06d74 100644 --- a/src/getdata.c +++ b/src/getdata.c @@ -59,7 +59,7 @@ parse_leases (void) struct in_addr inp; struct stat lease_file_stats; - num_touches = num_leases = 0; + num_touches = num_leases = num_backups = 0; dhcpd_leases = fopen (config.dhcpdlease_file, "r"); if (dhcpd_leases == NULL) @@ -69,10 +69,9 @@ parse_leases (void) } /* I found out that there's one lease address per 300 bytes in - * dhcpd.leases file. Malloc is little bit pessimistic, but I - * think that this way program crashes slightly less frequetly. - * If someone has higher density in lease file I'm interested - * to hear about that. */ + * dhcpd.leases file. Malloc is little bit pessimistic and uses + * 250. If someone has higher density in lease file I'm + * interested to hear about that. */ if (stat (config.dhcpdlease_file, &lease_file_stats)) { eprintf ("parse_leases: %s:", config.dhcpdlease_file); @@ -97,20 +96,33 @@ parse_leases (void) strncpy (ipstring, line, (size_t) MAXLEN - 1); } /* And this is lease state which we are interested about */ - if (strstr (line, "binding state active")) + else if (strstr (line, "binding state active")) { nth_field (2, ipstring, ipstring); inet_aton (ipstring, &inp); leases[num_leases] = htonl (inp.s_addr); num_leases++; } - if (strstr (line, " binding state free")) + else if (strstr (line, " binding state free")) { nth_field (2, ipstring, ipstring); inet_aton (ipstring, &inp); touches[num_touches] = htonl (inp.s_addr); num_touches++; } + else if (strstr (line, " binding state backup")) + { + nth_field (2, ipstring, ipstring); + inet_aton (ipstring, &inp); + if (num_backups == 0) + { + backups = + safe_malloc ((size_t) sizeof (long int) * + ((lease_file_stats.st_size / 250) + MAXLEN)); + } + backups[num_backups] = htonl (inp.s_addr); + num_backups++; + } } return 0; @@ -121,7 +133,6 @@ parse_leases (void) * have. Question of semantics, send mail to author if this * annoys. All performance boosts for this function are well * come. */ - int nth_field (int n, char *dest, const char *src) { @@ -176,13 +187,15 @@ is_interesting_config_clause (char *s) } } -/* This function is far too long. */ +/* TODO: This spagetti monster function need to be rewrote at + * least ones. */ int parse_config (char *config_file, char *current_shared_name, char *next_free_shared_name, struct shared_network_t *shared_p) { FILE *dhcpd_config; - int i = 0, newclause = 1, argument = 0, comment = 0, braces = 0, quote = 0; + int i = 0, newclause = true, argument = false, comment = false, braces = + 0, quote = false; char word[MAXLEN], c; int braces_shared = 1000; struct in_addr inp; @@ -203,7 +216,7 @@ parse_config (char *config_file, char *current_shared_name, exit (EXIT_FAILURE); } - /* Hairy stuff begins. */ + /* Very hairy stuff begins. */ while (!feof (dhcpd_config)) { c = fgetc (dhcpd_config); @@ -243,6 +256,16 @@ parse_config (char *config_file, char *current_shared_name, newclause = true; i = 0; } + else if (argument == 2) + { + /* Range ends to ; and this hair in code make two + * ranges wrote to gether like... + * + * range 10.20.30.40 10.20.30.41;range 10.20.30.42 10.20.30.43; + * + * ...to be interpreted correctly. */ + c = ' '; + } continue; case '{': if (quote == true) @@ -252,6 +275,12 @@ parse_config (char *config_file, char *current_shared_name, if (comment == false) { braces++; + } + /* i == 0 detects word that ends to brace like: + * + * shared-network DSL{ ... */ + if (i == 0) + { newclause = true; } continue; @@ -285,7 +314,7 @@ parse_config (char *config_file, char *current_shared_name, continue; } /* Strip white spaces before new clause word. */ - if ((newclause == true || argument != 0) && isspace (c) && i == false) + if ((newclause == true || argument != 0) && isspace (c) && i == 0) { continue; } @@ -337,6 +366,7 @@ parse_config (char *config_file, char *current_shared_name, shared_p->available = 0; shared_p->used = 0; shared_p->touched = 0; + shared_p->backups = 0; /* Temporary abuse of argument variable */ argument = strlen (next_free_shared_name) + 1; if (last_shared_name > next_free_shared_name + argument) @@ -359,6 +389,7 @@ parse_config (char *config_file, char *current_shared_name, range_p->last_ip = htonl (inp.s_addr) + 1; range_p->count = 0; range_p->touched = 0; + range_p->backups = 0; range_p->shared_net = shared_p; num_ranges++; if (num_ranges > RANGES) diff --git a/src/other.c b/src/other.c index 7c6b317..ff64ab6 100644 --- a/src/other.c +++ b/src/other.c @@ -72,15 +72,17 @@ eprintf (char *fmt, ...) fprintf (stderr, "\n"); } -void flip_ranges(struct range_t *ranges, struct range_t *tmp_ranges) +void +flip_ranges (struct range_t *ranges, struct range_t *tmp_ranges) { int i = num_ranges - 1, j; - for (j = 0; j < num_ranges; j++) { - *(tmp_ranges + j) = *(ranges + i); - i--; - } - + for (j = 0; j < num_ranges; j++) + { + *(tmp_ranges + j) = *(ranges + i); + i--; + } + memcpy (ranges, tmp_ranges, num_ranges * sizeof (struct range_t)); } @@ -114,7 +116,7 @@ clean_up (void) void print_version (void) { - fprintf (stdout, "%s version 2.7\n", program_name); + fprintf (stdout, "%s version 2.8\n", program_name); fprintf (stdout, "Program may be copied only under the terms of GNU General Public\n"); fprintf (stdout, diff --git a/src/output.c b/src/output.c index 315d526..ad0384c 100644 --- a/src/output.c +++ b/src/output.c @@ -59,7 +59,12 @@ output_txt (void) fprintf (outfile, "Ranges:\n"); fprintf (outfile, - "shared net name first ip last ip max cur percent touch t+c t+c perc\n"); + "shared net name first ip last ip max cur percent touch t+c t+c perc"); + if (num_backups > 0) + { + fprintf (outfile, " bu bu perc"); + } + fprintf (outfile, "\n"); } if (config.output_limit[1] & output_limit_bit_1) { @@ -77,7 +82,7 @@ output_txt (void) fprintf (outfile, "not_defined "); } fprintf (outfile, "%-16s", inet_ntoa (first)); - fprintf (outfile, " - %-16s %5lu %5lu %10.3f %5lu %5lu %9.3f\n", + fprintf (outfile, " - %-16s %5lu %5lu %10.3f %5lu %5lu %9.3f", inet_ntoa (last), range_p->last_ip - range_p->first_ip - 1, range_p->count, @@ -87,6 +92,14 @@ output_txt (void) range_p->touched + range_p->count, (float) (100 * (range_p->touched + range_p->count)) / (range_p->last_ip - range_p->first_ip - 1)); + if (num_backups > 0) + { + fprintf (outfile, "%7lu %8.3f", range_p->backups, + (float) (100 * range_p->backups) / (range_p->last_ip - + range_p->first_ip - + 1)); + } + fprintf (outfile, "\n"); range_p++; } } @@ -99,14 +112,19 @@ output_txt (void) { fprintf (outfile, "Shared networks:\n"); fprintf (outfile, - "name max cur percent touch t+c t+c perc\n"); + "name max cur percent touch t+c t+c perc"); + if (num_backups > 0) + { + fprintf (outfile, " bu bu perc"); + } + fprintf (outfile, "\n"); } if (config.output_limit[1] & output_limit_bit_2) { for (i = 0; i < num_shared_networks; i++) { shared_p++; - fprintf (outfile, "%-20s %5lu %5lu %10.3f %7lu %6lu %9.3f\n", + fprintf (outfile, "%-20s %5lu %5lu %10.3f %7lu %6lu %9.3f", shared_p->name, shared_p->available, shared_p->used, @@ -115,6 +133,14 @@ output_txt (void) shared_p->touched + shared_p->used, (float) (100 * (shared_p->touched + shared_p->used)) / shared_p->available); + if (num_backups > 0) + { + fprintf (outfile, "%7lu %8.3f", shared_p->backups, + (float) (100 * shared_p->backups) / + shared_p->available); + } + + fprintf (outfile, "\n"); } } if (config.output_limit[1] & output_limit_bit_2 @@ -126,11 +152,17 @@ output_txt (void) { fprintf (outfile, "Sum of all ranges:\n"); fprintf (outfile, - "name max cur percent touch t+c t+c perc\n"); + "name max cur percent touch t+c t+c perc"); + + if (num_backups > 0) + { + fprintf (outfile, " bu bu perc"); + } + fprintf (outfile, "\n"); } if (config.output_limit[1] & output_limit_bit_3) { - fprintf (outfile, "%-20s %5lu %5lu %10.3f %7lu %6lu %9.3f\n", + fprintf (outfile, "%-20s %5lu %5lu %10.3f %7lu %6lu %9.3f", shared_networks->name, shared_networks->available, shared_networks->used, @@ -142,6 +174,14 @@ output_txt (void) (shared_networks->touched + shared_networks->used)) / shared_networks->available); + + if (num_backups > 0) + { + fprintf (outfile, "%7lu %8.3f", shared_networks->backups, + (float) (100 * shared_networks->backups) / + shared_networks->available); + } + fprintf (outfile, "\n"); } if (outfile == stdout) { @@ -197,7 +237,14 @@ output_html (void) fprintf (outfile, "Ranges:\n"); fprintf (outfile, - "shared net namefirst iplast ipmaxcurpercenttoucht+ct+c perc\n"); + "shared net namefirst iplast ipmaxcurpercenttoucht+ct+c perc"); + if (num_backups > 0) + { + fprintf (outfile, + "bubu perc"); + } + + fprintf (outfile, "\n"); } if (config.output_limit[1] & output_limit_bit_1) { @@ -216,7 +263,7 @@ output_html (void) } fprintf (outfile, "%s", inet_ntoa (first)); fprintf (outfile, - "%s%lu%lu%.3f%lu%lu%.3f\n", + "%s%lu%lu%.3f%lu%lu%.3f", inet_ntoa (last), range_p->last_ip - range_p->first_ip - 1, range_p->count, (float) (100 * range_p->count) / (range_p->last_ip - @@ -225,6 +272,17 @@ output_html (void) range_p->touched + range_p->count, (float) (100 * (range_p->touched + range_p->count)) / (range_p->last_ip - range_p->first_ip - 1)); + if (num_backups > 0) + { + fprintf (outfile, + "%lu%.3f", + range_p->backups, + (float) (100 * range_p->backups) / (range_p->last_ip - + range_p->first_ip - + 1)); + } + + fprintf (outfile, "\n"); range_p++; } } @@ -232,7 +290,14 @@ output_html (void) { fprintf (outfile, "\nShared networks:\n"); fprintf (outfile, - "namemaxcurpercenttoucht+ct+c perc\n"); + "namemaxcurpercenttoucht+ct+c perc"); + if (num_backups > 0) + { + fprintf (outfile, + "bubu perc"); + } + + fprintf (outfile, "\n"); } if (config.output_limit[1] & output_limit_bit_2) { @@ -240,25 +305,42 @@ output_html (void) { shared_p++; fprintf (outfile, - "%s%lu%lu%.3f%lu%lu%.3f\n", + "%s%lu%lu%.3f%lu%lu%.3f", shared_p->name, shared_p->available, shared_p->used, (float) (100 * shared_p->used) / shared_p->available, shared_p->touched, shared_p->touched + shared_p->used, (float) (100 * (shared_p->touched + shared_p->used)) / shared_p->available); + if (num_backups > 0) + { + fprintf (outfile, + "%lu%.3f", + shared_p->backups, + (float) (100 * shared_p->backups) / + shared_p->available); + } + + fprintf (outfile, "\n"); } } if (config.output_limit[0] & output_limit_bit_3) { fprintf (outfile, "\nSum of all ranges:\n"); fprintf (outfile, - "namemaxcurpercenttoucht+ct+c perc\n"); + "namemaxcurpercenttoucht+ct+c perc"); + if (num_backups > 0) + { + fprintf (outfile, + "bubu perc"); + } + + fprintf (outfile, "\n"); } if (config.output_limit[1] & output_limit_bit_3) { fprintf (outfile, - "%s%lu%lu%.3f%lu%lu%.3f\n", + "%s%lu%lu%.3f%lu%lu%.3f", shared_networks->name, shared_networks->available, shared_networks->used, (float) (100 * shared_networks->used) / @@ -269,6 +351,16 @@ output_html (void) (shared_networks->touched + shared_networks->used)) / shared_networks->available); + if (num_backups > 0) + { + fprintf (outfile, + "%lu%.3f", + shared_networks->backups, + (float) (100 * shared_networks->backups) / + shared_networks->available); + } + fprintf (outfile, "\n"); + fprintf (outfile, "\n"); } fprintf (outfile, "\n"); if (outfile == stdout) @@ -323,7 +415,13 @@ output_csv (void) fprintf (outfile, "\"Ranges:\"\n"); fprintf (outfile, - "\"shared net name\",\"first ip\",\"last ip\",\"max\",\"cur\",\"percent\",\"touch\",\"t+c\",\"t+c perc\"\n"); + "\"shared net name\",\"first ip\",\"last ip\",\"max\",\"cur\",\"percent\",\"touch\",\"t+c\",\"t+c perc\""); + if (num_backups > 0) + { + fprintf (outfile, ",\"bu\",\"bu perc\""); + } + fprintf (outfile, "\n"); + } if (config.output_limit[1] & output_limit_bit_1) { @@ -342,7 +440,7 @@ output_csv (void) } fprintf (outfile, "\"%s\",", inet_ntoa (first)); fprintf (outfile, - "\"%s\",\"%lu\",\"%lu\",\"%.3f\",\"%lu\",\"%lu\",\"%.3f\"\n", + "\"%s\",\"%lu\",\"%lu\",\"%.3f\",\"%lu\",\"%lu\",\"%.3f\"", inet_ntoa (last), range_p->last_ip - range_p->first_ip - 1, range_p->count, (float) (100 * range_p->count) / (range_p->last_ip - @@ -350,6 +448,16 @@ output_csv (void) range_p->touched, range_p->touched + range_p->count, (float) (100 * (range_p->touched + range_p->count)) / (range_p->last_ip - range_p->first_ip - 1)); + if (num_backups > 0) + { + fprintf (outfile, ",\"%lu\",\"%.3f\"", range_p->backups, + (float) (100 * range_p->backups) / (range_p->last_ip - + range_p->first_ip - + 1)); + } + + + fprintf (outfile, "\n"); range_p++; } fprintf (outfile, "\n"); @@ -358,7 +466,12 @@ output_csv (void) { fprintf (outfile, "\"Shared networks:\"\n"); fprintf (outfile, - "\"name\",\"max\",\"cur\",\"percent\",\"touch\",\"t+c\",\"t+c perc\"\n"); + "\"name\",\"max\",\"cur\",\"percent\",\"touch\",\"t+c\",\"t+c perc\""); + if (num_backups > 0) + { + fprintf (outfile, ",\"bu\",\"bu perc\""); + } + fprintf (outfile, "\n"); } if (config.output_limit[1] & output_limit_bit_2) { @@ -367,12 +480,23 @@ output_csv (void) { shared_p++; fprintf (outfile, - "\"%s\",\"%lu\",\"%lu\",\"%.3f\",\"%lu\",\"%lu\",\"%.3f\"\n", + "\"%s\",\"%lu\",\"%lu\",\"%.3f\",\"%lu\",\"%lu\",\"%.3f\"", shared_p->name, shared_p->available, shared_p->used, (float) (100 * shared_p->used) / shared_p->available, + shared_p->touched, shared_p->touched + shared_p->used, (float) (100 * (shared_p->touched + shared_p->used)) / shared_p->available); + if (num_backups > 0) + { + fprintf (outfile, ",\"%lu\",\"%.3f\"", shared_p->backups, + (float) (100 * shared_p->backups) / + shared_p->available); + } + + fprintf (outfile, "\n"); + + } fprintf (outfile, "\n"); } @@ -380,13 +504,18 @@ output_csv (void) { fprintf (outfile, "\"Sum of all ranges:\"\n"); fprintf (outfile, - "\"name\",\"max\",\"cur\",\"percent\",\"touch\",\"t+c\",\"t+c perc\"\n"); + "\"name\",\"max\",\"cur\",\"percent\",\"touch\",\"t+c\",\"t+c perc\""); + if (num_backups > 0) + { + fprintf (outfile, ",\"bu\",\"bu perc\""); + } + fprintf (outfile, "\n"); } if (config.output_limit[1] & output_limit_bit_3) { fprintf (outfile, - "\"%s\",\"%lu\",\"%lu\",\"%.3f\",\"%lu\",\"%lu\",\"%.3f\"\n", + "\"%s\",\"%lu\",\"%lu\",\"%.3f\",\"%lu\",\"%lu\",\"%.3f\"", shared_networks->name, shared_networks->available, shared_networks->used, (float) (100 * shared_networks->used) / @@ -396,6 +525,14 @@ output_csv (void) (shared_networks->touched + shared_networks->used)) / shared_networks->available); + if (num_backups > 0) + { + fprintf (outfile, "%7lu %8.3f", shared_networks->backups, + (float) (100 * shared_networks->backups) / + shared_networks->available); + } + fprintf (outfile, "\n"); + } if (outfile == stdout) {