Compare commits

..

No commits in common. "master" and "v3.0" have entirely different histories.
master ... v3.0

76 changed files with 4042 additions and 3911 deletions

3
.gitignore vendored
View file

@ -1,8 +1,5 @@
# Wildcard + in any subdir.
*.o
*.gcno
*.gcda
*.[ch].gcov
# Exact filename in any subdir.
.deps

View file

@ -1,2 +0,0 @@
Sami Kerola <kerolasa@iki.fi>
Sami Kerola <kerolasa@iki.fi> <sami.kerola@tomtom.com>

View file

@ -1,6 +1,7 @@
## Makefile.am -- Process this file with automake to produce Makefile.in
AUTOMAKE_OPTIONS = gnu
ACLOCAL_AMFLAGS = -I m4
EXTRA_DIST = \
.version \
@ -39,7 +40,7 @@ edit_cmd = sed \
$(PATHFILES): Makefile
@ rm -f $@ $@.tmp
$(AM_V_at) mkdir -p $$(dirname $@)
$(AM_V_at) test -d $(dir $@) || mkdir -p $(dir $@)
$(AM_V_GEN) srcdir=''; \
test -f ./$@.in || srcdir=$(srcdir)/; \
$(edit_cmd) $${srcdir}$@.in >$@.tmp

71
NEWS
View file

@ -7,77 +7,6 @@ Please send dhcpd-pools bug reports to kerolasa@iki.fi.
gpg: Signature is crated using RSA key ID 8ED396E37E38D471A00530D3A9553245FDE9B739.
Version 3.3
Belkacem Daheb (2):
add start, end and hostname printing support for xml and json
getdata output: add start, end and hostname printing support for xml and json
M. van Brummelen (1):
docs: fix manual page groff warning
Sami Kerola (9):
update project web page
website: use https
chore: update web links
getdata: only emit warning when config include file cannot be read
gnulib: update bootstrap and gitignore files
build-sys: quote subshell execution in the autotools file
build-sys: update bootstrap from gnulib
output: update html javascripts
release: 3.3
luisδμ (1):
fix: avoid generation of unvalid JSON in summary
Version 3.2
Jean Benoit (1):
contrib: snmptest.pl SNMPwalk can't access to all variables/wrong sort
Sami Kerola (5):
contrib: point out where one can find zabbix template
build-sys: update .gitignore files
config: remove unnecessary padding
build-sys: autotools and gnulib related updates
build-sys: routine update
release: 3.2
Version 3.1
Mark Sangster (1):
output: fix warn and crit counts on shared networks
Sami Kerola (31):
webpage: add instructions how to get output you need
build-sys: add coverage files to .gitignore
tests: improve coverage
docs: fix peoples name in THANKS file to have correct characters
add .mailmap
output: fix implicit conversion
main: simplify option parsing
fix typo
main: move print_mac_addreses to state structure
main: move output_format to state, and rename color_format
webpages: use html sample output
fix switch missing default case warnings
sort: ensure NaN will not trip over comp_double()
drop images, java scripts, and such from web sitemap file
getdata: remote dead code
other: use strftime() to generate date-time string
lib: update .gitignore
fix typos
various: fix few warnings
warnings: ensure optimal packing in structures
other: use IP string lengths from netinet/in.h
mustach: sync with most recent mustach upstream changes
various: tidy up variable scopes, and one name mismatch
build-sys: update .gitignore files
output: add warning and critical threshold counts to mustach
samples: make prometheus template less klunky
misc: fix spelling issues
output: add ethernet address priting support to --mustach
build-sys: update bootstrap from gnulib
output: update javascripts
release: 3.1
Version 3.0
Sami Kerola (56):

4
README
View file

@ -28,7 +28,7 @@ Quick start.
Dependencies to other projects.
https://www.gnu.org/software/gnulib/
http://www.gnu.org/software/gnulib/
You can avoid repeated gnulib downloads by setting
GNULIB_SRCDIR environment variable. For example:
@ -39,7 +39,7 @@ Dependencies to other projects.
Assumign detached gnulib please remember to git pull the
latest updates before building dhcpd-pools.
https://troydhanson.github.io/uthash/
http://uthash.sourceforge.net/
See quick start.

23
THANKS
View file

@ -5,23 +5,23 @@ Project is maintained by Sami Kerola <kerolasa@iki.fi>
People who reported problems, give improvement suggestions or even
contributed code.
Otto J. Mäkelä
Otto J. Mäkelä
Mika Paananen
Frank Bulk
Roar Pettersen
Jeff Wieland
Rusty
Fredrik Vöcks
Fredrik Vöcks
Dan Thorson
Stian Øvrevåge
Stian Øvrevåge
Dominic Germain
Anders Låstad
Anders Låstad
Thor Eivind Brantzeg
Ahmed AL Dakhil
Adam Ciarcinski
Rezső Gajdóczy
Rezso Gajdóczy
Robert Viou
Enno Gröper
Enno Gröper
Troy D. Hanson
Ryan Malek
Cheer Xiao
@ -30,7 +30,7 @@ Helmut Grohne
Joey D.
Ryan Steinmetz
Dan Pritts
Fredrik Lysén
Fredrik Lysén
Conor McCarthy
Wolfgang Steudel
Aaron Paetznick
@ -44,11 +44,4 @@ Klaus Slott
Boris Lytochkin
Jeff Bailey
José Bollo
Sebastián Cramatte
Mark Sangster
Brent Swingle
Mathieu Morier
Jean Benoit
Belkacem Daheb
Björn Lässig
Luisδμ
Sebastián Cramatte

1720
bootstrap

File diff suppressed because it is too large Load diff

View file

@ -1,10 +1,10 @@
# Bootstrap configuration. -*- sh -*-
# Bootstrap configuration.
# Copyright (C) 2006-2025 Free Software Foundation, Inc.
# Copyright (C) 2006-2017 Free Software Foundation, Inc.
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# the Free Software Foundation; either version 3 of the License, or
# (at your option) any later version.
# This program is distributed in the hope that it will be useful,
@ -13,7 +13,7 @@
# GNU General Public License for more details.
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <https://www.gnu.org/licenses/>.
# along with this program. If not, see <http://www.gnu.org/licenses/>.
# gnulib modules used by this package.
@ -64,7 +64,7 @@ XGETTEXT_OPTIONS=$XGETTEXT_OPTIONS'\\\
gettext_external=0
grep '^[ ]*AM_GNU_GETTEXT(external\>' configure.ac > /dev/null &&
gettext_external=1
grep '^[ ]*AM_GNU_GETTEXT(\[external]' configure.ac > /dev/null &&
grep '^[ ]*AM_GNU_GETTEXT(\[external\]' configure.ac > /dev/null &&
gettext_external=1
if test $gettext_external = 1; then

View file

@ -1,7 +1,6 @@
/ar-lib
/compile
/config.guess
/config.rpath
/config.sub
/depcomp
/install-sh

View file

@ -1,12 +1,12 @@
#!/bin/sh
# Print a version string.
scriptversion=2022-01-27.18; # UTC
scriptversion=2012-12-31.23; # UTC
# Copyright (C) 2007-2022 Free Software Foundation, Inc.
# Copyright (C) 2007-2013 Free Software Foundation, Inc.
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# the Free Software Foundation; either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
@ -15,9 +15,9 @@ scriptversion=2022-01-27.18; # UTC
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <https://www.gnu.org/licenses/>.
# along with this program. If not, see <http://www.gnu.org/licenses/>.
# This script is derived from GIT-VERSION-GEN from GIT: https://git-scm.com/.
# This script is derived from GIT-VERSION-GEN from GIT: http://git.or.cz/.
# It may be run two ways:
# - from a git repository in which the "git describe" command below
# produces useful output (thus requiring at least one signed tag)
@ -65,21 +65,19 @@ scriptversion=2022-01-27.18; # UTC
# EXTRA_DIST = $(top_srcdir)/.version
# BUILT_SOURCES = $(top_srcdir)/.version
# $(top_srcdir)/.version:
# echo '$(VERSION)' > $@-t
# mv $@-t $@
# echo $(VERSION) > $@-t && mv $@-t $@
# dist-hook:
# echo '$(VERSION)' > $(distdir)/.tarball-version
# echo $(VERSION) > $(distdir)/.tarball-version
me=$0
year=`expr "$scriptversion" : '\([^-]*\)'`
version="git-version-gen $scriptversion
Copyright (C) ${year} Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law."
Copyright 2011 Free Software Foundation, Inc.
There is NO warranty. You may redistribute this software
under the terms of the GNU General Public License.
For more information about these matters, see the files named COPYING."
usage="\
Usage: $me [OPTION]... \$srcdir/.tarball-version [TAG-NORMALIZATION-SED-SCRIPT]
@ -87,9 +85,8 @@ Print a version string.
Options:
--prefix PREFIX prefix of git tags (default 'v')
--fallback VERSION
fallback version to use if \"git --version\" fails
--prefix prefix of git tags (default 'v')
--fallback fallback version to use if \"git --version\" fails
--help display this help and exit
--version output version information and exit
@ -103,8 +100,8 @@ while test $# -gt 0; do
case $1 in
--help) echo "$usage"; exit 0;;
--version) echo "$version"; exit 0;;
--prefix) shift; prefix=${1?};;
--fallback) shift; fallback=${1?};;
--prefix) shift; prefix="$1";;
--fallback) shift; fallback="$1";;
-*)
echo "$0: Unknown option '$1'." >&2
echo "$0: Try '--help' for more information." >&2
@ -143,9 +140,11 @@ then
v=`cat $tarball_version_file` || v=
case $v in
*$nl*) v= ;; # reject multi-line output
[0-9]*) ;;
*) v= ;;
esac
test "x$v" = x \
&& echo "$0: WARNING: $tarball_version_file is damaged" 1>&2
&& echo "$0: WARNING: $tarball_version_file is missing or damaged" 1>&2
fi
if test "x$v" != x
@ -167,10 +166,9 @@ then
# tag or the previous older version that did not?
# Newer: v6.10-77-g0f8faeb
# Older: v6.10-g0f8faeb
vprefix=`expr "X$v" : 'X\(.*\)-g[^-]*$'` || vprefix=$v
case $vprefix in
*-*) : git describe is probably okay three part flavor ;;
*)
case $v in
*-*-*) : git describe is okay three part flavor ;;
*-*)
: git describe is older two part flavor
# Recreate the number of commits and rewrite such that the
# result is the same as if we were using the newer version
@ -185,9 +183,9 @@ then
;;
esac
# Change the penultimate "-" to ".", for version-comparing tools.
# Remove the "g" to save a byte.
v=`echo "$v" | sed 's/-\([^-]*\)-g\([^-]*\)$/.\1-\2/'`;
# Change the first '-' to a '.', so version-comparing tools work properly.
# Remove the "g" in git describe's output string, to save a byte.
v=`echo "$v" | sed 's/-/./;s/\(.*\)-g/\1-/'`;
v_from_git=1
elif test "x$fallback" = x || git --version >/dev/null 2>&1; then
v=UNKNOWN
@ -201,7 +199,7 @@ v=`echo "$v" |sed "s/^$prefix//"`
# string we're using came from git. I.e., skip the test if it's "UNKNOWN"
# or if it came from .tarball-version.
if test "x$v_from_git" != x; then
# Don't declare a version "dirty" merely because a timestamp has changed.
# Don't declare a version "dirty" merely because a time stamp has changed.
git update-index --refresh > /dev/null 2>&1
dirty=`exec 2>/dev/null;git diff-index --name-only HEAD` || dirty=
@ -216,12 +214,12 @@ if test "x$v_from_git" != x; then
fi
# Omit the trailing newline, so that m4_esyscmd can use the result directly.
printf %s "$v"
echo "$v" | tr -d "$nl"
# Local variables:
# eval: (add-hook 'before-save-hook 'time-stamp)
# eval: (add-hook 'write-file-hooks 'time-stamp)
# time-stamp-start: "scriptversion="
# time-stamp-format: "%:y-%02m-%02d.%02H"
# time-stamp-time-zone: "UTC0"
# time-stamp-time-zone: "UTC"
# time-stamp-end: "; # UTC"
# End:

View file

@ -2,11 +2,11 @@
# Process this file with autoconf to produce a configure script.
AC_PREREQ([2.69])
AC_CONFIG_MACRO_DIRS([m4])
AC_CONFIG_MACRO_DIR([m4])
AC_INIT([dhcpd-pools],
[m4_esyscmd([build-aux/git-version-gen .tarball-version])],
[kerolasa@iki.fi],[],
[https://dhcpd-pools.sourceforge.net/])
[http://dhcpd-pools.sourceforge.net/])
PACKAGE_MAINTAINER="Sami Kerola"
AC_SUBST([PACKAGE_MAINTAINER])
AC_CONFIG_AUX_DIR([build-aux])

View file

@ -7,7 +7,7 @@ pkgver=0
pkgrel=1
pkgdesc="ISC dhcpd lease status utility"
arch=('i686' 'x86_64')
url=https://dhcpd-pools.sourceforge.net/
url=http://dhcpd-pools.sourceforge.net/
license=('BSD')
depends=('pacman')
makedepends=('uthash' 'git')

View file

@ -23,10 +23,9 @@
# you set $dbg to 1 then output will be generated in /tmp.
use strict;
use NetSNMP::OID;
# Version info:
my $SNMPver = "snmp1.1";
my $SNMPver = "snmp1.0";
my $DHCPver = "dhcp1.0";
my $VERSION = "$SNMPver/$DHCPver";
#
@ -194,7 +193,7 @@ sub ParseDataFile () {
}
close IN;
if ($dbg) {
foreach (sort Oidcmp @validoidlist) { print DBG "ValidOID: $_\n"; }
foreach (sort @validoidlist) { print DBG "ValidOID: $_\n"; }
}
if ($dbg) {
@ -371,7 +370,7 @@ sub GetData ($) {
@userquery = split (/\./, $userqueryoid);
my $found = 0;
foreach (sort Oidcmp @validoidlist) {
foreach (sort @validoidlist) {
$next = $_;
print DBG "Comparing $userqueryoid vs. $_\n" if $dbg;
@validoid = split (/\./, $_);
@ -433,12 +432,6 @@ sub Pong {
$line = 0;
}
sub Oidcmp {
my $oida = new NetSNMP::OID($a);
my $oidb = new NetSNMP::OID($b);
snmp_oid_compare($oida, $oidb);
}
################################## START ##################################
#
# Main

View file

@ -1,4 +0,0 @@
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
View file

@ -1,40 +1,37 @@
/*.lo
/.libs/
/Makefile.am
/_Noreturn.h
/alloca.h
/alloca.in.h
/arg-nonnull.h
/arpa/
/arpa_inet.c
/arpa/inet.h
/arpa_inet.in.h
/assert.in.h
/attribute.h
/basename-lgpl.c
/basename-lgpl.h
/c32is-impl.h
/c32isprint.c
/calloc.c
/c++defs.h
/c-ctype.c
/c-ctype.h
/c++defs.h
/cdefs.h
/cloexec.c
/cloexec.h
/c-strcase.h
/c-strcasecmp.c
/c-strcaseeq.h
/c-strncasecmp.c
/charset.alias
/close-stream.c
/close-stream.h
/close.c
/closeout.c
/closeout.h
/close-stream.c
/close-stream.h
/c-strcasecmp.c
/c-strcaseeq.h
/c-strcase.h
/c-strncasecmp.c
/dup2.c
/config.charset
/configmake.h
/dirname-lgpl.c
/dirname.h
/dosname.h
/errno.in.h
/error.c
/error.h
/error.in.h
/exitfail.c
/exitfail.h
/fclose.c
/fcntl.c
/fcntl.h
/fcntl.in.h
/fd-hook.c
@ -43,9 +40,8 @@
/fflush.c
/filename.h
/flexmember.h
/float.c
/float+.h
/float.h
/float.c
/float.in.h
/fopen.c
/fpending.c
@ -53,210 +49,126 @@
/fpurge.c
/freading.c
/freading.h
/free.c
/fseek.c
/fseeko.c
/fstat.c
/ftell.c
/ftello.c
/getdtablesize.c
/getlocalename_l-unsafe.c
/getlocalename_l-unsafe.h
/getopt1.c
/getopt.c
/getopt-cdefs.in.h
/getopt-core.h
/getopt-ext.h
/getopt.in.h
/getopt_int.h
/getopt-pfx-core.h
/getopt-pfx-ext.h
/getopt.c
/getopt.in.h
/getopt1.c
/getopt_int.h
/getprogname.c
/getprogname.h
/gettext.h
/hard-locale.c
/hard-locale.h
/ialloc.c
/ialloc.h
/idx.h
/inet_pton.c
/intprops.h
/intprops-internal.h
/inttypes.h
/inttypes.in.h
/isnan.c
/isnand.c
/isnanf.c
/isnanl.c
/itold.c
/lc-charset-dispatch.c
/lc-charset-dispatch.h
/libc-config.h
/libdhcpd_pools.la
/libdhcpd_pools_la-arpa_inet.lo
/libdhcpd_pools_la-basename-lgpl.lo
/libdhcpd_pools_la-c32isprint.lo
/libdhcpd_pools_la-c-ctype.lo
/libdhcpd_pools_la-cloexec.lo
/libdhcpd_pools_la-closeout.lo
/libdhcpd_pools_la-close-stream.lo
/libdhcpd_pools_la-c-strcasecmp.lo
/libdhcpd_pools_la-exitfail.lo
/libdhcpd_pools_la-fclose.lo
/libdhcpd_pools_la-fcntl.lo
/libdhcpd_pools_la-fd-hook.lo
/libdhcpd_pools_la-fflush.lo
/libdhcpd_pools_la-float.lo
/libdhcpd_pools_la-fopen.lo
/libdhcpd_pools_la-fpurge.lo
/libdhcpd_pools_la-freading.lo
/libdhcpd_pools_la-fseek.lo
/libdhcpd_pools_la-fseeko.lo
/libdhcpd_pools_la-getprogname.lo
/libdhcpd_pools_la-hard-locale.lo
/libdhcpd_pools_la-ialloc.lo
/libdhcpd_pools_la-localcharset.lo
/libdhcpd_pools_la-malloca.lo
/libdhcpd_pools_la-math.lo
/libdhcpd_pools_la-mbrtoc32.lo
/libdhcpd_pools_la-mbrtowc.lo
/libdhcpd_pools_la-mbszero.lo
/libdhcpd_pools_la-mktime.lo
/libdhcpd_pools_la-nstrftime.lo
/libdhcpd_pools_la-progname.lo
/libdhcpd_pools_la-quotearg.lo
/libdhcpd_pools_la-reallocarray.lo
/libdhcpd_pools_la-realloc.lo
/libdhcpd_pools_la-setlocale_null.lo
/libdhcpd_pools_la-setlocale_null-unlocked.lo
/libdhcpd_pools_la-stat-time.lo
/libdhcpd_pools_la-stdlib.lo
/libdhcpd_pools_la-sys_socket.lo
/libdhcpd_pools_la-timegm.lo
/libdhcpd_pools_la-time_rz.lo
/libdhcpd_pools_la-unistd.lo
/libdhcpd_pools_la-wctype-h.lo
/libdhcpd_pools_la-xalloc-die.lo
/libdhcpd_pools_la-xmalloc.lo
/.libs/
/limits.h
/limits.in.h
/localcharset.c
/localcharset.h
/locale.h
/locale.in.h
/localename.h
/localename-unsafe.c
/localtime-buffer.c
/localtime-buffer.h
/lseek.c
/Makefile.am
/malloc.c
/malloca.c
/malloca.h
/malloc.c
/malloca.valgrind
/math.c
/math.h
/math.in.h
/mbrtoc32.c
/mbrtowc.c
/mbrtowc-impl.h
/mbrtowc-impl-utf8.h
/mbsinit.c
/mbszero.c
/mbtowc-lock.c
/mbtowc-lock.h
/memchr.c
/memchr.valgrind
/minmax.h
/mktime.c
/mktime-internal.h
/mktime.c
/msvc-inval.c
/msvc-inval.h
/msvc-nothrow.c
/msvc-nothrow.h
/netinet_in.in.h
/_Noreturn.h
/nstrftime.c
/open.c
/pathmax.h
/progname.c
/progname.h
/quote.h
/quotearg.c
/quotearg.h
/quote.h
/reallocarray.c
/realloc.c
/ref-add.sed
/ref-add.sin
/ref-del.sed
/ref-del.sin
/setenv.c
/setlocale-lock.c
/setlocale_null.c
/setlocale_null.h
/setlocale_null-unlocked.c
/stat.c
/stat-time.c
/stat-time.h
/stat-w32.c
/stat-w32.h
/stdckdint.h
/stdckdint.in.h
/stddef.h
/stat.c
/stdalign.in.h
/stdbool.in.h
/stddef.in.h
/stdint.in.h
/stdio.h
/stdio-impl.h
/stdio.h
/stdio.in.h
/stdio-read.c
/stdio-write.c
/stdlib.c
/stdlib.h
/stdlib.in.h
/stpncpy.c
/str-two-way.h
/strdup.c
/streq.h
/strerror.c
/strerror-override.c
/strerror-override.h
/strftime.c
/strerror.c
/strftime.h
/string.h
/string.in.h
/stripslash.c
/strstr.c
/strtod.c
/str-two-way.h
/sys/
/sys/socket.h
/sys/stat.h
/sys/types.h
/sys/uio.h
/sys_socket.c
/sys_socket.in.h
/sys_stat.in.h
/sys_types.in.h
/sys_uio.in.h
/timegm.c
/time-internal.h
/time.h
/time.in.h
/time-internal.h
/time_r.c
/time_rz.c
/timegm.c
/tzset.c
/uchar.h
/uchar.in.h
/unictype/
/unictype/bitmap.h
/unictype/ctype_print.c
/unictype/ctype_print.h
/unictype/.gitignore
/unictype.h
/unictype.in.h
/unistd.c
/unistd.h
/unistd.in.h
/unitypes.h
/unitypes.in.h
/unsetenv.c
/unused-parameter.h
/verify.h
/warn-on-use.h
/wchar.h
/wchar.in.h
/wctype.h
/wctype-h.c
/wctype.h
/wctype.in.h
/windows-initguard.h
/xalloc-die.c
/xalloc.h
/xalloc-oversized.h
/xalloc.h
/xmalloc.c

View file

@ -1,5 +1,4 @@
'\" t
.TH DHCPD-POOLS "1" "2024-08-09" "@VERSION@" "User Commands"
.TH DHCPD-POOLS "1" "2017-11-15" "@VERSION@" "User Commands"
.SH NAME
dhcpd-pools \- ISC dhcpd pools usage analysis
.SH SYNOPSIS
@ -157,7 +156,7 @@ printed.
.TP
\fB\-\-color\fR=\fIwhen\fR
Use yellow for warning, red for critical, green for suppressed by \-\-minsize
and blue when \-\-snet\-alarms is the cause of suppression or shared network
and blue when \-\-snet\-alarms is the cause of supression or shared network
does not have any ranges. The
.I when
string can be
@ -184,7 +183,7 @@ can be one of the following:
.IR minsize ,
or
.IR suppressed .
The skipping criteria is exact match with colors in \-\-color option.
The skipping criterias are exact match with colors in \-\-color option.
.TP
\fB\-\-warning\fR=\fIpercent\fR
Turn on alarm output format, and specify percentage number which will

View file

@ -3,9 +3,9 @@
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"
xmlns:foaf="http://xmlns.com/foaf/0.1/">
<Project rdf:about="https://dhcpd-pools.sourceforge.net/">
<Project rdf:about="http://dhcpd-pools.sourceforge.net/">
<name>dhcpd-pools</name>
<homepage rdf:resource="https://dhcpd-pools.sourceforge.net/" />
<homepage rdf:resource="http://dhcpd-pools.sourceforge.net/" />
<shortdesc>This is dhcpd-pools ISC dhcp shared network and pool
range usage analysis tool.</shortdesc>
<description>Purpose of command is to count usage ratio of each

View file

@ -1,6 +1,3 @@
Ethernets:{{#active_lease}}
macaddress: {{macaddress}} ip: {{ip}}{{/active_lease}}
Subnets:{{#subnets}}
location: {{location}}
range: {{range}}
@ -68,9 +65,3 @@ lease_file_epoch_mtime: {{lease_file_epoch_mtime}}
template_file_path: {{template_file_path}}
template_file_local_mtime: {{template_file_local_mtime}}
template_file_epoch_mtime: {{template_file_epoch_mtime}}
number_of_ranges_warning: {{number_of_ranges_warning}}
number_of_ranges_critical: {{number_of_ranges_critical}}
number_of_shared_networks: {{number_of_shared_networks}}
number_of_shared_networks_warning: {{number_of_shared_networks_warning}}
number_of_shared_networks_critical: {{number_of_shared_networks_critical}}

View file

@ -1,11 +1,30 @@
# This mustach template can be used as Prometheus text file.
# https://prometheus.io/
# HELP dhcpd_pools ISC dhcpd statistics
# TYPE dhcpd_pools gauge
{{#subnets}}dhcpd_pools{location="{{location}}",range="{{first_ip}}",used="1"} {{used}} {{gettimeofday}}000
dhcpd_pools{location="{{location}}",range="{{first_ip}}",touched="1"} {{touched}} {{gettimeofday}}000
dhcpd_pools{location="{{location}}",range="{{first_ip}}",defined="1"} {{defined}} {{gettimeofday}}000
dhcpd_pools{location="{{location}}",range="{{first_ip}}",free="1"} {{free}} {{gettimeofday}}000
dhcpd_pools{location="{{location}}",range="{{first_ip}}",touch_count="1"} {{touch_count}} {{gettimeofday}}000
dhcpd_pools{location="{{location}}",range="{{first_ip}}",status="1"} {{status}} {{gettimeofday}}000
# HELP dhcpd_pools_ranges The range statistics.
# TYPE dhcpd_pools_ranges gauge
{{#subnets}}dhcpd_pools_ranges{range="{{first_ip}}",used="1"} {{used}} {{gettimeofday}}000
dhcpd_pools_ranges{range="{{first_ip}}",touched="1"} {{touched}} {{gettimeofday}}000
dhcpd_pools_ranges{range="{{first_ip}}",defined="1"} {{defined}} {{gettimeofday}}000
dhcpd_pools_ranges{range="{{first_ip}}",free="1"} {{free}} {{gettimeofday}}000
dhcpd_pools_ranges{range="{{first_ip}}",touch_count="1"} {{touch_count}} {{gettimeofday}}000
dhcpd_pools_ranges{range="{{first_ip}}",status="1"} {{status}} {{gettimeofday}}000
{{/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}}

View file

@ -84,8 +84,6 @@ void do_counting(struct conf_t *state)
case BACKUP:
range_p->backups++;
break;
default:
abort();
}
}
/* Size of range size. */

View file

@ -89,14 +89,14 @@ static void prepare_memory(struct conf_t *state)
}
/*! \brief The --skip option argument parser. */
static void skip_arg_parse(struct conf_t *state, char *arg)
static void skip_arg_parse(struct conf_t *state, char *optarg)
{
enum {
OPT_ARG_OK = 0,
OPT_ARG_WARNING,
OPT_ARG_CRITICAL,
OPT_ARG_MINSIZE,
OPT_ARG_SUPPRESSED
OPT_ARG_SUPRESSED
};
char *const tokens[] = {
@ -104,13 +104,13 @@ static void skip_arg_parse(struct conf_t *state, char *arg)
[OPT_ARG_WARNING] = "warning",
[OPT_ARG_CRITICAL] = "critical",
[OPT_ARG_MINSIZE] = "minsize",
[OPT_ARG_SUPPRESSED] = "suppressed",
[OPT_ARG_SUPRESSED] = "suppressed",
NULL
};
char *value;
while (*arg != '\0') {
switch (getsubopt(&arg, tokens, &value)) {
while (*optarg != '\0') {
switch (getsubopt(&optarg, tokens, &value)) {
case OPT_ARG_OK:
state->skip_ok = 1;
break;
@ -123,7 +123,7 @@ static void skip_arg_parse(struct conf_t *state, char *arg)
case OPT_ARG_MINSIZE:
state->skip_minsize = 1;
break;
case OPT_ARG_SUPPRESSED:
case OPT_ARG_SUPRESSED:
state->skip_suppressed = 1;
break;
default:
@ -133,7 +133,7 @@ static void skip_arg_parse(struct conf_t *state, char *arg)
}
/*! \brief Command line options parser. */
static void parse_command_line_opts(struct conf_t *state, int argc, char **argv)
static char parse_command_line_opts(struct conf_t *state, int argc, char **argv)
{
enum {
OPT_SNET_ALARMS = CHAR_MAX + 1,
@ -172,6 +172,7 @@ static void parse_command_line_opts(struct conf_t *state, int argc, char **argv)
{"ip-version", required_argument, NULL, OPT_SET_IPV},
{NULL, 0, NULL, 0}
};
char output_format = '\0';
int alarming = 0;
while (1) {
@ -191,17 +192,17 @@ static void parse_command_line_opts(struct conf_t *state, int argc, char **argv)
break;
case 'f':
/* Output format */
state->output_format = optarg[0];
output_format = optarg[0];
break;
case 's':
{
/* Output sorting option */
struct output_sort *p = state->sorts;
char *ptr = optarg;
size_t len;
while (p && p->next)
p = p->next;
while (*ptr) {
for (len = 0; len < strlen(optarg); len++) {
if (state->sorts == NULL) {
state->sorts =
xcalloc(1, sizeof(struct output_sort));
@ -210,7 +211,7 @@ static void parse_command_line_opts(struct conf_t *state, int argc, char **argv)
p->next = xcalloc(1, sizeof(struct output_sort));
p = p->next;
}
p->func = field_selector(*ptr++);
p->func = field_selector(optarg[len]);
}
}
break;
@ -230,8 +231,7 @@ static void parse_command_line_opts(struct conf_t *state, int argc, char **argv)
case OPT_MUSTACH:
#ifdef BUILD_MUSTACH
state->mustach_template = optarg;
state->output_format = 'm';
state->print_mac_addreses = 1;
output_format = 'm';
#else
error(EXIT_FAILURE, 0, "compiled without mustach support");
#endif
@ -312,18 +312,16 @@ static void parse_command_line_opts(struct conf_t *state, int argc, char **argv)
}
/* Output format is not defined, if alarm thresholds are then it's alarming, else use the
* default. */
if (state->output_format == '\0') {
if (output_format == '\0') {
if (alarming == 1)
state->output_format = 'a';
output_format = 'a';
else {
const char *const default_format = OUTPUT_FORMAT;
state->output_format = default_format[0];
output_format = default_format[0];
}
}
if (state->output_format == 'X' || state->output_format == 'J') {
state->print_mac_addreses = 1;
}
return output_format;
}
/*!\brief Start of execution. This will mostly call other functions one
@ -341,28 +339,33 @@ int main(int argc, char **argv)
.warn_count = 0x100000000, /* == 2^32 that is the entire IPv4 space */
.crit_count = 0x100000000, /* basically turns off the count criteria */
.header_limit = 8,
.color_mode = color_auto,
.ranges_size = 64,
.ip_version = IPvUNKNOWN,
.color_mode = color_auto
0
};
char output_format;
int ret_val;
atexit(close_stdout);
set_program_name(argv[0]);
prepare_memory(&state);
set_ipv_functions(&state, IPvUNKNOWN);
parse_command_line_opts(&state, argc, argv);
output_format = parse_command_line_opts(&state, argc, argv);
/* Do the job */
parse_config(&state, 1, state.dhcpdconf_file, state.shared_net_root);
parse_leases(&state);
if (output_format == 'X' || output_format == 'J')
parse_leases(&state, 1);
else
parse_leases(&state, 0);
prepare_data(&state);
do_counting(&state);
if (state.sorts != NULL)
mergesort_ranges(&state, state.ranges, state.num_ranges, NULL, 1);
if (state.reverse_order == 1)
flip_ranges(&state);
ret_val = output_analysis(&state);
ret_val = output_analysis(&state, output_format);
clean_up(&state);
return (ret_val);
}

View file

@ -102,9 +102,6 @@ enum prefix_t {
PREFIX_BINDING_STATE_ACTIVE,
PREFIX_BINDING_STATE_BACKUP,
PREFIX_HARDWARE_ETHERNET,
PREFIX_STARTS,
PREFIX_ENDS,
PREFIX_HOSTNAME,
NUM_OF_PREFIX
};
@ -128,8 +125,8 @@ struct shared_network_t {
double used;
double touched;
double backups;
struct shared_network_t *next;
int netmask;
struct shared_network_t *next;
};
/*! \struct range_t
@ -148,22 +145,12 @@ struct range_t {
* \brief Various per range and shared net temporary calculation results.
*/
struct output_helper_t {
int status;
double range_size;
double percent;
double tc;
double tcp;
double bup;
int status;
};
/*! \struct status_counts_t
* \brief Range and shared network alarming status counts.
*/
struct status_counts_t {
unsigned int warning;
unsigned int critical;
unsigned int ok;
unsigned int ignored;
};
/*! \enum ltype
@ -180,12 +167,9 @@ enum ltype {
*/
struct leases_t {
union ipaddr_t ip; /* ip as key */
enum ltype type;
char *ethernet;
UT_hash_handle hh;
enum ltype type;
char *ends;
char *starts;
char *hostname;
};
/*! \enum limbits
@ -225,11 +209,12 @@ struct conf_t {
struct shared_network_t *shared_net_head; /*!< Last entry in shared network linked list. */
struct range_t *ranges; /*!< Array of ranges. */
unsigned int num_ranges; /*!< Number of ranges in the ranges array. */
enum dhcp_version ip_version; /*!< Designator if the dhcpd is running in IPv4 or IPv6 mode. */
size_t ranges_size; /*!< Size of the ranges array. */
struct leases_t *leases; /*!< An array of individual leases from dhcpd.leases file. */
enum dhcp_version ip_version; /*!< Designator if the dhcpd is running in IPv4 or IPv6 mode. */
const char *dhcpdconf_file; /*!< Path to dhcpd.conf file. */
const char *dhcpdlease_file; /*!< Path to dhcpd.leases file. */
int output_format; /*!< Column to use in color_tags array. */
struct output_sort *sorts; /*!< Linked list how to sort ranges. */
const char *output_file; /*!< Output file path. */
const char *mustach_template; /*!< Mustach template file path. */
@ -238,10 +223,7 @@ struct conf_t {
double warn_count; /*!< Maximum number of free IP's before warning. */
double crit_count; /*!< Maximum number of free IP's before critical. */
double minsize; /*!< Minimum size of range or shared network to be considered exceeding threshold. */
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. */
unsigned int
reverse_order:1, /*!< Reverse sort order. */
backups_found:1, /*!< Indicator if dhcpd.leases file has leases in backup state. */
snet_alarms:1, /*!< Suppress alarming thresholds for ranges that are part of a shared network. */
@ -264,7 +246,7 @@ extern void prepare_data(struct conf_t *state);
extern void do_counting(struct conf_t *state);
/* getdata.c */
extern int parse_leases(struct conf_t *state);
extern int parse_leases(struct conf_t *state, const int print_mac_addreses);
extern void parse_config(struct conf_t *state, const int is_include,
const char *restrict config_file,
struct shared_network_t *restrict shared_p);
@ -291,7 +273,7 @@ extern void set_ipv_functions(struct conf_t *state, int version);
extern void flip_ranges(struct conf_t *state);
extern void clean_up(struct conf_t *state);
extern void parse_cidr(struct conf_t *state, struct range_t *range_p, const char *word);
extern int parse_color_mode(const char *restrict arg);
extern int parse_color_mode(const char *restrict optarg);
extern double strtod_or_err(const char *restrict str, const char *restrict errmesg);
extern void __attribute__ ((noreturn)) print_version(void);
extern void __attribute__ ((noreturn)) usage(int status);
@ -331,9 +313,7 @@ extern int range_output_helper(struct conf_t *state, struct output_helper_t *oh,
struct range_t *range_p);
extern int shnet_output_helper(struct conf_t *state, struct output_helper_t *oh,
struct shared_network_t *shared_p);
extern int output_analysis(struct conf_t *state);
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);
extern int output_analysis(struct conf_t *state, const char output_format);
/* sort.c */
extern void mergesort_ranges(struct conf_t *state,

View file

@ -43,7 +43,6 @@
#include <ctype.h>
#include <errno.h>
#include <fcntl.h>
#include <limits.h>
#include <netinet/in.h>
#include <stddef.h>
#include <stdint.h>
@ -80,11 +79,12 @@ enum isc_conf_parser {
/*! \brief Lease file parser. The parser can only read ISC DHCPD
* dhcpd.leases file format. */
int parse_leases(struct conf_t *state)
int parse_leases(struct conf_t *state, const int print_mac_addreses)
{
FILE *dhcpd_leases;
char *line, *ipstring, macstring[20], *stop, endsstr[30], startsstr[30], hostnamestr[MAXLEN];
char *line, *ipstring, macstring[20], *stop;
union ipaddr_t addr;
struct stat lease_file_stats;
struct leases_t *lease;
dhcpd_leases = fopen(state->dhcpdlease_file, "r");
@ -96,13 +96,16 @@ int parse_leases(struct conf_t *state)
error(EXIT_FAILURE, errno, "parse_leases: fadvise %s", state->dhcpdlease_file);
# endif /* POSIX_FADV_SEQUENTIAL */
#endif /* HAVE_POSIX_FADVISE */
/* I found out that there's one lease address per 300 bytes in
* dhcpd.leases file. Malloc is little bit pessimistic and uses 250.
* If someone has higher density in lease file I'm interested to
* hear about that. */
if (stat(state->dhcpdlease_file, &lease_file_stats))
error(EXIT_FAILURE, errno, "parse_leases: %s", state->dhcpdlease_file);
line = xmalloc(sizeof(char) * MAXLEN);
line[0] = '\0';
ipstring = xmalloc(sizeof(char) * MAXLEN);
ipstring[0] = '\0';
endsstr[0] = '\0';
startsstr[0] = '\0';
hostnamestr[0] = '\0';
while (!feof(dhcpd_leases)) {
if (!fgets(line, MAXLEN, dhcpd_leases) && ferror(dhcpd_leases))
error(EXIT_FAILURE, errno, "parse_leases: %s", state->dhcpdlease_file);
@ -141,39 +144,12 @@ int parse_leases(struct conf_t *state)
state->backups_found = 1;
break;
case PREFIX_HARDWARE_ETHERNET:
if (state->print_mac_addreses == 0)
if (print_mac_addreses == 0)
break;
memcpy(macstring, line + 20, 17);
macstring[17] = '\0';
if ((lease = find_lease(state, &addr)) != NULL) {
if ((lease = find_lease(state, &addr)) != NULL)
lease->ethernet = xstrdup(macstring);
lease->starts = xstrdup(startsstr);
startsstr[0] = '\0';
lease->ends = xstrdup(endsstr);
endsstr[0] = '\0';
}
break;
case PREFIX_ENDS:
if (state->print_mac_addreses == 0)
break;
strncpy(endsstr, line + 7, sizeof(endsstr)-1);
endsstr[strlen(endsstr)-2] = '\0';
break;
case PREFIX_STARTS:
if (state->print_mac_addreses == 0)
break;
strncpy(startsstr, line + 9, sizeof(startsstr)-1);
startsstr[strlen(startsstr)-2] = '\0';
break;
case PREFIX_HOSTNAME:
if (state->print_mac_addreses == 0)
break;
strncpy(hostnamestr, line + 19, sizeof(hostnamestr)-1);
hostnamestr[strlen(hostnamestr)-3] = '\0';
if ((lease = find_lease(state, &addr)) != NULL) {
lease->hostname = xstrdup(hostnamestr);
}
hostnamestr[0] = '\0';
break;
default:
/* do nothing */ ;
@ -241,14 +217,8 @@ void parse_config(struct conf_t *state, const int is_include, const char *restri
shared_p->name = state->shared_net_root->name;
/* Open configuration file */
dhcpd_config = fopen(config_file, "r");
if (dhcpd_config == NULL) {
if (is_include) {
error(0, errno, "cannot open inlude: %s", config_file);
return;
}
/* config if from command line, just exit with error */
if (dhcpd_config == NULL)
error(EXIT_FAILURE, errno, "parse_config: %s", config_file);
}
#ifdef HAVE_POSIX_FADVISE
# ifdef POSIX_FADV_SEQUENTIAL
if (posix_fadvise(fileno(dhcpd_config), 0, 0, POSIX_FADV_SEQUENTIAL) != 0)
@ -257,11 +227,9 @@ void parse_config(struct conf_t *state, const int is_include, const char *restri
#endif /* HAVE_POSIX_FADVISE */
/* Very hairy stuff begins. */
while (unlikely(!feof(dhcpd_config))) {
int c;
char c;
c = fgetc(dhcpd_config);
if (CHAR_MAX < c)
continue;
/* Certain characters are magical */
switch (c) {
/* Handle comments if they are not quoted */
@ -356,7 +324,7 @@ void parse_config(struct conf_t *state, const int is_include, const char *restri
/* Save to word which clause this is. */
if ((newclause == 1 || argument != ITS_NOTHING_INTERESTING)
&& (!isspace(c) || 0 < quote)) {
word[i] = (char) c;
word[i] = c;
i++;
/* Long word which is almost causing overflow. None
* of words are this long which the program is
@ -416,7 +384,7 @@ void parse_config(struct conf_t *state, const int is_include, const char *restri
newclause = 1;
break;
case ITS_A_RANGE_FIRST_IP:
/* printf ("range 1st ip: %s\n", word); */
/* printf ("range 1nd ip: %s\n", word); */
range_p = state->ranges + state->num_ranges;
if (!(parse_ipaddr(state, word, &addr)))
/* word was not ip, try again */

View file

@ -66,9 +66,6 @@ void add_lease_v4(struct conf_t *state, union ipaddr_t *addr, enum ltype type)
l->type = type;
HASH_ADD_INT(state->leases, ip.v4, l);
l->ethernet = NULL;
l->ends = NULL;
l->starts = NULL;
l->hostname = NULL;
}
void add_lease_v6(struct conf_t *state, union ipaddr_t *addr, enum ltype type)
@ -80,9 +77,6 @@ void add_lease_v6(struct conf_t *state, union ipaddr_t *addr, enum ltype type)
l->type = type;
HASH_ADD_V6(state->leases, ip.v6, l);
l->ethernet = NULL;
l->ends = NULL;
l->starts = NULL;
l->hostname = NULL;
}
/*! \brief Find pointer to lease from hash array.
@ -116,9 +110,6 @@ struct leases_t *find_lease_v6(struct conf_t *state, union ipaddr_t *addr)
void delete_lease(struct conf_t *state, struct leases_t *lease)
{
free(lease->ethernet);
free(lease->ends);
free(lease->starts);
free(lease->hostname);
HASH_DEL(state->leases, lease);
free(lease);
}
@ -131,9 +122,6 @@ void delete_all_leases(struct conf_t *state)
HASH_ITER(hh, state->leases, l, tmp) {
free(l->ethernet);
free(l->ends);
free(l->starts);
free(l->hostname);
HASH_DEL(state->leases, l);
free(l);
}
@ -146,9 +134,6 @@ void delete_all_leases(struct conf_t *state)
l = state->leases;
free(l->ethernet);
free(l->ends);
free(l->starts);
free(l->hostname);
HASH_DEL(state->leases, l); /* leases advances to next on delete */
free(l);
}

View file

@ -58,12 +58,10 @@
*/
struct expl {
struct conf_t *state;
struct leases_t *lease_p;
struct range_t *range_p;
struct shared_network_t *shnet_p;
struct output_helper_t oh;
int current;
uint32_t pad;
};
static int must_enter(void *closure, const char *name);
@ -83,45 +81,21 @@ static int must_put_base(void *closure, const char *name, int escape
fprintf(file, "%u", e->state->num_ranges);
return 0;
}
if (!strcmp(name, "number_of_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")) {
uint32_t num = 0;
struct shared_network_t *shared_p;
static uint32_t num = 0xffffffff;
for (shared_p = e->state->shared_net_root->next; shared_p;
shared_p = shared_p->next) {
num++;
if (num == 0xffffffff) {
/* Use of static num ensures this is done only once. */
struct shared_network_t *shared_p;
num = 0;
for (shared_p = e->state->shared_net_root->next; shared_p;
shared_p = shared_p->next)
num++;
}
fprintf(file, "%u", num);
return 0;
}
if (!strcmp(name, "number_of_shared_networks_warning")) {
struct status_counts_t stat = { 0 };
shared_net_alarms(e->state, &stat);
fprintf(file, "%u", stat.warning);
return 0;
}
if (!strcmp(name, "number_of_shared_networks_critical")) {
struct status_counts_t stat = { 0 };
shared_net_alarms(e->state, &stat);
fprintf(file, "%u", stat.critical);
return 0;
}
if (!strcmp(name, "version")) {
fprintf(file, "%s", PACKAGE_VERSION);
return 0;
@ -179,36 +153,6 @@ static struct mustach_itf itf = {
.leave = must_leave
};
/*! \brief Mustach active lease aka {{#active_lease}} tag parser and printer. */
static int must_put_active_lease(void *closure, const char *name, int escape
__attribute__((unused)), FILE *file)
{
struct expl *e = closure;
if (!strcmp(name, "ip")) {
fprintf(file, "%s", ntop_ipaddr(&e->lease_p->ip));
return 0;
}
if (!strcmp(name, "macaddress")) {
fprintf(file, "%s", e->lease_p->ethernet);
return 0;
}
error(EXIT_FAILURE, 0, "mustach_dhcpd_pools: fmustach: unexpected tag: %s", name);
return 1;
}
/*! \brief A function to move to next lease when {{/active_lease}} is encountered. */
static int must_next_active_lease(void *closure)
{
struct expl *e = closure;
e->lease_p = e->lease_p->hh.next;
if (e->lease_p == NULL)
return 0;
return 1;
}
/*! \brief Mustach range aka {{#subnets}} tag parser and printer. */
static int must_put_range(void *closure, const char *name, int escape
__attribute__ ((unused)), FILE *file)
@ -390,13 +334,6 @@ static int must_enter(void *closure, const char *name)
{
struct expl *e = closure;
if (!strcmp(name, "active_lease")) {
itf.put = must_put_active_lease;
itf.next = must_next_active_lease;
e->current = 0;
e->lease_p = e->state->leases;
return must_next_active_lease(closure);
}
if (!strcmp(name, "subnets")) {
itf.put = must_put_range;
itf.next = must_next_range;
@ -425,7 +362,7 @@ static int must_enter(void *closure, const char *name)
return 1;
}
/*! \brief Function that is called when all elements within a print loop are outputted. */
/*! \brief Function that is called when all elements within a print loop are outputed. */
static int must_leave(void *closure)
{
struct expl *e = closure;
@ -503,7 +440,7 @@ int mustach_dhcpd_pools(struct conf_t *state)
case MUSTACH_ERROR_BAD_SEPARATORS:
error(EXIT_FAILURE, 0, "mustach_dhcpd_pools: fmustach: bad separator");
break;
case MUSTACH_ERROR_TOO_DEEP:
case MUSTACH_ERROR_TOO_DEPTH:
error(EXIT_FAILURE, 0, "mustach_dhcpd_pools: fmustach: too deep");
break;
case MUSTACH_ERROR_CLOSING:

View file

@ -8,7 +8,7 @@
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
https://www.apache.org/licenses/LICENSE-2.0
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
@ -19,8 +19,6 @@
#define _GNU_SOURCE
#include "config.h"
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
@ -32,76 +30,6 @@
#define NAME_LENGTH_MAX 1024
#define DEPTH_MAX 256
#if !defined(NO_OPEN_MEMSTREAM)
static FILE *memfile_open(char **buffer, size_t *size)
{
return open_memstream(buffer, size);
}
static void memfile_abort(FILE *file, char **buffer, size_t *size)
{
fclose(file);
free(*buffer);
*buffer = NULL;
*size = 0;
}
static int memfile_close(FILE *file, char **buffer, size_t *size)
{
int rc;
/* adds terminating null */
rc = fputc(0, file) ? MUSTACH_ERROR_SYSTEM : 0;
fclose(file);
if (rc == 0)
/* removes terminating null of the length */
(*size)--;
else {
free(*buffer);
*buffer = NULL;
*size = 0;
}
return rc;
}
#else
static FILE *memfile_open(char **buffer, size_t *size)
{
return tmpfile();
}
static void memfile_abort(FILE *file, char **buffer, size_t *size)
{
fclose(file);
*buffer = NULL;
*size = 0;
}
static int memfile_close(FILE *file, char **buffer, size_t *size)
{
int rc;
size_t s;
char *b;
s = (size_t)ftell(file);
b = malloc(s + 1);
if (b == NULL) {
rc = MUSTACH_ERROR_SYSTEM;
errno = ENOMEM;
s = 0;
} else {
rewind(file);
if (1 == fread(b, s, 1, file)) {
rc = 0;
b[s] = 0;
} else {
rc = MUSTACH_ERROR_SYSTEM;
free(b);
b = NULL;
s = 0;
}
}
*buffer = b;
*size = s;
return rc;
}
#endif
static int getpartial(struct mustach_itf *itf, void *closure, const char *name, char **result)
{
int rc;
@ -109,22 +37,26 @@ static int getpartial(struct mustach_itf *itf, void *closure, const char *name,
size_t size;
*result = NULL;
file = memfile_open(result, &size);
file = open_memstream(result, &size);
if (file == NULL)
rc = MUSTACH_ERROR_SYSTEM;
else {
rc = itf->put(closure, name, 0, file);
if (rc < 0)
memfile_abort(file, result, &size);
else
rc = memfile_close(file, result, &size);
if (rc == 0)
/* adds terminating null */
rc = fputc(0, file) ? MUSTACH_ERROR_SYSTEM : 0;
fclose(file);
if (rc < 0) {
free(*result);
*result = NULL;
}
}
return rc;
}
static int process(const char *template, struct mustach_itf *itf, void *closure, FILE *file, const char *opstr, const char *clstr)
{
char name[NAME_LENGTH_MAX + 1], *partial, c, *tmp;
char name[NAME_LENGTH_MAX + 1], *partial, c;
const char *beg, *term;
struct { const char *name, *again; size_t length; int emit, entered; } stack[DEPTH_MAX];
size_t oplen, cllen, len, l;
@ -180,10 +112,8 @@ static int process(const char *template, struct mustach_itf *itf, void *closure,
default:
while (len && isspace(beg[0])) { beg++; len--; }
while (len && isspace(beg[len-1])) len--;
#if defined(NO_EXTENSION_FOR_MUSTACH) || defined(NO_ALLOW_EMPTY_TAG)
if (len == 0)
return MUSTACH_ERROR_EMPTY_TAG;
#endif
if (len > NAME_LENGTH_MAX)
return MUSTACH_ERROR_TAG_TOO_LONG;
memcpy(name, beg, len);
@ -204,25 +134,19 @@ static int process(const char *template, struct mustach_itf *itf, void *closure,
for (l = 0; l < len && !isspace(beg[l]) ; l++);
if (l == len)
return MUSTACH_ERROR_BAD_SEPARATORS;
oplen = l;
tmp = alloca(oplen + 1);
memcpy(tmp, beg, oplen);
tmp[oplen] = 0;
opstr = tmp;
opstr = strndupa(beg, l);
while (l < len && isspace(beg[l])) l++;
if (l == len)
return MUSTACH_ERROR_BAD_SEPARATORS;
cllen = len - l;
tmp = alloca(cllen + 1);
memcpy(tmp, beg + l, cllen);
tmp[cllen] = 0;
clstr = tmp;
clstr = strndupa(beg + l, len - l);
oplen = strlen(opstr);
cllen = strlen(clstr);
break;
case '^':
case '#':
/* begin section */
if (depth == DEPTH_MAX)
return MUSTACH_ERROR_TOO_DEEP;
return MUSTACH_ERROR_TOO_DEPTH;
rc = emit;
if (rc) {
rc = itf->enter(closure, name);
@ -310,15 +234,24 @@ int mustach(const char *template, struct mustach_itf *itf, void *closure, char *
*result = NULL;
if (size == NULL)
size = &s;
file = memfile_open(result, size);
if (file == NULL)
file = open_memstream(result, size);
if (file == NULL) {
rc = MUSTACH_ERROR_SYSTEM;
else {
errno = ENOMEM;
} else {
rc = fmustach(template, itf, closure, file);
if (rc < 0)
memfile_abort(file, result, size);
else
rc = memfile_close(file, result, size);
if (rc == 0)
/* adds terminating null */
rc = fputc(0, file) ? MUSTACH_ERROR_SYSTEM : 0;
fclose(file);
if (rc >= 0)
/* removes terminating null of the length */
(*size)--;
else {
free(*result);
*result = NULL;
*size = 0;
}
}
return rc;
}

View file

@ -8,7 +8,7 @@
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
https://www.apache.org/licenses/LICENSE-2.0
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
@ -29,17 +29,12 @@
*
* The functions enter and next should return 0 or 1.
*
* 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.
* All other functions should normally return 0.
*
* @start: Starts the mustach processing of the closure
* 'start' is optional (can be NULL)
*
* @put: Writes the value of 'name' to 'file' with 'escape' or not
* As an extension (see NO_ALLOW_EMPTY_TAG), the 'name' can be
* the empty string. In that later case an implemntation can
* return MUSTACH_ERROR_EMPTY_TAG to refuse empty names.
*
* @enter: Enters the section of 'name' if possible.
* Musts return 1 if entered or 0 if not entered.
@ -69,13 +64,10 @@ struct mustach_itf {
#define MUSTACH_ERROR_EMPTY_TAG -3
#define MUSTACH_ERROR_TAG_TOO_LONG -4
#define MUSTACH_ERROR_BAD_SEPARATORS -5
#define MUSTACH_ERROR_TOO_DEEP -6
#define MUSTACH_ERROR_TOO_DEPTH -6
#define MUSTACH_ERROR_CLOSING -7
#define MUSTACH_ERROR_BAD_UNESCAPE_TAG -8
/* compatibility with older bad name */
#define MUSTACH_ERROR_TOO_DEPTH MUSTACH_ERROR_TOO_DEEP
/**
* fmustach - Renders the mustache 'template' in 'file' for 'itf' and 'closure'.
*

View file

@ -58,7 +58,7 @@
#include "dhcpd-pools.h"
static char *(*cidr_last) (union ipaddr_t *restrict addr, const int mask);
char *(*cidr_last) (union ipaddr_t *restrict addr, const int mask);
static char *cidr_last_v4(union ipaddr_t *restrict addr, const int mask);
static char *cidr_last_v6(union ipaddr_t *restrict addr, const int mask);
@ -298,7 +298,7 @@ const char *ntop_ipaddr_init(const union ipaddr_t *ip __attribute__ ((unused)))
const char *ntop_ipaddr_v4(const union ipaddr_t *ip)
{
static char buffer[INET_ADDRSTRLEN];
static char buffer[sizeof("255.255.255.255")];
struct in_addr addr;
addr.s_addr = htonl(ip->v4);
@ -307,7 +307,7 @@ const char *ntop_ipaddr_v4(const union ipaddr_t *ip)
const char *ntop_ipaddr_v6(const union ipaddr_t *ip)
{
static char buffer[INET6_ADDRSTRLEN];
static char buffer[sizeof("ffff:ffff:ffff:ffff:ffff:ffff:255.255.255.255")];
struct in6_addr addr;
memcpy(addr.s6_addr, ip->v6, sizeof(addr.s6_addr));
@ -411,18 +411,10 @@ int
if (!memcmp(" hardware ethernet", str, 19))
return PREFIX_HARDWARE_ETHERNET;
break;
default:
break;
}
}
if (!memcmp("lease ", str, 6))
return PREFIX_LEASE;
else if (!memcmp(" starts ", str, 9))
return PREFIX_STARTS;
else if (!memcmp(" ends ", str, 7))
return PREFIX_ENDS;
else if (!memcmp(" client-hostname ", str, 18))
return PREFIX_HOSTNAME;
return NUM_OF_PREFIX;
}
@ -472,18 +464,10 @@ int
if (!memcmp(" hardware ethernet", str, 19))
return PREFIX_HARDWARE_ETHERNET;
break;
default:
break;
}
}
if (!memcmp(" iaaddr ", str, 9))
return PREFIX_LEASE;
else if (!memcmp(" starts ", str, 9))
return PREFIX_STARTS;
else if (!memcmp(" ends ", str, 7))
return PREFIX_ENDS;
else if (!memcmp(" client-hostname ", str, 18))
return PREFIX_HOSTNAME;
return NUM_OF_PREFIX;
}
@ -492,13 +476,13 @@ int
* \param Color mode string.
* \return color mode enum.
*/
int parse_color_mode(const char *restrict arg)
int parse_color_mode(const char *restrict optarg)
{
if (!strcmp(arg, "always"))
if (!strcmp(optarg, "always"))
return color_on;
if (!strcmp(arg, "auto"))
if (!strcmp(optarg, "auto"))
return color_auto;
if (!strcmp(arg, "never"))
if (!strcmp(optarg, "never"))
return color_off;
return color_unknown;
}
@ -563,23 +547,31 @@ void clean_up(struct conf_t *state)
}
/*! \brief Print a time stamp of a path or now to output file. */
void dp_time_tool(FILE *file, const char *path, const int epoch)
void dp_time_tool(FILE *file, const char *path, int epoch)
{
struct stat st;
time_t t;
/* a file or now */
if (path) {
struct stat st;
if (path)
stat(path, &st);
else
clock_gettime(CLOCK_REALTIME, &st.st_mtim);
t = st.st_mtime;
} else
t = time(NULL);
/* epoc or iso time stamp */
if (epoch)
fprintf(file, "%ld", st.st_mtim.tv_sec);
fprintf(file, "%ld", t);
else {
char time_stamp[64];
const time_t mtime = st.st_mtim.tv_sec;
struct tm tm;
int len;
localtime_r(&mtime, &tm);
strftime(time_stamp, sizeof(time_stamp), "%FT%T%z", &tm);
localtime_r(&t, &tm);
len = snprintf(time_stamp, sizeof(time_stamp), "%4d-%.2d-%.2dT%02d:%02d:%02d",
tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday,
tm.tm_hour, tm.tm_min, tm.tm_sec);
strftime(time_stamp + len, sizeof(time_stamp) - len, "%z", &tm);
fprintf(file, "%s", time_stamp);
}
}

View file

@ -82,7 +82,7 @@ enum count_status_t {
};
/*! \var color_tags
* \brief Array of strings that make colors to start and end in different
* \brief Array of stings that make colors to start and end in different
* schemas per array column. */
static const char *color_tags[][NUM_OF_OUT_FORMS] = {
[STATUS_OK] = { "", "" },
@ -158,11 +158,11 @@ int shnet_output_helper(struct conf_t *state, struct output_helper_t *oh,
oh->status = STATUS_IGNORED;
if (state->skip_minsize)
return 1;
} else if (state->critical < oh->percent && (shared_p->available - shared_p->used) < state->crit_count) {
} else if (state->critical < oh->percent && shared_p->used < state->crit_count) {
oh->status = STATUS_CRIT;
if (state->skip_critical)
return 1;
} else if (state->warning < oh->percent && (shared_p->available - shared_p->used) < state->warn_count) {
} else if (state->warning < oh->percent && shared_p->used < state->warn_count) {
oh->status = STATUS_WARN;
if (state->skip_warning)
return 1;
@ -182,7 +182,7 @@ static int start_color(struct conf_t *state, struct output_helper_t *oh, FILE *o
if (oh->status == STATUS_OK) {
return 0;
}
fputs(color_tags[oh->status][state->color_format], outfile);
fputs(color_tags[oh->status][state->output_format], outfile);
return 1;
}
@ -219,6 +219,7 @@ static void close_outfile(FILE *outfile)
/*! \brief Text output format, which is the default. */
static int output_txt(struct conf_t *state)
{
unsigned int i;
struct range_t *range_p;
struct shared_network_t *shared_p;
struct output_helper_t oh;
@ -248,7 +249,6 @@ static int output_txt(struct conf_t *state)
fprintf(outfile, "\n");
}
if (state->number_limit & R_BIT) {
unsigned int i;
for (i = 0; i < state->num_ranges; i++) {
int color_set = 0;
@ -282,7 +282,7 @@ static int output_txt(struct conf_t *state)
fprintf(outfile, "%7g %8.3f", range_p->backups, oh.bup);
}
if (color_set)
fputs(color_tags[COLOR_RESET][state->color_format], outfile);
fputs(color_tags[COLOR_RESET][state->output_format], outfile);
fprintf(outfile, "\n");
range_p++;
}
@ -320,7 +320,7 @@ static int output_txt(struct conf_t *state)
fprintf(outfile, "%7g %8.3f", shared_p->backups, oh.bup);
}
if (color_set)
fputs(color_tags[COLOR_RESET][state->color_format], outfile);
fputs(color_tags[COLOR_RESET][state->output_format], outfile);
fprintf(outfile, "\n");
}
}
@ -356,7 +356,7 @@ static int output_txt(struct conf_t *state)
fprintf(outfile, "%7g %8.3f", state->shared_net_root->backups, oh.bup);
}
if (color_set)
fputs(color_tags[COLOR_RESET][state->color_format], outfile);
fputs(color_tags[COLOR_RESET][state->output_format], outfile);
fprintf(outfile, "\n");
}
close_outfile(outfile);
@ -364,8 +364,9 @@ static int output_txt(struct conf_t *state)
}
/*! \brief The xml output formats. */
static int output_xml(struct conf_t *state)
static int output_xml(struct conf_t *state, const int print_mac_addreses)
{
unsigned int i;
struct range_t *range_p;
struct shared_network_t *shared_p;
struct output_helper_t oh;
@ -376,7 +377,7 @@ static int output_xml(struct conf_t *state)
fprintf(outfile, "<dhcpstatus>\n");
if (state->print_mac_addreses) {
if (print_mac_addreses == 1) {
struct leases_t *l;
for (l = state->leases; l != NULL; l = l->hh.next) {
@ -387,25 +388,12 @@ static int output_xml(struct conf_t *state)
if (l->ethernet != NULL) {
fputs(l->ethernet, 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);
fputs("</macaddress>\n</active_lease>\n", outfile);
}
}
}
if (state->number_limit & R_BIT) {
unsigned int i;
for (i = 0; i < state->num_ranges; i++) {
if (range_output_helper(state, &oh, range_p)) {
range_p++;
@ -461,7 +449,7 @@ static int output_xml(struct conf_t *state)
}
/*! \brief The json output formats. */
static int output_json(struct conf_t *state)
static int output_json(struct conf_t *state, const int print_mac_addreses)
{
unsigned int i = 0;
struct range_t *range_p;
@ -476,7 +464,7 @@ static int output_json(struct conf_t *state)
fprintf(outfile, "{\n");
if (state->print_mac_addreses) {
if (print_mac_addreses == 1) {
struct leases_t *l;
fprintf(outfile, " \"active_leases\": [");
@ -493,18 +481,6 @@ static int output_json(struct conf_t *state)
if (l->ethernet != NULL) {
fputs(l->ethernet, outfile);
}
fputs("\", \"starts\":\"", outfile);
if (l->starts != NULL) {
fputs(l->starts, outfile);
}
fputs("\", \"ends\":\"", outfile);
if (l->ends != NULL) {
fputs(l->ends, outfile);
}
fputs("\", \"hostname\":\"", outfile);
if (l->hostname != NULL) {
fputs(l->hostname, outfile);
}
fputs("\" }", outfile);
}
}
@ -611,15 +587,9 @@ static int output_json(struct conf_t *state)
fprintf(outfile, " \"touched\":%g,\n", state->shared_net_root->touched);
fprintf(outfile, " \"free\":%g,\n",
state->shared_net_root->available - state->shared_net_root->used);
if (fpclassify(state->shared_net_root->available) == FP_ZERO)
fprintf(outfile, " \"percent\":\"%g\",\n", oh.percent);
else
fprintf(outfile, " \"percent\":%g,\n", oh.percent);
fprintf(outfile, " \"percent\":%g,\n", oh.percent);
fprintf(outfile, " \"touch_count\":%g,\n", oh.tc);
if (fpclassify(state->shared_net_root->available) == FP_ZERO)
fprintf(outfile, " \"touch_percent\":\"%g\",\n", oh.tcp);
else
fprintf(outfile, " \"touch_percent\":%g,\n", oh.tcp);
fprintf(outfile, " \"touch_percent\":%g,\n", oh.tcp);
if (state->backups_found == 1) {
fprintf(outfile, " \"backup_count\":%g,\n",
state->shared_net_root->backups);
@ -658,8 +628,8 @@ static void html_header(struct conf_t *state, FILE *restrict f)
fprintf(f, "<meta charset=\"utf-8\">\n");
fprintf(f, "<meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n");
fprintf(f, "<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n");
fprintf(f, "<link rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css\" type=\"text/css\">\n");
fprintf(f, "<link rel=\"stylesheet\" type=\"text/css\" href=\"https://cdn.datatables.net/v/dt/dt-2.2.2/datatables.min.css\">\n");
fprintf(f, "<link rel=\"stylesheet\" href=\"https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css\" type=\"text/css\">\n");
fprintf(f, "<link rel=\"stylesheet\" type=\"text/css\" href=\"https://cdn.datatables.net/v/bs/jq-3.2.1/dt-1.10.16/datatables.min.css\">\n");
fprintf(f, "<style type=\"text/css\">\n");
fprintf(f, "table.dhcpd-pools th { text-transform: capitalize }\n");
fprintf(f, "</style>\n");
@ -682,8 +652,8 @@ static void html_footer(FILE *restrict f)
fprintf(f, "<small>Generated using %s<br />\n", PACKAGE_STRING);
fprintf(f, "More info at <a href=\"%s\">%s</a>\n", PACKAGE_URL, PACKAGE_URL);
fprintf(f, "</small></div></div>\n");
fprintf(f, "<script src=\"https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.min.js\" type=\"text/javascript\"></script>\n");
fprintf(f, "<script type=\"text/javascript\" src=\"https://cdn.datatables.net/v/dt/dt-2.2.2/datatables.min.js\"></script>\n");
fprintf(f, "<script src=\"https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js\" type=\"text/javascript\"></script>\n");
fprintf(f, "<script type=\"text/javascript\" src=\"https://cdn.datatables.net/v/bs/jq-3.2.1/dt-1.10.16/datatables.min.js\"></script>\n");
fprintf(f, "<script type=\"text/javascript\" class=\"init\">$(document).ready(function() { $('#s').DataTable({ \"iDisplayLength\": 50, \"lengthMenu\": [ [25, 50, 100, -1], [25, 50, 100, \"All\"] ], \"order\": [[ 4, \"desc\" ]] } ); } );</script>\n");
fprintf(f, "<script type=\"text/javascript\" class=\"init\">$(document).ready(function() { $('#r').DataTable({ \"iDisplayLength\": 100, \"lengthMenu\": [ [25, 50, 100, -1], [25, 50, 100, \"All\"] ], \"order\": [[ 6, \"desc\" ]] } ); } );</script>\n");
fprintf(f, "</body></html>\n");
@ -756,7 +726,7 @@ static void output_double_color(struct conf_t *state,
* \param type HTML tag name.
* \param fl Actual payload of the printout.
*/
static void output_float(FILE *restrict f, char const *restrict type, double fl)
static void output_float(FILE *restrict f, char const *restrict type, float fl)
{
fprintf(f, "<%s>%.3f</%s>\n", type, fl, type);
}
@ -792,6 +762,7 @@ static void newsection(FILE *restrict f, char const *restrict title)
/*! \brief Output html format. */
static int output_html(struct conf_t *state)
{
unsigned int i;
struct range_t *range_p;
struct shared_network_t *shared_p;
struct output_helper_t oh;
@ -906,7 +877,6 @@ static int output_html(struct conf_t *state)
end_tag(outfile, "thead");
}
if (state->number_limit & R_BIT) {
unsigned int i;
start_tag(outfile, "tbody");
for (i = 0; i < state->num_ranges; i++) {
if (range_output_helper(state, &oh, range_p)) {
@ -946,6 +916,7 @@ static int output_html(struct conf_t *state)
/*! \brief Output cvs format. */
static int output_csv(struct conf_t *state)
{
unsigned int i;
struct range_t *range_p;
struct shared_network_t *shared_p;
struct output_helper_t oh;
@ -964,7 +935,6 @@ static int output_csv(struct conf_t *state)
fprintf(outfile, "\n");
}
if (state->number_limit & R_BIT) {
unsigned int i;
for (i = 0; i < state->num_ranges; i++) {
if (range_output_helper(state, &oh, range_p)) {
range_p++;
@ -1054,11 +1024,19 @@ static int output_csv(struct conf_t *state)
return 0;
}
void range_alarms(struct conf_t *state, struct status_counts_t *rangstat)
/*! \brief Output alarm text, and return program exit value. */
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 range_t *range_p = state->ranges;
unsigned int i;
int rw = 0, rc = 0, ro = 0, ri = 0, sw = 0, sc = 0, so = 0, si = 0;
int ret_val;
outfile = open_outfile(state);
range_p = state->ranges;
if (state->number_limit & R_BIT) {
for (i = 0; i < state->num_ranges; i++) {
@ -1067,16 +1045,16 @@ void range_alarms(struct conf_t *state, struct status_counts_t *rangstat)
case STATUS_SUPPRESSED:
break;
case STATUS_IGNORED:
rangstat->ignored++;
ri++;
break;
case STATUS_CRIT:
rangstat->critical++;
rc++;
break;
case STATUS_WARN:
rangstat->warning++;
rw++;
break;
case STATUS_OK:
rangstat->ok++;
ro++;
break;
default:
abort();
@ -1084,13 +1062,6 @@ void range_alarms(struct conf_t *state, struct status_counts_t *rangstat)
range_p++;
}
}
}
void shared_net_alarms(struct conf_t *state, struct status_counts_t *sharstat)
{
struct output_helper_t oh;
struct shared_network_t *shared_p;
if (state->number_limit & S_BIT) {
for (shared_p = state->shared_net_root->next; shared_p; shared_p = shared_p->next) {
shnet_output_helper(state, &oh, shared_p);
@ -1098,51 +1069,35 @@ void shared_net_alarms(struct conf_t *state, struct status_counts_t *sharstat)
case STATUS_SUPPRESSED:
break;
case STATUS_IGNORED:
sharstat->ignored++;
si++;
break;
case STATUS_CRIT:
sharstat->critical++;
sc++;
break;
case STATUS_WARN:
sharstat->warning++;
sw++;
break;
case STATUS_OK:
sharstat->ok++;
so++;
break;
default:
abort();
}
}
}
}
/*! \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)
if (sc || rc)
ret_val = STATE_CRITICAL;
else if (rangstat.warning || sharstat.warning)
else if (sw || rw)
ret_val = STATE_WARNING;
else
ret_val = STATE_OK;
if ((0 < rangstat.critical && state->number_limit & R_BIT)
|| (0 < sharstat.critical && state->number_limit & S_BIT)) {
if ((0 < rc && state->number_limit & R_BIT)
|| (0 < sc && state->number_limit & S_BIT)) {
fprintf(outfile, "CRITICAL: %s:", program_name);
} else if ((0 < rangstat.warning && state->number_limit & R_BIT)
|| (0 < sharstat.warning && state->number_limit & S_BIT)) {
} else if ((0 < rw && state->number_limit & R_BIT)
|| (0 < sw && state->number_limit & S_BIT)) {
fprintf(outfile, "WARNING: %s:", program_name);
} else {
if (state->number_limit & A_BIT)
@ -1155,21 +1110,17 @@ static int output_alarming(struct conf_t *state)
}
}
if (state->header_limit & R_BIT) {
fprintf(outfile, " Ranges - crit: %d warn: %d ok: %d", rangstat.critical, rangstat.warning, rangstat.ok);
if (rangstat.ignored != 0) {
fprintf(outfile, " ignored: %d", rangstat.ignored);
fprintf(outfile, " Ranges - crit: %d warn: %d ok: %d", rc, rw, ro);
if (ri != 0) {
fprintf(outfile, " ignored: %d", ri);
}
fprintf(outfile, "; | range_crit=%d range_warn=%d range_ok=%d", rangstat.critical, rangstat.warning, rangstat.ok);
if (rangstat.ignored != 0) {
fprintf(outfile, " range_ignored=%d", rangstat.ignored);
fprintf(outfile, "; | range_crit=%d range_warn=%d range_ok=%d", rc, rw, ro);
if (ri != 0) {
fprintf(outfile, " range_ignored=%d", ri);
}
if (state->perfdata == 1 && state->number_limit & R_BIT) {
/* last to first order. too late to fix this after so many years */
struct range_t *range_p = state->ranges + state->num_ranges - 1;
for (i = state->num_ranges; i; i--) {
struct output_helper_t oh;
for (i = 0; i < state->num_ranges; i++) {
range_p--;
if (range_output_helper(state, &oh, range_p))
continue;
if (state->minsize < oh.range_size) {
@ -1186,7 +1137,6 @@ static int output_alarming(struct conf_t *state)
range_p->backups);
}
}
range_p--;
}
}
fprintf(outfile, "\n");
@ -1194,20 +1144,16 @@ static int output_alarming(struct conf_t *state)
fprintf(outfile, " ");
}
if (state->header_limit & S_BIT) {
fprintf(outfile, "Shared nets - crit: %d warn: %d ok: %d", sharstat.critical, sharstat.warning, sharstat.ok);
if (sharstat.ignored != 0) {
fprintf(outfile, " ignored: %d", sharstat.ignored);
fprintf(outfile, "Shared nets - crit: %d warn: %d ok: %d", sc, sw, so);
if (si != 0) {
fprintf(outfile, " ignored: %d", si);
}
fprintf(outfile, "; | snet_crit=%d snet_warn=%d snet_ok=%d", sharstat.critical, sharstat.warning, sharstat.ok);
if (sharstat.ignored != 0) {
fprintf(outfile, " snet_ignored=%d", sharstat.ignored);
fprintf(outfile, "; | snet_crit=%d snet_warn=%d snet_ok=%d", sc, sw, so);
if (si != 0) {
fprintf(outfile, " snet_ignored=%d", si);
}
if (state->perfdata == 1 && state->header_limit & R_BIT) {
struct shared_network_t *shared_p;
for (shared_p = state->shared_net_root->next; shared_p; shared_p = shared_p->next) {
struct output_helper_t oh;
if (shnet_output_helper(state, &oh, shared_p))
continue;
if (state->minsize < shared_p->available) {
@ -1234,13 +1180,13 @@ static int output_alarming(struct conf_t *state)
}
/*! \brief Return output_format_names enum based on single char input. */
int output_analysis(struct conf_t *state)
int output_analysis(struct conf_t *state, const char output_format)
{
int ret = 1;
switch (state->output_format) {
switch (output_format) {
case 't':
state->color_format = OUT_FORM_TEXT;
state->output_format = OUT_FORM_TEXT;
ret = output_txt(state);
break;
case 'a':
@ -1250,18 +1196,20 @@ int output_analysis(struct conf_t *state)
error(EXIT_FAILURE, 0, "html table only output format is deprecated");
break;
case 'H':
state->color_format = OUT_FORM_HTML;
state->output_format = OUT_FORM_HTML;
ret = output_html(state);
break;
case 'x':
/* fallthrough */
ret = output_xml(state, 0);
break;
case 'X':
ret = output_xml(state);
ret = output_xml(state, 1);
break;
case 'j':
/* fallthrough */
ret = output_json(state, 0);
break;
case 'J':
ret = output_json(state);
ret = output_json(state, 1);
break;
case 'c':
ret = output_csv(state);
@ -1272,7 +1220,7 @@ int output_analysis(struct conf_t *state)
break;
#endif
default:
error(EXIT_FAILURE, 0, "unknown output format: '%c'", state->output_format);
error(EXIT_FAILURE, 0, "unknown output format: '%c'", output_format);
}
return ret;
}

View file

@ -40,7 +40,6 @@
#include <config.h>
#include <math.h>
#include <stdint.h>
#include <stdlib.h>
#include <string.h>
@ -119,14 +118,9 @@ int rangecomp(const void *restrict r1, const void *restrict r2)
*/
int comp_double(double f1, double f2)
{
if (isless(f1, f2))
return -1;
else if (isless(f2, f1))
return 1;
return 0;
return f1 < f2 ? -1 : f1 > f2 ? 1 : 0;
}
/*! \brief Compare two range_t by their first_ip.
* \param r1,r2 Pointers to data to compare.
* \return Like strcmp.
@ -286,6 +280,7 @@ void mergesort_ranges(struct conf_t *state, struct range_t *restrict orig, unsig
struct range_t *restrict temp, const int root_call)
{
unsigned int left, i, u_right;
int s_right;
struct range_t hold;
/* Merge sort split size */
static const unsigned int MIN_MERGE_SIZE = 8;
@ -295,8 +290,6 @@ void mergesort_ranges(struct conf_t *state, struct range_t *restrict orig, unsig
if (size < MIN_MERGE_SIZE) {
for (left = 0; left < size; left++) {
int s_right;
hold = *(orig + left);
for (s_right = left - 1; 0 <= s_right; s_right--) {
if (merge(state, (orig + s_right), &hold))

View file

@ -11,29 +11,21 @@ TESTS = \
tests/alarm-warning-snets \
tests/shnet-alarm \
tests/big-small \
tests/binding-states \
tests/bootp \
tests/cidr-v4 \
tests/cidr-v6 \
tests/complete \
tests/complete-perfdata \
tests/empty \
tests/errors \
tests/full-json \
tests/full-xml \
tests/formats \
tests/leading0 \
tests/one-ip \
tests/one-line \
tests/parser \
tests/range4 \
tests/range6 \
tests/same-twice \
tests/shufled \
tests/simple \
tests/skip \
tests/sorts \
tests/statuses \
tests/v6 \
tests/v6-perfdata

View file

@ -32,13 +32,6 @@ dhcpd-pools -c $top_srcdir/tests/confs/complete -l $top_srcdir/tests/leases/comp
echo $? >> tests/outputs/$IAM-too
cat tests/outputs/$IAM-too >> tests/outputs/$IAM
echo '== shared net count alarms ==' >> tests/outputs/$IAM
dhcpd-pools -c $top_srcdir/tests/confs/complete -l $top_srcdir/tests/leases/complete \
--color=always --format t --crit-count=20 --critical=0 --warning=0 --warn-count=24 \
--output=tests/outputs/$IAM-too
echo $? >> tests/outputs/$IAM-too
cat tests/outputs/$IAM-too >> tests/outputs/$IAM
rm -f tests/outputs/$IAM-too
diff -u $top_srcdir/tests/expected/$IAM tests/outputs/$IAM
exit $?

View file

@ -1,14 +0,0 @@
#!/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 $?

View file

@ -1 +0,0 @@
test.sh

View file

@ -1 +0,0 @@
test.sh

View file

@ -1 +0,0 @@
complete

View file

@ -1,31 +0,0 @@
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;
}
}

View file

@ -1,10 +0,0 @@
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;
}

View file

@ -1 +0,0 @@
complete

View file

@ -1 +0,0 @@
complete

31
tests/confs/shnet-alarm Normal file
View file

@ -0,0 +1,31 @@
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;
}
}

View file

@ -1 +0,0 @@
complete

View file

@ -1 +0,0 @@
complete

View file

@ -1,48 +0,0 @@
#!/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 $?

View file

@ -14,21 +14,3 @@ Shared nets - crit: 0 warn: 0 ok: 0 ignored: 2; | snet_crit=0 snet_warn=0 snet_o
WARNING: dhcpd-pools: Ranges - crit: 0 warn: 0 ok: 2; | range_crit=0 range_warn=0 range_ok=2
Shared nets - crit: 0 warn: 2 ok: 0; | snet_crit=0 snet_warn=2 snet_ok=0
1
== shared net count alarms ==
Ranges:
shared net name first ip last ip max cur percent touch t+c t+c perc
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
0

View file

@ -1 +0,0 @@
simple

10
tests/expected/big-small Normal file
View file

@ -0,0 +1,10 @@
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

View file

@ -1,16 +0,0 @@
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

View file

@ -1 +0,0 @@
simple

10
tests/expected/bootp Normal file
View file

@ -0,0 +1,10 @@
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

View file

@ -1,16 +0,0 @@
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

View file

@ -1,11 +0,0 @@
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

View file

@ -1,27 +0,0 @@
=== 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
All networks 0 0 nan 0 0 nan
=== 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'

View file

@ -1,284 +0,0 @@
=== 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

View file

@ -1,54 +1,3 @@
Ethernets:
macaddress: 00:00:00:00:00:01 ip: 10.0.0.1
macaddress: 00:00:00:00:00:02 ip: 10.0.0.2
macaddress: 00:00:00:00:00:03 ip: 10.0.0.3
macaddress: 00:00:00:00:00:04 ip: 10.0.0.4
macaddress: 00:00:00:00:00:05 ip: 10.0.0.5
macaddress: 00:00:00:00:00:06 ip: 10.0.0.6
macaddress: 00:00:00:00:00:07 ip: 10.0.0.7
macaddress: 00:00:00:00:00:08 ip: 10.0.0.8
macaddress: 00:00:00:00:00:09 ip: 10.0.0.9
macaddress: 00:00:00:00:00:10 ip: 10.0.0.10
macaddress: 00:00:00:00:00:11 ip: 10.0.0.11
macaddress: 00:00:00:00:00:12 ip: 10.0.0.12
macaddress: 00:00:00:00:01:00 ip: 10.1.0.0
macaddress: 00:00:00:00:01:01 ip: 10.1.0.1
macaddress: 00:00:00:00:01:02 ip: 10.1.0.2
macaddress: 00:00:00:00:01:03 ip: 10.1.0.3
macaddress: 00:00:00:00:01:04 ip: 10.1.0.4
macaddress: 00:00:00:00:01:05 ip: 10.1.0.5
macaddress: 00:00:00:00:01:06 ip: 10.1.0.6
macaddress: 00:00:00:00:01:07 ip: 10.1.0.7
macaddress: 00:00:00:00:01:08 ip: 10.1.0.8
macaddress: 00:00:00:00:01:09 ip: 10.1.0.9
macaddress: 00:00:00:00:01:10 ip: 10.1.0.10
macaddress: 00:00:00:00:02:00 ip: 10.2.0.0
macaddress: 00:00:00:00:02:01 ip: 10.2.0.1
macaddress: 00:00:00:00:02:02 ip: 10.2.0.2
macaddress: 00:00:00:00:02:03 ip: 10.2.0.3
macaddress: 00:00:00:00:02:04 ip: 10.2.0.4
macaddress: 00:00:00:00:02:05 ip: 10.2.0.5
macaddress: 00:00:00:00:02:06 ip: 10.2.0.6
macaddress: 00:00:00:00:02:07 ip: 10.2.0.7
macaddress: 00:00:00:00:02:08 ip: 10.2.0.8
macaddress: 00:00:00:00:03:00 ip: 10.3.0.0
macaddress: 00:00:00:00:03:01 ip: 10.3.0.1
macaddress: 00:00:00:00:03:02 ip: 10.3.0.2
macaddress: 00:00:00:00:03:03 ip: 10.3.0.3
macaddress: 00:00:00:00:03:04 ip: 10.3.0.4
macaddress: 00:00:00:00:03:05 ip: 10.3.0.5
macaddress: 00:00:00:00:03:06 ip: 10.3.0.6
macaddress: 00:00:00:00:03:07 ip: 10.3.0.7
macaddress: 00:00:00:00:03:08 ip: 10.3.0.8
macaddress: 00:00:00:00:03:09 ip: 10.3.0.9
macaddress: 00:00:00:00:04:00 ip: 10.4.0.0
macaddress: 00:00:00:00:04:01 ip: 10.4.0.1
macaddress: 00:00:00:00:04:02 ip: 10.4.0.2
macaddress: 00:00:00:00:04:03 ip: 10.4.0.3
macaddress: 00:00:00:00:04:04 ip: 10.4.0.4
macaddress: 00:00:00:00:04:05 ip: 10.4.0.5
macaddress: 00:00:00:00:04:06 ip: 10.4.0.6
Subnets:
location: example1
range: 10.0.0.1 - 10.0.0.20
@ -171,64 +120,7 @@ number_of_shared_networks: 2
number_of_ranges_warning: 0
number_of_ranges_critical: 0
number_of_shared_networks: 2
number_of_shared_networks_warning: 0
number_of_shared_networks_critical: 0
--- skip ok ---
Ethernets:
macaddress: 00:00:00:00:00:01 ip: 10.0.0.1
macaddress: 00:00:00:00:00:02 ip: 10.0.0.2
macaddress: 00:00:00:00:00:03 ip: 10.0.0.3
macaddress: 00:00:00:00:00:04 ip: 10.0.0.4
macaddress: 00:00:00:00:00:05 ip: 10.0.0.5
macaddress: 00:00:00:00:00:06 ip: 10.0.0.6
macaddress: 00:00:00:00:00:07 ip: 10.0.0.7
macaddress: 00:00:00:00:00:08 ip: 10.0.0.8
macaddress: 00:00:00:00:00:09 ip: 10.0.0.9
macaddress: 00:00:00:00:00:10 ip: 10.0.0.10
macaddress: 00:00:00:00:00:11 ip: 10.0.0.11
macaddress: 00:00:00:00:00:12 ip: 10.0.0.12
macaddress: 00:00:00:00:01:00 ip: 10.1.0.0
macaddress: 00:00:00:00:01:01 ip: 10.1.0.1
macaddress: 00:00:00:00:01:02 ip: 10.1.0.2
macaddress: 00:00:00:00:01:03 ip: 10.1.0.3
macaddress: 00:00:00:00:01:04 ip: 10.1.0.4
macaddress: 00:00:00:00:01:05 ip: 10.1.0.5
macaddress: 00:00:00:00:01:06 ip: 10.1.0.6
macaddress: 00:00:00:00:01:07 ip: 10.1.0.7
macaddress: 00:00:00:00:01:08 ip: 10.1.0.8
macaddress: 00:00:00:00:01:09 ip: 10.1.0.9
macaddress: 00:00:00:00:01:10 ip: 10.1.0.10
macaddress: 00:00:00:00:02:00 ip: 10.2.0.0
macaddress: 00:00:00:00:02:01 ip: 10.2.0.1
macaddress: 00:00:00:00:02:02 ip: 10.2.0.2
macaddress: 00:00:00:00:02:03 ip: 10.2.0.3
macaddress: 00:00:00:00:02:04 ip: 10.2.0.4
macaddress: 00:00:00:00:02:05 ip: 10.2.0.5
macaddress: 00:00:00:00:02:06 ip: 10.2.0.6
macaddress: 00:00:00:00:02:07 ip: 10.2.0.7
macaddress: 00:00:00:00:02:08 ip: 10.2.0.8
macaddress: 00:00:00:00:03:00 ip: 10.3.0.0
macaddress: 00:00:00:00:03:01 ip: 10.3.0.1
macaddress: 00:00:00:00:03:02 ip: 10.3.0.2
macaddress: 00:00:00:00:03:03 ip: 10.3.0.3
macaddress: 00:00:00:00:03:04 ip: 10.3.0.4
macaddress: 00:00:00:00:03:05 ip: 10.3.0.5
macaddress: 00:00:00:00:03:06 ip: 10.3.0.6
macaddress: 00:00:00:00:03:07 ip: 10.3.0.7
macaddress: 00:00:00:00:03:08 ip: 10.3.0.8
macaddress: 00:00:00:00:03:09 ip: 10.3.0.9
macaddress: 00:00:00:00:04:00 ip: 10.4.0.0
macaddress: 00:00:00:00:04:01 ip: 10.4.0.1
macaddress: 00:00:00:00:04:02 ip: 10.4.0.2
macaddress: 00:00:00:00:04:03 ip: 10.4.0.3
macaddress: 00:00:00:00:04:04 ip: 10.4.0.4
macaddress: 00:00:00:00:04:05 ip: 10.4.0.5
macaddress: 00:00:00:00:04:06 ip: 10.4.0.6
Subnets:
location: example1
range: 10.0.0.1 - 10.0.0.20
@ -309,9 +201,3 @@ 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

View file

@ -1 +0,0 @@
complete

View file

@ -1,6 +1,6 @@
{
"active_leases": [
{ "ip":"10.0.0.5", "macaddress":"00:00:00:00:00:00", "starts":"", "ends":"", "hostname":"" }
{ "ip":"10.0.0.5", "macaddress":"00:00:00:00:00:00" }
],
"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 }

View file

@ -2,9 +2,6 @@
<active_lease>
<ip>10.0.0.5</ip>
<macaddress>00:00:00:00:00:00</macaddress>
<starts></starts>
<ends></ends>
<hostname></hostname>
</active_lease>
<subnet>
<location>All networks</location>

View file

@ -1,16 +0,0 @@
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

View file

@ -34,7 +34,7 @@ Sum of all ranges:
name max cur percent touch t+c t+c perc
All networks 100 43 43.000 0 43 43.000
0
== maximum ==
== maxium ==
Ranges:
shared net name first ip last ip max cur percent touch t+c t+c perc
All networks 10.4.0.1 - 10.4.0.20 20 5 25.000 0 5 25.000

View file

@ -1,29 +0,0 @@
{
"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 }
]
}

View file

@ -1,37 +0,0 @@
#!/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 $?

View file

@ -1,241 +0,0 @@
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;
}

View file

@ -1 +0,0 @@
complete

View file

@ -1 +0,0 @@
v6

View file

@ -1 +0,0 @@
complete

View file

@ -1 +0,0 @@
complete

View file

@ -1,198 +0,0 @@
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 {
}

View file

@ -1 +0,0 @@
complete

View file

@ -1,30 +0,0 @@
#!/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 $?

View file

@ -1,15 +0,0 @@
#!/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 $?

View file

@ -20,7 +20,7 @@ dhcpd-pools --config $top_srcdir/tests/confs/complete --leases $top_srcdir/tests
echo $? >> tests/outputs/$IAM-too
cat tests/outputs/$IAM-too >> tests/outputs/$IAM
echo '== maximum ==' >> tests/outputs/$IAM
echo '== maxium ==' >> tests/outputs/$IAM
dhcpd-pools --config $top_srcdir/tests/confs/complete --leases $top_srcdir/tests/leases/complete \
--sort=m --output=tests/outputs/$IAM-too
echo $? >> tests/outputs/$IAM-too

View file

@ -1,22 +0,0 @@
#!/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 $?

View file

@ -4,11 +4,12 @@
# analysis algorithm is sane. This script is no longer
# maintained, and can be considered as historic reference.
#
# Licensed under the Open Software License version 1.0
# https://opensource.org/license/osl-1-0/
# Licensed under the Open Software License version 1.1
# http://opensource.org/licenses/osl.php
#
# Sami Kerola <sami.kerola@teliasonera.com>
#
# Latest version is available from http://www.iki.fi/kerolasa/dhcp/
# This is version 1.4
BEGIN {

View file

@ -30,7 +30,7 @@ font-variant: normal;
</style>
</head>
<body>
<div itemscope itemtype="https://schema.org/SoftwareApplication">
<div itemscope itemtype="http://schema.org/SoftwareApplication">
<h1>ISC dhcpd lease analysis and reporting</h1>
<p>This is <span itemprop="name">dhcpd-pools</span>
<a href="https://www.isc.org/software/dhcp" itemprop="applicationSuite">ISC dhcp</a>
@ -46,21 +46,11 @@ there is lots of data. On cheap laptop the speed of analysis is more than
any significant difference in getting analysis done.</p>
<hr />
<div class="tt">
prompt&gt; ./dhcpd-pools --config=/etc/dhcpd.conf
--leases=/var/lib/dhcp/dhcpd.leases --format=H
--color=always --warning=40 --critical=50 --output=<a
href="https://dhcpd-pools.sourceforge.net/sampleoutput.html">sampleoutput.html</a>
prompt&gt; ./dhcpd-pools -c /etc/dhcpd.conf -l /var/lib/dhcp/dhcpd.leases -o
./sampleoutput.txt<br />
prompt&gt; cat ./<a href="http://dhcpd-pools.sourceforge.net/sampleoutput.txt">sampleoutput.txt</a></pre>
</div>
<hr />
<h3>Is dhcpd-pools still developed?</h3>
<p>In short no, it is not.</p>
<p>
<a href="https://www.isc.org/blogs/isc-dhcp-eol/">ISC DHCPD has reached
EOL</a>. Users are Kea DHCP server instead. Kea has <a
href="https://kea.readthedocs.io/en/kea-2.2.0/arm/stats.html">native
statistics</a>, so it does not require this tool and therefore the
dhcpd-pools is obsolte.
</p>
<h3>Where I can get dhcpd-pools?</h3>
<p>Download
<a href="https://sourceforge.net/projects/dhcpd-pools/files/" itemprop="downloadUrl">release package</a>
@ -70,62 +60,44 @@ file.
<br /></p>
<div class="tt">git clone git://git.code.sf.net/p/dhcpd-pools/code dhcpd-pools</div>
<p>See also
<a href="https://sourceforge.net/projects/dhcpd-pools">SourceForge</a> project page.</p>
<a href="http://sourceforge.net/projects/dhcpd-pools">SourceForge</a> project page.</p>
<h3>Documentation</h3>
<p>The dhcpd-pools
<a href="https://dhcpd-pools.sourceforge.net/man.html">manual page</a>, and
<a href="https://dhcpd-pools.sourceforge.net/doxygen/">Doxygen</a> software
<a href="http://dhcpd-pools.sourceforge.net/man.html">manual page</a>, and
<a href="http://dhcpd-pools.sourceforge.net/doxygen/">Doxygen</a> software
reference documentation are available online.</p>
<h3>Getting the output you need</h3>
<ol>
<li>Start with:<br />
<span style="font-family:monospace">dhcpd-pools --config=path
--leases=path --color=always --format=text</span></li>
<li>Play with options and see how output changes. Options to
try:<br />
<span style="font-family:monospace">--all-as-shared --crit-count
--critical --minsize --snet-alarms --warn-count
--warning</span></li>
<li>Start filtering output. Options to try:<br />
<span style="font-family:monospace">--skip --limit</span></li>
<li>Change <span style="font-family:monospace">--format</span>
option to what you need, and maybe include <span style="font-family:monospace">
--perfdata</span> if you want nagios alarm
format.</li>
<li>Done.</li>
</ol>
<h3>Reference information</h3>
<p>
<script type='text/javascript' src='https://www.openhub.net/p/dhcpd-pools/widgets/project_factoids_stats?format=js'></script>
</p>
<p>The program was written because
<a href="https://dhcpstatus.sourceforge.net/">DHCPStatus</a>,
<a href="https://freshmeat.net/projects/dhcpusestats/">DHCP Usage Statistics</a>,
<a href="https://www.omar.org/opensource/reportdhcp/">reportdhcp.pl</a>,
<a href="https://www.ofb.net/%7Ejheiss/lease_analyzer">lease_analyzer</a> and
<a href="https://www.net-track.ch/opensource/dhcpd-snmp/">dhcpd-snmp</a>
<a href="http://dhcpstatus.sourceforge.net/">DHCPStatus</a>,
<a href="http://freshmeat.net/projects/dhcpusestats/">DHCP Usage Statistics</a>,
<a href="http://www.omar.org/opensource/reportdhcp/">reportdhcp.pl</a>,
<a href="http://www.ofb.net/%7Ejheiss/lease_analyzer">lease_analyzer</a> and
<a href="http://www.net-track.ch/opensource/dhcpd-snmp/">dhcpd-snmp</a>
where too slow to handle huge number of leases. There is also difference in
printed details. The dhcpd-pools does not print quite as much information as
some other tools.</p>
<p>Notice that this utility is not the same as
<a href="https://folk.uio.no/trondham/software/dhcpd-pool.html">dhcpd-pool</a>
<a href="http://folk.uio.no/trondham/software/dhcpd-pool.html">dhcpd-pool</a>
that is maintained by Trond Hasle Amundsen.</p>
<p>Just for laugh, obsolete awk proof of concept (version 1.4)
<a href="https://dhcpd-pools.sourceforge.net/dhcpd-pools.awk">dhcpd-pools.awk</a></p>
<a href="http://dhcpd-pools.sourceforge.net/dhcpd-pools.awk">dhcpd-pools.awk</a></p>
<h3>Where to send questions, bug reports, code contributions...</h3>
<p><a href="https://kerolasa.iki.fi/" itemprop="copyrightHolder">Sami Kerola</a>
<p><a href="http://www.iki.fi/kerolasa/" itemprop="copyrightHolder">Sami Kerola</a>
&lt;<a href="mailto:kerolasa@iki.fi">kerolasa@iki.fi</a>&gt;</p>
<div style="visibility:hidden">
<span itemprop="datePublished" datetime="2006-03-13T00:00:00+0000">Mon Mar 13 00:00:00 GMT 2006</span>
<span itemprop="dateModified" datetime="2022-11-26T09:58:28+0000">Sat Nov 26 09:58:28 GMT 2022</span>
<span itemprop="dateModified" datetime="2017-11-15T12:47:30+0000">Wed Nov 15 12:47:30 GMT 2017</span>
<span itemprop="version">3.0</span>
<span itemprop="license">FreeBSD License</span>
<a href="https://dhcpd-pools.sourceforge.net/" itemprop="url"></a>
<div itemprop="offers" itemscope itemtype="https://schema.org/Offer">
<a href="http://dhcpd-pools.sourceforge.net/" itemprop="url"></a>
<div itemprop="offers" itemscope itemtype="http://schema.org/Offer">
<span itemprop="price">0</span>
<meta itemprop="priceCurrency" content="EUR" />
</div>
<div itemprop="aggregateRating" itemscope itemtype="https://schema.org/AggregateRating">
<div itemprop="aggregateRating" itemscope itemtype="http://schema.org/AggregateRating">
<span itemprop="ratingValue">5</span> (
<span itemprop="ratingCount">2</span> ratings )
</div>

View file

@ -1,3 +1,3 @@
Sitemap: https://dhcpd-pools.sourceforge.net/sitemap.txt
Sitemap: http://dhcpd-pools.sourceforge.net/sitemap.txt
User-agent: *
Disallow:

View file

@ -1,169 +0,0 @@
<!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>

985
webpages/sampleoutput.txt Normal file
View file

@ -0,0 +1,985 @@
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

File diff suppressed because it is too large Load diff