mirror of
git://git.code.sf.net/p/dhcpd-pools/code
synced 2025-12-16 15:57:00 +00:00
Compare commits
53 commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
1722d54103 | ||
|
|
1c413b0653 | ||
|
|
d020e4d09f | ||
|
|
f917d5b223 | ||
|
|
5b7ab28314 | ||
|
|
dc649e27cd | ||
|
|
7fc13c60e0 | ||
|
|
5ed6e7688f | ||
|
|
9c6336e5b6 | ||
|
|
d94654e100 | ||
|
|
dc1f0b9b76 | ||
|
|
3d37ac0a2d | ||
|
|
102d017ed5 | ||
|
|
501bc15b43 | ||
|
|
0c5b8301dd | ||
|
|
1d20604519 | ||
|
|
5126e63665 | ||
|
|
c7e0058994 | ||
|
|
2ecfc86a06 | ||
|
|
0f19d44c1d | ||
|
|
b005ce9a25 | ||
|
|
45f7fc1514 | ||
|
|
ec613f762d | ||
|
|
e48768b041 | ||
|
|
544e7ec0a5 | ||
|
|
b96c6c14d2 | ||
|
|
21194d2e4a | ||
|
|
fb518b7a19 | ||
|
|
707eafa670 | ||
|
|
07b4eaa480 | ||
|
|
17d68b7e3e | ||
|
|
4f64902a9e | ||
|
|
008e9f17c1 | ||
|
|
71714a0993 | ||
|
|
6f6369f517 | ||
|
|
8731c6a11f | ||
|
|
d29b498cae | ||
|
|
48e46e8698 | ||
|
|
4befdeeb47 | ||
|
|
9727bb28b9 | ||
|
|
5027b50ade | ||
|
|
27c70a0efe | ||
|
|
7fe686b417 | ||
|
|
3f85360c64 | ||
|
|
e8e9d49ebb | ||
|
|
4e7ab66fd4 | ||
|
|
b568725e7d | ||
|
|
a192f51545 | ||
|
|
679d63dd9f | ||
|
|
0fe89808ee | ||
|
|
447241e6c3 | ||
|
|
2849dde21b | ||
|
|
813e320b68 |
76 changed files with 3912 additions and 4043 deletions
3
.gitignore
vendored
3
.gitignore
vendored
|
|
@ -1,5 +1,8 @@
|
|||
# Wildcard + in any subdir.
|
||||
*.o
|
||||
*.gcno
|
||||
*.gcda
|
||||
*.[ch].gcov
|
||||
|
||||
# Exact filename in any subdir.
|
||||
.deps
|
||||
|
|
|
|||
2
.mailmap
Normal file
2
.mailmap
Normal file
|
|
@ -0,0 +1,2 @@
|
|||
Sami Kerola <kerolasa@iki.fi>
|
||||
Sami Kerola <kerolasa@iki.fi> <sami.kerola@tomtom.com>
|
||||
|
|
@ -1,7 +1,6 @@
|
|||
## Makefile.am -- Process this file with automake to produce Makefile.in
|
||||
|
||||
AUTOMAKE_OPTIONS = gnu
|
||||
ACLOCAL_AMFLAGS = -I m4
|
||||
|
||||
EXTRA_DIST = \
|
||||
.version \
|
||||
|
|
@ -40,7 +39,7 @@ edit_cmd = sed \
|
|||
|
||||
$(PATHFILES): Makefile
|
||||
@ rm -f $@ $@.tmp
|
||||
$(AM_V_at) test -d $(dir $@) || mkdir -p $(dir $@)
|
||||
$(AM_V_at) mkdir -p $$(dirname $@)
|
||||
$(AM_V_GEN) srcdir=''; \
|
||||
test -f ./$@.in || srcdir=$(srcdir)/; \
|
||||
$(edit_cmd) $${srcdir}$@.in >$@.tmp
|
||||
|
|
|
|||
71
NEWS
71
NEWS
|
|
@ -7,6 +7,77 @@ Please send dhcpd-pools bug reports to kerolasa@iki.fi.
|
|||
|
||||
gpg: Signature is crated using RSA key ID 8ED396E37E38D471A00530D3A9553245FDE9B739.
|
||||
|
||||
|
||||
Version 3.3
|
||||
Belkacem Daheb (2):
|
||||
add start, end and hostname printing support for xml and json
|
||||
getdata output: add start, end and hostname printing support for xml and json
|
||||
|
||||
M. van Brummelen (1):
|
||||
docs: fix manual page groff warning
|
||||
|
||||
Sami Kerola (9):
|
||||
update project web page
|
||||
website: use https
|
||||
chore: update web links
|
||||
getdata: only emit warning when config include file cannot be read
|
||||
gnulib: update bootstrap and gitignore files
|
||||
build-sys: quote subshell execution in the autotools file
|
||||
build-sys: update bootstrap from gnulib
|
||||
output: update html javascripts
|
||||
release: 3.3
|
||||
|
||||
luisδμ (1):
|
||||
fix: avoid generation of unvalid JSON in summary
|
||||
|
||||
Version 3.2
|
||||
Jean Benoit (1):
|
||||
contrib: snmptest.pl SNMPwalk can't access to all variables/wrong sort
|
||||
|
||||
Sami Kerola (5):
|
||||
contrib: point out where one can find zabbix template
|
||||
build-sys: update .gitignore files
|
||||
config: remove unnecessary padding
|
||||
build-sys: autotools and gnulib related updates
|
||||
build-sys: routine update
|
||||
release: 3.2
|
||||
|
||||
Version 3.1
|
||||
Mark Sangster (1):
|
||||
output: fix warn and crit counts on shared networks
|
||||
|
||||
Sami Kerola (31):
|
||||
webpage: add instructions how to get output you need
|
||||
build-sys: add coverage files to .gitignore
|
||||
tests: improve coverage
|
||||
docs: fix peoples name in THANKS file to have correct characters
|
||||
add .mailmap
|
||||
output: fix implicit conversion
|
||||
main: simplify option parsing
|
||||
fix typo
|
||||
main: move print_mac_addreses to state structure
|
||||
main: move output_format to state, and rename color_format
|
||||
webpages: use html sample output
|
||||
fix switch missing default case warnings
|
||||
sort: ensure NaN will not trip over comp_double()
|
||||
drop images, java scripts, and such from web sitemap file
|
||||
getdata: remote dead code
|
||||
other: use strftime() to generate date-time string
|
||||
lib: update .gitignore
|
||||
fix typos
|
||||
various: fix few warnings
|
||||
warnings: ensure optimal packing in structures
|
||||
other: use IP string lengths from netinet/in.h
|
||||
mustach: sync with most recent mustach upstream changes
|
||||
various: tidy up variable scopes, and one name mismatch
|
||||
build-sys: update .gitignore files
|
||||
output: add warning and critical threshold counts to mustach
|
||||
samples: make prometheus template less klunky
|
||||
misc: fix spelling issues
|
||||
output: add ethernet address priting support to --mustach
|
||||
build-sys: update bootstrap from gnulib
|
||||
output: update javascripts
|
||||
release: 3.1
|
||||
|
||||
Version 3.0
|
||||
Sami Kerola (56):
|
||||
|
|
|
|||
4
README
4
README
|
|
@ -28,7 +28,7 @@ Quick start.
|
|||
|
||||
Dependencies to other projects.
|
||||
|
||||
http://www.gnu.org/software/gnulib/
|
||||
https://www.gnu.org/software/gnulib/
|
||||
|
||||
You can avoid repeated gnulib downloads by setting
|
||||
GNULIB_SRCDIR environment variable. For example:
|
||||
|
|
@ -39,7 +39,7 @@ Dependencies to other projects.
|
|||
Assumign detached gnulib please remember to git pull the
|
||||
latest updates before building dhcpd-pools.
|
||||
|
||||
http://uthash.sourceforge.net/
|
||||
https://troydhanson.github.io/uthash/
|
||||
|
||||
See quick start.
|
||||
|
||||
|
|
|
|||
23
THANKS
23
THANKS
|
|
@ -5,23 +5,23 @@ Project is maintained by Sami Kerola <kerolasa@iki.fi>
|
|||
People who reported problems, give improvement suggestions or even
|
||||
contributed code.
|
||||
|
||||
Otto J. Mäkelä
|
||||
Otto J. Mäkelä
|
||||
Mika Paananen
|
||||
Frank Bulk
|
||||
Roar Pettersen
|
||||
Jeff Wieland
|
||||
Rusty
|
||||
Fredrik Vöcks
|
||||
Fredrik Vöcks
|
||||
Dan Thorson
|
||||
Stian Øvrevåge
|
||||
Stian Øvrevåge
|
||||
Dominic Germain
|
||||
Anders Låstad
|
||||
Anders Låstad
|
||||
Thor Eivind Brantzeg
|
||||
Ahmed AL Dakhil
|
||||
Adam Ciarcinski
|
||||
Rezso Gajdóczy
|
||||
Rezső Gajdóczy
|
||||
Robert Viou
|
||||
Enno Gröper
|
||||
Enno Gröper
|
||||
Troy D. Hanson
|
||||
Ryan Malek
|
||||
Cheer Xiao
|
||||
|
|
@ -30,7 +30,7 @@ Helmut Grohne
|
|||
Joey D.
|
||||
Ryan Steinmetz
|
||||
Dan Pritts
|
||||
Fredrik Lysén
|
||||
Fredrik Lysén
|
||||
Conor McCarthy
|
||||
Wolfgang Steudel
|
||||
Aaron Paetznick
|
||||
|
|
@ -44,4 +44,11 @@ Klaus Slott
|
|||
Boris Lytochkin
|
||||
Jeff Bailey
|
||||
José Bollo
|
||||
Sebastián Cramatte
|
||||
Sebastián Cramatte
|
||||
Mark Sangster
|
||||
Brent Swingle
|
||||
Mathieu Morier
|
||||
Jean Benoit
|
||||
Belkacem Daheb
|
||||
Björn Lässig
|
||||
Luisδμ
|
||||
|
|
|
|||
|
|
@ -1,10 +1,10 @@
|
|||
# Bootstrap configuration.
|
||||
# Bootstrap configuration. -*- sh -*-
|
||||
|
||||
# Copyright (C) 2006-2017 Free Software Foundation, Inc.
|
||||
# Copyright (C) 2006-2025 Free Software Foundation, Inc.
|
||||
|
||||
# This program is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation; either version 3 of the License, or
|
||||
# the Free Software Foundation, either version 3 of the License, or
|
||||
# (at your option) any later version.
|
||||
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
|
|
@ -13,7 +13,7 @@
|
|||
# GNU General Public License for more details.
|
||||
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
# along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
|
||||
# gnulib modules used by this package.
|
||||
|
|
@ -64,7 +64,7 @@ XGETTEXT_OPTIONS=$XGETTEXT_OPTIONS'\\\
|
|||
gettext_external=0
|
||||
grep '^[ ]*AM_GNU_GETTEXT(external\>' configure.ac > /dev/null &&
|
||||
gettext_external=1
|
||||
grep '^[ ]*AM_GNU_GETTEXT(\[external\]' configure.ac > /dev/null &&
|
||||
grep '^[ ]*AM_GNU_GETTEXT(\[external]' configure.ac > /dev/null &&
|
||||
gettext_external=1
|
||||
|
||||
if test $gettext_external = 1; then
|
||||
|
|
|
|||
1
build-aux/.gitignore
vendored
1
build-aux/.gitignore
vendored
|
|
@ -1,6 +1,7 @@
|
|||
/ar-lib
|
||||
/compile
|
||||
/config.guess
|
||||
/config.rpath
|
||||
/config.sub
|
||||
/depcomp
|
||||
/install-sh
|
||||
|
|
|
|||
|
|
@ -1,12 +1,12 @@
|
|||
#!/bin/sh
|
||||
# Print a version string.
|
||||
scriptversion=2012-12-31.23; # UTC
|
||||
scriptversion=2022-01-27.18; # UTC
|
||||
|
||||
# Copyright (C) 2007-2013 Free Software Foundation, Inc.
|
||||
# Copyright (C) 2007-2022 Free Software Foundation, Inc.
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation; either version 3 of the License, or
|
||||
# the Free Software Foundation, either version 3 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
|
|
@ -15,9 +15,9 @@ scriptversion=2012-12-31.23; # UTC
|
|||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
# along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
# This script is derived from GIT-VERSION-GEN from GIT: http://git.or.cz/.
|
||||
# This script is derived from GIT-VERSION-GEN from GIT: https://git-scm.com/.
|
||||
# It may be run two ways:
|
||||
# - from a git repository in which the "git describe" command below
|
||||
# produces useful output (thus requiring at least one signed tag)
|
||||
|
|
@ -65,19 +65,21 @@ scriptversion=2012-12-31.23; # UTC
|
|||
# EXTRA_DIST = $(top_srcdir)/.version
|
||||
# BUILT_SOURCES = $(top_srcdir)/.version
|
||||
# $(top_srcdir)/.version:
|
||||
# echo $(VERSION) > $@-t && mv $@-t $@
|
||||
# echo '$(VERSION)' > $@-t
|
||||
# mv $@-t $@
|
||||
# dist-hook:
|
||||
# echo $(VERSION) > $(distdir)/.tarball-version
|
||||
# echo '$(VERSION)' > $(distdir)/.tarball-version
|
||||
|
||||
|
||||
me=$0
|
||||
|
||||
year=`expr "$scriptversion" : '\([^-]*\)'`
|
||||
version="git-version-gen $scriptversion
|
||||
|
||||
Copyright 2011 Free Software Foundation, Inc.
|
||||
There is NO warranty. You may redistribute this software
|
||||
under the terms of the GNU General Public License.
|
||||
For more information about these matters, see the files named COPYING."
|
||||
Copyright (C) ${year} Free Software Foundation, Inc.
|
||||
License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>.
|
||||
This is free software: you are free to change and redistribute it.
|
||||
There is NO WARRANTY, to the extent permitted by law."
|
||||
|
||||
usage="\
|
||||
Usage: $me [OPTION]... \$srcdir/.tarball-version [TAG-NORMALIZATION-SED-SCRIPT]
|
||||
|
|
@ -85,8 +87,9 @@ Print a version string.
|
|||
|
||||
Options:
|
||||
|
||||
--prefix prefix of git tags (default 'v')
|
||||
--fallback fallback version to use if \"git --version\" fails
|
||||
--prefix PREFIX prefix of git tags (default 'v')
|
||||
--fallback VERSION
|
||||
fallback version to use if \"git --version\" fails
|
||||
|
||||
--help display this help and exit
|
||||
--version output version information and exit
|
||||
|
|
@ -100,8 +103,8 @@ while test $# -gt 0; do
|
|||
case $1 in
|
||||
--help) echo "$usage"; exit 0;;
|
||||
--version) echo "$version"; exit 0;;
|
||||
--prefix) shift; prefix="$1";;
|
||||
--fallback) shift; fallback="$1";;
|
||||
--prefix) shift; prefix=${1?};;
|
||||
--fallback) shift; fallback=${1?};;
|
||||
-*)
|
||||
echo "$0: Unknown option '$1'." >&2
|
||||
echo "$0: Try '--help' for more information." >&2
|
||||
|
|
@ -140,11 +143,9 @@ then
|
|||
v=`cat $tarball_version_file` || v=
|
||||
case $v in
|
||||
*$nl*) v= ;; # reject multi-line output
|
||||
[0-9]*) ;;
|
||||
*) v= ;;
|
||||
esac
|
||||
test "x$v" = x \
|
||||
&& echo "$0: WARNING: $tarball_version_file is missing or damaged" 1>&2
|
||||
&& echo "$0: WARNING: $tarball_version_file is damaged" 1>&2
|
||||
fi
|
||||
|
||||
if test "x$v" != x
|
||||
|
|
@ -166,9 +167,10 @@ then
|
|||
# tag or the previous older version that did not?
|
||||
# Newer: v6.10-77-g0f8faeb
|
||||
# Older: v6.10-g0f8faeb
|
||||
case $v in
|
||||
*-*-*) : git describe is okay three part flavor ;;
|
||||
*-*)
|
||||
vprefix=`expr "X$v" : 'X\(.*\)-g[^-]*$'` || vprefix=$v
|
||||
case $vprefix in
|
||||
*-*) : git describe is probably okay three part flavor ;;
|
||||
*)
|
||||
: git describe is older two part flavor
|
||||
# Recreate the number of commits and rewrite such that the
|
||||
# result is the same as if we were using the newer version
|
||||
|
|
@ -183,9 +185,9 @@ then
|
|||
;;
|
||||
esac
|
||||
|
||||
# Change the first '-' to a '.', so version-comparing tools work properly.
|
||||
# Remove the "g" in git describe's output string, to save a byte.
|
||||
v=`echo "$v" | sed 's/-/./;s/\(.*\)-g/\1-/'`;
|
||||
# Change the penultimate "-" to ".", for version-comparing tools.
|
||||
# Remove the "g" to save a byte.
|
||||
v=`echo "$v" | sed 's/-\([^-]*\)-g\([^-]*\)$/.\1-\2/'`;
|
||||
v_from_git=1
|
||||
elif test "x$fallback" = x || git --version >/dev/null 2>&1; then
|
||||
v=UNKNOWN
|
||||
|
|
@ -214,12 +216,12 @@ if test "x$v_from_git" != x; then
|
|||
fi
|
||||
|
||||
# Omit the trailing newline, so that m4_esyscmd can use the result directly.
|
||||
echo "$v" | tr -d "$nl"
|
||||
printf %s "$v"
|
||||
|
||||
# Local variables:
|
||||
# eval: (add-hook 'write-file-hooks 'time-stamp)
|
||||
# eval: (add-hook 'before-save-hook 'time-stamp)
|
||||
# time-stamp-start: "scriptversion="
|
||||
# time-stamp-format: "%:y-%02m-%02d.%02H"
|
||||
# time-stamp-time-zone: "UTC"
|
||||
# time-stamp-time-zone: "UTC0"
|
||||
# time-stamp-end: "; # UTC"
|
||||
# End:
|
||||
|
|
|
|||
|
|
@ -2,11 +2,11 @@
|
|||
# Process this file with autoconf to produce a configure script.
|
||||
|
||||
AC_PREREQ([2.69])
|
||||
AC_CONFIG_MACRO_DIR([m4])
|
||||
AC_CONFIG_MACRO_DIRS([m4])
|
||||
AC_INIT([dhcpd-pools],
|
||||
[m4_esyscmd([build-aux/git-version-gen .tarball-version])],
|
||||
[kerolasa@iki.fi],[],
|
||||
[http://dhcpd-pools.sourceforge.net/])
|
||||
[https://dhcpd-pools.sourceforge.net/])
|
||||
PACKAGE_MAINTAINER="Sami Kerola"
|
||||
AC_SUBST([PACKAGE_MAINTAINER])
|
||||
AC_CONFIG_AUX_DIR([build-aux])
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@ pkgver=0
|
|||
pkgrel=1
|
||||
pkgdesc="ISC dhcpd lease status utility"
|
||||
arch=('i686' 'x86_64')
|
||||
url=http://dhcpd-pools.sourceforge.net/
|
||||
url=https://dhcpd-pools.sourceforge.net/
|
||||
license=('BSD')
|
||||
depends=('pacman')
|
||||
makedepends=('uthash' 'git')
|
||||
|
|
|
|||
|
|
@ -23,9 +23,10 @@
|
|||
# you set $dbg to 1 then output will be generated in /tmp.
|
||||
|
||||
use strict;
|
||||
use NetSNMP::OID;
|
||||
|
||||
# Version info:
|
||||
my $SNMPver = "snmp1.0";
|
||||
my $SNMPver = "snmp1.1";
|
||||
my $DHCPver = "dhcp1.0";
|
||||
my $VERSION = "$SNMPver/$DHCPver";
|
||||
#
|
||||
|
|
@ -193,7 +194,7 @@ sub ParseDataFile () {
|
|||
}
|
||||
close IN;
|
||||
if ($dbg) {
|
||||
foreach (sort @validoidlist) { print DBG "ValidOID: $_\n"; }
|
||||
foreach (sort Oidcmp @validoidlist) { print DBG "ValidOID: $_\n"; }
|
||||
}
|
||||
|
||||
if ($dbg) {
|
||||
|
|
@ -370,7 +371,7 @@ sub GetData ($) {
|
|||
|
||||
@userquery = split (/\./, $userqueryoid);
|
||||
my $found = 0;
|
||||
foreach (sort @validoidlist) {
|
||||
foreach (sort Oidcmp @validoidlist) {
|
||||
$next = $_;
|
||||
print DBG "Comparing $userqueryoid vs. $_\n" if $dbg;
|
||||
@validoid = split (/\./, $_);
|
||||
|
|
@ -432,6 +433,12 @@ sub Pong {
|
|||
$line = 0;
|
||||
}
|
||||
|
||||
sub Oidcmp {
|
||||
my $oida = new NetSNMP::OID($a);
|
||||
my $oidb = new NetSNMP::OID($b);
|
||||
snmp_oid_compare($oida, $oidb);
|
||||
}
|
||||
|
||||
################################## START ##################################
|
||||
#
|
||||
# Main
|
||||
|
|
|
|||
4
contrib/zabbix.txt
Normal file
4
contrib/zabbix.txt
Normal file
|
|
@ -0,0 +1,4 @@
|
|||
Zabbix 5 template, and instructions how to use it, can be found from
|
||||
Mathieu's repository.
|
||||
|
||||
https://github.com/mmorier86/dhcpd-pools-zabbix-template
|
||||
186
lib/.gitignore
vendored
186
lib/.gitignore
vendored
|
|
@ -1,37 +1,40 @@
|
|||
/*.lo
|
||||
/.libs/
|
||||
/Makefile.am
|
||||
/_Noreturn.h
|
||||
/alloca.h
|
||||
/alloca.in.h
|
||||
/arg-nonnull.h
|
||||
/arpa/inet.h
|
||||
/arpa/
|
||||
/arpa_inet.c
|
||||
/arpa_inet.in.h
|
||||
/assert.in.h
|
||||
/attribute.h
|
||||
/basename-lgpl.c
|
||||
/c++defs.h
|
||||
/basename-lgpl.h
|
||||
/c32is-impl.h
|
||||
/c32isprint.c
|
||||
/calloc.c
|
||||
/c-ctype.c
|
||||
/c-ctype.h
|
||||
/c-strcase.h
|
||||
/c-strcasecmp.c
|
||||
/c-strcaseeq.h
|
||||
/c-strncasecmp.c
|
||||
/charset.alias
|
||||
/close-stream.c
|
||||
/close-stream.h
|
||||
/c++defs.h
|
||||
/cdefs.h
|
||||
/cloexec.c
|
||||
/cloexec.h
|
||||
/close.c
|
||||
/closeout.c
|
||||
/closeout.h
|
||||
/config.charset
|
||||
/configmake.h
|
||||
/dirname-lgpl.c
|
||||
/dirname.h
|
||||
/dosname.h
|
||||
/close-stream.c
|
||||
/close-stream.h
|
||||
/c-strcasecmp.c
|
||||
/c-strcaseeq.h
|
||||
/c-strcase.h
|
||||
/c-strncasecmp.c
|
||||
/dup2.c
|
||||
/errno.in.h
|
||||
/error.c
|
||||
/error.h
|
||||
/error.in.h
|
||||
/exitfail.c
|
||||
/exitfail.h
|
||||
/fclose.c
|
||||
/fcntl.c
|
||||
/fcntl.h
|
||||
/fcntl.in.h
|
||||
/fd-hook.c
|
||||
|
|
@ -40,8 +43,9 @@
|
|||
/fflush.c
|
||||
/filename.h
|
||||
/flexmember.h
|
||||
/float+.h
|
||||
/float.c
|
||||
/float+.h
|
||||
/float.h
|
||||
/float.in.h
|
||||
/fopen.c
|
||||
/fpending.c
|
||||
|
|
@ -49,126 +53,210 @@
|
|||
/fpurge.c
|
||||
/freading.c
|
||||
/freading.h
|
||||
/free.c
|
||||
/fseek.c
|
||||
/fseeko.c
|
||||
/fstat.c
|
||||
/ftell.c
|
||||
/ftello.c
|
||||
/getdtablesize.c
|
||||
/getlocalename_l-unsafe.c
|
||||
/getlocalename_l-unsafe.h
|
||||
/getopt1.c
|
||||
/getopt.c
|
||||
/getopt-cdefs.in.h
|
||||
/getopt-core.h
|
||||
/getopt-ext.h
|
||||
/getopt.in.h
|
||||
/getopt_int.h
|
||||
/getopt-pfx-core.h
|
||||
/getopt-pfx-ext.h
|
||||
/getopt.c
|
||||
/getopt.in.h
|
||||
/getopt1.c
|
||||
/getopt_int.h
|
||||
/getprogname.c
|
||||
/getprogname.h
|
||||
/gettext.h
|
||||
/hard-locale.c
|
||||
/hard-locale.h
|
||||
/ialloc.c
|
||||
/ialloc.h
|
||||
/idx.h
|
||||
/inet_pton.c
|
||||
/intprops.h
|
||||
/intprops-internal.h
|
||||
/inttypes.h
|
||||
/inttypes.in.h
|
||||
/isnan.c
|
||||
/isnand.c
|
||||
/isnanf.c
|
||||
/isnanl.c
|
||||
/itold.c
|
||||
/lc-charset-dispatch.c
|
||||
/lc-charset-dispatch.h
|
||||
/libc-config.h
|
||||
/libdhcpd_pools.la
|
||||
/libdhcpd_pools_la-arpa_inet.lo
|
||||
/libdhcpd_pools_la-basename-lgpl.lo
|
||||
/libdhcpd_pools_la-c32isprint.lo
|
||||
/libdhcpd_pools_la-c-ctype.lo
|
||||
/libdhcpd_pools_la-cloexec.lo
|
||||
/libdhcpd_pools_la-closeout.lo
|
||||
/libdhcpd_pools_la-close-stream.lo
|
||||
/libdhcpd_pools_la-c-strcasecmp.lo
|
||||
/libdhcpd_pools_la-exitfail.lo
|
||||
/libdhcpd_pools_la-fclose.lo
|
||||
/libdhcpd_pools_la-fcntl.lo
|
||||
/libdhcpd_pools_la-fd-hook.lo
|
||||
/libdhcpd_pools_la-fflush.lo
|
||||
/libdhcpd_pools_la-float.lo
|
||||
/libdhcpd_pools_la-fopen.lo
|
||||
/libdhcpd_pools_la-fpurge.lo
|
||||
/libdhcpd_pools_la-freading.lo
|
||||
/libdhcpd_pools_la-fseek.lo
|
||||
/libdhcpd_pools_la-fseeko.lo
|
||||
/libdhcpd_pools_la-getprogname.lo
|
||||
/libdhcpd_pools_la-hard-locale.lo
|
||||
/libdhcpd_pools_la-ialloc.lo
|
||||
/libdhcpd_pools_la-localcharset.lo
|
||||
/libdhcpd_pools_la-malloca.lo
|
||||
/libdhcpd_pools_la-math.lo
|
||||
/libdhcpd_pools_la-mbrtoc32.lo
|
||||
/libdhcpd_pools_la-mbrtowc.lo
|
||||
/libdhcpd_pools_la-mbszero.lo
|
||||
/libdhcpd_pools_la-mktime.lo
|
||||
/libdhcpd_pools_la-nstrftime.lo
|
||||
/libdhcpd_pools_la-progname.lo
|
||||
/libdhcpd_pools_la-quotearg.lo
|
||||
/libdhcpd_pools_la-reallocarray.lo
|
||||
/libdhcpd_pools_la-realloc.lo
|
||||
/libdhcpd_pools_la-setlocale_null.lo
|
||||
/libdhcpd_pools_la-setlocale_null-unlocked.lo
|
||||
/libdhcpd_pools_la-stat-time.lo
|
||||
/libdhcpd_pools_la-stdlib.lo
|
||||
/libdhcpd_pools_la-sys_socket.lo
|
||||
/libdhcpd_pools_la-timegm.lo
|
||||
/libdhcpd_pools_la-time_rz.lo
|
||||
/libdhcpd_pools_la-unistd.lo
|
||||
/libdhcpd_pools_la-wctype-h.lo
|
||||
/libdhcpd_pools_la-xalloc-die.lo
|
||||
/libdhcpd_pools_la-xmalloc.lo
|
||||
/.libs/
|
||||
/limits.h
|
||||
/limits.in.h
|
||||
/localcharset.c
|
||||
/localcharset.h
|
||||
/localtime-buffer.c
|
||||
/localtime-buffer.h
|
||||
/locale.h
|
||||
/locale.in.h
|
||||
/localename.h
|
||||
/localename-unsafe.c
|
||||
/lseek.c
|
||||
/malloc.c
|
||||
/Makefile.am
|
||||
/malloca.c
|
||||
/malloca.h
|
||||
/malloca.valgrind
|
||||
/malloc.c
|
||||
/math.c
|
||||
/math.h
|
||||
/math.in.h
|
||||
/mbrtoc32.c
|
||||
/mbrtowc.c
|
||||
/mbrtowc-impl.h
|
||||
/mbrtowc-impl-utf8.h
|
||||
/mbsinit.c
|
||||
/mbszero.c
|
||||
/mbtowc-lock.c
|
||||
/mbtowc-lock.h
|
||||
/memchr.c
|
||||
/memchr.valgrind
|
||||
/minmax.h
|
||||
/mktime-internal.h
|
||||
/mktime.c
|
||||
/mktime-internal.h
|
||||
/msvc-inval.c
|
||||
/msvc-inval.h
|
||||
/msvc-nothrow.c
|
||||
/msvc-nothrow.h
|
||||
/netinet_in.in.h
|
||||
/_Noreturn.h
|
||||
/nstrftime.c
|
||||
/open.c
|
||||
/pathmax.h
|
||||
/progname.c
|
||||
/progname.h
|
||||
/quote.h
|
||||
/quotearg.c
|
||||
/quotearg.h
|
||||
/quote.h
|
||||
/reallocarray.c
|
||||
/realloc.c
|
||||
/ref-add.sed
|
||||
/ref-add.sin
|
||||
/ref-del.sed
|
||||
/ref-del.sin
|
||||
/setenv.c
|
||||
/setlocale-lock.c
|
||||
/setlocale_null.c
|
||||
/setlocale_null.h
|
||||
/setlocale_null-unlocked.c
|
||||
/stat.c
|
||||
/stat-time.c
|
||||
/stat-time.h
|
||||
/stat-w32.c
|
||||
/stat-w32.h
|
||||
/stat.c
|
||||
/stdalign.in.h
|
||||
/stdbool.in.h
|
||||
/stdckdint.h
|
||||
/stdckdint.in.h
|
||||
/stddef.h
|
||||
/stddef.in.h
|
||||
/stdint.in.h
|
||||
/stdio-impl.h
|
||||
/stdio.h
|
||||
/stdio-impl.h
|
||||
/stdio.in.h
|
||||
/stdio-read.c
|
||||
/stdio-write.c
|
||||
/stdlib.c
|
||||
/stdlib.h
|
||||
/stdlib.in.h
|
||||
/stpncpy.c
|
||||
/str-two-way.h
|
||||
/strdup.c
|
||||
/streq.h
|
||||
/strerror.c
|
||||
/strerror-override.c
|
||||
/strerror-override.h
|
||||
/strerror.c
|
||||
/strftime.c
|
||||
/strftime.h
|
||||
/string.h
|
||||
/string.in.h
|
||||
/stripslash.c
|
||||
/strstr.c
|
||||
/strtod.c
|
||||
/sys/socket.h
|
||||
/sys/stat.h
|
||||
/sys/types.h
|
||||
/sys/uio.h
|
||||
/str-two-way.h
|
||||
/sys/
|
||||
/sys_socket.c
|
||||
/sys_socket.in.h
|
||||
/sys_stat.in.h
|
||||
/sys_types.in.h
|
||||
/sys_uio.in.h
|
||||
/time-internal.h
|
||||
/timegm.c
|
||||
/time.h
|
||||
/time.in.h
|
||||
/time-internal.h
|
||||
/time_r.c
|
||||
/time_rz.c
|
||||
/timegm.c
|
||||
/tzset.c
|
||||
/uchar.h
|
||||
/uchar.in.h
|
||||
/unictype/
|
||||
/unictype/bitmap.h
|
||||
/unictype/ctype_print.c
|
||||
/unictype/ctype_print.h
|
||||
/unictype/.gitignore
|
||||
/unictype.h
|
||||
/unictype.in.h
|
||||
/unistd.c
|
||||
/unistd.h
|
||||
/unistd.in.h
|
||||
/unitypes.h
|
||||
/unitypes.in.h
|
||||
/unsetenv.c
|
||||
/unused-parameter.h
|
||||
/verify.h
|
||||
/warn-on-use.h
|
||||
/wchar.h
|
||||
/wchar.in.h
|
||||
/wctype-h.c
|
||||
/wctype.h
|
||||
/wctype-h.c
|
||||
/wctype.in.h
|
||||
/windows-initguard.h
|
||||
/xalloc-die.c
|
||||
/xalloc-oversized.h
|
||||
/xalloc.h
|
||||
/xalloc-oversized.h
|
||||
/xmalloc.c
|
||||
|
|
|
|||
|
|
@ -1,4 +1,5 @@
|
|||
.TH DHCPD-POOLS "1" "2017-11-15" "@VERSION@" "User Commands"
|
||||
'\" t
|
||||
.TH DHCPD-POOLS "1" "2024-08-09" "@VERSION@" "User Commands"
|
||||
.SH NAME
|
||||
dhcpd-pools \- ISC dhcpd pools usage analysis
|
||||
.SH SYNOPSIS
|
||||
|
|
@ -156,7 +157,7 @@ printed.
|
|||
.TP
|
||||
\fB\-\-color\fR=\fIwhen\fR
|
||||
Use yellow for warning, red for critical, green for suppressed by \-\-minsize
|
||||
and blue when \-\-snet\-alarms is the cause of supression or shared network
|
||||
and blue when \-\-snet\-alarms is the cause of suppression or shared network
|
||||
does not have any ranges. The
|
||||
.I when
|
||||
string can be
|
||||
|
|
@ -183,7 +184,7 @@ can be one of the following:
|
|||
.IR minsize ,
|
||||
or
|
||||
.IR suppressed .
|
||||
The skipping criterias are exact match with colors in \-\-color option.
|
||||
The skipping criteria is exact match with colors in \-\-color option.
|
||||
.TP
|
||||
\fB\-\-warning\fR=\fIpercent\fR
|
||||
Turn on alarm output format, and specify percentage number which will
|
||||
|
|
|
|||
|
|
@ -3,9 +3,9 @@
|
|||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"
|
||||
xmlns:foaf="http://xmlns.com/foaf/0.1/">
|
||||
<Project rdf:about="http://dhcpd-pools.sourceforge.net/">
|
||||
<Project rdf:about="https://dhcpd-pools.sourceforge.net/">
|
||||
<name>dhcpd-pools</name>
|
||||
<homepage rdf:resource="http://dhcpd-pools.sourceforge.net/" />
|
||||
<homepage rdf:resource="https://dhcpd-pools.sourceforge.net/" />
|
||||
<shortdesc>This is dhcpd-pools ISC dhcp shared network and pool
|
||||
range usage analysis tool.</shortdesc>
|
||||
<description>Purpose of command is to count usage ratio of each
|
||||
|
|
|
|||
|
|
@ -1,3 +1,6 @@
|
|||
Ethernets:{{#active_lease}}
|
||||
macaddress: {{macaddress}} ip: {{ip}}{{/active_lease}}
|
||||
|
||||
Subnets:{{#subnets}}
|
||||
location: {{location}}
|
||||
range: {{range}}
|
||||
|
|
@ -65,3 +68,9 @@ lease_file_epoch_mtime: {{lease_file_epoch_mtime}}
|
|||
template_file_path: {{template_file_path}}
|
||||
template_file_local_mtime: {{template_file_local_mtime}}
|
||||
template_file_epoch_mtime: {{template_file_epoch_mtime}}
|
||||
|
||||
number_of_ranges_warning: {{number_of_ranges_warning}}
|
||||
number_of_ranges_critical: {{number_of_ranges_critical}}
|
||||
number_of_shared_networks: {{number_of_shared_networks}}
|
||||
number_of_shared_networks_warning: {{number_of_shared_networks_warning}}
|
||||
number_of_shared_networks_critical: {{number_of_shared_networks_critical}}
|
||||
|
|
|
|||
|
|
@ -1,30 +1,11 @@
|
|||
# This mustach template can be used as Prometheus text file.
|
||||
# https://prometheus.io/
|
||||
|
||||
# HELP dhcpd_pools_ranges The range statistics.
|
||||
# TYPE dhcpd_pools_ranges gauge
|
||||
{{#subnets}}dhcpd_pools_ranges{range="{{first_ip}}",used="1"} {{used}} {{gettimeofday}}000
|
||||
dhcpd_pools_ranges{range="{{first_ip}}",touched="1"} {{touched}} {{gettimeofday}}000
|
||||
dhcpd_pools_ranges{range="{{first_ip}}",defined="1"} {{defined}} {{gettimeofday}}000
|
||||
dhcpd_pools_ranges{range="{{first_ip}}",free="1"} {{free}} {{gettimeofday}}000
|
||||
dhcpd_pools_ranges{range="{{first_ip}}",touch_count="1"} {{touch_count}} {{gettimeofday}}000
|
||||
dhcpd_pools_ranges{range="{{first_ip}}",status="1"} {{status}} {{gettimeofday}}000
|
||||
# HELP dhcpd_pools ISC dhcpd statistics
|
||||
# TYPE dhcpd_pools gauge
|
||||
{{#subnets}}dhcpd_pools{location="{{location}}",range="{{first_ip}}",used="1"} {{used}} {{gettimeofday}}000
|
||||
dhcpd_pools{location="{{location}}",range="{{first_ip}}",touched="1"} {{touched}} {{gettimeofday}}000
|
||||
dhcpd_pools{location="{{location}}",range="{{first_ip}}",defined="1"} {{defined}} {{gettimeofday}}000
|
||||
dhcpd_pools{location="{{location}}",range="{{first_ip}}",free="1"} {{free}} {{gettimeofday}}000
|
||||
dhcpd_pools{location="{{location}}",range="{{first_ip}}",touch_count="1"} {{touch_count}} {{gettimeofday}}000
|
||||
dhcpd_pools{location="{{location}}",range="{{first_ip}}",status="1"} {{status}} {{gettimeofday}}000
|
||||
{{/subnets}}
|
||||
# HELP dhcpd_pools_shared_nets The shared networks statistics.
|
||||
# TYPE dhcpd_pools_shared_nets gauge
|
||||
{{#shared-networks}}dhcpd_pools_shared_nets{location="{{location}}",defined="1"} {{defined}} {{gettimeofday}}000
|
||||
dhcpd_pools_shared_nets{location="{{location}}",used="1"} {{used}} {{gettimeofday}}000
|
||||
dhcpd_pools_shared_nets{location="{{location}}",touched="1"} {{touched}} {{gettimeofday}}000
|
||||
dhcpd_pools_shared_nets{location="{{location}}",free="1"} {{free}} {{gettimeofday}}000
|
||||
dhcpd_pools_shared_nets{location="{{location}}",touch_count="1"} {{touch_count}} {{gettimeofday}}000
|
||||
dhcpd_pools_shared_nets{location="{{location}}",status="1"} {{status}} {{gettimeofday}}000
|
||||
{{/shared-networks}}
|
||||
# HELP dhcpd_pools_summary Statistics of the all networks.
|
||||
# TYPE dhcpd_pools_summary gauge
|
||||
{{#summary}}dhcpd_pools_summary{location="{{location}}",defined="1"} {{defined}} {{gettimeofday}}000
|
||||
dhcpd_pools_summary{location="{{location}}",used="1"} {{used}} {{gettimeofday}}000
|
||||
dhcpd_pools_summary{location="{{location}}",touched="1"} {{touched}} {{gettimeofday}}000
|
||||
dhcpd_pools_summary{location="{{location}}",free="1"} {{free}} {{gettimeofday}}000
|
||||
dhcpd_pools_summary{location="{{location}}",touch_count="1"} {{touch_count}} {{gettimeofday}}000
|
||||
dhcpd_pools_summary{location="{{location}}",status="1"} {{status}} {{gettimeofday}}000
|
||||
{{/summary}}
|
||||
|
|
|
|||
|
|
@ -84,6 +84,8 @@ void do_counting(struct conf_t *state)
|
|||
case BACKUP:
|
||||
range_p->backups++;
|
||||
break;
|
||||
default:
|
||||
abort();
|
||||
}
|
||||
}
|
||||
/* Size of range size. */
|
||||
|
|
|
|||
|
|
@ -89,14 +89,14 @@ static void prepare_memory(struct conf_t *state)
|
|||
}
|
||||
|
||||
/*! \brief The --skip option argument parser. */
|
||||
static void skip_arg_parse(struct conf_t *state, char *optarg)
|
||||
static void skip_arg_parse(struct conf_t *state, char *arg)
|
||||
{
|
||||
enum {
|
||||
OPT_ARG_OK = 0,
|
||||
OPT_ARG_WARNING,
|
||||
OPT_ARG_CRITICAL,
|
||||
OPT_ARG_MINSIZE,
|
||||
OPT_ARG_SUPRESSED
|
||||
OPT_ARG_SUPPRESSED
|
||||
};
|
||||
|
||||
char *const tokens[] = {
|
||||
|
|
@ -104,13 +104,13 @@ static void skip_arg_parse(struct conf_t *state, char *optarg)
|
|||
[OPT_ARG_WARNING] = "warning",
|
||||
[OPT_ARG_CRITICAL] = "critical",
|
||||
[OPT_ARG_MINSIZE] = "minsize",
|
||||
[OPT_ARG_SUPRESSED] = "suppressed",
|
||||
[OPT_ARG_SUPPRESSED] = "suppressed",
|
||||
NULL
|
||||
};
|
||||
char *value;
|
||||
|
||||
while (*optarg != '\0') {
|
||||
switch (getsubopt(&optarg, tokens, &value)) {
|
||||
while (*arg != '\0') {
|
||||
switch (getsubopt(&arg, tokens, &value)) {
|
||||
case OPT_ARG_OK:
|
||||
state->skip_ok = 1;
|
||||
break;
|
||||
|
|
@ -123,7 +123,7 @@ static void skip_arg_parse(struct conf_t *state, char *optarg)
|
|||
case OPT_ARG_MINSIZE:
|
||||
state->skip_minsize = 1;
|
||||
break;
|
||||
case OPT_ARG_SUPRESSED:
|
||||
case OPT_ARG_SUPPRESSED:
|
||||
state->skip_suppressed = 1;
|
||||
break;
|
||||
default:
|
||||
|
|
@ -133,7 +133,7 @@ static void skip_arg_parse(struct conf_t *state, char *optarg)
|
|||
}
|
||||
|
||||
/*! \brief Command line options parser. */
|
||||
static char parse_command_line_opts(struct conf_t *state, int argc, char **argv)
|
||||
static void parse_command_line_opts(struct conf_t *state, int argc, char **argv)
|
||||
{
|
||||
enum {
|
||||
OPT_SNET_ALARMS = CHAR_MAX + 1,
|
||||
|
|
@ -172,7 +172,6 @@ static char parse_command_line_opts(struct conf_t *state, int argc, char **argv)
|
|||
{"ip-version", required_argument, NULL, OPT_SET_IPV},
|
||||
{NULL, 0, NULL, 0}
|
||||
};
|
||||
char output_format = '\0';
|
||||
int alarming = 0;
|
||||
|
||||
while (1) {
|
||||
|
|
@ -192,17 +191,17 @@ static char parse_command_line_opts(struct conf_t *state, int argc, char **argv)
|
|||
break;
|
||||
case 'f':
|
||||
/* Output format */
|
||||
output_format = optarg[0];
|
||||
state->output_format = optarg[0];
|
||||
break;
|
||||
case 's':
|
||||
{
|
||||
/* Output sorting option */
|
||||
struct output_sort *p = state->sorts;
|
||||
size_t len;
|
||||
char *ptr = optarg;
|
||||
|
||||
while (p && p->next)
|
||||
p = p->next;
|
||||
for (len = 0; len < strlen(optarg); len++) {
|
||||
while (*ptr) {
|
||||
if (state->sorts == NULL) {
|
||||
state->sorts =
|
||||
xcalloc(1, sizeof(struct output_sort));
|
||||
|
|
@ -211,7 +210,7 @@ static char parse_command_line_opts(struct conf_t *state, int argc, char **argv)
|
|||
p->next = xcalloc(1, sizeof(struct output_sort));
|
||||
p = p->next;
|
||||
}
|
||||
p->func = field_selector(optarg[len]);
|
||||
p->func = field_selector(*ptr++);
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
|
@ -231,7 +230,8 @@ static char parse_command_line_opts(struct conf_t *state, int argc, char **argv)
|
|||
case OPT_MUSTACH:
|
||||
#ifdef BUILD_MUSTACH
|
||||
state->mustach_template = optarg;
|
||||
output_format = 'm';
|
||||
state->output_format = 'm';
|
||||
state->print_mac_addreses = 1;
|
||||
#else
|
||||
error(EXIT_FAILURE, 0, "compiled without mustach support");
|
||||
#endif
|
||||
|
|
@ -312,16 +312,18 @@ static char parse_command_line_opts(struct conf_t *state, int argc, char **argv)
|
|||
}
|
||||
/* Output format is not defined, if alarm thresholds are then it's alarming, else use the
|
||||
* default. */
|
||||
if (output_format == '\0') {
|
||||
if (state->output_format == '\0') {
|
||||
if (alarming == 1)
|
||||
output_format = 'a';
|
||||
state->output_format = 'a';
|
||||
else {
|
||||
const char *const default_format = OUTPUT_FORMAT;
|
||||
|
||||
output_format = default_format[0];
|
||||
state->output_format = default_format[0];
|
||||
}
|
||||
}
|
||||
return output_format;
|
||||
if (state->output_format == 'X' || state->output_format == 'J') {
|
||||
state->print_mac_addreses = 1;
|
||||
}
|
||||
}
|
||||
|
||||
/*!\brief Start of execution. This will mostly call other functions one
|
||||
|
|
@ -339,33 +341,28 @@ int main(int argc, char **argv)
|
|||
.warn_count = 0x100000000, /* == 2^32 that is the entire IPv4 space */
|
||||
.crit_count = 0x100000000, /* basically turns off the count criteria */
|
||||
.header_limit = 8,
|
||||
.color_mode = color_auto,
|
||||
.ranges_size = 64,
|
||||
.ip_version = IPvUNKNOWN,
|
||||
0
|
||||
.color_mode = color_auto
|
||||
};
|
||||
char output_format;
|
||||
int ret_val;
|
||||
|
||||
atexit(close_stdout);
|
||||
set_program_name(argv[0]);
|
||||
prepare_memory(&state);
|
||||
set_ipv_functions(&state, IPvUNKNOWN);
|
||||
output_format = parse_command_line_opts(&state, argc, argv);
|
||||
parse_command_line_opts(&state, argc, argv);
|
||||
|
||||
/* Do the job */
|
||||
parse_config(&state, 1, state.dhcpdconf_file, state.shared_net_root);
|
||||
if (output_format == 'X' || output_format == 'J')
|
||||
parse_leases(&state, 1);
|
||||
else
|
||||
parse_leases(&state, 0);
|
||||
parse_leases(&state);
|
||||
prepare_data(&state);
|
||||
do_counting(&state);
|
||||
if (state.sorts != NULL)
|
||||
mergesort_ranges(&state, state.ranges, state.num_ranges, NULL, 1);
|
||||
if (state.reverse_order == 1)
|
||||
flip_ranges(&state);
|
||||
ret_val = output_analysis(&state, output_format);
|
||||
ret_val = output_analysis(&state);
|
||||
clean_up(&state);
|
||||
return (ret_val);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -102,6 +102,9 @@ enum prefix_t {
|
|||
PREFIX_BINDING_STATE_ACTIVE,
|
||||
PREFIX_BINDING_STATE_BACKUP,
|
||||
PREFIX_HARDWARE_ETHERNET,
|
||||
PREFIX_STARTS,
|
||||
PREFIX_ENDS,
|
||||
PREFIX_HOSTNAME,
|
||||
NUM_OF_PREFIX
|
||||
};
|
||||
|
||||
|
|
@ -125,8 +128,8 @@ struct shared_network_t {
|
|||
double used;
|
||||
double touched;
|
||||
double backups;
|
||||
int netmask;
|
||||
struct shared_network_t *next;
|
||||
int netmask;
|
||||
};
|
||||
|
||||
/*! \struct range_t
|
||||
|
|
@ -145,12 +148,22 @@ struct range_t {
|
|||
* \brief Various per range and shared net temporary calculation results.
|
||||
*/
|
||||
struct output_helper_t {
|
||||
int status;
|
||||
double range_size;
|
||||
double percent;
|
||||
double tc;
|
||||
double tcp;
|
||||
double bup;
|
||||
int status;
|
||||
};
|
||||
|
||||
/*! \struct status_counts_t
|
||||
* \brief Range and shared network alarming status counts.
|
||||
*/
|
||||
struct status_counts_t {
|
||||
unsigned int warning;
|
||||
unsigned int critical;
|
||||
unsigned int ok;
|
||||
unsigned int ignored;
|
||||
};
|
||||
|
||||
/*! \enum ltype
|
||||
|
|
@ -167,9 +180,12 @@ enum ltype {
|
|||
*/
|
||||
struct leases_t {
|
||||
union ipaddr_t ip; /* ip as key */
|
||||
enum ltype type;
|
||||
char *ethernet;
|
||||
UT_hash_handle hh;
|
||||
enum ltype type;
|
||||
char *ends;
|
||||
char *starts;
|
||||
char *hostname;
|
||||
};
|
||||
|
||||
/*! \enum limbits
|
||||
|
|
@ -209,12 +225,11 @@ struct conf_t {
|
|||
struct shared_network_t *shared_net_head; /*!< Last entry in shared network linked list. */
|
||||
struct range_t *ranges; /*!< Array of ranges. */
|
||||
unsigned int num_ranges; /*!< Number of ranges in the ranges array. */
|
||||
enum dhcp_version ip_version; /*!< Designator if the dhcpd is running in IPv4 or IPv6 mode. */
|
||||
size_t ranges_size; /*!< Size of the ranges array. */
|
||||
struct leases_t *leases; /*!< An array of individual leases from dhcpd.leases file. */
|
||||
enum dhcp_version ip_version; /*!< Designator if the dhcpd is running in IPv4 or IPv6 mode. */
|
||||
const char *dhcpdconf_file; /*!< Path to dhcpd.conf file. */
|
||||
const char *dhcpdlease_file; /*!< Path to dhcpd.leases file. */
|
||||
int output_format; /*!< Column to use in color_tags array. */
|
||||
struct output_sort *sorts; /*!< Linked list how to sort ranges. */
|
||||
const char *output_file; /*!< Output file path. */
|
||||
const char *mustach_template; /*!< Mustach template file path. */
|
||||
|
|
@ -223,7 +238,10 @@ struct conf_t {
|
|||
double warn_count; /*!< Maximum number of free IP's before warning. */
|
||||
double crit_count; /*!< Maximum number of free IP's before critical. */
|
||||
double minsize; /*!< Minimum size of range or shared network to be considered exceeding threshold. */
|
||||
unsigned int
|
||||
int color_format; /*!< Column to use in color_tags array. */
|
||||
char output_format; /*!< Output format, such as text, json, xml, .... */
|
||||
uint32_t
|
||||
print_mac_addreses:1, /*!< Print mac address in xml or json. */
|
||||
reverse_order:1, /*!< Reverse sort order. */
|
||||
backups_found:1, /*!< Indicator if dhcpd.leases file has leases in backup state. */
|
||||
snet_alarms:1, /*!< Suppress alarming thresholds for ranges that are part of a shared network. */
|
||||
|
|
@ -246,7 +264,7 @@ extern void prepare_data(struct conf_t *state);
|
|||
extern void do_counting(struct conf_t *state);
|
||||
|
||||
/* getdata.c */
|
||||
extern int parse_leases(struct conf_t *state, const int print_mac_addreses);
|
||||
extern int parse_leases(struct conf_t *state);
|
||||
extern void parse_config(struct conf_t *state, const int is_include,
|
||||
const char *restrict config_file,
|
||||
struct shared_network_t *restrict shared_p);
|
||||
|
|
@ -273,7 +291,7 @@ extern void set_ipv_functions(struct conf_t *state, int version);
|
|||
extern void flip_ranges(struct conf_t *state);
|
||||
extern void clean_up(struct conf_t *state);
|
||||
extern void parse_cidr(struct conf_t *state, struct range_t *range_p, const char *word);
|
||||
extern int parse_color_mode(const char *restrict optarg);
|
||||
extern int parse_color_mode(const char *restrict arg);
|
||||
extern double strtod_or_err(const char *restrict str, const char *restrict errmesg);
|
||||
extern void __attribute__ ((noreturn)) print_version(void);
|
||||
extern void __attribute__ ((noreturn)) usage(int status);
|
||||
|
|
@ -313,7 +331,9 @@ extern int range_output_helper(struct conf_t *state, struct output_helper_t *oh,
|
|||
struct range_t *range_p);
|
||||
extern int shnet_output_helper(struct conf_t *state, struct output_helper_t *oh,
|
||||
struct shared_network_t *shared_p);
|
||||
extern int output_analysis(struct conf_t *state, const char output_format);
|
||||
extern int output_analysis(struct conf_t *state);
|
||||
extern void range_alarms(struct conf_t *state, struct status_counts_t *rangstat);
|
||||
extern void shared_net_alarms(struct conf_t *state, struct status_counts_t *sharstat);
|
||||
|
||||
/* sort.c */
|
||||
extern void mergesort_ranges(struct conf_t *state,
|
||||
|
|
|
|||
|
|
@ -43,6 +43,7 @@
|
|||
#include <ctype.h>
|
||||
#include <errno.h>
|
||||
#include <fcntl.h>
|
||||
#include <limits.h>
|
||||
#include <netinet/in.h>
|
||||
#include <stddef.h>
|
||||
#include <stdint.h>
|
||||
|
|
@ -79,12 +80,11 @@ enum isc_conf_parser {
|
|||
|
||||
/*! \brief Lease file parser. The parser can only read ISC DHCPD
|
||||
* dhcpd.leases file format. */
|
||||
int parse_leases(struct conf_t *state, const int print_mac_addreses)
|
||||
int parse_leases(struct conf_t *state)
|
||||
{
|
||||
FILE *dhcpd_leases;
|
||||
char *line, *ipstring, macstring[20], *stop;
|
||||
char *line, *ipstring, macstring[20], *stop, endsstr[30], startsstr[30], hostnamestr[MAXLEN];
|
||||
union ipaddr_t addr;
|
||||
struct stat lease_file_stats;
|
||||
struct leases_t *lease;
|
||||
|
||||
dhcpd_leases = fopen(state->dhcpdlease_file, "r");
|
||||
|
|
@ -96,16 +96,13 @@ int parse_leases(struct conf_t *state, const int print_mac_addreses)
|
|||
error(EXIT_FAILURE, errno, "parse_leases: fadvise %s", state->dhcpdlease_file);
|
||||
# endif /* POSIX_FADV_SEQUENTIAL */
|
||||
#endif /* HAVE_POSIX_FADVISE */
|
||||
/* I found out that there's one lease address per 300 bytes in
|
||||
* 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(state->dhcpdlease_file, &lease_file_stats))
|
||||
error(EXIT_FAILURE, errno, "parse_leases: %s", state->dhcpdlease_file);
|
||||
line = xmalloc(sizeof(char) * MAXLEN);
|
||||
line[0] = '\0';
|
||||
ipstring = xmalloc(sizeof(char) * MAXLEN);
|
||||
ipstring[0] = '\0';
|
||||
endsstr[0] = '\0';
|
||||
startsstr[0] = '\0';
|
||||
hostnamestr[0] = '\0';
|
||||
while (!feof(dhcpd_leases)) {
|
||||
if (!fgets(line, MAXLEN, dhcpd_leases) && ferror(dhcpd_leases))
|
||||
error(EXIT_FAILURE, errno, "parse_leases: %s", state->dhcpdlease_file);
|
||||
|
|
@ -144,12 +141,39 @@ int parse_leases(struct conf_t *state, const int print_mac_addreses)
|
|||
state->backups_found = 1;
|
||||
break;
|
||||
case PREFIX_HARDWARE_ETHERNET:
|
||||
if (print_mac_addreses == 0)
|
||||
if (state->print_mac_addreses == 0)
|
||||
break;
|
||||
memcpy(macstring, line + 20, 17);
|
||||
macstring[17] = '\0';
|
||||
if ((lease = find_lease(state, &addr)) != NULL)
|
||||
if ((lease = find_lease(state, &addr)) != NULL) {
|
||||
lease->ethernet = xstrdup(macstring);
|
||||
lease->starts = xstrdup(startsstr);
|
||||
startsstr[0] = '\0';
|
||||
lease->ends = xstrdup(endsstr);
|
||||
endsstr[0] = '\0';
|
||||
}
|
||||
break;
|
||||
case PREFIX_ENDS:
|
||||
if (state->print_mac_addreses == 0)
|
||||
break;
|
||||
strncpy(endsstr, line + 7, sizeof(endsstr)-1);
|
||||
endsstr[strlen(endsstr)-2] = '\0';
|
||||
break;
|
||||
case PREFIX_STARTS:
|
||||
if (state->print_mac_addreses == 0)
|
||||
break;
|
||||
strncpy(startsstr, line + 9, sizeof(startsstr)-1);
|
||||
startsstr[strlen(startsstr)-2] = '\0';
|
||||
break;
|
||||
case PREFIX_HOSTNAME:
|
||||
if (state->print_mac_addreses == 0)
|
||||
break;
|
||||
strncpy(hostnamestr, line + 19, sizeof(hostnamestr)-1);
|
||||
hostnamestr[strlen(hostnamestr)-3] = '\0';
|
||||
if ((lease = find_lease(state, &addr)) != NULL) {
|
||||
lease->hostname = xstrdup(hostnamestr);
|
||||
}
|
||||
hostnamestr[0] = '\0';
|
||||
break;
|
||||
default:
|
||||
/* do nothing */ ;
|
||||
|
|
@ -217,8 +241,14 @@ void parse_config(struct conf_t *state, const int is_include, const char *restri
|
|||
shared_p->name = state->shared_net_root->name;
|
||||
/* Open configuration file */
|
||||
dhcpd_config = fopen(config_file, "r");
|
||||
if (dhcpd_config == NULL)
|
||||
if (dhcpd_config == NULL) {
|
||||
if (is_include) {
|
||||
error(0, errno, "cannot open inlude: %s", config_file);
|
||||
return;
|
||||
}
|
||||
/* config if from command line, just exit with error */
|
||||
error(EXIT_FAILURE, errno, "parse_config: %s", config_file);
|
||||
}
|
||||
#ifdef HAVE_POSIX_FADVISE
|
||||
# ifdef POSIX_FADV_SEQUENTIAL
|
||||
if (posix_fadvise(fileno(dhcpd_config), 0, 0, POSIX_FADV_SEQUENTIAL) != 0)
|
||||
|
|
@ -227,9 +257,11 @@ void parse_config(struct conf_t *state, const int is_include, const char *restri
|
|||
#endif /* HAVE_POSIX_FADVISE */
|
||||
/* Very hairy stuff begins. */
|
||||
while (unlikely(!feof(dhcpd_config))) {
|
||||
char c;
|
||||
int c;
|
||||
|
||||
c = fgetc(dhcpd_config);
|
||||
if (CHAR_MAX < c)
|
||||
continue;
|
||||
/* Certain characters are magical */
|
||||
switch (c) {
|
||||
/* Handle comments if they are not quoted */
|
||||
|
|
@ -324,7 +356,7 @@ void parse_config(struct conf_t *state, const int is_include, const char *restri
|
|||
/* Save to word which clause this is. */
|
||||
if ((newclause == 1 || argument != ITS_NOTHING_INTERESTING)
|
||||
&& (!isspace(c) || 0 < quote)) {
|
||||
word[i] = c;
|
||||
word[i] = (char) c;
|
||||
i++;
|
||||
/* Long word which is almost causing overflow. None
|
||||
* of words are this long which the program is
|
||||
|
|
@ -384,7 +416,7 @@ void parse_config(struct conf_t *state, const int is_include, const char *restri
|
|||
newclause = 1;
|
||||
break;
|
||||
case ITS_A_RANGE_FIRST_IP:
|
||||
/* printf ("range 1nd ip: %s\n", word); */
|
||||
/* printf ("range 1st ip: %s\n", word); */
|
||||
range_p = state->ranges + state->num_ranges;
|
||||
if (!(parse_ipaddr(state, word, &addr)))
|
||||
/* word was not ip, try again */
|
||||
|
|
|
|||
15
src/hash.c
15
src/hash.c
|
|
@ -66,6 +66,9 @@ void add_lease_v4(struct conf_t *state, union ipaddr_t *addr, enum ltype type)
|
|||
l->type = type;
|
||||
HASH_ADD_INT(state->leases, ip.v4, l);
|
||||
l->ethernet = NULL;
|
||||
l->ends = NULL;
|
||||
l->starts = NULL;
|
||||
l->hostname = NULL;
|
||||
}
|
||||
|
||||
void add_lease_v6(struct conf_t *state, union ipaddr_t *addr, enum ltype type)
|
||||
|
|
@ -77,6 +80,9 @@ void add_lease_v6(struct conf_t *state, union ipaddr_t *addr, enum ltype type)
|
|||
l->type = type;
|
||||
HASH_ADD_V6(state->leases, ip.v6, l);
|
||||
l->ethernet = NULL;
|
||||
l->ends = NULL;
|
||||
l->starts = NULL;
|
||||
l->hostname = NULL;
|
||||
}
|
||||
|
||||
/*! \brief Find pointer to lease from hash array.
|
||||
|
|
@ -110,6 +116,9 @@ struct leases_t *find_lease_v6(struct conf_t *state, union ipaddr_t *addr)
|
|||
void delete_lease(struct conf_t *state, struct leases_t *lease)
|
||||
{
|
||||
free(lease->ethernet);
|
||||
free(lease->ends);
|
||||
free(lease->starts);
|
||||
free(lease->hostname);
|
||||
HASH_DEL(state->leases, lease);
|
||||
free(lease);
|
||||
}
|
||||
|
|
@ -122,6 +131,9 @@ void delete_all_leases(struct conf_t *state)
|
|||
|
||||
HASH_ITER(hh, state->leases, l, tmp) {
|
||||
free(l->ethernet);
|
||||
free(l->ends);
|
||||
free(l->starts);
|
||||
free(l->hostname);
|
||||
HASH_DEL(state->leases, l);
|
||||
free(l);
|
||||
}
|
||||
|
|
@ -134,6 +146,9 @@ void delete_all_leases(struct conf_t *state)
|
|||
|
||||
l = state->leases;
|
||||
free(l->ethernet);
|
||||
free(l->ends);
|
||||
free(l->starts);
|
||||
free(l->hostname);
|
||||
HASH_DEL(state->leases, l); /* leases advances to next on delete */
|
||||
free(l);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -58,10 +58,12 @@
|
|||
*/
|
||||
struct expl {
|
||||
struct conf_t *state;
|
||||
struct leases_t *lease_p;
|
||||
struct range_t *range_p;
|
||||
struct shared_network_t *shnet_p;
|
||||
struct output_helper_t oh;
|
||||
int current;
|
||||
uint32_t pad;
|
||||
};
|
||||
|
||||
static int must_enter(void *closure, const char *name);
|
||||
|
|
@ -81,21 +83,45 @@ static int must_put_base(void *closure, const char *name, int escape
|
|||
fprintf(file, "%u", e->state->num_ranges);
|
||||
return 0;
|
||||
}
|
||||
if (!strcmp(name, "number_of_shared_networks")) {
|
||||
static uint32_t num = 0xffffffff;
|
||||
if (!strcmp(name, "number_of_ranges_warning")) {
|
||||
struct status_counts_t stat = { 0 };
|
||||
|
||||
if (num == 0xffffffff) {
|
||||
/* Use of static num ensures this is done only once. */
|
||||
range_alarms(e->state, &stat);
|
||||
fprintf(file, "%u", stat.warning);
|
||||
return 0;
|
||||
}
|
||||
if (!strcmp(name, "number_of_ranges_critical")) {
|
||||
struct status_counts_t stat = { 0 };
|
||||
|
||||
range_alarms(e->state, &stat);
|
||||
fprintf(file, "%u", stat.critical);
|
||||
return 0;
|
||||
}
|
||||
if (!strcmp(name, "number_of_shared_networks")) {
|
||||
uint32_t num = 0;
|
||||
struct shared_network_t *shared_p;
|
||||
|
||||
num = 0;
|
||||
for (shared_p = e->state->shared_net_root->next; shared_p;
|
||||
shared_p = shared_p->next)
|
||||
shared_p = shared_p->next) {
|
||||
num++;
|
||||
}
|
||||
fprintf(file, "%u", num);
|
||||
return 0;
|
||||
}
|
||||
if (!strcmp(name, "number_of_shared_networks_warning")) {
|
||||
struct status_counts_t stat = { 0 };
|
||||
|
||||
shared_net_alarms(e->state, &stat);
|
||||
fprintf(file, "%u", stat.warning);
|
||||
return 0;
|
||||
}
|
||||
if (!strcmp(name, "number_of_shared_networks_critical")) {
|
||||
struct status_counts_t stat = { 0 };
|
||||
|
||||
shared_net_alarms(e->state, &stat);
|
||||
fprintf(file, "%u", stat.critical);
|
||||
return 0;
|
||||
}
|
||||
if (!strcmp(name, "version")) {
|
||||
fprintf(file, "%s", PACKAGE_VERSION);
|
||||
return 0;
|
||||
|
|
@ -153,6 +179,36 @@ static struct mustach_itf itf = {
|
|||
.leave = must_leave
|
||||
};
|
||||
|
||||
/*! \brief Mustach active lease aka {{#active_lease}} tag parser and printer. */
|
||||
static int must_put_active_lease(void *closure, const char *name, int escape
|
||||
__attribute__((unused)), FILE *file)
|
||||
{
|
||||
struct expl *e = closure;
|
||||
|
||||
if (!strcmp(name, "ip")) {
|
||||
fprintf(file, "%s", ntop_ipaddr(&e->lease_p->ip));
|
||||
return 0;
|
||||
}
|
||||
if (!strcmp(name, "macaddress")) {
|
||||
fprintf(file, "%s", e->lease_p->ethernet);
|
||||
return 0;
|
||||
}
|
||||
error(EXIT_FAILURE, 0, "mustach_dhcpd_pools: fmustach: unexpected tag: %s", name);
|
||||
return 1;
|
||||
}
|
||||
|
||||
/*! \brief A function to move to next lease when {{/active_lease}} is encountered. */
|
||||
static int must_next_active_lease(void *closure)
|
||||
{
|
||||
struct expl *e = closure;
|
||||
|
||||
e->lease_p = e->lease_p->hh.next;
|
||||
if (e->lease_p == NULL)
|
||||
return 0;
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
/*! \brief Mustach range aka {{#subnets}} tag parser and printer. */
|
||||
static int must_put_range(void *closure, const char *name, int escape
|
||||
__attribute__ ((unused)), FILE *file)
|
||||
|
|
@ -334,6 +390,13 @@ static int must_enter(void *closure, const char *name)
|
|||
{
|
||||
struct expl *e = closure;
|
||||
|
||||
if (!strcmp(name, "active_lease")) {
|
||||
itf.put = must_put_active_lease;
|
||||
itf.next = must_next_active_lease;
|
||||
e->current = 0;
|
||||
e->lease_p = e->state->leases;
|
||||
return must_next_active_lease(closure);
|
||||
}
|
||||
if (!strcmp(name, "subnets")) {
|
||||
itf.put = must_put_range;
|
||||
itf.next = must_next_range;
|
||||
|
|
@ -362,7 +425,7 @@ static int must_enter(void *closure, const char *name)
|
|||
return 1;
|
||||
}
|
||||
|
||||
/*! \brief Function that is called when all elements within a print loop are outputed. */
|
||||
/*! \brief Function that is called when all elements within a print loop are outputted. */
|
||||
static int must_leave(void *closure)
|
||||
{
|
||||
struct expl *e = closure;
|
||||
|
|
@ -440,7 +503,7 @@ int mustach_dhcpd_pools(struct conf_t *state)
|
|||
case MUSTACH_ERROR_BAD_SEPARATORS:
|
||||
error(EXIT_FAILURE, 0, "mustach_dhcpd_pools: fmustach: bad separator");
|
||||
break;
|
||||
case MUSTACH_ERROR_TOO_DEPTH:
|
||||
case MUSTACH_ERROR_TOO_DEEP:
|
||||
error(EXIT_FAILURE, 0, "mustach_dhcpd_pools: fmustach: too deep");
|
||||
break;
|
||||
case MUSTACH_ERROR_CLOSING:
|
||||
|
|
|
|||
131
src/mustach.c
131
src/mustach.c
|
|
@ -8,7 +8,7 @@
|
|||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
https://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
|
|
@ -19,6 +19,8 @@
|
|||
|
||||
#define _GNU_SOURCE
|
||||
|
||||
#include "config.h"
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
|
@ -30,6 +32,76 @@
|
|||
#define NAME_LENGTH_MAX 1024
|
||||
#define DEPTH_MAX 256
|
||||
|
||||
#if !defined(NO_OPEN_MEMSTREAM)
|
||||
static FILE *memfile_open(char **buffer, size_t *size)
|
||||
{
|
||||
return open_memstream(buffer, size);
|
||||
}
|
||||
static void memfile_abort(FILE *file, char **buffer, size_t *size)
|
||||
{
|
||||
fclose(file);
|
||||
free(*buffer);
|
||||
*buffer = NULL;
|
||||
*size = 0;
|
||||
}
|
||||
static int memfile_close(FILE *file, char **buffer, size_t *size)
|
||||
{
|
||||
int rc;
|
||||
|
||||
/* adds terminating null */
|
||||
rc = fputc(0, file) ? MUSTACH_ERROR_SYSTEM : 0;
|
||||
fclose(file);
|
||||
if (rc == 0)
|
||||
/* removes terminating null of the length */
|
||||
(*size)--;
|
||||
else {
|
||||
free(*buffer);
|
||||
*buffer = NULL;
|
||||
*size = 0;
|
||||
}
|
||||
return rc;
|
||||
}
|
||||
#else
|
||||
static FILE *memfile_open(char **buffer, size_t *size)
|
||||
{
|
||||
return tmpfile();
|
||||
}
|
||||
static void memfile_abort(FILE *file, char **buffer, size_t *size)
|
||||
{
|
||||
fclose(file);
|
||||
*buffer = NULL;
|
||||
*size = 0;
|
||||
}
|
||||
static int memfile_close(FILE *file, char **buffer, size_t *size)
|
||||
{
|
||||
int rc;
|
||||
size_t s;
|
||||
char *b;
|
||||
|
||||
s = (size_t)ftell(file);
|
||||
b = malloc(s + 1);
|
||||
if (b == NULL) {
|
||||
rc = MUSTACH_ERROR_SYSTEM;
|
||||
errno = ENOMEM;
|
||||
s = 0;
|
||||
} else {
|
||||
rewind(file);
|
||||
if (1 == fread(b, s, 1, file)) {
|
||||
rc = 0;
|
||||
b[s] = 0;
|
||||
} else {
|
||||
rc = MUSTACH_ERROR_SYSTEM;
|
||||
free(b);
|
||||
b = NULL;
|
||||
s = 0;
|
||||
}
|
||||
}
|
||||
*buffer = b;
|
||||
*size = s;
|
||||
return rc;
|
||||
}
|
||||
#endif
|
||||
|
||||
static int getpartial(struct mustach_itf *itf, void *closure, const char *name, char **result)
|
||||
{
|
||||
int rc;
|
||||
|
|
@ -37,26 +109,22 @@ static int getpartial(struct mustach_itf *itf, void *closure, const char *name,
|
|||
size_t size;
|
||||
|
||||
*result = NULL;
|
||||
file = open_memstream(result, &size);
|
||||
file = memfile_open(result, &size);
|
||||
if (file == NULL)
|
||||
rc = MUSTACH_ERROR_SYSTEM;
|
||||
else {
|
||||
rc = itf->put(closure, name, 0, file);
|
||||
if (rc == 0)
|
||||
/* adds terminating null */
|
||||
rc = fputc(0, file) ? MUSTACH_ERROR_SYSTEM : 0;
|
||||
fclose(file);
|
||||
if (rc < 0) {
|
||||
free(*result);
|
||||
*result = NULL;
|
||||
}
|
||||
if (rc < 0)
|
||||
memfile_abort(file, result, &size);
|
||||
else
|
||||
rc = memfile_close(file, result, &size);
|
||||
}
|
||||
return rc;
|
||||
}
|
||||
|
||||
static int process(const char *template, struct mustach_itf *itf, void *closure, FILE *file, const char *opstr, const char *clstr)
|
||||
{
|
||||
char name[NAME_LENGTH_MAX + 1], *partial, c;
|
||||
char name[NAME_LENGTH_MAX + 1], *partial, c, *tmp;
|
||||
const char *beg, *term;
|
||||
struct { const char *name, *again; size_t length; int emit, entered; } stack[DEPTH_MAX];
|
||||
size_t oplen, cllen, len, l;
|
||||
|
|
@ -112,8 +180,10 @@ static int process(const char *template, struct mustach_itf *itf, void *closure,
|
|||
default:
|
||||
while (len && isspace(beg[0])) { beg++; len--; }
|
||||
while (len && isspace(beg[len-1])) len--;
|
||||
#if defined(NO_EXTENSION_FOR_MUSTACH) || defined(NO_ALLOW_EMPTY_TAG)
|
||||
if (len == 0)
|
||||
return MUSTACH_ERROR_EMPTY_TAG;
|
||||
#endif
|
||||
if (len > NAME_LENGTH_MAX)
|
||||
return MUSTACH_ERROR_TAG_TOO_LONG;
|
||||
memcpy(name, beg, len);
|
||||
|
|
@ -134,19 +204,25 @@ static int process(const char *template, struct mustach_itf *itf, void *closure,
|
|||
for (l = 0; l < len && !isspace(beg[l]) ; l++);
|
||||
if (l == len)
|
||||
return MUSTACH_ERROR_BAD_SEPARATORS;
|
||||
opstr = strndupa(beg, l);
|
||||
oplen = l;
|
||||
tmp = alloca(oplen + 1);
|
||||
memcpy(tmp, beg, oplen);
|
||||
tmp[oplen] = 0;
|
||||
opstr = tmp;
|
||||
while (l < len && isspace(beg[l])) l++;
|
||||
if (l == len)
|
||||
return MUSTACH_ERROR_BAD_SEPARATORS;
|
||||
clstr = strndupa(beg + l, len - l);
|
||||
oplen = strlen(opstr);
|
||||
cllen = strlen(clstr);
|
||||
cllen = len - l;
|
||||
tmp = alloca(cllen + 1);
|
||||
memcpy(tmp, beg + l, cllen);
|
||||
tmp[cllen] = 0;
|
||||
clstr = tmp;
|
||||
break;
|
||||
case '^':
|
||||
case '#':
|
||||
/* begin section */
|
||||
if (depth == DEPTH_MAX)
|
||||
return MUSTACH_ERROR_TOO_DEPTH;
|
||||
return MUSTACH_ERROR_TOO_DEEP;
|
||||
rc = emit;
|
||||
if (rc) {
|
||||
rc = itf->enter(closure, name);
|
||||
|
|
@ -234,24 +310,15 @@ int mustach(const char *template, struct mustach_itf *itf, void *closure, char *
|
|||
*result = NULL;
|
||||
if (size == NULL)
|
||||
size = &s;
|
||||
file = open_memstream(result, size);
|
||||
if (file == NULL) {
|
||||
file = memfile_open(result, size);
|
||||
if (file == NULL)
|
||||
rc = MUSTACH_ERROR_SYSTEM;
|
||||
errno = ENOMEM;
|
||||
} else {
|
||||
rc = fmustach(template, itf, closure, file);
|
||||
if (rc == 0)
|
||||
/* adds terminating null */
|
||||
rc = fputc(0, file) ? MUSTACH_ERROR_SYSTEM : 0;
|
||||
fclose(file);
|
||||
if (rc >= 0)
|
||||
/* removes terminating null of the length */
|
||||
(*size)--;
|
||||
else {
|
||||
free(*result);
|
||||
*result = NULL;
|
||||
*size = 0;
|
||||
}
|
||||
rc = fmustach(template, itf, closure, file);
|
||||
if (rc < 0)
|
||||
memfile_abort(file, result, size);
|
||||
else
|
||||
rc = memfile_close(file, result, size);
|
||||
}
|
||||
return rc;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -8,7 +8,7 @@
|
|||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
https://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
|
|
@ -29,12 +29,17 @@
|
|||
*
|
||||
* The functions enter and next should return 0 or 1.
|
||||
*
|
||||
* All other functions should normally return 0.
|
||||
* All other functions should normally return 0. If it returns
|
||||
* a negative value, it means an error that stop the process
|
||||
* and that is reported to the caller.
|
||||
*
|
||||
* @start: Starts the mustach processing of the closure
|
||||
* 'start' is optional (can be NULL)
|
||||
*
|
||||
* @put: Writes the value of 'name' to 'file' with 'escape' or not
|
||||
* As an extension (see NO_ALLOW_EMPTY_TAG), the 'name' can be
|
||||
* the empty string. In that later case an implemntation can
|
||||
* return MUSTACH_ERROR_EMPTY_TAG to refuse empty names.
|
||||
*
|
||||
* @enter: Enters the section of 'name' if possible.
|
||||
* Musts return 1 if entered or 0 if not entered.
|
||||
|
|
@ -64,10 +69,13 @@ struct mustach_itf {
|
|||
#define MUSTACH_ERROR_EMPTY_TAG -3
|
||||
#define MUSTACH_ERROR_TAG_TOO_LONG -4
|
||||
#define MUSTACH_ERROR_BAD_SEPARATORS -5
|
||||
#define MUSTACH_ERROR_TOO_DEPTH -6
|
||||
#define MUSTACH_ERROR_TOO_DEEP -6
|
||||
#define MUSTACH_ERROR_CLOSING -7
|
||||
#define MUSTACH_ERROR_BAD_UNESCAPE_TAG -8
|
||||
|
||||
/* compatibility with older bad name */
|
||||
#define MUSTACH_ERROR_TOO_DEPTH MUSTACH_ERROR_TOO_DEEP
|
||||
|
||||
/**
|
||||
* fmustach - Renders the mustache 'template' in 'file' for 'itf' and 'closure'.
|
||||
*
|
||||
|
|
|
|||
54
src/other.c
54
src/other.c
|
|
@ -58,7 +58,7 @@
|
|||
|
||||
#include "dhcpd-pools.h"
|
||||
|
||||
char *(*cidr_last) (union ipaddr_t *restrict addr, const int mask);
|
||||
static char *(*cidr_last) (union ipaddr_t *restrict addr, const int mask);
|
||||
static char *cidr_last_v4(union ipaddr_t *restrict addr, const int mask);
|
||||
static char *cidr_last_v6(union ipaddr_t *restrict addr, const int mask);
|
||||
|
||||
|
|
@ -298,7 +298,7 @@ const char *ntop_ipaddr_init(const union ipaddr_t *ip __attribute__ ((unused)))
|
|||
|
||||
const char *ntop_ipaddr_v4(const union ipaddr_t *ip)
|
||||
{
|
||||
static char buffer[sizeof("255.255.255.255")];
|
||||
static char buffer[INET_ADDRSTRLEN];
|
||||
struct in_addr addr;
|
||||
|
||||
addr.s_addr = htonl(ip->v4);
|
||||
|
|
@ -307,7 +307,7 @@ const char *ntop_ipaddr_v4(const union ipaddr_t *ip)
|
|||
|
||||
const char *ntop_ipaddr_v6(const union ipaddr_t *ip)
|
||||
{
|
||||
static char buffer[sizeof("ffff:ffff:ffff:ffff:ffff:ffff:255.255.255.255")];
|
||||
static char buffer[INET6_ADDRSTRLEN];
|
||||
struct in6_addr addr;
|
||||
|
||||
memcpy(addr.s6_addr, ip->v6, sizeof(addr.s6_addr));
|
||||
|
|
@ -411,10 +411,18 @@ int
|
|||
if (!memcmp(" hardware ethernet", str, 19))
|
||||
return PREFIX_HARDWARE_ETHERNET;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!memcmp("lease ", str, 6))
|
||||
return PREFIX_LEASE;
|
||||
else if (!memcmp(" starts ", str, 9))
|
||||
return PREFIX_STARTS;
|
||||
else if (!memcmp(" ends ", str, 7))
|
||||
return PREFIX_ENDS;
|
||||
else if (!memcmp(" client-hostname ", str, 18))
|
||||
return PREFIX_HOSTNAME;
|
||||
return NUM_OF_PREFIX;
|
||||
}
|
||||
|
||||
|
|
@ -464,10 +472,18 @@ int
|
|||
if (!memcmp(" hardware ethernet", str, 19))
|
||||
return PREFIX_HARDWARE_ETHERNET;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!memcmp(" iaaddr ", str, 9))
|
||||
return PREFIX_LEASE;
|
||||
else if (!memcmp(" starts ", str, 9))
|
||||
return PREFIX_STARTS;
|
||||
else if (!memcmp(" ends ", str, 7))
|
||||
return PREFIX_ENDS;
|
||||
else if (!memcmp(" client-hostname ", str, 18))
|
||||
return PREFIX_HOSTNAME;
|
||||
return NUM_OF_PREFIX;
|
||||
}
|
||||
|
||||
|
|
@ -476,13 +492,13 @@ int
|
|||
* \param Color mode string.
|
||||
* \return color mode enum.
|
||||
*/
|
||||
int parse_color_mode(const char *restrict optarg)
|
||||
int parse_color_mode(const char *restrict arg)
|
||||
{
|
||||
if (!strcmp(optarg, "always"))
|
||||
if (!strcmp(arg, "always"))
|
||||
return color_on;
|
||||
if (!strcmp(optarg, "auto"))
|
||||
if (!strcmp(arg, "auto"))
|
||||
return color_auto;
|
||||
if (!strcmp(optarg, "never"))
|
||||
if (!strcmp(arg, "never"))
|
||||
return color_off;
|
||||
return color_unknown;
|
||||
}
|
||||
|
|
@ -547,31 +563,23 @@ void clean_up(struct conf_t *state)
|
|||
}
|
||||
|
||||
/*! \brief Print a time stamp of a path or now to output file. */
|
||||
void dp_time_tool(FILE *file, const char *path, int epoch)
|
||||
void dp_time_tool(FILE *file, const char *path, const int epoch)
|
||||
{
|
||||
time_t t;
|
||||
|
||||
/* a file or now */
|
||||
if (path) {
|
||||
struct stat st;
|
||||
|
||||
if (path)
|
||||
stat(path, &st);
|
||||
t = st.st_mtime;
|
||||
} else
|
||||
t = time(NULL);
|
||||
/* epoc or iso time stamp */
|
||||
else
|
||||
clock_gettime(CLOCK_REALTIME, &st.st_mtim);
|
||||
if (epoch)
|
||||
fprintf(file, "%ld", t);
|
||||
fprintf(file, "%ld", st.st_mtim.tv_sec);
|
||||
else {
|
||||
char time_stamp[64];
|
||||
const time_t mtime = st.st_mtim.tv_sec;
|
||||
struct tm tm;
|
||||
int len;
|
||||
|
||||
localtime_r(&t, &tm);
|
||||
len = snprintf(time_stamp, sizeof(time_stamp), "%4d-%.2d-%.2dT%02d:%02d:%02d",
|
||||
tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday,
|
||||
tm.tm_hour, tm.tm_min, tm.tm_sec);
|
||||
strftime(time_stamp + len, sizeof(time_stamp) - len, "%z", &tm);
|
||||
localtime_r(&mtime, &tm);
|
||||
strftime(time_stamp, sizeof(time_stamp), "%FT%T%z", &tm);
|
||||
fprintf(file, "%s", time_stamp);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
192
src/output.c
192
src/output.c
|
|
@ -82,7 +82,7 @@ enum count_status_t {
|
|||
};
|
||||
|
||||
/*! \var color_tags
|
||||
* \brief Array of stings that make colors to start and end in different
|
||||
* \brief Array of strings that make colors to start and end in different
|
||||
* schemas per array column. */
|
||||
static const char *color_tags[][NUM_OF_OUT_FORMS] = {
|
||||
[STATUS_OK] = { "", "" },
|
||||
|
|
@ -158,11 +158,11 @@ int shnet_output_helper(struct conf_t *state, struct output_helper_t *oh,
|
|||
oh->status = STATUS_IGNORED;
|
||||
if (state->skip_minsize)
|
||||
return 1;
|
||||
} else if (state->critical < oh->percent && shared_p->used < state->crit_count) {
|
||||
} else if (state->critical < oh->percent && (shared_p->available - shared_p->used) < state->crit_count) {
|
||||
oh->status = STATUS_CRIT;
|
||||
if (state->skip_critical)
|
||||
return 1;
|
||||
} else if (state->warning < oh->percent && shared_p->used < state->warn_count) {
|
||||
} else if (state->warning < oh->percent && (shared_p->available - shared_p->used) < state->warn_count) {
|
||||
oh->status = STATUS_WARN;
|
||||
if (state->skip_warning)
|
||||
return 1;
|
||||
|
|
@ -182,7 +182,7 @@ static int start_color(struct conf_t *state, struct output_helper_t *oh, FILE *o
|
|||
if (oh->status == STATUS_OK) {
|
||||
return 0;
|
||||
}
|
||||
fputs(color_tags[oh->status][state->output_format], outfile);
|
||||
fputs(color_tags[oh->status][state->color_format], outfile);
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
|
@ -219,7 +219,6 @@ static void close_outfile(FILE *outfile)
|
|||
/*! \brief Text output format, which is the default. */
|
||||
static int output_txt(struct conf_t *state)
|
||||
{
|
||||
unsigned int i;
|
||||
struct range_t *range_p;
|
||||
struct shared_network_t *shared_p;
|
||||
struct output_helper_t oh;
|
||||
|
|
@ -249,6 +248,7 @@ static int output_txt(struct conf_t *state)
|
|||
fprintf(outfile, "\n");
|
||||
}
|
||||
if (state->number_limit & R_BIT) {
|
||||
unsigned int i;
|
||||
for (i = 0; i < state->num_ranges; i++) {
|
||||
int color_set = 0;
|
||||
|
||||
|
|
@ -282,7 +282,7 @@ static int output_txt(struct conf_t *state)
|
|||
fprintf(outfile, "%7g %8.3f", range_p->backups, oh.bup);
|
||||
}
|
||||
if (color_set)
|
||||
fputs(color_tags[COLOR_RESET][state->output_format], outfile);
|
||||
fputs(color_tags[COLOR_RESET][state->color_format], outfile);
|
||||
fprintf(outfile, "\n");
|
||||
range_p++;
|
||||
}
|
||||
|
|
@ -320,7 +320,7 @@ static int output_txt(struct conf_t *state)
|
|||
fprintf(outfile, "%7g %8.3f", shared_p->backups, oh.bup);
|
||||
}
|
||||
if (color_set)
|
||||
fputs(color_tags[COLOR_RESET][state->output_format], outfile);
|
||||
fputs(color_tags[COLOR_RESET][state->color_format], outfile);
|
||||
fprintf(outfile, "\n");
|
||||
}
|
||||
}
|
||||
|
|
@ -356,7 +356,7 @@ static int output_txt(struct conf_t *state)
|
|||
fprintf(outfile, "%7g %8.3f", state->shared_net_root->backups, oh.bup);
|
||||
}
|
||||
if (color_set)
|
||||
fputs(color_tags[COLOR_RESET][state->output_format], outfile);
|
||||
fputs(color_tags[COLOR_RESET][state->color_format], outfile);
|
||||
fprintf(outfile, "\n");
|
||||
}
|
||||
close_outfile(outfile);
|
||||
|
|
@ -364,9 +364,8 @@ static int output_txt(struct conf_t *state)
|
|||
}
|
||||
|
||||
/*! \brief The xml output formats. */
|
||||
static int output_xml(struct conf_t *state, const int print_mac_addreses)
|
||||
static int output_xml(struct conf_t *state)
|
||||
{
|
||||
unsigned int i;
|
||||
struct range_t *range_p;
|
||||
struct shared_network_t *shared_p;
|
||||
struct output_helper_t oh;
|
||||
|
|
@ -377,7 +376,7 @@ static int output_xml(struct conf_t *state, const int print_mac_addreses)
|
|||
|
||||
fprintf(outfile, "<dhcpstatus>\n");
|
||||
|
||||
if (print_mac_addreses == 1) {
|
||||
if (state->print_mac_addreses) {
|
||||
struct leases_t *l;
|
||||
|
||||
for (l = state->leases; l != NULL; l = l->hh.next) {
|
||||
|
|
@ -388,12 +387,25 @@ static int output_xml(struct conf_t *state, const int print_mac_addreses)
|
|||
if (l->ethernet != NULL) {
|
||||
fputs(l->ethernet, outfile);
|
||||
}
|
||||
fputs("</macaddress>\n</active_lease>\n", outfile);
|
||||
fputs("</macaddress>\n\t<starts>", outfile);
|
||||
if (l->starts != NULL) {
|
||||
fputs(l->starts, outfile);
|
||||
}
|
||||
fputs("</starts>\n\t<ends>", outfile);
|
||||
if (l->ends != NULL) {
|
||||
fputs(l->ends, outfile);
|
||||
}
|
||||
fputs("</ends>\n\t<hostname>", outfile);
|
||||
if (l->hostname != NULL) {
|
||||
fputs(l->hostname, outfile);
|
||||
}
|
||||
fputs("</hostname>\n</active_lease>\n", outfile);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (state->number_limit & R_BIT) {
|
||||
unsigned int i;
|
||||
for (i = 0; i < state->num_ranges; i++) {
|
||||
if (range_output_helper(state, &oh, range_p)) {
|
||||
range_p++;
|
||||
|
|
@ -449,7 +461,7 @@ static int output_xml(struct conf_t *state, const int print_mac_addreses)
|
|||
}
|
||||
|
||||
/*! \brief The json output formats. */
|
||||
static int output_json(struct conf_t *state, const int print_mac_addreses)
|
||||
static int output_json(struct conf_t *state)
|
||||
{
|
||||
unsigned int i = 0;
|
||||
struct range_t *range_p;
|
||||
|
|
@ -464,7 +476,7 @@ static int output_json(struct conf_t *state, const int print_mac_addreses)
|
|||
|
||||
fprintf(outfile, "{\n");
|
||||
|
||||
if (print_mac_addreses == 1) {
|
||||
if (state->print_mac_addreses) {
|
||||
struct leases_t *l;
|
||||
|
||||
fprintf(outfile, " \"active_leases\": [");
|
||||
|
|
@ -481,6 +493,18 @@ static int output_json(struct conf_t *state, const int print_mac_addreses)
|
|||
if (l->ethernet != NULL) {
|
||||
fputs(l->ethernet, outfile);
|
||||
}
|
||||
fputs("\", \"starts\":\"", outfile);
|
||||
if (l->starts != NULL) {
|
||||
fputs(l->starts, outfile);
|
||||
}
|
||||
fputs("\", \"ends\":\"", outfile);
|
||||
if (l->ends != NULL) {
|
||||
fputs(l->ends, outfile);
|
||||
}
|
||||
fputs("\", \"hostname\":\"", outfile);
|
||||
if (l->hostname != NULL) {
|
||||
fputs(l->hostname, outfile);
|
||||
}
|
||||
fputs("\" }", outfile);
|
||||
}
|
||||
}
|
||||
|
|
@ -587,8 +611,14 @@ static int output_json(struct conf_t *state, const int print_mac_addreses)
|
|||
fprintf(outfile, " \"touched\":%g,\n", state->shared_net_root->touched);
|
||||
fprintf(outfile, " \"free\":%g,\n",
|
||||
state->shared_net_root->available - state->shared_net_root->used);
|
||||
if (fpclassify(state->shared_net_root->available) == FP_ZERO)
|
||||
fprintf(outfile, " \"percent\":\"%g\",\n", oh.percent);
|
||||
else
|
||||
fprintf(outfile, " \"percent\":%g,\n", oh.percent);
|
||||
fprintf(outfile, " \"touch_count\":%g,\n", oh.tc);
|
||||
if (fpclassify(state->shared_net_root->available) == FP_ZERO)
|
||||
fprintf(outfile, " \"touch_percent\":\"%g\",\n", oh.tcp);
|
||||
else
|
||||
fprintf(outfile, " \"touch_percent\":%g,\n", oh.tcp);
|
||||
if (state->backups_found == 1) {
|
||||
fprintf(outfile, " \"backup_count\":%g,\n",
|
||||
|
|
@ -628,8 +658,8 @@ static void html_header(struct conf_t *state, FILE *restrict f)
|
|||
fprintf(f, "<meta charset=\"utf-8\">\n");
|
||||
fprintf(f, "<meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n");
|
||||
fprintf(f, "<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n");
|
||||
fprintf(f, "<link rel=\"stylesheet\" href=\"https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css\" type=\"text/css\">\n");
|
||||
fprintf(f, "<link rel=\"stylesheet\" type=\"text/css\" href=\"https://cdn.datatables.net/v/bs/jq-3.2.1/dt-1.10.16/datatables.min.css\">\n");
|
||||
fprintf(f, "<link rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css\" type=\"text/css\">\n");
|
||||
fprintf(f, "<link rel=\"stylesheet\" type=\"text/css\" href=\"https://cdn.datatables.net/v/dt/dt-2.2.2/datatables.min.css\">\n");
|
||||
fprintf(f, "<style type=\"text/css\">\n");
|
||||
fprintf(f, "table.dhcpd-pools th { text-transform: capitalize }\n");
|
||||
fprintf(f, "</style>\n");
|
||||
|
|
@ -652,8 +682,8 @@ static void html_footer(FILE *restrict f)
|
|||
fprintf(f, "<small>Generated using %s<br />\n", PACKAGE_STRING);
|
||||
fprintf(f, "More info at <a href=\"%s\">%s</a>\n", PACKAGE_URL, PACKAGE_URL);
|
||||
fprintf(f, "</small></div></div>\n");
|
||||
fprintf(f, "<script src=\"https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js\" type=\"text/javascript\"></script>\n");
|
||||
fprintf(f, "<script type=\"text/javascript\" src=\"https://cdn.datatables.net/v/bs/jq-3.2.1/dt-1.10.16/datatables.min.js\"></script>\n");
|
||||
fprintf(f, "<script src=\"https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.min.js\" type=\"text/javascript\"></script>\n");
|
||||
fprintf(f, "<script type=\"text/javascript\" src=\"https://cdn.datatables.net/v/dt/dt-2.2.2/datatables.min.js\"></script>\n");
|
||||
fprintf(f, "<script type=\"text/javascript\" class=\"init\">$(document).ready(function() { $('#s').DataTable({ \"iDisplayLength\": 50, \"lengthMenu\": [ [25, 50, 100, -1], [25, 50, 100, \"All\"] ], \"order\": [[ 4, \"desc\" ]] } ); } );</script>\n");
|
||||
fprintf(f, "<script type=\"text/javascript\" class=\"init\">$(document).ready(function() { $('#r').DataTable({ \"iDisplayLength\": 100, \"lengthMenu\": [ [25, 50, 100, -1], [25, 50, 100, \"All\"] ], \"order\": [[ 6, \"desc\" ]] } ); } );</script>\n");
|
||||
fprintf(f, "</body></html>\n");
|
||||
|
|
@ -726,7 +756,7 @@ static void output_double_color(struct conf_t *state,
|
|||
* \param type HTML tag name.
|
||||
* \param fl Actual payload of the printout.
|
||||
*/
|
||||
static void output_float(FILE *restrict f, char const *restrict type, float fl)
|
||||
static void output_float(FILE *restrict f, char const *restrict type, double fl)
|
||||
{
|
||||
fprintf(f, "<%s>%.3f</%s>\n", type, fl, type);
|
||||
}
|
||||
|
|
@ -762,7 +792,6 @@ static void newsection(FILE *restrict f, char const *restrict title)
|
|||
/*! \brief Output html format. */
|
||||
static int output_html(struct conf_t *state)
|
||||
{
|
||||
unsigned int i;
|
||||
struct range_t *range_p;
|
||||
struct shared_network_t *shared_p;
|
||||
struct output_helper_t oh;
|
||||
|
|
@ -877,6 +906,7 @@ static int output_html(struct conf_t *state)
|
|||
end_tag(outfile, "thead");
|
||||
}
|
||||
if (state->number_limit & R_BIT) {
|
||||
unsigned int i;
|
||||
start_tag(outfile, "tbody");
|
||||
for (i = 0; i < state->num_ranges; i++) {
|
||||
if (range_output_helper(state, &oh, range_p)) {
|
||||
|
|
@ -916,7 +946,6 @@ static int output_html(struct conf_t *state)
|
|||
/*! \brief Output cvs format. */
|
||||
static int output_csv(struct conf_t *state)
|
||||
{
|
||||
unsigned int i;
|
||||
struct range_t *range_p;
|
||||
struct shared_network_t *shared_p;
|
||||
struct output_helper_t oh;
|
||||
|
|
@ -935,6 +964,7 @@ static int output_csv(struct conf_t *state)
|
|||
fprintf(outfile, "\n");
|
||||
}
|
||||
if (state->number_limit & R_BIT) {
|
||||
unsigned int i;
|
||||
for (i = 0; i < state->num_ranges; i++) {
|
||||
if (range_output_helper(state, &oh, range_p)) {
|
||||
range_p++;
|
||||
|
|
@ -1024,19 +1054,11 @@ static int output_csv(struct conf_t *state)
|
|||
return 0;
|
||||
}
|
||||
|
||||
/*! \brief Output alarm text, and return program exit value. */
|
||||
static int output_alarming(struct conf_t *state)
|
||||
void range_alarms(struct conf_t *state, struct status_counts_t *rangstat)
|
||||
{
|
||||
FILE *outfile;
|
||||
struct range_t *range_p;
|
||||
struct shared_network_t *shared_p;
|
||||
struct output_helper_t oh;
|
||||
struct range_t *range_p = state->ranges;
|
||||
unsigned int i;
|
||||
int rw = 0, rc = 0, ro = 0, ri = 0, sw = 0, sc = 0, so = 0, si = 0;
|
||||
int ret_val;
|
||||
|
||||
outfile = open_outfile(state);
|
||||
range_p = state->ranges;
|
||||
|
||||
if (state->number_limit & R_BIT) {
|
||||
for (i = 0; i < state->num_ranges; i++) {
|
||||
|
|
@ -1045,16 +1067,16 @@ static int output_alarming(struct conf_t *state)
|
|||
case STATUS_SUPPRESSED:
|
||||
break;
|
||||
case STATUS_IGNORED:
|
||||
ri++;
|
||||
rangstat->ignored++;
|
||||
break;
|
||||
case STATUS_CRIT:
|
||||
rc++;
|
||||
rangstat->critical++;
|
||||
break;
|
||||
case STATUS_WARN:
|
||||
rw++;
|
||||
rangstat->warning++;
|
||||
break;
|
||||
case STATUS_OK:
|
||||
ro++;
|
||||
rangstat->ok++;
|
||||
break;
|
||||
default:
|
||||
abort();
|
||||
|
|
@ -1062,6 +1084,13 @@ static int output_alarming(struct conf_t *state)
|
|||
range_p++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void shared_net_alarms(struct conf_t *state, struct status_counts_t *sharstat)
|
||||
{
|
||||
struct output_helper_t oh;
|
||||
struct shared_network_t *shared_p;
|
||||
|
||||
if (state->number_limit & S_BIT) {
|
||||
for (shared_p = state->shared_net_root->next; shared_p; shared_p = shared_p->next) {
|
||||
shnet_output_helper(state, &oh, shared_p);
|
||||
|
|
@ -1069,35 +1098,51 @@ static int output_alarming(struct conf_t *state)
|
|||
case STATUS_SUPPRESSED:
|
||||
break;
|
||||
case STATUS_IGNORED:
|
||||
si++;
|
||||
sharstat->ignored++;
|
||||
break;
|
||||
case STATUS_CRIT:
|
||||
sc++;
|
||||
sharstat->critical++;
|
||||
break;
|
||||
case STATUS_WARN:
|
||||
sw++;
|
||||
sharstat->warning++;
|
||||
break;
|
||||
case STATUS_OK:
|
||||
so++;
|
||||
sharstat->ok++;
|
||||
break;
|
||||
default:
|
||||
abort();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (sc || rc)
|
||||
|
||||
/*! \brief Output alarm text, and return program exit value. */
|
||||
static int output_alarming(struct conf_t *state)
|
||||
{
|
||||
FILE *outfile;
|
||||
unsigned int i;
|
||||
int ret_val;
|
||||
struct status_counts_t rangstat = { 0 };
|
||||
struct status_counts_t sharstat = { 0 };
|
||||
|
||||
outfile = open_outfile(state);
|
||||
|
||||
range_alarms(state, &rangstat);
|
||||
shared_net_alarms(state, &sharstat);
|
||||
|
||||
if (rangstat.critical || sharstat.critical)
|
||||
ret_val = STATE_CRITICAL;
|
||||
else if (sw || rw)
|
||||
else if (rangstat.warning || sharstat.warning)
|
||||
ret_val = STATE_WARNING;
|
||||
else
|
||||
ret_val = STATE_OK;
|
||||
|
||||
if ((0 < rc && state->number_limit & R_BIT)
|
||||
|| (0 < sc && state->number_limit & S_BIT)) {
|
||||
if ((0 < rangstat.critical && state->number_limit & R_BIT)
|
||||
|| (0 < sharstat.critical && state->number_limit & S_BIT)) {
|
||||
fprintf(outfile, "CRITICAL: %s:", program_name);
|
||||
} else if ((0 < rw && state->number_limit & R_BIT)
|
||||
|| (0 < sw && state->number_limit & S_BIT)) {
|
||||
} else if ((0 < rangstat.warning && state->number_limit & R_BIT)
|
||||
|| (0 < sharstat.warning && state->number_limit & S_BIT)) {
|
||||
fprintf(outfile, "WARNING: %s:", program_name);
|
||||
} else {
|
||||
if (state->number_limit & A_BIT)
|
||||
|
|
@ -1110,17 +1155,21 @@ static int output_alarming(struct conf_t *state)
|
|||
}
|
||||
}
|
||||
if (state->header_limit & R_BIT) {
|
||||
fprintf(outfile, " Ranges - crit: %d warn: %d ok: %d", rc, rw, ro);
|
||||
if (ri != 0) {
|
||||
fprintf(outfile, " ignored: %d", ri);
|
||||
fprintf(outfile, " Ranges - crit: %d warn: %d ok: %d", rangstat.critical, rangstat.warning, rangstat.ok);
|
||||
if (rangstat.ignored != 0) {
|
||||
fprintf(outfile, " ignored: %d", rangstat.ignored);
|
||||
}
|
||||
fprintf(outfile, "; | range_crit=%d range_warn=%d range_ok=%d", rc, rw, ro);
|
||||
if (ri != 0) {
|
||||
fprintf(outfile, " range_ignored=%d", ri);
|
||||
fprintf(outfile, "; | range_crit=%d range_warn=%d range_ok=%d", rangstat.critical, rangstat.warning, rangstat.ok);
|
||||
if (rangstat.ignored != 0) {
|
||||
fprintf(outfile, " range_ignored=%d", rangstat.ignored);
|
||||
}
|
||||
if (state->perfdata == 1 && state->number_limit & R_BIT) {
|
||||
for (i = 0; i < state->num_ranges; i++) {
|
||||
range_p--;
|
||||
/* last to first order. too late to fix this after so many years */
|
||||
struct range_t *range_p = state->ranges + state->num_ranges - 1;
|
||||
|
||||
for (i = state->num_ranges; i; i--) {
|
||||
struct output_helper_t oh;
|
||||
|
||||
if (range_output_helper(state, &oh, range_p))
|
||||
continue;
|
||||
if (state->minsize < oh.range_size) {
|
||||
|
|
@ -1137,6 +1186,7 @@ static int output_alarming(struct conf_t *state)
|
|||
range_p->backups);
|
||||
}
|
||||
}
|
||||
range_p--;
|
||||
}
|
||||
}
|
||||
fprintf(outfile, "\n");
|
||||
|
|
@ -1144,16 +1194,20 @@ static int output_alarming(struct conf_t *state)
|
|||
fprintf(outfile, " ");
|
||||
}
|
||||
if (state->header_limit & S_BIT) {
|
||||
fprintf(outfile, "Shared nets - crit: %d warn: %d ok: %d", sc, sw, so);
|
||||
if (si != 0) {
|
||||
fprintf(outfile, " ignored: %d", si);
|
||||
fprintf(outfile, "Shared nets - crit: %d warn: %d ok: %d", sharstat.critical, sharstat.warning, sharstat.ok);
|
||||
if (sharstat.ignored != 0) {
|
||||
fprintf(outfile, " ignored: %d", sharstat.ignored);
|
||||
}
|
||||
fprintf(outfile, "; | snet_crit=%d snet_warn=%d snet_ok=%d", sc, sw, so);
|
||||
if (si != 0) {
|
||||
fprintf(outfile, " snet_ignored=%d", si);
|
||||
fprintf(outfile, "; | snet_crit=%d snet_warn=%d snet_ok=%d", sharstat.critical, sharstat.warning, sharstat.ok);
|
||||
if (sharstat.ignored != 0) {
|
||||
fprintf(outfile, " snet_ignored=%d", sharstat.ignored);
|
||||
}
|
||||
if (state->perfdata == 1 && state->header_limit & R_BIT) {
|
||||
struct shared_network_t *shared_p;
|
||||
|
||||
for (shared_p = state->shared_net_root->next; shared_p; shared_p = shared_p->next) {
|
||||
struct output_helper_t oh;
|
||||
|
||||
if (shnet_output_helper(state, &oh, shared_p))
|
||||
continue;
|
||||
if (state->minsize < shared_p->available) {
|
||||
|
|
@ -1180,13 +1234,13 @@ static int output_alarming(struct conf_t *state)
|
|||
}
|
||||
|
||||
/*! \brief Return output_format_names enum based on single char input. */
|
||||
int output_analysis(struct conf_t *state, const char output_format)
|
||||
int output_analysis(struct conf_t *state)
|
||||
{
|
||||
int ret = 1;
|
||||
|
||||
switch (output_format) {
|
||||
switch (state->output_format) {
|
||||
case 't':
|
||||
state->output_format = OUT_FORM_TEXT;
|
||||
state->color_format = OUT_FORM_TEXT;
|
||||
ret = output_txt(state);
|
||||
break;
|
||||
case 'a':
|
||||
|
|
@ -1196,20 +1250,18 @@ int output_analysis(struct conf_t *state, const char output_format)
|
|||
error(EXIT_FAILURE, 0, "html table only output format is deprecated");
|
||||
break;
|
||||
case 'H':
|
||||
state->output_format = OUT_FORM_HTML;
|
||||
state->color_format = OUT_FORM_HTML;
|
||||
ret = output_html(state);
|
||||
break;
|
||||
case 'x':
|
||||
ret = output_xml(state, 0);
|
||||
break;
|
||||
/* fallthrough */
|
||||
case 'X':
|
||||
ret = output_xml(state, 1);
|
||||
ret = output_xml(state);
|
||||
break;
|
||||
case 'j':
|
||||
ret = output_json(state, 0);
|
||||
break;
|
||||
/* fallthrough */
|
||||
case 'J':
|
||||
ret = output_json(state, 1);
|
||||
ret = output_json(state);
|
||||
break;
|
||||
case 'c':
|
||||
ret = output_csv(state);
|
||||
|
|
@ -1220,7 +1272,7 @@ int output_analysis(struct conf_t *state, const char output_format)
|
|||
break;
|
||||
#endif
|
||||
default:
|
||||
error(EXIT_FAILURE, 0, "unknown output format: '%c'", output_format);
|
||||
error(EXIT_FAILURE, 0, "unknown output format: '%c'", state->output_format);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
|
|
|||
11
src/sort.c
11
src/sort.c
|
|
@ -40,6 +40,7 @@
|
|||
|
||||
#include <config.h>
|
||||
|
||||
#include <math.h>
|
||||
#include <stdint.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
|
@ -118,9 +119,14 @@ int rangecomp(const void *restrict r1, const void *restrict r2)
|
|||
*/
|
||||
int comp_double(double f1, double f2)
|
||||
{
|
||||
return f1 < f2 ? -1 : f1 > f2 ? 1 : 0;
|
||||
if (isless(f1, f2))
|
||||
return -1;
|
||||
else if (isless(f2, f1))
|
||||
return 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/*! \brief Compare two range_t by their first_ip.
|
||||
* \param r1,r2 Pointers to data to compare.
|
||||
* \return Like strcmp.
|
||||
|
|
@ -280,7 +286,6 @@ void mergesort_ranges(struct conf_t *state, struct range_t *restrict orig, unsig
|
|||
struct range_t *restrict temp, const int root_call)
|
||||
{
|
||||
unsigned int left, i, u_right;
|
||||
int s_right;
|
||||
struct range_t hold;
|
||||
/* Merge sort split size */
|
||||
static const unsigned int MIN_MERGE_SIZE = 8;
|
||||
|
|
@ -290,6 +295,8 @@ void mergesort_ranges(struct conf_t *state, struct range_t *restrict orig, unsig
|
|||
|
||||
if (size < MIN_MERGE_SIZE) {
|
||||
for (left = 0; left < size; left++) {
|
||||
int s_right;
|
||||
|
||||
hold = *(orig + left);
|
||||
for (s_right = left - 1; 0 <= s_right; s_right--) {
|
||||
if (merge(state, (orig + s_right), &hold))
|
||||
|
|
|
|||
|
|
@ -11,21 +11,29 @@ TESTS = \
|
|||
tests/alarm-warning-snets \
|
||||
tests/shnet-alarm \
|
||||
tests/big-small \
|
||||
tests/binding-states \
|
||||
tests/bootp \
|
||||
tests/cidr-v4 \
|
||||
tests/cidr-v6 \
|
||||
tests/complete \
|
||||
tests/complete-perfdata \
|
||||
tests/empty \
|
||||
tests/errors \
|
||||
tests/full-json \
|
||||
tests/full-xml \
|
||||
tests/formats \
|
||||
tests/leading0 \
|
||||
tests/one-ip \
|
||||
tests/one-line \
|
||||
tests/parser \
|
||||
tests/range4 \
|
||||
tests/range6 \
|
||||
tests/same-twice \
|
||||
tests/shufled \
|
||||
tests/simple \
|
||||
tests/skip \
|
||||
tests/sorts \
|
||||
tests/statuses \
|
||||
tests/v6 \
|
||||
tests/v6-perfdata
|
||||
|
||||
|
|
|
|||
|
|
@ -32,6 +32,13 @@ dhcpd-pools -c $top_srcdir/tests/confs/complete -l $top_srcdir/tests/leases/comp
|
|||
echo $? >> tests/outputs/$IAM-too
|
||||
cat tests/outputs/$IAM-too >> tests/outputs/$IAM
|
||||
|
||||
echo '== shared net count alarms ==' >> tests/outputs/$IAM
|
||||
dhcpd-pools -c $top_srcdir/tests/confs/complete -l $top_srcdir/tests/leases/complete \
|
||||
--color=always --format t --crit-count=20 --critical=0 --warning=0 --warn-count=24 \
|
||||
--output=tests/outputs/$IAM-too
|
||||
echo $? >> tests/outputs/$IAM-too
|
||||
cat tests/outputs/$IAM-too >> tests/outputs/$IAM
|
||||
|
||||
rm -f tests/outputs/$IAM-too
|
||||
diff -u $top_srcdir/tests/expected/$IAM tests/outputs/$IAM
|
||||
exit $?
|
||||
|
|
|
|||
14
tests/binding-states
Executable file
14
tests/binding-states
Executable file
|
|
@ -0,0 +1,14 @@
|
|||
#!/bin/sh
|
||||
#
|
||||
# Minimal regression test suite.
|
||||
|
||||
IAM=$(basename $0)
|
||||
|
||||
if [ ! -d tests/outputs ]; then
|
||||
mkdir tests/outputs
|
||||
fi
|
||||
|
||||
dhcpd-pools -c $top_srcdir/tests/confs/$IAM --color=never \
|
||||
-l $top_srcdir/tests/leases/$IAM -o tests/outputs/$IAM
|
||||
diff -u $top_srcdir/tests/expected/$IAM tests/outputs/$IAM
|
||||
exit $?
|
||||
1
tests/cidr-v4
Symbolic link
1
tests/cidr-v4
Symbolic link
|
|
@ -0,0 +1 @@
|
|||
test.sh
|
||||
1
tests/cidr-v6
Symbolic link
1
tests/cidr-v6
Symbolic link
|
|
@ -0,0 +1 @@
|
|||
test.sh
|
||||
1
tests/confs/binding-states
Symbolic link
1
tests/confs/binding-states
Symbolic link
|
|
@ -0,0 +1 @@
|
|||
complete
|
||||
31
tests/confs/cidr-v4
Normal file
31
tests/confs/cidr-v4
Normal file
|
|
@ -0,0 +1,31 @@
|
|||
shared-network example1 {
|
||||
subnet 10.0.0.0 netmask 255.255.255.0 {
|
||||
pool {
|
||||
range 10.0.0.1/27;
|
||||
}
|
||||
}
|
||||
subnet 10.1.0.0 netmask 255.255.255.0 {
|
||||
pool {
|
||||
range 10.1.0.1/27;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
shared-network example2 {
|
||||
subnet 10.2.0.0 netmask 255.255.255.0 {
|
||||
pool {
|
||||
range 10.2.0.1/27;
|
||||
}
|
||||
}
|
||||
subnet 10.3.0.0 netmask 255.255.255.0 {
|
||||
pool {
|
||||
range 10.3.0.1/27;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
subnet 10.4.0.0 netmask 255.255.255.0 {
|
||||
pool {
|
||||
range 10.4.0.1/28;
|
||||
}
|
||||
}
|
||||
10
tests/confs/cidr-v6
Normal file
10
tests/confs/cidr-v6
Normal file
|
|
@ -0,0 +1,10 @@
|
|||
subnet6 dead:abba:1000::/56 {
|
||||
range6 dead:abba:1000::2/120;
|
||||
prefix6 dead:abba:1000:0100:: dead:abba:1000:ff00::/56;
|
||||
}
|
||||
|
||||
subnet6 dead:abba:40ff::/56 {
|
||||
range6 dead:abba:4000::2/120;
|
||||
prefix6 dead:abba:4000:0100:: dead:abba:4000:ff00::/56;
|
||||
}
|
||||
|
||||
1
tests/confs/formats
Symbolic link
1
tests/confs/formats
Symbolic link
|
|
@ -0,0 +1 @@
|
|||
complete
|
||||
|
|
@ -1,31 +0,0 @@
|
|||
shared-network example1 {
|
||||
subnet 10.0.0.0 netmask 255.255.255.0 {
|
||||
pool {
|
||||
range 10.0.0.1 10.0.0.20;
|
||||
}
|
||||
}
|
||||
subnet 10.1.0.0 netmask 255.255.255.0 {
|
||||
pool {
|
||||
range 10.1.0.1 10.1.0.20;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
shared-network example2 {
|
||||
subnet 10.2.0.0 netmask 255.255.255.0 {
|
||||
pool {
|
||||
range 10.2.0.1 10.2.0.20;
|
||||
}
|
||||
}
|
||||
subnet 10.3.0.0 netmask 255.255.255.0 {
|
||||
pool {
|
||||
range 10.3.0.1 10.3.0.20;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
subnet 10.4.0.0 netmask 255.255.255.0 {
|
||||
pool {
|
||||
range 10.4.0.1 10.4.0.20;
|
||||
}
|
||||
}
|
||||
1
tests/confs/shnet-alarm
Symbolic link
1
tests/confs/shnet-alarm
Symbolic link
|
|
@ -0,0 +1 @@
|
|||
complete
|
||||
1
tests/confs/shufled
Symbolic link
1
tests/confs/shufled
Symbolic link
|
|
@ -0,0 +1 @@
|
|||
complete
|
||||
1
tests/confs/statuses
Symbolic link
1
tests/confs/statuses
Symbolic link
|
|
@ -0,0 +1 @@
|
|||
complete
|
||||
48
tests/errors
Executable file
48
tests/errors
Executable file
|
|
@ -0,0 +1,48 @@
|
|||
#!/bin/sh
|
||||
#
|
||||
# Test error inputs.
|
||||
|
||||
IAM=$(basename $0)
|
||||
|
||||
if [ ! -d tests/outputs ]; then
|
||||
mkdir tests/outputs
|
||||
fi
|
||||
|
||||
echo '=== output mask' >| tests/outputs/$IAM
|
||||
dhcpd-pools -c $top_srcdir/tests/confs/complete -l $top_srcdir/tests/leases/complete \
|
||||
-L 88 >> tests/outputs/$IAM 2>&1
|
||||
|
||||
echo '=== unknown specifier' >> tests/outputs/$IAM
|
||||
dhcpd-pools -c $top_srcdir/tests/confs/complete -l $top_srcdir/tests/leases/complete \
|
||||
--skip=okish >> tests/outputs/$IAM 2>&1
|
||||
|
||||
echo '=== color mode' >> tests/outputs/$IAM
|
||||
dhcpd-pools -c $top_srcdir/tests/confs/complete -l $top_srcdir/tests/leases/complete \
|
||||
--color=sometimes >> tests/outputs/$IAM 2>&1
|
||||
|
||||
echo '=== IPv5' >> tests/outputs/$IAM
|
||||
dhcpd-pools -c $top_srcdir/tests/confs/complete -l $top_srcdir/tests/leases/complete \
|
||||
--ip-version=5 >> tests/outputs/$IAM 2>&1
|
||||
|
||||
echo '=== missing conf' >> tests/outputs/$IAM
|
||||
dhcpd-pools -c $top_srcdir/tests/confs/complete_NXFILE -l $top_srcdir/tests/leases/complete 2>&1 | \
|
||||
sed 's/: ..\/..\/tests/: .\/tests/'>> tests/outputs/$IAM
|
||||
|
||||
echo '=== missing leases' >> tests/outputs/$IAM
|
||||
dhcpd-pools -c $top_srcdir/tests/confs/complete -l $top_srcdir/tests/leases/complete_NXFILE 2>&1 | \
|
||||
sed 's/: ..\/..\/tests/: .\/tests/' >> tests/outputs/$IAM
|
||||
|
||||
echo '=== html table' >> tests/outputs/$IAM
|
||||
dhcpd-pools -c $top_srcdir/tests/confs/complete -l $top_srcdir/tests/leases/complete \
|
||||
--format=html >> tests/outputs/$IAM 2>&1
|
||||
|
||||
echo '=== none existing format' >> tests/outputs/$IAM
|
||||
dhcpd-pools -c $top_srcdir/tests/confs/complete -l $top_srcdir/tests/leases/complete \
|
||||
-fz >> tests/outputs/$IAM 2>&1
|
||||
|
||||
echo '=== broken percent input' >> tests/outputs/$IAM
|
||||
dhcpd-pools -c $top_srcdir/tests/confs/complete -l $top_srcdir/tests/leases/complete \
|
||||
--warning=eighty >> tests/outputs/$IAM 2>&1
|
||||
|
||||
diff -u $top_srcdir/tests/expected/$IAM tests/outputs/$IAM
|
||||
exit $?
|
||||
|
|
@ -14,3 +14,21 @@ Shared nets - crit: 0 warn: 0 ok: 0 ignored: 2; | snet_crit=0 snet_warn=0 snet_o
|
|||
WARNING: dhcpd-pools: Ranges - crit: 0 warn: 0 ok: 2; | range_crit=0 range_warn=0 range_ok=2
|
||||
Shared nets - crit: 0 warn: 2 ok: 0; | snet_crit=0 snet_warn=2 snet_ok=0
|
||||
1
|
||||
== shared net count alarms ==
|
||||
Ranges:
|
||||
shared net name first ip last ip max cur percent touch t+c t+c perc
|
||||
[1;31mexample1 10.0.0.1 - 10.0.0.20 20 11 55.000 0 11 55.000[0m
|
||||
[1;31mexample1 10.1.0.1 - 10.1.0.20 20 10 50.000 0 10 50.000[0m
|
||||
[1;31mexample2 10.2.0.1 - 10.2.0.20 20 8 40.000 0 8 40.000[0m
|
||||
[1;31mexample2 10.3.0.1 - 10.3.0.20 20 9 45.000 0 9 45.000[0m
|
||||
[1;31mAll networks 10.4.0.1 - 10.4.0.20 20 5 25.000 0 5 25.000[0m
|
||||
|
||||
Shared networks:
|
||||
name max cur percent touch t+c t+c perc
|
||||
[1;31mexample1 40 21 52.500 0 21 52.500[0m
|
||||
[1;33mexample2 40 17 42.500 0 17 42.500[0m
|
||||
|
||||
Sum of all ranges:
|
||||
name max cur percent touch t+c t+c perc
|
||||
All networks 100 43 43.000 0 43 43.000
|
||||
0
|
||||
|
|
|
|||
|
|
@ -1,10 +0,0 @@
|
|||
Ranges:
|
||||
shared net name first ip last ip max cur percent touch t+c t+c perc
|
||||
All networks 10.0.0.1 - 10.0.0.10 10 10 100.000 0 10 100.000
|
||||
|
||||
Shared networks:
|
||||
name max cur percent touch t+c t+c perc
|
||||
|
||||
Sum of all ranges:
|
||||
name max cur percent touch t+c t+c perc
|
||||
All networks 10 10 100.000 0 10 100.000
|
||||
1
tests/expected/big-small
Symbolic link
1
tests/expected/big-small
Symbolic link
|
|
@ -0,0 +1 @@
|
|||
simple
|
||||
16
tests/expected/binding-states
Normal file
16
tests/expected/binding-states
Normal file
|
|
@ -0,0 +1,16 @@
|
|||
Ranges:
|
||||
shared net name first ip last ip max cur percent touch t+c t+c perc bu bu perc
|
||||
example1 10.0.0.1 - 10.0.0.20 20 4 20.000 3 7 35.000 2 10.000
|
||||
example1 10.1.0.1 - 10.1.0.20 20 10 50.000 0 10 50.000 0 0.000
|
||||
example2 10.2.0.1 - 10.2.0.20 20 8 40.000 0 8 40.000 0 0.000
|
||||
example2 10.3.0.1 - 10.3.0.20 20 9 45.000 0 9 45.000 0 0.000
|
||||
All networks 10.4.0.1 - 10.4.0.20 20 5 25.000 0 5 25.000 0 0.000
|
||||
|
||||
Shared networks:
|
||||
name max cur percent touch t+c t+c perc bu bu perc
|
||||
example1 40 14 35.000 3 17 42.500 2 5.000
|
||||
example2 40 17 42.500 0 17 42.500 0 0.000
|
||||
|
||||
Sum of all ranges:
|
||||
name max cur percent touch t+c t+c perc bu bu perc
|
||||
All networks 100 36 36.000 3 39 39.000 2 2.000
|
||||
|
|
@ -1,10 +0,0 @@
|
|||
Ranges:
|
||||
shared net name first ip last ip max cur percent touch t+c t+c perc
|
||||
All networks 10.0.0.1 - 10.0.0.10 10 10 100.000 0 10 100.000
|
||||
|
||||
Shared networks:
|
||||
name max cur percent touch t+c t+c perc
|
||||
|
||||
Sum of all ranges:
|
||||
name max cur percent touch t+c t+c perc
|
||||
All networks 10 10 100.000 0 10 100.000
|
||||
1
tests/expected/bootp
Symbolic link
1
tests/expected/bootp
Symbolic link
|
|
@ -0,0 +1 @@
|
|||
simple
|
||||
16
tests/expected/cidr-v4
Normal file
16
tests/expected/cidr-v4
Normal file
|
|
@ -0,0 +1,16 @@
|
|||
Ranges:
|
||||
shared net name first ip last ip max cur percent touch t+c t+c perc
|
||||
example1 10.0.0.1 - 10.0.0.31 31 11 35.484 0 11 35.484
|
||||
example1 10.1.0.1 - 10.1.0.31 31 10 32.258 0 10 32.258
|
||||
example2 10.2.0.1 - 10.2.0.31 31 8 25.806 0 8 25.806
|
||||
example2 10.3.0.1 - 10.3.0.31 31 9 29.032 0 9 29.032
|
||||
All networks 10.4.0.1 - 10.4.0.15 15 5 33.333 0 5 33.333
|
||||
|
||||
Shared networks:
|
||||
name max cur percent touch t+c t+c perc
|
||||
example1 62 21 33.871 0 21 33.871
|
||||
example2 62 17 27.419 0 17 27.419
|
||||
|
||||
Sum of all ranges:
|
||||
name max cur percent touch t+c t+c perc
|
||||
All networks 139 43 30.935 0 43 30.935
|
||||
11
tests/expected/cidr-v6
Normal file
11
tests/expected/cidr-v6
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
Ranges:
|
||||
shared net name first ip last ip max cur percent touch t+c t+c perc
|
||||
All networks dead:abba:1000::2 - dead:abba:1000::ff 254 0 0.000 0 0 0.000
|
||||
All networks dead:abba:4000::2 - dead:abba:4000::ff 254 1 0.394 0 1 0.394
|
||||
|
||||
Shared networks:
|
||||
name max cur percent touch t+c t+c perc
|
||||
|
||||
Sum of all ranges:
|
||||
name max cur percent touch t+c t+c perc
|
||||
All networks 508 1 0.197 0 1 0.197
|
||||
27
tests/expected/errors
Normal file
27
tests/expected/errors
Normal file
|
|
@ -0,0 +1,27 @@
|
|||
=== output mask
|
||||
dhcpd-pools: return_limit: output mask '88' is illegal
|
||||
=== unknown specifier
|
||||
dhcpd-pools: unknown --skip specifier: okish
|
||||
=== color mode
|
||||
dhcpd-pools: unknown color mode: 'sometimes'
|
||||
=== IPv5
|
||||
dhcpd-pools: unknown --ip-version argument: 5
|
||||
=== missing conf
|
||||
dhcpd-pools: cannot open inlude: ./tests/confs/complete_NXFILE: No such file or directory
|
||||
Ranges:
|
||||
shared net name first ip last ip max cur percent touch t+c t+c perc
|
||||
|
||||
Shared networks:
|
||||
name max cur percent touch t+c t+c perc
|
||||
|
||||
Sum of all ranges:
|
||||
name max cur percent touch t+c t+c perc
|
||||
[1;34mAll networks 0 0 nan 0 0 nan[0m
|
||||
=== missing leases
|
||||
dhcpd-pools: parse_leases: ./tests/leases/complete_NXFILE: No such file or directory
|
||||
=== html table
|
||||
dhcpd-pools: html table only output format is deprecated
|
||||
=== none existing format
|
||||
dhcpd-pools: unknown output format: 'z'
|
||||
=== broken percent input
|
||||
dhcpd-pools: illegal argument: 'eighty'
|
||||
284
tests/expected/formats
Normal file
284
tests/expected/formats
Normal file
|
|
@ -0,0 +1,284 @@
|
|||
=== color text
|
||||
Ranges:
|
||||
shared net name first ip last ip max cur percent touch t+c t+c perc
|
||||
example1 10.0.0.1 - 10.0.0.20 20 11 55.000 0 11 55.000
|
||||
example1 10.1.0.1 - 10.1.0.20 20 10 50.000 0 10 50.000
|
||||
example2 10.2.0.1 - 10.2.0.20 20 8 40.000 0 8 40.000
|
||||
example2 10.3.0.1 - 10.3.0.20 20 9 45.000 0 9 45.000
|
||||
All networks 10.4.0.1 - 10.4.0.20 20 5 25.000 0 5 25.000
|
||||
|
||||
Shared networks:
|
||||
name max cur percent touch t+c t+c perc
|
||||
example1 40 21 52.500 0 21 52.500
|
||||
example2 40 17 42.500 0 17 42.500
|
||||
|
||||
Sum of all ranges:
|
||||
name max cur percent touch t+c t+c perc
|
||||
All networks 100 43 43.000 0 43 43.000
|
||||
=== html
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>ISC dhcpd dhcpd-pools output</title>
|
||||
<meta charset="utf-8">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" type="text/css">
|
||||
<link rel="stylesheet" type="text/css" href="https://cdn.datatables.net/v/dt/dt-2.2.2/datatables.min.css">
|
||||
<style type="text/css">
|
||||
table.dhcpd-pools th { text-transform: capitalize }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div class="container">
|
||||
<h2>ISC DHCPD status</h2>
|
||||
<h3>Sum of all</h3>
|
||||
<table id="a" class="dhcpd-pools order-column table table-hover" summary="all">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>name</th>
|
||||
<th>max</th>
|
||||
<th>cur</th>
|
||||
<th>free</th>
|
||||
<th>percent</th>
|
||||
<th>touch</th>
|
||||
<th>t+c</th>
|
||||
<th>t+c perc</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>All networks</td>
|
||||
<td>100</td>
|
||||
<td>43</td>
|
||||
<td>57</td>
|
||||
<td>43.000</td>
|
||||
<td>0</td>
|
||||
<td>43</td>
|
||||
<td>43.000</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<h3>Shared networks</h3>
|
||||
<table id="s" class="dhcpd-pools order-column table table-hover" summary="snet">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>name</th>
|
||||
<th>max</th>
|
||||
<th>cur</th>
|
||||
<th>free</th>
|
||||
<th>percent</th>
|
||||
<th>touch</th>
|
||||
<th>t+c</th>
|
||||
<th>t+c perc</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>example1</td>
|
||||
<td>40</td>
|
||||
<td>21</td>
|
||||
<td>19</td>
|
||||
<td>52.5</td>
|
||||
<td>0</td>
|
||||
<td>21</td>
|
||||
<td>52.500</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>example2</td>
|
||||
<td>40</td>
|
||||
<td>17</td>
|
||||
<td>23</td>
|
||||
<td>42.5</td>
|
||||
<td>0</td>
|
||||
<td>17</td>
|
||||
<td>42.500</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<h3>Ranges</h3>
|
||||
<table id="r" class="dhcpd-pools order-column table table-hover" summary="ranges">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>shared net name</th>
|
||||
<th>first ip</th>
|
||||
<th>last ip</th>
|
||||
<th>max</th>
|
||||
<th>cur</th>
|
||||
<th>free</th>
|
||||
<th>percent</th>
|
||||
<th>touch</th>
|
||||
<th>t+c</th>
|
||||
<th>t+c perc</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>example1</td>
|
||||
<td>10.0.0.1</td>
|
||||
<td>10.0.0.20</td>
|
||||
<td>20</td>
|
||||
<td>11</td>
|
||||
<td>9</td>
|
||||
<td>55</td>
|
||||
<td>0</td>
|
||||
<td>11</td>
|
||||
<td>55.000</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>example1</td>
|
||||
<td>10.1.0.1</td>
|
||||
<td>10.1.0.20</td>
|
||||
<td>20</td>
|
||||
<td>10</td>
|
||||
<td>10</td>
|
||||
<td>50</td>
|
||||
<td>0</td>
|
||||
<td>10</td>
|
||||
<td>50.000</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>example2</td>
|
||||
<td>10.2.0.1</td>
|
||||
<td>10.2.0.20</td>
|
||||
<td>20</td>
|
||||
<td>8</td>
|
||||
<td>12</td>
|
||||
<td>40</td>
|
||||
<td>0</td>
|
||||
<td>8</td>
|
||||
<td>40.000</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>example2</td>
|
||||
<td>10.3.0.1</td>
|
||||
<td>10.3.0.20</td>
|
||||
<td>20</td>
|
||||
<td>9</td>
|
||||
<td>11</td>
|
||||
<td>45</td>
|
||||
<td>0</td>
|
||||
<td>9</td>
|
||||
<td>45.000</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>All networks</td>
|
||||
<td>10.4.0.1</td>
|
||||
<td>10.4.0.20</td>
|
||||
<td>20</td>
|
||||
<td>5</td>
|
||||
<td>15</td>
|
||||
<td>25</td>
|
||||
<td>0</td>
|
||||
<td>5</td>
|
||||
<td>25.000</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<br /><div class="well well-lg">
|
||||
More info at <a href="https://dhcpd-pools.sourceforge.net/">https://dhcpd-pools.sourceforge.net/</a>
|
||||
</small></div></div>
|
||||
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.min.js" type="text/javascript"></script>
|
||||
<script type="text/javascript" src="https://cdn.datatables.net/v/dt/dt-2.2.2/datatables.min.js"></script>
|
||||
<script type="text/javascript" class="init">$(document).ready(function() { $('#s').DataTable({ "iDisplayLength": 50, "lengthMenu": [ [25, 50, 100, -1], [25, 50, 100, "All"] ], "order": [[ 4, "desc" ]] } ); } );</script>
|
||||
<script type="text/javascript" class="init">$(document).ready(function() { $('#r').DataTable({ "iDisplayLength": 100, "lengthMenu": [ [25, 50, 100, -1], [25, 50, 100, "All"] ], "order": [[ 6, "desc" ]] } ); } );</script>
|
||||
</body></html>
|
||||
=== xml
|
||||
<dhcpstatus>
|
||||
<subnet>
|
||||
<location>example1</location>
|
||||
<range>10.0.0.1 - 10.0.0.20</range>
|
||||
<defined>20</defined>
|
||||
<used>11</used>
|
||||
<touched>0</touched>
|
||||
<free>9</free>
|
||||
</subnet>
|
||||
<subnet>
|
||||
<location>example1</location>
|
||||
<range>10.1.0.1 - 10.1.0.20</range>
|
||||
<defined>20</defined>
|
||||
<used>10</used>
|
||||
<touched>0</touched>
|
||||
<free>10</free>
|
||||
</subnet>
|
||||
<subnet>
|
||||
<location>example2</location>
|
||||
<range>10.2.0.1 - 10.2.0.20</range>
|
||||
<defined>20</defined>
|
||||
<used>8</used>
|
||||
<touched>0</touched>
|
||||
<free>12</free>
|
||||
</subnet>
|
||||
<subnet>
|
||||
<location>example2</location>
|
||||
<range>10.3.0.1 - 10.3.0.20</range>
|
||||
<defined>20</defined>
|
||||
<used>9</used>
|
||||
<touched>0</touched>
|
||||
<free>11</free>
|
||||
</subnet>
|
||||
<subnet>
|
||||
<location>All networks</location>
|
||||
<range>10.4.0.1 - 10.4.0.20</range>
|
||||
<defined>20</defined>
|
||||
<used>5</used>
|
||||
<touched>0</touched>
|
||||
<free>15</free>
|
||||
</subnet>
|
||||
<shared-network>
|
||||
<location>example1</location>
|
||||
<defined>40</defined>
|
||||
<used>21</used>
|
||||
<touched>0</touched>
|
||||
<free>19</free>
|
||||
</shared-network>
|
||||
<shared-network>
|
||||
<location>example2</location>
|
||||
<defined>40</defined>
|
||||
<used>17</used>
|
||||
<touched>0</touched>
|
||||
<free>23</free>
|
||||
</shared-network>
|
||||
<summary>
|
||||
<location>All networks</location>
|
||||
<defined>100</defined>
|
||||
<used>43</used>
|
||||
<touched>0</touched>
|
||||
<free>57</free>
|
||||
</summary>
|
||||
</dhcpstatus>
|
||||
=== csv
|
||||
"Ranges:"
|
||||
"shared net name","first ip","last ip","max","cur","percent","touch","t+c","t+c perc"
|
||||
"example1","10.0.0.1","10.0.0.20","20","11","55.000","0","11","55.000"
|
||||
"example1","10.1.0.1","10.1.0.20","20","10","50.000","0","10","50.000"
|
||||
"example2","10.2.0.1","10.2.0.20","20","8","40.000","0","8","40.000"
|
||||
"example2","10.3.0.1","10.3.0.20","20","9","45.000","0","9","45.000"
|
||||
"All networks","10.4.0.1","10.4.0.20","20","5","25.000","0","5","25.000"
|
||||
|
||||
"Shared networks:"
|
||||
"name","max","cur","percent","touch","t+c","t+c perc"
|
||||
"example1","40","21","52.500","0","21","52.500"
|
||||
"example2","40","17","42.500","0","17","42.500"
|
||||
|
||||
"Sum of all ranges:"
|
||||
"name","max","cur","percent","touch","t+c","t+c perc"
|
||||
"All networks","100","43","43.000","0","43","43.000"
|
||||
=== json
|
||||
{
|
||||
"subnets": [
|
||||
{ "location":"example1", "range":"10.0.0.1 - 10.0.0.20", "first_ip":"10.0.0.1", "last_ip":"10.0.0.20", "defined":20, "used":11, "touched":0, "free":9, "percent":55, "touch_count":11, "touch_percent":55, "status":0 },
|
||||
{ "location":"example1", "range":"10.1.0.1 - 10.1.0.20", "first_ip":"10.1.0.1", "last_ip":"10.1.0.20", "defined":20, "used":10, "touched":0, "free":10, "percent":50, "touch_count":10, "touch_percent":50, "status":0 },
|
||||
{ "location":"example2", "range":"10.2.0.1 - 10.2.0.20", "first_ip":"10.2.0.1", "last_ip":"10.2.0.20", "defined":20, "used":8, "touched":0, "free":12, "percent":40, "touch_count":8, "touch_percent":40, "status":0 },
|
||||
{ "location":"example2", "range":"10.3.0.1 - 10.3.0.20", "first_ip":"10.3.0.1", "last_ip":"10.3.0.20", "defined":20, "used":9, "touched":0, "free":11, "percent":45, "touch_count":9, "touch_percent":45, "status":0 },
|
||||
{ "location":"All networks", "range":"10.4.0.1 - 10.4.0.20", "first_ip":"10.4.0.1", "last_ip":"10.4.0.20", "defined":20, "used":5, "touched":0, "free":15, "percent":25, "touch_count":5, "touch_percent":25, "status":0 }
|
||||
],
|
||||
"shared-networks": [
|
||||
{ "location":"example1", "defined":40, "used":21, "touched":0, "free":19, "percent":52.5, "touch_count":21, "touch_percent":52.5, "status":0 },
|
||||
{ "location":"example2", "defined":40, "used":17, "touched":0, "free":23, "percent":42.5, "touch_count":17, "touch_percent":42.5, "status":0 }
|
||||
]
|
||||
}
|
||||
=== perfdata
|
||||
CRITICAL: dhcpd-pools: Ranges - crit: 3 warn: 2 ok: 0; | range_crit=3 range_warn=2 range_ok=0 10.4.0.1_r=5;4;8;0;20 10.4.0.1_rt=0 10.3.0.1_r=9;4;8;0;20 10.3.0.1_rt=0 10.2.0.1_r=8;4;8;0;20 10.2.0.1_rt=0 10.1.0.1_r=10;4;8;0;20 10.1.0.1_rt=0 10.0.0.1_r=11;4;8;0;20 10.0.0.1_rt=0
|
||||
Shared nets - crit: 2 warn: 0 ok: 0; | snet_crit=2 snet_warn=0 snet_ok=0 'example1_s'=21;8;16;0;40 'example1_st'=0 'example2_s'=17;8;16;0;40 'example2_st'=0
|
||||
|
||||
|
|
@ -1,3 +1,54 @@
|
|||
Ethernets:
|
||||
macaddress: 00:00:00:00:00:01 ip: 10.0.0.1
|
||||
macaddress: 00:00:00:00:00:02 ip: 10.0.0.2
|
||||
macaddress: 00:00:00:00:00:03 ip: 10.0.0.3
|
||||
macaddress: 00:00:00:00:00:04 ip: 10.0.0.4
|
||||
macaddress: 00:00:00:00:00:05 ip: 10.0.0.5
|
||||
macaddress: 00:00:00:00:00:06 ip: 10.0.0.6
|
||||
macaddress: 00:00:00:00:00:07 ip: 10.0.0.7
|
||||
macaddress: 00:00:00:00:00:08 ip: 10.0.0.8
|
||||
macaddress: 00:00:00:00:00:09 ip: 10.0.0.9
|
||||
macaddress: 00:00:00:00:00:10 ip: 10.0.0.10
|
||||
macaddress: 00:00:00:00:00:11 ip: 10.0.0.11
|
||||
macaddress: 00:00:00:00:00:12 ip: 10.0.0.12
|
||||
macaddress: 00:00:00:00:01:00 ip: 10.1.0.0
|
||||
macaddress: 00:00:00:00:01:01 ip: 10.1.0.1
|
||||
macaddress: 00:00:00:00:01:02 ip: 10.1.0.2
|
||||
macaddress: 00:00:00:00:01:03 ip: 10.1.0.3
|
||||
macaddress: 00:00:00:00:01:04 ip: 10.1.0.4
|
||||
macaddress: 00:00:00:00:01:05 ip: 10.1.0.5
|
||||
macaddress: 00:00:00:00:01:06 ip: 10.1.0.6
|
||||
macaddress: 00:00:00:00:01:07 ip: 10.1.0.7
|
||||
macaddress: 00:00:00:00:01:08 ip: 10.1.0.8
|
||||
macaddress: 00:00:00:00:01:09 ip: 10.1.0.9
|
||||
macaddress: 00:00:00:00:01:10 ip: 10.1.0.10
|
||||
macaddress: 00:00:00:00:02:00 ip: 10.2.0.0
|
||||
macaddress: 00:00:00:00:02:01 ip: 10.2.0.1
|
||||
macaddress: 00:00:00:00:02:02 ip: 10.2.0.2
|
||||
macaddress: 00:00:00:00:02:03 ip: 10.2.0.3
|
||||
macaddress: 00:00:00:00:02:04 ip: 10.2.0.4
|
||||
macaddress: 00:00:00:00:02:05 ip: 10.2.0.5
|
||||
macaddress: 00:00:00:00:02:06 ip: 10.2.0.6
|
||||
macaddress: 00:00:00:00:02:07 ip: 10.2.0.7
|
||||
macaddress: 00:00:00:00:02:08 ip: 10.2.0.8
|
||||
macaddress: 00:00:00:00:03:00 ip: 10.3.0.0
|
||||
macaddress: 00:00:00:00:03:01 ip: 10.3.0.1
|
||||
macaddress: 00:00:00:00:03:02 ip: 10.3.0.2
|
||||
macaddress: 00:00:00:00:03:03 ip: 10.3.0.3
|
||||
macaddress: 00:00:00:00:03:04 ip: 10.3.0.4
|
||||
macaddress: 00:00:00:00:03:05 ip: 10.3.0.5
|
||||
macaddress: 00:00:00:00:03:06 ip: 10.3.0.6
|
||||
macaddress: 00:00:00:00:03:07 ip: 10.3.0.7
|
||||
macaddress: 00:00:00:00:03:08 ip: 10.3.0.8
|
||||
macaddress: 00:00:00:00:03:09 ip: 10.3.0.9
|
||||
macaddress: 00:00:00:00:04:00 ip: 10.4.0.0
|
||||
macaddress: 00:00:00:00:04:01 ip: 10.4.0.1
|
||||
macaddress: 00:00:00:00:04:02 ip: 10.4.0.2
|
||||
macaddress: 00:00:00:00:04:03 ip: 10.4.0.3
|
||||
macaddress: 00:00:00:00:04:04 ip: 10.4.0.4
|
||||
macaddress: 00:00:00:00:04:05 ip: 10.4.0.5
|
||||
macaddress: 00:00:00:00:04:06 ip: 10.4.0.6
|
||||
|
||||
Subnets:
|
||||
location: example1
|
||||
range: 10.0.0.1 - 10.0.0.20
|
||||
|
|
@ -120,7 +171,64 @@ number_of_shared_networks: 2
|
|||
|
||||
|
||||
|
||||
|
||||
number_of_ranges_warning: 0
|
||||
number_of_ranges_critical: 0
|
||||
number_of_shared_networks: 2
|
||||
number_of_shared_networks_warning: 0
|
||||
number_of_shared_networks_critical: 0
|
||||
--- skip ok ---
|
||||
Ethernets:
|
||||
macaddress: 00:00:00:00:00:01 ip: 10.0.0.1
|
||||
macaddress: 00:00:00:00:00:02 ip: 10.0.0.2
|
||||
macaddress: 00:00:00:00:00:03 ip: 10.0.0.3
|
||||
macaddress: 00:00:00:00:00:04 ip: 10.0.0.4
|
||||
macaddress: 00:00:00:00:00:05 ip: 10.0.0.5
|
||||
macaddress: 00:00:00:00:00:06 ip: 10.0.0.6
|
||||
macaddress: 00:00:00:00:00:07 ip: 10.0.0.7
|
||||
macaddress: 00:00:00:00:00:08 ip: 10.0.0.8
|
||||
macaddress: 00:00:00:00:00:09 ip: 10.0.0.9
|
||||
macaddress: 00:00:00:00:00:10 ip: 10.0.0.10
|
||||
macaddress: 00:00:00:00:00:11 ip: 10.0.0.11
|
||||
macaddress: 00:00:00:00:00:12 ip: 10.0.0.12
|
||||
macaddress: 00:00:00:00:01:00 ip: 10.1.0.0
|
||||
macaddress: 00:00:00:00:01:01 ip: 10.1.0.1
|
||||
macaddress: 00:00:00:00:01:02 ip: 10.1.0.2
|
||||
macaddress: 00:00:00:00:01:03 ip: 10.1.0.3
|
||||
macaddress: 00:00:00:00:01:04 ip: 10.1.0.4
|
||||
macaddress: 00:00:00:00:01:05 ip: 10.1.0.5
|
||||
macaddress: 00:00:00:00:01:06 ip: 10.1.0.6
|
||||
macaddress: 00:00:00:00:01:07 ip: 10.1.0.7
|
||||
macaddress: 00:00:00:00:01:08 ip: 10.1.0.8
|
||||
macaddress: 00:00:00:00:01:09 ip: 10.1.0.9
|
||||
macaddress: 00:00:00:00:01:10 ip: 10.1.0.10
|
||||
macaddress: 00:00:00:00:02:00 ip: 10.2.0.0
|
||||
macaddress: 00:00:00:00:02:01 ip: 10.2.0.1
|
||||
macaddress: 00:00:00:00:02:02 ip: 10.2.0.2
|
||||
macaddress: 00:00:00:00:02:03 ip: 10.2.0.3
|
||||
macaddress: 00:00:00:00:02:04 ip: 10.2.0.4
|
||||
macaddress: 00:00:00:00:02:05 ip: 10.2.0.5
|
||||
macaddress: 00:00:00:00:02:06 ip: 10.2.0.6
|
||||
macaddress: 00:00:00:00:02:07 ip: 10.2.0.7
|
||||
macaddress: 00:00:00:00:02:08 ip: 10.2.0.8
|
||||
macaddress: 00:00:00:00:03:00 ip: 10.3.0.0
|
||||
macaddress: 00:00:00:00:03:01 ip: 10.3.0.1
|
||||
macaddress: 00:00:00:00:03:02 ip: 10.3.0.2
|
||||
macaddress: 00:00:00:00:03:03 ip: 10.3.0.3
|
||||
macaddress: 00:00:00:00:03:04 ip: 10.3.0.4
|
||||
macaddress: 00:00:00:00:03:05 ip: 10.3.0.5
|
||||
macaddress: 00:00:00:00:03:06 ip: 10.3.0.6
|
||||
macaddress: 00:00:00:00:03:07 ip: 10.3.0.7
|
||||
macaddress: 00:00:00:00:03:08 ip: 10.3.0.8
|
||||
macaddress: 00:00:00:00:03:09 ip: 10.3.0.9
|
||||
macaddress: 00:00:00:00:04:00 ip: 10.4.0.0
|
||||
macaddress: 00:00:00:00:04:01 ip: 10.4.0.1
|
||||
macaddress: 00:00:00:00:04:02 ip: 10.4.0.2
|
||||
macaddress: 00:00:00:00:04:03 ip: 10.4.0.3
|
||||
macaddress: 00:00:00:00:04:04 ip: 10.4.0.4
|
||||
macaddress: 00:00:00:00:04:05 ip: 10.4.0.5
|
||||
macaddress: 00:00:00:00:04:06 ip: 10.4.0.6
|
||||
|
||||
Subnets:
|
||||
location: example1
|
||||
range: 10.0.0.1 - 10.0.0.20
|
||||
|
|
@ -201,3 +309,9 @@ number_of_shared_networks: 2
|
|||
|
||||
|
||||
|
||||
|
||||
number_of_ranges_warning: 3
|
||||
number_of_ranges_critical: 0
|
||||
number_of_shared_networks: 2
|
||||
number_of_shared_networks_warning: 1
|
||||
number_of_shared_networks_critical: 0
|
||||
|
|
|
|||
1
tests/expected/parser
Symbolic link
1
tests/expected/parser
Symbolic link
|
|
@ -0,0 +1 @@
|
|||
complete
|
||||
|
|
@ -1,6 +1,6 @@
|
|||
{
|
||||
"active_leases": [
|
||||
{ "ip":"10.0.0.5", "macaddress":"00:00:00:00:00:00" }
|
||||
{ "ip":"10.0.0.5", "macaddress":"00:00:00:00:00:00", "starts":"", "ends":"", "hostname":"" }
|
||||
],
|
||||
"subnets": [
|
||||
{ "location":"All networks", "range":"10.0.0.1 - 10.0.0.10", "first_ip":"10.0.0.1", "last_ip":"10.0.0.10", "defined":10, "used":1, "touched":0, "free":9, "percent":10, "touch_count":1, "touch_percent":10, "status":0 }
|
||||
|
|
|
|||
|
|
@ -2,6 +2,9 @@
|
|||
<active_lease>
|
||||
<ip>10.0.0.5</ip>
|
||||
<macaddress>00:00:00:00:00:00</macaddress>
|
||||
<starts></starts>
|
||||
<ends></ends>
|
||||
<hostname></hostname>
|
||||
</active_lease>
|
||||
<subnet>
|
||||
<location>All networks</location>
|
||||
|
|
|
|||
16
tests/expected/shufled
Normal file
16
tests/expected/shufled
Normal file
|
|
@ -0,0 +1,16 @@
|
|||
Ranges:
|
||||
shared net name first ip last ip max cur percent touch t+c t+c perc
|
||||
All networks 10.4.0.1 - 10.4.0.20 20 3 15.000 0 3 15.000
|
||||
example1 10.0.0.1 - 10.0.0.20 20 9 45.000 0 9 45.000
|
||||
example1 10.1.0.1 - 10.1.0.20 20 4 20.000 0 4 20.000
|
||||
example2 10.2.0.1 - 10.2.0.20 20 4 20.000 0 4 20.000
|
||||
example2 10.3.0.1 - 10.3.0.20 20 3 15.000 0 3 15.000
|
||||
|
||||
Shared networks:
|
||||
name max cur percent touch t+c t+c perc
|
||||
example1 40 13 32.500 0 13 32.500
|
||||
example2 40 7 17.500 0 7 17.500
|
||||
|
||||
Sum of all ranges:
|
||||
name max cur percent touch t+c t+c perc
|
||||
All networks 100 23 23.000 0 23 23.000
|
||||
|
|
@ -34,7 +34,7 @@ Sum of all ranges:
|
|||
name max cur percent touch t+c t+c perc
|
||||
All networks 100 43 43.000 0 43 43.000
|
||||
0
|
||||
== maxium ==
|
||||
== maximum ==
|
||||
Ranges:
|
||||
shared net name first ip last ip max cur percent touch t+c t+c perc
|
||||
All networks 10.4.0.1 - 10.4.0.20 20 5 25.000 0 5 25.000
|
||||
|
|
|
|||
29
tests/expected/statuses
Normal file
29
tests/expected/statuses
Normal file
|
|
@ -0,0 +1,29 @@
|
|||
{
|
||||
"subnets": [
|
||||
{ "location":"example1", "range":"10.0.0.1 - 10.0.0.20", "first_ip":"10.0.0.1", "last_ip":"10.0.0.20", "defined":20, "used":11, "touched":0, "free":9, "percent":55, "touch_count":11, "touch_percent":55, "status":4 },
|
||||
{ "location":"example1", "range":"10.1.0.1 - 10.1.0.20", "first_ip":"10.1.0.1", "last_ip":"10.1.0.20", "defined":20, "used":10, "touched":0, "free":10, "percent":50, "touch_count":10, "touch_percent":50, "status":4 },
|
||||
{ "location":"example2", "range":"10.2.0.1 - 10.2.0.20", "first_ip":"10.2.0.1", "last_ip":"10.2.0.20", "defined":20, "used":8, "touched":0, "free":12, "percent":40, "touch_count":8, "touch_percent":40, "status":4 },
|
||||
{ "location":"example2", "range":"10.3.0.1 - 10.3.0.20", "first_ip":"10.3.0.1", "last_ip":"10.3.0.20", "defined":20, "used":9, "touched":0, "free":11, "percent":45, "touch_count":9, "touch_percent":45, "status":4 },
|
||||
{ "location":"10.4.0.0/24", "range":"10.4.0.1 - 10.4.0.20", "first_ip":"10.4.0.1", "last_ip":"10.4.0.20", "defined":20, "used":5, "touched":0, "free":15, "percent":25, "touch_count":5, "touch_percent":25, "status":4 }
|
||||
],
|
||||
"shared-networks": [
|
||||
{ "location":"example1", "defined":40, "used":21, "touched":0, "free":19, "percent":52.5, "touch_count":21, "touch_percent":52.5, "status":2 },
|
||||
{ "location":"example2", "defined":40, "used":17, "touched":0, "free":23, "percent":42.5, "touch_count":17, "touch_percent":42.5, "status":2 },
|
||||
{ "location":"10.4.0.0/24", "defined":20, "used":5, "touched":0, "free":15, "percent":25, "touch_count":5, "touch_percent":25, "status":1 }
|
||||
]
|
||||
}
|
||||
== minsize
|
||||
{
|
||||
"subnets": [
|
||||
{ "location":"example1", "range":"10.0.0.1 - 10.0.0.20", "first_ip":"10.0.0.1", "last_ip":"10.0.0.20", "defined":20, "used":11, "touched":0, "free":9, "percent":55, "touch_count":11, "touch_percent":55, "status":3 },
|
||||
{ "location":"example1", "range":"10.1.0.1 - 10.1.0.20", "first_ip":"10.1.0.1", "last_ip":"10.1.0.20", "defined":20, "used":10, "touched":0, "free":10, "percent":50, "touch_count":10, "touch_percent":50, "status":3 },
|
||||
{ "location":"example2", "range":"10.2.0.1 - 10.2.0.20", "first_ip":"10.2.0.1", "last_ip":"10.2.0.20", "defined":20, "used":8, "touched":0, "free":12, "percent":40, "touch_count":8, "touch_percent":40, "status":3 },
|
||||
{ "location":"example2", "range":"10.3.0.1 - 10.3.0.20", "first_ip":"10.3.0.1", "last_ip":"10.3.0.20", "defined":20, "used":9, "touched":0, "free":11, "percent":45, "touch_count":9, "touch_percent":45, "status":3 },
|
||||
{ "location":"10.4.0.0/24", "range":"10.4.0.1 - 10.4.0.20", "first_ip":"10.4.0.1", "last_ip":"10.4.0.20", "defined":20, "used":5, "touched":0, "free":15, "percent":25, "touch_count":5, "touch_percent":25, "status":3 }
|
||||
],
|
||||
"shared-networks": [
|
||||
{ "location":"example1", "defined":40, "used":21, "touched":0, "free":19, "percent":52.5, "touch_count":21, "touch_percent":52.5, "status":2 },
|
||||
{ "location":"example2", "defined":40, "used":17, "touched":0, "free":23, "percent":42.5, "touch_count":17, "touch_percent":42.5, "status":2 },
|
||||
{ "location":"10.4.0.0/24", "defined":20, "used":5, "touched":0, "free":15, "percent":25, "touch_count":5, "touch_percent":25, "status":3 }
|
||||
]
|
||||
}
|
||||
37
tests/formats
Executable file
37
tests/formats
Executable file
|
|
@ -0,0 +1,37 @@
|
|||
#!/bin/sh
|
||||
#
|
||||
# Minimal regression test suite.
|
||||
|
||||
IAM=$(basename $0)
|
||||
|
||||
if [ ! -d tests/outputs ]; then
|
||||
mkdir tests/outputs
|
||||
fi
|
||||
|
||||
echo '=== color text' > tests/outputs/$IAM
|
||||
dhcpd-pools -c $top_srcdir/tests/confs/$IAM --color=always \
|
||||
-l $top_srcdir/tests/leases/$IAM >> tests/outputs/$IAM
|
||||
|
||||
echo '=== html' >> tests/outputs/$IAM
|
||||
dhcpd-pools -c $top_srcdir/tests/confs/$IAM --color=always --format=H \
|
||||
-l $top_srcdir/tests/leases/$IAM |
|
||||
sed '/was last modified at/d; /Generated using/d' >> tests/outputs/$IAM
|
||||
|
||||
echo '=== xml' >> tests/outputs/$IAM
|
||||
dhcpd-pools -c $top_srcdir/tests/confs/$IAM -fx \
|
||||
-l $top_srcdir/tests/leases/$IAM >> tests/outputs/$IAM
|
||||
|
||||
echo '=== csv' >> tests/outputs/$IAM
|
||||
dhcpd-pools -c $top_srcdir/tests/confs/$IAM -fc \
|
||||
-l $top_srcdir/tests/leases/$IAM >> tests/outputs/$IAM
|
||||
|
||||
echo '=== json' >> tests/outputs/$IAM
|
||||
dhcpd-pools -c $top_srcdir/tests/confs/$IAM -fj --limit=33 \
|
||||
-l $top_srcdir/tests/leases/$IAM >> tests/outputs/$IAM
|
||||
|
||||
echo '=== perfdata' >> tests/outputs/$IAM
|
||||
dhcpd-pools -c $top_srcdir/tests/confs/$IAM --perfdata --warning=20 --critical=40 \
|
||||
-l $top_srcdir/tests/leases/$IAM >> tests/outputs/$IAM
|
||||
|
||||
diff -u $top_srcdir/tests/expected/$IAM tests/outputs/$IAM
|
||||
exit $?
|
||||
241
tests/leases/binding-states
Normal file
241
tests/leases/binding-states
Normal file
|
|
@ -0,0 +1,241 @@
|
|||
lease 10.0.0.0 {
|
||||
binding state active;
|
||||
hardware ethernet 00:00:00:00:00:00;
|
||||
}
|
||||
|
||||
lease 10.0.0.1 {
|
||||
binding state free;
|
||||
hardware ethernet 00:00:00:00:00:01;
|
||||
}
|
||||
lease 10.0.0.1 {
|
||||
binding state active;
|
||||
hardware ethernet 00:00:00:00:00:01;
|
||||
}
|
||||
lease 10.0.0.1 {
|
||||
binding state abandoned;
|
||||
hardware ethernet 00:00:00:00:00:01;
|
||||
}
|
||||
lease 10.0.0.1 {
|
||||
binding state expired;
|
||||
hardware ethernet 00:00:00:00:00:01;
|
||||
}
|
||||
lease 10.0.0.1 {
|
||||
binding state released;
|
||||
hardware ethernet 00:00:00:00:00:01;
|
||||
}
|
||||
lease 10.0.0.1 {
|
||||
binding state backup;
|
||||
hardware ethernet 00:00:00:00:00:01;
|
||||
}
|
||||
|
||||
lease 10.0.0.2 {
|
||||
binding state free;
|
||||
hardware ethernet 00:00:00:00:00:02;
|
||||
}
|
||||
lease 10.0.0.2 {
|
||||
binding state abandoned;
|
||||
hardware ethernet 00:00:00:00:00:02;
|
||||
}
|
||||
lease 10.0.0.2 {
|
||||
binding state expired;
|
||||
hardware ethernet 00:00:00:00:00:02;
|
||||
}
|
||||
lease 10.0.0.2 {
|
||||
binding state released;
|
||||
hardware ethernet 00:00:00:00:00:02;
|
||||
}
|
||||
lease 10.0.0.2 {
|
||||
binding state backup;
|
||||
hardware ethernet 00:00:00:00:00:02;
|
||||
}
|
||||
lease 10.0.0.2 {
|
||||
binding state active;
|
||||
hardware ethernet 00:00:00:00:00:02;
|
||||
}
|
||||
|
||||
lease 10.0.0.3 {
|
||||
binding state free;
|
||||
hardware ethernet 00:00:00:00:00:03;
|
||||
}
|
||||
lease 10.0.0.4 {
|
||||
binding state active;
|
||||
hardware ethernet 00:00:00:00:00:04;
|
||||
}
|
||||
lease 10.0.0.5 {
|
||||
binding state expired;
|
||||
hardware ethernet 00:00:00:00:00:05;
|
||||
}
|
||||
lease 10.0.0.6 {
|
||||
binding state released;
|
||||
hardware ethernet 00:00:00:00:00:06;
|
||||
}
|
||||
lease 10.0.0.7 {
|
||||
binding state backup;
|
||||
hardware ethernet 00:00:00:00:00:07;
|
||||
}
|
||||
lease 10.0.0.8 {
|
||||
binding state none-existing-state;
|
||||
hardware ethernet 00:00:00:00:00:08;
|
||||
}
|
||||
lease 10.0.0.9 {
|
||||
binding state active;
|
||||
hardware ethernet 00:00:00:00:00:09;
|
||||
}
|
||||
lease 10.0.0.20 {
|
||||
binding state active;
|
||||
hardware ethernet 00:00:00:00:00:10;
|
||||
}
|
||||
lease 10.0.0.21 {
|
||||
binding state active;
|
||||
hardware ethernet 00:00:00:00:00:11;
|
||||
}
|
||||
|
||||
|
||||
lease 10.1.0.0 {
|
||||
binding state active;
|
||||
hardware ethernet 00:00:00:00:00:00;
|
||||
}
|
||||
lease 10.1.0.1 {
|
||||
binding state active;
|
||||
hardware ethernet 00:00:00:00:00:01;
|
||||
}
|
||||
lease 10.1.0.2 {
|
||||
binding state active;
|
||||
hardware ethernet 00:00:00:00:00:02;
|
||||
}
|
||||
lease 10.1.0.3 {
|
||||
binding state active;
|
||||
hardware ethernet 00:00:00:00:00:03;
|
||||
}
|
||||
lease 10.1.0.4 {
|
||||
binding state active;
|
||||
hardware ethernet 00:00:00:00:00:04;
|
||||
}
|
||||
lease 10.1.0.5 {
|
||||
binding state active;
|
||||
hardware ethernet 00:00:00:00:00:05;
|
||||
}
|
||||
lease 10.1.0.6 {
|
||||
binding state active;
|
||||
hardware ethernet 00:00:00:00:00:06;
|
||||
}
|
||||
lease 10.1.0.7 {
|
||||
binding state active;
|
||||
hardware ethernet 00:00:00:00:00:07;
|
||||
}
|
||||
lease 10.1.0.8 {
|
||||
binding state active;
|
||||
hardware ethernet 00:00:00:00:00:08;
|
||||
}
|
||||
lease 10.1.0.9 {
|
||||
binding state active;
|
||||
hardware ethernet 00:00:00:00:00:09;
|
||||
}
|
||||
lease 10.1.0.10 {
|
||||
binding state active;
|
||||
hardware ethernet 00:00:00:00:00:10;
|
||||
}
|
||||
|
||||
|
||||
lease 10.2.0.0 {
|
||||
binding state active;
|
||||
hardware ethernet 00:00:00:00:00:00;
|
||||
}
|
||||
lease 10.2.0.1 {
|
||||
binding state active;
|
||||
hardware ethernet 00:00:00:00:00:01;
|
||||
}
|
||||
lease 10.2.0.2 {
|
||||
binding state active;
|
||||
hardware ethernet 00:00:00:00:00:02;
|
||||
}
|
||||
lease 10.2.0.3 {
|
||||
binding state active;
|
||||
hardware ethernet 00:00:00:00:00:03;
|
||||
}
|
||||
lease 10.2.0.4 {
|
||||
binding state active;
|
||||
hardware ethernet 00:00:00:00:00:04;
|
||||
}
|
||||
lease 10.2.0.5 {
|
||||
binding state active;
|
||||
hardware ethernet 00:00:00:00:00:05;
|
||||
}
|
||||
lease 10.2.0.6 {
|
||||
binding state active;
|
||||
hardware ethernet 00:00:00:00:00:06;
|
||||
}
|
||||
lease 10.2.0.7 {
|
||||
binding state active;
|
||||
hardware ethernet 00:00:00:00:00:07;
|
||||
}
|
||||
lease 10.2.0.8 {
|
||||
binding state active;
|
||||
hardware ethernet 00:00:00:00:00:08;
|
||||
}
|
||||
|
||||
lease 10.3.0.0 {
|
||||
binding state active;
|
||||
hardware ethernet 00:00:00:00:00:00;
|
||||
}
|
||||
lease 10.3.0.1 {
|
||||
binding state active;
|
||||
hardware ethernet 00:00:00:00:00:01;
|
||||
}
|
||||
lease 10.3.0.2 {
|
||||
binding state active;
|
||||
hardware ethernet 00:00:00:00:00:02;
|
||||
}
|
||||
lease 10.3.0.3 {
|
||||
binding state active;
|
||||
hardware ethernet 00:00:00:00:00:03;
|
||||
}
|
||||
lease 10.3.0.4 {
|
||||
binding state active;
|
||||
hardware ethernet 00:00:00:00:00:04;
|
||||
}
|
||||
lease 10.3.0.5 {
|
||||
binding state active;
|
||||
hardware ethernet 00:00:00:00:00:05;
|
||||
}
|
||||
lease 10.3.0.6 {
|
||||
binding state active;
|
||||
hardware ethernet 00:00:00:00:00:06;
|
||||
}
|
||||
lease 10.3.0.7 {
|
||||
binding state active;
|
||||
hardware ethernet 00:00:00:00:00:07;
|
||||
}
|
||||
lease 10.3.0.8 {
|
||||
binding state active;
|
||||
hardware ethernet 00:00:00:00:00:08;
|
||||
}
|
||||
lease 10.3.0.9 {
|
||||
binding state active;
|
||||
hardware ethernet 00:00:00:00:00:09;
|
||||
}
|
||||
|
||||
lease 10.4.0.0 {
|
||||
binding state active;
|
||||
hardware ethernet 00:00:00:00:00:00;
|
||||
}
|
||||
lease 10.4.0.1 {
|
||||
binding state active;
|
||||
hardware ethernet 00:00:00:00:00:01;
|
||||
}
|
||||
lease 10.4.0.2 {
|
||||
binding state active;
|
||||
hardware ethernet 00:00:00:00:00:02;
|
||||
}
|
||||
lease 10.4.0.3 {
|
||||
binding state active;
|
||||
hardware ethernet 00:00:00:00:00:03;
|
||||
}
|
||||
lease 10.4.0.4 {
|
||||
binding state active;
|
||||
hardware ethernet 00:00:00:00:00:04;
|
||||
}
|
||||
lease 10.4.0.5 {
|
||||
binding state active;
|
||||
hardware ethernet 00:00:00:00:00:05;
|
||||
}
|
||||
1
tests/leases/cidr-v4
Symbolic link
1
tests/leases/cidr-v4
Symbolic link
|
|
@ -0,0 +1 @@
|
|||
complete
|
||||
1
tests/leases/cidr-v6
Symbolic link
1
tests/leases/cidr-v6
Symbolic link
|
|
@ -0,0 +1 @@
|
|||
v6
|
||||
1
tests/leases/formats
Symbolic link
1
tests/leases/formats
Symbolic link
|
|
@ -0,0 +1 @@
|
|||
complete
|
||||
1
tests/leases/parser
Symbolic link
1
tests/leases/parser
Symbolic link
|
|
@ -0,0 +1 @@
|
|||
complete
|
||||
198
tests/leases/shufled
Normal file
198
tests/leases/shufled
Normal file
|
|
@ -0,0 +1,198 @@
|
|||
lease 10.0.0.7 {
|
||||
}
|
||||
binding state active;
|
||||
hardware ethernet 00:00:00:00:00:07;
|
||||
hardware ethernet 00:00:00:00:00:10;
|
||||
lease 10.2.0.4 {
|
||||
lease 10.2.0.6 {
|
||||
lease 10.0.0.11 {
|
||||
binding state active;
|
||||
}
|
||||
hardware ethernet 00:00:00:00:00:03;
|
||||
lease 10.3.0.9 {
|
||||
}
|
||||
hardware ethernet 00:00:00:00:00:04;
|
||||
}
|
||||
binding state active;
|
||||
lease 10.1.0.7 {
|
||||
}
|
||||
}
|
||||
lease 10.1.0.9 {
|
||||
|
||||
hardware ethernet 00:00:00:00:00:07;
|
||||
hardware ethernet 00:00:00:00:00:01;
|
||||
binding state active;
|
||||
binding state active;
|
||||
}
|
||||
}
|
||||
}
|
||||
binding state active;
|
||||
lease 10.4.0.1 {
|
||||
}
|
||||
lease 10.0.0.0 {
|
||||
}
|
||||
hardware ethernet 00:00:00:00:00:10;
|
||||
}
|
||||
}
|
||||
binding state active;
|
||||
hardware ethernet 00:00:00:00:00:00;
|
||||
}
|
||||
}
|
||||
binding state active;
|
||||
}
|
||||
lease 10.3.0.2 {
|
||||
hardware ethernet 00:00:00:00:00:01;
|
||||
binding state active;
|
||||
hardware ethernet 00:00:00:00:00:02;
|
||||
binding state active;
|
||||
lease 10.1.0.3 {
|
||||
binding state active;
|
||||
}
|
||||
binding state active;
|
||||
}
|
||||
lease 10.1.0.1 {
|
||||
lease 10.3.0.8 {
|
||||
lease 10.2.0.1 {
|
||||
hardware ethernet 00:00:00:00:00:07;
|
||||
}
|
||||
}
|
||||
lease 10.4.0.0 {
|
||||
hardware ethernet 00:00:00:00:00:01;
|
||||
}
|
||||
binding state active;
|
||||
hardware ethernet 00:00:00:00:00:02;
|
||||
lease 10.0.0.10 {
|
||||
binding state active;
|
||||
}
|
||||
hardware ethernet 00:00:00:00:00:04;
|
||||
hardware ethernet 00:00:00:00:00:11;
|
||||
hardware ethernet 00:00:00:00:00:08;
|
||||
binding state active;
|
||||
hardware ethernet 00:00:00:00:00:08;
|
||||
binding state active;
|
||||
lease 10.2.0.5 {
|
||||
hardware ethernet 00:00:00:00:00:01;
|
||||
lease 10.1.0.8 {
|
||||
|
||||
lease 10.0.0.3 {
|
||||
binding state active;
|
||||
binding state active;
|
||||
lease 10.0.0.1 {
|
||||
lease 10.4.0.5 {
|
||||
hardware ethernet 00:00:00:00:00:06;
|
||||
|
||||
hardware ethernet 00:00:00:00:00:06;
|
||||
hardware ethernet 00:00:00:00:00:02;
|
||||
lease 10.2.0.3 {
|
||||
binding state active;
|
||||
lease 10.1.0.10 {
|
||||
binding state active;
|
||||
}
|
||||
}
|
||||
binding state active;
|
||||
hardware ethernet 00:00:00:00:00:03;
|
||||
}
|
||||
}
|
||||
hardware ethernet 00:00:00:00:00:05;
|
||||
lease 10.0.0.2 {
|
||||
}
|
||||
binding state active;
|
||||
}
|
||||
hardware ethernet 00:00:00:00:00:06;
|
||||
lease 10.3.0.6 {
|
||||
lease 10.0.0.8 {
|
||||
hardware ethernet 00:00:00:00:00:01;
|
||||
lease 10.4.0.3 {
|
||||
}
|
||||
}
|
||||
}
|
||||
binding state active;
|
||||
binding state active;
|
||||
lease 10.1.0.6 {
|
||||
lease 10.1.0.2 {
|
||||
hardware ethernet 00:00:00:00:00:05;
|
||||
binding state active;
|
||||
}
|
||||
}
|
||||
lease 10.2.0.7 {
|
||||
}
|
||||
}
|
||||
hardware ethernet 00:00:00:00:00:03;
|
||||
binding state active;
|
||||
|
||||
}
|
||||
binding state active;
|
||||
hardware ethernet 00:00:00:00:00:03;
|
||||
}
|
||||
lease 10.1.0.0 {
|
||||
hardware ethernet 00:00:00:00:00:04;
|
||||
binding state active;
|
||||
}
|
||||
lease 10.3.0.1 {
|
||||
lease 10.2.0.2 {
|
||||
binding state active;
|
||||
hardware ethernet 00:00:00:00:00:09;
|
||||
}
|
||||
binding state active;
|
||||
hardware ethernet 00:00:00:00:00:00;
|
||||
binding state active;
|
||||
lease 10.0.0.6 {
|
||||
hardware ethernet 00:00:00:00:00:02;
|
||||
binding state active;
|
||||
}
|
||||
binding state active;
|
||||
}
|
||||
lease 10.3.0.0 {
|
||||
lease 10.0.0.9 {
|
||||
binding state active;
|
||||
lease 10.0.0.4 {
|
||||
hardware ethernet 00:00:00:00:00:08;
|
||||
binding state active;
|
||||
hardware ethernet 00:00:00:00:00:07;
|
||||
hardware ethernet 00:00:00:00:00:00;
|
||||
binding state active;
|
||||
lease 10.1.0.4 {
|
||||
lease 10.4.0.2 {
|
||||
binding state active;
|
||||
}
|
||||
}
|
||||
lease 10.3.0.4 {
|
||||
hardware ethernet 00:00:00:00:00:05;
|
||||
hardware ethernet 00:00:00:00:00:05;
|
||||
binding state active;
|
||||
binding state active;
|
||||
lease 10.0.0.5 {
|
||||
hardware ethernet 00:00:00:00:00:04;
|
||||
binding state active;
|
||||
hardware ethernet 00:00:00:00:00:02;
|
||||
binding state active;
|
||||
hardware ethernet 00:00:00:00:00:09;
|
||||
hardware ethernet 00:00:00:00:00:08;
|
||||
lease 10.2.0.8 {
|
||||
}
|
||||
binding state active;
|
||||
binding state active;
|
||||
hardware ethernet 00:00:00:00:00:06;
|
||||
hardware ethernet 00:00:00:00:00:00;
|
||||
lease 10.3.0.7 {
|
||||
lease 10.4.0.4 {
|
||||
}
|
||||
hardware ethernet 00:00:00:00:00:04;
|
||||
}
|
||||
binding state active;
|
||||
lease 10.3.0.3 {
|
||||
hardware ethernet 00:00:00:00:00:03;
|
||||
lease 10.2.0.0 {
|
||||
binding state active;
|
||||
binding state active;
|
||||
hardware ethernet 00:00:00:00:00:05;
|
||||
|
||||
binding state active;
|
||||
}
|
||||
hardware ethernet 00:00:00:00:00:00;
|
||||
binding state active;
|
||||
lease 10.1.0.5 {
|
||||
hardware ethernet 00:00:00:00:00:09;
|
||||
lease 10.3.0.5 {
|
||||
}
|
||||
|
||||
1
tests/leases/statuses
Symbolic link
1
tests/leases/statuses
Symbolic link
|
|
@ -0,0 +1 @@
|
|||
complete
|
||||
30
tests/parser
Executable file
30
tests/parser
Executable file
|
|
@ -0,0 +1,30 @@
|
|||
#!/bin/sh
|
||||
#
|
||||
# Minimal regression test suite.
|
||||
|
||||
IAM=$(basename $0)
|
||||
|
||||
if [ ! -d tests/outputs ]; then
|
||||
mkdir tests/outputs
|
||||
fi
|
||||
cat <<EOF >"./${IAM}-conf"
|
||||
#shared-network "example3 " {
|
||||
# subnet 10.0.6.0 netmask 255.255.255.0 {
|
||||
# pool {
|
||||
# range 10.0.6.1 10.0.6.20;
|
||||
# }
|
||||
# }
|
||||
# subnet 10.1.7.0 netmask 255.255.255.0 {
|
||||
# pool {
|
||||
# range 10.1.7.1 10.1.7.20;
|
||||
# }
|
||||
# }
|
||||
#}
|
||||
|
||||
include "tests/confs/complete";
|
||||
EOF
|
||||
dhcpd-pools -c "./${IAM}-conf" --color=never \
|
||||
-l $top_srcdir/tests/leases/$IAM -o tests/outputs/$IAM
|
||||
diff -u $top_srcdir/tests/expected/$IAM tests/outputs/$IAM
|
||||
rm -f "./${IAM}-conf"
|
||||
exit $?
|
||||
15
tests/shufled
Executable file
15
tests/shufled
Executable file
|
|
@ -0,0 +1,15 @@
|
|||
#!/bin/sh
|
||||
#
|
||||
# Minimal regression test suite.
|
||||
|
||||
IAM=$(basename $0)
|
||||
|
||||
if [ ! -d tests/outputs ]; then
|
||||
mkdir tests/outputs
|
||||
fi
|
||||
|
||||
dhcpd-pools -c $top_srcdir/tests/confs/$IAM --color=never \
|
||||
--sort nimcptTenimcptTe --sort nimcptTe \
|
||||
-l $top_srcdir/tests/leases/$IAM -o tests/outputs/$IAM
|
||||
diff -u $top_srcdir/tests/expected/$IAM tests/outputs/$IAM
|
||||
exit $?
|
||||
|
|
@ -20,7 +20,7 @@ dhcpd-pools --config $top_srcdir/tests/confs/complete --leases $top_srcdir/tests
|
|||
echo $? >> tests/outputs/$IAM-too
|
||||
cat tests/outputs/$IAM-too >> tests/outputs/$IAM
|
||||
|
||||
echo '== maxium ==' >> tests/outputs/$IAM
|
||||
echo '== maximum ==' >> tests/outputs/$IAM
|
||||
dhcpd-pools --config $top_srcdir/tests/confs/complete --leases $top_srcdir/tests/leases/complete \
|
||||
--sort=m --output=tests/outputs/$IAM-too
|
||||
echo $? >> tests/outputs/$IAM-too
|
||||
|
|
|
|||
22
tests/statuses
Executable file
22
tests/statuses
Executable file
|
|
@ -0,0 +1,22 @@
|
|||
#!/bin/sh
|
||||
#
|
||||
# Test json status field values.
|
||||
|
||||
IAM=$(basename $0)
|
||||
|
||||
if [ ! -d tests/outputs ]; then
|
||||
mkdir tests/outputs
|
||||
fi
|
||||
|
||||
dhcpd-pools -c $top_srcdir/tests/confs/$IAM --format=json -L33 \
|
||||
-l $top_srcdir/tests/leases/$IAM -o tests/outputs/$IAM \
|
||||
--warning=20 --critical=41 --all-as-shared --snet-alarms --all-as-shared
|
||||
|
||||
echo '== minsize' >> tests/outputs/$IAM
|
||||
dhcpd-pools -c $top_srcdir/tests/confs/$IAM --format=json --limit 33 \
|
||||
-l $top_srcdir/tests/leases/$IAM --minsize=20 \
|
||||
--warning=20 --critical=41 --all-as-shared --snet-alarms --all-as-shared \
|
||||
>> tests/outputs/$IAM
|
||||
|
||||
diff -u $top_srcdir/tests/expected/$IAM tests/outputs/$IAM
|
||||
exit $?
|
||||
|
|
@ -4,12 +4,11 @@
|
|||
# analysis algorithm is sane. This script is no longer
|
||||
# maintained, and can be considered as historic reference.
|
||||
#
|
||||
# Licensed under the Open Software License version 1.1
|
||||
# http://opensource.org/licenses/osl.php
|
||||
# Licensed under the Open Software License version 1.0
|
||||
# https://opensource.org/license/osl-1-0/
|
||||
#
|
||||
# Sami Kerola <sami.kerola@teliasonera.com>
|
||||
#
|
||||
# Latest version is available from http://www.iki.fi/kerolasa/dhcp/
|
||||
# This is version 1.4
|
||||
|
||||
BEGIN {
|
||||
|
|
|
|||
|
|
@ -30,7 +30,7 @@ font-variant: normal;
|
|||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div itemscope itemtype="http://schema.org/SoftwareApplication">
|
||||
<div itemscope itemtype="https://schema.org/SoftwareApplication">
|
||||
<h1>ISC dhcpd lease analysis and reporting</h1>
|
||||
<p>This is <span itemprop="name">dhcpd-pools</span>
|
||||
<a href="https://www.isc.org/software/dhcp" itemprop="applicationSuite">ISC dhcp</a>
|
||||
|
|
@ -46,11 +46,21 @@ there is lots of data. On cheap laptop the speed of analysis is more than
|
|||
any significant difference in getting analysis done.</p>
|
||||
<hr />
|
||||
<div class="tt">
|
||||
prompt> ./dhcpd-pools -c /etc/dhcpd.conf -l /var/lib/dhcp/dhcpd.leases -o
|
||||
./sampleoutput.txt<br />
|
||||
prompt> cat ./<a href="http://dhcpd-pools.sourceforge.net/sampleoutput.txt">sampleoutput.txt</a></pre>
|
||||
prompt> ./dhcpd-pools --config=/etc/dhcpd.conf
|
||||
--leases=/var/lib/dhcp/dhcpd.leases --format=H
|
||||
--color=always --warning=40 --critical=50 --output=<a
|
||||
href="https://dhcpd-pools.sourceforge.net/sampleoutput.html">sampleoutput.html</a>
|
||||
</div>
|
||||
<hr />
|
||||
<h3>Is dhcpd-pools still developed?</h3>
|
||||
<p>In short no, it is not.</p>
|
||||
<p>
|
||||
<a href="https://www.isc.org/blogs/isc-dhcp-eol/">ISC DHCPD has reached
|
||||
EOL</a>. Users are Kea DHCP server instead. Kea has <a
|
||||
href="https://kea.readthedocs.io/en/kea-2.2.0/arm/stats.html">native
|
||||
statistics</a>, so it does not require this tool and therefore the
|
||||
dhcpd-pools is obsolte.
|
||||
</p>
|
||||
<h3>Where I can get dhcpd-pools?</h3>
|
||||
<p>Download
|
||||
<a href="https://sourceforge.net/projects/dhcpd-pools/files/" itemprop="downloadUrl">release package</a>
|
||||
|
|
@ -60,44 +70,62 @@ file.
|
|||
<br /></p>
|
||||
<div class="tt">git clone git://git.code.sf.net/p/dhcpd-pools/code dhcpd-pools</div>
|
||||
<p>See also
|
||||
<a href="http://sourceforge.net/projects/dhcpd-pools">SourceForge</a> project page.</p>
|
||||
<a href="https://sourceforge.net/projects/dhcpd-pools">SourceForge</a> project page.</p>
|
||||
<h3>Documentation</h3>
|
||||
<p>The dhcpd-pools
|
||||
<a href="http://dhcpd-pools.sourceforge.net/man.html">manual page</a>, and
|
||||
<a href="http://dhcpd-pools.sourceforge.net/doxygen/">Doxygen</a> software
|
||||
<a href="https://dhcpd-pools.sourceforge.net/man.html">manual page</a>, and
|
||||
<a href="https://dhcpd-pools.sourceforge.net/doxygen/">Doxygen</a> software
|
||||
reference documentation are available online.</p>
|
||||
<h3>Getting the output you need</h3>
|
||||
<ol>
|
||||
<li>Start with:<br />
|
||||
<span style="font-family:monospace">dhcpd-pools --config=path
|
||||
--leases=path --color=always --format=text</span></li>
|
||||
<li>Play with options and see how output changes. Options to
|
||||
try:<br />
|
||||
<span style="font-family:monospace">--all-as-shared --crit-count
|
||||
--critical --minsize --snet-alarms --warn-count
|
||||
--warning</span></li>
|
||||
<li>Start filtering output. Options to try:<br />
|
||||
<span style="font-family:monospace">--skip --limit</span></li>
|
||||
<li>Change <span style="font-family:monospace">--format</span>
|
||||
option to what you need, and maybe include <span style="font-family:monospace">
|
||||
--perfdata</span> if you want nagios alarm
|
||||
format.</li>
|
||||
<li>Done.</li>
|
||||
</ol>
|
||||
<h3>Reference information</h3>
|
||||
<p>
|
||||
<script type='text/javascript' src='https://www.openhub.net/p/dhcpd-pools/widgets/project_factoids_stats?format=js'></script>
|
||||
</p>
|
||||
<p>The program was written because
|
||||
<a href="http://dhcpstatus.sourceforge.net/">DHCPStatus</a>,
|
||||
<a href="http://freshmeat.net/projects/dhcpusestats/">DHCP Usage Statistics</a>,
|
||||
<a href="http://www.omar.org/opensource/reportdhcp/">reportdhcp.pl</a>,
|
||||
<a href="http://www.ofb.net/%7Ejheiss/lease_analyzer">lease_analyzer</a> and
|
||||
<a href="http://www.net-track.ch/opensource/dhcpd-snmp/">dhcpd-snmp</a>
|
||||
<a href="https://dhcpstatus.sourceforge.net/">DHCPStatus</a>,
|
||||
<a href="https://freshmeat.net/projects/dhcpusestats/">DHCP Usage Statistics</a>,
|
||||
<a href="https://www.omar.org/opensource/reportdhcp/">reportdhcp.pl</a>,
|
||||
<a href="https://www.ofb.net/%7Ejheiss/lease_analyzer">lease_analyzer</a> and
|
||||
<a href="https://www.net-track.ch/opensource/dhcpd-snmp/">dhcpd-snmp</a>
|
||||
where too slow to handle huge number of leases. There is also difference in
|
||||
printed details. The dhcpd-pools does not print quite as much information as
|
||||
some other tools.</p>
|
||||
<p>Notice that this utility is not the same as
|
||||
<a href="http://folk.uio.no/trondham/software/dhcpd-pool.html">dhcpd-pool</a>
|
||||
<a href="https://folk.uio.no/trondham/software/dhcpd-pool.html">dhcpd-pool</a>
|
||||
that is maintained by Trond Hasle Amundsen.</p>
|
||||
<p>Just for laugh, obsolete awk proof of concept (version 1.4)
|
||||
<a href="http://dhcpd-pools.sourceforge.net/dhcpd-pools.awk">dhcpd-pools.awk</a></p>
|
||||
<a href="https://dhcpd-pools.sourceforge.net/dhcpd-pools.awk">dhcpd-pools.awk</a></p>
|
||||
<h3>Where to send questions, bug reports, code contributions...</h3>
|
||||
<p><a href="http://www.iki.fi/kerolasa/" itemprop="copyrightHolder">Sami Kerola</a>
|
||||
<p><a href="https://kerolasa.iki.fi/" itemprop="copyrightHolder">Sami Kerola</a>
|
||||
<<a href="mailto:kerolasa@iki.fi">kerolasa@iki.fi</a>></p>
|
||||
<div style="visibility:hidden">
|
||||
<span itemprop="datePublished" datetime="2006-03-13T00:00:00+0000">Mon Mar 13 00:00:00 GMT 2006</span>
|
||||
<span itemprop="dateModified" datetime="2017-11-15T12:47:30+0000">Wed Nov 15 12:47:30 GMT 2017</span>
|
||||
<span itemprop="dateModified" datetime="2022-11-26T09:58:28+0000">Sat Nov 26 09:58:28 GMT 2022</span>
|
||||
<span itemprop="version">3.0</span>
|
||||
<span itemprop="license">FreeBSD License</span>
|
||||
<a href="http://dhcpd-pools.sourceforge.net/" itemprop="url"></a>
|
||||
<div itemprop="offers" itemscope itemtype="http://schema.org/Offer">
|
||||
<a href="https://dhcpd-pools.sourceforge.net/" itemprop="url"></a>
|
||||
<div itemprop="offers" itemscope itemtype="https://schema.org/Offer">
|
||||
<span itemprop="price">0</span>
|
||||
<meta itemprop="priceCurrency" content="EUR" />
|
||||
</div>
|
||||
<div itemprop="aggregateRating" itemscope itemtype="http://schema.org/AggregateRating">
|
||||
<div itemprop="aggregateRating" itemscope itemtype="https://schema.org/AggregateRating">
|
||||
<span itemprop="ratingValue">5</span> (
|
||||
<span itemprop="ratingCount">2</span> ratings )
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -1,3 +1,3 @@
|
|||
Sitemap: http://dhcpd-pools.sourceforge.net/sitemap.txt
|
||||
Sitemap: https://dhcpd-pools.sourceforge.net/sitemap.txt
|
||||
User-agent: *
|
||||
Disallow:
|
||||
|
|
|
|||
169
webpages/sampleoutput.html
Normal file
169
webpages/sampleoutput.html
Normal file
|
|
@ -0,0 +1,169 @@
|
|||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>ISC dhcpd dhcpd-pools output</title>
|
||||
<meta charset="utf-8">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" type="text/css">
|
||||
<link rel="stylesheet" type="text/css" href="https://cdn.datatables.net/v/dt/dt-2.2.2/datatables.min.css">
|
||||
<style type="text/css">
|
||||
table.dhcpd-pools th { text-transform: capitalize }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div class="container">
|
||||
<h2>ISC DHCPD status</h2>
|
||||
<small>File tests/leases/formats was last modified at 2025-04-15T14:32:48+0100</small><hr />
|
||||
<h3>Sum of all</h3>
|
||||
<table id="a" class="dhcpd-pools order-column table table-hover" summary="all">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>name</th>
|
||||
<th>max</th>
|
||||
<th>cur</th>
|
||||
<th>free</th>
|
||||
<th>percent</th>
|
||||
<th>touch</th>
|
||||
<th>t+c</th>
|
||||
<th>t+c perc</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>All networks</td>
|
||||
<td>100</td>
|
||||
<td>43</td>
|
||||
<td>57</td>
|
||||
<td>43.000</td>
|
||||
<td>0</td>
|
||||
<td>43</td>
|
||||
<td>43.000</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<h3>Shared networks</h3>
|
||||
<table id="s" class="dhcpd-pools order-column table table-hover" summary="snet">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>name</th>
|
||||
<th>max</th>
|
||||
<th>cur</th>
|
||||
<th>free</th>
|
||||
<th>percent</th>
|
||||
<th>touch</th>
|
||||
<th>t+c</th>
|
||||
<th>t+c perc</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>example1</td>
|
||||
<td>40</td>
|
||||
<td>21</td>
|
||||
<td>19</td>
|
||||
<td style="color:red;font-weight:bold">52.5</td>
|
||||
<td>0</td>
|
||||
<td>21</td>
|
||||
<td>52.500</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>example2</td>
|
||||
<td>40</td>
|
||||
<td>17</td>
|
||||
<td>23</td>
|
||||
<td style="color:magenta;font-style:italic">42.5</td>
|
||||
<td>0</td>
|
||||
<td>17</td>
|
||||
<td>42.500</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<h3>Ranges</h3>
|
||||
<table id="r" class="dhcpd-pools order-column table table-hover" summary="ranges">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>shared net name</th>
|
||||
<th>first ip</th>
|
||||
<th>last ip</th>
|
||||
<th>max</th>
|
||||
<th>cur</th>
|
||||
<th>free</th>
|
||||
<th>percent</th>
|
||||
<th>touch</th>
|
||||
<th>t+c</th>
|
||||
<th>t+c perc</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>example1</td>
|
||||
<td>10.0.0.1</td>
|
||||
<td>10.0.0.20</td>
|
||||
<td>20</td>
|
||||
<td>11</td>
|
||||
<td>9</td>
|
||||
<td style="color:red;font-weight:bold">55</td>
|
||||
<td>0</td>
|
||||
<td>11</td>
|
||||
<td>55.000</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>example1</td>
|
||||
<td>10.1.0.1</td>
|
||||
<td>10.1.0.20</td>
|
||||
<td>20</td>
|
||||
<td>10</td>
|
||||
<td>10</td>
|
||||
<td style="color:magenta;font-style:italic">50</td>
|
||||
<td>0</td>
|
||||
<td>10</td>
|
||||
<td>50.000</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>example2</td>
|
||||
<td>10.2.0.1</td>
|
||||
<td>10.2.0.20</td>
|
||||
<td>20</td>
|
||||
<td>8</td>
|
||||
<td>12</td>
|
||||
<td>40</td>
|
||||
<td>0</td>
|
||||
<td>8</td>
|
||||
<td>40.000</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>example2</td>
|
||||
<td>10.3.0.1</td>
|
||||
<td>10.3.0.20</td>
|
||||
<td>20</td>
|
||||
<td>9</td>
|
||||
<td>11</td>
|
||||
<td style="color:magenta;font-style:italic">45</td>
|
||||
<td>0</td>
|
||||
<td>9</td>
|
||||
<td>45.000</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>All networks</td>
|
||||
<td>10.4.0.1</td>
|
||||
<td>10.4.0.20</td>
|
||||
<td>20</td>
|
||||
<td>5</td>
|
||||
<td>15</td>
|
||||
<td>25</td>
|
||||
<td>0</td>
|
||||
<td>5</td>
|
||||
<td>25.000</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<br /><div class="well well-lg">
|
||||
<small>Generated using dhcpd-pools 3.3<br />
|
||||
More info at <a href="https://dhcpd-pools.sourceforge.net/">https://dhcpd-pools.sourceforge.net/</a>
|
||||
</small></div></div>
|
||||
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.min.js" type="text/javascript"></script>
|
||||
<script type="text/javascript" src="https://cdn.datatables.net/v/dt/dt-2.2.2/datatables.min.js"></script>
|
||||
<script type="text/javascript" class="init">$(document).ready(function() { $('#s').DataTable({ "iDisplayLength": 50, "lengthMenu": [ [25, 50, 100, -1], [25, 50, 100, "All"] ], "order": [[ 4, "desc" ]] } ); } );</script>
|
||||
<script type="text/javascript" class="init">$(document).ready(function() { $('#r').DataTable({ "iDisplayLength": 100, "lengthMenu": [ [25, 50, 100, -1], [25, 50, 100, "All"] ], "order": [[ 6, "desc" ]] } ); } );</script>
|
||||
</body></html>
|
||||
|
|
@ -1,985 +0,0 @@
|
|||
Ranges:
|
||||
shared net name first ip last ip max cur percent
|
||||
Aatamila 12.34.567.127 - 12.34.567.254 128 11 8.594
|
||||
Aatamila 12.34.567.83 - 12.34.567.254 252 22 8.730
|
||||
Huohvanainen 12.34.567.3 - 12.34.567.254 252 39 15.476
|
||||
Huohvanainen 12.345.678.1 - 12.345.678.254 254 41 16.142
|
||||
Huohvanainen 12.345.678.1 - 12.345.678.254 254 40 15.748
|
||||
Huohvanainen 12.345.678.1 - 12.345.678.254 254 38 14.961
|
||||
Huohvanainen 12.345.678.1 - 12.345.678.254 254 37 14.567
|
||||
Huohvanainen 12.345.678.1 - 12.345.678.254 254 55 21.654
|
||||
Huohvanainen 12.345.678.1 - 12.345.678.254 254 36 14.173
|
||||
Huohvanainen 12.345.678.1 - 12.345.678.254 254 50 19.685
|
||||
Huohvanainen 12.345.678.1 - 12.345.678.254 254 35 13.780
|
||||
Huohvanainen 12.345.678.1 - 12.345.678.254 254 53 20.866
|
||||
Huohvanainen 12.345.678.1 - 12.345.678.254 254 56 22.047
|
||||
Huohvanainen 12.345.678.1 - 12.345.678.254 254 44 17.323
|
||||
Huohvanainen 12.345.678.1 - 12.345.678.254 254 43 16.929
|
||||
Huohvanainen 12.345.678.1 - 12.345.678.254 254 29 11.417
|
||||
Huohvanainen 12.345.678.1 - 12.345.678.254 254 45 17.717
|
||||
Huohvanainen 12.345.678.1 - 12.345.678.254 254 36 14.173
|
||||
Ilmovuori 12.345.678.3 - 12.345.678.254 252 0 0.000
|
||||
Ilmovuori 12.345.678.1 - 12.345.678.254 254 0 0.000
|
||||
Honkanen 12.345.678.3 - 12.345.678.254 252 100 39.683
|
||||
Honkanen 12.345.678.1 - 12.345.678.254 254 92 36.220
|
||||
Huuskonen 12.345.678.3 - 12.345.678.254 252 146 57.937
|
||||
Huuskonen 12.345.678.1 - 12.345.678.254 254 139 54.724
|
||||
Huuskonen 12.345.678.1 - 12.345.678.254 254 137 53.937
|
||||
Huuskonen 12.345.678.1 - 12.345.678.254 254 147 57.874
|
||||
Huuskonen 12.345.678.1 - 12.345.678.254 254 132 51.969
|
||||
Huuskonen 12.345.678.1 - 12.345.678.254 254 132 51.969
|
||||
Huuskonen 12.345.678.1 - 12.345.678.254 254 149 58.661
|
||||
Huuskonen 12.345.678.1 - 12.345.678.254 254 140 55.118
|
||||
Huuskonen 12.345.678.1 - 12.345.678.254 254 140 55.118
|
||||
Huuskonen 12.345.678.1 - 12.345.678.254 254 139 54.724
|
||||
Huuskonen 12.345.678.1 - 12.345.678.254 254 135 53.150
|
||||
Huuskonen 12.345.678.1 - 12.345.678.1 1 0 0.000
|
||||
Huuskonen 12.345.678.1 - 12.345.678.254 254 152 59.843
|
||||
Huuskonen 12.345.678.1 - 12.345.678.254 254 132 51.969
|
||||
Huuskonen 12.345.678.1 - 12.345.678.254 254 131 51.575
|
||||
Huuskonen 12.345.678.1 - 12.345.678.254 254 147 57.874
|
||||
Halonen 12.345.678.3 - 12.345.678.254 252 114 45.238
|
||||
Halonen 12.345.678.1 - 12.345.678.254 254 107 42.126
|
||||
Halonen 12.345.678.1 - 12.345.678.254 254 106 41.732
|
||||
Halonen 12.345.678.1 - 12.345.678.254 254 121 47.638
|
||||
Halonen 12.345.678.1 - 12.345.678.254 254 119 46.850
|
||||
Halonen 12.345.678.1 - 12.345.678.254 254 102 40.157
|
||||
Halonen 12.345.678.1 - 12.345.678.254 254 111 43.701
|
||||
Halonen 12.345.678.1 - 12.345.678.254 254 122 48.031
|
||||
Halonen 12.345.678.1 - 12.345.678.254 254 119 46.850
|
||||
Halonen 12.345.678.1 - 12.345.678.254 254 109 42.913
|
||||
Halonen 12.345.678.1 - 12.345.678.254 254 106 41.732
|
||||
Halonen 12.345.678.1 - 12.345.678.254 254 120 47.244
|
||||
Halonen 12.345.678.1 - 12.345.678.254 254 117 46.063
|
||||
Halonen 12.345.678.1 - 12.345.678.254 254 111 43.701
|
||||
Halonen 12.345.678.1 - 12.345.678.254 254 117 46.063
|
||||
Halonen 12.345.678.1 - 12.345.678.254 254 120 47.244
|
||||
Halonen 12.345.678.1 - 12.345.678.254 254 102 40.157
|
||||
Halonen 12.345.678.1 - 12.345.678.254 254 130 51.181
|
||||
Halonen 12.345.678.1 - 12.345.678.254 254 117 46.063
|
||||
Halonen 12.345.678.1 - 12.345.678.254 254 120 47.244
|
||||
Halonen 12.345.678.1 - 12.345.678.254 254 111 43.701
|
||||
Halonen 12.345.678.1 - 12.345.678.254 254 118 46.457
|
||||
Halonen 12.345.678.1 - 12.345.678.254 254 114 44.882
|
||||
Halonen 12.345.678.1 - 12.345.678.254 254 112 44.094
|
||||
Halonen 12.345.678.1 - 12.345.678.254 254 120 47.244
|
||||
Halonen 12.345.678.1 - 12.345.678.254 254 118 46.457
|
||||
Halonen 12.345.678.1 - 12.345.678.254 254 105 41.339
|
||||
Halonen 12.345.678.1 - 12.345.678.254 254 110 43.307
|
||||
Halonen 12.345.678.1 - 12.345.678.254 254 117 46.063
|
||||
Halonen 12.345.678.1 - 12.345.678.254 254 103 40.551
|
||||
Halonen 12.345.678.1 - 12.345.678.254 254 107 42.126
|
||||
Halonen 12.345.678.1 - 12.345.678.254 254 109 42.913
|
||||
Hattunen 12.345.6.3 - 12.345.6.254 252 0 0.000
|
||||
Hattunen 12.345.6.1 - 12.345.6.254 254 0 0.000
|
||||
Hattunen 12.345.6.1 - 12.345.6.254 254 0 0.000
|
||||
Hattunen 12.345.6.1 - 12.345.6.254 254 0 0.000
|
||||
Hattunen 12.345.6.1 - 12.345.6.254 254 0 0.000
|
||||
Hattunen 12.345.6.1 - 12.345.6.254 254 0 0.000
|
||||
Hattunen 12.345.6.1 - 12.345.6.254 254 0 0.000
|
||||
Hattunen 12.345.6.1 - 12.345.6.254 254 0 0.000
|
||||
Harkovski 12.345.6.3 - 12.345.6.254 252 197 78.175
|
||||
Harkovski 12.345.6.1 - 12.345.6.254 254 190 74.803
|
||||
Harkovski 12.345.67.1 - 12.345.67.254 254 193 75.984
|
||||
Harkovski 12.345.67.1 - 12.345.67.254 254 199 78.346
|
||||
Harkovski 12.345.67.3 - 12.345.67.254 252 196 77.778
|
||||
Harkovski 12.345.67.1 - 12.345.67.254 254 208 81.890
|
||||
Harkovski 12.345.67.1 - 12.345.67.254 254 195 76.772
|
||||
Harkovski 12.345.67.1 - 12.345.67.254 254 195 76.772
|
||||
Happo 12.345.67.3 - 12.345.67.254 252 169 67.063
|
||||
Happo 12.345.67.1 - 12.345.67.254 254 171 67.323
|
||||
Happo 12.345.67.1 - 12.345.67.254 254 158 62.205
|
||||
Happo 12.345.67.1 - 12.345.67.254 254 165 64.961
|
||||
Happonen 12.345.67.3 - 12.345.67.254 252 184 73.016
|
||||
Happonen 12.345.67.1 - 12.345.67.254 254 181 71.260
|
||||
Happonen 12.345.67.1 - 12.345.67.254 254 186 73.228
|
||||
Happonen 12.345.67.1 - 12.345.67.254 254 175 68.898
|
||||
Harakka 12.345.67.3 - 12.345.67.254 252 201 79.762
|
||||
Harakka 12.345.67.1 - 12.345.67.254 254 206 81.102
|
||||
Harakka 12.345.67.1 - 12.345.67.254 254 200 78.740
|
||||
Harakka 12.345.67.1 - 12.345.67.254 254 196 77.165
|
||||
Harjunen 12.345.67.3 - 12.345.67.254 252 208 82.540
|
||||
Harjunen 12.345.67.1 - 12.345.67.254 254 204 80.315
|
||||
Harjunen 12.345.67.1 - 12.345.67.254 254 207 81.496
|
||||
Harjunen 12.345.67.1 - 12.345.67.254 254 199 78.346
|
||||
Haukka 12.345.67.3 - 12.345.67.254 252 86 34.127
|
||||
Haukka 12.345.67.1 - 12.345.67.254 254 93 36.614
|
||||
Haukka 12.345.67.1 - 12.345.67.254 254 82 32.283
|
||||
Haukka 12.345.67.1 - 12.345.67.254 254 84 33.071
|
||||
Hautanen 12.345.67.3 - 12.345.67.254 252 109 43.254
|
||||
Hautanen 12.345.67.1 - 12.345.67.254 254 106 41.732
|
||||
Hautanen 12.345.67.1 - 12.345.67.254 254 89 35.039
|
||||
Hautanen 12.345.67.1 - 12.345.67.254 254 104 40.945
|
||||
Havu 12.345.67.3 - 12.345.67.254 252 109 43.254
|
||||
Havu 12.345.67.1 - 12.345.67.254 254 101 39.764
|
||||
Havu 12.345.67.1 - 12.345.67.254 254 96 37.795
|
||||
Havu 12.345.67.1 - 12.345.67.254 254 98 38.583
|
||||
Heiskanen 12.345.67.3 - 12.345.67.254 252 113 44.841
|
||||
Heiskanen 12.345.67.1 - 12.345.67.254 254 113 44.488
|
||||
Heiskanen 12.345.67.1 - 12.345.67.254 254 109 42.913
|
||||
Heiskanen 12.345.67.1 - 12.345.67.254 254 117 46.063
|
||||
Hietanen 12.345.67.3 - 12.345.67.254 252 96 38.095
|
||||
Hietanen 12.345.67.1 - 12.345.67.254 254 90 35.433
|
||||
Hietanen 12.345.67.1 - 12.345.67.254 254 101 39.764
|
||||
Hietanen 12.345.67.1 - 12.345.67.254 254 108 42.520
|
||||
Hiiliaho 12.345.67.3 - 12.345.67.254 252 100 39.683
|
||||
Hiiliaho 12.345.67.1 - 12.345.67.254 254 105 41.339
|
||||
Hiiliaho 12.345.67.1 - 12.345.67.254 254 98 38.583
|
||||
Hiiliaho 12.345.67.1 - 12.345.67.254 254 105 41.339
|
||||
Hilonen 12.345.67.3 - 12.345.67.254 252 80 31.746
|
||||
Hilonen 12.345.67.1 - 12.345.67.254 254 91 35.827
|
||||
Hilonen 12.345.67.1 - 12.345.67.254 254 76 29.921
|
||||
Hilonen 12.345.67.1 - 12.345.67.254 254 76 29.921
|
||||
Hirvonen 12.345.67.3 - 12.345.67.254 252 173 68.651
|
||||
Hirvonen 12.345.67.1 - 12.345.67.254 254 180 70.866
|
||||
Hirvonen 12.345.67.1 - 12.345.67.254 254 178 70.079
|
||||
Hirvonen 12.345.67.1 - 12.345.67.254 254 183 72.047
|
||||
Haavikko 12.345.678.3 - 12.345.678.254 252 99 39.286
|
||||
Haavikko 12.345.678.1 - 12.345.678.254 254 84 33.071
|
||||
Anttila 12.345.678.3 - 12.345.678.253 251 0 0.000
|
||||
Anttila 12.345.678.1 - 12.345.678.254 254 0 0.000
|
||||
Hult 12.345.678.3 - 12.345.678.254 252 80 31.746
|
||||
Hult 12.345.678.1 - 12.345.678.254 254 106 41.732
|
||||
Hult 12.345.678.1 - 12.345.678.254 254 83 32.677
|
||||
Hult 12.345.678.1 - 12.345.678.1 1 1 100.000
|
||||
Jaskanen 12.345.678.3 - 12.345.678.254 252 150 59.524
|
||||
Jaskanen 12.345.678.1 - 12.345.678.254 254 144 56.693
|
||||
Jaskanen 12.345.678.1 - 12.345.678.254 254 169 66.535
|
||||
Jaskanen 12.345.678.1 - 12.345.678.254 254 161 63.386
|
||||
Jaskanen 12.345.678.1 - 12.345.678.254 254 166 65.354
|
||||
Jaskanen 12.345.678.1 - 12.345.678.254 254 168 66.142
|
||||
Jaskanen 12.345.678.1 - 12.345.678.254 254 172 67.717
|
||||
Jaskanen 12.345.678.1 - 12.345.678.254 254 164 64.567
|
||||
Itkonen 12.345.678.3 - 12.345.678.254 252 130 51.587
|
||||
Jaskanen 12.345.678.3 - 12.345.678.254 252 173 68.651
|
||||
Jaskanen 12.345.678.1 - 12.345.678.254 254 190 74.803
|
||||
Jaskanen 12.345.678.1 - 12.345.678.254 254 185 72.835
|
||||
Jaskanen 12.345.678.1 - 12.345.678.254 254 190 74.803
|
||||
Jaskanen 12.345.678.1 - 12.345.678.254 254 177 69.685
|
||||
Jaskanen 12.345.678.1 - 12.345.678.254 254 174 68.504
|
||||
Jaskanen 12.345.678.1 - 12.345.678.254 254 189 74.409
|
||||
Jaskanen 12.345.678.1 - 12.345.678.254 254 169 66.535
|
||||
Jaskanen 12.345.678.1 - 12.345.678.254 254 185 72.835
|
||||
Jaskanen 12.345.678.1 - 12.345.678.254 254 187 73.622
|
||||
Jaskanen 12.345.678.1 - 12.345.678.254 254 172 67.717
|
||||
Jaskanen 12.345.678.1 - 12.345.678.254 254 166 65.354
|
||||
Jaskanen 12.345.678.1 - 12.345.678.254 254 171 67.323
|
||||
Jaskanen 12.345.678.1 - 12.345.678.254 254 181 71.260
|
||||
Jaskanen 12.345.678.1 - 12.345.678.254 254 174 68.504
|
||||
Jaskanen 12.345.678.1 - 12.345.678.254 254 185 72.835
|
||||
Itkonen-temp 12.345.678.3 - 12.345.678.254 252 0 0.000
|
||||
Itkonen-temp 12.345.678.1 - 12.345.678.254 254 0 0.000
|
||||
Itkonen-temp 12.345.678.1 - 12.345.678.1 1 0 0.000
|
||||
Itkonen-temp 12.345.678.1 - 12.345.678.1 1 0 0.000
|
||||
Itkonen-temp 12.345.678.1 - 12.345.678.254 254 0 0.000
|
||||
Itkonen-temp 12.345.678.1 - 12.345.678.254 254 0 0.000
|
||||
Itkonen-temp 12.345.678.1 - 12.345.678.254 254 0 0.000
|
||||
Itkonen-temp 12.345.678.1 - 12.345.678.254 254 0 0.000
|
||||
Itkonen-temp 12.345.678.1 - 12.345.678.254 254 0 0.000
|
||||
Itkonen-temp 12.345.678.1 - 12.345.678.254 254 0 0.000
|
||||
Itkonen-temp 12.345.678.1 - 12.345.678.254 254 0 0.000
|
||||
Itkonen-temp 12.345.678.1 - 12.345.678.254 254 0 0.000
|
||||
Itkonen-temp 12.345.678.1 - 12.345.678.254 254 0 0.000
|
||||
Itkonen-temp 12.345.678.1 - 12.345.678.254 254 0 0.000
|
||||
Itkonen-temp 12.345.678.1 - 12.345.678.254 254 0 0.000
|
||||
Itkonen-temp 12.345.678.1 - 12.345.678.254 254 0 0.000
|
||||
Arviluoma 12.345.678.3 - 12.345.678.254 252 3 1.190
|
||||
Atjonen 12.345.678.3 - 12.345.678.254 252 1 0.397
|
||||
Ahtonen 12.345.678.3 - 12.345.678.254 252 70 27.778
|
||||
Ahtonen 12.345.678.1 - 12.345.678.254 254 57 22.441
|
||||
Ahtonen 12.345.678.1 - 12.345.678.254 254 74 29.134
|
||||
Ahtonen 12.345.678.1 - 12.345.678.254 254 65 25.591
|
||||
Itkonen 12.345.678.3 - 12.345.678.254 252 189 75.000
|
||||
Itkonen 12.345.678.1 - 12.345.678.254 254 152 59.843
|
||||
Itkonen 12.345.678.1 - 12.345.678.254 254 174 68.504
|
||||
Itkonen 12.345.678.1 - 12.345.678.254 254 165 64.961
|
||||
Itkonen 12.345.678.1 - 12.345.678.254 254 166 65.354
|
||||
Itkonen 12.345.678.1 - 12.345.678.254 254 165 64.961
|
||||
Itkonen 12.345.678.1 - 12.345.678.254 254 167 65.748
|
||||
Itkonen 12.345.678.1 - 12.345.678.254 254 178 70.079
|
||||
Jaskanen 12.345.678.3 - 12.345.678.254 252 185 73.413
|
||||
Jaskanen 12.345.678.1 - 12.345.678.254 254 191 75.197
|
||||
Jaskanen 12.345.678.1 - 12.345.678.254 254 179 70.472
|
||||
Jaskanen 12.345.678.1 - 12.345.678.254 254 180 70.866
|
||||
Jaskanen 12.345.678.1 - 12.345.678.254 254 176 69.291
|
||||
Jaskanen 12.345.678.1 - 12.345.678.254 254 188 74.016
|
||||
Jaskanen 12.345.678.1 - 12.345.678.254 254 177 69.685
|
||||
Jaskanen 12.345.678.1 - 12.345.678.1 1 0 0.000
|
||||
Hoivassilta 12.345.678.2 - 12.345.678.254 253 0 0.000
|
||||
Hoivassilta 12.345.678.1 - 12.345.678.254 254 0 0.000
|
||||
Ikonen 12.345.6.3 - 12.345.6.254 252 0 0.000
|
||||
Ikonen 12.345.6.1 - 12.345.6.254 254 0 0.000
|
||||
Ikonen 12.345.6.1 - 12.345.6.254 254 0 0.000
|
||||
Ikonen 12.345.6.1 - 12.345.6.254 254 0 0.000
|
||||
Ikonen 12.345.6.1 - 12.345.6.254 254 0 0.000
|
||||
Ikonen 12.345.6.1 - 12.345.6.254 254 0 0.000
|
||||
Ikonen 12.345.6.1 - 12.345.6.254 254 0 0.000
|
||||
Ikonen 12.345.6.1 - 12.345.6.254 254 0 0.000
|
||||
Ikonen 12.345.6.1 - 12.345.6.254 254 0 0.000
|
||||
Ikonen 12.345.6.1 - 12.345.6.254 254 0 0.000
|
||||
Ikonen 12.345.67.1 - 12.345.67.254 254 0 0.000
|
||||
Ikonen 12.345.67.1 - 12.345.67.254 254 0 0.000
|
||||
Ikonen 12.345.67.1 - 12.345.67.254 254 0 0.000
|
||||
Ikonen 12.345.67.1 - 12.345.67.254 254 0 0.000
|
||||
Ikonen 12.345.67.1 - 12.345.67.254 254 0 0.000
|
||||
Ikonen 12.345.67.1 - 12.345.67.254 254 0 0.000
|
||||
Auvinen 12.345.67.3 - 12.345.67.254 252 102 40.476
|
||||
Auvinen 12.345.67.1 - 12.345.67.254 254 103 40.551
|
||||
Auvinen 12.345.67.1 - 12.345.67.254 254 97 38.189
|
||||
Auvinen 12.345.67.1 - 12.345.67.254 254 108 42.520
|
||||
Auvinen 12.345.67.1 - 12.345.67.254 254 95 37.402
|
||||
Auvinen 12.345.67.1 - 12.345.67.254 254 101 39.764
|
||||
Auvinen 12.345.67.1 - 12.345.67.254 254 103 40.551
|
||||
Auvinen 12.345.67.1 - 12.345.67.254 254 97 38.189
|
||||
Auvinen 12.345.67.1 - 12.345.67.254 254 100 39.370
|
||||
Auvinen 12.345.67.1 - 12.345.67.254 254 102 40.157
|
||||
Auvinen 12.345.67.1 - 12.345.67.254 254 110 43.307
|
||||
Auvinen 12.345.67.1 - 12.345.67.254 254 116 45.669
|
||||
Auvinen 12.345.67.1 - 12.345.67.254 254 102 40.157
|
||||
Auvinen 12.345.67.1 - 12.345.67.254 254 99 38.976
|
||||
Auvinen 12.345.67.1 - 12.345.67.254 254 94 37.008
|
||||
Auvinen 12.345.67.1 - 12.345.67.254 254 94 37.008
|
||||
Harakka 12.345.67.3 - 12.345.67.254 252 128 50.794
|
||||
Harakka 12.345.67.1 - 12.345.67.254 254 127 50.000
|
||||
Harakka 12.345.67.1 - 12.345.67.254 254 121 47.638
|
||||
Harakka 12.345.67.1 - 12.345.67.254 254 109 42.913
|
||||
Harakka 12.345.67.1 - 12.345.67.254 254 121 47.638
|
||||
Harakka 12.345.67.1 - 12.345.67.254 254 135 53.150
|
||||
Harakka 12.345.67.1 - 12.345.67.254 254 121 47.638
|
||||
Harakka 12.345.67.1 - 12.345.67.254 254 124 48.819
|
||||
Harakka 12.345.67.1 - 12.345.67.254 254 121 47.638
|
||||
Harakka 12.345.67.1 - 12.345.67.254 254 105 41.339
|
||||
Harakka 12.345.67.1 - 12.345.67.254 254 126 49.606
|
||||
Harakka 12.345.67.1 - 12.345.67.254 254 129 50.787
|
||||
Harakka 12.345.67.1 - 12.345.67.254 254 119 46.850
|
||||
Harakka 12.345.67.1 - 12.345.67.254 254 112 44.094
|
||||
Harakka 12.345.67.1 - 12.345.67.254 254 123 48.425
|
||||
Harakka 12.345.67.1 - 12.345.67.254 254 113 44.488
|
||||
Eronen 12.345.67.3 - 12.345.67.254 252 81 32.143
|
||||
Eronen 12.345.67.1 - 12.345.67.254 254 98 38.583
|
||||
Eronen 12.345.67.1 - 12.345.67.254 254 83 32.677
|
||||
Eronen 12.345.67.1 - 12.345.67.254 254 84 33.071
|
||||
Eronen 12.345.67.1 - 12.345.67.254 254 85 33.465
|
||||
Eronen 12.345.67.1 - 12.345.67.254 254 92 36.220
|
||||
Eronen 12.345.67.1 - 12.345.67.254 254 87 34.252
|
||||
Eronen 12.345.67.1 - 12.345.67.254 254 79 31.102
|
||||
Eronen 12.345.67.1 - 12.345.67.254 254 93 36.614
|
||||
Eronen 12.345.67.1 - 12.345.67.254 254 92 36.220
|
||||
Eronen 12.345.67.1 - 12.345.67.254 254 85 33.465
|
||||
Eronen 12.345.67.1 - 12.345.67.254 254 96 37.795
|
||||
Eronen 12.345.67.1 - 12.345.67.254 254 87 34.252
|
||||
Eronen 12.345.67.1 - 12.345.67.254 254 101 39.764
|
||||
Eronen 12.345.67.1 - 12.345.67.254 254 97 38.189
|
||||
Eronen 12.345.67.1 - 12.345.67.254 254 81 31.890
|
||||
Haavikko 12.345.67.3 - 12.345.67.254 252 89 35.317
|
||||
Haavikko 12.345.67.1 - 12.345.67.254 254 91 35.827
|
||||
Haavikko 12.345.67.1 - 12.345.67.254 254 91 35.827
|
||||
Haavikko 12.345.67.1 - 12.345.67.254 254 109 42.913
|
||||
Haavikko 12.345.67.1 - 12.345.67.254 254 89 35.039
|
||||
Haavikko 12.345.67.1 - 12.345.67.254 254 100 39.370
|
||||
Haavikko 12.345.67.1 - 12.345.67.254 254 87 34.252
|
||||
Haavikko 12.345.67.1 - 12.345.67.254 254 98 38.583
|
||||
Haavikko 12.345.67.1 - 12.345.67.254 254 87 34.252
|
||||
Haavikko 12.345.67.1 - 12.345.67.254 254 90 35.433
|
||||
Haavikko 12.345.67.1 - 12.345.67.254 254 95 37.402
|
||||
Haavikko 12.345.67.1 - 12.345.67.254 254 86 33.858
|
||||
Haavikko 12.345.67.1 - 12.345.67.254 254 83 32.677
|
||||
Haavikko 12.345.67.1 - 12.345.67.254 254 102 40.157
|
||||
Haavikko 12.345.67.1 - 12.345.67.254 254 104 40.945
|
||||
Haavikko 12.345.67.1 - 12.345.67.1 1 1 100.000
|
||||
Hakkarainen 12.345.67.3 - 12.345.67.254 252 25 9.921
|
||||
Hakkarainen 12.345.67.1 - 12.345.67.254 254 37 14.567
|
||||
Hakkarainen 12.345.67.1 - 12.345.67.254 254 37 14.567
|
||||
Hakkarainen 12.345.67.1 - 12.345.67.254 254 36 14.173
|
||||
Hakkarainen 12.345.67.1 - 12.345.67.254 254 33 12.992
|
||||
Hakkarainen 12.345.67.1 - 12.345.67.254 254 38 14.961
|
||||
Hakkarainen 12.345.67.1 - 12.345.67.254 254 33 12.992
|
||||
Hakkarainen 12.345.67.1 - 12.345.67.254 254 38 14.961
|
||||
Hakkarainen 12.345.67.1 - 12.345.67.254 254 29 11.417
|
||||
Hakkarainen 12.345.67.1 - 12.345.67.254 254 28 11.024
|
||||
Hakkarainen 12.345.67.1 - 12.345.67.254 254 31 12.205
|
||||
Hakkarainen 12.345.67.1 - 12.345.67.254 254 37 14.567
|
||||
Hakkarainen 12.345.67.1 - 12.345.67.254 254 30 11.811
|
||||
Hakkarainen 12.345.67.1 - 12.345.67.254 254 29 11.417
|
||||
Hakkarainen 12.345.67.1 - 12.345.67.254 254 35 13.780
|
||||
Hakkarainen 12.345.67.1 - 12.345.67.254 254 44 17.323
|
||||
Halonen 12.345.67.3 - 12.345.67.254 252 110 43.651
|
||||
Halonen 12.345.67.1 - 12.345.67.254 254 122 48.031
|
||||
Halonen 12.345.67.1 - 12.345.67.254 254 113 44.488
|
||||
Halonen 12.345.67.1 - 12.345.67.254 254 95 37.402
|
||||
Halonen 12.345.678.1 - 12.345.678.254 254 107 42.126
|
||||
Halonen 12.345.678.1 - 12.345.678.254 254 117 46.063
|
||||
Halonen 12.345.678.1 - 12.345.678.254 254 124 48.819
|
||||
Halonen 12.345.678.1 - 12.345.678.254 254 126 49.606
|
||||
Halonen 12.345.678.1 - 12.345.678.254 254 114 44.882
|
||||
Halonen 12.345.678.1 - 12.345.678.254 254 112 44.094
|
||||
Halonen 12.345.678.1 - 12.345.678.254 254 120 47.244
|
||||
Halonen 12.345.678.1 - 12.345.678.254 254 109 42.913
|
||||
Halonen 12.345.678.1 - 12.345.678.254 254 111 43.701
|
||||
Halonen 12.345.678.1 - 12.345.678.254 254 115 45.276
|
||||
Halonen 12.345.678.1 - 12.345.678.254 254 119 46.850
|
||||
Halonen 12.345.678.1 - 12.345.678.254 254 101 39.764
|
||||
Halttunen 12.345.678.3 - 12.345.678.254 252 214 84.921
|
||||
Halttunen 12.345.678.1 - 12.345.678.254 254 213 83.858
|
||||
Halttunen 12.345.678.1 - 12.345.678.254 254 211 83.071
|
||||
Halttunen 12.345.678.1 - 12.345.678.254 254 224 88.189
|
||||
Halttunen 12.345.678.1 - 12.345.678.254 254 209 82.283
|
||||
Halttunen 12.345.678.1 - 12.345.678.254 254 212 83.465
|
||||
Halttunen 12.345.678.1 - 12.345.678.254 254 204 80.315
|
||||
Halttunen 12.345.678.1 - 12.345.678.254 254 215 84.646
|
||||
Husso 12.345.678.3 - 12.345.678.254 252 177 70.238
|
||||
Husso 12.345.678.1 - 12.345.678.254 254 173 68.110
|
||||
Husso 12.345.678.1 - 12.345.678.254 254 169 66.535
|
||||
Husso 12.345.678.1 - 12.345.678.254 254 170 66.929
|
||||
Husso 12.345.678.1 - 12.345.678.254 254 173 68.110
|
||||
Husso 12.345.678.1 - 12.345.678.254 254 162 63.780
|
||||
Husso 12.345.678.1 - 12.345.678.254 254 169 66.535
|
||||
Husso 12.345.678.1 - 12.345.678.254 254 185 72.835
|
||||
Ilmovuori 12.345.678.3 - 12.345.678.254 252 0 0.000
|
||||
Ilmovuori 12.345.678.1 - 12.345.678.254 254 0 0.000
|
||||
Ilmovuori 12.345.678.1 - 12.345.678.254 254 0 0.000
|
||||
Ilmovuori 12.345.678.1 - 12.345.678.254 254 0 0.000
|
||||
Ilmovuori 12.345.678.1 - 12.345.678.254 254 0 0.000
|
||||
Ilmovuori 12.345.678.1 - 12.345.678.254 254 0 0.000
|
||||
Ilmovuori 12.345.678.1 - 12.345.678.254 254 0 0.000
|
||||
Ilmovuori 12.345.678.1 - 12.345.678.254 254 0 0.000
|
||||
Ilmovuori 12.345.678.1 - 12.345.678.1 1 0 0.000
|
||||
Ilmovuori 12.345.678.1 - 12.345.678.254 254 0 0.000
|
||||
Ilmovuori 12.345.678.1 - 12.345.678.254 254 0 0.000
|
||||
Ilmovuori 12.345.678.1 - 12.345.678.254 254 0 0.000
|
||||
Ilmovuori 12.345.678.1 - 12.345.678.254 254 0 0.000
|
||||
Ilmovuori 12.345.678.1 - 12.345.678.254 254 0 0.000
|
||||
Ilmovuori 12.345.678.1 - 12.345.678.254 254 0 0.000
|
||||
Ilmovuori 12.345.678.1 - 12.345.678.254 254 0 0.000
|
||||
Jaskanen 12.345.678.3 - 12.345.678.254 252 180 71.429
|
||||
Jaskanen 12.345.678.1 - 12.345.678.254 254 177 69.685
|
||||
Jaskanen 12.345.678.1 - 12.345.678.254 254 176 69.291
|
||||
Jaskanen 12.345.678.1 - 12.345.678.254 254 172 67.717
|
||||
Jaskanen 12.345.678.1 - 12.345.678.254 254 195 76.772
|
||||
Jaskanen 12.345.678.1 - 12.345.678.254 254 172 67.717
|
||||
Jaskanen 12.345.678.1 - 12.345.678.254 254 184 72.441
|
||||
Jaskanen 12.345.678.1 - 12.345.678.254 254 175 68.898
|
||||
Jaskanen 12.345.678.1 - 12.345.678.254 254 185 72.835
|
||||
Jaskanen 12.345.678.1 - 12.345.678.254 254 187 73.622
|
||||
Jaskanen 12.345.678.1 - 12.345.678.254 254 172 67.717
|
||||
Jaskanen 12.345.678.1 - 12.345.678.254 254 174 68.504
|
||||
Jaskanen 12.345.678.1 - 12.345.678.254 254 187 73.622
|
||||
Jaskanen 12.345.678.1 - 12.345.678.254 254 181 71.260
|
||||
Jaskanen 12.345.678.1 - 12.345.678.254 254 176 69.291
|
||||
Jaskanen 12.345.678.1 - 12.345.678.254 254 171 67.323
|
||||
Honkanen 12.345.678.3 - 12.345.678.254 252 105 41.667
|
||||
Honkanen 12.345.678.1 - 12.345.678.254 254 106 41.732
|
||||
Honkanen 12.345.678.1 - 12.345.678.254 254 117 46.063
|
||||
Honkanen 12.345.678.1 - 12.345.678.254 254 98 38.583
|
||||
Honkanen 12.345.678.1 - 12.345.678.254 254 103 40.551
|
||||
Honkanen 12.345.678.1 - 12.345.678.254 254 98 38.583
|
||||
Honkanen 12.345.678.1 - 12.345.678.254 254 106 41.732
|
||||
Honkanen 12.345.678.1 - 12.345.678.254 254 118 46.457
|
||||
Honkanen 12.345.678.1 - 12.345.678.254 254 109 42.913
|
||||
Honkanen 12.345.678.1 - 12.345.678.254 254 101 39.764
|
||||
Honkanen 12.345.678.1 - 12.345.678.254 254 107 42.126
|
||||
Honkanen 12.345.678.1 - 12.345.678.254 254 98 38.583
|
||||
Honkanen 12.345.678.1 - 12.345.678.254 254 105 41.339
|
||||
Honkanen 12.345.678.1 - 12.345.678.254 254 115 45.276
|
||||
Honkanen 12.345.678.1 - 12.345.678.254 254 113 44.488
|
||||
Honkanen 12.345.678.1 - 12.345.678.254 254 110 43.307
|
||||
Honkipuro 12.345.67.3 - 12.345.67.254 252 98 38.889
|
||||
Honkipuro 12.345.67.1 - 12.345.67.254 254 99 38.976
|
||||
Honkipuro 12.345.67.1 - 12.345.67.254 254 89 35.039
|
||||
Honkipuro 12.345.67.1 - 12.345.67.254 254 100 39.370
|
||||
Honkipuro 12.345.67.1 - 12.345.67.254 254 101 39.764
|
||||
Honkipuro 12.345.67.1 - 12.345.67.254 254 117 46.063
|
||||
Honkipuro 12.345.67.1 - 12.345.67.254 254 97 38.189
|
||||
Honkipuro 12.345.67.1 - 12.345.67.254 254 92 36.220
|
||||
Honkipuro 12.345.67.1 - 12.345.67.254 254 104 40.945
|
||||
Honkipuro 12.345.67.1 - 12.345.67.254 254 91 35.827
|
||||
Honkipuro 12.345.67.1 - 12.345.67.254 254 94 37.008
|
||||
Honkipuro 12.345.67.1 - 12.345.67.254 254 98 38.583
|
||||
Honkipuro 12.345.67.1 - 12.345.67.254 254 100 39.370
|
||||
Honkipuro 12.345.67.1 - 12.345.67.254 254 110 43.307
|
||||
Honkipuro 12.345.67.1 - 12.345.67.254 254 96 37.795
|
||||
Honkipuro 12.345.67.1 - 12.345.67.254 254 103 40.551
|
||||
Ilarionova 12.345.67.3 - 12.345.67.254 252 118 46.825
|
||||
Ilarionova 12.345.67.1 - 12.345.67.1 1 0 0.000
|
||||
Ilarionova 12.345.67.1 - 12.345.67.1 1 1 100.000
|
||||
Ilarionova 12.345.67.1 - 12.345.67.1 1 1 100.000
|
||||
Ilarionova 12.345.67.1 - 12.345.67.1 1 0 0.000
|
||||
Ilarionova 12.345.67.1 - 12.345.67.1 1 0 0.000
|
||||
Ilarionova 12.345.67.1 - 12.345.67.1 1 0 0.000
|
||||
Ilarionova 12.345.67.1 - 12.345.67.1 1 1 100.000
|
||||
Ilarionova 12.345.67.1 - 12.345.67.1 1 0 0.000
|
||||
Ilarionova 12.345.67.1 - 12.345.67.1 1 0 0.000
|
||||
Ilarionova 12.345.67.1 - 12.345.67.1 1 0 0.000
|
||||
Ilarionova 12.345.67.1 - 12.345.67.1 1 1 100.000
|
||||
Ilarionova 12.345.67.1 - 12.345.67.1 1 1 100.000
|
||||
Ilarionova 12.345.67.1 - 12.345.67.1 1 0 0.000
|
||||
Ilarionova 12.345.67.1 - 12.345.67.1 1 1 100.000
|
||||
Ilarionova 12.345.67.1 - 12.345.67.254 254 131 51.575
|
||||
Huhtala 12.345.67.3 - 12.345.67.254 252 105 41.667
|
||||
Huhtala 12.345.67.1 - 12.345.67.254 254 104 40.945
|
||||
Huhtala 12.345.67.1 - 12.345.67.254 254 104 40.945
|
||||
Huhtala 12.345.67.1 - 12.345.67.254 254 95 37.402
|
||||
Huhtala 12.345.67.1 - 12.345.67.254 254 97 38.189
|
||||
Huhtala 12.345.67.1 - 12.345.67.254 254 106 41.732
|
||||
Huhtala 12.345.67.1 - 12.345.67.254 254 110 43.307
|
||||
Huhtala 12.345.67.1 - 12.345.67.254 254 105 41.339
|
||||
Huhtala 12.345.67.1 - 12.345.67.254 254 88 34.646
|
||||
Huhtala 12.345.67.1 - 12.345.67.254 254 106 41.732
|
||||
Huhtala 12.345.67.1 - 12.345.67.254 254 93 36.614
|
||||
Huhtala 12.345.67.1 - 12.345.67.254 254 103 40.551
|
||||
Huhtala 12.345.67.1 - 12.345.67.254 254 103 40.551
|
||||
Huhtala 12.345.67.1 - 12.345.67.254 254 96 37.795
|
||||
Huhtala 12.345.67.1 - 12.345.67.254 254 103 40.551
|
||||
Huhtala 12.345.67.1 - 12.345.67.254 254 98 38.583
|
||||
Hult 12.345.67.3 - 12.345.67.254 252 86 34.127
|
||||
Hult 12.345.67.1 - 12.345.67.254 254 86 33.858
|
||||
Hult 12.345.67.1 - 12.345.67.254 254 80 31.496
|
||||
Hult 12.345.67.1 - 12.345.67.254 254 87 34.252
|
||||
Hult 12.345.678.1 - 12.345.678.254 254 89 35.039
|
||||
Hult 12.345.678.1 - 12.345.678.254 254 82 32.283
|
||||
Hult 12.345.678.1 - 12.345.678.254 254 94 37.008
|
||||
Hult 12.345.678.1 - 12.345.678.254 254 85 33.465
|
||||
Hult 12.345.678.1 - 12.345.678.254 254 93 36.614
|
||||
Hult 12.345.678.1 - 12.345.678.254 254 83 32.677
|
||||
Hult 12.345.678.1 - 12.345.678.254 254 89 35.039
|
||||
Hult 12.345.678.1 - 12.345.678.254 254 84 33.071
|
||||
Hult 12.345.678.1 - 12.345.678.254 254 89 35.039
|
||||
Hult 12.345.678.1 - 12.345.678.254 254 92 36.220
|
||||
Hult 12.345.678.1 - 12.345.678.254 254 83 32.677
|
||||
Hult 12.345.678.1 - 12.345.678.254 254 85 33.465
|
||||
Huusko 12.345.678.3 - 12.345.678.254 252 80 31.746
|
||||
Huusko 12.345.678.1 - 12.345.678.254 254 112 44.094
|
||||
Huusko 12.345.678.1 - 12.345.678.254 254 91 35.827
|
||||
Huusko 12.345.678.1 - 12.345.678.254 254 115 45.276
|
||||
Huusko 12.345.678.1 - 12.345.678.254 254 93 36.614
|
||||
Huusko 12.345.678.1 - 12.345.678.254 254 94 37.008
|
||||
Huusko 12.345.678.1 - 12.345.678.254 254 91 35.827
|
||||
Huusko 12.345.678.1 - 12.345.678.254 254 82 32.283
|
||||
Huusko 12.345.678.1 - 12.345.678.254 254 94 37.008
|
||||
Huusko 12.345.678.1 - 12.345.678.254 254 101 39.764
|
||||
Huusko 12.345.678.1 - 12.345.678.254 254 110 43.307
|
||||
Huusko 12.345.678.1 - 12.345.678.254 254 97 38.189
|
||||
Huusko 12.345.678.1 - 12.345.678.254 254 101 39.764
|
||||
Huusko 12.345.678.1 - 12.345.678.254 254 83 32.677
|
||||
Huusko 12.345.678.1 - 12.345.678.254 254 94 37.008
|
||||
Huusko 12.345.678.1 - 12.345.678.254 254 94 37.008
|
||||
Eronen 12.345.678.3 - 12.345.678.254 252 74 29.365
|
||||
Eronen 12.345.678.1 - 12.345.678.254 254 70 27.559
|
||||
Auvinen 12.345.678.3 - 12.345.678.254 252 102 40.476
|
||||
Auvinen 12.345.678.1 - 12.345.678.254 254 87 34.252
|
||||
Honkipuro 12.345.678.3 - 12.345.678.254 252 87 34.524
|
||||
Honkipuro 12.345.678.1 - 12.345.678.254 254 89 35.039
|
||||
Jaskanen 12.345.678.3 - 12.345.678.254 252 164 65.079
|
||||
Jaskanen 12.345.678.1 - 12.345.678.254 254 190 74.803
|
||||
Jaskanen 12.345.678.1 - 12.345.678.254 254 174 68.504
|
||||
Jaskanen 12.345.678.1 - 12.345.678.254 254 177 69.685
|
||||
Jaskanen 12.345.678.1 - 12.345.678.254 254 180 70.866
|
||||
Jaskanen 12.345.678.1 - 12.345.678.254 254 187 73.622
|
||||
Jaskanen 12.345.678.1 - 12.345.678.254 254 183 72.047
|
||||
Jaskanen 12.345.678.1 - 12.345.678.254 254 179 70.472
|
||||
Jaskanen 12.345.678.1 - 12.345.678.254 254 173 68.110
|
||||
Jaskanen 12.345.678.1 - 12.345.678.254 254 174 68.504
|
||||
Jaskanen 12.345.678.1 - 12.345.678.254 254 186 73.228
|
||||
Jaskanen 12.345.678.1 - 12.345.678.254 254 178 70.079
|
||||
Jaskanen 12.345.678.1 - 12.345.678.254 254 173 68.110
|
||||
Jaskanen 12.345.678.1 - 12.345.678.254 254 164 64.567
|
||||
Jaskanen 12.345.678.1 - 12.345.678.254 254 181 71.260
|
||||
Jaskanen 12.345.678.1 - 12.345.678.254 254 168 66.142
|
||||
Halttunen 12.345.6.3 - 12.345.6.254 252 139 55.159
|
||||
Halttunen 12.345.6.1 - 12.345.6.254 254 145 57.087
|
||||
Halttunen 12.345.6.1 - 12.345.6.254 254 138 54.331
|
||||
Halttunen 12.345.6.1 - 12.345.6.254 254 149 58.661
|
||||
Halttunen 12.345.6.1 - 12.345.6.254 254 142 55.906
|
||||
Halttunen 12.345.6.1 - 12.345.6.254 254 128 50.394
|
||||
Halttunen 12.345.6.1 - 12.345.6.254 254 155 61.024
|
||||
Halttunen 12.345.6.1 - 12.345.6.254 254 139 54.724
|
||||
Halttunen 12.345.6.1 - 12.345.6.254 254 137 53.937
|
||||
Halttunen 12.345.6.1 - 12.345.6.254 254 136 53.543
|
||||
Halttunen 12.345.67.1 - 12.345.67.254 254 136 53.543
|
||||
Halttunen 12.345.67.1 - 12.345.67.254 254 148 58.268
|
||||
Halttunen 12.345.67.1 - 12.345.67.254 254 146 57.480
|
||||
Halttunen 12.345.67.1 - 12.345.67.254 254 136 53.543
|
||||
Halttunen 12.345.67.1 - 12.345.67.254 254 135 53.150
|
||||
Halttunen 12.345.67.1 - 12.345.67.254 254 144 56.693
|
||||
Halttunen 12.345.67.1 - 12.345.67.254 254 146 57.480
|
||||
Halttunen 12.345.67.1 - 12.345.67.254 254 145 57.087
|
||||
Halttunen 12.345.67.1 - 12.345.67.254 254 132 51.969
|
||||
Halttunen 12.345.67.1 - 12.345.67.254 254 154 60.630
|
||||
Halttunen 12.345.67.1 - 12.345.67.254 254 144 56.693
|
||||
Halttunen 12.345.67.1 - 12.345.67.254 254 163 64.173
|
||||
Halttunen 12.345.67.1 - 12.345.67.254 254 139 54.724
|
||||
Halttunen 12.345.67.1 - 12.345.67.254 254 143 56.299
|
||||
Halttunen 12.345.67.1 - 12.345.67.254 254 141 55.512
|
||||
Halttunen 12.345.67.1 - 12.345.67.254 254 145 57.087
|
||||
Halttunen 12.345.67.1 - 12.345.67.254 254 141 55.512
|
||||
Halttunen 12.345.67.1 - 12.345.67.254 254 148 58.268
|
||||
Halttunen 12.345.67.1 - 12.345.67.254 254 146 57.480
|
||||
Halttunen 12.345.67.1 - 12.345.67.254 254 140 55.118
|
||||
Halttunen 12.345.67.1 - 12.345.67.254 254 145 57.087
|
||||
Halttunen 12.345.67.1 - 12.345.67.254 254 124 48.819
|
||||
Husso 12.345.67.3 - 12.345.67.254 252 102 40.476
|
||||
Husso 12.345.67.1 - 12.345.67.254 254 97 38.189
|
||||
Husso 12.345.67.1 - 12.345.67.254 254 115 45.276
|
||||
Husso 12.345.67.1 - 12.345.67.254 254 101 39.764
|
||||
Husso 12.345.67.1 - 12.345.67.254 254 102 40.157
|
||||
Husso 12.345.67.1 - 12.345.67.254 254 103 40.551
|
||||
Husso 12.345.67.1 - 12.345.67.254 254 102 40.157
|
||||
Husso 12.345.67.1 - 12.345.67.254 254 106 41.732
|
||||
Husso 12.345.67.1 - 12.345.67.254 254 100 39.370
|
||||
Husso 12.345.67.1 - 12.345.67.254 254 106 41.732
|
||||
Husso 12.345.67.1 - 12.345.67.254 254 100 39.370
|
||||
Husso 12.345.67.1 - 12.345.67.254 254 98 38.583
|
||||
Husso 12.345.67.1 - 12.345.67.254 254 100 39.370
|
||||
Husso 12.345.67.1 - 12.345.67.254 254 109 42.913
|
||||
Husso 12.345.67.1 - 12.345.67.254 254 117 46.063
|
||||
Husso 12.345.67.1 - 12.345.67.254 254 101 39.764
|
||||
Husso 12.345.67.1 - 12.345.67.254 254 109 42.913
|
||||
Husso 12.345.67.1 - 12.345.67.254 254 102 40.157
|
||||
Husso 12.345.67.1 - 12.345.67.254 254 94 37.008
|
||||
Husso 12.345.67.1 - 12.345.67.254 254 101 39.764
|
||||
Husso 12.345.67.1 - 12.345.67.254 254 102 40.157
|
||||
Husso 12.345.67.1 - 12.345.67.254 254 99 38.976
|
||||
Husso 12.345.67.1 - 12.345.67.254 254 102 40.157
|
||||
Husso 12.345.67.1 - 12.345.67.254 254 103 40.551
|
||||
Husso 12.345.67.1 - 12.345.67.254 254 106 41.732
|
||||
Husso 12.345.67.1 - 12.345.67.254 254 119 46.850
|
||||
Husso 12.345.67.1 - 12.345.67.254 254 99 38.976
|
||||
Husso 12.345.67.1 - 12.345.67.254 254 96 37.795
|
||||
Husso 12.345.67.1 - 12.345.67.254 254 112 44.094
|
||||
Husso 12.345.67.1 - 12.345.67.254 254 102 40.157
|
||||
Husso 12.345.67.1 - 12.345.67.254 254 104 40.945
|
||||
Husso 12.345.67.1 - 12.345.67.254 254 106 41.732
|
||||
Jaskanen 12.345.678.3 - 12.345.678.254 252 180 71.429
|
||||
Jaskanen 12.345.678.1 - 12.345.678.254 254 192 75.591
|
||||
Jaskanen 12.345.678.1 - 12.345.678.254 254 176 69.291
|
||||
Jaskanen 12.345.678.1 - 12.345.678.254 254 185 72.835
|
||||
Jaskanen 12.345.678.1 - 12.345.678.254 254 178 70.079
|
||||
Jaskanen 12.345.678.1 - 12.345.678.254 254 192 75.591
|
||||
Jaskanen 12.345.678.1 - 12.345.678.254 254 182 71.654
|
||||
Jaskanen 12.345.678.1 - 12.345.678.254 254 180 70.866
|
||||
Jaskanen 12.345.678.1 - 12.345.678.254 254 172 67.717
|
||||
Jaskanen 12.345.678.1 - 12.345.678.254 254 182 71.654
|
||||
Jaskanen 12.345.678.1 - 12.345.678.254 254 174 68.504
|
||||
Jaskanen 12.345.678.1 - 12.345.678.254 254 188 74.016
|
||||
Jaskanen 12.345.678.1 - 12.345.678.254 254 171 67.323
|
||||
Jaskanen 12.345.678.1 - 12.345.678.254 254 187 73.622
|
||||
Jaskanen 12.345.678.1 - 12.345.678.254 254 161 63.386
|
||||
Jaskanen 12.345.678.1 - 12.345.678.254 254 176 69.291
|
||||
Jaskanen 12.345.678.1 - 12.345.678.254 254 182 71.654
|
||||
Jaskanen 12.345.678.1 - 12.345.678.254 254 178 70.079
|
||||
Jaskanen 12.345.678.1 - 12.345.678.254 254 180 70.866
|
||||
Jaskanen 12.345.678.1 - 12.345.678.254 254 177 69.685
|
||||
Jaskanen 12.345.678.1 - 12.345.678.254 254 173 68.110
|
||||
Jaskanen 12.345.678.1 - 12.345.678.254 254 185 72.835
|
||||
Jaskanen 12.345.678.1 - 12.345.678.254 254 178 70.079
|
||||
Jaskanen 12.345.678.1 - 12.345.678.254 254 176 69.291
|
||||
Jaskanen 12.345.678.1 - 12.345.678.254 254 162 63.780
|
||||
Jaskanen 12.345.678.1 - 12.345.678.254 254 193 75.984
|
||||
Jaskanen 12.345.678.1 - 12.345.678.254 254 184 72.441
|
||||
Jaskanen 12.345.678.1 - 12.345.678.254 254 187 73.622
|
||||
Jaskanen 12.345.678.1 - 12.345.678.254 254 188 74.016
|
||||
Jaskanen 12.345.678.1 - 12.345.678.254 254 165 64.961
|
||||
Jaskanen 12.345.678.1 - 12.345.678.254 254 171 67.323
|
||||
Jaskanen 12.345.678.1 - 12.345.678.254 254 174 68.504
|
||||
Halonen 12.345.6.3 - 12.345.6.254 252 214 12.345
|
||||
Halonen 12.345.6.1 - 12.345.6.254 254 219 86.220
|
||||
Halonen 12.345.6.1 - 12.345.6.254 254 225 88.583
|
||||
Halonen 12.345.6.1 - 12.345.6.254 254 228 89.764
|
||||
Halonen 12.345.6.1 - 12.345.6.254 254 226 88.976
|
||||
Halonen 12.345.6.1 - 12.345.6.254 254 212 83.465
|
||||
Halonen 12.345.6.1 - 12.345.6.254 254 217 85.433
|
||||
Halonen 12.345.6.1 - 12.345.6.254 254 216 85.039
|
||||
Halonen 12.345.6.1 - 12.345.6.254 254 218 85.827
|
||||
Halonen 12.345.6.1 - 12.345.6.254 254 218 85.827
|
||||
Halonen 12.345.67.1 - 12.345.67.254 254 223 87.795
|
||||
Halonen 12.345.67.1 - 12.345.67.254 254 228 89.764
|
||||
Halonen 12.345.67.1 - 12.345.67.254 254 221 87.008
|
||||
Halonen 12.345.67.1 - 12.345.67.254 254 217 85.433
|
||||
Halonen 12.345.67.1 - 12.345.67.254 254 218 85.827
|
||||
Halonen 12.345.67.1 - 12.345.67.254 254 227 89.370
|
||||
Halonen 12.345.67.1 - 12.345.67.254 254 212 83.465
|
||||
Halonen 12.345.67.1 - 12.345.67.254 254 215 12.345
|
||||
Halonen 12.345.67.1 - 12.345.67.254 254 232 91.339
|
||||
Halonen 12.345.67.1 - 12.345.67.254 254 217 85.433
|
||||
Halonen 12.345.67.1 - 12.345.67.254 254 227 89.370
|
||||
Halonen 12.345.67.1 - 12.345.67.254 254 218 85.827
|
||||
Halonen 12.345.67.1 - 12.345.67.254 254 223 87.795
|
||||
Halonen 12.345.67.1 - 12.345.67.254 254 222 87.402
|
||||
Halonen 12.345.67.1 - 12.345.67.254 254 218 85.827
|
||||
Halonen 12.345.67.1 - 12.345.67.254 254 225 88.583
|
||||
Halonen 12.345.67.1 - 12.345.67.254 254 210 82.677
|
||||
Halonen 12.345.67.1 - 12.345.67.254 254 224 88.189
|
||||
Halonen 12.345.67.1 - 12.345.67.254 254 220 86.614
|
||||
Halonen 12.345.67.1 - 12.345.67.254 254 227 89.370
|
||||
Halonen 12.345.67.1 - 12.345.67.254 254 228 89.764
|
||||
Halonen 12.345.67.1 - 12.345.67.254 254 220 86.614
|
||||
Asikainen 12.345.67.4 - 12.345.67.254 251 13 5.179
|
||||
Asikainen 12.345.67.1 - 12.345.67.254 254 17 6.693
|
||||
Asikainen 12.345.67.1 - 12.345.67.254 254 14 5.512
|
||||
Asikainen 12.345.67.1 - 12.345.67.254 254 19 7.480
|
||||
Asikainen 12.345.67.1 - 12.345.67.254 254 23 9.055
|
||||
Asikainen 12.345.67.1 - 12.345.67.254 254 19 7.480
|
||||
Asikainen 12.345.67.1 - 12.345.67.254 254 18 7.087
|
||||
Asikainen 12.345.67.1 - 12.345.67.254 254 16 6.299
|
||||
Asikainen 12.345.67.1 - 12.345.67.254 254 24 9.449
|
||||
Asikainen 12.345.67.1 - 12.345.67.254 254 24 9.449
|
||||
Asikainen 12.345.67.1 - 12.345.67.254 254 24 9.449
|
||||
Asikainen 12.345.67.1 - 12.345.67.254 254 26 10.236
|
||||
Asikainen 12.345.67.1 - 12.345.67.254 254 24 9.449
|
||||
Asikainen 12.345.67.1 - 12.345.67.254 254 33 12.992
|
||||
Asikainen 12.345.67.1 - 12.345.67.254 254 29 11.417
|
||||
Asikainen 12.345.67.1 - 12.345.67.254 254 25 9.843
|
||||
Asikainen 12.345.67.1 - 12.345.67.254 254 34 13.386
|
||||
Asikainen 12.345.67.1 - 12.345.67.254 254 31 12.205
|
||||
Asikainen 12.345.67.1 - 12.345.67.254 254 28 11.024
|
||||
Asikainen 12.345.67.1 - 12.345.67.254 254 32 12.598
|
||||
Asikainen 12.345.67.1 - 12.345.67.254 254 35 13.780
|
||||
Asikainen 12.345.67.1 - 12.345.67.254 254 36 14.173
|
||||
Asikainen 12.345.67.1 - 12.345.67.254 254 41 16.142
|
||||
Asikainen 12.345.67.1 - 12.345.67.254 254 35 13.780
|
||||
Asikainen 12.345.67.1 - 12.345.67.254 254 32 12.598
|
||||
Asikainen 12.345.67.1 - 12.345.67.254 254 33 12.992
|
||||
Asikainen 12.345.67.1 - 12.345.67.254 254 44 17.323
|
||||
Asikainen 12.345.67.1 - 12.345.67.254 254 27 10.630
|
||||
Asikainen 12.345.67.1 - 12.345.67.254 254 35 13.780
|
||||
Asikainen 12.345.67.1 - 12.345.67.254 254 32 12.598
|
||||
Asikainen 12.345.67.1 - 12.345.67.254 254 40 15.748
|
||||
Asikainen 12.345.67.1 - 12.345.67.254 254 37 14.567
|
||||
Hyle 12.345.678.3 - 12.345.678.254 252 0 0.000
|
||||
Hyle 12.345.678.1 - 12.345.678.254 254 0 0.000
|
||||
Hyle 12.345.678.1 - 12.345.678.254 254 0 0.000
|
||||
Hyle 12.345.678.1 - 12.345.678.254 254 0 0.000
|
||||
Hyle 12.345.678.1 - 12.345.678.254 254 0 0.000
|
||||
Hyle 12.345.678.1 - 12.345.678.254 254 0 0.000
|
||||
Hyle 12.345.678.1 - 12.345.678.254 254 0 0.000
|
||||
Hyle 12.345.678.1 - 12.345.678.254 254 1 0.394
|
||||
Hyle 12.345.678.1 - 12.345.678.254 254 0 0.000
|
||||
Hyle 12.345.678.1 - 12.345.678.254 254 0 0.000
|
||||
Hyle 12.345.678.1 - 12.345.678.254 254 0 0.000
|
||||
Hyle 12.345.678.1 - 12.345.678.254 254 0 0.000
|
||||
Hyle 12.345.678.1 - 12.345.678.254 254 0 0.000
|
||||
Hyle 12.345.678.1 - 12.345.678.254 254 0 0.000
|
||||
Hyle 12.345.678.1 - 12.345.678.254 254 0 0.000
|
||||
Hyle 12.345.678.1 - 12.345.678.254 254 0 0.000
|
||||
Halttunen 12.345.678.3 - 12.345.678.254 252 198 78.571
|
||||
Halttunen 12.345.678.1 - 12.345.678.254 254 193 75.984
|
||||
Halttunen 12.345.678.1 - 12.345.678.254 254 207 81.496
|
||||
Halttunen 12.345.678.1 - 12.345.678.254 254 191 75.197
|
||||
Husso 12.345.678.3 - 12.345.678.254 252 156 61.905
|
||||
Husso 12.345.678.1 - 12.345.678.254 254 154 60.630
|
||||
Husso 12.345.678.1 - 12.345.678.254 254 168 66.142
|
||||
Husso 12.345.678.1 - 12.345.678.254 254 169 66.535
|
||||
Husso 12.345.678.1 - 12.345.678.254 254 171 67.323
|
||||
Husso 12.345.678.1 - 12.345.678.254 254 184 72.441
|
||||
Husso 12.345.678.1 - 12.345.678.254 254 173 68.110
|
||||
Husso 12.345.678.1 - 12.345.678.254 254 166 65.354
|
||||
Halttunen 12.345.678.3 - 12.345.678.254 252 209 82.937
|
||||
Halttunen 12.345.678.1 - 12.345.678.254 254 209 82.283
|
||||
Halttunen 12.345.678.1 - 12.345.678.254 254 212 83.465
|
||||
Halttunen 12.345.678.1 - 12.345.678.254 254 205 80.709
|
||||
Halttunen 12.345.678.1 - 12.345.678.254 254 202 79.528
|
||||
Halttunen 12.345.678.1 - 12.345.678.254 254 210 82.677
|
||||
Halttunen 12.345.678.1 - 12.345.678.254 254 194 76.378
|
||||
Halttunen 12.345.678.1 - 12.345.678.254 254 193 75.984
|
||||
Husso 12.345.678.3 - 12.345.678.254 252 173 68.651
|
||||
Husso 12.345.678.1 - 12.345.678.254 254 175 68.898
|
||||
Husso 12.345.678.1 - 12.345.678.254 254 162 63.780
|
||||
Husso 12.345.678.1 - 12.345.678.254 254 166 65.354
|
||||
Husso 12.345.678.1 - 12.345.678.254 254 183 72.047
|
||||
Husso 12.345.678.1 - 12.345.678.254 254 166 65.354
|
||||
Husso 12.345.678.1 - 12.345.678.254 254 162 63.780
|
||||
Husso 12.345.678.1 - 12.345.678.254 254 163 64.173
|
||||
Halttunen 12.345.678.3 - 12.345.678.254 252 208 82.540
|
||||
Halttunen 12.345.678.1 - 12.345.678.254 254 196 77.165
|
||||
Halttunen 12.345.678.1 - 12.345.678.254 254 196 77.165
|
||||
Halttunen 12.345.678.1 - 12.345.678.254 254 205 80.709
|
||||
Halttunen 12.345.678.1 - 12.345.678.254 254 216 85.039
|
||||
Halttunen 12.345.678.1 - 12.345.678.254 254 211 83.071
|
||||
Halttunen 12.345.678.1 - 12.345.678.254 254 200 78.740
|
||||
Halttunen 12.345.678.1 - 12.345.678.254 254 208 81.890
|
||||
Halttunen 12.345.678.3 - 12.345.678.254 252 189 75.000
|
||||
Halttunen 12.345.678.1 - 12.345.678.254 254 216 85.039
|
||||
Halttunen 12.345.678.1 - 12.345.678.254 254 201 79.134
|
||||
Halttunen 12.345.678.1 - 12.345.678.254 254 205 80.709
|
||||
Ahosvaara 12.345.678.3 - 12.345.678.254 252 107 42.460
|
||||
Ahosvaara 12.345.678.1 - 12.345.678.254 254 97 38.189
|
||||
Ahosvaara 12.345.678.1 - 12.345.678.254 254 103 40.551
|
||||
Ahosvaara 12.345.678.1 - 12.345.678.254 254 113 44.488
|
||||
Janhonen 12.345.6.4 - 12.345.6.254 251 0 0.000
|
||||
Janhonen 12.345.6.1 - 12.345.6.254 254 0 0.000
|
||||
Janhonen 12.345.6.1 - 12.345.6.254 254 0 0.000
|
||||
Janhonen 12.345.6.1 - 12.345.6.254 254 0 0.000
|
||||
Janhonen 12.345.6.1 - 12.345.6.254 254 0 0.000
|
||||
Janhonen 12.345.6.1 - 12.345.6.254 254 0 0.000
|
||||
Janhonen 12.345.6.1 - 12.345.6.254 254 0 0.000
|
||||
Janhonen 12.345.6.1 - 12.345.6.254 254 0 0.000
|
||||
Janhonen 12.345.6.1 - 12.345.6.254 254 0 0.000
|
||||
Janhonen 12.345.6.1 - 12.345.6.254 254 0 0.000
|
||||
Janhonen 12.345.67.1 - 12.345.67.254 254 0 0.000
|
||||
Janhonen 12.345.67.1 - 12.345.67.254 254 1 0.394
|
||||
Janhonen 12.345.67.1 - 12.345.67.254 254 1 0.394
|
||||
Janhonen 12.345.67.1 - 12.345.67.254 254 2 0.787
|
||||
Janhonen 12.345.67.1 - 12.345.67.254 254 5 1.969
|
||||
Janhonen 12.345.67.1 - 12.345.67.254 254 6 2.362
|
||||
Janhonen 12.345.67.1 - 12.345.67.254 254 9 3.543
|
||||
Janhonen 12.345.67.1 - 12.345.67.254 254 4 1.575
|
||||
Janhonen 12.345.67.1 - 12.345.67.254 254 5 1.969
|
||||
Janhonen 12.345.67.1 - 12.345.67.254 254 10 3.937
|
||||
Janhonen 12.345.67.1 - 12.345.67.254 254 7 2.756
|
||||
Janhonen 12.345.67.1 - 12.345.67.254 254 8 3.150
|
||||
Janhonen 12.345.67.1 - 12.345.67.254 254 12 4.724
|
||||
Janhonen 12.345.67.1 - 12.345.67.254 254 11 4.331
|
||||
Janhonen 12.345.67.1 - 12.345.67.254 254 12 4.724
|
||||
Janhonen 12.345.67.1 - 12.345.67.254 254 15 5.906
|
||||
Janhonen 12.345.67.1 - 12.345.67.254 254 16 6.299
|
||||
Janhonen 12.345.67.1 - 12.345.67.254 254 10 3.937
|
||||
Janhonen 12.345.67.1 - 12.345.67.254 254 6 2.362
|
||||
Janhonen 12.345.67.1 - 12.345.67.254 254 15 5.906
|
||||
Janhonen 12.345.67.1 - 12.345.67.254 254 12 4.724
|
||||
Janhonen 12.345.67.1 - 12.345.67.254 254 17 6.693
|
||||
Janhonen 12.345.67.1 - 12.345.67.254 254 20 7.874
|
||||
Janhonen 12.345.67.1 - 12.345.67.254 254 12 4.724
|
||||
Janhonen 12.345.67.1 - 12.345.67.254 254 15 5.906
|
||||
Janhonen 12.345.67.1 - 12.345.67.254 254 23 9.055
|
||||
Janhonen 12.345.67.1 - 12.345.67.254 254 19 7.480
|
||||
Janhonen 12.345.67.1 - 12.345.67.254 254 19 7.480
|
||||
Janhonen 12.345.67.1 - 12.345.67.254 254 25 9.843
|
||||
Janhonen 12.345.67.1 - 12.345.67.254 254 25 9.843
|
||||
Janhonen 12.345.67.1 - 12.345.67.254 254 30 11.811
|
||||
Janhonen 12.345.67.1 - 12.345.67.254 254 30 11.811
|
||||
Janhonen 12.345.67.1 - 12.345.67.254 254 31 12.205
|
||||
Janhonen 12.345.67.1 - 12.345.67.254 254 31 12.205
|
||||
Janhonen 12.345.67.1 - 12.345.67.254 254 33 12.992
|
||||
Janhonen 12.345.67.1 - 12.345.67.254 254 31 12.205
|
||||
Janhonen 12.345.67.1 - 12.345.67.254 254 35 13.780
|
||||
Janhonen 12.345.67.1 - 12.345.67.254 254 40 15.748
|
||||
Janhonen 12.345.67.1 - 12.345.67.254 254 35 13.780
|
||||
Janhonen 12.345.67.1 - 12.345.67.254 254 43 16.929
|
||||
Janhonen 12.345.67.1 - 12.345.67.254 254 44 17.323
|
||||
Janhonen 12.345.67.1 - 12.345.67.254 254 33 12.992
|
||||
Janhonen 12.345.67.1 - 12.345.67.254 254 44 17.323
|
||||
Janhonen 12.345.67.1 - 12.345.67.254 254 35 13.780
|
||||
Janhonen 12.345.67.1 - 12.345.67.254 254 48 18.898
|
||||
Janhonen 12.345.67.1 - 12.345.67.254 254 45 17.717
|
||||
Janhonen 12.345.67.1 - 12.345.67.254 254 43 16.929
|
||||
Janhonen 12.345.67.1 - 12.345.67.254 254 46 18.110
|
||||
Janhonen 12.345.67.1 - 12.345.67.254 254 51 20.079
|
||||
Janhonen 12.345.67.1 - 12.345.67.254 254 52 20.472
|
||||
Janhonen 12.345.67.1 - 12.345.67.254 254 55 21.654
|
||||
Janhonen 12.345.67.1 - 12.345.67.254 254 56 22.047
|
||||
Janhonen 12.345.67.1 - 12.345.67.254 254 51 20.079
|
||||
Janhonen 12.345.67.1 - 12.345.67.254 254 60 23.622
|
||||
Jehkinen 12.345.67.4 - 12.345.67.254 251 0 0.000
|
||||
Jehkinen 12.345.67.1 - 12.345.67.254 254 0 0.000
|
||||
Jehkinen 12.345.67.1 - 12.345.67.254 254 0 0.000
|
||||
Jehkinen 12.345.67.1 - 12.345.67.254 254 0 0.000
|
||||
Jehkinen 12.345.67.1 - 12.345.67.254 254 0 0.000
|
||||
Jehkinen 12.345.67.1 - 12.345.67.254 254 0 0.000
|
||||
Jehkinen 12.345.67.1 - 12.345.67.254 254 0 0.000
|
||||
Jehkinen 12.345.67.1 - 12.345.67.254 254 0 0.000
|
||||
Jehkinen 12.345.67.1 - 12.345.67.254 254 0 0.000
|
||||
Jehkinen 12.345.67.1 - 12.345.67.254 254 0 0.000
|
||||
Jehkinen 12.345.67.1 - 12.345.67.254 254 0 0.000
|
||||
Jehkinen 12.345.67.1 - 12.345.67.254 254 0 0.000
|
||||
Jehkinen 12.345.67.1 - 12.345.67.254 254 0 0.000
|
||||
Jehkinen 12.345.67.1 - 12.345.67.254 254 1 0.394
|
||||
Jehkinen 12.345.67.1 - 12.345.67.254 254 3 1.181
|
||||
Jehkinen 12.345.67.1 - 12.345.67.254 254 3 1.181
|
||||
Jehkinen 12.345.67.1 - 12.345.67.254 254 7 2.756
|
||||
Jehkinen 12.345.67.1 - 12.345.67.254 254 5 1.969
|
||||
Jehkinen 12.345.67.1 - 12.345.67.254 254 4 1.575
|
||||
Jehkinen 12.345.67.1 - 12.345.67.254 254 6 2.362
|
||||
Jehkinen 12.345.67.1 - 12.345.67.254 254 10 3.937
|
||||
Jehkinen 12.345.67.1 - 12.345.67.254 254 7 2.756
|
||||
Jehkinen 12.345.67.1 - 12.345.67.254 254 11 4.331
|
||||
Jehkinen 12.345.67.1 - 12.345.67.254 254 13 5.118
|
||||
Jehkinen 12.345.67.1 - 12.345.67.254 254 14 5.512
|
||||
Jehkinen 12.345.67.1 - 12.345.67.254 254 15 5.906
|
||||
Jehkinen 12.345.67.1 - 12.345.67.254 254 18 7.087
|
||||
Jehkinen 12.345.67.1 - 12.345.67.254 254 18 7.087
|
||||
Jehkinen 12.345.67.1 - 12.345.67.254 254 19 7.480
|
||||
Jehkinen 12.345.67.1 - 12.345.67.254 254 17 6.693
|
||||
Jehkinen 12.345.67.1 - 12.345.67.254 254 17 6.693
|
||||
Jehkinen 12.345.67.1 - 12.345.67.254 254 19 7.480
|
||||
Hokkanen 12.345.67.3 - 12.345.67.254 252 55 21.825
|
||||
Hokkanen 12.345.67.1 - 12.345.67.254 254 64 25.197
|
||||
Hokkanen 12.345.67.1 - 12.345.67.254 254 70 27.559
|
||||
Hokkanen 12.345.67.1 - 12.345.67.254 254 72 28.346
|
||||
Hokkanen 12.345.678.1 - 12.345.678.254 254 82 32.283
|
||||
Hokkanen 12.345.678.1 - 12.345.678.254 254 68 26.772
|
||||
Hokkanen 12.345.678.1 - 12.345.678.254 254 65 25.591
|
||||
Hokkanen 12.345.678.1 - 12.345.678.254 254 70 27.559
|
||||
Hokkanen 12.345.678.1 - 12.345.678.254 254 83 32.677
|
||||
Hokkanen 12.345.678.1 - 12.345.678.254 254 73 28.740
|
||||
Hokkanen 12.345.678.1 - 12.345.678.254 254 89 35.039
|
||||
Hokkanen 12.345.678.1 - 12.345.678.254 254 92 36.220
|
||||
Hokkanen 12.345.678.1 - 12.345.678.254 254 74 29.134
|
||||
Hokkanen 12.345.678.1 - 12.345.678.254 254 68 26.772
|
||||
Hokkanen 12.345.678.1 - 12.345.678.254 254 73 28.740
|
||||
Hokkanen 12.345.678.1 - 12.345.678.254 254 88 34.646
|
||||
Husso 12.345.678.3 - 12.345.678.254 252 142 56.349
|
||||
Husso 12.345.678.1 - 12.345.678.254 254 155 61.024
|
||||
Husso 12.345.678.1 - 12.345.678.254 254 160 62.992
|
||||
Husso 12.345.678.1 - 12.345.678.254 254 148 58.268
|
||||
Husso 12.345.678.1 - 12.345.678.254 254 148 58.268
|
||||
Husso 12.345.678.1 - 12.345.678.254 254 157 61.811
|
||||
Husso 12.345.678.1 - 12.345.678.254 254 149 58.661
|
||||
Husso 12.345.678.1 - 12.345.678.254 254 163 64.173
|
||||
Husso 12.345.678.3 - 12.345.678.254 252 135 53.571
|
||||
Husso 12.345.678.1 - 12.345.678.254 254 141 55.512
|
||||
Husso 12.345.678.1 - 12.345.678.254 254 140 55.118
|
||||
Husso 12.345.678.1 - 12.345.678.254 254 141 55.512
|
||||
Husso 12.345.678.1 - 12.345.678.254 254 136 53.543
|
||||
Husso 12.345.678.1 - 12.345.678.254 254 125 49.213
|
||||
Husso 12.345.678.1 - 12.345.678.254 254 145 57.087
|
||||
Husso 12.345.678.1 - 12.345.678.254 254 139 54.724
|
||||
Husso 12.345.678.3 - 12.345.678.254 252 148 58.730
|
||||
Husso 12.345.678.1 - 12.345.678.254 254 159 62.598
|
||||
Husso 12.345.678.1 - 12.345.678.254 254 157 61.811
|
||||
Husso 12.345.678.1 - 12.345.678.254 254 157 61.811
|
||||
Husso 12.345.678.1 - 12.345.678.254 254 168 66.142
|
||||
Husso 12.345.678.1 - 12.345.678.254 254 153 60.236
|
||||
Husso 12.345.678.1 - 12.345.678.254 254 162 63.780
|
||||
Husso 12.345.678.1 - 12.345.678.254 254 159 62.598
|
||||
Halttunen 12.345.678.3 - 12.345.678.254 252 184 73.016
|
||||
Halttunen 12.345.678.1 - 12.345.678.254 254 185 72.835
|
||||
Halttunen 12.345.678.1 - 12.345.678.254 254 181 71.260
|
||||
Halttunen 12.345.678.1 - 12.345.678.254 254 184 72.441
|
||||
Halttunen 12.345.678.1 - 12.345.678.254 254 175 68.898
|
||||
Halttunen 12.345.678.1 - 12.345.678.254 254 192 75.591
|
||||
Halttunen 12.345.678.1 - 12.345.678.254 254 173 68.110
|
||||
Halttunen 12.345.678.1 - 12.345.678.254 254 185 72.835
|
||||
Halttunen 12.345.678.3 - 12.345.678.254 252 116 46.032
|
||||
Halttunen 12.345.678.1 - 12.345.678.254 254 130 51.181
|
||||
Halttunen 12.345.678.1 - 12.345.678.254 254 130 51.181
|
||||
Halttunen 12.345.678.1 - 12.345.678.254 254 138 54.331
|
||||
Halttunen 12.345.678.1 - 12.345.678.254 254 143 56.299
|
||||
Halttunen 12.345.678.1 - 12.345.678.254 254 131 51.575
|
||||
Halttunen 12.345.678.1 - 12.345.678.254 254 121 47.638
|
||||
Halttunen 12.345.678.1 - 12.345.678.254 254 126 49.606
|
||||
Jelonen 12.345.6.3 - 12.345.6.254 252 57 22.619
|
||||
Jelonen 12.345.6.1 - 12.345.6.254 254 47 18.504
|
||||
Jelonen 12.345.6.1 - 12.345.6.254 254 52 20.472
|
||||
Jelonen 12.345.6.1 - 12.345.6.254 254 52 20.472
|
||||
Jelonen 12.345.6.1 - 12.345.6.254 254 58 22.835
|
||||
Jelonen 12.345.6.1 - 12.345.6.254 254 59 23.228
|
||||
Jelonen 12.345.6.1 - 12.345.6.254 254 55 21.654
|
||||
Jelonen 12.345.6.1 - 12.345.6.254 254 52 20.472
|
||||
Jelonen 12.345.6.1 - 12.345.6.254 254 55 21.654
|
||||
Jelonen 12.345.6.1 - 12.345.6.254 254 67 26.378
|
||||
Jelonen 12.345.67.1 - 12.345.67.254 254 62 24.409
|
||||
Jelonen 12.345.67.1 - 12.345.67.254 254 60 23.622
|
||||
Jelonen 12.345.67.1 - 12.345.67.254 254 60 23.622
|
||||
Jelonen 12.345.67.1 - 12.345.67.254 254 61 24.016
|
||||
Jelonen 12.345.67.1 - 12.345.67.254 254 64 25.197
|
||||
Jelonen 12.345.67.1 - 12.345.67.254 254 70 27.559
|
||||
Jaskanen 12.345.67.3 - 12.345.67.254 252 146 57.937
|
||||
Jaskanen 12.345.67.1 - 12.345.67.254 254 143 56.299
|
||||
Jaskanen 12.345.67.1 - 12.345.67.254 254 142 55.906
|
||||
Jaskanen 12.345.67.1 - 12.345.67.254 254 161 63.386
|
||||
Jaskanen 12.345.67.1 - 12.345.67.254 254 150 59.055
|
||||
Jaskanen 12.345.67.1 - 12.345.67.254 254 155 61.024
|
||||
Jaskanen 12.345.67.1 - 12.345.67.254 254 153 60.236
|
||||
Jaskanen 12.345.67.1 - 12.345.67.254 254 161 63.386
|
||||
Jaskanen 12.345.67.1 - 12.345.67.254 254 150 59.055
|
||||
Jaskanen 12.345.67.1 - 12.345.67.254 254 156 61.417
|
||||
Jaskanen 12.345.67.1 - 12.345.67.254 254 150 59.055
|
||||
Jaskanen 12.345.67.1 - 12.345.67.254 254 147 57.874
|
||||
Jaskanen 12.345.67.1 - 12.345.67.254 254 148 58.268
|
||||
Jaskanen 12.345.67.1 - 12.345.67.254 254 150 59.055
|
||||
Jaskanen 12.345.67.1 - 12.345.67.254 254 143 56.299
|
||||
Jaskanen 12.345.67.1 - 12.345.67.254 254 145 57.087
|
||||
Itkonen 12.345.67.3 - 12.345.67.254 252 165 65.476
|
||||
Itkonen 12.345.67.1 - 12.345.67.254 254 153 60.236
|
||||
Itkonen 12.345.67.1 - 12.345.67.254 254 142 55.906
|
||||
Itkonen 12.345.67.1 - 12.345.67.254 254 178 70.079
|
||||
Itkonen 12.345.67.1 - 12.345.67.254 254 163 64.173
|
||||
Itkonen 12.345.67.1 - 12.345.67.254 254 165 64.961
|
||||
Itkonen 12.345.67.1 - 12.345.67.254 254 175 68.898
|
||||
Itkonen 12.345.67.1 - 12.345.67.254 254 161 63.386
|
||||
Huttunen 12.345.678.3 - 12.345.678.254 252 39 15.476
|
||||
Huttunen 12.345.678.1 - 12.345.678.254 254 44 17.323
|
||||
Huttunen 12.345.678.1 - 12.345.678.254 254 43 16.929
|
||||
Huttunen 12.345.678.1 - 12.345.678.254 254 45 17.717
|
||||
Huttunen 12.345.678.1 - 12.345.678.254 254 49 19.291
|
||||
Huttunen 12.345.678.1 - 12.345.678.254 254 50 19.685
|
||||
Huttunen 12.345.678.1 - 12.345.678.254 254 48 18.898
|
||||
Huttunen 12.345.678.1 - 12.345.678.254 254 53 20.866
|
||||
Holappa 12.345.678.3 - 12.345.678.254 252 179 71.032
|
||||
Holappa 12.345.678.1 - 12.345.678.254 254 156 61.417
|
||||
Holappa 12.345.678.1 - 12.345.678.254 254 172 67.717
|
||||
Holappa 12.345.678.1 - 12.345.678.254 254 166 65.354
|
||||
Holappa 12.345.678.1 - 12.345.678.254 254 156 61.417
|
||||
Holappa 12.345.678.1 - 12.345.678.254 254 162 63.780
|
||||
Holappa 12.345.678.1 - 12.345.678.254 254 162 63.780
|
||||
Holappa 12.345.678.1 - 12.345.678.254 254 159 62.598
|
||||
Holappa 12.345.678.1 - 12.345.678.254 254 179 70.472
|
||||
Holappa 12.345.678.1 - 12.345.678.254 254 164 64.567
|
||||
Holappa 12.345.678.1 - 12.345.678.254 254 165 64.961
|
||||
Holappa 12.345.678.1 - 12.345.678.254 254 162 63.780
|
||||
Holappa 12.345.678.1 - 12.345.678.254 254 171 67.323
|
||||
Holappa 12.345.678.1 - 12.345.678.254 254 171 67.323
|
||||
Holappa 12.345.678.1 - 12.345.678.254 254 163 64.173
|
||||
Holappa 12.345.678.1 - 12.345.678.254 254 156 61.417
|
||||
Holopainen 123.45.198.2 - 124.56.198.254 253 2 0.791
|
||||
|
||||
Shared networks:
|
||||
name max cur percent
|
||||
Hynninen 0 0 nan
|
||||
Hyttinen 0 0 nan
|
||||
Hyytinen 0 0 nan
|
||||
Atjonen 252 1 0.397
|
||||
Auvinen 4568 1812 39.667
|
||||
Harakka 4062 1934 47.612
|
||||
Eronen 4568 1565 34.260
|
||||
Haavikko 4315 1585 36.732
|
||||
Hakkarainen 4062 540 13.294
|
||||
Halonen 20314 12514 61.603
|
||||
Halttunen 20304 13619 67.075
|
||||
Hokkanen 4062 1186 29.197
|
||||
Huttunen 2030 371 18.276
|
||||
Honkipuro 4568 1765 38.638
|
||||
Huhtala 4062 1616 39.783
|
||||
Hult 4823 1657 34.356
|
||||
Huohvanainen 4062 677 16.667
|
||||
Husso 20306 10971 54.028
|
||||
Holappa 4062 2643 65.066
|
||||
Jelonen 4062 931 22.920
|
||||
Honkanen 4568 1901 41.616
|
||||
Huusko 4062 1532 37.715
|
||||
Huuskonen 3809 2098 55.080
|
||||
Ilarionova 520 255 49.038
|
||||
Ikonen 4062 0 0.000
|
||||
Ilmovuori 4315 0 0.000
|
||||
Hyle 4062 1 0.025
|
||||
Aatamila 252 33 13.095
|
||||
Hattunen 2030 0 0.000
|
||||
Harkovski 2028 1573 77.564
|
||||
Happo 1014 663 65.385
|
||||
Happonen 1014 726 71.598
|
||||
Harakka 1014 803 79.191
|
||||
Harjunen 1014 818 80.671
|
||||
Haukka 1014 345 34.024
|
||||
Hautanen 1014 408 40.237
|
||||
Havu 1014 404 39.842
|
||||
Heiskanen 1014 452 44.576
|
||||
Hietanen 1014 395 38.955
|
||||
Hiiliaho 1014 408 40.237
|
||||
Hilonen 1014 323 31.854
|
||||
Hirvonen 1014 714 70.414
|
||||
Hoivassilta 507 0 0.000
|
||||
Jaskanen 28181 19262 68.351
|
||||
Itkonen-temp 3556 0 0.000
|
||||
Itkonen 4312 2788 64.657
|
||||
Ahtonen 1014 266 26.233
|
||||
Arviluoma 252 3 1.190
|
||||
Ahosvaara 1014 420 41.420
|
||||
Holopainen 253 2 0.791
|
||||
Anttila 505 0 0.000
|
||||
Janhonen 16253 1344 8.269
|
||||
Asikainen 8125 900 11.077
|
||||
Jehkinen 8125 207 2.548
|
||||
|
||||
Sum of all:
|
||||
name max cur percent
|
||||
All networks 228455 94431 41.335
|
||||
2641
webpages/sitemap.txt
2641
webpages/sitemap.txt
File diff suppressed because it is too large
Load diff
Loading…
Add table
Add a link
Reference in a new issue