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.
|
# Wildcard + in any subdir.
|
||||||
*.o
|
*.o
|
||||||
|
*.gcno
|
||||||
|
*.gcda
|
||||||
|
*.[ch].gcov
|
||||||
|
|
||||||
# Exact filename in any subdir.
|
# Exact filename in any subdir.
|
||||||
.deps
|
.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
|
## Makefile.am -- Process this file with automake to produce Makefile.in
|
||||||
|
|
||||||
AUTOMAKE_OPTIONS = gnu
|
AUTOMAKE_OPTIONS = gnu
|
||||||
ACLOCAL_AMFLAGS = -I m4
|
|
||||||
|
|
||||||
EXTRA_DIST = \
|
EXTRA_DIST = \
|
||||||
.version \
|
.version \
|
||||||
|
|
@ -40,7 +39,7 @@ edit_cmd = sed \
|
||||||
|
|
||||||
$(PATHFILES): Makefile
|
$(PATHFILES): Makefile
|
||||||
@ rm -f $@ $@.tmp
|
@ rm -f $@ $@.tmp
|
||||||
$(AM_V_at) test -d $(dir $@) || mkdir -p $(dir $@)
|
$(AM_V_at) mkdir -p $$(dirname $@)
|
||||||
$(AM_V_GEN) srcdir=''; \
|
$(AM_V_GEN) srcdir=''; \
|
||||||
test -f ./$@.in || srcdir=$(srcdir)/; \
|
test -f ./$@.in || srcdir=$(srcdir)/; \
|
||||||
$(edit_cmd) $${srcdir}$@.in >$@.tmp
|
$(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.
|
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
|
Version 3.0
|
||||||
Sami Kerola (56):
|
Sami Kerola (56):
|
||||||
|
|
|
||||||
4
README
4
README
|
|
@ -28,7 +28,7 @@ Quick start.
|
||||||
|
|
||||||
Dependencies to other projects.
|
Dependencies to other projects.
|
||||||
|
|
||||||
http://www.gnu.org/software/gnulib/
|
https://www.gnu.org/software/gnulib/
|
||||||
|
|
||||||
You can avoid repeated gnulib downloads by setting
|
You can avoid repeated gnulib downloads by setting
|
||||||
GNULIB_SRCDIR environment variable. For example:
|
GNULIB_SRCDIR environment variable. For example:
|
||||||
|
|
@ -39,7 +39,7 @@ Dependencies to other projects.
|
||||||
Assumign detached gnulib please remember to git pull the
|
Assumign detached gnulib please remember to git pull the
|
||||||
latest updates before building dhcpd-pools.
|
latest updates before building dhcpd-pools.
|
||||||
|
|
||||||
http://uthash.sourceforge.net/
|
https://troydhanson.github.io/uthash/
|
||||||
|
|
||||||
See quick start.
|
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
|
People who reported problems, give improvement suggestions or even
|
||||||
contributed code.
|
contributed code.
|
||||||
|
|
||||||
Otto J. Mäkelä
|
Otto J. Mäkelä
|
||||||
Mika Paananen
|
Mika Paananen
|
||||||
Frank Bulk
|
Frank Bulk
|
||||||
Roar Pettersen
|
Roar Pettersen
|
||||||
Jeff Wieland
|
Jeff Wieland
|
||||||
Rusty
|
Rusty
|
||||||
Fredrik Vöcks
|
Fredrik Vöcks
|
||||||
Dan Thorson
|
Dan Thorson
|
||||||
Stian Øvrevåge
|
Stian Øvrevåge
|
||||||
Dominic Germain
|
Dominic Germain
|
||||||
Anders Låstad
|
Anders Låstad
|
||||||
Thor Eivind Brantzeg
|
Thor Eivind Brantzeg
|
||||||
Ahmed AL Dakhil
|
Ahmed AL Dakhil
|
||||||
Adam Ciarcinski
|
Adam Ciarcinski
|
||||||
Rezso Gajdóczy
|
Rezső Gajdóczy
|
||||||
Robert Viou
|
Robert Viou
|
||||||
Enno Gröper
|
Enno Gröper
|
||||||
Troy D. Hanson
|
Troy D. Hanson
|
||||||
Ryan Malek
|
Ryan Malek
|
||||||
Cheer Xiao
|
Cheer Xiao
|
||||||
|
|
@ -30,7 +30,7 @@ Helmut Grohne
|
||||||
Joey D.
|
Joey D.
|
||||||
Ryan Steinmetz
|
Ryan Steinmetz
|
||||||
Dan Pritts
|
Dan Pritts
|
||||||
Fredrik Lysén
|
Fredrik Lysén
|
||||||
Conor McCarthy
|
Conor McCarthy
|
||||||
Wolfgang Steudel
|
Wolfgang Steudel
|
||||||
Aaron Paetznick
|
Aaron Paetznick
|
||||||
|
|
@ -44,4 +44,11 @@ Klaus Slott
|
||||||
Boris Lytochkin
|
Boris Lytochkin
|
||||||
Jeff Bailey
|
Jeff Bailey
|
||||||
José Bollo
|
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
|
# 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
|
# 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.
|
# (at your option) any later version.
|
||||||
|
|
||||||
# This program is distributed in the hope that it will be useful,
|
# This program is distributed in the hope that it will be useful,
|
||||||
|
|
@ -13,7 +13,7 @@
|
||||||
# GNU General Public License for more details.
|
# GNU General Public License for more details.
|
||||||
|
|
||||||
# You should have received a copy of the GNU General Public License
|
# 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.
|
# gnulib modules used by this package.
|
||||||
|
|
@ -64,7 +64,7 @@ XGETTEXT_OPTIONS=$XGETTEXT_OPTIONS'\\\
|
||||||
gettext_external=0
|
gettext_external=0
|
||||||
grep '^[ ]*AM_GNU_GETTEXT(external\>' configure.ac > /dev/null &&
|
grep '^[ ]*AM_GNU_GETTEXT(external\>' configure.ac > /dev/null &&
|
||||||
gettext_external=1
|
gettext_external=1
|
||||||
grep '^[ ]*AM_GNU_GETTEXT(\[external\]' configure.ac > /dev/null &&
|
grep '^[ ]*AM_GNU_GETTEXT(\[external]' configure.ac > /dev/null &&
|
||||||
gettext_external=1
|
gettext_external=1
|
||||||
|
|
||||||
if test $gettext_external = 1; then
|
if test $gettext_external = 1; then
|
||||||
|
|
|
||||||
1
build-aux/.gitignore
vendored
1
build-aux/.gitignore
vendored
|
|
@ -1,6 +1,7 @@
|
||||||
/ar-lib
|
/ar-lib
|
||||||
/compile
|
/compile
|
||||||
/config.guess
|
/config.guess
|
||||||
|
/config.rpath
|
||||||
/config.sub
|
/config.sub
|
||||||
/depcomp
|
/depcomp
|
||||||
/install-sh
|
/install-sh
|
||||||
|
|
|
||||||
|
|
@ -1,12 +1,12 @@
|
||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
# Print a version string.
|
# 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
|
# 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
|
# 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.
|
# (at your option) any later version.
|
||||||
#
|
#
|
||||||
# This program is distributed in the hope that it will be useful,
|
# 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.
|
# GNU General Public License for more details.
|
||||||
#
|
#
|
||||||
# You should have received a copy of the GNU General Public License
|
# 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:
|
# It may be run two ways:
|
||||||
# - from a git repository in which the "git describe" command below
|
# - from a git repository in which the "git describe" command below
|
||||||
# produces useful output (thus requiring at least one signed tag)
|
# 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
|
# EXTRA_DIST = $(top_srcdir)/.version
|
||||||
# BUILT_SOURCES = $(top_srcdir)/.version
|
# BUILT_SOURCES = $(top_srcdir)/.version
|
||||||
# $(top_srcdir)/.version:
|
# $(top_srcdir)/.version:
|
||||||
# echo $(VERSION) > $@-t && mv $@-t $@
|
# echo '$(VERSION)' > $@-t
|
||||||
|
# mv $@-t $@
|
||||||
# dist-hook:
|
# dist-hook:
|
||||||
# echo $(VERSION) > $(distdir)/.tarball-version
|
# echo '$(VERSION)' > $(distdir)/.tarball-version
|
||||||
|
|
||||||
|
|
||||||
me=$0
|
me=$0
|
||||||
|
|
||||||
|
year=`expr "$scriptversion" : '\([^-]*\)'`
|
||||||
version="git-version-gen $scriptversion
|
version="git-version-gen $scriptversion
|
||||||
|
|
||||||
Copyright 2011 Free Software Foundation, Inc.
|
Copyright (C) ${year} Free Software Foundation, Inc.
|
||||||
There is NO warranty. You may redistribute this software
|
License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>.
|
||||||
under the terms of the GNU General Public License.
|
This is free software: you are free to change and redistribute it.
|
||||||
For more information about these matters, see the files named COPYING."
|
There is NO WARRANTY, to the extent permitted by law."
|
||||||
|
|
||||||
usage="\
|
usage="\
|
||||||
Usage: $me [OPTION]... \$srcdir/.tarball-version [TAG-NORMALIZATION-SED-SCRIPT]
|
Usage: $me [OPTION]... \$srcdir/.tarball-version [TAG-NORMALIZATION-SED-SCRIPT]
|
||||||
|
|
@ -85,8 +87,9 @@ Print a version string.
|
||||||
|
|
||||||
Options:
|
Options:
|
||||||
|
|
||||||
--prefix prefix of git tags (default 'v')
|
--prefix PREFIX prefix of git tags (default 'v')
|
||||||
--fallback fallback version to use if \"git --version\" fails
|
--fallback VERSION
|
||||||
|
fallback version to use if \"git --version\" fails
|
||||||
|
|
||||||
--help display this help and exit
|
--help display this help and exit
|
||||||
--version output version information and exit
|
--version output version information and exit
|
||||||
|
|
@ -100,8 +103,8 @@ while test $# -gt 0; do
|
||||||
case $1 in
|
case $1 in
|
||||||
--help) echo "$usage"; exit 0;;
|
--help) echo "$usage"; exit 0;;
|
||||||
--version) echo "$version"; exit 0;;
|
--version) echo "$version"; exit 0;;
|
||||||
--prefix) shift; prefix="$1";;
|
--prefix) shift; prefix=${1?};;
|
||||||
--fallback) shift; fallback="$1";;
|
--fallback) shift; fallback=${1?};;
|
||||||
-*)
|
-*)
|
||||||
echo "$0: Unknown option '$1'." >&2
|
echo "$0: Unknown option '$1'." >&2
|
||||||
echo "$0: Try '--help' for more information." >&2
|
echo "$0: Try '--help' for more information." >&2
|
||||||
|
|
@ -140,11 +143,9 @@ then
|
||||||
v=`cat $tarball_version_file` || v=
|
v=`cat $tarball_version_file` || v=
|
||||||
case $v in
|
case $v in
|
||||||
*$nl*) v= ;; # reject multi-line output
|
*$nl*) v= ;; # reject multi-line output
|
||||||
[0-9]*) ;;
|
|
||||||
*) v= ;;
|
|
||||||
esac
|
esac
|
||||||
test "x$v" = x \
|
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
|
fi
|
||||||
|
|
||||||
if test "x$v" != x
|
if test "x$v" != x
|
||||||
|
|
@ -166,9 +167,10 @@ then
|
||||||
# tag or the previous older version that did not?
|
# tag or the previous older version that did not?
|
||||||
# Newer: v6.10-77-g0f8faeb
|
# Newer: v6.10-77-g0f8faeb
|
||||||
# Older: v6.10-g0f8faeb
|
# Older: v6.10-g0f8faeb
|
||||||
case $v in
|
vprefix=`expr "X$v" : 'X\(.*\)-g[^-]*$'` || vprefix=$v
|
||||||
*-*-*) : git describe is okay three part flavor ;;
|
case $vprefix in
|
||||||
*-*)
|
*-*) : git describe is probably okay three part flavor ;;
|
||||||
|
*)
|
||||||
: git describe is older two part flavor
|
: git describe is older two part flavor
|
||||||
# Recreate the number of commits and rewrite such that the
|
# Recreate the number of commits and rewrite such that the
|
||||||
# result is the same as if we were using the newer version
|
# result is the same as if we were using the newer version
|
||||||
|
|
@ -183,9 +185,9 @@ then
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
# Change the first '-' to a '.', so version-comparing tools work properly.
|
# Change the penultimate "-" to ".", for version-comparing tools.
|
||||||
# Remove the "g" in git describe's output string, to save a byte.
|
# Remove the "g" to save a byte.
|
||||||
v=`echo "$v" | sed 's/-/./;s/\(.*\)-g/\1-/'`;
|
v=`echo "$v" | sed 's/-\([^-]*\)-g\([^-]*\)$/.\1-\2/'`;
|
||||||
v_from_git=1
|
v_from_git=1
|
||||||
elif test "x$fallback" = x || git --version >/dev/null 2>&1; then
|
elif test "x$fallback" = x || git --version >/dev/null 2>&1; then
|
||||||
v=UNKNOWN
|
v=UNKNOWN
|
||||||
|
|
@ -199,7 +201,7 @@ v=`echo "$v" |sed "s/^$prefix//"`
|
||||||
# string we're using came from git. I.e., skip the test if it's "UNKNOWN"
|
# string we're using came from git. I.e., skip the test if it's "UNKNOWN"
|
||||||
# or if it came from .tarball-version.
|
# or if it came from .tarball-version.
|
||||||
if test "x$v_from_git" != x; then
|
if test "x$v_from_git" != x; then
|
||||||
# Don't declare a version "dirty" merely because a time stamp has changed.
|
# Don't declare a version "dirty" merely because a timestamp has changed.
|
||||||
git update-index --refresh > /dev/null 2>&1
|
git update-index --refresh > /dev/null 2>&1
|
||||||
|
|
||||||
dirty=`exec 2>/dev/null;git diff-index --name-only HEAD` || dirty=
|
dirty=`exec 2>/dev/null;git diff-index --name-only HEAD` || dirty=
|
||||||
|
|
@ -214,12 +216,12 @@ if test "x$v_from_git" != x; then
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Omit the trailing newline, so that m4_esyscmd can use the result directly.
|
# Omit the trailing newline, so that m4_esyscmd can use the result directly.
|
||||||
echo "$v" | tr -d "$nl"
|
printf %s "$v"
|
||||||
|
|
||||||
# Local variables:
|
# Local variables:
|
||||||
# eval: (add-hook 'write-file-hooks 'time-stamp)
|
# eval: (add-hook 'before-save-hook 'time-stamp)
|
||||||
# time-stamp-start: "scriptversion="
|
# time-stamp-start: "scriptversion="
|
||||||
# time-stamp-format: "%:y-%02m-%02d.%02H"
|
# time-stamp-format: "%:y-%02m-%02d.%02H"
|
||||||
# time-stamp-time-zone: "UTC"
|
# time-stamp-time-zone: "UTC0"
|
||||||
# time-stamp-end: "; # UTC"
|
# time-stamp-end: "; # UTC"
|
||||||
# End:
|
# End:
|
||||||
|
|
|
||||||
|
|
@ -2,11 +2,11 @@
|
||||||
# Process this file with autoconf to produce a configure script.
|
# Process this file with autoconf to produce a configure script.
|
||||||
|
|
||||||
AC_PREREQ([2.69])
|
AC_PREREQ([2.69])
|
||||||
AC_CONFIG_MACRO_DIR([m4])
|
AC_CONFIG_MACRO_DIRS([m4])
|
||||||
AC_INIT([dhcpd-pools],
|
AC_INIT([dhcpd-pools],
|
||||||
[m4_esyscmd([build-aux/git-version-gen .tarball-version])],
|
[m4_esyscmd([build-aux/git-version-gen .tarball-version])],
|
||||||
[kerolasa@iki.fi],[],
|
[kerolasa@iki.fi],[],
|
||||||
[http://dhcpd-pools.sourceforge.net/])
|
[https://dhcpd-pools.sourceforge.net/])
|
||||||
PACKAGE_MAINTAINER="Sami Kerola"
|
PACKAGE_MAINTAINER="Sami Kerola"
|
||||||
AC_SUBST([PACKAGE_MAINTAINER])
|
AC_SUBST([PACKAGE_MAINTAINER])
|
||||||
AC_CONFIG_AUX_DIR([build-aux])
|
AC_CONFIG_AUX_DIR([build-aux])
|
||||||
|
|
|
||||||
|
|
@ -7,7 +7,7 @@ pkgver=0
|
||||||
pkgrel=1
|
pkgrel=1
|
||||||
pkgdesc="ISC dhcpd lease status utility"
|
pkgdesc="ISC dhcpd lease status utility"
|
||||||
arch=('i686' 'x86_64')
|
arch=('i686' 'x86_64')
|
||||||
url=http://dhcpd-pools.sourceforge.net/
|
url=https://dhcpd-pools.sourceforge.net/
|
||||||
license=('BSD')
|
license=('BSD')
|
||||||
depends=('pacman')
|
depends=('pacman')
|
||||||
makedepends=('uthash' 'git')
|
makedepends=('uthash' 'git')
|
||||||
|
|
|
||||||
|
|
@ -23,9 +23,10 @@
|
||||||
# you set $dbg to 1 then output will be generated in /tmp.
|
# you set $dbg to 1 then output will be generated in /tmp.
|
||||||
|
|
||||||
use strict;
|
use strict;
|
||||||
|
use NetSNMP::OID;
|
||||||
|
|
||||||
# Version info:
|
# Version info:
|
||||||
my $SNMPver = "snmp1.0";
|
my $SNMPver = "snmp1.1";
|
||||||
my $DHCPver = "dhcp1.0";
|
my $DHCPver = "dhcp1.0";
|
||||||
my $VERSION = "$SNMPver/$DHCPver";
|
my $VERSION = "$SNMPver/$DHCPver";
|
||||||
#
|
#
|
||||||
|
|
@ -193,7 +194,7 @@ sub ParseDataFile () {
|
||||||
}
|
}
|
||||||
close IN;
|
close IN;
|
||||||
if ($dbg) {
|
if ($dbg) {
|
||||||
foreach (sort @validoidlist) { print DBG "ValidOID: $_\n"; }
|
foreach (sort Oidcmp @validoidlist) { print DBG "ValidOID: $_\n"; }
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($dbg) {
|
if ($dbg) {
|
||||||
|
|
@ -370,7 +371,7 @@ sub GetData ($) {
|
||||||
|
|
||||||
@userquery = split (/\./, $userqueryoid);
|
@userquery = split (/\./, $userqueryoid);
|
||||||
my $found = 0;
|
my $found = 0;
|
||||||
foreach (sort @validoidlist) {
|
foreach (sort Oidcmp @validoidlist) {
|
||||||
$next = $_;
|
$next = $_;
|
||||||
print DBG "Comparing $userqueryoid vs. $_\n" if $dbg;
|
print DBG "Comparing $userqueryoid vs. $_\n" if $dbg;
|
||||||
@validoid = split (/\./, $_);
|
@validoid = split (/\./, $_);
|
||||||
|
|
@ -432,6 +433,12 @@ sub Pong {
|
||||||
$line = 0;
|
$line = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sub Oidcmp {
|
||||||
|
my $oida = new NetSNMP::OID($a);
|
||||||
|
my $oidb = new NetSNMP::OID($b);
|
||||||
|
snmp_oid_compare($oida, $oidb);
|
||||||
|
}
|
||||||
|
|
||||||
################################## START ##################################
|
################################## START ##################################
|
||||||
#
|
#
|
||||||
# Main
|
# 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.h
|
||||||
/alloca.in.h
|
/alloca.in.h
|
||||||
/arg-nonnull.h
|
/arg-nonnull.h
|
||||||
/arpa/inet.h
|
/arpa/
|
||||||
|
/arpa_inet.c
|
||||||
/arpa_inet.in.h
|
/arpa_inet.in.h
|
||||||
|
/assert.in.h
|
||||||
|
/attribute.h
|
||||||
/basename-lgpl.c
|
/basename-lgpl.c
|
||||||
/c++defs.h
|
/basename-lgpl.h
|
||||||
|
/c32is-impl.h
|
||||||
|
/c32isprint.c
|
||||||
|
/calloc.c
|
||||||
/c-ctype.c
|
/c-ctype.c
|
||||||
/c-ctype.h
|
/c-ctype.h
|
||||||
/c-strcase.h
|
/c++defs.h
|
||||||
/c-strcasecmp.c
|
/cdefs.h
|
||||||
/c-strcaseeq.h
|
/cloexec.c
|
||||||
/c-strncasecmp.c
|
/cloexec.h
|
||||||
/charset.alias
|
|
||||||
/close-stream.c
|
|
||||||
/close-stream.h
|
|
||||||
/close.c
|
/close.c
|
||||||
/closeout.c
|
/closeout.c
|
||||||
/closeout.h
|
/closeout.h
|
||||||
/config.charset
|
/close-stream.c
|
||||||
/configmake.h
|
/close-stream.h
|
||||||
/dirname-lgpl.c
|
/c-strcasecmp.c
|
||||||
/dirname.h
|
/c-strcaseeq.h
|
||||||
/dosname.h
|
/c-strcase.h
|
||||||
|
/c-strncasecmp.c
|
||||||
|
/dup2.c
|
||||||
/errno.in.h
|
/errno.in.h
|
||||||
/error.c
|
/error.c
|
||||||
/error.h
|
/error.h
|
||||||
|
/error.in.h
|
||||||
/exitfail.c
|
/exitfail.c
|
||||||
/exitfail.h
|
/exitfail.h
|
||||||
/fclose.c
|
/fclose.c
|
||||||
|
/fcntl.c
|
||||||
/fcntl.h
|
/fcntl.h
|
||||||
/fcntl.in.h
|
/fcntl.in.h
|
||||||
/fd-hook.c
|
/fd-hook.c
|
||||||
|
|
@ -40,8 +43,9 @@
|
||||||
/fflush.c
|
/fflush.c
|
||||||
/filename.h
|
/filename.h
|
||||||
/flexmember.h
|
/flexmember.h
|
||||||
/float+.h
|
|
||||||
/float.c
|
/float.c
|
||||||
|
/float+.h
|
||||||
|
/float.h
|
||||||
/float.in.h
|
/float.in.h
|
||||||
/fopen.c
|
/fopen.c
|
||||||
/fpending.c
|
/fpending.c
|
||||||
|
|
@ -49,126 +53,210 @@
|
||||||
/fpurge.c
|
/fpurge.c
|
||||||
/freading.c
|
/freading.c
|
||||||
/freading.h
|
/freading.h
|
||||||
|
/free.c
|
||||||
/fseek.c
|
/fseek.c
|
||||||
/fseeko.c
|
/fseeko.c
|
||||||
/fstat.c
|
/fstat.c
|
||||||
/ftell.c
|
/ftell.c
|
||||||
/ftello.c
|
/ftello.c
|
||||||
|
/getdtablesize.c
|
||||||
|
/getlocalename_l-unsafe.c
|
||||||
|
/getlocalename_l-unsafe.h
|
||||||
|
/getopt1.c
|
||||||
|
/getopt.c
|
||||||
/getopt-cdefs.in.h
|
/getopt-cdefs.in.h
|
||||||
/getopt-core.h
|
/getopt-core.h
|
||||||
/getopt-ext.h
|
/getopt-ext.h
|
||||||
|
/getopt.in.h
|
||||||
|
/getopt_int.h
|
||||||
/getopt-pfx-core.h
|
/getopt-pfx-core.h
|
||||||
/getopt-pfx-ext.h
|
/getopt-pfx-ext.h
|
||||||
/getopt.c
|
|
||||||
/getopt.in.h
|
|
||||||
/getopt1.c
|
|
||||||
/getopt_int.h
|
|
||||||
/getprogname.c
|
/getprogname.c
|
||||||
/getprogname.h
|
/getprogname.h
|
||||||
/gettext.h
|
/gettext.h
|
||||||
/hard-locale.c
|
/hard-locale.c
|
||||||
/hard-locale.h
|
/hard-locale.h
|
||||||
|
/ialloc.c
|
||||||
|
/ialloc.h
|
||||||
|
/idx.h
|
||||||
/inet_pton.c
|
/inet_pton.c
|
||||||
/intprops.h
|
/intprops.h
|
||||||
|
/intprops-internal.h
|
||||||
|
/inttypes.h
|
||||||
|
/inttypes.in.h
|
||||||
/isnan.c
|
/isnan.c
|
||||||
/isnand.c
|
/isnand.c
|
||||||
/isnanf.c
|
/isnanf.c
|
||||||
/isnanl.c
|
/isnanl.c
|
||||||
/itold.c
|
/itold.c
|
||||||
|
/lc-charset-dispatch.c
|
||||||
|
/lc-charset-dispatch.h
|
||||||
|
/libc-config.h
|
||||||
/libdhcpd_pools.la
|
/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.h
|
||||||
/limits.in.h
|
/limits.in.h
|
||||||
/localcharset.c
|
/localcharset.c
|
||||||
/localcharset.h
|
/localcharset.h
|
||||||
/localtime-buffer.c
|
/locale.h
|
||||||
/localtime-buffer.h
|
/locale.in.h
|
||||||
|
/localename.h
|
||||||
|
/localename-unsafe.c
|
||||||
/lseek.c
|
/lseek.c
|
||||||
/malloc.c
|
/Makefile.am
|
||||||
/malloca.c
|
/malloca.c
|
||||||
/malloca.h
|
/malloca.h
|
||||||
/malloca.valgrind
|
/malloc.c
|
||||||
/math.c
|
/math.c
|
||||||
/math.h
|
/math.h
|
||||||
/math.in.h
|
/math.in.h
|
||||||
|
/mbrtoc32.c
|
||||||
/mbrtowc.c
|
/mbrtowc.c
|
||||||
|
/mbrtowc-impl.h
|
||||||
|
/mbrtowc-impl-utf8.h
|
||||||
/mbsinit.c
|
/mbsinit.c
|
||||||
|
/mbszero.c
|
||||||
|
/mbtowc-lock.c
|
||||||
|
/mbtowc-lock.h
|
||||||
/memchr.c
|
/memchr.c
|
||||||
/memchr.valgrind
|
/memchr.valgrind
|
||||||
/minmax.h
|
/minmax.h
|
||||||
/mktime-internal.h
|
|
||||||
/mktime.c
|
/mktime.c
|
||||||
|
/mktime-internal.h
|
||||||
/msvc-inval.c
|
/msvc-inval.c
|
||||||
/msvc-inval.h
|
/msvc-inval.h
|
||||||
/msvc-nothrow.c
|
/msvc-nothrow.c
|
||||||
/msvc-nothrow.h
|
/msvc-nothrow.h
|
||||||
/netinet_in.in.h
|
/netinet_in.in.h
|
||||||
|
/_Noreturn.h
|
||||||
/nstrftime.c
|
/nstrftime.c
|
||||||
|
/open.c
|
||||||
/pathmax.h
|
/pathmax.h
|
||||||
/progname.c
|
/progname.c
|
||||||
/progname.h
|
/progname.h
|
||||||
/quote.h
|
|
||||||
/quotearg.c
|
/quotearg.c
|
||||||
/quotearg.h
|
/quotearg.h
|
||||||
|
/quote.h
|
||||||
|
/reallocarray.c
|
||||||
/realloc.c
|
/realloc.c
|
||||||
/ref-add.sed
|
|
||||||
/ref-add.sin
|
|
||||||
/ref-del.sed
|
|
||||||
/ref-del.sin
|
|
||||||
/setenv.c
|
/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.c
|
||||||
/stat-w32.h
|
/stat-w32.h
|
||||||
/stat.c
|
/stdckdint.h
|
||||||
/stdalign.in.h
|
/stdckdint.in.h
|
||||||
/stdbool.in.h
|
/stddef.h
|
||||||
/stddef.in.h
|
/stddef.in.h
|
||||||
/stdint.in.h
|
/stdint.in.h
|
||||||
/stdio-impl.h
|
|
||||||
/stdio.h
|
/stdio.h
|
||||||
|
/stdio-impl.h
|
||||||
/stdio.in.h
|
/stdio.in.h
|
||||||
|
/stdio-read.c
|
||||||
|
/stdio-write.c
|
||||||
|
/stdlib.c
|
||||||
/stdlib.h
|
/stdlib.h
|
||||||
/stdlib.in.h
|
/stdlib.in.h
|
||||||
/stpncpy.c
|
/stpncpy.c
|
||||||
/str-two-way.h
|
|
||||||
/strdup.c
|
/strdup.c
|
||||||
/streq.h
|
/streq.h
|
||||||
|
/strerror.c
|
||||||
/strerror-override.c
|
/strerror-override.c
|
||||||
/strerror-override.h
|
/strerror-override.h
|
||||||
/strerror.c
|
/strftime.c
|
||||||
/strftime.h
|
/strftime.h
|
||||||
/string.h
|
/string.h
|
||||||
/string.in.h
|
/string.in.h
|
||||||
/stripslash.c
|
|
||||||
/strstr.c
|
/strstr.c
|
||||||
/strtod.c
|
/strtod.c
|
||||||
/sys/socket.h
|
/str-two-way.h
|
||||||
/sys/stat.h
|
/sys/
|
||||||
/sys/types.h
|
|
||||||
/sys/uio.h
|
|
||||||
/sys_socket.c
|
/sys_socket.c
|
||||||
/sys_socket.in.h
|
/sys_socket.in.h
|
||||||
/sys_stat.in.h
|
/sys_stat.in.h
|
||||||
/sys_types.in.h
|
/sys_types.in.h
|
||||||
/sys_uio.in.h
|
/sys_uio.in.h
|
||||||
/time-internal.h
|
/timegm.c
|
||||||
/time.h
|
/time.h
|
||||||
/time.in.h
|
/time.in.h
|
||||||
|
/time-internal.h
|
||||||
/time_r.c
|
/time_r.c
|
||||||
/time_rz.c
|
/time_rz.c
|
||||||
/timegm.c
|
|
||||||
/tzset.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.c
|
||||||
/unistd.h
|
/unistd.h
|
||||||
/unistd.in.h
|
/unistd.in.h
|
||||||
|
/unitypes.h
|
||||||
|
/unitypes.in.h
|
||||||
/unsetenv.c
|
/unsetenv.c
|
||||||
/unused-parameter.h
|
|
||||||
/verify.h
|
/verify.h
|
||||||
/warn-on-use.h
|
/warn-on-use.h
|
||||||
/wchar.h
|
/wchar.h
|
||||||
/wchar.in.h
|
/wchar.in.h
|
||||||
/wctype-h.c
|
|
||||||
/wctype.h
|
/wctype.h
|
||||||
|
/wctype-h.c
|
||||||
/wctype.in.h
|
/wctype.in.h
|
||||||
|
/windows-initguard.h
|
||||||
/xalloc-die.c
|
/xalloc-die.c
|
||||||
/xalloc-oversized.h
|
|
||||||
/xalloc.h
|
/xalloc.h
|
||||||
|
/xalloc-oversized.h
|
||||||
/xmalloc.c
|
/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
|
.SH NAME
|
||||||
dhcpd-pools \- ISC dhcpd pools usage analysis
|
dhcpd-pools \- ISC dhcpd pools usage analysis
|
||||||
.SH SYNOPSIS
|
.SH SYNOPSIS
|
||||||
|
|
@ -156,7 +157,7 @@ printed.
|
||||||
.TP
|
.TP
|
||||||
\fB\-\-color\fR=\fIwhen\fR
|
\fB\-\-color\fR=\fIwhen\fR
|
||||||
Use yellow for warning, red for critical, green for suppressed by \-\-minsize
|
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
|
does not have any ranges. The
|
||||||
.I when
|
.I when
|
||||||
string can be
|
string can be
|
||||||
|
|
@ -183,7 +184,7 @@ can be one of the following:
|
||||||
.IR minsize ,
|
.IR minsize ,
|
||||||
or
|
or
|
||||||
.IR suppressed .
|
.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
|
.TP
|
||||||
\fB\-\-warning\fR=\fIpercent\fR
|
\fB\-\-warning\fR=\fIpercent\fR
|
||||||
Turn on alarm output format, and specify percentage number which will
|
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:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||||
xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"
|
xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"
|
||||||
xmlns:foaf="http://xmlns.com/foaf/0.1/">
|
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>
|
<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
|
<shortdesc>This is dhcpd-pools ISC dhcp shared network and pool
|
||||||
range usage analysis tool.</shortdesc>
|
range usage analysis tool.</shortdesc>
|
||||||
<description>Purpose of command is to count usage ratio of each
|
<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}}
|
Subnets:{{#subnets}}
|
||||||
location: {{location}}
|
location: {{location}}
|
||||||
range: {{range}}
|
range: {{range}}
|
||||||
|
|
@ -65,3 +68,9 @@ lease_file_epoch_mtime: {{lease_file_epoch_mtime}}
|
||||||
template_file_path: {{template_file_path}}
|
template_file_path: {{template_file_path}}
|
||||||
template_file_local_mtime: {{template_file_local_mtime}}
|
template_file_local_mtime: {{template_file_local_mtime}}
|
||||||
template_file_epoch_mtime: {{template_file_epoch_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.
|
# This mustach template can be used as Prometheus text file.
|
||||||
# https://prometheus.io/
|
# https://prometheus.io/
|
||||||
|
# HELP dhcpd_pools ISC dhcpd statistics
|
||||||
# HELP dhcpd_pools_ranges The range statistics.
|
# TYPE dhcpd_pools gauge
|
||||||
# TYPE dhcpd_pools_ranges gauge
|
{{#subnets}}dhcpd_pools{location="{{location}}",range="{{first_ip}}",used="1"} {{used}} {{gettimeofday}}000
|
||||||
{{#subnets}}dhcpd_pools_ranges{range="{{first_ip}}",used="1"} {{used}} {{gettimeofday}}000
|
dhcpd_pools{location="{{location}}",range="{{first_ip}}",touched="1"} {{touched}} {{gettimeofday}}000
|
||||||
dhcpd_pools_ranges{range="{{first_ip}}",touched="1"} {{touched}} {{gettimeofday}}000
|
dhcpd_pools{location="{{location}}",range="{{first_ip}}",defined="1"} {{defined}} {{gettimeofday}}000
|
||||||
dhcpd_pools_ranges{range="{{first_ip}}",defined="1"} {{defined}} {{gettimeofday}}000
|
dhcpd_pools{location="{{location}}",range="{{first_ip}}",free="1"} {{free}} {{gettimeofday}}000
|
||||||
dhcpd_pools_ranges{range="{{first_ip}}",free="1"} {{free}} {{gettimeofday}}000
|
dhcpd_pools{location="{{location}}",range="{{first_ip}}",touch_count="1"} {{touch_count}} {{gettimeofday}}000
|
||||||
dhcpd_pools_ranges{range="{{first_ip}}",touch_count="1"} {{touch_count}} {{gettimeofday}}000
|
dhcpd_pools{location="{{location}}",range="{{first_ip}}",status="1"} {{status}} {{gettimeofday}}000
|
||||||
dhcpd_pools_ranges{range="{{first_ip}}",status="1"} {{status}} {{gettimeofday}}000
|
|
||||||
{{/subnets}}
|
{{/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:
|
case BACKUP:
|
||||||
range_p->backups++;
|
range_p->backups++;
|
||||||
break;
|
break;
|
||||||
|
default:
|
||||||
|
abort();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/* Size of range size. */
|
/* Size of range size. */
|
||||||
|
|
|
||||||
|
|
@ -89,14 +89,14 @@ static void prepare_memory(struct conf_t *state)
|
||||||
}
|
}
|
||||||
|
|
||||||
/*! \brief The --skip option argument parser. */
|
/*! \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 {
|
enum {
|
||||||
OPT_ARG_OK = 0,
|
OPT_ARG_OK = 0,
|
||||||
OPT_ARG_WARNING,
|
OPT_ARG_WARNING,
|
||||||
OPT_ARG_CRITICAL,
|
OPT_ARG_CRITICAL,
|
||||||
OPT_ARG_MINSIZE,
|
OPT_ARG_MINSIZE,
|
||||||
OPT_ARG_SUPRESSED
|
OPT_ARG_SUPPRESSED
|
||||||
};
|
};
|
||||||
|
|
||||||
char *const tokens[] = {
|
char *const tokens[] = {
|
||||||
|
|
@ -104,13 +104,13 @@ static void skip_arg_parse(struct conf_t *state, char *optarg)
|
||||||
[OPT_ARG_WARNING] = "warning",
|
[OPT_ARG_WARNING] = "warning",
|
||||||
[OPT_ARG_CRITICAL] = "critical",
|
[OPT_ARG_CRITICAL] = "critical",
|
||||||
[OPT_ARG_MINSIZE] = "minsize",
|
[OPT_ARG_MINSIZE] = "minsize",
|
||||||
[OPT_ARG_SUPRESSED] = "suppressed",
|
[OPT_ARG_SUPPRESSED] = "suppressed",
|
||||||
NULL
|
NULL
|
||||||
};
|
};
|
||||||
char *value;
|
char *value;
|
||||||
|
|
||||||
while (*optarg != '\0') {
|
while (*arg != '\0') {
|
||||||
switch (getsubopt(&optarg, tokens, &value)) {
|
switch (getsubopt(&arg, tokens, &value)) {
|
||||||
case OPT_ARG_OK:
|
case OPT_ARG_OK:
|
||||||
state->skip_ok = 1;
|
state->skip_ok = 1;
|
||||||
break;
|
break;
|
||||||
|
|
@ -123,7 +123,7 @@ static void skip_arg_parse(struct conf_t *state, char *optarg)
|
||||||
case OPT_ARG_MINSIZE:
|
case OPT_ARG_MINSIZE:
|
||||||
state->skip_minsize = 1;
|
state->skip_minsize = 1;
|
||||||
break;
|
break;
|
||||||
case OPT_ARG_SUPRESSED:
|
case OPT_ARG_SUPPRESSED:
|
||||||
state->skip_suppressed = 1;
|
state->skip_suppressed = 1;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
|
@ -133,7 +133,7 @@ static void skip_arg_parse(struct conf_t *state, char *optarg)
|
||||||
}
|
}
|
||||||
|
|
||||||
/*! \brief Command line options parser. */
|
/*! \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 {
|
enum {
|
||||||
OPT_SNET_ALARMS = CHAR_MAX + 1,
|
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},
|
{"ip-version", required_argument, NULL, OPT_SET_IPV},
|
||||||
{NULL, 0, NULL, 0}
|
{NULL, 0, NULL, 0}
|
||||||
};
|
};
|
||||||
char output_format = '\0';
|
|
||||||
int alarming = 0;
|
int alarming = 0;
|
||||||
|
|
||||||
while (1) {
|
while (1) {
|
||||||
|
|
@ -192,17 +191,17 @@ static char parse_command_line_opts(struct conf_t *state, int argc, char **argv)
|
||||||
break;
|
break;
|
||||||
case 'f':
|
case 'f':
|
||||||
/* Output format */
|
/* Output format */
|
||||||
output_format = optarg[0];
|
state->output_format = optarg[0];
|
||||||
break;
|
break;
|
||||||
case 's':
|
case 's':
|
||||||
{
|
{
|
||||||
/* Output sorting option */
|
/* Output sorting option */
|
||||||
struct output_sort *p = state->sorts;
|
struct output_sort *p = state->sorts;
|
||||||
size_t len;
|
char *ptr = optarg;
|
||||||
|
|
||||||
while (p && p->next)
|
while (p && p->next)
|
||||||
p = p->next;
|
p = p->next;
|
||||||
for (len = 0; len < strlen(optarg); len++) {
|
while (*ptr) {
|
||||||
if (state->sorts == NULL) {
|
if (state->sorts == NULL) {
|
||||||
state->sorts =
|
state->sorts =
|
||||||
xcalloc(1, sizeof(struct output_sort));
|
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->next = xcalloc(1, sizeof(struct output_sort));
|
||||||
p = p->next;
|
p = p->next;
|
||||||
}
|
}
|
||||||
p->func = field_selector(optarg[len]);
|
p->func = field_selector(*ptr++);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
@ -231,7 +230,8 @@ static char parse_command_line_opts(struct conf_t *state, int argc, char **argv)
|
||||||
case OPT_MUSTACH:
|
case OPT_MUSTACH:
|
||||||
#ifdef BUILD_MUSTACH
|
#ifdef BUILD_MUSTACH
|
||||||
state->mustach_template = optarg;
|
state->mustach_template = optarg;
|
||||||
output_format = 'm';
|
state->output_format = 'm';
|
||||||
|
state->print_mac_addreses = 1;
|
||||||
#else
|
#else
|
||||||
error(EXIT_FAILURE, 0, "compiled without mustach support");
|
error(EXIT_FAILURE, 0, "compiled without mustach support");
|
||||||
#endif
|
#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
|
/* Output format is not defined, if alarm thresholds are then it's alarming, else use the
|
||||||
* default. */
|
* default. */
|
||||||
if (output_format == '\0') {
|
if (state->output_format == '\0') {
|
||||||
if (alarming == 1)
|
if (alarming == 1)
|
||||||
output_format = 'a';
|
state->output_format = 'a';
|
||||||
else {
|
else {
|
||||||
const char *const default_format = OUTPUT_FORMAT;
|
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
|
/*!\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 */
|
.warn_count = 0x100000000, /* == 2^32 that is the entire IPv4 space */
|
||||||
.crit_count = 0x100000000, /* basically turns off the count criteria */
|
.crit_count = 0x100000000, /* basically turns off the count criteria */
|
||||||
.header_limit = 8,
|
.header_limit = 8,
|
||||||
.color_mode = color_auto,
|
|
||||||
.ranges_size = 64,
|
.ranges_size = 64,
|
||||||
.ip_version = IPvUNKNOWN,
|
.ip_version = IPvUNKNOWN,
|
||||||
0
|
.color_mode = color_auto
|
||||||
};
|
};
|
||||||
char output_format;
|
|
||||||
int ret_val;
|
int ret_val;
|
||||||
|
|
||||||
atexit(close_stdout);
|
atexit(close_stdout);
|
||||||
set_program_name(argv[0]);
|
set_program_name(argv[0]);
|
||||||
prepare_memory(&state);
|
prepare_memory(&state);
|
||||||
set_ipv_functions(&state, IPvUNKNOWN);
|
set_ipv_functions(&state, IPvUNKNOWN);
|
||||||
output_format = parse_command_line_opts(&state, argc, argv);
|
parse_command_line_opts(&state, argc, argv);
|
||||||
|
|
||||||
/* Do the job */
|
/* Do the job */
|
||||||
parse_config(&state, 1, state.dhcpdconf_file, state.shared_net_root);
|
parse_config(&state, 1, state.dhcpdconf_file, state.shared_net_root);
|
||||||
if (output_format == 'X' || output_format == 'J')
|
parse_leases(&state);
|
||||||
parse_leases(&state, 1);
|
|
||||||
else
|
|
||||||
parse_leases(&state, 0);
|
|
||||||
prepare_data(&state);
|
prepare_data(&state);
|
||||||
do_counting(&state);
|
do_counting(&state);
|
||||||
if (state.sorts != NULL)
|
if (state.sorts != NULL)
|
||||||
mergesort_ranges(&state, state.ranges, state.num_ranges, NULL, 1);
|
mergesort_ranges(&state, state.ranges, state.num_ranges, NULL, 1);
|
||||||
if (state.reverse_order == 1)
|
if (state.reverse_order == 1)
|
||||||
flip_ranges(&state);
|
flip_ranges(&state);
|
||||||
ret_val = output_analysis(&state, output_format);
|
ret_val = output_analysis(&state);
|
||||||
clean_up(&state);
|
clean_up(&state);
|
||||||
return (ret_val);
|
return (ret_val);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -102,6 +102,9 @@ enum prefix_t {
|
||||||
PREFIX_BINDING_STATE_ACTIVE,
|
PREFIX_BINDING_STATE_ACTIVE,
|
||||||
PREFIX_BINDING_STATE_BACKUP,
|
PREFIX_BINDING_STATE_BACKUP,
|
||||||
PREFIX_HARDWARE_ETHERNET,
|
PREFIX_HARDWARE_ETHERNET,
|
||||||
|
PREFIX_STARTS,
|
||||||
|
PREFIX_ENDS,
|
||||||
|
PREFIX_HOSTNAME,
|
||||||
NUM_OF_PREFIX
|
NUM_OF_PREFIX
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
@ -125,8 +128,8 @@ struct shared_network_t {
|
||||||
double used;
|
double used;
|
||||||
double touched;
|
double touched;
|
||||||
double backups;
|
double backups;
|
||||||
int netmask;
|
|
||||||
struct shared_network_t *next;
|
struct shared_network_t *next;
|
||||||
|
int netmask;
|
||||||
};
|
};
|
||||||
|
|
||||||
/*! \struct range_t
|
/*! \struct range_t
|
||||||
|
|
@ -145,12 +148,22 @@ struct range_t {
|
||||||
* \brief Various per range and shared net temporary calculation results.
|
* \brief Various per range and shared net temporary calculation results.
|
||||||
*/
|
*/
|
||||||
struct output_helper_t {
|
struct output_helper_t {
|
||||||
int status;
|
|
||||||
double range_size;
|
double range_size;
|
||||||
double percent;
|
double percent;
|
||||||
double tc;
|
double tc;
|
||||||
double tcp;
|
double tcp;
|
||||||
double bup;
|
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
|
/*! \enum ltype
|
||||||
|
|
@ -167,9 +180,12 @@ enum ltype {
|
||||||
*/
|
*/
|
||||||
struct leases_t {
|
struct leases_t {
|
||||||
union ipaddr_t ip; /* ip as key */
|
union ipaddr_t ip; /* ip as key */
|
||||||
enum ltype type;
|
|
||||||
char *ethernet;
|
char *ethernet;
|
||||||
UT_hash_handle hh;
|
UT_hash_handle hh;
|
||||||
|
enum ltype type;
|
||||||
|
char *ends;
|
||||||
|
char *starts;
|
||||||
|
char *hostname;
|
||||||
};
|
};
|
||||||
|
|
||||||
/*! \enum limbits
|
/*! \enum limbits
|
||||||
|
|
@ -209,12 +225,11 @@ struct conf_t {
|
||||||
struct shared_network_t *shared_net_head; /*!< Last entry in shared network linked list. */
|
struct shared_network_t *shared_net_head; /*!< Last entry in shared network linked list. */
|
||||||
struct range_t *ranges; /*!< Array of ranges. */
|
struct range_t *ranges; /*!< Array of ranges. */
|
||||||
unsigned int num_ranges; /*!< Number of ranges in the ranges array. */
|
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. */
|
size_t ranges_size; /*!< Size of the ranges array. */
|
||||||
struct leases_t *leases; /*!< An array of individual leases from dhcpd.leases file. */
|
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 *dhcpdconf_file; /*!< Path to dhcpd.conf file. */
|
||||||
const char *dhcpdlease_file; /*!< Path to dhcpd.leases 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. */
|
struct output_sort *sorts; /*!< Linked list how to sort ranges. */
|
||||||
const char *output_file; /*!< Output file path. */
|
const char *output_file; /*!< Output file path. */
|
||||||
const char *mustach_template; /*!< Mustach template 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 warn_count; /*!< Maximum number of free IP's before warning. */
|
||||||
double crit_count; /*!< Maximum number of free IP's before critical. */
|
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. */
|
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. */
|
reverse_order:1, /*!< Reverse sort order. */
|
||||||
backups_found:1, /*!< Indicator if dhcpd.leases file has leases in backup state. */
|
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. */
|
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);
|
extern void do_counting(struct conf_t *state);
|
||||||
|
|
||||||
/* getdata.c */
|
/* 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,
|
extern void parse_config(struct conf_t *state, const int is_include,
|
||||||
const char *restrict config_file,
|
const char *restrict config_file,
|
||||||
struct shared_network_t *restrict shared_p);
|
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 flip_ranges(struct conf_t *state);
|
||||||
extern void clean_up(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 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 double strtod_or_err(const char *restrict str, const char *restrict errmesg);
|
||||||
extern void __attribute__ ((noreturn)) print_version(void);
|
extern void __attribute__ ((noreturn)) print_version(void);
|
||||||
extern void __attribute__ ((noreturn)) usage(int status);
|
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);
|
struct range_t *range_p);
|
||||||
extern int shnet_output_helper(struct conf_t *state, struct output_helper_t *oh,
|
extern int shnet_output_helper(struct conf_t *state, struct output_helper_t *oh,
|
||||||
struct shared_network_t *shared_p);
|
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 */
|
/* sort.c */
|
||||||
extern void mergesort_ranges(struct conf_t *state,
|
extern void mergesort_ranges(struct conf_t *state,
|
||||||
|
|
|
||||||
|
|
@ -43,6 +43,7 @@
|
||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
|
#include <limits.h>
|
||||||
#include <netinet/in.h>
|
#include <netinet/in.h>
|
||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
|
@ -79,12 +80,11 @@ enum isc_conf_parser {
|
||||||
|
|
||||||
/*! \brief Lease file parser. The parser can only read ISC DHCPD
|
/*! \brief Lease file parser. The parser can only read ISC DHCPD
|
||||||
* dhcpd.leases file format. */
|
* dhcpd.leases file format. */
|
||||||
int parse_leases(struct conf_t *state, const int print_mac_addreses)
|
int parse_leases(struct conf_t *state)
|
||||||
{
|
{
|
||||||
FILE *dhcpd_leases;
|
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;
|
union ipaddr_t addr;
|
||||||
struct stat lease_file_stats;
|
|
||||||
struct leases_t *lease;
|
struct leases_t *lease;
|
||||||
|
|
||||||
dhcpd_leases = fopen(state->dhcpdlease_file, "r");
|
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);
|
error(EXIT_FAILURE, errno, "parse_leases: fadvise %s", state->dhcpdlease_file);
|
||||||
# endif /* POSIX_FADV_SEQUENTIAL */
|
# endif /* POSIX_FADV_SEQUENTIAL */
|
||||||
#endif /* HAVE_POSIX_FADVISE */
|
#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 = xmalloc(sizeof(char) * MAXLEN);
|
||||||
line[0] = '\0';
|
line[0] = '\0';
|
||||||
ipstring = xmalloc(sizeof(char) * MAXLEN);
|
ipstring = xmalloc(sizeof(char) * MAXLEN);
|
||||||
ipstring[0] = '\0';
|
ipstring[0] = '\0';
|
||||||
|
endsstr[0] = '\0';
|
||||||
|
startsstr[0] = '\0';
|
||||||
|
hostnamestr[0] = '\0';
|
||||||
while (!feof(dhcpd_leases)) {
|
while (!feof(dhcpd_leases)) {
|
||||||
if (!fgets(line, MAXLEN, dhcpd_leases) && ferror(dhcpd_leases))
|
if (!fgets(line, MAXLEN, dhcpd_leases) && ferror(dhcpd_leases))
|
||||||
error(EXIT_FAILURE, errno, "parse_leases: %s", state->dhcpdlease_file);
|
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;
|
state->backups_found = 1;
|
||||||
break;
|
break;
|
||||||
case PREFIX_HARDWARE_ETHERNET:
|
case PREFIX_HARDWARE_ETHERNET:
|
||||||
if (print_mac_addreses == 0)
|
if (state->print_mac_addreses == 0)
|
||||||
break;
|
break;
|
||||||
memcpy(macstring, line + 20, 17);
|
memcpy(macstring, line + 20, 17);
|
||||||
macstring[17] = '\0';
|
macstring[17] = '\0';
|
||||||
if ((lease = find_lease(state, &addr)) != NULL)
|
if ((lease = find_lease(state, &addr)) != NULL) {
|
||||||
lease->ethernet = xstrdup(macstring);
|
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;
|
break;
|
||||||
default:
|
default:
|
||||||
/* do nothing */ ;
|
/* 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;
|
shared_p->name = state->shared_net_root->name;
|
||||||
/* Open configuration file */
|
/* Open configuration file */
|
||||||
dhcpd_config = fopen(config_file, "r");
|
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);
|
error(EXIT_FAILURE, errno, "parse_config: %s", config_file);
|
||||||
|
}
|
||||||
#ifdef HAVE_POSIX_FADVISE
|
#ifdef HAVE_POSIX_FADVISE
|
||||||
# ifdef POSIX_FADV_SEQUENTIAL
|
# ifdef POSIX_FADV_SEQUENTIAL
|
||||||
if (posix_fadvise(fileno(dhcpd_config), 0, 0, POSIX_FADV_SEQUENTIAL) != 0)
|
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 */
|
#endif /* HAVE_POSIX_FADVISE */
|
||||||
/* Very hairy stuff begins. */
|
/* Very hairy stuff begins. */
|
||||||
while (unlikely(!feof(dhcpd_config))) {
|
while (unlikely(!feof(dhcpd_config))) {
|
||||||
char c;
|
int c;
|
||||||
|
|
||||||
c = fgetc(dhcpd_config);
|
c = fgetc(dhcpd_config);
|
||||||
|
if (CHAR_MAX < c)
|
||||||
|
continue;
|
||||||
/* Certain characters are magical */
|
/* Certain characters are magical */
|
||||||
switch (c) {
|
switch (c) {
|
||||||
/* Handle comments if they are not quoted */
|
/* 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. */
|
/* Save to word which clause this is. */
|
||||||
if ((newclause == 1 || argument != ITS_NOTHING_INTERESTING)
|
if ((newclause == 1 || argument != ITS_NOTHING_INTERESTING)
|
||||||
&& (!isspace(c) || 0 < quote)) {
|
&& (!isspace(c) || 0 < quote)) {
|
||||||
word[i] = c;
|
word[i] = (char) c;
|
||||||
i++;
|
i++;
|
||||||
/* Long word which is almost causing overflow. None
|
/* Long word which is almost causing overflow. None
|
||||||
* of words are this long which the program is
|
* 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;
|
newclause = 1;
|
||||||
break;
|
break;
|
||||||
case ITS_A_RANGE_FIRST_IP:
|
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;
|
range_p = state->ranges + state->num_ranges;
|
||||||
if (!(parse_ipaddr(state, word, &addr)))
|
if (!(parse_ipaddr(state, word, &addr)))
|
||||||
/* word was not ip, try again */
|
/* 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;
|
l->type = type;
|
||||||
HASH_ADD_INT(state->leases, ip.v4, l);
|
HASH_ADD_INT(state->leases, ip.v4, l);
|
||||||
l->ethernet = NULL;
|
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)
|
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;
|
l->type = type;
|
||||||
HASH_ADD_V6(state->leases, ip.v6, l);
|
HASH_ADD_V6(state->leases, ip.v6, l);
|
||||||
l->ethernet = NULL;
|
l->ethernet = NULL;
|
||||||
|
l->ends = NULL;
|
||||||
|
l->starts = NULL;
|
||||||
|
l->hostname = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*! \brief Find pointer to lease from hash array.
|
/*! \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)
|
void delete_lease(struct conf_t *state, struct leases_t *lease)
|
||||||
{
|
{
|
||||||
free(lease->ethernet);
|
free(lease->ethernet);
|
||||||
|
free(lease->ends);
|
||||||
|
free(lease->starts);
|
||||||
|
free(lease->hostname);
|
||||||
HASH_DEL(state->leases, lease);
|
HASH_DEL(state->leases, lease);
|
||||||
free(lease);
|
free(lease);
|
||||||
}
|
}
|
||||||
|
|
@ -122,6 +131,9 @@ void delete_all_leases(struct conf_t *state)
|
||||||
|
|
||||||
HASH_ITER(hh, state->leases, l, tmp) {
|
HASH_ITER(hh, state->leases, l, tmp) {
|
||||||
free(l->ethernet);
|
free(l->ethernet);
|
||||||
|
free(l->ends);
|
||||||
|
free(l->starts);
|
||||||
|
free(l->hostname);
|
||||||
HASH_DEL(state->leases, l);
|
HASH_DEL(state->leases, l);
|
||||||
free(l);
|
free(l);
|
||||||
}
|
}
|
||||||
|
|
@ -134,6 +146,9 @@ void delete_all_leases(struct conf_t *state)
|
||||||
|
|
||||||
l = state->leases;
|
l = state->leases;
|
||||||
free(l->ethernet);
|
free(l->ethernet);
|
||||||
|
free(l->ends);
|
||||||
|
free(l->starts);
|
||||||
|
free(l->hostname);
|
||||||
HASH_DEL(state->leases, l); /* leases advances to next on delete */
|
HASH_DEL(state->leases, l); /* leases advances to next on delete */
|
||||||
free(l);
|
free(l);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -58,10 +58,12 @@
|
||||||
*/
|
*/
|
||||||
struct expl {
|
struct expl {
|
||||||
struct conf_t *state;
|
struct conf_t *state;
|
||||||
|
struct leases_t *lease_p;
|
||||||
struct range_t *range_p;
|
struct range_t *range_p;
|
||||||
struct shared_network_t *shnet_p;
|
struct shared_network_t *shnet_p;
|
||||||
struct output_helper_t oh;
|
struct output_helper_t oh;
|
||||||
int current;
|
int current;
|
||||||
|
uint32_t pad;
|
||||||
};
|
};
|
||||||
|
|
||||||
static int must_enter(void *closure, const char *name);
|
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);
|
fprintf(file, "%u", e->state->num_ranges);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
if (!strcmp(name, "number_of_ranges_warning")) {
|
||||||
|
struct status_counts_t stat = { 0 };
|
||||||
|
|
||||||
|
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")) {
|
if (!strcmp(name, "number_of_shared_networks")) {
|
||||||
static uint32_t num = 0xffffffff;
|
uint32_t num = 0;
|
||||||
|
struct shared_network_t *shared_p;
|
||||||
|
|
||||||
if (num == 0xffffffff) {
|
for (shared_p = e->state->shared_net_root->next; shared_p;
|
||||||
/* Use of static num ensures this is done only once. */
|
shared_p = shared_p->next) {
|
||||||
struct shared_network_t *shared_p;
|
num++;
|
||||||
|
|
||||||
num = 0;
|
|
||||||
for (shared_p = e->state->shared_net_root->next; shared_p;
|
|
||||||
shared_p = shared_p->next)
|
|
||||||
num++;
|
|
||||||
}
|
}
|
||||||
fprintf(file, "%u", num);
|
fprintf(file, "%u", num);
|
||||||
return 0;
|
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")) {
|
if (!strcmp(name, "version")) {
|
||||||
fprintf(file, "%s", PACKAGE_VERSION);
|
fprintf(file, "%s", PACKAGE_VERSION);
|
||||||
return 0;
|
return 0;
|
||||||
|
|
@ -153,6 +179,36 @@ static struct mustach_itf itf = {
|
||||||
.leave = must_leave
|
.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. */
|
/*! \brief Mustach range aka {{#subnets}} tag parser and printer. */
|
||||||
static int must_put_range(void *closure, const char *name, int escape
|
static int must_put_range(void *closure, const char *name, int escape
|
||||||
__attribute__ ((unused)), FILE *file)
|
__attribute__ ((unused)), FILE *file)
|
||||||
|
|
@ -334,6 +390,13 @@ static int must_enter(void *closure, const char *name)
|
||||||
{
|
{
|
||||||
struct expl *e = closure;
|
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")) {
|
if (!strcmp(name, "subnets")) {
|
||||||
itf.put = must_put_range;
|
itf.put = must_put_range;
|
||||||
itf.next = must_next_range;
|
itf.next = must_next_range;
|
||||||
|
|
@ -362,7 +425,7 @@ static int must_enter(void *closure, const char *name)
|
||||||
return 1;
|
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)
|
static int must_leave(void *closure)
|
||||||
{
|
{
|
||||||
struct expl *e = closure;
|
struct expl *e = closure;
|
||||||
|
|
@ -440,7 +503,7 @@ int mustach_dhcpd_pools(struct conf_t *state)
|
||||||
case MUSTACH_ERROR_BAD_SEPARATORS:
|
case MUSTACH_ERROR_BAD_SEPARATORS:
|
||||||
error(EXIT_FAILURE, 0, "mustach_dhcpd_pools: fmustach: bad separator");
|
error(EXIT_FAILURE, 0, "mustach_dhcpd_pools: fmustach: bad separator");
|
||||||
break;
|
break;
|
||||||
case MUSTACH_ERROR_TOO_DEPTH:
|
case MUSTACH_ERROR_TOO_DEEP:
|
||||||
error(EXIT_FAILURE, 0, "mustach_dhcpd_pools: fmustach: too deep");
|
error(EXIT_FAILURE, 0, "mustach_dhcpd_pools: fmustach: too deep");
|
||||||
break;
|
break;
|
||||||
case MUSTACH_ERROR_CLOSING:
|
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 not use this file except in compliance with the License.
|
||||||
You may obtain a copy of the License at
|
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
|
Unless required by applicable law or agreed to in writing, software
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
|
@ -19,6 +19,8 @@
|
||||||
|
|
||||||
#define _GNU_SOURCE
|
#define _GNU_SOURCE
|
||||||
|
|
||||||
|
#include "config.h"
|
||||||
|
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
@ -30,6 +32,76 @@
|
||||||
#define NAME_LENGTH_MAX 1024
|
#define NAME_LENGTH_MAX 1024
|
||||||
#define DEPTH_MAX 256
|
#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)
|
static int getpartial(struct mustach_itf *itf, void *closure, const char *name, char **result)
|
||||||
{
|
{
|
||||||
int rc;
|
int rc;
|
||||||
|
|
@ -37,26 +109,22 @@ static int getpartial(struct mustach_itf *itf, void *closure, const char *name,
|
||||||
size_t size;
|
size_t size;
|
||||||
|
|
||||||
*result = NULL;
|
*result = NULL;
|
||||||
file = open_memstream(result, &size);
|
file = memfile_open(result, &size);
|
||||||
if (file == NULL)
|
if (file == NULL)
|
||||||
rc = MUSTACH_ERROR_SYSTEM;
|
rc = MUSTACH_ERROR_SYSTEM;
|
||||||
else {
|
else {
|
||||||
rc = itf->put(closure, name, 0, file);
|
rc = itf->put(closure, name, 0, file);
|
||||||
if (rc == 0)
|
if (rc < 0)
|
||||||
/* adds terminating null */
|
memfile_abort(file, result, &size);
|
||||||
rc = fputc(0, file) ? MUSTACH_ERROR_SYSTEM : 0;
|
else
|
||||||
fclose(file);
|
rc = memfile_close(file, result, &size);
|
||||||
if (rc < 0) {
|
|
||||||
free(*result);
|
|
||||||
*result = NULL;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int process(const char *template, struct mustach_itf *itf, void *closure, FILE *file, const char *opstr, const char *clstr)
|
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;
|
const char *beg, *term;
|
||||||
struct { const char *name, *again; size_t length; int emit, entered; } stack[DEPTH_MAX];
|
struct { const char *name, *again; size_t length; int emit, entered; } stack[DEPTH_MAX];
|
||||||
size_t oplen, cllen, len, l;
|
size_t oplen, cllen, len, l;
|
||||||
|
|
@ -112,8 +180,10 @@ static int process(const char *template, struct mustach_itf *itf, void *closure,
|
||||||
default:
|
default:
|
||||||
while (len && isspace(beg[0])) { beg++; len--; }
|
while (len && isspace(beg[0])) { beg++; len--; }
|
||||||
while (len && isspace(beg[len-1])) len--;
|
while (len && isspace(beg[len-1])) len--;
|
||||||
|
#if defined(NO_EXTENSION_FOR_MUSTACH) || defined(NO_ALLOW_EMPTY_TAG)
|
||||||
if (len == 0)
|
if (len == 0)
|
||||||
return MUSTACH_ERROR_EMPTY_TAG;
|
return MUSTACH_ERROR_EMPTY_TAG;
|
||||||
|
#endif
|
||||||
if (len > NAME_LENGTH_MAX)
|
if (len > NAME_LENGTH_MAX)
|
||||||
return MUSTACH_ERROR_TAG_TOO_LONG;
|
return MUSTACH_ERROR_TAG_TOO_LONG;
|
||||||
memcpy(name, beg, len);
|
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++);
|
for (l = 0; l < len && !isspace(beg[l]) ; l++);
|
||||||
if (l == len)
|
if (l == len)
|
||||||
return MUSTACH_ERROR_BAD_SEPARATORS;
|
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++;
|
while (l < len && isspace(beg[l])) l++;
|
||||||
if (l == len)
|
if (l == len)
|
||||||
return MUSTACH_ERROR_BAD_SEPARATORS;
|
return MUSTACH_ERROR_BAD_SEPARATORS;
|
||||||
clstr = strndupa(beg + l, len - l);
|
cllen = len - l;
|
||||||
oplen = strlen(opstr);
|
tmp = alloca(cllen + 1);
|
||||||
cllen = strlen(clstr);
|
memcpy(tmp, beg + l, cllen);
|
||||||
|
tmp[cllen] = 0;
|
||||||
|
clstr = tmp;
|
||||||
break;
|
break;
|
||||||
case '^':
|
case '^':
|
||||||
case '#':
|
case '#':
|
||||||
/* begin section */
|
/* begin section */
|
||||||
if (depth == DEPTH_MAX)
|
if (depth == DEPTH_MAX)
|
||||||
return MUSTACH_ERROR_TOO_DEPTH;
|
return MUSTACH_ERROR_TOO_DEEP;
|
||||||
rc = emit;
|
rc = emit;
|
||||||
if (rc) {
|
if (rc) {
|
||||||
rc = itf->enter(closure, name);
|
rc = itf->enter(closure, name);
|
||||||
|
|
@ -234,24 +310,15 @@ int mustach(const char *template, struct mustach_itf *itf, void *closure, char *
|
||||||
*result = NULL;
|
*result = NULL;
|
||||||
if (size == NULL)
|
if (size == NULL)
|
||||||
size = &s;
|
size = &s;
|
||||||
file = open_memstream(result, size);
|
file = memfile_open(result, size);
|
||||||
if (file == NULL) {
|
if (file == NULL)
|
||||||
rc = MUSTACH_ERROR_SYSTEM;
|
rc = MUSTACH_ERROR_SYSTEM;
|
||||||
errno = ENOMEM;
|
else {
|
||||||
} else {
|
|
||||||
rc = fmustach(template, itf, closure, file);
|
rc = fmustach(template, itf, closure, file);
|
||||||
if (rc == 0)
|
if (rc < 0)
|
||||||
/* adds terminating null */
|
memfile_abort(file, result, size);
|
||||||
rc = fputc(0, file) ? MUSTACH_ERROR_SYSTEM : 0;
|
else
|
||||||
fclose(file);
|
rc = memfile_close(file, result, size);
|
||||||
if (rc >= 0)
|
|
||||||
/* removes terminating null of the length */
|
|
||||||
(*size)--;
|
|
||||||
else {
|
|
||||||
free(*result);
|
|
||||||
*result = NULL;
|
|
||||||
*size = 0;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -8,7 +8,7 @@
|
||||||
you may not use this file except in compliance with the License.
|
you may not use this file except in compliance with the License.
|
||||||
You may obtain a copy of the License at
|
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
|
Unless required by applicable law or agreed to in writing, software
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
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.
|
* 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: Starts the mustach processing of the closure
|
||||||
* 'start' is optional (can be NULL)
|
* 'start' is optional (can be NULL)
|
||||||
*
|
*
|
||||||
* @put: Writes the value of 'name' to 'file' with 'escape' or not
|
* @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.
|
* @enter: Enters the section of 'name' if possible.
|
||||||
* Musts return 1 if entered or 0 if not entered.
|
* 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_EMPTY_TAG -3
|
||||||
#define MUSTACH_ERROR_TAG_TOO_LONG -4
|
#define MUSTACH_ERROR_TAG_TOO_LONG -4
|
||||||
#define MUSTACH_ERROR_BAD_SEPARATORS -5
|
#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_CLOSING -7
|
||||||
#define MUSTACH_ERROR_BAD_UNESCAPE_TAG -8
|
#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'.
|
* fmustach - Renders the mustache 'template' in 'file' for 'itf' and 'closure'.
|
||||||
*
|
*
|
||||||
|
|
|
||||||
56
src/other.c
56
src/other.c
|
|
@ -58,7 +58,7 @@
|
||||||
|
|
||||||
#include "dhcpd-pools.h"
|
#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_v4(union ipaddr_t *restrict addr, const int mask);
|
||||||
static char *cidr_last_v6(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)
|
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;
|
struct in_addr addr;
|
||||||
|
|
||||||
addr.s_addr = htonl(ip->v4);
|
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)
|
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;
|
struct in6_addr addr;
|
||||||
|
|
||||||
memcpy(addr.s6_addr, ip->v6, sizeof(addr.s6_addr));
|
memcpy(addr.s6_addr, ip->v6, sizeof(addr.s6_addr));
|
||||||
|
|
@ -411,10 +411,18 @@ int
|
||||||
if (!memcmp(" hardware ethernet", str, 19))
|
if (!memcmp(" hardware ethernet", str, 19))
|
||||||
return PREFIX_HARDWARE_ETHERNET;
|
return PREFIX_HARDWARE_ETHERNET;
|
||||||
break;
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!memcmp("lease ", str, 6))
|
if (!memcmp("lease ", str, 6))
|
||||||
return PREFIX_LEASE;
|
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;
|
return NUM_OF_PREFIX;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -464,10 +472,18 @@ int
|
||||||
if (!memcmp(" hardware ethernet", str, 19))
|
if (!memcmp(" hardware ethernet", str, 19))
|
||||||
return PREFIX_HARDWARE_ETHERNET;
|
return PREFIX_HARDWARE_ETHERNET;
|
||||||
break;
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!memcmp(" iaaddr ", str, 9))
|
if (!memcmp(" iaaddr ", str, 9))
|
||||||
return PREFIX_LEASE;
|
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;
|
return NUM_OF_PREFIX;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -476,13 +492,13 @@ int
|
||||||
* \param Color mode string.
|
* \param Color mode string.
|
||||||
* \return color mode enum.
|
* \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;
|
return color_on;
|
||||||
if (!strcmp(optarg, "auto"))
|
if (!strcmp(arg, "auto"))
|
||||||
return color_auto;
|
return color_auto;
|
||||||
if (!strcmp(optarg, "never"))
|
if (!strcmp(arg, "never"))
|
||||||
return color_off;
|
return color_off;
|
||||||
return color_unknown;
|
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. */
|
/*! \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;
|
struct stat st;
|
||||||
|
|
||||||
/* a file or now */
|
|
||||||
if (path) {
|
|
||||||
struct stat st;
|
|
||||||
|
|
||||||
|
if (path)
|
||||||
stat(path, &st);
|
stat(path, &st);
|
||||||
t = st.st_mtime;
|
else
|
||||||
} else
|
clock_gettime(CLOCK_REALTIME, &st.st_mtim);
|
||||||
t = time(NULL);
|
|
||||||
/* epoc or iso time stamp */
|
|
||||||
if (epoch)
|
if (epoch)
|
||||||
fprintf(file, "%ld", t);
|
fprintf(file, "%ld", st.st_mtim.tv_sec);
|
||||||
else {
|
else {
|
||||||
char time_stamp[64];
|
char time_stamp[64];
|
||||||
|
const time_t mtime = st.st_mtim.tv_sec;
|
||||||
struct tm tm;
|
struct tm tm;
|
||||||
int len;
|
|
||||||
|
|
||||||
localtime_r(&t, &tm);
|
localtime_r(&mtime, &tm);
|
||||||
len = snprintf(time_stamp, sizeof(time_stamp), "%4d-%.2d-%.2dT%02d:%02d:%02d",
|
strftime(time_stamp, sizeof(time_stamp), "%FT%T%z", &tm);
|
||||||
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);
|
|
||||||
fprintf(file, "%s", time_stamp);
|
fprintf(file, "%s", time_stamp);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
196
src/output.c
196
src/output.c
|
|
@ -82,7 +82,7 @@ enum count_status_t {
|
||||||
};
|
};
|
||||||
|
|
||||||
/*! \var color_tags
|
/*! \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. */
|
* schemas per array column. */
|
||||||
static const char *color_tags[][NUM_OF_OUT_FORMS] = {
|
static const char *color_tags[][NUM_OF_OUT_FORMS] = {
|
||||||
[STATUS_OK] = { "", "" },
|
[STATUS_OK] = { "", "" },
|
||||||
|
|
@ -158,11 +158,11 @@ int shnet_output_helper(struct conf_t *state, struct output_helper_t *oh,
|
||||||
oh->status = STATUS_IGNORED;
|
oh->status = STATUS_IGNORED;
|
||||||
if (state->skip_minsize)
|
if (state->skip_minsize)
|
||||||
return 1;
|
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;
|
oh->status = STATUS_CRIT;
|
||||||
if (state->skip_critical)
|
if (state->skip_critical)
|
||||||
return 1;
|
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;
|
oh->status = STATUS_WARN;
|
||||||
if (state->skip_warning)
|
if (state->skip_warning)
|
||||||
return 1;
|
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) {
|
if (oh->status == STATUS_OK) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
fputs(color_tags[oh->status][state->output_format], outfile);
|
fputs(color_tags[oh->status][state->color_format], outfile);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -219,7 +219,6 @@ static void close_outfile(FILE *outfile)
|
||||||
/*! \brief Text output format, which is the default. */
|
/*! \brief Text output format, which is the default. */
|
||||||
static int output_txt(struct conf_t *state)
|
static int output_txt(struct conf_t *state)
|
||||||
{
|
{
|
||||||
unsigned int i;
|
|
||||||
struct range_t *range_p;
|
struct range_t *range_p;
|
||||||
struct shared_network_t *shared_p;
|
struct shared_network_t *shared_p;
|
||||||
struct output_helper_t oh;
|
struct output_helper_t oh;
|
||||||
|
|
@ -249,6 +248,7 @@ static int output_txt(struct conf_t *state)
|
||||||
fprintf(outfile, "\n");
|
fprintf(outfile, "\n");
|
||||||
}
|
}
|
||||||
if (state->number_limit & R_BIT) {
|
if (state->number_limit & R_BIT) {
|
||||||
|
unsigned int i;
|
||||||
for (i = 0; i < state->num_ranges; i++) {
|
for (i = 0; i < state->num_ranges; i++) {
|
||||||
int color_set = 0;
|
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);
|
fprintf(outfile, "%7g %8.3f", range_p->backups, oh.bup);
|
||||||
}
|
}
|
||||||
if (color_set)
|
if (color_set)
|
||||||
fputs(color_tags[COLOR_RESET][state->output_format], outfile);
|
fputs(color_tags[COLOR_RESET][state->color_format], outfile);
|
||||||
fprintf(outfile, "\n");
|
fprintf(outfile, "\n");
|
||||||
range_p++;
|
range_p++;
|
||||||
}
|
}
|
||||||
|
|
@ -320,7 +320,7 @@ static int output_txt(struct conf_t *state)
|
||||||
fprintf(outfile, "%7g %8.3f", shared_p->backups, oh.bup);
|
fprintf(outfile, "%7g %8.3f", shared_p->backups, oh.bup);
|
||||||
}
|
}
|
||||||
if (color_set)
|
if (color_set)
|
||||||
fputs(color_tags[COLOR_RESET][state->output_format], outfile);
|
fputs(color_tags[COLOR_RESET][state->color_format], outfile);
|
||||||
fprintf(outfile, "\n");
|
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);
|
fprintf(outfile, "%7g %8.3f", state->shared_net_root->backups, oh.bup);
|
||||||
}
|
}
|
||||||
if (color_set)
|
if (color_set)
|
||||||
fputs(color_tags[COLOR_RESET][state->output_format], outfile);
|
fputs(color_tags[COLOR_RESET][state->color_format], outfile);
|
||||||
fprintf(outfile, "\n");
|
fprintf(outfile, "\n");
|
||||||
}
|
}
|
||||||
close_outfile(outfile);
|
close_outfile(outfile);
|
||||||
|
|
@ -364,9 +364,8 @@ static int output_txt(struct conf_t *state)
|
||||||
}
|
}
|
||||||
|
|
||||||
/*! \brief The xml output formats. */
|
/*! \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 range_t *range_p;
|
||||||
struct shared_network_t *shared_p;
|
struct shared_network_t *shared_p;
|
||||||
struct output_helper_t oh;
|
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");
|
fprintf(outfile, "<dhcpstatus>\n");
|
||||||
|
|
||||||
if (print_mac_addreses == 1) {
|
if (state->print_mac_addreses) {
|
||||||
struct leases_t *l;
|
struct leases_t *l;
|
||||||
|
|
||||||
for (l = state->leases; l != NULL; l = l->hh.next) {
|
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) {
|
if (l->ethernet != NULL) {
|
||||||
fputs(l->ethernet, outfile);
|
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) {
|
if (state->number_limit & R_BIT) {
|
||||||
|
unsigned int i;
|
||||||
for (i = 0; i < state->num_ranges; i++) {
|
for (i = 0; i < state->num_ranges; i++) {
|
||||||
if (range_output_helper(state, &oh, range_p)) {
|
if (range_output_helper(state, &oh, range_p)) {
|
||||||
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. */
|
/*! \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;
|
unsigned int i = 0;
|
||||||
struct range_t *range_p;
|
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");
|
fprintf(outfile, "{\n");
|
||||||
|
|
||||||
if (print_mac_addreses == 1) {
|
if (state->print_mac_addreses) {
|
||||||
struct leases_t *l;
|
struct leases_t *l;
|
||||||
|
|
||||||
fprintf(outfile, " \"active_leases\": [");
|
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) {
|
if (l->ethernet != NULL) {
|
||||||
fputs(l->ethernet, outfile);
|
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);
|
fputs("\" }", outfile);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -587,9 +611,15 @@ 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, " \"touched\":%g,\n", state->shared_net_root->touched);
|
||||||
fprintf(outfile, " \"free\":%g,\n",
|
fprintf(outfile, " \"free\":%g,\n",
|
||||||
state->shared_net_root->available - state->shared_net_root->used);
|
state->shared_net_root->available - state->shared_net_root->used);
|
||||||
fprintf(outfile, " \"percent\":%g,\n", oh.percent);
|
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);
|
fprintf(outfile, " \"touch_count\":%g,\n", oh.tc);
|
||||||
fprintf(outfile, " \"touch_percent\":%g,\n", oh.tcp);
|
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) {
|
if (state->backups_found == 1) {
|
||||||
fprintf(outfile, " \"backup_count\":%g,\n",
|
fprintf(outfile, " \"backup_count\":%g,\n",
|
||||||
state->shared_net_root->backups);
|
state->shared_net_root->backups);
|
||||||
|
|
@ -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 charset=\"utf-8\">\n");
|
||||||
fprintf(f, "<meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\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, "<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\" 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/bs/jq-3.2.1/dt-1.10.16/datatables.min.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, "<style type=\"text/css\">\n");
|
||||||
fprintf(f, "table.dhcpd-pools th { text-transform: capitalize }\n");
|
fprintf(f, "table.dhcpd-pools th { text-transform: capitalize }\n");
|
||||||
fprintf(f, "</style>\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, "<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, "More info at <a href=\"%s\">%s</a>\n", PACKAGE_URL, PACKAGE_URL);
|
||||||
fprintf(f, "</small></div></div>\n");
|
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 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/bs/jq-3.2.1/dt-1.10.16/datatables.min.js\"></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() { $('#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, "<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");
|
fprintf(f, "</body></html>\n");
|
||||||
|
|
@ -726,7 +756,7 @@ static void output_double_color(struct conf_t *state,
|
||||||
* \param type HTML tag name.
|
* \param type HTML tag name.
|
||||||
* \param fl Actual payload of the printout.
|
* \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);
|
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. */
|
/*! \brief Output html format. */
|
||||||
static int output_html(struct conf_t *state)
|
static int output_html(struct conf_t *state)
|
||||||
{
|
{
|
||||||
unsigned int i;
|
|
||||||
struct range_t *range_p;
|
struct range_t *range_p;
|
||||||
struct shared_network_t *shared_p;
|
struct shared_network_t *shared_p;
|
||||||
struct output_helper_t oh;
|
struct output_helper_t oh;
|
||||||
|
|
@ -877,6 +906,7 @@ static int output_html(struct conf_t *state)
|
||||||
end_tag(outfile, "thead");
|
end_tag(outfile, "thead");
|
||||||
}
|
}
|
||||||
if (state->number_limit & R_BIT) {
|
if (state->number_limit & R_BIT) {
|
||||||
|
unsigned int i;
|
||||||
start_tag(outfile, "tbody");
|
start_tag(outfile, "tbody");
|
||||||
for (i = 0; i < state->num_ranges; i++) {
|
for (i = 0; i < state->num_ranges; i++) {
|
||||||
if (range_output_helper(state, &oh, range_p)) {
|
if (range_output_helper(state, &oh, range_p)) {
|
||||||
|
|
@ -916,7 +946,6 @@ static int output_html(struct conf_t *state)
|
||||||
/*! \brief Output cvs format. */
|
/*! \brief Output cvs format. */
|
||||||
static int output_csv(struct conf_t *state)
|
static int output_csv(struct conf_t *state)
|
||||||
{
|
{
|
||||||
unsigned int i;
|
|
||||||
struct range_t *range_p;
|
struct range_t *range_p;
|
||||||
struct shared_network_t *shared_p;
|
struct shared_network_t *shared_p;
|
||||||
struct output_helper_t oh;
|
struct output_helper_t oh;
|
||||||
|
|
@ -935,6 +964,7 @@ static int output_csv(struct conf_t *state)
|
||||||
fprintf(outfile, "\n");
|
fprintf(outfile, "\n");
|
||||||
}
|
}
|
||||||
if (state->number_limit & R_BIT) {
|
if (state->number_limit & R_BIT) {
|
||||||
|
unsigned int i;
|
||||||
for (i = 0; i < state->num_ranges; i++) {
|
for (i = 0; i < state->num_ranges; i++) {
|
||||||
if (range_output_helper(state, &oh, range_p)) {
|
if (range_output_helper(state, &oh, range_p)) {
|
||||||
range_p++;
|
range_p++;
|
||||||
|
|
@ -1024,19 +1054,11 @@ static int output_csv(struct conf_t *state)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*! \brief Output alarm text, and return program exit value. */
|
void range_alarms(struct conf_t *state, struct status_counts_t *rangstat)
|
||||||
static int output_alarming(struct conf_t *state)
|
|
||||||
{
|
{
|
||||||
FILE *outfile;
|
|
||||||
struct range_t *range_p;
|
|
||||||
struct shared_network_t *shared_p;
|
|
||||||
struct output_helper_t oh;
|
struct output_helper_t oh;
|
||||||
|
struct range_t *range_p = state->ranges;
|
||||||
unsigned int i;
|
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) {
|
if (state->number_limit & R_BIT) {
|
||||||
for (i = 0; i < state->num_ranges; i++) {
|
for (i = 0; i < state->num_ranges; i++) {
|
||||||
|
|
@ -1045,16 +1067,16 @@ static int output_alarming(struct conf_t *state)
|
||||||
case STATUS_SUPPRESSED:
|
case STATUS_SUPPRESSED:
|
||||||
break;
|
break;
|
||||||
case STATUS_IGNORED:
|
case STATUS_IGNORED:
|
||||||
ri++;
|
rangstat->ignored++;
|
||||||
break;
|
break;
|
||||||
case STATUS_CRIT:
|
case STATUS_CRIT:
|
||||||
rc++;
|
rangstat->critical++;
|
||||||
break;
|
break;
|
||||||
case STATUS_WARN:
|
case STATUS_WARN:
|
||||||
rw++;
|
rangstat->warning++;
|
||||||
break;
|
break;
|
||||||
case STATUS_OK:
|
case STATUS_OK:
|
||||||
ro++;
|
rangstat->ok++;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
abort();
|
abort();
|
||||||
|
|
@ -1062,6 +1084,13 @@ static int output_alarming(struct conf_t *state)
|
||||||
range_p++;
|
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) {
|
if (state->number_limit & S_BIT) {
|
||||||
for (shared_p = state->shared_net_root->next; shared_p; shared_p = shared_p->next) {
|
for (shared_p = state->shared_net_root->next; shared_p; shared_p = shared_p->next) {
|
||||||
shnet_output_helper(state, &oh, shared_p);
|
shnet_output_helper(state, &oh, shared_p);
|
||||||
|
|
@ -1069,35 +1098,51 @@ static int output_alarming(struct conf_t *state)
|
||||||
case STATUS_SUPPRESSED:
|
case STATUS_SUPPRESSED:
|
||||||
break;
|
break;
|
||||||
case STATUS_IGNORED:
|
case STATUS_IGNORED:
|
||||||
si++;
|
sharstat->ignored++;
|
||||||
break;
|
break;
|
||||||
case STATUS_CRIT:
|
case STATUS_CRIT:
|
||||||
sc++;
|
sharstat->critical++;
|
||||||
break;
|
break;
|
||||||
case STATUS_WARN:
|
case STATUS_WARN:
|
||||||
sw++;
|
sharstat->warning++;
|
||||||
break;
|
break;
|
||||||
case STATUS_OK:
|
case STATUS_OK:
|
||||||
so++;
|
sharstat->ok++;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
abort();
|
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;
|
ret_val = STATE_CRITICAL;
|
||||||
else if (sw || rw)
|
else if (rangstat.warning || sharstat.warning)
|
||||||
ret_val = STATE_WARNING;
|
ret_val = STATE_WARNING;
|
||||||
else
|
else
|
||||||
ret_val = STATE_OK;
|
ret_val = STATE_OK;
|
||||||
|
|
||||||
if ((0 < rc && state->number_limit & R_BIT)
|
if ((0 < rangstat.critical && state->number_limit & R_BIT)
|
||||||
|| (0 < sc && state->number_limit & S_BIT)) {
|
|| (0 < sharstat.critical && state->number_limit & S_BIT)) {
|
||||||
fprintf(outfile, "CRITICAL: %s:", program_name);
|
fprintf(outfile, "CRITICAL: %s:", program_name);
|
||||||
} else if ((0 < rw && state->number_limit & R_BIT)
|
} else if ((0 < rangstat.warning && state->number_limit & R_BIT)
|
||||||
|| (0 < sw && state->number_limit & S_BIT)) {
|
|| (0 < sharstat.warning && state->number_limit & S_BIT)) {
|
||||||
fprintf(outfile, "WARNING: %s:", program_name);
|
fprintf(outfile, "WARNING: %s:", program_name);
|
||||||
} else {
|
} else {
|
||||||
if (state->number_limit & A_BIT)
|
if (state->number_limit & A_BIT)
|
||||||
|
|
@ -1110,17 +1155,21 @@ static int output_alarming(struct conf_t *state)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (state->header_limit & R_BIT) {
|
if (state->header_limit & R_BIT) {
|
||||||
fprintf(outfile, " Ranges - crit: %d warn: %d ok: %d", rc, rw, ro);
|
fprintf(outfile, " Ranges - crit: %d warn: %d ok: %d", rangstat.critical, rangstat.warning, rangstat.ok);
|
||||||
if (ri != 0) {
|
if (rangstat.ignored != 0) {
|
||||||
fprintf(outfile, " ignored: %d", ri);
|
fprintf(outfile, " ignored: %d", rangstat.ignored);
|
||||||
}
|
}
|
||||||
fprintf(outfile, "; | range_crit=%d range_warn=%d range_ok=%d", rc, rw, ro);
|
fprintf(outfile, "; | range_crit=%d range_warn=%d range_ok=%d", rangstat.critical, rangstat.warning, rangstat.ok);
|
||||||
if (ri != 0) {
|
if (rangstat.ignored != 0) {
|
||||||
fprintf(outfile, " range_ignored=%d", ri);
|
fprintf(outfile, " range_ignored=%d", rangstat.ignored);
|
||||||
}
|
}
|
||||||
if (state->perfdata == 1 && state->number_limit & R_BIT) {
|
if (state->perfdata == 1 && state->number_limit & R_BIT) {
|
||||||
for (i = 0; i < state->num_ranges; i++) {
|
/* last to first order. too late to fix this after so many years */
|
||||||
range_p--;
|
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))
|
if (range_output_helper(state, &oh, range_p))
|
||||||
continue;
|
continue;
|
||||||
if (state->minsize < oh.range_size) {
|
if (state->minsize < oh.range_size) {
|
||||||
|
|
@ -1137,6 +1186,7 @@ static int output_alarming(struct conf_t *state)
|
||||||
range_p->backups);
|
range_p->backups);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
range_p--;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
fprintf(outfile, "\n");
|
fprintf(outfile, "\n");
|
||||||
|
|
@ -1144,16 +1194,20 @@ static int output_alarming(struct conf_t *state)
|
||||||
fprintf(outfile, " ");
|
fprintf(outfile, " ");
|
||||||
}
|
}
|
||||||
if (state->header_limit & S_BIT) {
|
if (state->header_limit & S_BIT) {
|
||||||
fprintf(outfile, "Shared nets - crit: %d warn: %d ok: %d", sc, sw, so);
|
fprintf(outfile, "Shared nets - crit: %d warn: %d ok: %d", sharstat.critical, sharstat.warning, sharstat.ok);
|
||||||
if (si != 0) {
|
if (sharstat.ignored != 0) {
|
||||||
fprintf(outfile, " ignored: %d", si);
|
fprintf(outfile, " ignored: %d", sharstat.ignored);
|
||||||
}
|
}
|
||||||
fprintf(outfile, "; | snet_crit=%d snet_warn=%d snet_ok=%d", sc, sw, so);
|
fprintf(outfile, "; | snet_crit=%d snet_warn=%d snet_ok=%d", sharstat.critical, sharstat.warning, sharstat.ok);
|
||||||
if (si != 0) {
|
if (sharstat.ignored != 0) {
|
||||||
fprintf(outfile, " snet_ignored=%d", si);
|
fprintf(outfile, " snet_ignored=%d", sharstat.ignored);
|
||||||
}
|
}
|
||||||
if (state->perfdata == 1 && state->header_limit & R_BIT) {
|
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) {
|
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))
|
if (shnet_output_helper(state, &oh, shared_p))
|
||||||
continue;
|
continue;
|
||||||
if (state->minsize < shared_p->available) {
|
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. */
|
/*! \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;
|
int ret = 1;
|
||||||
|
|
||||||
switch (output_format) {
|
switch (state->output_format) {
|
||||||
case 't':
|
case 't':
|
||||||
state->output_format = OUT_FORM_TEXT;
|
state->color_format = OUT_FORM_TEXT;
|
||||||
ret = output_txt(state);
|
ret = output_txt(state);
|
||||||
break;
|
break;
|
||||||
case 'a':
|
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");
|
error(EXIT_FAILURE, 0, "html table only output format is deprecated");
|
||||||
break;
|
break;
|
||||||
case 'H':
|
case 'H':
|
||||||
state->output_format = OUT_FORM_HTML;
|
state->color_format = OUT_FORM_HTML;
|
||||||
ret = output_html(state);
|
ret = output_html(state);
|
||||||
break;
|
break;
|
||||||
case 'x':
|
case 'x':
|
||||||
ret = output_xml(state, 0);
|
/* fallthrough */
|
||||||
break;
|
|
||||||
case 'X':
|
case 'X':
|
||||||
ret = output_xml(state, 1);
|
ret = output_xml(state);
|
||||||
break;
|
break;
|
||||||
case 'j':
|
case 'j':
|
||||||
ret = output_json(state, 0);
|
/* fallthrough */
|
||||||
break;
|
|
||||||
case 'J':
|
case 'J':
|
||||||
ret = output_json(state, 1);
|
ret = output_json(state);
|
||||||
break;
|
break;
|
||||||
case 'c':
|
case 'c':
|
||||||
ret = output_csv(state);
|
ret = output_csv(state);
|
||||||
|
|
@ -1220,7 +1272,7 @@ int output_analysis(struct conf_t *state, const char output_format)
|
||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
default:
|
default:
|
||||||
error(EXIT_FAILURE, 0, "unknown output format: '%c'", output_format);
|
error(EXIT_FAILURE, 0, "unknown output format: '%c'", state->output_format);
|
||||||
}
|
}
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
11
src/sort.c
11
src/sort.c
|
|
@ -40,6 +40,7 @@
|
||||||
|
|
||||||
#include <config.h>
|
#include <config.h>
|
||||||
|
|
||||||
|
#include <math.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.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)
|
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.
|
/*! \brief Compare two range_t by their first_ip.
|
||||||
* \param r1,r2 Pointers to data to compare.
|
* \param r1,r2 Pointers to data to compare.
|
||||||
* \return Like strcmp.
|
* \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)
|
struct range_t *restrict temp, const int root_call)
|
||||||
{
|
{
|
||||||
unsigned int left, i, u_right;
|
unsigned int left, i, u_right;
|
||||||
int s_right;
|
|
||||||
struct range_t hold;
|
struct range_t hold;
|
||||||
/* Merge sort split size */
|
/* Merge sort split size */
|
||||||
static const unsigned int MIN_MERGE_SIZE = 8;
|
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) {
|
if (size < MIN_MERGE_SIZE) {
|
||||||
for (left = 0; left < size; left++) {
|
for (left = 0; left < size; left++) {
|
||||||
|
int s_right;
|
||||||
|
|
||||||
hold = *(orig + left);
|
hold = *(orig + left);
|
||||||
for (s_right = left - 1; 0 <= s_right; s_right--) {
|
for (s_right = left - 1; 0 <= s_right; s_right--) {
|
||||||
if (merge(state, (orig + s_right), &hold))
|
if (merge(state, (orig + s_right), &hold))
|
||||||
|
|
|
||||||
|
|
@ -11,21 +11,29 @@ TESTS = \
|
||||||
tests/alarm-warning-snets \
|
tests/alarm-warning-snets \
|
||||||
tests/shnet-alarm \
|
tests/shnet-alarm \
|
||||||
tests/big-small \
|
tests/big-small \
|
||||||
|
tests/binding-states \
|
||||||
tests/bootp \
|
tests/bootp \
|
||||||
|
tests/cidr-v4 \
|
||||||
|
tests/cidr-v6 \
|
||||||
tests/complete \
|
tests/complete \
|
||||||
tests/complete-perfdata \
|
tests/complete-perfdata \
|
||||||
tests/empty \
|
tests/empty \
|
||||||
|
tests/errors \
|
||||||
tests/full-json \
|
tests/full-json \
|
||||||
tests/full-xml \
|
tests/full-xml \
|
||||||
|
tests/formats \
|
||||||
tests/leading0 \
|
tests/leading0 \
|
||||||
tests/one-ip \
|
tests/one-ip \
|
||||||
tests/one-line \
|
tests/one-line \
|
||||||
|
tests/parser \
|
||||||
tests/range4 \
|
tests/range4 \
|
||||||
tests/range6 \
|
tests/range6 \
|
||||||
tests/same-twice \
|
tests/same-twice \
|
||||||
|
tests/shufled \
|
||||||
tests/simple \
|
tests/simple \
|
||||||
tests/skip \
|
tests/skip \
|
||||||
tests/sorts \
|
tests/sorts \
|
||||||
|
tests/statuses \
|
||||||
tests/v6 \
|
tests/v6 \
|
||||||
tests/v6-perfdata
|
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
|
echo $? >> tests/outputs/$IAM-too
|
||||||
cat tests/outputs/$IAM-too >> tests/outputs/$IAM
|
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
|
rm -f tests/outputs/$IAM-too
|
||||||
diff -u $top_srcdir/tests/expected/$IAM tests/outputs/$IAM
|
diff -u $top_srcdir/tests/expected/$IAM tests/outputs/$IAM
|
||||||
exit $?
|
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
|
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
|
Shared nets - crit: 0 warn: 2 ok: 0; | snet_crit=0 snet_warn=2 snet_ok=0
|
||||||
1
|
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:
|
Subnets:
|
||||||
location: example1
|
location: example1
|
||||||
range: 10.0.0.1 - 10.0.0.20
|
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 ---
|
--- 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:
|
Subnets:
|
||||||
location: example1
|
location: example1
|
||||||
range: 10.0.0.1 - 10.0.0.20
|
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": [
|
"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": [
|
"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 }
|
{ "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>
|
<active_lease>
|
||||||
<ip>10.0.0.5</ip>
|
<ip>10.0.0.5</ip>
|
||||||
<macaddress>00:00:00:00:00:00</macaddress>
|
<macaddress>00:00:00:00:00:00</macaddress>
|
||||||
|
<starts></starts>
|
||||||
|
<ends></ends>
|
||||||
|
<hostname></hostname>
|
||||||
</active_lease>
|
</active_lease>
|
||||||
<subnet>
|
<subnet>
|
||||||
<location>All networks</location>
|
<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
|
name max cur percent touch t+c t+c perc
|
||||||
All networks 100 43 43.000 0 43 43.000
|
All networks 100 43 43.000 0 43 43.000
|
||||||
0
|
0
|
||||||
== maxium ==
|
== maximum ==
|
||||||
Ranges:
|
Ranges:
|
||||||
shared net name first ip last ip max cur percent touch t+c t+c perc
|
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
|
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
|
echo $? >> tests/outputs/$IAM-too
|
||||||
cat tests/outputs/$IAM-too >> tests/outputs/$IAM
|
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 \
|
dhcpd-pools --config $top_srcdir/tests/confs/complete --leases $top_srcdir/tests/leases/complete \
|
||||||
--sort=m --output=tests/outputs/$IAM-too
|
--sort=m --output=tests/outputs/$IAM-too
|
||||||
echo $? >> 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
|
# analysis algorithm is sane. This script is no longer
|
||||||
# maintained, and can be considered as historic reference.
|
# maintained, and can be considered as historic reference.
|
||||||
#
|
#
|
||||||
# Licensed under the Open Software License version 1.1
|
# Licensed under the Open Software License version 1.0
|
||||||
# http://opensource.org/licenses/osl.php
|
# https://opensource.org/license/osl-1-0/
|
||||||
#
|
#
|
||||||
# Sami Kerola <sami.kerola@teliasonera.com>
|
# Sami Kerola <sami.kerola@teliasonera.com>
|
||||||
#
|
#
|
||||||
# Latest version is available from http://www.iki.fi/kerolasa/dhcp/
|
|
||||||
# This is version 1.4
|
# This is version 1.4
|
||||||
|
|
||||||
BEGIN {
|
BEGIN {
|
||||||
|
|
|
||||||
|
|
@ -30,7 +30,7 @@ font-variant: normal;
|
||||||
</style>
|
</style>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<div itemscope itemtype="http://schema.org/SoftwareApplication">
|
<div itemscope itemtype="https://schema.org/SoftwareApplication">
|
||||||
<h1>ISC dhcpd lease analysis and reporting</h1>
|
<h1>ISC dhcpd lease analysis and reporting</h1>
|
||||||
<p>This is <span itemprop="name">dhcpd-pools</span>
|
<p>This is <span itemprop="name">dhcpd-pools</span>
|
||||||
<a href="https://www.isc.org/software/dhcp" itemprop="applicationSuite">ISC dhcp</a>
|
<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>
|
any significant difference in getting analysis done.</p>
|
||||||
<hr />
|
<hr />
|
||||||
<div class="tt">
|
<div class="tt">
|
||||||
prompt> ./dhcpd-pools -c /etc/dhcpd.conf -l /var/lib/dhcp/dhcpd.leases -o
|
prompt> ./dhcpd-pools --config=/etc/dhcpd.conf
|
||||||
./sampleoutput.txt<br />
|
--leases=/var/lib/dhcp/dhcpd.leases --format=H
|
||||||
prompt> cat ./<a href="http://dhcpd-pools.sourceforge.net/sampleoutput.txt">sampleoutput.txt</a></pre>
|
--color=always --warning=40 --critical=50 --output=<a
|
||||||
|
href="https://dhcpd-pools.sourceforge.net/sampleoutput.html">sampleoutput.html</a>
|
||||||
</div>
|
</div>
|
||||||
<hr />
|
<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>
|
<h3>Where I can get dhcpd-pools?</h3>
|
||||||
<p>Download
|
<p>Download
|
||||||
<a href="https://sourceforge.net/projects/dhcpd-pools/files/" itemprop="downloadUrl">release package</a>
|
<a href="https://sourceforge.net/projects/dhcpd-pools/files/" itemprop="downloadUrl">release package</a>
|
||||||
|
|
@ -60,44 +70,62 @@ file.
|
||||||
<br /></p>
|
<br /></p>
|
||||||
<div class="tt">git clone git://git.code.sf.net/p/dhcpd-pools/code dhcpd-pools</div>
|
<div class="tt">git clone git://git.code.sf.net/p/dhcpd-pools/code dhcpd-pools</div>
|
||||||
<p>See also
|
<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>
|
<h3>Documentation</h3>
|
||||||
<p>The dhcpd-pools
|
<p>The dhcpd-pools
|
||||||
<a href="http://dhcpd-pools.sourceforge.net/man.html">manual page</a>, and
|
<a href="https://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/doxygen/">Doxygen</a> software
|
||||||
reference documentation are available online.</p>
|
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>
|
<h3>Reference information</h3>
|
||||||
<p>
|
<p>
|
||||||
<script type='text/javascript' src='https://www.openhub.net/p/dhcpd-pools/widgets/project_factoids_stats?format=js'></script>
|
<script type='text/javascript' src='https://www.openhub.net/p/dhcpd-pools/widgets/project_factoids_stats?format=js'></script>
|
||||||
</p>
|
</p>
|
||||||
<p>The program was written because
|
<p>The program was written because
|
||||||
<a href="http://dhcpstatus.sourceforge.net/">DHCPStatus</a>,
|
<a href="https://dhcpstatus.sourceforge.net/">DHCPStatus</a>,
|
||||||
<a href="http://freshmeat.net/projects/dhcpusestats/">DHCP Usage Statistics</a>,
|
<a href="https://freshmeat.net/projects/dhcpusestats/">DHCP Usage Statistics</a>,
|
||||||
<a href="http://www.omar.org/opensource/reportdhcp/">reportdhcp.pl</a>,
|
<a href="https://www.omar.org/opensource/reportdhcp/">reportdhcp.pl</a>,
|
||||||
<a href="http://www.ofb.net/%7Ejheiss/lease_analyzer">lease_analyzer</a> and
|
<a href="https://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://www.net-track.ch/opensource/dhcpd-snmp/">dhcpd-snmp</a>
|
||||||
where too slow to handle huge number of leases. There is also difference in
|
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
|
printed details. The dhcpd-pools does not print quite as much information as
|
||||||
some other tools.</p>
|
some other tools.</p>
|
||||||
<p>Notice that this utility is not the same as
|
<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>
|
that is maintained by Trond Hasle Amundsen.</p>
|
||||||
<p>Just for laugh, obsolete awk proof of concept (version 1.4)
|
<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>
|
<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>
|
<<a href="mailto:kerolasa@iki.fi">kerolasa@iki.fi</a>></p>
|
||||||
<div style="visibility:hidden">
|
<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="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="version">3.0</span>
|
||||||
<span itemprop="license">FreeBSD License</span>
|
<span itemprop="license">FreeBSD License</span>
|
||||||
<a href="http://dhcpd-pools.sourceforge.net/" itemprop="url"></a>
|
<a href="https://dhcpd-pools.sourceforge.net/" itemprop="url"></a>
|
||||||
<div itemprop="offers" itemscope itemtype="http://schema.org/Offer">
|
<div itemprop="offers" itemscope itemtype="https://schema.org/Offer">
|
||||||
<span itemprop="price">0</span>
|
<span itemprop="price">0</span>
|
||||||
<meta itemprop="priceCurrency" content="EUR" />
|
<meta itemprop="priceCurrency" content="EUR" />
|
||||||
</div>
|
</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="ratingValue">5</span> (
|
||||||
<span itemprop="ratingCount">2</span> ratings )
|
<span itemprop="ratingCount">2</span> ratings )
|
||||||
</div>
|
</div>
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1,3 @@
|
||||||
Sitemap: http://dhcpd-pools.sourceforge.net/sitemap.txt
|
Sitemap: https://dhcpd-pools.sourceforge.net/sitemap.txt
|
||||||
User-agent: *
|
User-agent: *
|
||||||
Disallow:
|
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