diff -pruN 2.0.57-1/authors 2.0.69-1/authors
--- 2.0.57-1/authors	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/authors	1970-01-01 00:00:00.000000000 +0000
@@ -1,41 +0,0 @@
-agx = Guido Guenther <agx@sigxcpu.org>
-arhont = Andrei Mikhailovsky <andrei@arhont.com>
-auduny = Audun Ytterdal <audun@ytterdal.net>
-ay = Audun Ytterdal <audun@ytterdal.net>
-bjorn = BjÃ¸rn Ruberg <bjorn@redpill-linpro.com>
-bldewolf = Brian De Wolf <bldewolf@csupomona.edu>
-feiner.tom = Tom Feiner <feiner.tom@gmail.com>
-haraldk = Harald Korneliussen <vintermann@gmail.com>
-holger = Holger Levsen <holger@layer-acht.org>
-ilmari = Dagfin Ilmari MansÃ¥ker <ilmari@ilmari.org>
-ingvar = Ingvar Hagelund <ingvar@redpill-linpro.com>
-janl = Nicolai Langfeldt <janl@redpill-linpro.com>
-jimmyo = Jimmy Olsen <jo@redpill-linpro.com>
-jo = Jimmy Olsen <jo@redpill-linpro.com>
-joar = Joar Jegleim <joar.jegleim@gmail.com>
-jorne = Jorne Kandziora <jorne@quarantainenet.nl>
-kenyon = Kenyon Ralph <kenyon@kenyonralph.com>
-kjellm = Kjell-Magne Ã˜ierud <kjellm@redpill-linpro.com>
-kjetilho = Kjetil Torgrim Homme <kjetilho@redpill-linpro.com>
-knan = Erik I. BolsÃ¸ <knan@redpill-linpro.com>
-knuthaug = Knut Haugen <knuthaug@gmail.com>
-kristian = Kristian LyngstÃ¸l <kristian@redpill-linpro.com>
-ligne = Matthew Boyle <mlb@decisionsoft.com>
-lkoberstein = Luke Koberstein <tolliandrus@gmail.com>
-loic = Loic Dachary (OuoU) <loic@debian.org>
-lupe = Lupe Christoph <lupe@lupe-christoph.de>
-matthias = Matthias Schmitz <matthias@sigxcpu.org>
-mha = Magnus Hagander <magnus@hagander.net>
-niemann = Philipp Niemann <philipp.niemann@dimdi.de>
-qha = Ulrik Haugen <qha@lysator.liu.se>
-runesk = Rune NordbÃ¸e Skillingstad <rune@skillingstad.no>
-ssm = Stig Sandbeck Mathisen <ssm@fnord.no>
-stabidlo = Rado Rovny <rado@rovny.net>
-steve.schnepp = Steve Schnepp <steve.schnepp@pwkf.org>
-tatjana = Tatjana Anderson <tatjana@redpill-linpro.com>
-tfheen = Tollef Fog Heen <tfheen@err.no>
-tore = Tore Anderson <tore@redpill-linpro.com>
-toreanderson = Tore Anderson <tore@redpill-linpro.com>
-tv = Trygve Vea <tv@redpill-linpro.com>
-zugschlus = Marc Haber <zugschlus@debian.org>
-(no author) = Automatic Commit <no-one@munin-monitoring.org>
diff -pruN 2.0.57-1/ChangeLog 2.0.69-1/ChangeLog
--- 2.0.57-1/ChangeLog	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/ChangeLog	2021-11-22 22:12:17.000000000 +0000
@@ -1,5 +1,347 @@
 -*- text -*-
 
+munin-2.0.69, 2021-11-22
+-------
+Summary
+-------
+
+Bugfix release.
+
+------------------
+Detailed Changelog
+------------------
+
+Andreas Perhab (1):
+
+Lars Kruse (1):
+      Fix loading of "local_address" configuration
+
+
+munin-2.0.68, 2021-11-14
+-------
+Summary
+-------
+
+Bugfix release.
+
+------------------
+Detailed Changelog
+------------------
+
+Andreas Perhab (1):
+      plugins/postgres_: enable configuring warning/critical
+
+Christoph Moench-Tegeder (2):
+      postgres_querylength: catch real statements only
+      ntp_: do not mask required variable from Net::IP
+
+Guillaume Rousse (2):
+      display locally-defined tresholds
+      use dedicated munin SNMP plugin
+
+Kim B. Heino (2):
+      plugins/mailman: add missing "graph_category" header
+      plugins/postfix_mailqueue: don't run postconf if spooldir-override is defined
+
+Lars Kruse (11):
+      Remove obsolete links to old bug tracker ("trac")
+      Fix typo
+      plugin.sh: remove conversation log regarding shell redirects
+      Remove old "authors" file
+      Fix typos
+      munin-asyncd: use configured update rate if undefined
+      Munin::Master::Node: unify configuration access
+      munin-run: allow to pass additional arguments to the plugin (#1419)
+      Fix homepage link
+      fix(postgres_querylength_): fix wrong PostgreSQL version (for 9.4)
+      docs: remove stale content from release checklist
+
+Sven Edge (1):
+      Handle NVME drives in the Linux iostat plugin (2.0 branch)
+
+Ville SkyttÃ¤ (1):
+      Use `grep -E/-F` instead of `egrep` and `fgrep`
+
+wferi (1):
+      Use the host-specific local_address configuration if present
+
+
+munin-2.0.67, 2021-02-22
+-------
+Summary
+-------
+
+Bugfix release.
+
+------------------
+Detailed Changelog
+------------------
+
+Lars Kruse (7):
+
+Lars Kruse (7):
+      Template "overview": add missing closing "li" and unify indentation
+      CDEF handling: fix access to "negative" field metadata
+      CDEF handling: fix translation of fieldnames to RRD field names
+      CDEF handling: fix access to "negative" field with long name or starting with a digit
+      master: tolerate fields without content in "info"
+      Plugin hddtemp_smartctl: avoid misinterpretation of serial numbers as partitions
+      Plugin memcached_: implement suggest and improve autoconf
+
+Wiebe Cazemier (1):
+      Make netstat human and high connection friendly
+
+
+munin-2.0.66, 2021-01-06
+-------
+Summary
+-------
+
+Bugfix release.
+
+------------------
+Detailed Changelog
+------------------
+
+Lars Kruse (7):
+      unknown_limit: do not misinterpret zero as one
+      unknown_limit: fix handling of value "1"
+      SpoolReader: process spooled content lines separately
+      async: fetch spooled data in order of timestamps
+      async: use name squashing rules when determining the names of spooled files
+      async: clarify handling of timestamp
+      doc: describe "timeout_fetch_all_nodes" and "timeout_fetch_one_node"
+
+Matt Merhar (1):
+      Make sensors_ temperature plugin work on musl libc
+
+Wiebe Cazemier (1):
+      Symlink and custom name support for diskstat_
+
+Younes Ichiche (2):
+      fix reporting on URL in the munin-update log (stable-2.0)
+      make it possible to configure global munin-update timeouts
+
+
+munin-2.0.65, 2020-10-28
+-------
+Summary
+-------
+
+Bugfix release.
+
+------------------
+Detailed Changelog
+------------------
+
+Hans van Kranenburg (1):
+      Use configured plugin group as primary group
+
+John Hall (1):
+      plugins/memory: add per-cpu counter
+
+JosefRypacek (1):
+      Munin thresholds support for http_loadtime
+
+Kjetil Torgrim Homme (1):
+      adjust_threshold: strings indexes are 1 based in AWK
+
+Lars Kruse (10):
+      Plugin apt_all: prevent ambiguity between slash and hyphen in release names
+      Fix utf8 encoding in plugins
+      Fix special character for author name (Kristian Lyngstøl)
+      Plugin snmp__if_err_: clarify authors list
+      Plugin nomadix_users_: clarify formatting of authors
+      Plugin vserver_cpu_: clarify copyright statement
+      Plugin snmp__uptime: clarify authors
+      Unify spelling of author "Dagfinn Ilmari Mannsåker"
+      Unify more author names
+      Fix template error in case of an empty host list
+
+
+munin-2.0.64, 2020-07-09
+-------
+Summary
+-------
+
+Bugfix release.
+
+------------------
+Detailed Changelog
+------------------
+
+Lars Kruse (8):
+      Plugins snmp__if(_err)_: describe alias handling for configuration
+      Plugin cpu: add support for hiding selected fields
+      Plugins snmp__if*: clarify usage of interface names
+      munin-node-configure: remove "--exitnoterror" argument
+      LINESTACK: add support for undefined line width and restrict regex
+      Plugins ntp_kernel_*: handle alternative implementations (e.g. ntpsec)
+      Plugins ntp_kernel_*: force non-scientific notation for output
+      Plugin smart_: avoid ambiguous variable name
+
+Mike Beattie (3):
+      Allow '@' in plugin names
+      Support SNMP network interfaces by names instead of index
+      Allow overriding of network interface alias from SNMP
+
+
+munin-2.0.63, 2020-05-27
+-------
+Summary
+-------
+
+Bugfix release.
+
+------------------
+Detailed Changelog
+------------------
+
+Alexander (1):
+      Remove unneeded forks in plugin.sh
+
+Lars Kruse (3):
+      plugin.sh: fix shellcheck issues and tolerate unset optional arguments
+      Plugins: force execution in a shell for "command -v"
+      plugin.sh: improve documentation for "print_warning" and "print_critical"
+
+
+munin-2.0.62, 2020-05-27
+-------
+Summary
+-------
+
+Bugfix release.
+
+------------------
+Detailed Changelog
+------------------
+
+Lars Kruse (5):
+      Move "munin-node-configure" test from Makefile to travis checks
+      Fix formatting of Munin::Common::Daemon documentation
+      Plugin proc: change to "manual" family
+      Plugins: use "command -v" instead of "which"
+      Plugins: hide output for boolean checks of "command -v"
+
+d0m84 (1):
+      add start and stop log for munin-graph
+
+
+munin-2.0.61, 2020-04-30
+-------
+Summary
+-------
+
+Bugfix release.
+
+------------------
+Detailed Changelog
+------------------
+
+Lars Kruse (2):
+      Plugins apache_*: tolerate URL without placeholder for port
+      Plugins apache_*: fix handling of URL with port placeholder
+
+
+munin-2.0.60, 2020-04-22
+-------
+Summary
+-------
+
+Bugfix release.
+
+------------------
+Detailed Changelog
+------------------
+
+Hans de Graaff (1):
+      Plugin mysql_innodb: pass argument to mysql_exec
+
+Lars Kruse (6):
+      Remove logging from Munin::Common::Daemon
+      Plugin ping_: use "ping" instead of "ping6" except for *BSD
+      Plugin nginx_status: improve error message in case of missing dependency
+      munin-run: skip systemd properties simulation in case of missing privileges
+      Remove asterisk_* plugins
+
+Steve Schnepp (1):
+      dists: remove all dists specific stuff
+
+Thomas Daniels (1):
+      Fix typo in doc/reference/plugin.rst of stable-2.0
+
+
+munin-2.0.59, 2020-03-24
+-------
+Summary
+-------
+
+Bugfix release.
+
+------------------
+Detailed Changelog
+------------------
+
+Christoph Moench-Tegeder (1):
+
+Lars Kruse (1):
+      Fix syntax error in munin-asyncd
+
+
+munin-2.0.58, 2020-03-23
+-------
+Summary
+-------
+
+Bugfix release.
+
+------------------
+Detailed Changelog
+------------------
+
+Christoph Moench-Tegeder (1):
+
+Andreas Perhab (1):
+      plugin ipmi_: add support for volts
+
+Klas Meder Boqvist (1):
+      Plugin cpuspeed: ensure value is not in scientific notation
+
+Lars Kruse (28):
+      Plugin ipmi_sensor_: fix "suggest" in case of missing "ipmitool"
+      dev_scripts: allow override for sandbox directory
+      Plugin proc (linux): announce availability of autoconf
+      Plugin proc (linux): fix indentation
+      Remove remaining occurrences of subversion revision markers ($Id$)
+      Plugin ntp_: output "U" values in case of data retrieval problems
+      emit_sd_notify_message: adjust log level for messages
+      asyncd: prevent skipping of values due to variable collection periods
+      master: do not block connection to munin-node in case of TCP timeout
+      Fix test for munin_master_node
+      devscripts/install: override users and groups with the current user
+      Plugin mysql_: handle missing dependencies gracefully
+      Plugin ntp_: handle missing dependencies gracefully
+      Plugin ntp_states: move "autoconf" code to the top
+      Plugin ntp_states: handle missing dependency gracefully
+      Plugin varnish_: handle missing dependency gracefully
+      Makefile: test "munin-node-configure --suggest"
+      Plugin mbmon_: convert plugin documentation to perldoc header
+      Plugin mbmon_: prepare for configurable arguments
+      Plugin mbmon_: allow additional arguments for "mbmon"
+      Plugin apt_all: improve formatting of error messages
+      Plugin apt_all: enforce stable order of fields
+      Plugin apt_all: include release names with slashes (e.g. buster/updates)
+      Plugin apt_all: unify whitespace
+      Plugin apt_all: apply default "options" for apt-get
+      Plugin apt_all: use a proper name for the state file
+      templates: remove superfluous whitespace after "Munin" in title
+      templates: add missing hostname to category and comparison views of multigraph services
+
+Trygve Vea (1):
+      Proc plugin: Allow monitoring of processes with empty cmdline
+
+
 munin-2.0.57, 2020-03-09
 -------
 Summary
@@ -3571,7 +3913,7 @@ munin (1.3.4, r1277:1560, 8/3/2008)
        clocks - stops spurious DNS lookups of these (closes #150)
  * It appears that some versions of Net::SSLeay needs a "" in
    print_errs("") calls (closes #154)
- * Add munin_stats plugin written by Rodolphe Quiedeville - and patch to
+ * Add munin_stats plugin written by Rodolphe Quiédeville - and patch to
    munin-limits to provide timing information by same.  Closes #485.
    Problem: plugin can take more than 10 seconds to run with long log
    files, needs to use log-tail and a state file
diff -pruN 2.0.57-1/Checklist 2.0.69-1/Checklist
--- 2.0.57-1/Checklist	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/Checklist	2021-11-22 22:12:17.000000000 +0000
@@ -1,27 +1,3 @@
-This is a pre-release checklist for the maintainer.
-
- * is there any "FIX" in: ChangeLog, INSTALL, Announce?
-
- * Is .htaccess installed?
- * rm -f /etc/munin/plugins/* 
-      Does munin-node-configure -d show any autoconf errors?
-      Does munin-node-configure --debug run nicely or do we get perl errors?
-
- * Update plugins/plugins.history.in:
-
-   1. cd plugins
-
-   2. Figure out which r the previous tag was at and do this (r910 was
-	  1.3.2 and r1234 is head)
-      svn --verbose log -r910:1234 | fgrep node.d | grep -w A | 
-         cut -d/ -f 4- | sed 's/^node\.d\.//'
-
-   3. Check if the listed plugins are still present (or moved):
-
-      svn --verbose log -r910:1234 | fgrep node.d | grep -w A |
-          cut -d/ -f 4- | sed s'/(.*//' | xargs ls -ld >/dev/null
-
-
 # Git release
 
   The tag used here is "2.0.1", exchange this with a current version.
diff -pruN 2.0.57-1/common/lib/Munin/Common/Config.pm 2.0.69-1/common/lib/Munin/Common/Config.pm
--- 2.0.57-1/common/lib/Munin/Common/Config.pm	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/common/lib/Munin/Common/Config.pm	2021-11-22 22:12:17.000000000 +0000
@@ -1,7 +1,5 @@
 package Munin::Common::Config;
 
-# $Id$
-
 use warnings;
 use strict;
 
@@ -115,6 +113,8 @@ my %legal = map { $_ => 1 } qw(
 	sum
 	text
 	timeout
+	timeout_fetch_one_node
+	timeout_fetch_all_nodes
 	tls
 	tls_ca_certificate
 	tls_certificate
diff -pruN 2.0.57-1/common/lib/Munin/Common/Daemon.pm 2.0.69-1/common/lib/Munin/Common/Daemon.pm
--- 2.0.57-1/common/lib/Munin/Common/Daemon.pm	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/common/lib/Munin/Common/Daemon.pm	2021-11-22 22:12:17.000000000 +0000
@@ -7,15 +7,11 @@ use strict;
 use English;
 use IO::Socket;
 
-use Munin::Node::Logger qw(logger);
-
 
 sub emit_sd_notify_message {
     eval {
-        logger("sd_notify: looking for NOTIFY_SOCKET environment variable");
         my $socket_path = $ENV{NOTIFY_SOCKET};
         if (defined $socket_path) {
-            logger("sd_notify: preparing connection to '$socket_path'");
             # Prevent children from talking to the socket provided solely for us.
             delete $ENV{NOTIFY_SOCKET};
             # A socket path starting with "@" is interpreted as a Linux abstract namespace socket.
@@ -23,13 +19,9 @@ sub emit_sd_notify_message {
             # See "Address format: abstract" in "man 7 unix".
             $socket_path =~ s/^@/\0/;
             my $socket = IO::Socket::UNIX->new(Type => SOCK_DGRAM, Peer => $socket_path);
-            logger("sd_notify: connected to socket '$socket_path'");
             if (defined $socket) {
-                logger("sd_notify: sending READY signal to '$socket_path'");
                 print($socket "READY=1\n");
                 close($socket);
-            } else {
-                logger("sd_notify: failed to connect to socket '$socket_path'");
             }
         }
     }
@@ -50,24 +42,30 @@ Munin::Common::Daemon - utilities for da
 The following daemon-related features are supported:
 
 =over
+
 =item sd_notify: signal readiness of the daemon
+
 =back
 
 
 =head1 SUBROUTINES
 
-=over
+=head2 emit_sd_notify_message
 
-=item B<emit_sd_notify_message>
+Example:
 
  emit_sd_notify_message();
 
 Send a "ready" signal according to the C<sd_notify> interface:
 
 =over
+
 =item 1. check whether the environment variable "NOTIFY_SOCKET" is defined
+
 =item 2. remove this variable from the environment (this interface is not propagated to children)
+
 =item 3. send the string "READY=1" to the socket
+
 =back
 
 The function returns silently, if something fails.
@@ -79,12 +77,14 @@ C<sd_notify> interface or not.
 
 Examples for callers supporting the C<sd_notify> interface:
 
+
 =over
+
 =item systemd: see C<Type=Notify> in L<systemd.exec/5>
-=item start-stop-daemon: see C<--notify-await> in L<start-stop-daemon/8>
-=back
 
-See L<text|https://www.freedesktop.org/software/systemd/man/sd_notify.html> for
-details of this interface.
+=item start-stop-daemon: see C<--notify-await> in L<start-stop-daemon/8>
 
 =back
+
+See the L<specification of "sd_notify"|https://www.freedesktop.org/software/systemd/man/sd_notify.html>
+for further details of this interface.
diff -pruN 2.0.57-1/common/lib/Munin/Common/Defaults.pm 2.0.69-1/common/lib/Munin/Common/Defaults.pm
--- 2.0.57-1/common/lib/Munin/Common/Defaults.pm	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/common/lib/Munin/Common/Defaults.pm	2021-11-22 22:12:17.000000000 +0000
@@ -4,8 +4,6 @@ use strict;
 # If you change the class path take a look in get_defaults too, please!
 package Munin::Common::Defaults;
 
-# $Id$
-
 use English qw(-no_match_vars);
 use File::Basename qw(dirname);
 
diff -pruN 2.0.57-1/common/lib/Munin/Common/Timeout.pm 2.0.69-1/common/lib/Munin/Common/Timeout.pm
--- 2.0.57-1/common/lib/Munin/Common/Timeout.pm	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/common/lib/Munin/Common/Timeout.pm	2021-11-22 22:12:17.000000000 +0000
@@ -1,8 +1,6 @@
 use warnings;
 use strict;
 
-# $Id$
-
 package Munin::Common::Timeout;
 use base qw(Exporter);
 
diff -pruN 2.0.57-1/common/lib/Munin/Common/TLSClient.pm 2.0.69-1/common/lib/Munin/Common/TLSClient.pm
--- 2.0.57-1/common/lib/Munin/Common/TLSClient.pm	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/common/lib/Munin/Common/TLSClient.pm	2021-11-22 22:12:17.000000000 +0000
@@ -1,8 +1,6 @@
 package Munin::Common::TLSClient;
 use base qw(Munin::Common::TLS);
 
-# $Id$
-
 use warnings;
 use strict;
 
diff -pruN 2.0.57-1/common/lib/Munin/Common/TLS.pm 2.0.69-1/common/lib/Munin/Common/TLS.pm
--- 2.0.57-1/common/lib/Munin/Common/TLS.pm	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/common/lib/Munin/Common/TLS.pm	2021-11-22 22:12:17.000000000 +0000
@@ -1,7 +1,5 @@
 package Munin::Common::TLS;
 
-# $Id$
-
 use warnings;
 use strict;
 
diff -pruN 2.0.57-1/common/lib/Munin/Common/TLSServer.pm 2.0.69-1/common/lib/Munin/Common/TLSServer.pm
--- 2.0.57-1/common/lib/Munin/Common/TLSServer.pm	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/common/lib/Munin/Common/TLSServer.pm	2021-11-22 22:12:17.000000000 +0000
@@ -1,8 +1,6 @@
 package Munin::Common::TLSServer;
 use base qw(Munin::Common::TLS);
 
-# $Id$
-
 use warnings;
 use strict;
 
diff -pruN 2.0.57-1/debian/changelog 2.0.69-1/debian/changelog
--- 2.0.57-1/debian/changelog	2020-03-14 17:59:29.000000000 +0000
+++ 2.0.69-1/debian/changelog	2022-01-03 11:21:59.000000000 +0000
@@ -1,3 +1,109 @@
+munin (2.0.69-1) unstable; urgency=medium
+
+  [ Holger Levsen ]
+  * New upstream release.
+  * d/copyright: update my copyright years.
+  * Update standards version to 4.6.0, no changes needed.
+
+  [ lintian-brush ]
+  * Use secure URI in Homepage field.
+
+ -- Holger Levsen <holger@debian.org>  Mon, 03 Jan 2022 12:21:59 +0100
+
+munin (2.0.67-4) unstable; urgency=medium
+
+  * debian/munin-node.service: use full path to /usr/bin/install as one user
+    reported systemd complaining about the non absolut path on ubuntu 18.04.
+    (Both variants have been tested fine on bullseye.)
+
+ -- Holger Levsen <holger@debian.org>  Fri, 30 Jul 2021 23:45:45 +0200
+
+munin (2.0.67-3) unstable; urgency=high
+
+  * debian/munin-node.service: ensure /run/munin directory exists with the
+    correct permissions. Closes: #991411 (which was introduced in 2.0.67-2 to
+    address #990371)
+
+ -- Holger Levsen <holger@debian.org>  Wed, 28 Jul 2021 18:16:53 +0200
+
+munin (2.0.67-2) unstable; urgency=medium
+
+  [ Kentaro Hayashi ]
+  * debian/munin-node.service: ensure /run/munin directory exists.
+    Closes: #990371.
+
+ -- Holger Levsen <holger@debian.org>  Tue, 20 Jul 2021 14:40:08 +0200
+
+munin (2.0.67-1) unstable; urgency=medium
+
+  [ Holger Levsen ]
+  * New upstream release.
+
+  [ Debian Janitor ]
+  * Set fields Upstream-Name, Upstream-Contact in debian/copyright.
+  * Remove obsolete fields Contact, Name from debian/upstream/metadata (already
+    present in machine-readable debian/copyright).
+
+ -- Holger Levsen <holger@debian.org>  Fri, 26 Feb 2021 13:24:19 +0100
+
+munin (2.0.66-1) unstable; urgency=medium
+
+  * New upstream release.
+  * Add Brazilian Portuguese debconf templates translation, thanks to
+    Adriano Rafael Gomes. Closes: #964892.
+  * Bump standards version to 4.5.1, no changes needed.
+  * d/copyright: update my copyright years.
+
+ -- Holger Levsen <holger@debian.org>  Sun, 17 Jan 2021 23:20:37 +0100
+
+munin (2.0.65-1) unstable; urgency=medium
+
+  * New upstream version.
+
+ -- Holger Levsen <holger@debian.org>  Thu, 29 Oct 2020 17:15:09 +0100
+
+munin (2.0.64-1) unstable; urgency=medium
+
+  * New upstream version.
+
+ -- Holger Levsen <holger@debian.org>  Wed, 23 Sep 2020 17:18:14 +0200
+
+munin (2.0.63-1) unstable; urgency=medium
+
+  [ Lars Kruse ]
+  * New upstream release, 2.0.63.
+  * New upstream release, 2.0.62.
+  * New upstream release, 2.0.61.
+  * New upstream release, 2.0.60, fixing the following issue:
+    - asterisk_* plugins: removal due to being outdated. Use the plugins
+      from "contrib" repository instead (e.g. via "munin-get").
+      (Closes: #713891, #806173, #934334)
+  * New upstream release, 2.0.59.
+  * New upstream release, 2.0.58, fixing the following issue:
+    - apt_all plugin: override local apt settings that could
+      interfere with the plugin operation (Closes: #761190)
+    - apt_all plugin: rename state file in order to avoid confusion
+      (Closes: #863231)
+  * munin sysvinit: fix bash-incompatibility of init script
+    (thanks, Craig Sanders, Closes: #954234)
+  * munin-plugins-core: add missing "Suggests" for "nginx_status"
+    (package "libwww-perl")
+    (thanks, Olaf Zaplinski, Closes: #954930)
+  * clean up maintainer scripts
+    (quoting, whitespace, parameter handling)
+  * munin-(node|common).postinst: remove redundant code
+  * munin-node.postinst: remove unused conditional
+  * munin-node.postinst: simplify log redirections
+  * mask systemd service "munin"
+    The init script only creates directories - these are handled via
+    systemd-tmpfiles.
+    (thanks, Andreas Henriksson)
+
+  [ Holger Levsen ]
+  * Bump debhelper-compat to 13.
+
+ -- Holger Levsen <holger@debian.org>  Tue, 09 Jun 2020 01:55:12 +0200
+
 munin (2.0.57-1) unstable; urgency=medium
 
   [ Lars Kruse ]
diff -pruN 2.0.57-1/debian/control 2.0.69-1/debian/control
--- 2.0.57-1/debian/control	2020-01-30 10:59:01.000000000 +0000
+++ 2.0.69-1/debian/control	2022-01-03 11:19:08.000000000 +0000
@@ -25,12 +25,12 @@ Build-Depends-Indep:
  libtest-mockobject-perl,
  perl,
 Build-Depends:
- debhelper-compat (=12),
+ debhelper-compat (=13),
  libmodule-build-perl,
  po-debconf,
 Rules-Requires-Root: no
-Standards-Version: 4.5.0
-Homepage: http://munin-monitoring.org
+Standards-Version: 4.6.0
+Homepage: https://munin-monitoring.org
 Vcs-Git: https://salsa.debian.org/debian/munin.git -b debian
 Vcs-Browser: https://salsa.debian.org/debian/munin
 
@@ -95,6 +95,7 @@ Suggests:
  libcache-cache-perl,
  libdbd-mysql-perl,
  libnet-dns-perl,
+ libwww-perl,
  logtail,
  net-tools,
  python3,
diff -pruN 2.0.57-1/debian/copyright 2.0.69-1/debian/copyright
--- 2.0.57-1/debian/copyright	2020-01-20 19:40:56.000000000 +0000
+++ 2.0.69-1/debian/copyright	2022-01-03 11:19:08.000000000 +0000
@@ -1,5 +1,7 @@
 Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
 Source: https://github.com/munin-monitoring/munin
+Upstream-Name: Munin
+Upstream-Contact: irc://irc.oftc.net/
 
 Files: *
 License: GPL-2
@@ -22,7 +24,7 @@ Copyright: 2004-2010 Lupe Christoph <lup
 
 Files: debian/*
 License: GPL-2
-Copyright: 2008-2018 Holger Levsen <holger@debian.org>
+Copyright: 2008-2022 Holger Levsen <holger@debian.org>
            2009-2017 Stig Sandbeck Mathisen <ssm@debian.org>
            2016-2018 Lars Kruse <devel@sumpfralle.de>
 
diff -pruN 2.0.57-1/debian/munin-async.postinst 2.0.69-1/debian/munin-async.postinst
--- 2.0.57-1/debian/munin-async.postinst	2020-01-20 19:40:56.000000000 +0000
+++ 2.0.69-1/debian/munin-async.postinst	2021-07-30 21:47:39.000000000 +0000
@@ -26,13 +26,6 @@ case "$1" in
 			initperms
 		fi
 		;;
-	abort-upgrade|abort-deconfigure|abort-remove)
-		:
-		;;
-	*)
-		echo "Called with unknown argument $1, bailing out."
-		exit 1
-		;;
 esac
 
 #DEBHELPER#
diff -pruN 2.0.57-1/debian/munin-common.postinst 2.0.69-1/debian/munin-common.postinst
--- 2.0.57-1/debian/munin-common.postinst	2020-01-20 19:40:56.000000000 +0000
+++ 2.0.69-1/debian/munin-common.postinst	2021-07-30 21:47:39.000000000 +0000
@@ -27,18 +27,6 @@ case "$1" in
                 --home /var/lib/munin --no-create-home \
                 --gecos 'munin application user' munin
         fi
-
-        if [ -d /run/systemd/system ] ; then
-            systemd-tmpfiles --create /usr/lib/tmpfiles.d/munin-common.conf >/dev/null || true
-        fi
-        ;;
-
-    abort-upgrade|abort-remove|abort-deconfigure)
-        ;;
-
-    *)
-        echo "postinst called with unknown argument \`$1'" >&2
-        exit 1
         ;;
 esac
 
@@ -46,5 +34,3 @@ esac
 # generated by other debhelper scripts.
 
 #DEBHELPER#
-
-exit 0
diff -pruN 2.0.57-1/debian/munin.init 2.0.69-1/debian/munin.init
--- 2.0.57-1/debian/munin.init	2020-03-13 16:40:22.000000000 +0000
+++ 2.0.69-1/debian/munin.init	2021-07-30 21:47:39.000000000 +0000
@@ -27,5 +27,5 @@ do_start_prepare() {
 
 
 # there is no process to be started or stopped ("munin-update" is executed via cron)
-do_stop_cmd_override() true
-do_start_cmd_override() true
+do_stop_cmd_override() { true; }
+do_start_cmd_override() { true; }
diff -pruN 2.0.57-1/debian/munin.lintian-overrides 2.0.69-1/debian/munin.lintian-overrides
--- 2.0.57-1/debian/munin.lintian-overrides	2020-01-20 19:40:56.000000000 +0000
+++ 2.0.69-1/debian/munin.lintian-overrides	2021-07-30 21:47:39.000000000 +0000
@@ -1,7 +1,3 @@
-# The munin init script only creates /run/munin.
-# This is covered by debian/munin.tmpfiles for systemd. Thus there is no need for a service.
-missing-systemd-service-for-init.d-script munin
-
 # Lintian tells us that a "templates" file is usually accompanied by a "config" file.  But we use
 # debconf only during package removal (approving file deletion for purge).  Thus we do not need a
 # "config" file (only needed if input during installation is required).
diff -pruN 2.0.57-1/debian/munin-node.postinst 2.0.69-1/debian/munin-node.postinst
--- 2.0.57-1/debian/munin-node.postinst	2020-01-20 19:40:56.000000000 +0000
+++ 2.0.69-1/debian/munin-node.postinst	2021-07-30 21:47:39.000000000 +0000
@@ -12,39 +12,36 @@ initperms() {
 	chmod 750 /etc/munin/plugin-conf.d
 }
 
+# create symlinks below /etc/munin/plugins/ for all plugins reporting "yes" via "autoconf"
 init_plugins() {
-	TMPFILE=`mktemp /tmp/munin-node.configure.XXXXXXXXXX`
-	TMPFILE_STDERR=`mktemp /tmp/munin-node.configure.err.XXXXXXXXXX`
+	TMPFILE=$(mktemp /tmp/munin-node.configure.XXXXXXXXXX)
+	TMPFILE_STDERR=$(mktemp /tmp/munin-node.configure.err.XXXXXXXXXX)
 	MUNIN_NODE_CONF_LOG="/var/log/munin/munin-node-configure.log"
-	if [ "$prevver" ]; then
-		MUNIN_NODE_CMD="munin-node-configure --shell --newer "${prevver%-*}""    
+	if [ -n "$prevver" ]; then
+		MUNIN_NODE_CMD="munin-node-configure --shell --newer '${prevver%-*}'"
 		echo -n "Initializing new plugins.."
 	else
 		MUNIN_NODE_CMD="munin-node-configure --shell"
 		echo -n "Initializing plugins.."
-    fi
+	fi
 
-	# munin-node-conf returns 1 if case of partial plugin autoconf
+	# munin-node-conf returns 1 in case of partial plugin autoconf
 	# errors. We need to ignore these errors as even one plugin
 	# can fail the entire process. See Debian bug #539886 for details.
-	$MUNIN_NODE_CMD 2>$TMPFILE_STDERR >$TMPFILE || true
-	if [ -f $TMPFILE ]; then
-		DATE=`date '+%b %d %T'`
-		echo "$DATE - Starting $MUNIN_NODE_CMD" >> $MUNIN_NODE_CONF_LOG
-		cat $TMPFILE >> $MUNIN_NODE_CONF_LOG
-        if [ -s $TMPFILE_STDERR ]; then
-			echo "The following errors were reported by $MUNIN_NODE_CMD" \
-			>> $MUNIN_NODE_CONF_LOG 
-			cat $TMPFILE_STDERR >> $MUNIN_NODE_CONF_LOG
-        fi
-		sh < $TMPFILE
-	else 
-		echo "failed."
-	fi
+	$MUNIN_NODE_CMD 2>"$TMPFILE_STDERR" >"$TMPFILE" || true
+	# log the details
+	{
+		echo "$(date '+%b %d %T') - Starting $MUNIN_NODE_CMD"
+		cat "$TMPFILE"
+		if [ -s "$TMPFILE_STDERR" ]; then
+			echo "The following errors were reported by $MUNIN_NODE_CMD"
+			cat "$TMPFILE_STDERR"
+		fi
+	} >>"$MUNIN_NODE_CONF_LOG"
+	# create the symlinks for new plugins
+	sh <"$TMPFILE"
 	echo "done."
-	rm -f $TMPFILE $TMPFILE_STDERR
-	echo -n "Restarting munin-node.."
-	invoke-rc.d munin-node restart
+	rm -f "$TMPFILE" "$TMPFILE_STDERR"
 }
 
 case "$1" in
@@ -59,13 +56,6 @@ case "$1" in
 			invoke-rc.d munin-node restart
 		fi
 		;;
-	abort-upgrade|abort-deconfigure|abort-remove)
-		:
-		;;
-	*)
-		echo "Called with unknown argument $1, bailing out."
-		exit 1
-		;;
 esac
 
 #DEBHELPER#
diff -pruN 2.0.57-1/debian/munin-node.postrm 2.0.69-1/debian/munin-node.postrm
--- 2.0.57-1/debian/munin-node.postrm	2020-01-20 19:40:56.000000000 +0000
+++ 2.0.69-1/debian/munin-node.postrm	2021-07-30 21:47:39.000000000 +0000
@@ -5,8 +5,8 @@ set -e
 if [ "$1" = "purge" ]; then
 	# delete dangling symlinks
 	test -d /etc/munin/plugins/ && for plugin in $(find /etc/munin/plugins/ -type l); do
-		if [ ! -e $(readlink $plugin) ]; then
-			rm $plugin
+		if [ ! -e "$(readlink "$plugin")" ]; then
+			rm "$plugin"
 		fi
 	done
 
diff -pruN 2.0.57-1/debian/munin-node.service 2.0.69-1/debian/munin-node.service
--- 2.0.57-1/debian/munin-node.service	2020-03-13 16:40:22.000000000 +0000
+++ 2.0.69-1/debian/munin-node.service	2021-07-30 21:47:39.000000000 +0000
@@ -7,6 +7,7 @@ After=network-online.target
 EnvironmentFile=-/etc/default/munin-node
 Type=notify
 Restart=always
+ExecStartPre=/usr/bin/install -o munin -g munin -d /run/munin
 ExecStart=/usr/sbin/munin-node --foreground $DAEMON_ARGS
 PIDFile=/run/munin/munin-node.pid
 # Plugins like "smart_" require access to devices
diff -pruN 2.0.57-1/debian/munin.postinst 2.0.69-1/debian/munin.postinst
--- 2.0.57-1/debian/munin.postinst	2020-01-20 19:40:56.000000000 +0000
+++ 2.0.69-1/debian/munin.postinst	2021-07-30 21:47:39.000000000 +0000
@@ -31,7 +31,7 @@ initperms() {
 
 apache_install() {
 	# if you add more webservers here, don't forget to also remove them in postrm
-        webserver=apache2
+	webserver=apache2
 	# installing configuration for Apache 2.4
 	# link config to conf-available
 	if [ -d /etc/$webserver/conf-available ] && [ ! -e /etc/$webserver/conf-available/munin.conf ]; then
@@ -54,13 +54,6 @@ case "$1" in
 			apache_install "$@"
 		fi
 		;;
-	abort-upgrade|abort-deconfigure|abort-remove)
-		:
-		;;
-	*)
-		echo "Called with unknown argument $1, bailing out."
-		exit 1
-		;;
 esac
 
 #DEBHELPER#
diff -pruN 2.0.57-1/debian/munin.postrm 2.0.69-1/debian/munin.postrm
--- 2.0.57-1/debian/munin.postrm	2020-01-20 19:40:56.000000000 +0000
+++ 2.0.69-1/debian/munin.postrm	2021-07-30 21:47:39.000000000 +0000
@@ -57,10 +57,10 @@ if [ "$1" = "purge" ]; then
 	webserver=apache2
 	# Disable configuration with Apache 2.4
 	if [ -e /usr/share/apache2/apache2-maintscript-helper ] ; then
-		. /usr/share/apache2/apache2-maintscript-helper 
-		apache2_invoke disconf munin.conf 
-	fi 
-	
+		. /usr/share/apache2/apache2-maintscript-helper
+		apache2_invoke disconf munin.conf
+	fi
+
 	# Remove configuration from Apache 2.4 conf dir
 	if [ -L /etc/$webserver/conf-available/munin.conf ]; then
 		# delete the link
Only in 2.0.69-1/debian: munin.service
diff -pruN 2.0.57-1/debian/po/pt_BR.po 2.0.69-1/debian/po/pt_BR.po
--- 2.0.57-1/debian/po/pt_BR.po	1970-01-01 00:00:00.000000000 +0000
+++ 2.0.69-1/debian/po/pt_BR.po	2021-07-30 21:47:39.000000000 +0000
@@ -0,0 +1,44 @@
+# Debconf translations for munin.
+# Copyright (C) 2020 THE munin'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the munin package.
+# Adriano Rafael Gomes <adrianorg@debian.org>, 2020.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: munin\n"
+"Report-Msgid-Bugs-To: munin@packages.debian.org\n"
+"POT-Creation-Date: 2019-08-04 17:40+0200\n"
+"PO-Revision-Date: 2020-06-22 22:01-0300\n"
+"Last-Translator: Adriano Rafael Gomes <adrianorg@debian.org>\n"
+"Language-Team: Brazilian Portuguese <debian-l10n-portuguese@lists.debian."
+"org>\n"
+"Language: pt_BR\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#. Type: boolean
+#. Description
+#: ../munin.templates:1001
+msgid "Remove all RRD database files?"
+msgstr "Remover todos os arquivos de banco de dados RRD?"
+
+#. Type: boolean
+#. Description
+#: ../munin.templates:1001
+msgid ""
+"The /var/lib/munin directory which contains the RRD files with the data "
+"accumulated by munin is about to be removed."
+msgstr ""
+"O diretÃ³rio /var/lib/munin, que contÃ©m os arquivos RRD com os dados "
+"acumulados pelo munin, estÃ¡ prestes a ser removido."
+
+#. Type: boolean
+#. Description
+#: ../munin.templates:1001
+msgid ""
+"If you want to install munin later again or if you want to use the content "
+"of the RRD files for other purposes, the data should be kept."
+msgstr ""
+"Se vocÃª quiser instalar o munin novamente ou se vocÃª quiser usar o conteÃºdo "
+"dos arquivos RRD para outros propÃ³sitos, os dados devem ser mantidos."
diff -pruN 2.0.57-1/debian/upstream/metadata 2.0.69-1/debian/upstream/metadata
--- 2.0.57-1/debian/upstream/metadata	2020-01-20 19:40:56.000000000 +0000
+++ 2.0.69-1/debian/upstream/metadata	2021-07-30 21:47:39.000000000 +0000
@@ -1,10 +1,8 @@
 Bug-Database: https://github.com/munin-monitoring/munin/issues
 Bug-Submit: https://github.com/munin-monitoring/munin/issues/new/choose
 Changelog: https://raw.githubusercontent.com/munin-monitoring/munin/stable-2.0/ChangeLog
-Contact: irc://irc.oftc.net/
 Documentation: http://guide.munin-monitoring.org/
 FAQ: http://guide.munin-monitoring.org/en/latest/tutorial/troubleshooting.html
-Name: Munin
 Repository: https://github.com/munin-monitoring/munin.git
 Repository-Browse: https://github.com/munin-monitoring/munin
 Webservice: http://demo.munin-monitoring.org/
diff -pruN 2.0.57-1/dev_scripts/common.sh 2.0.69-1/dev_scripts/common.sh
--- 2.0.57-1/dev_scripts/common.sh	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/dev_scripts/common.sh	2021-11-22 22:12:17.000000000 +0000
@@ -1,7 +1,7 @@
 #!/bin/sh
 
 BASEDIR=$(readlink -f -- "$FINDBIN/..")
-DESTDIR="$BASEDIR/sandbox"
+DESTDIR=${DESTDIR:-$BASEDIR/sandbox}
 # shellcheck disable=SC2034
 PERLLIB=$DESTDIR$(perl -V:sitelib | cut -d"'" -f2)
 
diff -pruN 2.0.57-1/dev_scripts/install 2.0.69-1/dev_scripts/install
--- 2.0.57-1/dev_scripts/install	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/dev_scripts/install	2021-11-22 22:12:17.000000000 +0000
@@ -14,7 +14,21 @@ if [ $# -ne 0 ]; then
 fi
 
 make "DESTDIR=$DESTDIR" "HTMLDIR=$DESTDIR/www/munin" || exit
-fakeroot make install-common-prime install-master-prime install-node-prime install-plugins-prime install-man install-async "DESTDIR=$DESTDIR" "HTMLDIR=$DESTDIR/www/munin" || exit
+# Override users and groups with the current user - otherwise "install" fails, if these users
+# and groups are missing in the local system.
+fakeroot make \
+        install-common-prime \
+        install-master-prime \
+        install-node-prime \
+        install-plugins-prime \
+        install-man install-async \
+        "DESTDIR=$DESTDIR" \
+        "HTMLDIR=$DESTDIR/www/munin" \
+        "USER=$(id -u)" \
+        "CGIUSER=$(id -u)" \
+        "PLUGINUSER=$(id -u)" \
+        "GROUP=$(id -g)" \
+    || exit
 
 
 if [ $# -ne 0 ]; then
diff -pruN 2.0.57-1/dists/debian/README 2.0.69-1/dists/debian/README
--- 2.0.57-1/dists/debian/README	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/dists/debian/README	1970-01-01 00:00:00.000000000 +0000
@@ -1,22 +0,0 @@
-For Debian packaging trunk/dists/debian is _deprecated_.
-
-A branch for svn-buildpackage has been created at branches/debian,
-with subdirectories for each release codename:
-
-svn ls svn://munin-monitoring.org/munin/branches/debian
-
-This works with using released tarballs which are available in 
-munin/branches/debian/$codename/tarballs/
-
-############################################################################
-
-For working with munin SVN trunk, the easiest way is to checkout 
-squeeze/trunk/debian in the munin trunk directory as debian:
-
-$ svn co http://munin-monitoring.org/svn/munin/trunk/ munin-trunk
-$ cd munin-trunk
-$ svn co http://munin-monitoring.org/svn/munin/branches/debian/squeeze/trunk/debian/ debian
-
-Now dpkg-buildpackage should work flawlessly, but as this is trunk, it might
-not :-)
-
diff -pruN 2.0.57-1/dists/freebsd/munin-main/distinfo 2.0.69-1/dists/freebsd/munin-main/distinfo
--- 2.0.57-1/dists/freebsd/munin-main/distinfo	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/dists/freebsd/munin-main/distinfo	1970-01-01 00:00:00.000000000 +0000
@@ -1,2 +0,0 @@
-MD5 (munin_1.2.2.tar.gz) = e55ff3cc8d506558f32598f639952cca
-SIZE (munin_1.2.2.tar.gz) = 325356
diff -pruN 2.0.57-1/dists/freebsd/munin-main/files/patch-Makefile 2.0.69-1/dists/freebsd/munin-main/files/patch-Makefile
--- 2.0.57-1/dists/freebsd/munin-main/files/patch-Makefile	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/dists/freebsd/munin-main/files/patch-Makefile	1970-01-01 00:00:00.000000000 +0000
@@ -1,11 +0,0 @@
---- Makefile.orig	Tue May 11 22:23:06 2004
-+++ Makefile	Fri Jun  4 00:25:54 2004
-@@ -26,7 +26,7 @@
- 	mkdir -p $(HTMLDIR)
- 	mkdir -p $(DBDIR)
- 
--	$(CHOWN) $(USER) $(LOGDIR) $(STATEDIR) $(RUNDIR) $(HTMLDIR) $(DBDIR)
-+	$(CHOWN) $(USER) $(STATEDIR) $(RUNDIR) $(HTMLDIR) $(DBDIR)
- 
- 	for p in server/*.tmpl; do    		              \
- 		$(INSTALL) -m 0644 "$$p" $(CONFDIR)/templates/ ; \
diff -pruN 2.0.57-1/dists/freebsd/munin-main/files/patch-Makefile.config 2.0.69-1/dists/freebsd/munin-main/files/patch-Makefile.config
--- 2.0.57-1/dists/freebsd/munin-main/files/patch-Makefile.config	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/dists/freebsd/munin-main/files/patch-Makefile.config	1970-01-01 00:00:00.000000000 +0000
@@ -1,86 +0,0 @@
---- munin-1.1.7.orig/Makefile.config	2004-11-23 19:52:38.000000000 +0100
-+++ munin-1.1.7/Makefile.config	2004-11-27 12:46:19.000000000 +0100
-@@ -7,52 +7,56 @@
- #
- # the base of the Munin installation.
- # 
--PREFIX     = $(DESTDIR)/opt/munin
-+ifdef PREFIX
-+UPREFIX=$(PREFIX)
-+else
-+UPREFIX=/usr
-+endif
- 
- # Where Munin keeps its configurations (server.conf, client.conf, ++)
--CONFDIR    = $(DESTDIR)/etc/opt/munin
-+CONFDIR    = $(PREFIX)/etc/munin
- 
- # Server only - where to put munin-cron
--BINDIR     = $(PREFIX)/bin
-+BINDIR     = $(UPREFIX)/bin
- 
- # Client only - where to put munin-node, munin-node-configure, and munin-run
--SBINDIR    = $(PREFIX)/sbin
-+SBINDIR    = $(UPREFIX)/sbin
- 
- # Where to put text and html documentation
--DOCDIR     = $(PREFIX)/doc
-+DOCDIR     = $(UPREFIX)/doc
- 
- # Where to put man pages
--MANDIR     = $(PREFIX)/man
-+MANDIR     = $(UPREFIX)/man
- 
- # Where to put internal binaries and plugin repository
--LIBDIR     = $(PREFIX)/lib
-+LIBDIR     = $(DATADIR)
- 
- # Server only - Output directory
--HTMLDIR    = $(PREFIX)/var/www
--CGIDIR     = $(HTMLDIR)/cgi
-+HTMLDIR    = $(PREFIX)/www/data/munin
-+CGIDIR     = $(PREFIX)/www/cgi-bin
- 
- # Client only - Where to put RRD files and other intenal data
--DBDIR      = $(DESTDIR)/var/opt/munin
-+DBDIR      = $(PREFIX)/var/munin
- 
- # Client only - Where plugins should put their states. Must be writable by
- # group "munin", and should be preserved between reboots
- PLUGSTATE  = $(DBDIR)/plugin-state
- 
- # Where Munin should place its logs.
--LOGDIR     = $(DESTDIR)/var/log/munin
-+LOGDIR     = /var/log/munin-main
- 
- # Location of PID files and other statefiles. On the server, must be
- # writable by the user "munin".
--STATEDIR   = $(DESTDIR)/var/run/munin
-+STATEDIR   = /var/run/munin
- 
- # The perl interpreter to use
--PERL       = $(shell which perl)
-+# Passed in from FreeBSD port Makefile.
- 
- # The python interpreter to use (used by some plugins)
--PYTHON     = $(shell which python || echo /usr/bin/python)
-+PYTHON     = $(shell which python || echo /usr/local/bin/python)
- 
- # Server only - Where to install the perl libraries
--PERLLIB    = $(DESTDIR)$(shell $(PERL) -V:sitelib | cut -d= -f2 | sed "s/[\';]//g")
-+PERLLIB    = $(shell $(PERL) -V:sitelib | cut -d= -f2 | sed "s/[\';]//g")
- 
- # Client only - Install plugins for this architecture
- OSTYPE     = $(shell uname | tr '[A-Z]' '[a-z]')
-@@ -69,9 +73,8 @@
- GROUP      = munin
- 
- # Which command to use to check if the USER and GROUP to run Munin as, exists.
--GETENT = $(shell which getent || which true 2>/dev/null)
--CHECKUSER  = $(shell $(GETENT) passwd $(USER) >/dev/null 2>/dev/null || (echo "echo User $(USER) nonexistent. Create the user and retry; exit 2"))
--CHECKGROUP = $(shell $(GETENT) group $(GROUP) >/dev/null 2>/dev/null || (echo "echo Group $(GROUP) nonexistent. Create the group and retry; exit 2"))
-+CHECKUSER:= $(shell grep $(USER) /etc/passwd >/dev/null 2>/dev/null || (echo "echo User $(USER) nonexistent. Create the user and retry; exit 2"))
-+CHECKGROUP:= $(shell grep $(GROUP) /etc/group >/dev/null 2>/dev/null || (echo "echo Group $(GROUP) nonexistent. Create the group and retry; exit 2"))
- 
- CHOWN      = chown
- CHMOD      = chmod
diff -pruN 2.0.57-1/dists/freebsd/munin-main/files/patch-munin-limits.in 2.0.69-1/dists/freebsd/munin-main/files/patch-munin-limits.in
--- 2.0.57-1/dists/freebsd/munin-main/files/patch-munin-limits.in	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/dists/freebsd/munin-main/files/patch-munin-limits.in	1970-01-01 00:00:00.000000000 +0000
@@ -1,35 +0,0 @@
---- munin-1.2.0.orig/server/munin-limits.in	Wed Feb 16 21:03:31 2005
-+++ munin-1.2.0/server/munin-limits.in	Wed Feb 23 09:06:26 2005
-@@ -18,6 +18,12 @@
- #
- #
- # $Log: munin-limits.in,v $
-+# Revision 1.24.2.4  2005/02/19 16:06:14  ilmari
-+# Place the munin-limits lock file in rundir, not dbdir.
-+#
-+# Revision 1.24.2.3  2005/02/19 16:04:03  ilmari
-+# Fix the file vs. pipe check in munin-limits
-+#
- # Revision 1.24.2.2  2005/02/16 20:03:31  jimmyo
- # yet another rewrite of munin-limits open call (SF#1115434).
- #
-@@ -179,8 +185,8 @@
- my $modified=0;
- 
- logger("Starting munin-limits, checking lock");
--munin_runlock("$config->{dbdir}/munin-limits.lock");
--logger("Created lock: $config->{dbdir}/munin-limits.lock");
-+munin_runlock("$config->{rundir}/munin-limits.lock");
-+logger("Created lock: $config->{rundir}/munin-limits.lock");
- 
- if (!defined $config->{'contact'}->{'nagios'}->{'command'} and
- 	defined $config->{'nsca'})
-@@ -458,7 +464,7 @@
- 		    unshift (@cmd, "|-");
- 		}
- 		logger ("Debug: opening for writing: \"" . join('" "',@cmd) . "\".") if $DEBUG;
--		if ($cmd[0] == ">")
-+		if ($cmd[0] eq ">")
- 		{
- 		    if (! open ($pipe, join (' ', @cmd)))
- 		    {
diff -pruN 2.0.57-1/dists/freebsd/munin-main/files/pkg-message.in 2.0.69-1/dists/freebsd/munin-main/files/pkg-message.in
--- 2.0.57-1/dists/freebsd/munin-main/files/pkg-message.in	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/dists/freebsd/munin-main/files/pkg-message.in	1970-01-01 00:00:00.000000000 +0000
@@ -1,10 +0,0 @@
-
-********************************************************************
-Unless this file already existed, a sample configuration file
-has been placed in %%PREFIX%%/etc/munin/munin.conf.
-
-Please edit it according to your needs.
-
-The Munin server will be run from cron under the user 'munin'.
-********************************************************************
-
diff -pruN 2.0.57-1/dists/freebsd/munin-main/Makefile 2.0.69-1/dists/freebsd/munin-main/Makefile
--- 2.0.57-1/dists/freebsd/munin-main/Makefile	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/dists/freebsd/munin-main/Makefile	1970-01-01 00:00:00.000000000 +0000
@@ -1,62 +0,0 @@
-# New ports collection makefile for:	munin-main
-# Date created:				25 January 2004
-# Whom:					Lupe Christoph <lupe@lupe-christoph.de>
-#
-# $FreeBSD: ports/sysutils/munin-main/Makefile,v 1.7 2004/12/14 01:43:10 sem Exp $
-#
-
-PORTNAME=	munin
-PORTVERSION=	1.2.2
-CATEGORIES=	sysutils perl5
-MASTER_SITES=	${MASTER_SITE_SOURCEFORGE}
-MASTER_SITE_SUBDIR=	munin
-PKGNAMESUFFIX=	-main
-DISTNAME=	${PORTNAME}_${PORTVERSION:S/.r/rc/}
-
-MAINTAINER=	lupe@lupe-christoph.de
-COMMENT=	Collector part of Munin
-
-RUN_DEPENDS=	${SITE_PERL}/${PERL_ARCH}/RRDs.pm:${PORTSDIR}/net/rrdtool \
-		${SITE_PERL}/Net/Domain.pm:${PORTSDIR}/net/p5-Net \
-		${SITE_PERL}/HTML/Template.pm:${PORTSDIR}/www/p5-HTML-Template \
-		${SITE_PERL}/Date/Manip.pm:${PORTSDIR}/devel/p5-Date-Manip
-BUILD_DEPENDS=	${RUN_DEPENDS}
-
-.include <bsd.port.pre.mk>
-
-.if ${PERL_LEVEL} <= 500800
-RUN_DEPENDS+=	${SITE_PERL}/${PERL_ARCH}/Storable.pm:${PORTSDIR}/devel/p5-Storable \
-		${SITE_PERL}/${PERL_ARCH}/Digest/MD5.pm:${PORTSDIR}/security/p5-Digest-MD5 \
-		${SITE_PERL}/${PERL_ARCH}/Time/HiRes.pm:${PORTSDIR}/devel/p5-Time-HiRes \
-		${SITE_PERL}/Text/Balanced.pm:${PORTSDIR}/textproc/p5-Text-Balanced
-.endif
-
-USE_GMAKE=	yes
-PATCH_STRIP=	-p1
-WRKSRC=		${WRKDIR}/${PORTNAME}-${PORTVERSION:S/.r/rc/}
-PKGMESSAGE=	${WRKDIR}/pkg-message
-ALL_TARGET=	DATADIR=${DATADIR} PERL=${PERL} build build-man
-INSTALL_TARGET=	DATADIR=${DATADIR} PERL=${PERL} install-main
-
-MAN5=		munin.conf.5
-MAN8=		munin-cron.8 munin-graph.8 munin-html.8 munin-limits.8 munin-update.8
-
-SUB_FILES=pkg-message
-
-pre-install:
-	@PKG_PREFIX=${PREFIX} ${SH} pkg-install ${PKGNAME} PRE-INSTALL
-
-post-install:
-	@${INSTALL_DATA} ${WRKSRC}/build/server/munin.conf ${PREFIX}/etc/munin/munin.conf.sample
-	@for man in ${MAN5}; do \
-		${INSTALL_MAN} -C ${WRKSRC}/build/doc/$$man ${PREFIX}/man/man5; \
-	done
-	@for man in ${MAN8}; do \
-		${INSTALL_MAN} -C ${WRKSRC}/build/doc/$$man ${PREFIX}/man/man8; \
-	done
-	@DATADIR=${DATADIR} PKG_PREFIX=${PREFIX} ${SH} pkg-install ${PKGNAME} POST-INSTALL
-	@${CHOWN} munin /var/log/munin-main
-	@${CHGRP} munin /var/run/munin /var/log/munin-main ${PREFIX}/www/data/munin ${PREFIX}/var/munin
-	@${CAT} ${PKGMESSAGE}
-
-.include <bsd.port.post.mk>
diff -pruN 2.0.57-1/dists/freebsd/munin-main/pkg-deinstall 2.0.69-1/dists/freebsd/munin-main/pkg-deinstall
--- 2.0.57-1/dists/freebsd/munin-main/pkg-deinstall	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/dists/freebsd/munin-main/pkg-deinstall	1970-01-01 00:00:00.000000000 +0000
@@ -1,116 +0,0 @@
-#! /bin/sh
-
-ask() {
-    local question default answer
-
-    question=$1
-    default=$2
-    if [ -z "${PACKAGE_BUILDING}" ]; then
-	read -p "${question} [${default}]? " answer
-    fi
-    if [ x${answer} = x ]; then
-	answer=${default}
-    fi
-    echo ${answer}
-}
-
-yesno() {
-    local dflt question answer
-
-    question=$1
-    dflt=$2
-    while :; do
-	answer=$(ask "${question}" "${dflt}")
-	case "${answer}" in
-	[Yy]*)		return 0;;
-	[Nn]*)		return 1;;
-	esac
-	echo "Please answer yes or no."
-    done
-}
-
-delete_account() {
-    local u g home
-
-    u=$1
-    g=$2
-    if pw group show ${g} > /dev/null 2>&1; then
-	if yesno "Do you want me to remove group \"${g}\"" y; then
-	    pw group del -n ${g}
-	    echo "Done."
-	else
-	    GID=`pw group show ${g} | awk -F: '{ print $3 }'`
-	fi
-    fi
-    if pw user show ${u} > /dev/null 2>&1; then
-	if yesno "Do you want me to remove user \"${u}\"" y; then
-	    eval home=~${u}
-	    pw user del -n ${u} -r
-	    echo "Done."
-	    if [ -d "${home}" ]; then
-		echo "Please remember to remove the home directory \"${home}\""
-	    fi
-
-	    # pw user del may have removed the group, too.
-	    # Put it back if the admin asked us to retain it.
-	    if [ -n "$GID" ]; then
-		pw group show ${g} > /dev/null 2>&1
-		if [ $? -ne 0 ]; then
-		    pw group add ${g}
-		fi
-	    fi
-	fi
-    fi
-}
-
-delete_crontab_entries() {
-    local b e
-    b=$1
-    e=$2
-
-    TMPFILE=`mktemp -t munin` || exit 1
-    crontab -u munin -l | sed -e "/^$b\$/,/^$e\$/d" -e '/^[ 	]*#/d' -e '/^$/d' > $TMPFILE
-    if [ -s $TMPFILE ]; then
-	crontab -u munin -l | sed -e "/^$b\$/,/^$e\$/d" | crontab -u munin -
-	echo "The crontab for user munin had manually created entries."
-	echo "Only the automatically created entries have been removed."
-	echo "These are the remaining lines:"
-	crontab -u munin -l
-    else
-	crontab -u munin -r
-	echo "crontab for user munin removed"
-    fi
-    rm $TMPFILE
-}
-
-delnewsyslog() {
-    tmp="/etc/#munin-node$$"
-    sed -e '/^\/var\/log\/munin-main\/\*[       ]/d' /etc/newsyslog.conf >${tmp}
-    cat ${tmp} > /etc/newsyslog.conf
-    rm ${tmp}
-}
-
-newsyslog() {
-    ENTRY=`fgrep '/var/log/munin-main/*' /etc/newsyslog.conf`
-    DEFAULT='/var/log/munin-main/*	munin:munin	644  7	   *	@T00  GNWZ'
-    if [ -z "$ENTRY" ]; then
-        exit 0
-    elif [ "$ENTRY" = "$DEFAULT" ]; then
-        delnewsyslog
-    elif yesno "You have changed the default munin-main entry in \"/etc/newsyslog.conf\".
-Do you want me to delete it?" y; then
-        delnewsyslog
-        echo "Done."
-    fi
-}
-
-
-case $2 in
-    DEINSTALL)
-	delete_crontab_entries '#BEGIN_MUNIN' '#END_MUNIN'
-	newsyslog
-	;;
-    POST-DEINSTALL)
-	delete_account munin munin
-	;;
-esac
diff -pruN 2.0.57-1/dists/freebsd/munin-main/pkg-descr 2.0.69-1/dists/freebsd/munin-main/pkg-descr
--- 2.0.57-1/dists/freebsd/munin-main/pkg-descr	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/dists/freebsd/munin-main/pkg-descr	1970-01-01 00:00:00.000000000 +0000
@@ -1,14 +0,0 @@
-Munin network-wide graphing framework (node)
-
-Munin is a tool for graphing all sorts of information about one or more
-servers and displaying it in a web interface. It uses the excellent
-RRDTool (written by Tobi Oetiker) and is written in Perl. Munin has a
-master/node architecture. The master connects to all the nodes at regular
-intervals, and asks them for data. It then stores the data in RRD-files,
-and (if needed) updates the graphs. One of the main goals have been ease
-of creating own "plugins" (graphs).
-
-This is the collector. It is installed on the machine that shall collect
-and display performance data.
-
-WWW: http://munin-monitoring.org
diff -pruN 2.0.57-1/dists/freebsd/munin-main/pkg-install 2.0.69-1/dists/freebsd/munin-main/pkg-install
--- 2.0.57-1/dists/freebsd/munin-main/pkg-install	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/dists/freebsd/munin-main/pkg-install	1970-01-01 00:00:00.000000000 +0000
@@ -1,121 +0,0 @@
-#! /bin/sh
-
-ask() {
-    local question default answer
-
-    question=$1
-    default=$2
-    if [ -z "${PACKAGE_BUILDING}" ]; then
-        read -p "${question} [${default}]? " answer
-    fi
-    if [ x${answer} = x ]; then
-        answer=${default}
-    fi
-    echo ${answer}
-}
-
-yesno() {
-    local dflt question answer
-
-    question=$1
-    dflt=$2
-    while :; do
-        answer=$(ask "${question}" "${dflt}")
-        case "${answer}" in
-        [Yy]*)          return 0;;
-        [Nn]*)          return 1;;
-        esac
-        echo "Please answer yes or no."
-    done
-}
-
-make_account() {
-    local u g gcos
-
-    u=$1
-    g=$2
-    gcos=$3
-
-    if pw group show "${g}" >/dev/null 2>&1; then
-	echo "You already have a group \"${g}\", so I will use it."
-    else
-	echo "You need a group \"${g}\"."
-	if which -s pw && yesno "Would you like me to create it" y; then
-	    pw groupadd ${g} || exit
-	    echo "Done."
-	else
-	    echo "Please create it, and try again."
-	    if ! grep -q "^${u}:" /etc/passwd; then
-		echo "While you're at it, please create a user \"${u}\" too,"
-		echo "with a default group of \"${g}\"."
-	    fi
-	    exit 1
-	fi
-    fi
-    
-    if pw user show "${u}" >/dev/null 2>&1; then
-	echo "You already have a user \"${u}\", so I will use it."
-    else
-	echo "You need a user \"${u}\"."
-	if which -s pw && yesno "Would you like me to create it" y; then
-	    pw useradd ${u} -g ${g} -h - \
-		-s /bin/sh -c "${gcos}" || exit
-	    echo "Done."
-	else
-	    echo "Please create it, and try again."
-	    exit 1
-	fi
-    fi
-}
-
-create_crontab_entries() {
-    local b e
-    b=$1
-    e=$2
-
-    if [ crontab -u munin -l > /dev/null 2>&1 ]; then
-	TMPFILE=`mktemp -t munin` || exit 1
-	sed -n -e "/^$b\$/,/^$e\$/p" > $TMPFILE
-	crontab -u munin -l | sed -e '/^#BEGIN_MUNIN$/,/^#END_MUNIN$/d' | \
-	cat - $TMPFILE | crontab -u munin -
-	rm $TMPFILE
-    else
-	crontab -u munin -
-    fi
-}
-
-mklogdir() {
-}
-
-newsyslog() {
-    if fgrep -q '/var/log/munin-main/*' /etc/newsyslog.conf; then
-        :
-    else
-        cat >> /etc/newsyslog.conf <<EOT
-/var/log/munin-main/*	munin:munin	644  7	   *	@T00  GNWZ
-EOT
-    fi  
-}
-
-
-########################################################################
-
-case $2 in
-    PRE-INSTALL)
-	make_account munin munin "Munin owner"
-	;;      
-    POST-INSTALL)
-	newsyslog
-	create_crontab_entries '#BEGIN_MUNIN' '#END_MUNIN' <<EOT
-#
-# cron-jobs for munin
-#
-
-#BEGIN_MUNIN
-MAILTO=root
-
-*/5 * * * *     ${PKG_PREFIX}/bin/munin-cron
-#END_MUNIN
-EOT
-	;;      
-esac
diff -pruN 2.0.57-1/dists/freebsd/munin-main/pkg-plist 2.0.69-1/dists/freebsd/munin-main/pkg-plist
--- 2.0.57-1/dists/freebsd/munin-main/pkg-plist	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/dists/freebsd/munin-main/pkg-plist	1970-01-01 00:00:00.000000000 +0000
@@ -1,54 +0,0 @@
-@exec mkdir -p /var/run/munin && chown munin:munin /var/run/munin
-@exec mkdir -p /var/log/munin-main && chown munin:munin /var/log/munin-main
-@exec mkdir -p %D/www/data/munin && chown munin:munin %D/www/data/munin
-@exec mkdir -p %D/var/munin && chown munin:munin %D/var/munin
-bin/munin-cron
-@unexec if cmp -s %D/etc/munin/templates/style.css %D/www/data/munin/style.css; then rm -f %D/www/data/munin/style.css; fi
-@unexec if cmp -s %D/etc/munin/templates/logo.png %D/www/data/munin/logo.png; then rm -f %D/www/data/munin/logo.png; fi
-@unexec if cmp -s %D/etc/munin/munin.conf.sample %D/etc/munin/munin.conf; then rm -f %D/etc/munin/munin.conf; fi
-etc/munin/munin.conf.sample
-etc/munin/templates/definitions.html
-etc/munin/templates/logo.png
-etc/munin/templates/munin-comparison-day.tmpl
-etc/munin/templates/munin-comparison-month.tmpl
-etc/munin/templates/munin-comparison-week.tmpl
-etc/munin/templates/munin-comparison-year.tmpl
-etc/munin/templates/munin-domainview.tmpl
-etc/munin/templates/munin-nodeview.tmpl
-etc/munin/templates/munin-overview.tmpl
-etc/munin/templates/munin-serviceview.tmpl
-etc/munin/templates/style.css
-%%SITE_PERL%%/Munin.pm
-share/munin/munin-graph
-share/munin/munin-html
-share/munin/munin-limits
-share/munin/munin-update
-www/cgi-bin/munin-cgi-graph
-@unexec rm -f /var/run/munin/munin-*.lock
-@unexec rmdir /var/run/munin 2>/dev/null || true
-@unexec rmdir /var/log/munin-main 2>/dev/null || true
-@unexec rmdir %D/www/data/munin 2>/dev/null || true
-@unexec rmdir %D/www/data 2>/dev/null || true
-@unexec rmdir %D/www/cgi-bin 2>/dev/null || true
-@unexec rmdir %D/var/munin 2>/dev/null || true
-@unexec rmdir %D/share/munin 2>/dev/null || true
-@unexec rmdir %D/etc/munin/templates 2>/dev/null || true
-@unexec rmdir %D/etc/munin 2>/dev/null || true
-@unexec echo
-@unexec echo '********************************************************************'
-@unexec echo "If you want to *completely* remove munin-main, you have to"
-@unexec echo
-@unexec if [ -d %D/www/data/munin ]; then echo "    rm -rf %D/www/data/munin \\"; fi
-@unexec if [ -d %D/var/munin ]; then ls -d %D/var/munin/* | grep -v plugin-state | fmt -40 | sed -e 's/^/           /' -e 's/$/ \\/'; fi
-@unexec if [ -f %D/etc/munin/munin.conf ]; then echo "           %D/etc/munin/munin.conf \\"; fi
-@unexec if [ -d %D/etc/munin/templates ]; then echo "           %D/etc/munin/templates \\"; fi
-@unexec echo "           /var/log/munin-main"
-@unexec echo
-@unexec echo "If you have already deinstalled munin-node, you can also"
-@unexec echo
-@unexec echo "    rmdir %D/etc/munin %D/var/munin"
-@unexec echo
-@unexec echo "These files and directories have to be left on the system because"
-@unexec echo "you may be performing an update. This process can't tell."
-@unexec echo '********************************************************************'
-@unexec echo
diff -pruN 2.0.57-1/dists/freebsd/munin-node/distinfo 2.0.69-1/dists/freebsd/munin-node/distinfo
--- 2.0.57-1/dists/freebsd/munin-node/distinfo	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/dists/freebsd/munin-node/distinfo	1970-01-01 00:00:00.000000000 +0000
@@ -1,2 +0,0 @@
-MD5 (munin_1.2.2.tar.gz) = e55ff3cc8d506558f32598f639952cca
-SIZE (munin_1.2.2.tar.gz) = 325356
diff -pruN 2.0.57-1/dists/freebsd/munin-node/files/munin-node-revive.sh.in 2.0.69-1/dists/freebsd/munin-node/files/munin-node-revive.sh.in
--- 2.0.57-1/dists/freebsd/munin-node/files/munin-node-revive.sh.in	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/dists/freebsd/munin-node/files/munin-node-revive.sh.in	1970-01-01 00:00:00.000000000 +0000
@@ -1,27 +0,0 @@
-#!/bin/sh
-
-#
-# Add the following lines to /etc/rc.conf to enable munin-node:
-# munin_node_enable (bool):      Set to "NO" by default.
-#                                Set it to "YES" to enable munin-node
-# munin_node_config (path):      Set to "%%PREFIX%%/etc/munin/munin-node.conf" by default.
-#
-
-. %%RC_SUBR%%
-
-name="munin_node"
-rcvar=`set_rcvar`
-
-[ -z "$munin_node_enable" ] && munin_node_enable="NO"
-[ -z "$munin_node_config" ] && munin_node_config="%%PREFIX%%/etc/munin/munin-node.conf"
-
-command="%%PREFIX%%/sbin/munin-node"
-pidfile=`awk '$1 == "pid_file" { print $2 }' $munin_node_config`
-
-load_rc_config $name
-
-#set -x
-pid=`check_pidfile $pidfile %%PREFIX%%/sbin/munin-node`
-if [ -z "$pid" ]; then
-  run_rc_command start > /dev/null
-fi
diff -pruN 2.0.57-1/dists/freebsd/munin-node/files/munin_node.sh 2.0.69-1/dists/freebsd/munin-node/files/munin_node.sh
--- 2.0.57-1/dists/freebsd/munin-node/files/munin_node.sh	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/dists/freebsd/munin-node/files/munin_node.sh	1970-01-01 00:00:00.000000000 +0000
@@ -1,28 +0,0 @@
-#!/bin/sh
-#
-
-# PROVIDE: munin-node
-# REQUIRE: DAEMON
-# BEFORE:  cron
-# KEYWORD: FreeBSD
-
-#
-# Add the following lines to /etc/rc.conf to enable munin-node:
-# munin_node_enable (bool):      Set to "NO" by default.
-#                                Set it to "YES" to enable munin-node
-# munin_node_config (path):      Set to "%PREFIX%/etc/munin/munin-node.conf" by default.
-#
-
-. /etc/rc.subr
-
-name="munin_node"
-rcvar=`set_rcvar`
-
-[ -z "$munin_node_enable" ] && munin_node_enable="NO"
-[ -z "$munin_node_config" ] && munin_node_config="/usr/local/etc/munin/munin-node.conf"
-
-command="/usr/local/sbin/munin-node"
-pidfile=`awk '$1 == "pid_file" { print $2 }' $munin_node_config`
-
-load_rc_config $name
-run_rc_command "$1"
diff -pruN 2.0.57-1/dists/freebsd/munin-node/files/munin-node.sh.in 2.0.69-1/dists/freebsd/munin-node/files/munin-node.sh.in
--- 2.0.57-1/dists/freebsd/munin-node/files/munin-node.sh.in	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/dists/freebsd/munin-node/files/munin-node.sh.in	1970-01-01 00:00:00.000000000 +0000
@@ -1,28 +0,0 @@
-#!/bin/sh
-#
-
-# PROVIDE: munin-node
-# REQUIRE: DAEMON
-# BEFORE:  cron
-# KEYWORD: FreeBSD
-
-#
-# Add the following lines to /etc/rc.conf to enable munin-node:
-# munin_node_enable (bool):      Set to "NO" by default.
-#                                Set it to "YES" to enable munin-node
-# munin_node_config (path):      Set to "%%PREFIX%%/etc/munin/munin-node.conf" by default.
-#
-
-. %%RC_SUBR%%
-
-name="munin_node"
-rcvar=`set_rcvar`
-
-[ -z "$munin_node_enable" ] && munin_node_enable="NO"
-[ -z "$munin_node_config" ] && munin_node_config="%%PREFIX%%/etc/munin/munin-node.conf"
-
-command="%%PREFIX%%/sbin/munin-node"
-pidfile=`awk '$1 == "pid_file" { print $2 }' $munin_node_config`
-
-load_rc_config $name
-run_rc_command "$1"
diff -pruN 2.0.57-1/dists/freebsd/munin-node/files/patch-cpu.in 2.0.69-1/dists/freebsd/munin-node/files/patch-cpu.in
--- 2.0.57-1/dists/freebsd/munin-node/files/patch-cpu.in	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/dists/freebsd/munin-node/files/patch-cpu.in	1970-01-01 00:00:00.000000000 +0000
@@ -1,15 +0,0 @@
---- munin-1.0.4.orig/node/node.d.freebsd/cpu.in	Sun May  9 21:18:35 2004
-+++ munin-1.0.4/node/node.d.freebsd/cpu.in	Sat Nov 20 15:32:50 2004
-@@ -59,10 +59,10 @@
- 	OSV=`/sbin/sysctl -n kern.osrelease | cut -f1 -d.`
- 	if [ "$OSV" = "4" ]; then
- 		STATUNITS=`/sbin/sysctl -n kern.clockrate | cut -f16 -d' '`
--	elif [ "$OSV" = "5" ]; then
-+	elif [ "$OSV" -ge "5" ]; then
- 		STATUNITS=`/sbin/sysctl -n kern.clockrate | cut -f13 -d' '`
- 	fi
--#	PERCENT=`/sbin/sysctl -n hw.ncpu | awk '{print ($1)*100}'`
-+	PERCENT=`/sbin/sysctl -n hw.ncpu | awk '{print ($1)*100}'`
- 	SCALE=`echo 'scale=5;' $PERCENT/$STATUNITS | bc -q `
- 	NCPU=`/sbin/sysctl -n hw.ncpu`
- 	if [ "$scaleto100" = yes ]; then
diff -pruN 2.0.57-1/dists/freebsd/munin-node/files/patch-Makefile 2.0.69-1/dists/freebsd/munin-node/files/patch-Makefile
--- 2.0.57-1/dists/freebsd/munin-node/files/patch-Makefile	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/dists/freebsd/munin-node/files/patch-Makefile	1970-01-01 00:00:00.000000000 +0000
@@ -1,10 +0,0 @@
---- munin-1.0.0pre2.orig/Makefile	Sat Jan 31 19:45:19 2004
-+++ munin-1.0.0pre2/Makefile	Sun Feb  1 14:22:46 2004
-@@ -150,6 +150,7 @@
- build-man: build-man-stamp
- 
- build-man-stamp:
-+	mkdir -p build/doc
- 	pod2man  --section=8 --release=$(RELEASE) --center="Munin Documentation" \
- 		node/munin-node.in > build/doc/munin-node.8
- 	pod2man  --section=8 --release=$(RELEASE) --center="Munin Documentation" \
diff -pruN 2.0.57-1/dists/freebsd/munin-node/files/patch-Makefile.config 2.0.69-1/dists/freebsd/munin-node/files/patch-Makefile.config
--- 2.0.57-1/dists/freebsd/munin-node/files/patch-Makefile.config	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/dists/freebsd/munin-node/files/patch-Makefile.config	1970-01-01 00:00:00.000000000 +0000
@@ -1,86 +0,0 @@
---- munin-1.1.7.orig/Makefile.config	Tue Nov 23 19:52:38 2004
-+++ munin-1.1.7/Makefile.config	Sun Nov 28 13:28:12 2004
-@@ -7,52 +7,56 @@
- #
- # the base of the Munin installation.
- # 
--PREFIX     = $(DESTDIR)/opt/munin
-+ifdef PREFIX
-+UPREFIX=$(PREFIX)
-+else
-+UPREFIX=/usr
-+endif
- 
- # Where Munin keeps its configurations (server.conf, client.conf, ++)
--CONFDIR    = $(DESTDIR)/etc/opt/munin
-+CONFDIR    = $(PREFIX)/etc/munin
- 
- # Server only - where to put munin-cron
--BINDIR     = $(PREFIX)/bin
-+BINDIR     = $(UPREFIX)/bin
- 
- # Client only - where to put munin-node, munin-node-configure, and munin-run
--SBINDIR    = $(PREFIX)/sbin
-+SBINDIR    = $(UPREFIX)/sbin
- 
- # Where to put text and html documentation
--DOCDIR     = $(PREFIX)/doc
-+DOCDIR     = $(UPREFIX)/doc
- 
- # Where to put man pages
--MANDIR     = $(PREFIX)/man
-+MANDIR     = $(UPREFIX)/man
- 
- # Where to put internal binaries and plugin repository
--LIBDIR     = $(PREFIX)/lib
-+LIBDIR     = $(DATADIR)
- 
- # Server only - Output directory
--HTMLDIR    = $(PREFIX)/var/www
--CGIDIR     = $(HTMLDIR)/cgi
-+HTMLDIR    = $(PREFIX)/www/data/munin
-+CGIDIR     = $(PREFIX)/www/cgi-bin
- 
- # Client only - Where to put RRD files and other intenal data
--DBDIR      = $(DESTDIR)/var/opt/munin
-+DBDIR      = $(PREFIX)/var/munin
- 
- # Client only - Where plugins should put their states. Must be writable by
- # group "munin", and should be preserved between reboots
- PLUGSTATE  = $(DBDIR)/plugin-state
- 
- # Where Munin should place its logs.
--LOGDIR     = $(DESTDIR)/var/log/munin
-+LOGDIR     = /var/log
- 
- # Location of PID files and other statefiles. On the server, must be
- # writable by the user "munin".
--STATEDIR   = $(DESTDIR)/var/run/munin
-+STATEDIR   = /var/run/munin
- 
- # The perl interpreter to use
--PERL       = $(shell which perl)
-+# Passed in from FreeBSD port Makefile.
- 
- # The python interpreter to use (used by some plugins)
--PYTHON     = $(shell which python || echo /usr/bin/python)
-+PYTHON     = $(shell which python || echo /usr/local/bin/python)
- 
- # Server only - Where to install the perl libraries
--PERLLIB    = $(DESTDIR)$(shell $(PERL) -V:sitelib | cut -d= -f2 | sed "s/[\';]//g")
-+PERLLIB    = $(shell $(PERL) -V:sitelib | cut -d= -f2 | sed "s/[\';]//g")
- 
- # Client only - Install plugins for this architecture
- OSTYPE     = $(shell uname | tr '[A-Z]' '[a-z]')
-@@ -69,9 +73,8 @@
- GROUP      = munin
- 
- # Which command to use to check if the USER and GROUP to run Munin as, exists.
--GETENT = $(shell which getent || which true 2>/dev/null)
--CHECKUSER  = $(shell $(GETENT) passwd $(USER) >/dev/null 2>/dev/null || (echo "echo User $(USER) nonexistent. Create the user and retry; exit 2"))
--CHECKGROUP = $(shell $(GETENT) group $(GROUP) >/dev/null 2>/dev/null || (echo "echo Group $(GROUP) nonexistent. Create the group and retry; exit 2"))
-+CHECKUSER:= $(shell grep $(USER) /etc/passwd >/dev/null 2>/dev/null || (echo "echo User $(USER) nonexistent. Create the user and retry; exit 2"))
-+CHECKGROUP:= $(shell grep $(GROUP) /etc/group >/dev/null 2>/dev/null || (echo "echo Group $(GROUP) nonexistent. Create the group and retry; exit 2"))
- 
- CHOWN      = chown
- CHMOD      = chmod
diff -pruN 2.0.57-1/dists/freebsd/munin-node/files/patch-munin-node.conf.in 2.0.69-1/dists/freebsd/munin-node/files/patch-munin-node.conf.in
--- 2.0.57-1/dists/freebsd/munin-node/files/patch-munin-node.conf.in	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/dists/freebsd/munin-node/files/patch-munin-node.conf.in	1970-01-01 00:00:00.000000000 +0000
@@ -1,11 +0,0 @@
---- munin-1.0.0pre1.orig/node/munin-node.conf.in	Thu Jan 15 15:28:57 2004
-+++ munin-1.0.0pre1/node/munin-node.conf.in	Sun Jan 25 14:26:15 2004
-@@ -12,7 +12,7 @@
- # Which port to bind to;
- host *
- user root
--group root
-+group wheel
- setsid yes
- 
- # Regexps for files to ignore
diff -pruN 2.0.57-1/dists/freebsd/munin-node/files/patch-ping_.in 2.0.69-1/dists/freebsd/munin-node/files/patch-ping_.in
--- 2.0.57-1/dists/freebsd/munin-node/files/patch-ping_.in	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/dists/freebsd/munin-node/files/patch-ping_.in	1970-01-01 00:00:00.000000000 +0000
@@ -1,23 +0,0 @@
---- munin-1.1.7.orig/node/node.d/ping_.in	Tue Nov 16 21:10:19 2004
-+++ munin-1.1.7/node/node.d/ping_.in	Sun Nov 28 11:30:36 2004
-@@ -22,9 +22,14 @@
- # Parameters:
- #
- # 	ping_args      - Arguments to ping (default "-c 2")
-+#	ping_args2     - Arguments after the host name (required for Solaris)
- # 	ping           - Ping program to use
- # 	host           - Host to ping
- #
-+# Arguments for Solaris:
-+#	ping_args      -s
-+#	ping_args2     56 2
-+#
- #%# family=manual
- 
- file_host=`basename $0 | sed 's/^ping_//g'`
-@@ -45,4 +50,4 @@
- fi
- 
- 
--${ping:-ping} ${ping_args:--c 2} ${host:-${file_host:-www.google.com}} | awk '/min\/avg\/max/ { split ($0, arr, "/"); print "ping.value " (arr[4]/1000)} /% packet loss/ {split ($7, arr2, "%"); print "packetloss.value " arr2[1]}'
-+${ping:-ping} ${ping_args:--c 2} ${host:-${file_host:-www.google.com}} ${ping_args2} | perl -n -e 'print "ping.value ", $1 / 1000, "\n" if m@min/avg/max.*\s\d+(?:\.\d+)?/(\d+(?:\.\d+)?)/\d+(?:\.\d+)?@; print "packetloss.value $1\n" if /(\d+)% packet loss/;'
diff -pruN 2.0.57-1/dists/freebsd/munin-node/files/patch-sendmail_mailtraffic.in 2.0.69-1/dists/freebsd/munin-node/files/patch-sendmail_mailtraffic.in
--- 2.0.57-1/dists/freebsd/munin-node/files/patch-sendmail_mailtraffic.in	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/dists/freebsd/munin-node/files/patch-sendmail_mailtraffic.in	1970-01-01 00:00:00.000000000 +0000
@@ -1,11 +0,0 @@
---- munin-1.1.7.orig/node/node.d/sendmail_mailtraffic.in	Sun Nov 21 21:27:53 2004
-+++ munin-1.1.7/node/node.d/sendmail_mailtraffic.in	Sun Nov 28 10:50:45 2004
-@@ -26,7 +26,7 @@
- TEMP_FILE=/tmp/munin-sendmail.$$
- 
- if [ "$1" = "autoconf" ]; then
--	if [ -f ${TEMP_FILE} ] ; then
-+	if which mailstats 2>&1 > /dev/null ; then
- 		echo yes
- 		exit 0
- 	else
diff -pruN 2.0.57-1/dists/freebsd/munin-node/files/patch-vmstat.in 2.0.69-1/dists/freebsd/munin-node/files/patch-vmstat.in
--- 2.0.57-1/dists/freebsd/munin-node/files/patch-vmstat.in	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/dists/freebsd/munin-node/files/patch-vmstat.in	1970-01-01 00:00:00.000000000 +0000
@@ -1,29 +0,0 @@
---- munin-1.1.4.orig/node/node.d.freebsd/vmstat.in	2004-05-20 21:02:36.000000000 +0200
-+++ munin-1.1.4/node/node.d.freebsd/vmstat.in	2004-11-21 14:30:18.000000000 +0100
-@@ -35,7 +35,7 @@
- OSV=`/sbin/sysctl -n kern.osrelease | cut -f1 -d.`
- 
- if [ "$1" = "autoconf" ]; then
--	if [ "$OSV" = "5" ]; then
-+	if [ "$OSV" -ge "5" ]; then
- 		/sbin/sysctl -n vm.vmtotal 2>/dev/null >/dev/null
- 		RESULT=$?
- 		NAME=/sbin/sysctl
-@@ -63,7 +63,7 @@
- 	echo 'graph_args --base 1000 -l 0'
- 	echo 'graph_vlabel process states'
- 	echo 'graph_category processes'
--	if [ "$OSV" = "5" ]; then
-+	if [ "$OSV" -ge "5" ]; then
- 		echo 'running.label running'
- 		echo 'running.type GAUGE'
- 		echo 'diskwait.label diskwait'
-@@ -81,7 +81,7 @@
- 	exit 0
- fi
- 
--if [ "$OSV" = "5" ]; then
-+if [ "$OSV" -ge "5" ]; then
- 	sysctl -n vm.vmtotal | awk '
- /^Processes:/ {
- 	print "running.value", $3;
diff -pruN 2.0.57-1/dists/freebsd/munin-node/files/pkg-message.4 2.0.69-1/dists/freebsd/munin-node/files/pkg-message.4
--- 2.0.57-1/dists/freebsd/munin-node/files/pkg-message.4	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/dists/freebsd/munin-node/files/pkg-message.4	1970-01-01 00:00:00.000000000 +0000
@@ -1,12 +0,0 @@
-
-********************************************************************
-Unless this file already existed, a sample configuration file
-has been placed in %%PREFIX%%/etc/munin/munin-node.conf.
-
-Please edit it according to your needs.
-
-The Munin client will be started at system boot automatically.
-You can start it manually with:
-    %%PREFIX%%/etc/rc.d/munin-node.sh start
-********************************************************************
-
diff -pruN 2.0.57-1/dists/freebsd/munin-node/files/pkg-message.in 2.0.69-1/dists/freebsd/munin-node/files/pkg-message.in
--- 2.0.57-1/dists/freebsd/munin-node/files/pkg-message.in	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/dists/freebsd/munin-node/files/pkg-message.in	1970-01-01 00:00:00.000000000 +0000
@@ -1,21 +0,0 @@
-
-********************************************************************
-Unless this file already existed, a sample configuration file
-has been placed in %%PREFIX%%/etc/munin/munin-node.conf.
-
-Please edit it according to your needs.
-
-********************************************************************
-
-The Munin client will *not* be started automatically. To allow it
-to start, put this line in /etc/rc.conf:
-
-munin_node_enable="YES"
-
-Then, it will be started on the next boot. If this line is already
-present, the client will be started now.  Otherwise, edit
-/etc/rc.conf and execute this command:
-
-    %%PREFIX%%/etc/rc.d/munin-node.sh start
-********************************************************************
-
diff -pruN 2.0.57-1/dists/freebsd/munin-node/files/plugins.conf 2.0.69-1/dists/freebsd/munin-node/files/plugins.conf
--- 2.0.57-1/dists/freebsd/munin-node/files/plugins.conf	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/dists/freebsd/munin-node/files/plugins.conf	1970-01-01 00:00:00.000000000 +0000
@@ -1,37 +0,0 @@
-# This file is used to configure how the plugins are invoked.
-# Place in /etc/munin/plugin-conf.d/ or corresponding directory.
-#
-# PLEASE NOTE: Changes in the plugin-conf.d directory are only
-# read at munin-node startup, so restart at any changes.
-#
-#
-#  user <user>         # Set the user to run the plugin as
-#  group <group>       # Set the group to run the plugin as
-#  command <command>   # Run <command> instead of the plugin. %c
-# 	                 expands to what would normally be run.
-#  env.<variable> <value> # Sets <variable> in the plugin's environment, see the
-#                        individual plugins to find out which variables they
-#                        care about.
-#
-
-[mysql*]
-#env.mysqlopts -u someuser
-
-[exim*]
-group mail
-
-[cps*]
-user root
-
-[apt]
-user root
-
-[vlan*]
-user root
-
-[postfix*]
-user root
-env.logfile maillog
-
-[sendmail*]
-env.mspqueue /var/spool/clientmqueue
diff -pruN 2.0.57-1/dists/freebsd/munin-node/Makefile 2.0.69-1/dists/freebsd/munin-node/Makefile
--- 2.0.57-1/dists/freebsd/munin-node/Makefile	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/dists/freebsd/munin-node/Makefile	1970-01-01 00:00:00.000000000 +0000
@@ -1,68 +0,0 @@
-# New ports collection makefile for:	munin-node
-# Date created:				25 January 2004
-# Whom:					Lupe Christoph <lupe@lupe-christoph.de>
-#
-# $FreeBSD: ports/sysutils/munin-node/Makefile,v 1.12 2004/12/14 01:43:10 sem Exp $
-#
-
-PORTNAME=	munin
-PORTVERSION=	1.2.2
-CATEGORIES=	sysutils perl5
-MASTER_SITES=	${MASTER_SITE_SOURCEFORGE}
-MASTER_SITE_SUBDIR=	munin
-PKGNAMESUFFIX=	-node
-DISTNAME=	${PORTNAME}_${PORTVERSION:S/.r/rc/}
-
-MAINTAINER=	lupe@lupe-christoph.de
-COMMENT=	Node-specific part of Munin
-
-RUN_DEPENDS=	${SITE_PERL}/Net/Server/Fork.pm:${PORTSDIR}/net/p5-Net-Server
-BUILD_DEPENDS=	${RUN_DEPENDS}
-
-.include <bsd.port.pre.mk>
-
-.if ${OSVERSION} < 500000
-RUN_DEPENDS=	${LOCALBASE}/etc/rc.subr:${PORTSDIR}/sysutils/rc_subr
-.endif
-
-.if ${PERL_LEVEL} < 500800
-RUN_DEPENDS+=	${SITE_PERL}/Net/Domain.pm:${PORTSDIR}/net/p5-Net
-.endif
-
-USE_GMAKE=	yes
-PATCH_STRIP=	-p1
-WRKSRC=		${WRKDIR}/${PORTNAME}-${PORTVERSION:S/.r/rc/}
-PKGMESSAGE=	${WRKDIR}/pkg-message
-ALL_TARGET=	DATADIR=${DATADIR} PERL=${PERL} build build-man
-INSTALL_TARGET=	DATADIR=${DATADIR} PERL=${PERL} INSTALL_PLUGINS="auto manual snmpauto" install-node install-node-plugins
-MAKE_ENV=	LANG=C
-
-MAN5=		munin-node.conf.5
-MAN8=		munin-node-configure.8 munin-node.8 munin-run.8
-
-SUB_FILES=	pkg-message munin-node.sh munin-node-revive.sh
-SUB_LIST=	RC_SUBR=${RC_SUBR}
-USE_RC_SUBR=	YES
-
-pre-install:
-	@PKG_PREFIX=${PREFIX} ${SH} pkg-install ${PKGNAME} PRE-INSTALL
-
-post-install:
-	${INSTALL_SCRIPT} ${WRKDIR}/munin-node.sh ${PREFIX}/etc/rc.d/munin-node.sh
-.if ${PERL_LEVEL} < 500800
-	${INSTALL_SCRIPT} ${WRKDIR}/munin-node-revive.sh ${PREFIX}/bin/munin-node-revive
-.endif
-	${INSTALL_DATA} ${WRKSRC}/build/node/munin-node.conf ${PREFIX}/etc/munin/munin-node.conf.sample
-	${INSTALL_DATA} files/plugins.conf ${PREFIX}/etc/munin/plugin-conf.d/plugins.conf.sample
-	@if [ ! -f ${PREFIX}/etc/munin/plugin-conf.d/plugins.conf ]; then \
-		${INSTALL_DATA} ${PREFIX}/etc/munin/plugin-conf.d/plugins.conf.sample ${PREFIX}/etc/munin/plugin-conf.d/plugins.conf; \
-	fi
-	@${CAT} ${PKGMESSAGE}
-	@${INSTALL_MAN} -C ${WRKSRC}/build/doc/munin-node.conf.5 ${PREFIX}/man/man5
-	@${INSTALL_MAN} -C ${WRKSRC}/build/doc/munin-node-configure.8 ${PREFIX}/man/man8
-	@${INSTALL_MAN} -C ${WRKSRC}/build/doc/munin-node.8 ${PREFIX}/man/man8
-	@${INSTALL_MAN} -C ${WRKSRC}/build/doc/munin-run.8 ${PREFIX}/man/man8
-	@PKG_PREFIX=${PREFIX} ${SH} pkg-install ${PKGNAME} POST-INSTALL
-	@${ECHO} ${DISTNAME} | ${SED} -e 's/munin_//' > ${PREFIX}/etc/munin/VERSION.node
-
-.include <bsd.port.post.mk>
diff -pruN 2.0.57-1/dists/freebsd/munin-node/pkg-deinstall 2.0.69-1/dists/freebsd/munin-node/pkg-deinstall
--- 2.0.57-1/dists/freebsd/munin-node/pkg-deinstall	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/dists/freebsd/munin-node/pkg-deinstall	1970-01-01 00:00:00.000000000 +0000
@@ -1,85 +0,0 @@
-#! /bin/sh
-
-ask() {
-    local question default answer
-
-    question=$1
-    default=$2
-    if [ -z "${PACKAGE_BUILDING}" ]; then
-	read -p "${question} [${default}]? " answer
-    fi
-    if [ x${answer} = x ]; then
-	answer=${default}
-    fi
-    echo ${answer}
-}
-
-yesno() {
-    local dflt question answer
-
-    question=$1
-    dflt=$2
-    while :; do
-	answer=$(ask "${question}" "${dflt}")
-	case "${answer}" in
-	[Yy]*)		return 0;;
-	[Nn]*)		return 1;;
-	esac
-	echo "Please answer yes or no."
-    done
-}
-
-stop_process() {
-    if [ -x $STARTSTOP ]; then
-	$STARTSTOP stop
-    fi
-}
-
-delete_group() {
-    local g
-
-    g=$1
-    if yesno "Do you want me to remove group \"${g}\"" y; then
-	pw groupdel -n ${g}
-	echo "Done."
-    fi
-}
-
-delnewsyslog() {
-    tmp="/etc/#munin-node$$"
-    sed -e '/^\/var\/log\/munin-node.log[ 	]/d' /etc/newsyslog.conf >${tmp}
-    cat ${tmp} > /etc/newsyslog.conf
-    rm ${tmp}
-}
-
-newsyslog() {
-    ENTRY=`grep /var/log/munin-node.log /etc/newsyslog.conf`
-    DEFAULT='/var/log/munin-node.log			644  7	   *	@T00  Z	/var/run/munin/munin-node.pid'
-    if [ -z "$ENTRY" ]; then
-	exit 0
-    elif [ "$ENTRY" = "$DEFAULT" ]; then
-	delnewsyslog
-    elif yesno "You have changed the default munin-node entry in \"/etc/newsyslog.conf\".
-Do you want me to delete it?" y; then
-	delnewsyslog
-	echo "Done."
-    fi
-}
-
-
-OSVERSION=`/sbin/sysctl -n kern.osreldate`
-if [ $OSVERSION -lt 500000 ]; then
-    STARTSTOP=${PKG_PREFIX}/etc/rc.d/munin-node.sh
-else
-    STARTSTOP=/etc/rc.d/munin_node
-fi
-
-case $2 in
-    DEINSTALL)
-	stop_process
-	newsyslog
-	;;
-    POST-DEINSTALL)
-	delete_group munin
-	;;
-esac
diff -pruN 2.0.57-1/dists/freebsd/munin-node/pkg-descr 2.0.69-1/dists/freebsd/munin-node/pkg-descr
--- 2.0.57-1/dists/freebsd/munin-node/pkg-descr	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/dists/freebsd/munin-node/pkg-descr	1970-01-01 00:00:00.000000000 +0000
@@ -1,13 +0,0 @@
-Munin network-wide graphing framework (node)
-
-Munin is a tool for graphing all sorts of information about one or more
-servers and displaying it in a web interface. It uses the excellent
-RRDTool (written by Tobi Oetiker) and is written in Perl. Munin has a
-master/node architecture. The master connects to all the nodes at regular
-intervals, and asks them for data. It then stores the data in RRD-files,
-and (if needed) updates the graphs. One of the main goals have been ease
-of creating own "plugins" (graphs).
-
-This is the node part. It is used on all machines Munin shall watch.
-
-WWW: http://munin-monitoring.org
diff -pruN 2.0.57-1/dists/freebsd/munin-node/pkg-install 2.0.69-1/dists/freebsd/munin-node/pkg-install
--- 2.0.57-1/dists/freebsd/munin-node/pkg-install	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/dists/freebsd/munin-node/pkg-install	1970-01-01 00:00:00.000000000 +0000
@@ -1,91 +0,0 @@
-#! /bin/sh
-
-ask() {
-    local question default answer
-
-    question=$1
-    default=$2
-    if [ -z "${PACKAGE_BUILDING}" ]; then
-        read -p "${question} [${default}]? " answer
-    fi
-    if [ x${answer} = x ]; then
-        answer=${default}
-    fi
-    echo ${answer}
-}
-
-yesno() {
-    local dflt question answer
-
-    question=$1
-    dflt=$2
-    while :; do
-        answer=$(ask "${question}" "${dflt}")
-        case "${answer}" in
-        [Yy]*)          return 0;;
-        [Nn]*)          return 1;;
-        esac
-        echo "Please answer yes or no."
-    done
-}
-
-make_group() {
-    local g
-
-    g=$1
-
-    if pw group show "${g}" >/dev/null 2>&1; then
-	echo "You already have a group \"${g}\", so I will use it."
-    else
-	echo "You need a group \"${g}\"."
-	if which -s pw && yesno "Would you like me to create it" y; then
-	    pw groupadd ${g} || exit
-	    echo "Done."
-	else
-	    echo "Please create it, and try again."
-	    if ! grep -q "^${u}:" /etc/passwd; then
-		echo "While you're at it, please create a user \"${u}\" too,"
-		echo "with a default group of \"${g}\"."
-	    fi
-	    exit 1
-	fi
-    fi
-}
-
-init_plugins() {
-    if [ -f ${PKG_PREFIX}/etc/munin/VERSION.node ]; then
-	prevver=$(cat ${PKG_PREFIX}/etc/munin/VERSION.node)
-    fi
-
-    if [ -n "$prevver" ]; then
-	echo -n "Initializing new plugins.."
-	${PKG_PREFIX}/sbin/munin-node-configure --shell --newer "${prevver%-*}" | sh -x
-    else
-	echo -n "Initializing plugins.."
-	${PKG_PREFIX}/sbin/munin-node-configure --shell | sh -x
-    fi
-    echo "done."
-}
-
-newsyslog() {
-    if grep -q /var/log/munin-node.log /etc/newsyslog.conf; then
-	:
-    else
-	cat >> /etc/newsyslog.conf <<EOT
-/var/log/munin-node.log			644  7	   *	@T00  Z	/var/run/munin/munin-node.pid
-EOT
-    fi
-}
-
-
-########################################################################
-
-case $2 in
-    PRE-INSTALL)
-	make_group munin
-	;;      
-    POST-INSTALL)
-	init_plugins
-	newsyslog
-	;;      
-esac
diff -pruN 2.0.57-1/dists/freebsd/munin-node/pkg-plist 2.0.69-1/dists/freebsd/munin-node/pkg-plist
--- 2.0.57-1/dists/freebsd/munin-node/pkg-plist	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/dists/freebsd/munin-node/pkg-plist	1970-01-01 00:00:00.000000000 +0000
@@ -1,138 +0,0 @@
-@exec mkdir -p %D/etc/munin/plugins
-@exec mkdir -p %D/etc/munin/plugin-conf.d && chmod 755 %D/etc/munin/plugin-conf.d
-@exec mkdir -p %D/var/munin/plugin-state && chgrp munin %D/var/munin/plugin-state && chmod 775 %D/var/munin/plugin-state
-@unexec rm %D/bin/munin-node-revive 2>/dev/null || true
-@comment etc/munin/VERSION.node must remain for upgrade version check
-@unexec if cmp -s %D/etc/munin/munin-node.conf %D/etc/munin/munin-node.conf.sample; then rm -f %D/etc/munin/munin-node.conf; fi
-etc/munin/munin-node.conf.sample
-@unexec if cmp -s %D/etc/munin/plugin-conf.d/plugins.conf %D/etc/munin/plugin-conf.d/plugins.conf.sample; then rm -f %D/etc/munin/plugin-conf.d/plugins.conf; fi
-etc/munin/plugin-conf.d/plugins.conf.sample
-@unexec rm %D/etc/rc.d/munin-node.sh 2>/dev/null || true
-sbin/munin-node
-sbin/munin-node-configure
-sbin/munin-node-configure-snmp
-sbin/munin-run
-%%DATADIR%%/plugins/acpi
-%%DATADIR%%/plugins/amavis
-%%DATADIR%%/plugins/apache_accesses
-%%DATADIR%%/plugins/apache_processes
-%%DATADIR%%/plugins/apache_volume
-%%DATADIR%%/plugins/apc_envunit_
-%%DATADIR%%/plugins/apc_nis
-%%DATADIR%%/plugins/bind9
-%%DATADIR%%/plugins/bind9_rndc
-%%DATADIR%%/plugins/courier_
-%%DATADIR%%/plugins/courier_mta_mailqueue
-%%DATADIR%%/plugins/courier_mta_mailstats
-%%DATADIR%%/plugins/courier_mta_mailvolume
-%%DATADIR%%/plugins/cpu
-%%DATADIR%%/plugins/cupsys_pages
-%%DATADIR%%/plugins/df
-%%DATADIR%%/plugins/df_inode
-%%DATADIR%%/plugins/dhcpd3
-%%DATADIR%%/plugins/exim_mailqueue
-%%DATADIR%%/plugins/exim_mailqueue_alt
-%%DATADIR%%/plugins/exim_mailstats
-%%DATADIR%%/plugins/foldingathome
-%%DATADIR%%/plugins/foldingathome_rank
-%%DATADIR%%/plugins/foldingathome_wu
-%%DATADIR%%/plugins/hddtemp
-%%DATADIR%%/plugins/hddtemp2
-%%DATADIR%%/plugins/hddtemp_smartctl
-%%DATADIR%%/plugins/hddtempd
-%%DATADIR%%/plugins/if_
-%%DATADIR%%/plugins/if_errcoll_
-%%DATADIR%%/plugins/ipac-ng
-%%DATADIR%%/plugins/ircu
-%%DATADIR%%/plugins/load
-%%DATADIR%%/plugins/loggrep
-%%DATADIR%%/plugins/mailman
-%%DATADIR%%/plugins/mailscanner
-%%DATADIR%%/plugins/mbmon_
-%%DATADIR%%/plugins/memory
-%%DATADIR%%/plugins/mhttping
-%%DATADIR%%/plugins/multips
-%%DATADIR%%/plugins/munin_graph
-%%DATADIR%%/plugins/munin_update
-%%DATADIR%%/plugins/mysql_bytes
-%%DATADIR%%/plugins/mysql_isam_space_
-%%DATADIR%%/plugins/mysql_queries
-%%DATADIR%%/plugins/mysql_slowqueries
-%%DATADIR%%/plugins/mysql_threads
-%%DATADIR%%/plugins/named
-%%DATADIR%%/plugins/netstat
-%%DATADIR%%/plugins/ntp_
-%%DATADIR%%/plugins/ntp_states
-%%DATADIR%%/plugins/nut_misc
-%%DATADIR%%/plugins/nut_volts
-%%DATADIR%%/plugins/open_files
-%%DATADIR%%/plugins/perdition
-%%DATADIR%%/plugins/ping_
-%%DATADIR%%/plugins/plugins.history
-%%DATADIR%%/plugins/pm3users_
-%%DATADIR%%/plugins/pop_stats
-%%DATADIR%%/plugins/postfix_mailqueue
-%%DATADIR%%/plugins/postfix_mailstats
-%%DATADIR%%/plugins/postfix_mailvolume
-%%DATADIR%%/plugins/processes
-%%DATADIR%%/plugins/ps_
-%%DATADIR%%/plugins/psu_
-%%DATADIR%%/plugins/samba
-%%DATADIR%%/plugins/sendmail_mailqueue
-%%DATADIR%%/plugins/sendmail_mailstats
-%%DATADIR%%/plugins/sendmail_mailtraffic
-%%DATADIR%%/plugins/smart_
-%%DATADIR%%/plugins/snmp__df
-%%DATADIR%%/plugins/snmp__fc_if_
-%%DATADIR%%/plugins/snmp__fc_if_err_
-%%DATADIR%%/plugins/snmp__if_
-%%DATADIR%%/plugins/snmp__if_err_
-%%DATADIR%%/plugins/snmp__load
-%%DATADIR%%/plugins/snmp__processes
-%%DATADIR%%/plugins/snmp__sensors_fsc_bx_fan
-%%DATADIR%%/plugins/snmp__sensors_fsc_bx_temp
-%%DATADIR%%/plugins/snmp__sensors_fsc_fan
-%%DATADIR%%/plugins/snmp__sensors_fsc_temp
-%%DATADIR%%/plugins/snmp__sensors_mbm_fan
-%%DATADIR%%/plugins/snmp__sensors_mbm_temp
-%%DATADIR%%/plugins/snmp__sensors_mbm_volt
-%%DATADIR%%/plugins/snmp__users
-%%DATADIR%%/plugins/spamstats
-%%DATADIR%%/plugins/squid_cache
-%%DATADIR%%/plugins/squid_icp
-%%DATADIR%%/plugins/squid_requests
-%%DATADIR%%/plugins/squid_traffic
-%%DATADIR%%/plugins/surfboard
-%%DATADIR%%/plugins/swap
-%%DATADIR%%/plugins/sybase_space
-%%DATADIR%%/plugins/vmstat
-@unexec rm -f /var/run/munin/munin-node.pid
-@unexec rmdir /var/run/munin 2>/dev/null || true
-@unexec rmdir %D/var/munin/plugin-state 2>/dev/null || true
-@unexec rmdir %D/var/munin 2>/dev/null || true
-@unexec rmdir %D/%%DATADIR%%/plugins 2>/dev/null || true
-@unexec rmdir %D/%%DATADIR%% 2>/dev/null || true
-@unexec rmdir %D/etc/munin/plugin-conf.d 2>/dev/null || true
-@unexec rmdir %D/etc/munin 2>/dev/null || true
-@unexec rmdir %%LOCALBASE%%/%%SITE_PERL%%/Munin/Plugin 2>/dev/null || true
-@unexec rmdir %%LOCALBASE%%/%%SITE_PERL%%/Munin 2>/dev/null || true
-@unexec echo
-@unexec echo '********************************************************************'
-@unexec echo "If you want to *completely* remove munin-node, you have to"
-@unexec echo
-@unexec echo "    rm -rf %D/etc/munin/VERSION.node %D/etc/munin/plugins \\"
-@unexec if [ -d %D/var/munin/plugin-state ]; then echo "           %D/var/munin/plugin-state \\"; fi
-@unexec if [ -f %D/etc/munin/munin-node.conf ]; then echo "           %D/etc/munin/munin-node.conf \\"; fi
-@unexec if [ -d %D/var/munin/plugin-state ]; then echo "           %D/var/munin/plugin-state \\"; fi
-@unexec if [ -d %%LOCALBASE%%/%%SITE_PERL%%/Munin/Plugin ]; then echo "           %%LOCALBASE%%/%%SITE_PERL%%/Munin/Plugin \\"; fi
-@unexec if [ -d %%LOCALBASE%%/%%SITE_PERL%%/Munin ]; then echo "           %%LOCALBASE%%/%%SITE_PERL%%/Munin/Plugin \\"; fi
-@unexec echo "           /var/log/munin-node.log*"
-@unexec echo
-@unexec echo "If you have already deinstalled munin-main, you can also"
-@unexec echo
-@unexec echo "    rmdir %D/etc/munin %D/var/munin"
-@unexec echo
-@unexec echo "These files and directories have to be left on the system because"
-@unexec echo "you may be performing an update. This process can't tell."
-@unexec echo '********************************************************************'
-@unexec echo
diff -pruN 2.0.57-1/dists/README 2.0.69-1/dists/README
--- 2.0.57-1/dists/README	1970-01-01 00:00:00.000000000 +0000
+++ 2.0.69-1/dists/README	2021-11-22 22:12:17.000000000 +0000
@@ -0,0 +1,59 @@
+Thanks to our move to git, dists/ is now obsolete.
+
+Each distributions has now its own git repository.
+
+There inner structure is up to them, but we can see 2 pattern emerging :
+
+1. Fork of official repository
+
+This is the simplest thing to do. Just fork the official munin repo, and add your distribution specific things.
+
+It enables a very effective way of sending distro-originated patches upstream. It used to be awkward to use when we where using svn, but the move to git made it a breeze.
+
+2. Standalone repository
+
+Some distributions just create a new repo, containing only what's specific to them. It usually takes the form of some build instructions and several patch files.
+
+It enables a very simple separation of what's coming from upstream and what's ditro originated. It also was the only practical way prior to the git move.
+
+Some of these specifics were usually integrated here, in dists/*.
+
+3. Urls reference.
+
+Please note that we don't know about every distrib. If yours favorite one is missing, just send a patch to add it here.
+
+Order here is alphabetic, to remain neutral :-)
+
+* Debian
+
+Different releases are tracked via different branches.
+
+type: fork
+www: http://
+git:
+
+* FreeBSD
+
+type:
+www:
+git:
+
+* Gentoo
+
+type:
+www:
+git:
+
+* Redhat and Fedora
+
+RHEL and Fedora are hosted directly on pkgs.fedoraproject.org.
+
+type: specific
+www: http://pkgs.fedoraproject.org/cgit/munin.git
+git: git://pkgs.fedoraproject.org/munin.git
+
+* Ubuntu
+
+type:
+www:
+git:
diff -pruN 2.0.57-1/dists/redhat/README 2.0.69-1/dists/redhat/README
--- 2.0.57-1/dists/redhat/README	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/dists/redhat/README	1970-01-01 00:00:00.000000000 +0000
@@ -1,4 +0,0 @@
-Redhat specifics are hosted directly on pkgs.fedoraproject.org.
-
-www: http://pkgs.fedoraproject.org/cgit/munin.git
-git: git://pkgs.fedoraproject.org/munin.git
diff -pruN 2.0.57-1/dists/sunos/Makefile 2.0.69-1/dists/sunos/Makefile
--- 2.0.57-1/dists/sunos/Makefile	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/dists/sunos/Makefile	1970-01-01 00:00:00.000000000 +0000
@@ -1,133 +0,0 @@
-
-BASE     = /
-VENDOR	 = munin-monitoring.org
-
-PKGNAME  = munin
-
-PREFIX   = $(BASE)/$(PKGNAME)
-SUBST    = $(PREFIX)
-
-VERSION	 = $(shell cat ../../RELEASE)
-DIST     = ../../../$(PKGNAME)_$(VERSION).tar.gz
-#BUILD    = $(PKGNAME)-$(VERSION)
-BUILD    = ../../
-OSTYPE	 = $(shell uname -p)
-
-PATH    := "/opt/SUNWspro/bin/:/usr/bin:/bin:/usr/local/bin:/usr/ccs/bin/"
-
-DESTDIR := dists/sunos/install/dist/
-
-all: $(PKGNAME)-$(VERSION)-$(OSTYPE).pkg $(PKGNAME)-node-$(VERSION)-$(OSTYPE).pkg
-
-clean: 
-	rm -rf pkginfo build-stamp install install-stamp main node configure-stamp
-	cd $(BUILD); make clean
-
-#$(BUILD)/configure: $(DIST)
-#	gunzip -c $(DIST) | (tar -xf - && touch $(BUILD)/configure)
-
-#configure-stamp: $(BUILD)/configure
-#	touch configure-stamp
-
-#build-stamp: $(BUILD)/configure
-#	cd $(BUILD) ;\
-#	PATH=$(PATH) make build build-doc build-man && touch build-stamp
-
-build-stamp:
-	cd $(BUILD) ;\
-	PATH=$(PATH) make build build-doc build-man && touch dists/sunos/build-stamp
-
-install-stamp: build-stamp
-	mkdir -p install/dist/node install/dist/main
-	cd $(BUILD) ;\
-	make prefix="" DESTDIR=$(DESTDIR)/node/ CHECKUSER="echo Skipping user check" CHECKGROUP="echo Skipping group check" CHOWN=/bin/true CHGRP=/bin/true install-node install-node-plugins
-	-cd $(BUILD) ;\
-	make prefix="" DESTDIR=$(DESTDIR)/node CHECKUSER="echo Skipping user check" CHECKGROUP="echo Skipping group check" CHOWN=/bin/true CHGRP=/bin/true  install-doc install-man
-	cd $(BUILD) ;\
-	make prefix="" DESTDIR=$(DESTDIR)/main CHECKUSER="echo Skipping user check" CHECKGROUP="echo Skipping group check" CHOWN=/bin/true CHGRP=/bin/true install-main
-	-cd $(BUILD) ;\
-	make prefix="" DESTDIR=$(DESTDIR)/main CHECKUSER="echo Skipping user check" CHECKGROUP="echo Skipping group check" CHOWN=/bin/true CHGRP=/bin/true  install-doc install-man
-	touch install-stamp
-
-pkginfo: $(DIST) main/pkginfo node/pkginfo
-	echo "Generated pkginfo files."
-
-node/pkginfo: $(DIST)
-	-mkdir node
-	for f in pkginfo depend compver space request checkinstall \
-		preinstall postinstall preremove postremove; do \
-		test -r $(PWD)/$$f.node && cp $(PWD)/$$f.node $(PWD)/node/$$f; \
-	done ;\
-	(echo "# Generated file, do not edit"; \
-	echo "PKG=$(PKGNAME)-node"; \
-	echo "NAME=$(PKGNAME)-node"; \
-	echo "OSTYPE=$(OSTYPE)"; \
-	echo "VERSION=$(VERSION)"; \
-	echo "CATEGORY=application"; \
-	echo "VENDOR=$(VENDOR)"; \
-	echo "EMAIL=jimmyo@users.sf.net"; \
-	echo "PSTAMP="`getent passwd $(USER) | cut -d: -f5`; \
-	echo "BASEDIR=$(BASE)"; \
-	echo "CLASSES=none") > $@
-
-main/pkginfo: $(DIST)
-	-mkdir main
-	for f in pkginfo depend compver space request checkinstall \
-		preinstall postinstall preremove postremove; do \
-		test -r $(PWD)/$$f.main && cp $(PWD)/$$f.main $(PWD)/main/$$f; \
-	done ;\
-	(echo "# Generated file, do not edit"; \
-	echo "PKG=$(PKGNAME)"; \
-	echo "NAME=$(PKGNAME)"; \
-	echo "OSTYPE=$(OSTYPE)"; \
-	echo "VERSION=$(VERSION)"; \
-	echo "CATEGORY=application"; \
-	echo "VENDOR=$(VENDOR)"; \
-	echo "EMAIL=jimmyo@users.sf.net"; \
-	echo "PSTAMP="`getent passwd $(USER) | cut -d: -f5`; \
-	echo "BASEDIR=$(BASE)"; \
-	echo "CLASSES=none") > $@
-
-install/prototype: install-stamp install/node-prototype install/main-prototype
-	echo "Prototypes generated."
-
-install/node-prototype: install-stamp
-	for f in pkginfo depend compver space request checkinstall \
-		preinstall postinstall preremove postremove; do \
-		test -r $(PWD)/node/$$f && echo "i $$f=$(PWD)/node/$$f" || true; done \
-		> install/node-prototype
-	cd install; pkgproto ../install/dist/node=  \
-	| awk ' { $$5="root"; $$6="sys"; } \
-		{ print; }' |\
-		sed \
-		  -e 's|var/opt/munin 0755 root sys|var/opt/munin 0775 root munin|' \
-		  -e 's|var/log/munin 0755 root sys|var/log/munin 0775 root munin|' \
-		  -e 's|var/run/munin 0755 root sys|var/run/munin 0775 root munin|' \
-		>> ../install/node-prototype
-
-install/main-prototype: install-stamp
-	for f in pkginfo depend compver space request checkinstall \
-		preinstall postinstall preremove postremove; do \
-		test -r $(PWD)/main/$$f && echo "i $$f=$(PWD)/main/$$f" || true; done \
-		> install/main-prototype
-	cd install; pkgproto ../install/dist/main= \
-	| awk ' { $$5="root"; $$6="sys"; } \
-		{ print; }' |\
-		sed \
-		  -e 's|var/opt/munin 0755 root sys$$|var/opt/munin 0775 munin munin|' \
-		  -e 's|var/log/munin 0755 root sys$$|var/log/munin 0775 munin munin|' \
-		  -e 's|var/run/munin 0755 root sys$$|var/run/munin 0775 munin munin|' >> ../install/main-prototype
-
-install/$(PKGNAME): pkginfo install/main-prototype
-	cd install; rm prototype || true; ln -s main-prototype prototype; pkgmk -d .
-
-install/$(PKGNAME)-node: pkginfo install/node-prototype
-	cd install; rm prototype || true; ln -s node-prototype prototype; pkgmk -d .
-
-$(PKGNAME)-$(VERSION)-$(OSTYPE).pkg: install/$(PKGNAME)
-	pkgtrans `pwd`/install $@ $(PKGNAME)
-	mv install/$(PKGNAME)-$(VERSION)-$(OSTYPE).pkg .
-
-$(PKGNAME)-node-$(VERSION)-$(OSTYPE).pkg: install/$(PKGNAME)-node
-	pkgtrans `pwd`/install $@ $(PKGNAME)-node
-	mv install/$(PKGNAME)-node-$(VERSION)-$(OSTYPE).pkg .
diff -pruN 2.0.57-1/dists/sunos/postinstall.node 2.0.69-1/dists/sunos/postinstall.node
--- 2.0.57-1/dists/sunos/postinstall.node	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/dists/sunos/postinstall.node	1970-01-01 00:00:00.000000000 +0000
@@ -1,3 +0,0 @@
-#!/bin/sh
-
-/opt/munin/sbin/munin-node-configure --shell | /bin/sh
diff -pruN 2.0.57-1/dists/sunos/preinstall.main 2.0.69-1/dists/sunos/preinstall.main
--- 2.0.57-1/dists/sunos/preinstall.main	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/dists/sunos/preinstall.main	1970-01-01 00:00:00.000000000 +0000
@@ -1,4 +0,0 @@
-#!/bin/sh
-
-groupadd munin 2>/dev/null || true
-useradd -g munin munin 2>/dev/null || true
diff -pruN 2.0.57-1/dists/sunos/preinstall.node 2.0.69-1/dists/sunos/preinstall.node
--- 2.0.57-1/dists/sunos/preinstall.node	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/dists/sunos/preinstall.node	1970-01-01 00:00:00.000000000 +0000
@@ -1,3 +0,0 @@
-#!/bin/sh
-
-groupadd munin 2>/dev/null || true
diff -pruN 2.0.57-1/dists/sunos/README 2.0.69-1/dists/sunos/README
--- 2.0.57-1/dists/sunos/README	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/dists/sunos/README	1970-01-01 00:00:00.000000000 +0000
@@ -1 +0,0 @@
-See also resources/solaris-smf/ for SMF manifest and startup script
diff -pruN 2.0.57-1/dists/suse/Makefile.config 2.0.69-1/dists/suse/Makefile.config
--- 2.0.57-1/dists/suse/Makefile.config	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/dists/suse/Makefile.config	1970-01-01 00:00:00.000000000 +0000
@@ -1,20 +0,0 @@
-# Modifications from ../../Makefile.config
-
-PREFIX   = $(DESTDIR)/usr
-CONFDIR  = $(DESTDIR)/etc/munin
-LIBDIR   = $(PREFIX)/share/munin
-SBINDIR  = $(PREFIX)/sbin
-BINDIR   = $(PREFIX)/bin
-MANDIR   = $(PREFIX)/share/man
-HTMLDIR  = $(DESTDIR)/var/www/html/munin
-DBDIR    = $(DESTDIR)/var/lib/munin
-LOGDIR   = $(DESTDIR)/var/log/munin
-STATEDIR = $(DESTDIR)/var/run/munin
-PERLLIB  = $(DESTDIR)$(shell ( $(PERL) -V:vendorlib | egrep -v "UNKNOWN|=''" || $(PERL) -V:sitelib) | cut -d\' -f 2)
-
-# Handled in the munin.spec
-CHECKUSER:= true
-CHECKGROUP:= true
-CHOWN   := echo Not done: chown
-CHMOD   := echo Not done: chmod
-CHGRP   := echo Not done: chgrp
diff -pruN 2.0.57-1/dists/suse/munin.cron.d 2.0.69-1/dists/suse/munin.cron.d
--- 2.0.57-1/dists/suse/munin.cron.d	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/dists/suse/munin.cron.d	1970-01-01 00:00:00.000000000 +0000
@@ -1,7 +0,0 @@
-#
-# cron-jobs for munin
-#
-
-MAILTO=root
-
-*/5 * * * *     munin test -x /usr/bin/munin-cron && /usr/bin/munin-cron
diff -pruN 2.0.57-1/dists/suse/munin-node.cron.d 2.0.69-1/dists/suse/munin-node.cron.d
--- 2.0.57-1/dists/suse/munin-node.cron.d	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/dists/suse/munin-node.cron.d	1970-01-01 00:00:00.000000000 +0000
@@ -1,6 +0,0 @@
-#
-# cron-jobs for 
-#
-
-MAILTO=root
-
diff -pruN 2.0.57-1/dists/suse/munin-node.rc 2.0.69-1/dists/suse/munin-node.rc
--- 2.0.57-1/dists/suse/munin-node.rc	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/dists/suse/munin-node.rc	1970-01-01 00:00:00.000000000 +0000
@@ -1,92 +0,0 @@
-#! /bin/sh
-#
-# munin-node	Control the Munin Node Server (formerly Linpro RRD client)
-#
-# Author: Rune Nordbøe Skillingstad <runesk@linpro.no>
-#
-### BEGIN INIT INFO
-# Provides: munin-node
-# Required-Start: $network
-# Required-Stop:
-# Default-Start:  3 5
-# Default-Stop:   0 1 2 6
-# Description:    Munin Node Agents
-### END INIT INFO
-
-# Source SuSE config
-. /etc/rc.status
-
-MUNIN_BIN=/usr/sbin/munin-node
-test -x $MUNIN_BIN || exit 5
-
-# Shell functions sourced from /etc/rc.status:
-#      rc_check         check and set local and overall rc status
-#      rc_status        check and set local and overall rc status
-#      rc_status -v     ditto but be verbose in local rc status
-#      rc_status -v -r  ditto and clear the local rc status
-#      rc_failed        set local and overall rc status to failed
-#      rc_reset         clear local rc status (overall remains)
-#      rc_exit          exit appropriate to overall rc status
-
-# First reset status of this service
-rc_reset
-
-# Return values acc. to LSB for all commands but status:
-# 0 - success
-# 1 - misc error
-# 2 - invalid or excess args
-# 3 - unimplemented feature (e.g. reload)
-# 4 - insufficient privilege
-# 5 - program not installed
-# 6 - program not configured
-#
-# Note that starting an already running service, stopping
-# or restarting a not-running service as well as the restart
-# with force-reload (in case signalling is not supported) are
-# considered a success.
-
-# See how we were called.
-case "$1" in
-  start)
-	echo -n "Starting Munin Node: "
-	if [ ! -d /var/run/munin ]; then
-	    mkdir -p /var/run/munin 2>/dev/null
-	    chown munin /var/run/munin
-	fi
-
-	## Start daemon with startproc(8). If this fails
-        ## the echo return value is set appropriate.
-	startproc $MUNIN_BIN
-
-	# Remember status and be verbose
-        rc_status -v
-	;;
-  stop)
-	echo -n "Stopping Munin Node agents: "
-       ## Stop daemon with killproc(8) and if this fails
-        ## set echo the echo return value.
-
-        killproc -TERM $MUNIN_BIN
-
-        # Remember status and be verbose
-        rc_status -v
-	;;
-  restart|reload)
-        ## Stop the service and regardless of whether it was
-        ## running or not, start it again.
-        $0 stop
-        $0 start
-
-        # Remember status and be quiet
-        rc_status
-        ;;
-  status)
-        echo -n "Checking for Munin Node: "
-        checkproc $MUNIN_BIN
-        rc_status -v
-        ;;
-  *)
-	echo "Usage: $0 {start|stop|status|restart}"
-	exit 1
-esac
-rc_exit
diff -pruN 2.0.57-1/dists/suse/munin.spec.in 2.0.69-1/dists/suse/munin.spec.in
--- 2.0.57-1/dists/suse/munin.spec.in	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/dists/suse/munin.spec.in	1970-01-01 00:00:00.000000000 +0000
@@ -1,287 +0,0 @@
-Name:      	munin
-Version:   	@@VERSION@@
-Release:	1
-
-Summary:	Network-wide graphing framework (grapher/gatherer)
-License: 	GPL
-Group:		System Environment/Daemons
-URL:		http://munin.sourceforge.net
-Packager:	Rune Nordbøe Skillingstad <runesk@linpro.no>
-Vendor:		Linpro AS
-Distribution:	Linpro AS SuSE Linux Software Archives
-Source0:	%{name}_%{version}.tar.gz
-Source1:	Makefile.config
-Source2:	munin-node.rc
-Source3:	munin.cron.d
-Source4:	munin.logrotate
-Source5:	munin-node.logrotate
-Source6:	munin-node.cron.d
-Source7:	plugins.conf
-Patch0:		patch-001
-Patch1:		patch-002
-Requires:	perl-HTML-Template
-Requires:	rrdtool
-Obsoletes:	lrrd-server
-BuildArch:	noarch
-BuildRoot:	%{_tmppath}/%{name}-%{version}-root
-
-%define         confdir /etc/munin
-%define         libdir  /usr/share/munin
-%define         htmldir /srv/www/htdocs/munin
-%define         cgidir  /srv/www/cgi-bin
-%define         dbdir   /var/lib/munin
-%define         logdir  /var/log/munin
-%define         statedir /var/run/munin
-
-%description
-Munin is a highly flexible and powerful solution used to create graphs of
-virtually everything imaginable throughout your network, while still
-maintaining a rattling ease of installation and configuration.
-
-This package contains the grapher/gatherer. You will only need one instance of
-it in your network. It will periodically poll all the nodes in your network
-it's aware of for data, which it in turn will use to create graphs and HTML
-pages, suitable for viewing with your graphical web browser of choice.
-
-Munin is written in Perl, and relies heavily on Tobi Oetiker's excellent
-RRDtool. To see a real example of Munin in action, take a peek at
-<http://demo.munin-monitoring.org>.
-
-%package node
-Group:		System Environment/Daemons
-Summary:	Network-wide graphing framework (node)
-BuildArch: 	noarch
-Requires: 	perl-Net-Server
-Requires:	ps
-Requires:	sysstat
-Obsoletes:	lrrd-client
-
-%description node
-Munin is a highly flexible and powerful solution used to create graphs of
-virtually everything imaginable throughout your network, while still
-maintaining a rattling ease of installation and configuration.
-
-This package contains node software. You should install it on all the nodes
-in your network. It will know how to extract all sorts of data from the
-node it runs on, and will wait for the gatherer to request this data for
-further processing.
-
-It includes a range of plugins capable of extracting common values such as
-cpu usage, network usage, load average, and so on. Creating your own plugins
-which are capable of extracting other system-specific values is very easy,
-and is often done in a matter of minutes. You can also create plugins which
-relay information from other devices in your network that can't run Munin,
-such as a switch or a server running another operating system, by using
-SNMP or similar technology.
-
-Munin is written in Perl, and relies heavily on Tobi Oetiker's excellent
-RRDtool. To see a real example of Munin in action, take a peek at
-<http://www.linpro.no/projects/munin/example/>.
-
-%prep
-%setup -q
-%patch0
-%patch1 -p1
-mkdir -p %{buildroot}
-
-%build
-
-# htmldoc and html2text are not available for Red Hat. Quick hack with perl:
-# Skip the PDFs.
-perl -pi -e 's,htmldoc munin,cat munin, or s,html(2text|doc),# $&,' Makefile
-perl -pi -e 's,\$\(INSTALL.+\.(pdf|txt) \$\(DOCDIR,# $&,' Makefile
-
-make 	clean
-make    CONFIG=%{SOURCE1} \
-        DOCDIR=%{_docdir}/munin \
-        MANDIR=%{_mandir} \
-	HTMLDIR=%{htmldir} \
-	CGIDIR=%{cgidir} \
-	LIBDIR=%{libdir} \
-	CONFDIR=%{confdir} \
-        DESTDIR=%{buildroot} \
-        DBDIR=%{dbdir} \
-        SBINDIR=%{_sbindir} \
-        LOGDIR=%{logdir} \
-        STATEDIR=%{statedir} \
-        build
-
-mkdir -p %{buildroot}%{dbdir}/plugin-state
-mkdir -p %{buildroot}%{logdir}
-mkdir -p %{buildroot}%{statedir}
-mkdir -p %{buildroot}/etc/init.d
-mkdir -p %{buildroot}/etc/cron.d
-mkdir -p %{buildroot}/etc/logrotate.d
-mkdir -p %{buildroot}%{htmldir}
-
-%install
-make    CONFIG=%{SOURCE1} \
-        DOCDIR=%{buildroot}%{_docdir}/munin \
-        MANDIR=%{buildroot}%{_mandir} \
-	HTMLDIR=%{buildroot}%{htmldir} \
-	LIBDIR=%{buildroot}%{libdir} \
-	CGIDIR=%{buildroot}%{cgidir} \
-	CONFDIR=%{buildroot}%{confdir} \
-        DESTDIR=%{buildroot} \
-        DBDIR=%{buildroot}%{dbdir} \
-        SBINDIR=%{buildroot}%{_sbindir} \
-        LOGDIR=%{buildroot}%{logdir} \
-        STATEDIR=%{buildroot}%{statedir} \
-        install-main install-node install-node-plugins install-doc install-man 
-								
-install -m0755 %{SOURCE2} %{buildroot}/etc/init.d/munin-node
-install -m0644 %{SOURCE3} %{buildroot}/etc/cron.d/munin
-install -m0644 %{SOURCE4} %{buildroot}/etc/logrotate.d/munin
-install -m0644 %{SOURCE5} %{buildroot}/etc/logrotate.d/munin-node
-install -m0644 %{SOURCE6} %{buildroot}/etc/cron.d/munin-node
-install -m0644 %{SOURCE7} %{buildroot}%{confdir}/plugin-conf.d/munin-node
-install -m0644 ChangeLog %{buildroot}%{_docdir}/munin/ChangeLog
-
-%clean
-[ -n "%{buildroot}" -a "%{buildroot}" != / ] && rm -rf %{buildroot}
-
-
-## Server
-
-%pre
-
-getent group munin >/dev/null || groupadd -r munin
-getent passwd munin > /dev/null || useradd -r -d %{dbdir} -g munin munin
-
-%post
-mkdir -p %{htmldir}
-mkdir -p %{logdir}
-mkdir -p %{dbdir}
-chown -R munin:munin %{htmldir}
-chown -R munin:munin %{logdir}
-chown -R munin:munin %{statedir}
-chown -R munin:munin %{dbdir}
-
-## Node
-%pre node
-getent group munin >/dev/null || groupadd -r munin
-getent passwd munin > /dev/null || useradd -r -d %{dbdir} -g munin munin
-
-%post node
-if [ $1 = 1 ]
-then
-        /sbin/chkconfig --add munin-node
-	/usr/sbin/munin-node-configure --shell | sh
-fi
-%{fillup_and_insserv -n -s -y munin munin-node START_MUNIN_NODE}
-mkdir -p %{logdir}
-mkdir -p %{dbdir}/plugin-state
-chown -R munin:munin %{logdir}
-chown -R munin:munin %{dbdir}
-chmod g+w %{dbdir}/plugin-state
-/etc/init.d/munin-node status >/dev/null 2>&1 || /etc/init.d/munin-node start
-
-%preun node
-if [ $1 = 0 ]
-then
-        /sbin/service munin-node stop > /dev/null 2>&1
-        /sbin/chkconfig --del munin-node
-        rmdir %{logdir} 2>/dev/null || true
-fi
-%stop_on_removal munin-node
-
-%postun node
-%restart_on_update munin-node
-%{insserv_cleanup}
-
-
-%files
-%defattr(-, root, root)
-%doc %{_docdir}/munin/README.api
-%doc %{_docdir}/munin/README.plugins
-%doc %{_docdir}/munin/COPYING
-%doc %{_docdir}/munin/ChangeLog
-%doc %{_mandir}/man8/munin-graph*
-%doc %{_mandir}/man8/munin-update*
-%doc %{_mandir}/man8/munin-html*
-%doc %{_mandir}/man8/munin-cron*
-%doc %{_mandir}/man5/munin.conf*
-%doc %{_mandir}/man8/munin-limits.8.gz
-%{_bindir}/munin-cron
-%{_datadir}/munin/munin-graph
-%{_datadir}/munin/munin-html
-%{_datadir}/munin/munin-update
-%{_libdir}/perl5/*perl/5.*/Munin.pm
-%{_usr}/share/munin/munin-limits
-%{cgidir}/munin-cgi-graph
-%config %{confdir}/templates/*
-%config /etc/cron.d/munin
-%config(noreplace) %{confdir}/munin.conf
-%config /etc/logrotate.d/munin
-%dir %{statedir}
-
-	    
-%files node
-%defattr(-, root, root)
-%doc %{_docdir}/munin/COPYING
-%doc %{_docdir}/munin/munin-doc.html
-%doc %{_docdir}/munin/munin-faq.html
-%doc %{_mandir}/man8/munin-run*
-%doc %{_mandir}/man8/munin-node*
-%doc %{_mandir}/man5/munin-node*
-%{_sbindir}/munin-run
-%{_sbindir}/munin-node
-%{_sbindir}/munin-node-configure
-%{_sbindir}/munin-node-configure-snmp
-%{_datadir}/munin/plugins/*
-%config(noreplace) %{confdir}/munin-node.conf
-%config(noreplace) %{confdir}/plugin-conf.d/munin-node
-%config /etc/init.d/munin-node
-%config /etc/cron.d/munin-node
-%config /etc/logrotate.d/munin-node
-%dir %{confdir}/plugins
-
-%changelog
-* Mon Apr  3 2005 Rune Nordbøe Skillingstad <runesk@linpro.no>
-- 1.2.3 release
-* Fri Apr  1 2005 Rune Nordbøe Skillingstad <runesk@linpro.no>
-- 1.2.2 release
-- Fixed SF bug 1164481 (missing /srv/www/htdocs/munin)
-- Fixed SF bug 1164477 (patch for Net::Domain on PPC64)
-* Fri Mar 11 2005 Rune Nordbøe Skillingstad <runesk@linpro.no>
-- 1.2.1 release
-* Wed Mar  9 2005 Rune Nordbøe Skillingstad <runesk@linpro.no>
-- Fixed erronumous path to web directory
-- Added start of node if not running
-* Thu Mar  8 2005 Rune Nordbøe Skillingstad <runesk@linpro.no>
-- Fixed some build path problems
-* Thu Feb 24 2005 Rune Nordbøe Skillingstad <runesk@linpro.no>
-- New major release
-* Wed Feb  9 2005 Rune Nordbøe Skillingstad <runesk@linpro.no>
-- Updated to version 1.2.0rc2.
-- Removed Nagios stuff
-- Added noreplace for some central configuration files
-* Thu Nov 18 2004 Rune Nordbøe Skillingstad <runesk@linpro.no>
-- Updated to version 1.0.4
-* Mon Nov 08 2004 Rune Nordbøe Skillingstad <runesk@linpro.no>
-- Updated version 1.0.3 / sync with redhat-build
-* Wed Aug 04 2004 Rune Nordbøe Skillingstad <runesk@linpro.no>
-- Initial SuSE build
-* Sun Feb 01 2004 Ingvar Hagelund <ingvar@linpro.no>
-- Sync with CVS. Version 1.0.0pre2
-* Sun Jan 18 2004 Ingvar Hagelund <ingvar@linpro.no>
-- Sync with CVS. Change names to munin.
-* Fri Oct 31 2003 Ingvar Hagelund <ingvar@linpro.no>
-- Lot of small fixes. Now builds on more RPM distros
-* Wed May 21 2003 Ingvar Hagelund <ingvar@linpro.no>
-- Sync with CVS
-- 0.9.5-1
-* Tue Apr  1 2003 Ingvar Hagelund <ingvar@linpro.no>
-- Sync with CVS
-- Makefile-based install of core files
-- Build doc (only pod2man)
-* Thu Jan  9 2003 Ingvar Hagelund <ingvar@linpro.no>
-- Sync with CVS, auto rpmbuild
-* Thu Jan  2 2003 Ingvar Hagelund <ingvar@linpro.no>
-- Fix spec file for RedHat 8.0 and new version of lrrd
-* Wed Sep  4 2002 Ingvar Hagelund <ingvar@linpro.no>
-- Small bugfixes in the rpm package
-* Tue Jun 18 2002 Kjetil Torgrim Homme <kjetilho@linpro.no>
-- new package
-
-
diff -pruN 2.0.57-1/dists/suse/patch-002 2.0.69-1/dists/suse/patch-002
--- 2.0.57-1/dists/suse/patch-002	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/dists/suse/patch-002	1970-01-01 00:00:00.000000000 +0000
@@ -1,46 +0,0 @@
-diff -ruN munin-1.2.2/node/munin-node.in munin-1.2.2.patch/node/munin-node.in
---- munin-1.2.2/node/munin-node.in	2005-02-16 18:12:03.000000000 +0100
-+++ munin-1.2.2.patch/node/munin-node.in	2005-04-01 09:50:13.000000000 +0200
-@@ -289,13 +289,13 @@
- 
- sub get_fq_hostname {
-     my $hostname;
--    eval {
--        require Net::Domain;
--        $hostname = Net::Domain::hostfqdn();
--    };
--    return $hostname if $hostname;
-+#    eval {
-+#        require Net::Domain;
-+#        $hostname = Net::Domain::hostfqdn();
-+#    };
-+#    return $hostname if $hostname;
- 
--    $hostname = `hostname`;  # Fall$
-+    $hostname = `hostname --fqdn`;  # Fall$
-     chomp($hostname);
-     $hostname =~ s/\s//g;
-     return $hostname;
-diff -ruN munin-1.2.2/node/munin-run.in munin-1.2.2.patch/node/munin-run.in
---- munin-1.2.2/node/munin-run.in	2004-12-22 22:33:48.000000000 +0100
-+++ munin-1.2.2.patch/node/munin-run.in	2005-04-01 09:50:43.000000000 +0200
-@@ -445,13 +445,13 @@
- 
- sub get_fq_hostname {
-     my $hostname;
--    eval {
--        require Net::Domain;
--        $hostname = Net::Domain::hostfqdn();
--    };
--    return $hostname if $hostname;
-+#    eval {
-+#        require Net::Domain;
-+#        $hostname = Net::Domain::hostfqdn();
-+#    };
-+#    return $hostname if $hostname;
- 
--    $hostname = `hostname`;  # Fall$
-+    $hostname = `hostname --fqdn`;  # Fall$
-     chomp($hostname);
-     $hostname =~ s/\s//g;
-     return $hostname;
diff -pruN 2.0.57-1/dists/tarball/plugins.conf 2.0.69-1/dists/tarball/plugins.conf
--- 2.0.57-1/dists/tarball/plugins.conf	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/dists/tarball/plugins.conf	1970-01-01 00:00:00.000000000 +0000
@@ -1,33 +0,0 @@
-# This file is used to configure how the plugins are invoked.
-# Place in /etc/munin/plugin-conf.d/ or corresponding directory.
-#
-# PLEASE NOTE: Changes in the plugin-conf.d directory are only
-# read at munin-node startup, so restart at any changes.
-#
-#  user <user>         # Set the user to run the plugin as
-#  group <group>       # Set the group to run the plugin as
-#  command <command>   # Run <command> instead of the plugin. %c
-# 	                 expands to what would normally be run.
-#  env.<variable> <value> # Sets <variable> in the plugin's environment, see the
-#                        individual plugins to find out which variables they
-#                        care about.
-#
-#
-
-[mysql*]
-#env.mysqlopts -u someuser
-
-[exim*]
-group mail
-
-[cps*]
-user root
-
-[apt]
-user root
-
-[vlan*]
-user root
-
-[postfix*]
-user root
diff -pruN 2.0.57-1/doc/reference/plugin.rst 2.0.69-1/doc/reference/plugin.rst
--- 2.0.57-1/doc/reference/plugin.rst	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/doc/reference/plugin.rst	2021-11-22 22:12:17.000000000 +0000
@@ -35,7 +35,7 @@ following fields are used.
 |                    |                  |          | web page                                 |                  |         |
 +--------------------+------------------+----------+------------------------------------------+------------------+---------+
 | graph_scale        | yes|no           | optional | If "yes", the generated graph will be    |                  | no      |
-|                    |                  |          | scaled to the uppper and lower values of |                  |         |
+|                    |                  |          | scaled to the upper and lower values of  |                  |         |
 |                    |                  |          | the datapoints within the graph.         |                  |         |
 +--------------------+------------------+----------+------------------------------------------+------------------+---------+
 | graph_order        | space separated  | optional | Ensures that the listed datapoints are   |                  |         |
diff -pruN 2.0.57-1/Makefile 2.0.69-1/Makefile
--- 2.0.57-1/Makefile	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/Makefile	2021-11-22 22:12:17.000000000 +0000
@@ -2,7 +2,6 @@
 #
 # Gnu make only.  Seriously.
 #
-# $Id$
 
 # Defaults/paths. Allows $(CONFIG) to be overridden by
 # make command line
@@ -87,7 +86,7 @@ unconfig:
 
 tags:
 	-rm -f TAGS
-	find master common -type f | egrep -v '/(build/|_build/|blib/|\.svn/)' | grep -v '\.t$$' | fgrep -v '~' | xargs etags -l perl -a
+	find master common -type f | grep -Ev '/(build/|_build/|blib/|\.svn/)' | grep -v '\.t$$' | grep -Fv '~' | xargs etags -l perl -a
 
 ######################################################################
 
@@ -527,7 +526,7 @@ build-%: %/Build
 build-common: build-common-defaults-stamp
 
 # BUG: the Build script writes files under PWD when it does "install"
-# can't seem to find a way to persuade it to write otherwhere.
+# can't seem to find a way to persuade it to write elsewhere.
 install-%: %/Build
 	cd $* && $(PERL) Build install \
 		--install_path lib=$(PERLLIB) \
@@ -540,7 +539,6 @@ install-%: %/Build
 test-%: %/Build
 	cd $* && $(PERL) Build test --verbose=0
 
-
 .PHONY: lint lint-plugins lint-spelling
 lint: lint-plugins lint-spelling
 
diff -pruN 2.0.57-1/master/_bin/munin-cgi-graph.in 2.0.69-1/master/_bin/munin-cgi-graph.in
--- 2.0.57-1/master/_bin/munin-cgi-graph.in	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/master/_bin/munin-cgi-graph.in	2021-11-22 22:12:17.000000000 +0000
@@ -18,8 +18,6 @@ General Public License for more details.
 You should have received a copy of the GNU General Public License
 along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
-$Id$
-
 =end comment
 
 =cut
diff -pruN 2.0.57-1/master/_bin/munin-check.in 2.0.69-1/master/_bin/munin-check.in
--- 2.0.57-1/master/_bin/munin-check.in	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/master/_bin/munin-check.in	2021-11-22 22:12:17.000000000 +0000
@@ -15,7 +15,6 @@
 # along with this program; if not, write to the Free Software
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 #
-# $Id$
 
 
 ####
diff -pruN 2.0.57-1/master/_bin/munin-datafile2storable.in 2.0.69-1/master/_bin/munin-datafile2storable.in
--- 2.0.57-1/master/_bin/munin-datafile2storable.in	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/master/_bin/munin-datafile2storable.in	2021-11-22 22:12:17.000000000 +0000
@@ -1,5 +1,4 @@
 #!@@PERL@@
-# $Id$
 
 use strict;
 use warnings;
diff -pruN 2.0.57-1/master/_bin/munin-graph.in 2.0.69-1/master/_bin/munin-graph.in
--- 2.0.57-1/master/_bin/munin-graph.in	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/master/_bin/munin-graph.in	2021-11-22 22:12:17.000000000 +0000
@@ -82,6 +82,9 @@ if (! graph_check_cron() ) {
 	exit 0;
 }
 
+INFO "Starting munin-graph"; 
+my $graph_time = Time::HiRes::time;
+
 # BEGIN FAST-CGI LOOP:
 my $nb_request = 0;
 my $nb_request_max = 0;
@@ -102,7 +105,7 @@ while (my $path = <$graph_fh>) {
     # Case 2:
     # http://localhost:8080/munin-cgi/munin-cgi-graph/client/\
     #    Backend/dafnes.client.example.com/diskstats_iops/sda-week.png
-    # path should be
+    #Â path should be
     #    client/Backend/dafnes.client.example.com/diskstats_iops/\
     #    sda-week.png
     #
@@ -174,6 +177,9 @@ while (my $path = <$graph_fh>) {
 }
 # END FAST-CGI LOOP - Time to die.  Nicely.
 
+$graph_time = sprintf("%.2f", (Time::HiRes::time - $graph_time));
+INFO "Munin-graph finished ($graph_time sec)";
+
 exit 0;
 
 sub get_w3c_date_from_epoch {
diff -pruN 2.0.57-1/master/_bin/munin-html.in 2.0.69-1/master/_bin/munin-html.in
--- 2.0.57-1/master/_bin/munin-html.in	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/master/_bin/munin-html.in	2021-11-22 22:12:17.000000000 +0000
@@ -22,8 +22,6 @@ You should have received a copy of the G
 along with this program; if not, write to the Free Software
 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 
-$Id$
-
 =end comment
 
 =cut
diff -pruN 2.0.57-1/master/_bin/munin-limits.in 2.0.69-1/master/_bin/munin-limits.in
--- 2.0.57-1/master/_bin/munin-limits.in	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/master/_bin/munin-limits.in	2021-11-22 22:12:17.000000000 +0000
@@ -21,8 +21,6 @@ You should have received a copy of the G
 along with this program; if not, write to the Free Software
 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 
-$Id$
-
 =end comment
 
 =cut
diff -pruN 2.0.57-1/master/_bin/munin-storable2datafile.in 2.0.69-1/master/_bin/munin-storable2datafile.in
--- 2.0.57-1/master/_bin/munin-storable2datafile.in	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/master/_bin/munin-storable2datafile.in	2021-11-22 22:12:17.000000000 +0000
@@ -1,5 +1,4 @@
 #!@@PERL@@
-# $Id$
 
 use strict;
 use warnings;
diff -pruN 2.0.57-1/master/_bin/munin-update.in 2.0.69-1/master/_bin/munin-update.in
--- 2.0.57-1/master/_bin/munin-update.in	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/master/_bin/munin-update.in	2021-11-22 22:12:17.000000000 +0000
@@ -4,8 +4,6 @@
 use warnings;
 use strict;
 
-# $Id$
-
 use English qw(-no_match_vars);
 use Getopt::Long;
 use Pod::Usage;
diff -pruN 2.0.57-1/master/doc/munin.conf.pod.in 2.0.69-1/master/doc/munin.conf.pod.in
--- 2.0.57-1/master/doc/munin.conf.pod.in	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/master/doc/munin.conf.pod.in	2021-11-22 22:12:17.000000000 +0000
@@ -127,6 +127,32 @@ munin-cgi-graph jobs which we can't stop
 throttle down how many rrdgraph calls will be running at the same time
 to this number.  Affects: munin-cgi-graph and munin-fastcgi-graph.
 
+=item B<timeout_fetch_all_nodes> I<seconds>
+
+This directive will set the maximum amount of time in seconds the munin-update
+task may run. So we'll make sure the update ended within the 5 minutes
+timespan needed to have complete graphs without gaps.
+
+You should probably not increase this value, unless all nodes are using ssh
+with munin-async.  Otherwise you may expecience gaps in graphs, if
+C<munin-update> takes longer, than the default period (5 minutes).
+
+Munin-async can retrieve historical data, and if there is a big backlog,
+we could need more time depending on the size of the data generated by the plugin
+and the size of the backlog. This would also mean that we wouldn't care to skip
+an update. So munin-async will get more time to retrieve the backlog data.
+Afterwards new data will incrementally be fetched.
+Default is 240.
+Affects: munin-update
+
+=item B<timeout_fetch_one_node> I<seconds>
+
+This directive will set the maximum amount of time in seconds the munin-update
+task may run for a single node. This value can't be bigger than
+C<timeout_fetch_all_nodes>.
+Default is 180.
+Affects: munin-update
+
 =item B<ssh_command> I<value>
 
 The name of the secure shell command to use.  Can be fully qualified,
@@ -341,7 +367,7 @@ load'-graph.
 		load.graph_title Total load
 		load.sum_load.label load
 		load.sum_load.special_stack machine1=machine1.one.dom:load.load machine2=machine2.one.dom:load.load
-	
+
 
 =head1 AUTHORS
 
diff -pruN 2.0.57-1/master/extras/munin-update_old.in 2.0.69-1/master/extras/munin-update_old.in
--- 2.0.57-1/master/extras/munin-update_old.in	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/master/extras/munin-update_old.in	2021-11-22 22:12:17.000000000 +0000
@@ -19,7 +19,6 @@
 #
 # Script to update the RRD-files with current information.
 #
-# $Id$
 
 use strict;
 
diff -pruN 2.0.57-1/master/lib/Munin/Master/Config.pm 2.0.69-1/master/lib/Munin/Master/Config.pm
--- 2.0.57-1/master/lib/Munin/Master/Config.pm	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/master/lib/Munin/Master/Config.pm	2021-11-22 22:12:17.000000000 +0000
@@ -2,8 +2,6 @@ package Munin::Master::Config;
 
 use base qw(Munin::Common::Config);
 
-# $Id$
-
 # Notes about config data structure:
 # 
 # In Munin all configuration and gathered data is stored in the same
@@ -153,6 +151,8 @@ my %booleans = map {$_ => 1} qw(
 		max_processes    => 16,
 		rundir           => $Munin::Common::Defaults::MUNIN_STATEDIR,
 		timeout          => 180,
+		timeout_fetch_one_node => 180,
+		timeout_fetch_all_nodes => 240,
 		tls              => 'disabled',
 		tls_ca_certificate => "$Munin::Common::Defaults::MUNIN_CONFDIR/cacert.pem",
 		tls_certificate  => "$Munin::Common::Defaults::MUNIN_CONFDIR/munin.pem",
diff -pruN 2.0.57-1/master/lib/Munin/Master/GraphOld.pm 2.0.69-1/master/lib/Munin/Master/GraphOld.pm
--- 2.0.57-1/master/lib/Munin/Master/GraphOld.pm	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/master/lib/Munin/Master/GraphOld.pm	2021-11-22 22:12:17.000000000 +0000
@@ -28,8 +28,6 @@ GNU General Public License for more deta
 You should have received a copy of the GNU General Public License
 along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
-$Id$
-
 =end comment
 
 =cut
@@ -878,6 +876,16 @@ sub remove_dups {
 	return @ret;
 }
 
+sub _sanitise_fieldname {
+    # http://munin-monitoring.org/wiki/notes_on_datasource_names
+    my ($name) = @_;
+
+    $name =~ s/^[^A-Za-z_]/_/;
+    $name =~ s/[^A-Za-z0-9_]/_/g;
+
+    return $name;
+}
+
 sub process_service {
     my ($service) = @_;
 
@@ -986,7 +994,7 @@ sub process_service {
             }
         }
 
-        if ($fielddraw =~ /LINESTACK(\d+(?:.\d+)?)/) {
+        if ($fielddraw =~ /LINESTACK(|\d+|\d+\.\d+)$/) {
             if ($autostacking == 0) {
                 $fielddraw    = "LINE$1";
                 $autostacking = 1;
@@ -1137,7 +1145,7 @@ sub process_service {
         if ($has_negative) {
             my $negfieldname
                 = orig_to_cdef($service, munin_get($field, "negative"));
-            my $negfield = $service->{$negfieldname};
+            my $negfield = $service->{_sanitise_fieldname(munin_get($field, "negative"))};
             if (my $tmpneg = munin_get($negfield, "realname")) {
                 $negfieldname = $tmpneg;
                 $negfield     = $service->{$negfieldname};
@@ -1698,13 +1706,21 @@ sub graph_by_hour {
 sub orig_to_cdef {
     my $service   = shift;
     my $fieldname = shift;
+    my $original_fieldname = shift || $fieldname;
 
     return unless ref($service) eq "HASH";
 
     if (defined $service->{$fieldname} && defined $service->{$fieldname}->{"cdef_name"}) {
-        return orig_to_cdef($service, $service->{$fieldname}->{"cdef_name"});
+        return orig_to_cdef($service, $service->{$fieldname}->{"cdef_name"}, $original_fieldname);
+    }
+    # For unknown reasons the sanitizing of fieldnames in the context of RRD field names is not
+    # applied consistently (maybe it should not be applied at all).
+    # Thus we need to apply it here in the same way, as it seems to be applied at other places.
+    if (_sanitise_fieldname($original_fieldname) ne $original_fieldname) {
+        return get_field_name(_sanitise_fieldname($fieldname));
+    } else {
+        return get_field_name($fieldname);
     }
-    return $fieldname;
 }
 
 sub reset_cdef {
diff -pruN 2.0.57-1/master/lib/Munin/Master/Group.pm 2.0.69-1/master/lib/Munin/Master/Group.pm
--- 2.0.57-1/master/lib/Munin/Master/Group.pm	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/master/lib/Munin/Master/Group.pm	2021-11-22 22:12:17.000000000 +0000
@@ -2,8 +2,6 @@ package Munin::Master::Group;
 
 use base qw(Munin::Master::GroupRepository);
 
-# $Id$
-
 use warnings;
 use strict;
 
diff -pruN 2.0.57-1/master/lib/Munin/Master/GroupRepository.pm 2.0.69-1/master/lib/Munin/Master/GroupRepository.pm
--- 2.0.57-1/master/lib/Munin/Master/GroupRepository.pm	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/master/lib/Munin/Master/GroupRepository.pm	2021-11-22 22:12:17.000000000 +0000
@@ -2,8 +2,6 @@ package Munin::Master::GroupRepository;
 
 use base qw(Munin::Master::Config);
 
-# $Id$
-
 use warnings;
 use strict;
 
diff -pruN 2.0.57-1/master/lib/Munin/Master/Host.pm 2.0.69-1/master/lib/Munin/Master/Host.pm
--- 2.0.57-1/master/lib/Munin/Master/Host.pm	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/master/lib/Munin/Master/Host.pm	2021-11-22 22:12:17.000000000 +0000
@@ -2,8 +2,6 @@ package Munin::Master::Host;
 
 use base qw(Munin::Master::Group);
 
-# $Id$
-
 use warnings;
 use strict;
 
diff -pruN 2.0.57-1/master/lib/Munin/Master/HTMLConfig.pm 2.0.69-1/master/lib/Munin/Master/HTMLConfig.pm
--- 2.0.57-1/master/lib/Munin/Master/HTMLConfig.pm	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/master/lib/Munin/Master/HTMLConfig.pm	2021-11-22 22:12:17.000000000 +0000
@@ -160,6 +160,8 @@ sub get_group_tree {
 			my $childnode = generate_service_templates($child);
 			push @$graphs, {"name" => $childname};
 			$childnode->{'name'} = $child->{"graph_title"};
+			# used in category view and comparison view for nested (multigraph) services
+			$childnode->{'nodename'} = munin_get_parent_name($hash);
 			add_graph_to_categories($childnode);
 
 		    # Make sure the link gets right even if the service has subservices
diff -pruN 2.0.57-1/master/lib/Munin/Master/HTMLOld.pm 2.0.69-1/master/lib/Munin/Master/HTMLOld.pm
--- 2.0.57-1/master/lib/Munin/Master/HTMLOld.pm	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/master/lib/Munin/Master/HTMLOld.pm	2021-11-22 22:12:17.000000000 +0000
@@ -30,8 +30,6 @@ along with this program; if not, write t
 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
 02110-1301 USA.
 
-$Id$
-
 
 This is the hierarchy of templates
 
@@ -761,14 +759,14 @@ sub emit_main_index {
 
     $template->param(
                     TAGLINE   => $htmltagline,
-                    GROUPS    => $groups,
+                    GROUPS    => $groups || [],
                     CSS_NAME  => get_css_name(),
 					R_PATH => ".",
-				    ROOTGROUPS => $htmlconfig->{"groups"},
+				    ROOTGROUPS => $htmlconfig->{"groups"} || [],
 			  	    MUNIN_VERSION => $Munin::Common::Defaults::MUNIN_VERSION,
 					TIMESTAMP	=> $timestamp,
-					NGLOBALCATS => $htmlconfig->{"nglobalcats"},
-					GLOBALCATS => $htmlconfig->{"globalcats"},
+					NGLOBALCATS => $htmlconfig->{"nglobalcats"} || [],
+					GLOBALCATS => $htmlconfig->{"globalcats"} || [],
 					  NCRITICAL => scalar(@{$htmlconfig->{"problems"}->{"criticals"}}),
 					  NWARNING => scalar(@{$htmlconfig->{"problems"}->{"warnings"}}),
 					  NUNKNOWN => scalar(@{$htmlconfig->{"problems"}->{"unknowns"}}),
diff -pruN 2.0.57-1/master/lib/Munin/Master/LimitsOld.pm 2.0.69-1/master/lib/Munin/Master/LimitsOld.pm
--- 2.0.57-1/master/lib/Munin/Master/LimitsOld.pm	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/master/lib/Munin/Master/LimitsOld.pm	2021-11-22 22:12:17.000000000 +0000
@@ -441,7 +441,7 @@ sub process_service {
             # First we'll need to check whether the user wants to ignore
             # a few UNKNOWN values before actually changing the state to
             # UNKNOWN.
-            if (($oldstate ne "unknown") and ($unknown_limit > 1)) {
+            if (($oldstate ne "unknown") and ($unknown_limit >= 1)) {
                  if (!defined($onfield->{"num_unknowns"}) or ($onfield->{"num_unknowns"} < $unknown_limit)) {
                      $newstate = $oldstate;
                      $extinfo = $onfield->{$newstate};
@@ -590,13 +590,7 @@ sub get_limits {
     }
 
     if ($unknown_limit =~ /^\s*(\d+)\s*$/) {
-        $unknown_limit = $1 if defined $1;
-        if (defined $unknown_limit) {
-            if ($unknown_limit < 1) {
-                # Zero and negative numbers are not valid.  
-                $unknown_limit = 1;
-            }
-        }
+        $unknown_limit = $1;
         DEBUG "[DEBUG] processing unknown_limit: $name -> $unknown_limit";
     }
 
diff -pruN 2.0.57-1/master/lib/Munin/Master/Logger.pm 2.0.69-1/master/lib/Munin/Master/Logger.pm
--- 2.0.57-1/master/lib/Munin/Master/Logger.pm	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/master/lib/Munin/Master/Logger.pm	2021-11-22 22:12:17.000000000 +0000
@@ -1,7 +1,5 @@
 package Munin::Master::Logger;
 
-# $Id$
-
 =encoding utf-8
 
 =head1 NAME
diff -pruN 2.0.57-1/master/lib/Munin/Master/Node.pm 2.0.69-1/master/lib/Munin/Master/Node.pm
--- 2.0.57-1/master/lib/Munin/Master/Node.pm	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/master/lib/Munin/Master/Node.pm	2021-11-22 22:12:17.000000000 +0000
@@ -1,7 +1,5 @@
 package Munin::Master::Node;
 
-# $Id$
-
 # This module is used by UpdateWorker to keep in touch with a node and
 # parse some of the output.
 
@@ -87,12 +85,12 @@ sub _do_connect {
         $self->{reader} = $self->{writer} = IO::Socket::INET6->new(
 		PeerAddr  => $uri->host,
 		PeerPort  => $self->{port} || 4949,
-		LocalAddr => $config->{local_address},
+		LocalAddr => $self->_get_node_or_global_setting("local_address"),
 		Proto     => 'tcp', 
 		MultiHomed => 1,
 		Timeout   => $config->{timeout}
 	);
-	if (! $self->{reader} ) {
+	unless ($self->{reader} && defined $self->{reader}->connected()) {
 		ERROR "Failed to connect to node $self->{address}:$self->{port}/tcp : $!";
 		return 0;
 	}
@@ -241,16 +239,12 @@ sub list_plugins {
     my ($self) = @_;
 
     # Check for one on this node- if not, use the global one
-    my $use_node_name = defined($self->{configref}{use_node_name})
-        ? $self->{configref}{use_node_name}
-        : $config->{use_node_name};
+    my $use_node_name = $self->_get_node_or_global_setting("use_node_name");
     my $host = $use_node_name
         ? $self->{node_name}
         : $self->{host};
 
-    my $use_default_node = defined($self->{configref}{use_default_node})
-        ? $self->{configref}{use_default_node}
-        : $config->{use_default_node};
+    my $use_default_node = $self->_get_node_or_global_setting("use_default_node");
 
     if (! $use_default_node && ! $host) {
 	die "[ERROR] Couldn't find out which host to list on $host.\n";
@@ -396,6 +390,14 @@ sub parse_service_config {
             DEBUG "[CONFIG dataseries $plugin] $service->$ds_name.$ds_var = $ds_val" if $debug;
             push ( @graph_order, $ds_name ) if $ds_var eq 'label';
         }
+        elsif ($line =~ m{\A ([^\.]+)\.([^\s]+) \s* $}xms) {
+            # the field value is empty - ignore it
+            # see https://github.com/munin-monitoring/contrib/issues/1156#issuecomment-746884950
+            # For example the meminfo "slab_size" graph may contain empty fields.  These should not
+            # end up as log noise, but can be safely ignored instead.
+            $correct++;
+            DEBUG "[DEBUG] Ignoring field without value ('$line') from $plugin on $nodedesignation.\n";
+        }
 	else {
 	    $errors++;
 	    DEBUG "[DEBUG] Protocol exception: unrecognized line '$line' from $plugin on $nodedesignation.\n";
diff -pruN 2.0.57-1/master/lib/Munin/Master/ProcessManager.pm 2.0.69-1/master/lib/Munin/Master/ProcessManager.pm
--- 2.0.57-1/master/lib/Munin/Master/ProcessManager.pm	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/master/lib/Munin/Master/ProcessManager.pm	2021-11-22 22:12:17.000000000 +0000
@@ -1,7 +1,5 @@
 package Munin::Master::ProcessManager;
 
-# $Id$
-
 use warnings;
 use strict;
 
@@ -38,8 +36,8 @@ sub new {
         result_callback => $result_callback,
         error_callback  => $error_callback,
 
-        worker_timeout  => 180,
-        timeout         => 240,
+        worker_timeout  => $config->{timeout_fetch_one_node},
+        timeout         => $config->{timeout_fetch_all_nodes},
         accept_timeout  => 10,
 
         active_workers  => {},
diff -pruN 2.0.57-1/master/lib/Munin/Master/Update.pm 2.0.69-1/master/lib/Munin/Master/Update.pm
--- 2.0.57-1/master/lib/Munin/Master/Update.pm	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/master/lib/Munin/Master/Update.pm	2021-11-22 22:12:17.000000000 +0000
@@ -1,7 +1,5 @@
 package Munin::Master::Update;
 
-# $Id$
-
 use warnings;
 use strict;
 
diff -pruN 2.0.57-1/master/lib/Munin/Master/UpdateWorker.pm 2.0.69-1/master/lib/Munin/Master/UpdateWorker.pm
--- 2.0.57-1/master/lib/Munin/Master/UpdateWorker.pm	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/master/lib/Munin/Master/UpdateWorker.pm	2021-11-22 22:12:17.000000000 +0000
@@ -1,8 +1,6 @@
 package Munin::Master::UpdateWorker;
 use base qw(Munin::Master::Worker);
 
-# $Id$
-
 use warnings;
 use strict;
 
@@ -58,8 +56,20 @@ sub do_work {
     my $path = $self->{host}->get_full_path;
     $path =~ s{[:;]}{-}g;
 
-    my $nodedesignation = $host."/".
-	$self->{host}{address}.":".$self->{host}{port};
+    # Parameters are space-separated from the main address
+    my ($url, $params) = split(/ +/, $self->{host}{address}, 2);
+    my $uri = new URI($url);
+
+    # If the scheme is not defined, it's a plain host.
+    # Prefix it with munin:// to be able to parse it like others
+    $uri = new URI("munin://" . $url) unless $uri->scheme;
+
+    my $nodedesignation;
+    if ($uri->scheme eq "ssh" || $uri->scheme eq "cmd") {
+      $nodedesignation = $host." (".$self->{host}{address}.")";
+    }else{
+      $nodedesignation = $host." (".$self->{host}{address}.":".$self->{host}{port}.")";
+    }
 
     my $lock_file = sprintf ('%s/munin-%s.lock',
 			     $config->{rundir},
@@ -241,7 +251,7 @@ sub do_work {
 	}
 
 	if ($EVAL_ERROR =~ m/^NO_SPOOLFETCH_DATA /) {
-	    INFO "[INFO] No spoofetch data for $nodedesignation";
+	    INFO "[INFO] No spoolfetch data for $nodedesignation";
 	    return;
 	} elsif ($EVAL_ERROR) {
 	    ERROR "[ERROR] Error in node communication with $nodedesignation: "
diff -pruN 2.0.57-1/master/lib/Munin/Master/Utils.pm 2.0.69-1/master/lib/Munin/Master/Utils.pm
--- 2.0.57-1/master/lib/Munin/Master/Utils.pm	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/master/lib/Munin/Master/Utils.pm	2021-11-22 22:12:17.000000000 +0000
@@ -1,8 +1,6 @@
 package Munin::Master::Utils;
 # -*- cperl -*-
 
-# $Id$
-
 use strict;
 use warnings;
 
diff -pruN 2.0.57-1/master/lib/Munin/Master/Worker.pm 2.0.69-1/master/lib/Munin/Master/Worker.pm
--- 2.0.57-1/master/lib/Munin/Master/Worker.pm	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/master/lib/Munin/Master/Worker.pm	2021-11-22 22:12:17.000000000 +0000
@@ -1,7 +1,5 @@
 package Munin::Master::Worker;
 
-# $Id$
-
 use warnings;
 use strict;
 
diff -pruN 2.0.57-1/master/MasterBuilder.pm 2.0.69-1/master/MasterBuilder.pm
--- 2.0.57-1/master/MasterBuilder.pm	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/master/MasterBuilder.pm	2021-11-22 22:12:17.000000000 +0000
@@ -1,7 +1,5 @@
 package MasterBuilder;
 
-# $Id$
-
 use base qw(Module::Build);
 
 use lib '../common/blib/lib';
diff -pruN 2.0.57-1/master/munin.conf.in 2.0.69-1/master/munin.conf.in
--- 2.0.57-1/master/munin.conf.in	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/master/munin.conf.in	2021-11-22 22:12:17.000000000 +0000
@@ -94,6 +94,16 @@ includedir @@CONFDIR@@/munin-conf.d
 # the services must be defined in the Nagios server as well.
 #contact.nagios.command /usr/bin/send_nsca nagios.host.comm -c /etc/nsca.conf
 
+# The maximum time the munin-update may take to get updates from all nodes,
+# this might be interesting when using munin-async in case of large transactions and/or backlog.
+# When using the munin protocol to connect to a node, then this value shouldn't be set higher than 240.
+# In case it's higher, gaps might be seen in the graphs.
+timeout_fetch_all_nodes 240
+
+# The maximum amount of time in seconds we may work on 1 node.
+# The value will be limited with timeout_fetch_all_nodes.
+timeout_fetch_one_node 180
+
 # a simple host tree
 [@@HOSTNAME@@]
     address 127.0.0.1
diff -pruN 2.0.57-1/master/t/munin_master_config.t 2.0.69-1/master/t/munin_master_config.t
--- 2.0.57-1/master/t/munin_master_config.t	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/master/t/munin_master_config.t	2021-11-22 22:12:17.000000000 +0000
@@ -55,6 +55,8 @@ my $fasit = {
         ssh_command            => "ssh",
         ssh_options            => "-o ChallengeResponseAuthentication=no -o StrictHostKeyChecking=no",
         timeout                => 180,
+        timeout_fetch_all_nodes     => 240,
+        timeout_fetch_one_node       => 180,
         tls                    => 'disabled',
         tls_ca_certificate     => '/opt/munin/common/t/tls/CA/ca_cert.pem',
         tls_certificate        => '/opt/munin/common/t/tls/master_cert.pem',
@@ -132,7 +134,7 @@ rrdcached_socket /var/run/rrdcached.sock
     load1.graph_title Loads side by side
     load1.graph_order fii=fii.foo.com:load.load fay=fay.foo.com:load.load
 
-# 
+#
 # A more complex example of a host tree
 #
 ## First our "normal" host.
@@ -147,7 +149,7 @@ rrdcached_socket /var/run/rrdcached.sock
 # [foo.com;Totals] #Force it into the "foo.com"-domain...
 #       update no   # Turn off data-fetching for this "host".
 #
-#   # The graph "load1". We want to see the loads of both machines... 
+#   # The graph "load1". We want to see the loads of both machines...
 #   # "fii=fii.foo.com:load.load" means "label=machine:graph.field"
 #       load1.graph_title Loads side by side
 #       load1.graph_order fii=fii.foo.com:load.load fay=fay.foo.com:load.load
@@ -172,4 +174,3 @@ rrdcached_socket /var/run/rrdcached.sock
 # [foo.com;]
 #       node_order Totals fii.foo.com fay.foo.com
 #
-
diff -pruN 2.0.57-1/master/t/munin_master_node.t 2.0.69-1/master/t/munin_master_node.t
--- 2.0.57-1/master/t/munin_master_node.t	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/master/t/munin_master_node.t	2021-11-22 22:12:17.000000000 +0000
@@ -43,8 +43,10 @@ sub setup {
     $node->mock('_node_read_single', sub { 
         return '# munin node at foo.example.com' 
     });
+    my $connected_socket = Test::MockObject->new();
+    $connected_socket->set_true('connected');
     my $inet = Test::MockModule->new('IO::Socket::INET6');
-    $inet->mock(new => sub { return {} });
+    $inet->mock(new => sub { return $connected_socket });
 
     $node->_do_connect();
 
diff -pruN 2.0.57-1/master/www/munin-overview.tmpl 2.0.69-1/master/www/munin-overview.tmpl
--- 2.0.57-1/master/www/munin-overview.tmpl	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/master/www/munin-overview.tmpl	2021-11-22 22:12:17.000000000 +0000
@@ -1,69 +1,115 @@
 <TMPL_INCLUDE NAME="partial/head.tmpl"><!-- -*- HTML -*- -->
 <body>
- <div id="header">
-	<h1><a href="<TMPL_VAR NAME="R_PATH">"><span class="logo"></span></a> <span class="currentpage">Overview</span></h1>
- </div>
- <div id="main">
- <TMPL_INCLUDE NAME="partial/navigation.tmpl">
- <div id="content">
-	<h2>Overview</h2>
-	<ul class="groupview">
-	<TMPL_LOOP NAME="GROUPS"><TMPL_UNLESS NAME="MULTIGRAPH">
-		<li <TMPL_IF NAME="__LAST__">class="last"</TMPL_IF>>
-		<TMPL_IF NAME="NCATEGORIES"><span class="host"><TMPL_ELSE><span class="domain"></TMPL_IF><a href="<TMPL_VAR NAME="URL">"><TMPL_VAR ESCAPE="HTML" NAME="NAME"></a></span>
-		<TMPL_IF NAME="COMPARE"> :: [ 
-          <a href="<TMPL_VAR NAME="R_PATH">/<TMPL_LOOP NAME="PATH"><TMPL_IF NAME="pathname"><TMPL_VAR ESCAPE="URL" NAME="PATHNAME">/</TMPL_IF></TMPL_LOOP>comparison-day.html">day</a> 
-          <a href="<TMPL_VAR NAME="R_PATH">/<TMPL_LOOP NAME="PATH"><TMPL_IF NAME="pathname"><TMPL_VAR ESCAPE="URL" NAME="PATHNAME">/</TMPL_IF></TMPL_LOOP>comparison-week.html">week</a> 
-          <a href="<TMPL_VAR NAME="R_PATH">/<TMPL_LOOP NAME="PATH"><TMPL_IF NAME="pathname"><TMPL_VAR ESCAPE="URL" NAME="PATHNAME">/</TMPL_IF></TMPL_LOOP>comparison-month.html">month</a> 
-          <a href="<TMPL_VAR NAME="R_PATH">/<TMPL_LOOP NAME="PATH"><TMPL_IF NAME="pathname"><TMPL_VAR ESCAPE="URL" NAME="PATHNAME">/</TMPL_IF></TMPL_LOOP>comparison-year.html">year</a>&nbsp;]</TMPL_IF>
-        <TMPL_IF NAME="NCATEGORIES">[ <TMPL_LOOP NAME="CATEGORIES">
-          <a <TMPL_IF NAME="STATE_WARNING">class="warn"</TMPL_IF> <TMPL_IF NAME="STATE_CRITICAL">class="crit"</TMPL_IF> href="<TMPL_VAR NAME="URL">"><TMPL_VAR ESCAPE="HTML" NAME="NAME"></a></TMPL_LOOP>&nbsp]</TMPL_IF>
-		<ul>
-		<TMPL_LOOP NAME="GROUPS"><TMPL_UNLESS NAME="MULTIGRAPH">
-			<li <TMPL_IF NAME="__LAST__">class="last"</TMPL_IF>>
-			<TMPL_IF NAME="NCATEGORIES"><span class="host"><TMPL_ELSE><span class="domain"></TMPL_IF><a href="<TMPL_VAR NAME="URL">"><TMPL_VAR ESCAPE="HTML" NAME="NAME"></a></span>
-			<TMPL_IF NAME="COMPARE"> :: [ 
-	          <a href="<TMPL_VAR NAME="R_PATH">/<TMPL_LOOP NAME="PATH"><TMPL_IF NAME="pathname"><TMPL_VAR ESCAPE="URL" NAME="PATHNAME">/</TMPL_IF></TMPL_LOOP>comparison-day.html">day</a> 
-        	  <a href="<TMPL_VAR NAME="R_PATH">/<TMPL_LOOP NAME="PATH"><TMPL_IF NAME="pathname"><TMPL_VAR ESCAPE="URL" NAME="PATHNAME">/</TMPL_IF></TMPL_LOOP>comparison-week.html">week</a> 
-    	      <a href="<TMPL_VAR NAME="R_PATH">/<TMPL_LOOP NAME="PATH"><TMPL_IF NAME="pathname"><TMPL_VAR ESCAPE="URL" NAME="PATHNAME">/</TMPL_IF></TMPL_LOOP>comparison-month.html">month</a> 
-	          <a href="<TMPL_VAR NAME="R_PATH">/<TMPL_LOOP NAME="PATH"><TMPL_IF NAME="pathname"><TMPL_VAR ESCAPE="URL" NAME="PATHNAME">/</TMPL_IF></TMPL_LOOP>comparison-year.html">year</a>&nbsp;]</TMPL_IF>
-    	    <TMPL_IF NAME="NCATEGORIES">[ <TMPL_LOOP NAME="CATEGORIES">
-	          <a <TMPL_IF NAME="STATE_WARNING">class="warn"</TMPL_IF> <TMPL_IF NAME="STATE_CRITICAL">class="crit"</TMPL_IF> href="<TMPL_VAR NAME="URL">"><TMPL_VAR ESCAPE="HTML" NAME="NAME"></a>&nbsp;</TMPL_LOOP>]</TMPL_IF>
-			<ul>
-			<TMPL_LOOP NAME="GROUPS"><TMPL_UNLESS NAME="MULTIGRAPH">
-				<li <TMPL_IF NAME="__LAST__">class="last"</TMPL_IF>>
-				<TMPL_IF NAME="NCATEGORIES"><span class="host"><TMPL_ELSE><span class="domain"></TMPL_IF><a href="<TMPL_VAR NAME="URL">"><TMPL_VAR ESCAPE="HTML" NAME="NAME"></a></span>
-				<TMPL_IF NAME="COMPARE"> :: [ 
-		          <a href="<TMPL_VAR NAME="R_PATH">/<TMPL_LOOP NAME="PATH"><TMPL_IF NAME="pathname"><TMPL_VAR ESCAPE="URL" NAME="PATHNAME">/</TMPL_IF></TMPL_LOOP>comparison-day.html">day</a> 
-       			  <a href="<TMPL_VAR NAME="R_PATH">/<TMPL_LOOP NAME="PATH"><TMPL_IF NAME="pathname"><TMPL_VAR ESCAPE="URL" NAME="PATHNAME">/</TMPL_IF></TMPL_LOOP>comparison-week.html">week</a> 
-	    	      <a href="<TMPL_VAR NAME="R_PATH">/<TMPL_LOOP NAME="PATH"><TMPL_IF NAME="pathname"><TMPL_VAR ESCAPE="URL" NAME="PATHNAME">/</TMPL_IF></TMPL_LOOP>comparison-month.html">month</a> 
-       			  <a href="<TMPL_VAR NAME="R_PATH">/<TMPL_LOOP NAME="PATH"><TMPL_IF NAME="pathname"><TMPL_VAR ESCAPE="URL" NAME="PATHNAME">/</TMPL_IF></TMPL_LOOP>comparison-year.html">year</a>&nbsp;]</TMPL_IF>
-	        	<TMPL_IF NAME="NCATEGORIES">[ <TMPL_LOOP NAME="CATEGORIES">
-  	        	  <a <TMPL_IF NAME="STATE_WARNING">class="warn"</TMPL_IF> <TMPL_IF NAME="STATE_CRITICAL">class="crit"</TMPL_IF> href="<TMPL_VAR NAME="URL">"><TMPL_VAR ESCAPE="HTML" NAME="NAME"></a>&nbsp;</TMPL_LOOP>]</TMPL_IF>
-				<ul>
-				<TMPL_LOOP NAME="GROUPS"><TMPL_UNLESS NAME="MULTIGRAPH">
-					<li <TMPL_IF NAME="__LAST__">class="last"</TMPL_IF>>
-					<TMPL_IF NAME="NCATEGORIES"><span class="host"><TMPL_ELSE><span class="domain"></TMPL_IF><a href="<TMPL_VAR NAME="URL">"><TMPL_VAR ESCAPE="HTML" NAME="NAME"></a></span>
-					<TMPL_IF NAME="COMPARE"> :: [ 
-			          <a href="<TMPL_VAR NAME="R_PATH">/<TMPL_LOOP NAME="PATH"><TMPL_IF NAME="pathname"><TMPL_VAR ESCAPE="URL" NAME="PATHNAME">/</TMPL_IF></TMPL_LOOP>comparison-day.html">day</a> 
-			          <a href="<TMPL_VAR NAME="R_PATH">/<TMPL_LOOP NAME="PATH"><TMPL_IF NAME="pathname"><TMPL_VAR ESCAPE="URL" NAME="PATHNAME">/</TMPL_IF></TMPL_LOOP>comparison-week.html">week</a> 
-			          <a href="<TMPL_VAR NAME="R_PATH">/<TMPL_LOOP NAME="PATH"><TMPL_IF NAME="pathname"><TMPL_VAR ESCAPE="URL" NAME="PATHNAME">/</TMPL_IF></TMPL_LOOP>comparison-month.html">month</a> 
-			          <a href="<TMPL_VAR NAME="R_PATH">/<TMPL_LOOP NAME="PATH"><TMPL_IF NAME="pathname"><TMPL_VAR ESCAPE="URL" NAME="PATHNAME">/</TMPL_IF></TMPL_LOOP>comparison-year.html">year</a>&nbsp;]</TMPL_IF>
-			        <TMPL_IF NAME="NCATEGORIES">[ <TMPL_LOOP NAME="CATEGORIES">
-			          <a <TMPL_IF NAME="STATE_WARNING">class="warn"</TMPL_IF> <TMPL_IF NAME="STATE_CRITICAL">class="crit"</TMPL_IF> href="<TMPL_VAR NAME="URL">"><TMPL_VAR ESCAPE="HTML" NAME="NAME"></a></TMPL_LOOP>&nbsp;]</TMPL_IF>
-				</TMPL_UNLESS></TMPL_LOOP>
-			        </ul>
-			</TMPL_UNLESS></TMPL_LOOP>
-			</ul>	
-			</li>	
-		</TMPL_UNLESS></TMPL_LOOP>
-		</ul>
-		</li>
-	</TMPL_UNLESS></TMPL_LOOP>
-	</ul>
-	<div class="contentpusher"></div>
- </div>
- </div>
- <TMPL_INCLUDE NAME="partial/footer.tmpl">
+  <div id="header">
+    <h1><a href="<TMPL_VAR NAME="R_PATH">"><span class="logo"></span></a> <span class="currentpage">Overview</span></h1>
+  </div>
+  <div id="main">
+    <TMPL_INCLUDE NAME="partial/navigation.tmpl">
+    <div id="content">
+      <h2>Overview</h2>
+      <TMPL_IF NAME="GROUPS">
+        <ul class="groupview">
+          <TMPL_LOOP NAME="GROUPS">
+            <TMPL_UNLESS NAME="MULTIGRAPH">
+              <li <TMPL_IF NAME="__LAST__">class="last"</TMPL_IF>>
+                <TMPL_IF NAME="NCATEGORIES"><span class="host"><TMPL_ELSE><span class="domain"></TMPL_IF><a href="<TMPL_VAR NAME="URL">"><TMPL_VAR ESCAPE="HTML" NAME="NAME"></a></span>
+                <TMPL_IF NAME="COMPARE">
+                  &nbsp;::&nbsp;[
+                  <a href="<TMPL_VAR NAME="R_PATH">/<TMPL_LOOP NAME="PATH"><TMPL_IF NAME="pathname"><TMPL_VAR ESCAPE="URL" NAME="PATHNAME">/</TMPL_IF></TMPL_LOOP>comparison-day.html">day</a>
+                  <a href="<TMPL_VAR NAME="R_PATH">/<TMPL_LOOP NAME="PATH"><TMPL_IF NAME="pathname"><TMPL_VAR ESCAPE="URL" NAME="PATHNAME">/</TMPL_IF></TMPL_LOOP>comparison-week.html">week</a>
+                  <a href="<TMPL_VAR NAME="R_PATH">/<TMPL_LOOP NAME="PATH"><TMPL_IF NAME="pathname"><TMPL_VAR ESCAPE="URL" NAME="PATHNAME">/</TMPL_IF></TMPL_LOOP>comparison-month.html">month</a>
+                  <a href="<TMPL_VAR NAME="R_PATH">/<TMPL_LOOP NAME="PATH"><TMPL_IF NAME="pathname"><TMPL_VAR ESCAPE="URL" NAME="PATHNAME">/</TMPL_IF></TMPL_LOOP>comparison-year.html">year</a>
+                  &nbsp;]
+                </TMPL_IF>
+                <TMPL_IF NAME="NCATEGORIES">
+                  [&nbsp;
+                  <TMPL_LOOP NAME="CATEGORIES">
+                    <a <TMPL_IF NAME="STATE_WARNING">class="warn"</TMPL_IF> <TMPL_IF NAME="STATE_CRITICAL">class="crit"</TMPL_IF> href="<TMPL_VAR NAME="URL">"><TMPL_VAR ESCAPE="HTML" NAME="NAME"></a>
+                  </TMPL_LOOP>&nbsp]
+                </TMPL_IF>
+                <ul>
+                  <TMPL_LOOP NAME="GROUPS">
+                    <TMPL_UNLESS NAME="MULTIGRAPH">
+                      <li <TMPL_IF NAME="__LAST__">class="last"</TMPL_IF>>
+                        <TMPL_IF NAME="NCATEGORIES"><span class="host"><TMPL_ELSE><span class="domain"></TMPL_IF><a href="<TMPL_VAR NAME="URL">"><TMPL_VAR ESCAPE="HTML" NAME="NAME"></a></span>
+                        <TMPL_IF NAME="COMPARE">
+                          &nbsp;::&nbsp;[
+                          <a href="<TMPL_VAR NAME="R_PATH">/<TMPL_LOOP NAME="PATH"><TMPL_IF NAME="pathname"><TMPL_VAR ESCAPE="URL" NAME="PATHNAME">/</TMPL_IF></TMPL_LOOP>comparison-day.html">day</a>
+                          <a href="<TMPL_VAR NAME="R_PATH">/<TMPL_LOOP NAME="PATH"><TMPL_IF NAME="pathname"><TMPL_VAR ESCAPE="URL" NAME="PATHNAME">/</TMPL_IF></TMPL_LOOP>comparison-week.html">week</a>
+                          <a href="<TMPL_VAR NAME="R_PATH">/<TMPL_LOOP NAME="PATH"><TMPL_IF NAME="pathname"><TMPL_VAR ESCAPE="URL" NAME="PATHNAME">/</TMPL_IF></TMPL_LOOP>comparison-month.html">month</a>
+                          <a href="<TMPL_VAR NAME="R_PATH">/<TMPL_LOOP NAME="PATH"><TMPL_IF NAME="pathname"><TMPL_VAR ESCAPE="URL" NAME="PATHNAME">/</TMPL_IF></TMPL_LOOP>comparison-year.html">year</a>
+                          &nbsp;]
+                        </TMPL_IF>
+                        <TMPL_IF NAME="NCATEGORIES">
+                          [&nbsp;
+                          <TMPL_LOOP NAME="CATEGORIES">
+                            <a <TMPL_IF NAME="STATE_WARNING">class="warn"</TMPL_IF> <TMPL_IF NAME="STATE_CRITICAL">class="crit"</TMPL_IF> href="<TMPL_VAR NAME="URL">"><TMPL_VAR ESCAPE="HTML" NAME="NAME"></a>
+                            &nbsp;
+                          </TMPL_LOOP>
+                          ]
+                        </TMPL_IF>
+                        <ul>
+                          <TMPL_LOOP NAME="GROUPS">
+                            <TMPL_UNLESS NAME="MULTIGRAPH">
+                              <li <TMPL_IF NAME="__LAST__">class="last"</TMPL_IF>>
+                                <TMPL_IF NAME="NCATEGORIES"><span class="host"><TMPL_ELSE><span class="domain"></TMPL_IF><a href="<TMPL_VAR NAME="URL">"><TMPL_VAR ESCAPE="HTML" NAME="NAME"></a></span>
+                                <TMPL_IF NAME="COMPARE">
+                                  &nbsp;::&nbsp;[
+                                  <a href="<TMPL_VAR NAME="R_PATH">/<TMPL_LOOP NAME="PATH"><TMPL_IF NAME="pathname"><TMPL_VAR ESCAPE="URL" NAME="PATHNAME">/</TMPL_IF></TMPL_LOOP>comparison-day.html">day</a>
+                                  <a href="<TMPL_VAR NAME="R_PATH">/<TMPL_LOOP NAME="PATH"><TMPL_IF NAME="pathname"><TMPL_VAR ESCAPE="URL" NAME="PATHNAME">/</TMPL_IF></TMPL_LOOP>comparison-week.html">week</a>
+                                  <a href="<TMPL_VAR NAME="R_PATH">/<TMPL_LOOP NAME="PATH"><TMPL_IF NAME="pathname"><TMPL_VAR ESCAPE="URL" NAME="PATHNAME">/</TMPL_IF></TMPL_LOOP>comparison-month.html">month</a>
+                                  <a href="<TMPL_VAR NAME="R_PATH">/<TMPL_LOOP NAME="PATH"><TMPL_IF NAME="pathname"><TMPL_VAR ESCAPE="URL" NAME="PATHNAME">/</TMPL_IF></TMPL_LOOP>comparison-year.html">year</a>
+                                  &nbsp;]
+                                </TMPL_IF>
+                                <TMPL_IF NAME="NCATEGORIES">
+                                  [&nbsp;
+                                  <TMPL_LOOP NAME="CATEGORIES">
+                                    <a <TMPL_IF NAME="STATE_WARNING">class="warn"</TMPL_IF> <TMPL_IF NAME="STATE_CRITICAL">class="crit"</TMPL_IF> href="<TMPL_VAR NAME="URL">"><TMPL_VAR ESCAPE="HTML" NAME="NAME"></a>
+                                    &nbsp;
+                                  </TMPL_LOOP>]
+                                </TMPL_IF>
+                                <ul>
+                                  <TMPL_LOOP NAME="GROUPS">
+                                    <TMPL_UNLESS NAME="MULTIGRAPH">
+                                      <li <TMPL_IF NAME="__LAST__">class="last"</TMPL_IF>>
+                                        <TMPL_IF NAME="NCATEGORIES"><span class="host"><TMPL_ELSE><span class="domain"></TMPL_IF><a href="<TMPL_VAR NAME="URL">"><TMPL_VAR ESCAPE="HTML" NAME="NAME"></a></span>
+                                        <TMPL_IF NAME="COMPARE">
+                                          &nbsp;::&nbsp;[
+                                          <a href="<TMPL_VAR NAME="R_PATH">/<TMPL_LOOP NAME="PATH"><TMPL_IF NAME="pathname"><TMPL_VAR ESCAPE="URL" NAME="PATHNAME">/</TMPL_IF></TMPL_LOOP>comparison-day.html">day</a>
+                                          <a href="<TMPL_VAR NAME="R_PATH">/<TMPL_LOOP NAME="PATH"><TMPL_IF NAME="pathname"><TMPL_VAR ESCAPE="URL" NAME="PATHNAME">/</TMPL_IF></TMPL_LOOP>comparison-week.html">week</a>
+                                          <a href="<TMPL_VAR NAME="R_PATH">/<TMPL_LOOP NAME="PATH"><TMPL_IF NAME="pathname"><TMPL_VAR ESCAPE="URL" NAME="PATHNAME">/</TMPL_IF></TMPL_LOOP>comparison-month.html">month</a>
+                                          <a href="<TMPL_VAR NAME="R_PATH">/<TMPL_LOOP NAME="PATH"><TMPL_IF NAME="pathname"><TMPL_VAR ESCAPE="URL" NAME="PATHNAME">/</TMPL_IF></TMPL_LOOP>comparison-year.html">year</a>
+                                          &nbsp;]
+                                        </TMPL_IF>
+                                        <TMPL_IF NAME="NCATEGORIES">
+                                          [&nbsp;
+                                          <TMPL_LOOP NAME="CATEGORIES">
+                                            <a <TMPL_IF NAME="STATE_WARNING">class="warn"</TMPL_IF> <TMPL_IF NAME="STATE_CRITICAL">class="crit"</TMPL_IF> href="<TMPL_VAR NAME="URL">"><TMPL_VAR ESCAPE="HTML" NAME="NAME"></a>
+                                          </TMPL_LOOP>
+                                          &nbsp;]
+                                        </TMPL_IF>
+                                      </li>
+                                    </TMPL_UNLESS>
+                                  </TMPL_LOOP>
+                                </ul>
+                              </li>
+                            </TMPL_UNLESS>
+                          </TMPL_LOOP>
+                        </ul>
+                      </li>
+                    </TMPL_UNLESS>
+                  </TMPL_LOOP>
+                </ul>
+              </li>
+            </TMPL_UNLESS>
+          </TMPL_LOOP>
+        </ul>
+      <TMPL_ELSE>
+        Warning: no hosts were configured for data collection. See the <a href="http://guide.munin-monitoring.org/en/latest/installation/configuration.html#add-some-nodes">Munin Guide</a> for details.
+      </TMPL_IF>
+      <div class="contentpusher"></div>
+    </div>
+  </div>
+  <TMPL_INCLUDE NAME="partial/footer.tmpl">
 </body>
 </html>
diff -pruN 2.0.57-1/master/www/partial/footer.tmpl 2.0.69-1/master/www/partial/footer.tmpl
--- 2.0.57-1/master/www/partial/footer.tmpl	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/master/www/partial/footer.tmpl	2021-11-22 22:12:17.000000000 +0000
@@ -2,6 +2,6 @@
 <TMPL_IF NAME="PEERS">
 <p class="navigation"><TMPL_INCLUDE NAME="bottom_navigation.tmpl"></p>
 </TMPL_IF>
-<p class="tagline">This page was generated by <a href="http://www.munin-monitoring.org/">Munin</a> version <TMPL_VAR NAME="MUNIN_VERSION"> at <TMPL_VAR NAME="TIMESTAMP">.</p>
+<p class="tagline">This page was generated by <a href="https://munin-monitoring.org/">Munin</a> version <TMPL_VAR NAME="MUNIN_VERSION"> at <TMPL_VAR NAME="TIMESTAMP">.</p>
 </div>	
 
diff -pruN 2.0.57-1/master/www/partial/head.tmpl 2.0.69-1/master/www/partial/head.tmpl
--- 2.0.57-1/master/www/partial/head.tmpl	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/master/www/partial/head.tmpl	2021-11-22 22:12:17.000000000 +0000
@@ -13,7 +13,7 @@
     <meta http-equiv="refresh" content="300" />
   </TMPL_UNLESS>
   <title>
-    <TMPL_IF NAME="NAME"><TMPL_VAR ESCAPE="HTML" NAME="NAME"> (</TMPL_IF>Munin <TMPL_LOOP NAME="PATH"><TMPL_IF NAME="pathname"> :: <TMPL_VAR ESCAPE="HTML" NAME="pathname"></TMPL_IF></TMPL_LOOP><TMPL_IF NAME="NAME">)</TMPL_IF>
+    <TMPL_IF NAME="NAME"><TMPL_VAR ESCAPE="HTML" NAME="NAME"> (</TMPL_IF>Munin<TMPL_LOOP NAME="PATH"><TMPL_IF NAME="pathname"> :: <TMPL_VAR ESCAPE="HTML" NAME="pathname"></TMPL_IF></TMPL_LOOP><TMPL_IF NAME="NAME">)</TMPL_IF>
   </title>
   <meta http-equiv="content-type" content="application/xhtml+xml; charset=iso-8859-1" />
   <meta name="author" content="Auto-generated by Munin" />
diff -pruN 2.0.57-1/node/_bin/munin-asyncd.in 2.0.69-1/node/_bin/munin-asyncd.in
--- 2.0.57-1/node/_bin/munin-asyncd.in	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/node/_bin/munin-asyncd.in	2021-11-22 22:12:17.000000000 +0000
@@ -17,7 +17,6 @@
 # along with this program; if not, write to the Free Software
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 #
-# $Id$
 
 use strict;
 use warnings;
@@ -40,6 +39,10 @@ my $intervalsize = 86400;
 my $timeout = 3600;
 my $minrate = 300;
 my $retaincount = 7;
+# Asyncd collects data from plugins periodically.  We want to avoid skipping the next value due to
+# slight deviations of this period.  Thus we tolerate a slightly shorter time distance between two
+# successive requests for values from a plugin.
+my $min_update_rate_threshold = 0.75;
 my $nocleanup;
 my $do_fork;
 my $verbose;
@@ -167,8 +170,8 @@ MAIN: while($keepgoing) {
 	my $sock;
 	PLUGIN: foreach my $plugin (@plugins) {
 		# See if this plugin should be updated
-		my $plugin_rate = $spoolwriter->get_metadata("plugin_rates/$plugin") || 300;
-		if ($when < ($last_updated{$plugin} || 0) + $plugin_rate) {
+		my $plugin_rate = $spoolwriter->get_metadata("plugin_rates/$plugin") || $minrate;
+		if ($when < ($last_updated{$plugin} || 0) + ($plugin_rate * $min_update_rate_threshold)) {
 			# not yet, next plugin
 			next;
 		}
diff -pruN 2.0.57-1/node/_bin/munin-async.in 2.0.69-1/node/_bin/munin-async.in
--- 2.0.57-1/node/_bin/munin-async.in	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/node/_bin/munin-async.in	2021-11-22 22:12:17.000000000 +0000
@@ -16,8 +16,6 @@
 # You should have received a copy of the GNU General Public License
 # along with this program; if not, write to the Free Software
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-#
-# $Id$
 
 use strict;
 use warnings;
@@ -100,7 +98,7 @@ while (my $line = <>) {
 		print ".\n";
 	} elsif ($line =~ m/^spoolfetch (\d+)/) {
 		my $last_epoch = $1;
-		print $spoolreader->fetch($last_epoch);
+		$spoolreader->fetch($1, sub { print shift(); });
 		print ".\n";
 	} elsif ($spoolfetch && $line =~ m/^cap/) {
 		print "cap spool\n";
diff -pruN 2.0.57-1/node/lib/Munin/Node/Config.pm 2.0.69-1/node/lib/Munin/Node/Config.pm
--- 2.0.57-1/node/lib/Munin/Node/Config.pm	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/node/lib/Munin/Node/Config.pm	2021-11-22 22:12:17.000000000 +0000
@@ -1,8 +1,6 @@
 package Munin::Node::Config;
 use base qw(Munin::Common::Config);
 
-# $Id$
-
 use strict;
 use warnings;
 
diff -pruN 2.0.57-1/node/lib/Munin/Node/Configure/Debug.pm 2.0.69-1/node/lib/Munin/Node/Configure/Debug.pm
--- 2.0.57-1/node/lib/Munin/Node/Configure/Debug.pm	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/node/lib/Munin/Node/Configure/Debug.pm	2021-11-22 22:12:17.000000000 +0000
@@ -1,7 +1,5 @@
 package Munin::Node::Configure::Debug;
 
-# $Id$
-
 use strict;
 use warnings;
 
diff -pruN 2.0.57-1/node/lib/Munin/Node/Configure/History.pm 2.0.69-1/node/lib/Munin/Node/Configure/History.pm
--- 2.0.57-1/node/lib/Munin/Node/Configure/History.pm	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/node/lib/Munin/Node/Configure/History.pm	2021-11-22 22:12:17.000000000 +0000
@@ -1,7 +1,5 @@
 package Munin::Node::Configure::History;
 
-# $Id$
-
 use strict;
 use warnings;
 
diff -pruN 2.0.57-1/node/lib/Munin/Node/Configure/HostEnumeration.pm 2.0.69-1/node/lib/Munin/Node/Configure/HostEnumeration.pm
--- 2.0.57-1/node/lib/Munin/Node/Configure/HostEnumeration.pm	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/node/lib/Munin/Node/Configure/HostEnumeration.pm	2021-11-22 22:12:17.000000000 +0000
@@ -1,7 +1,5 @@
 package Munin::Node::Configure::HostEnumeration;
 
-# $Id$
-
 use strict;
 use warnings;
 
diff -pruN 2.0.57-1/node/lib/Munin/Node/Configure/PluginList.pm 2.0.69-1/node/lib/Munin/Node/Configure/PluginList.pm
--- 2.0.57-1/node/lib/Munin/Node/Configure/PluginList.pm	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/node/lib/Munin/Node/Configure/PluginList.pm	2021-11-22 22:12:17.000000000 +0000
@@ -1,7 +1,5 @@
 package Munin::Node::Configure::PluginList;
 
-# $Id$
-
 use strict;
 use warnings;
 
diff -pruN 2.0.57-1/node/lib/Munin/Node/Configure/Plugin.pm 2.0.69-1/node/lib/Munin/Node/Configure/Plugin.pm
--- 2.0.57-1/node/lib/Munin/Node/Configure/Plugin.pm	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/node/lib/Munin/Node/Configure/Plugin.pm	2021-11-22 22:12:17.000000000 +0000
@@ -1,7 +1,5 @@
 package Munin::Node::Configure::Plugin;
 
-# $Id$
-
 use strict;
 use warnings;
 
diff -pruN 2.0.57-1/node/lib/Munin/Node/Logger.pm 2.0.69-1/node/lib/Munin/Node/Logger.pm
--- 2.0.57-1/node/lib/Munin/Node/Logger.pm	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/node/lib/Munin/Node/Logger.pm	2021-11-22 22:12:17.000000000 +0000
@@ -1,7 +1,5 @@
 package Munin::Node::Logger;
 
-# $Id$
-
 use warnings;
 use strict;
 
diff -pruN 2.0.57-1/node/lib/Munin/Node/OS.pm 2.0.69-1/node/lib/Munin/Node/OS.pm
--- 2.0.57-1/node/lib/Munin/Node/OS.pm	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/node/lib/Munin/Node/OS.pm	2021-11-22 22:12:17.000000000 +0000
@@ -1,7 +1,5 @@
 package Munin::Node::OS;
 
-# $Id$
-
 use warnings;
 use strict;
 
diff -pruN 2.0.57-1/node/lib/Munin/Node/Server.pm 2.0.69-1/node/lib/Munin/Node/Server.pm
--- 2.0.57-1/node/lib/Munin/Node/Server.pm	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/node/lib/Munin/Node/Server.pm	2021-11-22 22:12:17.000000000 +0000
@@ -1,7 +1,5 @@
 package Munin::Node::Server;
 
-# $Id$
-
 use base qw(Net::Server::Fork);
 
 use strict;
@@ -202,7 +200,7 @@ sub _process_command_line {
         _print_service($session, _run_service($1, 'config'));
     }
     elsif (/^spoolfetch (\d+)/ and $spool) {
-        _net_write($session, $spool->fetch($1));
+        $spool->fetch($1, sub { _net_write($session, shift()); });
         _net_write($session, ".\n");
     }
     elsif (/^starttls\s*$/i) {
diff -pruN 2.0.57-1/node/lib/Munin/Node/Service.pm 2.0.69-1/node/lib/Munin/Node/Service.pm
--- 2.0.57-1/node/lib/Munin/Node/Service.pm	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/node/lib/Munin/Node/Service.pm	2021-11-22 22:12:17.000000000 +0000
@@ -1,7 +1,5 @@
 package Munin::Node::Service;
 
-# $Id$
-
 use warnings;
 use strict;
 
@@ -51,7 +49,7 @@ sub is_a_runnable_service
     return if $file =~ m/^\./;      # Hidden files
     return if $file =~ m/\.conf$/;  # Config files
 
-    return if $file !~ m/^[-\w.:]+$/;  # Skip if any weird chars
+    return if $file !~ m/^[-\w\@.:]+$/;  # Skip if any weird chars
 
     foreach my $regex (@{$config->{ignores}}) {
         return if $file =~ /$regex/;
@@ -192,10 +190,11 @@ sub _resolve_gids
 
     # Support running with more than one group in effect. See documentation on
     # $EFFECTIVE_GROUP_ID in the perlvar(1) manual page.  Need to specify the
-    # default group twice: once for setegid(2), and once for setgroups(2).
-    my $egids = join ' ', ($default_gid) x 2, @groups;
-
-    return ($default_gid, $egids);
+    # primary group twice: once for setegid(2), and once for setgroups(2).
+    if (scalar(@groups) != 0) {
+        return ($groups[0], join ' ', $groups[0], @groups);
+    }
+    return ($default_gid, join ' ', ($default_gid) x 2);
 }
 
 
@@ -245,7 +244,7 @@ sub change_real_and_effective_user_and_g
 
 sub exec_service
 {
-    my ($self, $service, $arg) = @_;
+    my ($self, $service, @args) = @_;
 
     # XXX - Create the statedir for the user
     my $uid = $self->_resolve_uid($service);
@@ -262,7 +261,7 @@ sub exec_service
 
     Munin::Node::OS::set_umask();
 
-    my @command = grep defined, _service_command($self->{servicedir}, $service, $arg);
+    my @command = grep defined, _service_command($self->{servicedir}, $service, @args);
     print STDERR "# About to run '", join (' ', @command), "'\n"
         if $config->{DEBUG};
 
@@ -270,12 +269,12 @@ sub exec_service
 }
 
 
-# Returns the command for the service and (optional) argument, expanding '%c'
+# Returns the command for the service and (optional) arguments, expanding '%c'
 # as the original command (see 'command' directive in
 # <http://munin-monitoring.org/wiki/plugin-conf.d>).
 sub _service_command
 {
-    my ($dir, $service, $argument) = @_;
+    my ($dir, $service, @arguments) = @_;
 
     my @run;
     my $sconf = $config->{sconf};
@@ -283,14 +282,14 @@ sub _service_command
     if ($sconf->{$service}{command}) {
         for my $t (@{ $sconf->{$service}{command} }) {
             if ($t eq '%c') {
-                push @run, ("$dir/$service", $argument);
+                push @run, ("$dir/$service", @arguments);
             } else {
                 push @run, ($t);
             }
         }
     }
     else {
-        @run = ("$dir/$service", $argument);
+        @run = ("$dir/$service", @arguments);
     }
 
     return @run;
@@ -401,7 +400,7 @@ On failure, causes the process to exit.
 
 =item B<exec_service>
 
- $service->exec_service($service, [$argument]);
+ $service->exec_service($service, [@arguments]);
 
 Replaces the current process with an instance of service $service in
 $directory, running with the correct environment and privileges.
diff -pruN 2.0.57-1/node/lib/Munin/Node/Session.pm 2.0.69-1/node/lib/Munin/Node/Session.pm
--- 2.0.57-1/node/lib/Munin/Node/Session.pm	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/node/lib/Munin/Node/Session.pm	2021-11-22 22:12:17.000000000 +0000
@@ -1,7 +1,5 @@
 package Munin::Node::Session;
 
-# $Id$ #
-
 use warnings;
 use strict;
 
diff -pruN 2.0.57-1/node/lib/Munin/Node/SNMPConfig.pm 2.0.69-1/node/lib/Munin/Node/SNMPConfig.pm
--- 2.0.57-1/node/lib/Munin/Node/SNMPConfig.pm	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/node/lib/Munin/Node/SNMPConfig.pm	2021-11-22 22:12:17.000000000 +0000
@@ -1,7 +1,5 @@
 package Munin::Node::SNMPConfig;
 
-# $Id$
-
 use strict;
 use warnings;
 
diff -pruN 2.0.57-1/node/lib/Munin/Node/SpoolReader.pm 2.0.69-1/node/lib/Munin/Node/SpoolReader.pm
--- 2.0.57-1/node/lib/Munin/Node/SpoolReader.pm	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/node/lib/Munin/Node/SpoolReader.pm	2021-11-22 22:12:17.000000000 +0000
@@ -1,7 +1,5 @@
 package Munin::Node::SpoolReader;
 
-# $Id$
-
 use strict;
 use warnings;
 
@@ -73,16 +71,25 @@ sub set_metadata
 
 
 # returns all output for all services since $timestamp.
+# The third argument ($submission_function) is optional: it is used for processing partial results,
+# in order to avoid slurping the full data content into RAM.  The result is empty, if this function
+# is given.
 sub fetch
 {
-    my ($self, $timestamp) = @_;
+    my ($self, $timestamp, $submission_function) = @_;
 
     my $return_str = '';
 
     my @plugins = $self->_get_spooled_plugins();
     logger("timestamp:$timestamp, plugins:@plugins") if $config->{DEBUG};
     foreach my $plugin (@plugins) {
-        $return_str .= $self->_cat_multigraph_file($plugin, $timestamp);
+        my $new_content = $self->_cat_multigraph_file(
+            $plugin, $timestamp, undef, $submission_function);
+        if (defined $submission_function) {
+            $submission_function->($new_content);
+        } else {
+            $return_str .= $new_content;
+        }
     }
 
     return $return_str;
@@ -98,9 +105,12 @@ sub list
 }
 
 
+# The last argument ($submission_function) is optional: it is used for processing partial results,
+# in order to avoid slurping the full data content into RAM.  The result is empty, if this function
+# is given.
 sub _cat_multigraph_file
 {
-    my ($self, $service, $timestamp, $max_samples_per_service) = @_;
+    my ($self, $service, $timestamp, $max_samples_per_service, $submission_function) = @_;
 
     # Default $max_samples_per_service is 5, in order to have a 5x time
     # increase in catchup.  This enables to not overwhelm the munin-update when
@@ -114,9 +124,17 @@ sub _cat_multigraph_file
         or die "Unable to reset the spool directory handle: $!";
 
     my $nb_samples_sent = 0;
-    foreach my $file (readdir $self->{spooldirhandle}) {
-        next unless $file =~ m/^munin-daemon\.$service\.(\d+)\.(\d+)$/;
-        next unless $1+$2 >= $timestamp;
+    foreach my $file (sort readdir $self->{spooldirhandle}) {
+        # squash the $service name with the same rules as the munin-update when using plain TCP
+        # Closes D:710529
+        my $service_clean = $service;
+        $service_clean =~ s/[^_A-Za-z0-9]/_/g;
+
+        next unless $file =~ m/^munin-daemon\.$service_clean\.(\d+)\.(\d+)$/;
+        my $interval_start = $1;
+        my $interval_size = $2;
+        # skip the file if its newest value is older than the minimum wanted timestamp
+        next if $interval_start + $interval_size < $timestamp;
 
         open my $fh, '<', "$self->{spooldir}/$file"
             or die "Unable to open spool file: $!";
@@ -157,7 +175,11 @@ sub _cat_multigraph_file
                 $_ = "$1.value $epoch:$2";
             }
 
-            $data .= $_ . "\n";
+            if (defined $submission_function) {
+                $submission_function->($_ . "\n");
+            } else {
+                $data .= $_ . "\n";
+            }
         }
 
 	# We just emitted something
diff -pruN 2.0.57-1/node/lib/Munin/Node/SpoolWriter.pm 2.0.69-1/node/lib/Munin/Node/SpoolWriter.pm
--- 2.0.57-1/node/lib/Munin/Node/SpoolWriter.pm	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/node/lib/Munin/Node/SpoolWriter.pm	2021-11-22 22:12:17.000000000 +0000
@@ -1,7 +1,5 @@
 package Munin::Node::SpoolWriter;
 
-# $Id$
-
 use strict;
 use warnings;
 
diff -pruN 2.0.57-1/node/lib/Munin/Node/Utils.pm 2.0.69-1/node/lib/Munin/Node/Utils.pm
--- 2.0.57-1/node/lib/Munin/Node/Utils.pm	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/node/lib/Munin/Node/Utils.pm	2021-11-22 22:12:17.000000000 +0000
@@ -1,7 +1,5 @@
 package Munin::Node::Utils;
 
-# $Id$
-
 use strict;
 use warnings;
 
diff -pruN 2.0.57-1/node/NodeBuilder.pm 2.0.69-1/node/NodeBuilder.pm
--- 2.0.57-1/node/NodeBuilder.pm	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/node/NodeBuilder.pm	2021-11-22 22:12:17.000000000 +0000
@@ -1,7 +1,5 @@
 package NodeBuilder;
 
-# $Id$
-
 use base qw(Module::Build);
 
 use warnings;
diff -pruN 2.0.57-1/node/sbin/munin-node 2.0.69-1/node/sbin/munin-node
--- 2.0.57-1/node/sbin/munin-node	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/node/sbin/munin-node	2021-11-22 22:12:17.000000000 +0000
@@ -18,8 +18,6 @@
 # along with this program; if not, write to the Free Software
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 #
-# $Id$
-#
 
 use strict;
 use warnings;
@@ -210,16 +208,10 @@ may enable debugging. [--nopidebug]
 
 This is munin-node v@@VERSION@@
 
-$Id$
-
 =head1 AUTHORS
 
 Audun Ytterdal, Jimmy Olsen, and Tore Anderson.
 
-=head1 BUGS
-
-Please see L<http://munin-monitoring.org/report/1>.
-
 =head1 COPYRIGHT
 
 Copyright (C) 2002-2006 Audun Ytterdal, Jimmy Olsen, and Tore Anderson / Linpro AS.
diff -pruN 2.0.57-1/node/sbin/munin-node-configure 2.0.69-1/node/sbin/munin-node-configure
--- 2.0.57-1/node/sbin/munin-node-configure	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/node/sbin/munin-node-configure	2021-11-22 22:12:17.000000000 +0000
@@ -501,10 +501,6 @@ Override plugin configuration directory
 
 Override plugin library [@@LIBDIR@@/plugins/]
 
-=item B<< --exitnoterror >>
-
-Do not consider plugins that exit non-zero exit-value as error.
-
 =item B<< --suggest >>
 
 Suggest plugins that might be added or removed, instead of those that are
@@ -659,16 +655,10 @@ not this works with any particular devic
 
 This is munin-node-configure (munin-node) v@@VERSION@@.
 
-$Id$
-
 =head1 AUTHORS
 
 Jimmy Olsen, Nicolai Langfeldt, Matthew Boyle
 
-=head1 BUGS
-
-Please see L<http://munin-monitoring.org/report/1>.
-
 =head1 COPYRIGHT
 
 Copyright (C) 2003-2006 Jimmy Olsen, Nicolai Langfeldt.
diff -pruN 2.0.57-1/node/sbin/munin-run 2.0.69-1/node/sbin/munin-run
--- 2.0.57-1/node/sbin/munin-run	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/node/sbin/munin-run	2021-11-22 22:12:17.000000000 +0000
@@ -123,7 +123,7 @@ sub main
     $0 = $1;
 
     my @original_argv = @ARGV;
-    my ($plugin, $arg) = parse_args();
+    my ($plugin, @args) = parse_args();
 
     # Loads the settings from munin-node.conf.
     # Ensures that, where options can be set both in the config and in
@@ -135,12 +135,15 @@ sub main
 
     # Run directly or execute recursively via "systemd-run".
     if (($ignore_systemd_properties) || (! -d "/run/systemd/system")) {
-        return execute_plugin($plugin, $arg);
+        return execute_plugin($plugin, @args);
+    } elsif (!check_systemd_run_permissions()) {
+        print STDERR "# Skipping systemd properties simulation due to lack of permissions.\n" if $config->{DEBUG};
+        return execute_plugin($plugin, @args);
     } else {
         my $systemd_version = get_systemd_version();
         if ((not defined $systemd_version) or ($systemd_version < $REQUIRED_SYSTEMD_VERSION)) {
             print STDERR "# Skipping systemd properties simulation due to required systemd version ($REQUIRED_SYSTEMD_VERSION)\n" if $config->{DEBUG};
-            return execute_plugin($plugin, $arg);
+            return execute_plugin($plugin, @args);
         } else {
             my @munin_node_hardening_flags;
             my $parse_flags_success = 0;
@@ -155,13 +158,19 @@ sub main
                 # Failed to retrieve systemd properties of munin-node service.
                 # Probable causes: systemd is not installed/enabled or the
                 # service unit does not exist.
-                return execute_plugin($plugin, $arg);
+                return execute_plugin($plugin, @args);
             }
         }
     }
 }
 
 
+sub check_systemd_run_permissions {
+    # verify whether systemd-run can be exected (e.g. unprivileged users cannot execute it)
+    return system("systemd-run --collect --pipe --quiet --wait -- true </dev/null >/dev/null 2>&1") == 0;
+}
+
+
 # Retrieve the locally configured hardening flags for the "munin-node" systemd
 # service.
 # The result of the function is a list of strings like the following:
@@ -298,7 +307,7 @@ sub run_via_systemd {
 
 
 sub execute_plugin {
-    my ($plugin, $arg) = @_;
+    my ($plugin, @args) = @_;
 
     $services = Munin::Node::Service->new(
         servicedir => $servicedir,
@@ -321,7 +330,7 @@ sub execute_plugin {
 
     # no need for a timeout -- the user can kill this process any
     # time they want.
-    $services->exec_service($plugin, $arg);
+    $services->exec_service($plugin, @args);
 
     # Never reached, but just in case...
     print STDERR "# FATAL: Failed to exec.\n";
@@ -335,7 +344,7 @@ sub parse_args
     my $sconfdir   = "$Munin::Common::Defaults::MUNIN_CONFDIR/plugin-conf.d";
     my $sconffile;
 
-    my ($plugin, $arg);
+    my ($plugin, $arg, @extra_args);
 
     print_usage_and_exit() unless GetOptions(
             "config=s"     => \$conffile,
@@ -358,6 +367,8 @@ sub parse_args
         ($arg) = ($ARGV[1] =~ m/^(\w+)$/)
             or die "# ERROR: Invalid characters in argument '$ARGV[1]'.\n";
     }
+    # all remaining arguments are handed over to the plugin without further checks
+    @extra_args = map {m/^(.*)$/} @ARGV[2..$#ARGV];
 
     # Detaint service directory.  FIXME: do more strict detainting?
     if ($servicedir) {
@@ -376,7 +387,7 @@ sub parse_args
         paranoia   => $paranoia,
     });
 
-    return ($plugin, $arg);
+    return ($plugin, $arg, @extra_args);
 }
 
 
@@ -511,10 +522,6 @@ This is munin-run (munin-node) v@@VERSIO
 Audun Ytterdal, Jimmy Olsen, Tore Anderson, Nicolai Langfeldt,
 Lars Kruse.
 
-=head1 BUGS
-
-Please see L<http://munin-monitoring.org/report/1>.
-
 =head1 COPYRIGHT
 
 Copyright (C) 2002-2009 Audun Ytterdal, Jimmy Olsen, Tore Anderson,
diff -pruN 2.0.57-1/node/t/munin_node_service.t 2.0.69-1/node/t/munin_node_service.t
--- 2.0.57-1/node/t/munin_node_service.t	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/node/t/munin_node_service.t	2021-11-22 22:12:17.000000000 +0000
@@ -55,8 +55,8 @@ $config->reinitialize({
         opt_bad_gname => { group => [ '(%%SSKKÂ¤Â¤)'  ] },
         opt_bad_gid   => { group => [ '(999999999)' ] },
 
-        several_groups => { group => [ 0, "($gname)" ] },
-        several_groups_required => { group => [ 0, $gname ] },
+        several_groups => { group => [ 0, "($gname)" ,0 ] },
+        several_groups_required => { group => [ 0, $gname, 0 ] },
         several_groups_mixture => { group => [ '(%%SSKKÂ¤Â¤)', 0 ] },
     },
     ignores => [
@@ -187,8 +187,8 @@ $ENV{MUNIN_MASTER_IP} = '';
 
     eq_or_diff([ $services->_resolve_gids('no_groups')   ], [ $gid, "$gid $gid" ], 'default group by gid');
 
-    eq_or_diff([ $services->_resolve_gids('gid')   ], [ $gid, "$gid $gid 0" ], 'extra group by gid');
-    eq_or_diff([ $services->_resolve_gids('gname') ], [ $gid, "$gid $gid 0" ], 'extra group by name');
+    eq_or_diff([ $services->_resolve_gids('gid')   ], [ 0, "0 0" ], 'different group by gid');
+    eq_or_diff([ $services->_resolve_gids('gname') ], [ 0, "0 0" ], 'different group by name');
 
     eval { $services->_resolve_gids('bad_gid') };
     like($@, qr/'999999999'/, 'Exception thrown if an additional group could not be resolved');
@@ -196,25 +196,25 @@ $ENV{MUNIN_MASTER_IP} = '';
     eval { $services->_resolve_gids('bad_gname') };
     like($@, qr/'%%SSKKÂ¤Â¤'/, 'Exception thrown if an additional group could not be resolved');
 
-    eq_or_diff([ $services->_resolve_gids('opt_gname')     ], [ $gid, "$gid $gid 0" ], 'extra optional group by name');
-    eq_or_diff([ $services->_resolve_gids('opt_bad_gname') ], [ $gid, "$gid $gid" ],   'unresolvable extra groups are ignored');
+    eq_or_diff([ $services->_resolve_gids('opt_gname')     ], [ 0, "0 0" ], 'optional group by name');
+    eq_or_diff([ $services->_resolve_gids('opt_bad_gname') ], [ $gid, "$gid $gid" ],   'unresolvable groups are ignored');
 
-    eq_or_diff([ $services->_resolve_gids('opt_gid')         ], [ $gid, "$gid $gid 0" ], 'extra optional group by gid');
-    eq_or_diff([ $services->_resolve_gids('opt_bad_gid') ], [ $gid, "$gid $gid" ],   'unresolvable extra gids are ignored');
+    eq_or_diff([ $services->_resolve_gids('opt_gid')         ], [ 0, "0 0" ], 'optional group by gid');
+    eq_or_diff([ $services->_resolve_gids('opt_bad_gid') ], [ $gid, "$gid $gid" ],   'unresolvable gids are ignored');
 
     eq_or_diff(
         [$services->_resolve_gids('several_groups') ],
-        [$gid, "$gid $gid 0 $gid"],
+        [0, "0 0 $gid 0"],
         'several extra groups'
     );
     eq_or_diff(
         [$services->_resolve_gids('several_groups_required')],
-        [$gid, "$gid $gid 0 $gid"],
+        [0, "0 0 $gid 0"],
         'several groups, less whitespace'
     );
     eq_or_diff(
         [$services->_resolve_gids('several_groups_mixture')],
-        [$gid, "$gid $gid 0"],
+        [0, "0 0"],
         'resolvable and unresolvable extra groups'
     );
 
diff -pruN 2.0.57-1/plugins/lib/Munin/Plugin/Pgsql.pm 2.0.69-1/plugins/lib/Munin/Plugin/Pgsql.pm
--- 2.0.57-1/plugins/lib/Munin/Plugin/Pgsql.pm	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/plugins/lib/Munin/Plugin/Pgsql.pm	2021-11-22 22:12:17.000000000 +0000
@@ -21,8 +21,6 @@
 # perlpod.
 
 
-# $Id$
-
 =head1 NAME
 
 Munin::Plugin::Pgsql - Base module for PostgreSQL plugins for Munin
@@ -50,6 +48,11 @@ The plugins will by default connect to t
 wildcard per-database plugins. This can be overridden using the PGDATABASE
 variable, but this is usually a bad idea.
 
+If you are using plugin for several postgres instances, you can customize
+graph title with the environment variable PGLABEL.
+
+Warning and critical can be customized by setting "warning" and "critical" env variables per plugin.
+
 =head2 Example
 
  [postgres_*]
@@ -57,6 +60,10 @@ variable, but this is usually a bad idea
     env.PGUSER postgres
     env.PGPORT 5433
 
+  [postgres_connections_ALL]
+    env.warning :450
+    env.critical :500
+
 =head1 WILDCARD MATCHING
 
 Wildcard plugins based on this module will match on whatever type of object
@@ -146,6 +153,8 @@ use Munin::Plugin;
                 if the plugin should be run on this machine. Must return a single
                 row, two columns columns. The first one is a boolean field
                 representing yes or no, the second one a reason for "no".
+ warning        The warning low and/or high thresholds.
+ critical       The critical low and/or high thresholds.
  graphdraw      The draw parameter for the graph. The default is LINE1.
  graphtype      The type parameter for the graph. The default is GAUGE.
  graphperiod    The period for the graph. Copied directly to the config output.
@@ -214,6 +223,8 @@ sub new {
         title          => $args{title},
         info           => $args{info},
         vlabel         => $args{vlabel},
+        warning        => defined($ENV{'warning'}) ? $ENV{'warning'} : $args{warning},
+        critical       => defined($ENV{'critical'}) ? $ENV{'critical'} : $args{critical},
         graphdraw      => $args{graphdraw},
         graphtype      => $args{graphtype},
         graphperiod    => $args{graphperiod},
@@ -286,6 +297,8 @@ sub Config {
         }
         print "$l.min $self->{graphmin}\n" if (defined $self->{graphmin});
         print "$l.max $self->{graphmax}\n" if (defined $self->{graphmax});
+        print "$l.warning $self->{warning}\n" if (defined $self->{warning});
+        print "$l.critical $self->{critical}\n" if (defined $self->{critical});
         $firstrow = 0;
     }
 }
diff -pruN 2.0.57-1/plugins/lib/Munin/Plugin/SNMP.pm 2.0.69-1/plugins/lib/Munin/Plugin/SNMP.pm
--- 2.0.57-1/plugins/lib/Munin/Plugin/SNMP.pm	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/plugins/lib/Munin/Plugin/SNMP.pm	2021-11-22 22:12:17.000000000 +0000
@@ -1,7 +1,7 @@
 # -*- cperl -*-
 # vim: ts=4 : sw=4 : et
 #
-# Copyright (C) 2004-2009 Dagfinn Ilmari Mannsaaker, Nicolai Langfeldt,
+# Copyright (C) 2004-2009 Dagfinn Ilmari MannsÃ¥ker, Nicolai Langfeldt,
 # Linpro AS
 #
 # This program is free software; you can redistribute it and/or
@@ -25,8 +25,6 @@
 # pattern.  Please maintain it in the same way.
 
 
-# $Id$
-
 =encoding utf-8
 
 =head1 NAME
diff -pruN 2.0.57-1/plugins/lib/Munin/Plugin.pm 2.0.69-1/plugins/lib/Munin/Plugin.pm
--- 2.0.57-1/plugins/lib/Munin/Plugin.pm	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/plugins/lib/Munin/Plugin.pm	2021-11-22 22:12:17.000000000 +0000
@@ -16,8 +16,6 @@
 # along with this program; if not, write to the Free Software
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
 #
-# $Id$
-#
 
 package Munin::Plugin;
 
diff -pruN 2.0.57-1/plugins/node.d/apache_accesses.in 2.0.69-1/plugins/node.d/apache_accesses.in
--- 2.0.57-1/plugins/node.d/apache_accesses.in	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/plugins/node.d/apache_accesses.in	2021-11-22 22:12:17.000000000 +0000
@@ -69,10 +69,6 @@ globally on the Apache server.
   #%# family=auto
   #%# capabilities=autoconf
 
-=head1 VERSION
-
-  $Id$
-
 =head1 BUGS
 
 Does not support digest authentication.
@@ -104,6 +100,14 @@ if (! eval "require LWP::UserAgent;")
 my $URL = exists $ENV{'url'} ? $ENV{'url'} : "http://127.0.0.1:%d/server-status?auto";
 my @PORTS = exists $ENV{'ports'} ? split(' ', $ENV{'ports'}) : (80);
 
+
+# Convert an URL with the %d placeholder into a string. Allow URL without placeholder.
+sub get_url_with_port {
+    my ($url, $port) = @_;
+    return ($url =~ /%d/) ? sprintf($url, $port) : $url;
+}
+
+
 if ( defined $ARGV[0] and $ARGV[0] eq "autoconf" )
 {
 	if ($ret)
@@ -116,7 +120,7 @@ if ( defined $ARGV[0] and $ARGV[0] eq "a
 			agent => sprintf("munin/%s (libwww-perl/%s)", $Munin::Common::Defaults::MUNIN_VERSION, $LWP::VERSION));
 
 	foreach my $port (@PORTS) {
-		my $url = sprintf $URL, $port;
+		my $url = get_url_with_port($URL, $port);
 		my $response = $ua->request(HTTP::Request->new('GET',$url));
                 if ($response->is_success) {
                         if ($response->content =~ /^Total Accesses:/im ){
@@ -163,7 +167,7 @@ my $ua = LWP::UserAgent->new(timeout =>
 		agent => sprintf("munin/%s (libwww-perl/%s)", $Munin::Common::Defaults::MUNIN_VERSION, $LWP::VERSION));
 
 foreach my $port (@PORTS) {
-	my $url = sprintf $URL, $port;
+	my $url = get_url_with_port($URL, $port);
 	my $response = $ua->request(HTTP::Request->new('GET',$url));
 	if ($response->content =~ /^Total Accesses:\s+(.+)$/im) {
 		print "accesses$port.value $1\n";
diff -pruN 2.0.57-1/plugins/node.d/apache_processes.in 2.0.69-1/plugins/node.d/apache_processes.in
--- 2.0.57-1/plugins/node.d/apache_processes.in	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/plugins/node.d/apache_processes.in	2021-11-22 22:12:17.000000000 +0000
@@ -81,10 +81,6 @@ memory.
 
 Does not support digest authentication.
 
-=head1 VERSION
-
-  $Id$
-
 =head1 AUTHOR
 
 Unknown
@@ -112,6 +108,14 @@ my $URL = exists $ENV{'url'} ? $ENV{'url
 my @PORTS = exists $ENV{'ports'} ? split(' ', $ENV{'ports'}) : (80);
 my $SHOWFREE = !exists $ENV{'showfree'} || $ENV{'showfree'};
 
+
+# Convert an URL with the %d placeholder into a string. Allow URL without placeholder.
+sub get_url_with_port {
+    my ($url, $port) = @_;
+    return ($url =~ /%d/) ? sprintf($url, $port) : $url;
+}
+
+
 if ( defined $ARGV[0] and $ARGV[0] eq "autoconf" )
 {
 	if ($ret)
@@ -123,7 +127,7 @@ if ( defined $ARGV[0] and $ARGV[0] eq "a
 			agent => sprintf("munin/%s (libwww-perl/%s)", $Munin::Common::Defaults::MUNIN_VERSION, $LWP::VERSION));
 
         foreach my $port (@PORTS) {
-                my $url = sprintf $URL, $port;
+                my $url = get_url_with_port($URL, $port);
                 my $response = $ua->request(HTTP::Request->new('GET',$url));
                 if ($response->is_success) {
                         if ($response->content =~ /^Total Accesses:/im ){
@@ -191,7 +195,7 @@ foreach my $port (@PORTS)
 {
     my $ua = LWP::UserAgent->new(timeout => 30,
 			agent => sprintf("munin/%s (libwww-perl/%s)", $Munin::Common::Defaults::MUNIN_VERSION, $LWP::VERSION));
-    my $url = sprintf $URL, $port;
+    my $url = get_url_with_port($URL, $port);
     my $response = $ua->request(HTTP::Request->new('GET',$url));
     if ($response->content =~ /^Busy(?:Servers|Workers):\s+(.+)$/im) {
 	    print "busy$port.value $1\n";
diff -pruN 2.0.57-1/plugins/node.d/apache_volume.in 2.0.69-1/plugins/node.d/apache_volume.in
--- 2.0.57-1/plugins/node.d/apache_volume.in	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/plugins/node.d/apache_volume.in	2021-11-22 22:12:17.000000000 +0000
@@ -70,10 +70,6 @@ some kind of bandwidth limit on your out
   #%# family=auto
   #%# capabilities=autoconf
 
-=head1 VERSION
-
-  $Id$
-
 =head1 BUGS
 
 Does not support digest authentication.
@@ -104,6 +100,14 @@ if (! eval "require LWP::UserAgent;")
 my $URL = exists $ENV{'url'} ? $ENV{'url'} : "http://127.0.0.1:%d/server-status?auto";
 my @PORTS = exists $ENV{'ports'} ? split(' ', $ENV{'ports'}) : (80);
 
+
+# Convert an URL with the %d placeholder into a string. Allow URL without placeholder.
+sub get_url_with_port {
+    my ($url, $port) = @_;
+    return ($url =~ /%d/) ? sprintf($url, $port) : $url;
+}
+
+
 if ( defined $ARGV[0] and $ARGV[0] eq "autoconf" )
 {
 	if ($ret)
@@ -116,7 +120,7 @@ if ( defined $ARGV[0] and $ARGV[0] eq "a
 			agent => sprintf("munin/%s (libwww-perl/%s)", $Munin::Common::Defaults::MUNIN_VERSION, $LWP::VERSION));
 
 	foreach my $port (@PORTS) {
-		my $url = sprintf $URL, $port;
+		my $url = get_url_with_port($URL, $port);
 		my $response = $ua->request(HTTP::Request->new('GET',$url));
                 if ($response->is_success) {
                         if ($response->content =~ /^Total Accesses:/im ){
@@ -162,7 +166,7 @@ my $ua = LWP::UserAgent->new(timeout =>
 		agent => sprintf("munin/%s (libwww-perl/%s)", $Munin::Common::Defaults::MUNIN_VERSION, $LWP::VERSION));
 
 foreach my $port (@PORTS) {
-	my $url = sprintf $URL, $port;
+	my $url = get_url_with_port($URL, $port);
 	my $response = $ua->request(HTTP::Request->new('GET',$url));
 	if ($response->content =~ /^Total kBytes:\s+(.+)$/im) {
 		print "volume$port.value ", int($1*1024), "\n";
diff -pruN 2.0.57-1/plugins/node.d/apc_envunit_.in 2.0.69-1/plugins/node.d/apc_envunit_.in
--- 2.0.57-1/plugins/node.d/apc_envunit_.in	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/plugins/node.d/apc_envunit_.in	2021-11-22 22:12:17.000000000 +0000
@@ -66,7 +66,7 @@ fi
 
 UNITS=${units:-}
 COMMUNITY=${community:-public}
-SNMPGET=$(which snmpget 2>/dev/null)
+SNMPGET=$(command -v snmpget)
 
 if [ -n "${oid:-}" ]; then TOID=$oid ; fi
 
diff -pruN 2.0.57-1/plugins/node.d/asterisk_channels.in 2.0.69-1/plugins/node.d/asterisk_channels.in
--- 2.0.57-1/plugins/node.d/asterisk_channels.in	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/plugins/node.d/asterisk_channels.in	1970-01-01 00:00:00.000000000 +0000
@@ -1,120 +0,0 @@
-#!@@PERL@@ -w
-# -*- perl -*-
-
-=head1 NAME
-
-asterix_channels - Plugin to monitor number of active channels
-
-=head1 CONFIGURATION
-
-The following configuration parameters are used by this plugin
-
- [asterisk_channels]
-  env.host     - hostname to connect to
-  env.port     - port number to connect to
-  env.username - username used for authentication
-  env.secret   - secret used for authentication
-
-The "username" and "secret" parameters are mandatory, and have no
-defaults.
-
-=head2 DEFAULT CONFIGURATION
-
- [asterisk_channels]
-  env.host 127.0.0.1
-  env.port 5038
-
-=head1 AUTHOR
-
-Copyright (C) 2005 Rodolphe Quiedeville <rodolphe@quiedeville.org>
-
-=head1 LICENSE
-
-Gnu GPLv2
-
-=begin comment
-
-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; version 2 dated June, 1991.
-
-This program is distributed in the hope that it will be useful, but
-WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 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, write to the Free Software Foundation, Inc.,
-51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-
-If you improve this script please send your version to my email
-address with the copyright notice upgrade with your name.
-
-=end comment
-
-=head1 MAGIC MARKERS
-
- #%# family=contrib
-
-=cut
-
-use IO::Socket;
-use strict;
-
-if ($ARGV[0] and $ARGV[0] eq "config")
-{
-    print "graph_title Asterisk active channels\n";
-    print "graph_args --base 1000 -l 0\n";
-    print "graph_vlabel channels\n";
-    print "graph_category asterisk\n";
-    print "channels.draw AREA\n";
-    print "channels.label channels\n";
-    exit 0;
-}
-
-my $host = exists $ENV{'host'} ? $ENV{'host'} : "127.0.0.1";
-my $port = exists $ENV{'port'} ? $ENV{'port'} : "5038";
-
-my $username = $ENV{'username'};
-my $secret   = $ENV{'secret'};
-
-my $pop = new IO::Socket::INET (PeerAddr => $host,
-				PeerPort => $port,
-				Proto => 'tcp');
-die "Could not create socket: $!\n" unless $pop;
-
-## Read connection message.
-my $line = $pop->getline;
-die $line unless $line =~ /^Asterisk/;
-
-## Send user name.
-$pop->print("Action: login\n");
-$pop->print("Username: $username\n");
-$pop->print("Secret: $secret\n");
-$pop->print("Events: off\n");
-$pop->print("\n");
-
-#Response: Success
-#Message: Authentication accepted
-
-## Request status of messages.
-$pop->print("Action: command\n");
-$pop->print("Command: core show channels\n");
-$pop->print("\n");
-my $result;
-while (($line = $pop->getline) and ($line !~ /END COMMAND/o))
-{
-    #print $line;
-    $result = $line if $line =~ /active channel/;
-}
-
-my $nb = (split ' ',$result)[0];
-$pop->print("Action: logoff\n");
-$pop->print("\n");
-
-## Exhaust buffer before closing (to avoid polluting Asterisk's logs)
-while ($line = $pop->getline) {}
-
-print "channels.value $nb\n";
-
-# vim:syntax=perl
diff -pruN 2.0.57-1/plugins/node.d/asterisk_channelstypes.in 2.0.69-1/plugins/node.d/asterisk_channelstypes.in
--- 2.0.57-1/plugins/node.d/asterisk_channelstypes.in	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/plugins/node.d/asterisk_channelstypes.in	1970-01-01 00:00:00.000000000 +0000
@@ -1,165 +0,0 @@
-#!@@PERL@@ -w
-# -*- perl -*-
-
-=head1 NAME
-
-asterisk_channelstypes - Plugin to graph the number of channel types
-in use
-
-=head1 ABOUT
-
-This plugin uses the asterisk manager API to fetch data.
-
-=head1 CONFIGURATION
-
-The following configuration parameters are used by this plugin
-
- [asterisk_channelstypes]
-  env.host     - hostname to connect to
-  env.port     - port number to connect to
-  env.username - username used for authentication
-  env.secret   - secret used for authentication
-  env.channels - The channel types to look for
-
-The "username" and "secret" parameters are mandatory, and have no
-defaults.
-
-=head2 DEFAULT CONFIGURATION
-
- [asterisk_channelstypes]
-  env.host 127.0.0.1
-  env.port 5038
-  env.channels Zap IAX2 SIP
-
-=head1 AUTHOR
-
-Copyright (C) 2005-2006 Rodolphe Quiedeville <rodolphe@quiedeville.org>
-
-=head1 LICENSE
-
-Gnu GPLv2
-
-=begin comment
-
-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; version 2 dated June,
-1991.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-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, write to the Free Software Foundation, Inc.,
-51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-
-If you improve this script please send your version to my email address
-with the copyright notice upgrade with your name.
-
-=end comment
-
-=head1 MAGIC MARKERS
-
- #%# family=contrib
-
-=cut
-
-use IO::Socket;
-use strict;
-
-my @CHANNELS = exists $ENV{'channels'} ? split ' ',$ENV{'channels'} : qw(Zap IAX2 SIP);
-
-if ($ARGV[0] and $ARGV[0] eq "config")
-{
-    print "graph_title Asterisk channels\n";
-    print "graph_args --base 1000 -l 0\n";
-    print "graph_vlabel channels\n";
-    print "graph_category asterisk\n";
-    foreach my $channel (@CHANNELS) {
-	if ($channel eq $CHANNELS[0]) {
-	    print "$channel.draw AREA\n";
-	}
-	else{
-	    print "$channel.draw STACK\n";
-	}
-	print "$channel.label $channel\n";
-    }
-    exit 0;
-}
-
-my $host = exists $ENV{'host'} ? $ENV{'host'} : "127.0.0.1";
-my $port = exists $ENV{'port'} ? $ENV{'port'} : "5038";
-
-my $username = $ENV{'username'};
-my $secret   = $ENV{'secret'};
-
-my $pop = new IO::Socket::INET (PeerAddr => $host,
-				PeerPort => $port,
-				Proto => 'tcp');
-die "Could not create socket: $!\n" unless $pop;
-
-## Read connection message.
-my $line = $pop->getline;
-die $line unless $line =~ /^Asterisk/;
-
-## Send user name.
-$pop->print("Action: login\n");
-$pop->print("Username: $username\n");
-$pop->print("Secret: $secret\n");
-$pop->print("Events: off\n");
-$pop->print("\n");
-
-#Response: Success
-#Message: Authentication accepted
-
-## Request status of messages.
-$pop->print("Action: command\n");
-$pop->print("Command: core show channels\n");
-$pop->print("\n");
-
-#Response: Follows
-#Channel              Location             State   Application(Data)
-#Zap/pseudo-198641660 s@frompstn:1         Rsrvd   (None)
-#Zap/1-1              4@frompstn:1         Up      MeetMe(5500)
-#2 active channels
-#1 active call
-#--END COMMAND--
-
-my @results;
-my ($i, $start)=(0,0);
-foreach my $channel (@CHANNELS) {
-    $results[$i] = 0;
-    $i++;
-}
-
-my @fields;
-while (($line = $pop->getline) and ($line !~ /active channels/o))
-{
-    $i = 0;
-    if ($start) {
-	@fields = (split '/', $line);
-	foreach my $channel (@CHANNELS) {
-	    $results[$i] = $results[$i] + 1 if ($fields[0] eq $channel);
-	    $i++;
-	}
-    }
-    $start = 1 if ($line =~ /Channel/o);
-}
-
-
-# Logoff
-$pop->print("Action: logoff\n");
-$pop->print("\n");
-
-## Exhaust buffer before closing (to avoid polluting Asterisk's logs)
-while ($line = $pop->getline) {}
-
-$i = 0;
-foreach my $channel (@CHANNELS) {
-    print "$channel.value $results[$i]\n";
-    $i++;
-}
-
-# vim:syntax=perl
diff -pruN 2.0.57-1/plugins/node.d/asterisk_codecs.in 2.0.69-1/plugins/node.d/asterisk_codecs.in
--- 2.0.57-1/plugins/node.d/asterisk_codecs.in	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/plugins/node.d/asterisk_codecs.in	1970-01-01 00:00:00.000000000 +0000
@@ -1,226 +0,0 @@
-#!@@PERL@@ -w
-# -*- perl -*-
-
-=head1 NAME
-
-asterisk_codecs - Plugin to monitor number of active channels by codec
-used
-
-=head1 ABOUT
-
-This plugin uses the asterisk manager API to fetch data.
-
-=head1 CONFIGURATION
-
-The following configuration parameters are used by this plugin
-
- [asterisk_codecs]
-  env.host     - hostname to connect to
-  env.port     - port number to connect to
-  env.username - username used for authentication
-  env.secret   - secret used for authentication
-  env.codecs   - List of codecs (names)
-  env.codecsx  - List of codecs (hexadecimal values)
-
-The values of codecs and codecx must match each other.  Asterisk
-returns a hexadecimal value representing the codec used, and the same
-list entry is used from "codecs" and "codecsx".
-
-The "username" and "secret" parameters are mandatory, and have no
-defaults.
-
-=head2 DEFAULT CONFIGURATION
-
- [asterisk_codecs]
-  env.host 127.0.0.1
-  env.port 5038
-  env.codecs gsm ulaw alaw
-  env.codecsx 0x2 0x4 0x8
-
-=head1 AUTHOR
-
-Copyright (C) 2005-2006 Rodolphe Quiedeville <rodolphe@quiedeville.org>
-
-=head1 LICENSE
-
-Gnu GPLv2
-
-=begin comment
-
-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; version 2 dated June, 1991.
-
-This program is distributed in the hope that it will be useful, but
-WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 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, write to the Free Software Foundation, Inc.,
-51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-
-If you improve this script please send your version to my email
-address with the copyright notice upgrade with your name.
-
-=end comment
-
-=head1 MAGIC MARKERS
-
- #%# family=contrib
-
-=cut
-
-use IO::Socket;
-use strict;
-
-my @CODECS = exists $ENV{'codecs'} ? split ' ',$ENV{'codecs'} : qw(gsm ulaw alaw);
-my @CODECSX = exists $ENV{'codecsx'} ? split ' ',$ENV{'codecsx'} : qw(0x2 0x4 0x8);
-
-if ($ARGV[0] and $ARGV[0] eq "config")
-{
-    print "graph_title Asterisk channels/codecs\n";
-    print "graph_args --base 1000 -l 0\n";
-    print "graph_vlabel channels\n";
-    print "graph_category asterisk\n";
-    foreach my $codec (@CODECS) {
-	if ($codec eq $CODECS[0]) {
-	    print "$codec.draw AREA\n";
-	}
-	else{
-	    print "$codec.draw STACK\n";
-	}
-	print "$codec.label $codec\n";
-    }
-    print "other.draw STACK\n";
-    print "other.label other\n";
-    print "unknown.draw STACK\n";
-    print "unknown.label not set\n";
-    exit 0;
-}
-
-my $host = exists $ENV{'host'} ? $ENV{'host'} : "127.0.0.1";
-my $port = exists $ENV{'port'} ? $ENV{'port'} : "5038";
-
-my $username = $ENV{'username'};
-my $secret   = $ENV{'secret'};
-
-my $pop = new IO::Socket::INET (PeerAddr => $host,
-				PeerPort => $port,
-				Proto => 'tcp');
-die "Could not create socket: $!\n" unless $pop;
-
-## Read connection message.
-my $line = $pop->getline;
-die $line unless $line =~ /^Asterisk/;
-
-## Send user name.
-$pop->print("Action: login\n");
-$pop->print("Username: $username\n");
-$pop->print("Secret: $secret\n");
-$pop->print("Events: off\n");
-$pop->print("\n");
-
-#Response: Success
-#Message: Authentication accepted
-
-## Request status of messages.
-$pop->print("Action: command\n");
-$pop->print("Command: sip show channels\n");
-$pop->print("\n");
-
-#Response: Follows
-#Peer             User/ANR    Call ID      Seq (Tx/Rx)   Format
-#192.168.1.135    yann        6902112b3e0  00101/00002   g729
-#1 active SIP channel(s)
-#--END COMMAND--
-
-my @results;
-my ($i, $start, $unknown, $other)=(0,0,0,0);
-foreach my $codec (@CODECS) {
-    $results[$i] = 0;
-    $i++;
-}
-
-my @fields;
-while (($line = $pop->getline) and ($line !~ /active SIP channel/o))
-{
-    #print STDERR "SIP: $line\n";
-    $i = 0;
-    my $found = 0;
-    if ($start) {
-	@fields = (split ' ', $line);
-        if ($fields[4] eq '0x0') {
-            $unknown += 1;
-            next;
-        }
-	foreach my $codec (@CODECSX) {
-	    if ($fields[4] eq "$codec") {
-		$results[$i] = $results[$i] + 1;
-		$found = 1;
-		last;
-	    }
-	    $i++;
-	}
-	if (! $found) {
-            $other += 1;
-	    print STDERR "CODEC: SIP other format $fields[4]\n";
-	}
-    }
-    $start = 1 if ($line =~ /Peer/o);
-}
-
-## Request status of messages.
-$pop->print("Action: command\n");
-$pop->print("Command: iax2 show channels\n");
-$pop->print("\n");
-
-#Response: Follows
-#Channel               Peer             Username    ID (Lo/Rem)  Seq (Tx/Rx)  Lag      Jitter  JitBuf  Format
-#IAX2/rodolphe@rodolp  10.8.53.6        rodolphe    00003/01287  00006/00004  00000ms  0148ms  0000ms  gsm
-#1 active IAX channel(s)
-#--END COMMAND--
-
-$start = 0;
-while (($line = $pop->getline) and ($line !~ /active IAX channel/o))
-{
-    $i = 0;
-    my $found = 0;
-    if ($start) {
-	@fields = (split ' ', $line);
-        if ($fields[8] eq '0x0') {
-            $unknown += 1;
-            next;
-        }
-	foreach my $codec (@CODECSX) {
-	    if ($fields[8] eq "$codec") {
-		$results[$i] = $results[$i] + 1;
-		$found = 1;
-		last;
-	    }
-	    $i++;
-	}
-        if (! $found) {
-            $other += 1;
-            print STDERR "CODEC: IAX2 other format: $fields[8]\n";
-        }
-    }
-    $start = 1 if ($line =~ /Channel/o);
-}
-
-# Logoff
-$pop->print("Action: logoff\n");
-$pop->print("\n");
-
-## Exhaust buffer before closing (to avoid polluting Asterisk's logs)
-while ($line = $pop->getline) {}
-
-$i = 0;
-foreach my $codec (@CODECS) {
-    print "$codec.value $results[$i]\n";
-    $i++;
-}
-print "other.value $other\n";
-print "unknown.value $unknown\n";
-
-# vim:syntax=perl
diff -pruN 2.0.57-1/plugins/node.d/asterisk_meetme.in 2.0.69-1/plugins/node.d/asterisk_meetme.in
--- 2.0.57-1/plugins/node.d/asterisk_meetme.in	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/plugins/node.d/asterisk_meetme.in	1970-01-01 00:00:00.000000000 +0000
@@ -1,132 +0,0 @@
-#!@@PERL@@ -w
-# -*- perl -*-
-
-=head1 NAME
-
-asterisk_meetme - Plugin to monitor number of active conferences
-
-=head1 CONFIGURATION
-
-The following configuration parameters are used by this plugin
-
- [asterisk_voicemail]
-  env.host     - hostname to connect to
-  env.port     - port number to connect to
-  env.username - username used for authentication
-  env.secret   - secret used for authentication
-
-The "username" and "secret" parameters are mandatory, and have no
-defaults.
-
-=head2 DEFAULT CONFIGURATION
-
- [asterisk_meetme]
-  env.host 127.0.0.1
-  env.port 5038
-
-=head1 AUTHOR
-
-Copyright (C) 2005 Rodolphe Quiedeville <rodolphe@quiedeville.org>
-
-=head1 LICENSE
-
-Gnu GPLv2
-
-=begin comment
-
-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; version 2 dated June, 1991.
-
-This program is distributed in the hope that it will be useful, but
-WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 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, write to the Free Software Foundation, Inc.,
-51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-
-If you improve this script please send your version to my email
-address with the copyright notice upgrade with your name.
-
-=end comment
-
-=head1 MAGIC MARKERS
-
- #%# family=contrib
-
-=cut
-
-use IO::Socket;
-use strict;
-
-if ($ARGV[0] and $ARGV[0] eq "config")
-{
-    print "graph_title Asterisk actives conferences\n";
-    print "graph_args --base 1000 -l 0\n";
-    print "graph_vlabel conferences\n";
-    print "graph_category asterisk\n";
-    print "confs.draw AREA\n";
-    print "confs.label conferences\n";
-    exit 0;
-}
-
-my $host = exists $ENV{'host'} ? $ENV{'host'} : "127.0.0.1";
-my $port = exists $ENV{'port'} ? $ENV{'port'} : "5038";
-
-my $username = $ENV{'username'};
-my $secret   = $ENV{'secret'};
-
-my $pop = new IO::Socket::INET (PeerAddr => $host,
-				PeerPort => $port,
-				Proto => 'tcp');
-die "Could not create socket: $!\n" unless $pop;
-
-## Read connection message.
-my $line = $pop->getline;
-die $line unless $line =~ /^Asterisk/;
-
-## Send user name.
-$pop->print("Action: login\n");
-$pop->print("Username: $username\n");
-$pop->print("Secret: $secret\n");
-$pop->print("Events: off\n");
-$pop->print("\n");
-
-#Response: Success
-#Message: Authentication accepted
-
-## Request status of messages.
-$pop->print("Action: command\n");
-$pop->print("Command: meetme list\n");
-$pop->print("\n");
-
-
-#Response: Follows
-#Conf Num       Parties        Marked     Activity  Creation
-#5500           0001           N/A        00:00:03  Static
-#* Total number of MeetMe users: 1
-#--END COMMAND--
-
-my ($confs, $start)=(0,0);
-
-while (($line = $pop->getline) and ($line !~ /Total number|No active MeetMe/o))
-{
-    if ($start) {
-        #print $line;
-	$confs++;
-    }
-
-    $start = 1 if ($line =~ /Conf\sNum\s*Parties/o);
-}
-
-$pop->print("Action: logoff\n");
-$pop->print("\n");
-
-## Exhaust buffer before closing (to avoid polluting Asterisk's logs)
-while ($line = $pop->getline) {}
-
-print "confs.value $confs\n";
-
-# vim:syntax=perl
diff -pruN 2.0.57-1/plugins/node.d/asterisk_meetmeusers.in 2.0.69-1/plugins/node.d/asterisk_meetmeusers.in
--- 2.0.57-1/plugins/node.d/asterisk_meetmeusers.in	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/plugins/node.d/asterisk_meetmeusers.in	1970-01-01 00:00:00.000000000 +0000
@@ -1,128 +0,0 @@
-#!@@PERL@@ -w
-# -*- perl -*-
-
-=head1 NAME
-
-asterix_meetmeusers - Plugin to monitor number of active users in all
-the conferences
-
-=head1 CONFIGURATION
-
-The following configuration parameters are used by this plugin
-
- [asterisk_meetmeusers]
-  env.host     - hostname to connect to
-  env.port     - port number to connect to
-  env.username - username used for authentication
-  env.secret   - secret used for authentication
-
-The "username" and "secret" parameters are mandatory, and have no
-defaults.
-
-=head2 DEFAULT CONFIGURATION
-
- [asterisk_meetmeusers]
-  env.host 127.0.0.1
-  env.port 5038
-
-=head1 AUTHOR
-
-Copyright (C) 2005 Rodolphe Quiedeville <rodolphe@quiedeville.org>
-
-=head1 LICENSE
-
-Gnu GPLv2
-
-=begin comment
-
-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; version 2 dated June, 1991.
-
-This program is distributed in the hope that it will be useful, but
-WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 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, write to the Free Software Foundation, Inc.,
-51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-
-If you improve this script please send your version to my email
-address with the copyright notice upgrade with your name.
-
-=end comment
-
-=head1 MAGIC MARKERS
-
- #%# family=contrib
-
-=cut
-
-use IO::Socket;
-use strict;
-
-if ($ARGV[0] and $ARGV[0] eq "config")
-{
-    print "graph_title Asterisk conference's users\n";
-    print "graph_args --base 1000 -l 0\n";
-    print "graph_category asterisk\n";
-    print "graph_vlabel users\n";
-    print "users.draw AREA\n";
-    print "users.label users\n";
-    print "users.info users on active conference\n";
-    exit 0;
-}
-
-my $host = exists $ENV{'host'} ? $ENV{'host'} : "127.0.0.1";
-my $port = exists $ENV{'port'} ? $ENV{'port'} : "5038";
-
-my $username = $ENV{'username'};
-my $secret   = $ENV{'secret'};
-
-my $pop = new IO::Socket::INET (PeerAddr => $host,
-				PeerPort => $port,
-				Proto => 'tcp');
-die "Could not create socket: $!\n" unless $pop;
-
-## Read connection message.
-my $line = $pop->getline;
-die $line unless $line =~ /^Asterisk/;
-
-## Send user name.
-$pop->print("Action: login\n");
-$pop->print("Username: $username\n");
-$pop->print("Secret: $secret\n");
-$pop->print("Events: off\n");
-$pop->print("\n");
-
-#Response: Success
-#Message: Authentication accepted
-
-## Request status of messages.
-$pop->print("Action: command\n");
-$pop->print("Command: meetme list\n");
-$pop->print("\n");
-
-my $nb = 0;
-
-#Response: Follows
-#Privilege: Command
-#No active MeetMe conferences.
-# OR
-#Total number of MeetMe users: 1
-
-while (($line = $pop->getline) and ($line !~ /END COMMAND/o))
-{
-    $nb = $1 if $line =~ /MeetMe users:\s(\d)$/;
-}
-
-$pop->print("Action: logoff\n");
-$pop->print("\n");
-
-## Exhaust buffer before closing (to avoid polluting Asterisk's logs)
-while ($line = $pop->getline) {}
-
-print "users.value $nb\n";
-
-# vim:syntax=perl
diff -pruN 2.0.57-1/plugins/node.d/asterisk_sipchannels.in 2.0.69-1/plugins/node.d/asterisk_sipchannels.in
--- 2.0.57-1/plugins/node.d/asterisk_sipchannels.in	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/plugins/node.d/asterisk_sipchannels.in	1970-01-01 00:00:00.000000000 +0000
@@ -1,187 +0,0 @@
-#!@@PERL@@ -w
-# -*- perl -*-
-
-=head1 NAME
-
-asterix_sipchannels - Plugin to monitor number of active SIP
-channels by codec used
-
-=head1 CONFIGURATION
-
-The following configuration parameters are used by this plugin
-
- [asterisk_sipchannels]
-  env.host     - hostname to connect to
-  env.port     - port number to connect to
-  env.username - username used for authentication
-  env.secret   - secret used for authentication
-  env.codecs   - List of codecs (names)
-  env.codecsx  - List of codecs (hexadecimal values)
-
-The values of codecs and codecx must match each other.  Asterisk
-returns a hexadecimal value representing the codec used, and the same
-list entry is used from "codecs" and "codecsx".
-
-The "username" and "secret" parameters are mandatory, and have no
-defaults.
-
-=head2 DEFAULT CONFIGURATION
-
- [asterisk_sipchannels]
-  env.host 127.0.0.1
-  env.port 5038
-  env.codecs gsm ulaw alaw
-  env.codecsx 0x2 0x4 0x8
-
-=head1 AUTHOR
-
-Copyright (C) 2005-2006 Rodolphe Quiedeville <rodolphe@quiedeville.org>
-
-=head1 LICENSE
-
-Gnu GPLv2
-
-=begin comment
-
-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; version 2 dated June, 1991.
-
-This program is distributed in the hope that it will be useful, but
-WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 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, write to the Free Software Foundation, Inc.,
-51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-
-If you improve this script please send your version to my email
-address with the copyright notice upgrade with your name.
-
-=end comment
-
-=head1 MAGIC MARKERS
-
- #%# family=contrib
-
-=cut
-
-use IO::Socket;
-use strict;
-
-#Codecs g723, gsm, ulaw, alaw, g726, adpcm, slin, lpc10, g729, speex, ilbc
-
-my @CODECS = exists $ENV{'codecs'} ? split ' ',$ENV{'codecs'} : qw(gsm ulaw alaw);
-my @CODECSX = exists $ENV{'codecsx'} ? split ' ',$ENV{'codecsx'} : qw(0x2 0x4 0x8);
-
-if ($ARGV[0] and $ARGV[0] eq "config")
-{
-    print "graph_title Asterisk sip channels/codecs\n";
-    print "graph_args --base 1000 -l 0\n";
-    print "graph_vlabel channels\n";
-    print "graph_category asterisk\n";
-    foreach my $codec (@CODECS) {
-	if ($codec eq $CODECS[0]) {
-	    print "$codec.draw AREA\n";
-	}
-	else{
-	    print "$codec.draw STACK\n";
-	}
-	print "$codec.label $codec\n";
-    }
-    print "other.draw STACK\n";
-    print "other.label other\n";
-    print "unknown.draw STACK\n";
-    print "unknown.label not set\n";
-    exit 0;
-}
-
-my $host = exists $ENV{'host'} ? $ENV{'host'} : "127.0.0.1";
-my $port = exists $ENV{'port'} ? $ENV{'port'} : "5038";
-
-my $username = $ENV{'username'};
-my $secret   = $ENV{'secret'};
-
-my $pop = new IO::Socket::INET (PeerAddr => $host,
-				PeerPort => $port,
-				Proto => 'tcp');
-die "Could not create socket: $!\n" unless $pop;
-
-## Read connection message.
-my $line = $pop->getline;
-die $line unless $line =~ /^Asterisk/;
-
-## Send user name.
-$pop->print("Action: login\n");
-$pop->print("Username: $username\n");
-$pop->print("Secret: $secret\n");
-$pop->print("Events: off\n");
-$pop->print("\n");
-
-## Request status of messages.
-$pop->print("Action: command\n");
-$pop->print("Command: sip show channels\n");
-$pop->print("\n");
-
-#Response: Follows
-#Privilege: Command
-#Peer           User/ANR    Call ID      Seq (Tx/Rx)  Format         Hold   Last Message
-#0 active SIP channels
-# -- OR --
-#74.218.176.166  (None)    c24a5a230c6  00101/278584006  0x0 (nothing) No    Rx: REGISTER
-#74.218.176.166  (None)    508c037f936  00101/07310  0x0 (nothing)    No     Rx: REGISTER
-#2 active SIP channels
-#--END COMMAND--
-
-
-my @results;
-my ($i, $start, $unknown, $other, $fields)=(0,0,0,0,0);
-foreach my $codec (@CODECS) {
-    $results[$i] = 0;
-    $i++;
-}
-
-while (($line = $pop->getline) and ($line !~ /active SIP channel/o))
-{
-    $i = 0;
-    if ($start) {
-	my @fields = (split ' ', $line);
-	if ($fields[4] eq '0x0') {
-	    $unknown += 1;
-	    next;
-	}
-	my $found = 0;
-	foreach my $codec (@CODECSX) {
-	    if ($fields[4] eq "$codec") {
-		$results[$i] = $results[$i] + 1;
-		$found = 1;
-		last;
-	    }
-	    $i++;
-	}
-	if (! $found) {
-	    $other += 1;
-	    print STDERR "SIP other format: $fields[4]\n";
-	}
-    }
-    $start = 1 if ($line =~ /Peer/o);
-}
-
-$pop->print("Action: logoff\n");
-$pop->print("\n");
-
-## Exhaust buffer before closing (to avoid polluting Asterisk's logs)
-while ($line = $pop->getline) {}
-
-$i = 0;
-foreach my $codec (@CODECS) {
-    print "$codec.value $results[$i]\n";
-    $i++;
-}
-print "other.value $other\n";
-print "unknown.value $unknown\n";
-#print STDERR "asterisk_codecs other.value $other\n";
-#print STDERR "asterisk_codecs unknown.value $unknown\n";
-
-# vim:syntax=perl
diff -pruN 2.0.57-1/plugins/node.d/asterisk_sippeers.in 2.0.69-1/plugins/node.d/asterisk_sippeers.in
--- 2.0.57-1/plugins/node.d/asterisk_sippeers.in	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/plugins/node.d/asterisk_sippeers.in	1970-01-01 00:00:00.000000000 +0000
@@ -1,159 +0,0 @@
-#!@@PERL@@ -w
-# -*- perl -*-
-
-=head1 NAME
-
-asterix_sippeers - Plugin to monitor number of sip peers registered
-
-=head1 CONFIGURATION
-
-The following configuration parameters are used by this plugin
-
- [asterisk_sippeers]
-  env.host     - hostname to connect to
-  env.port     - port number to connect to
-  env.username - username used for authentication
-  env.secret   - secret used for authentication
-
-The "username" and "secret" parameters are mandatory, and have no
-defaults.
-
-=head2 DEFAULT CONFIGURATION
-
- [asterisk_sippeers]
-  env.host 127.0.0.1
-  env.port 5038
-
-=head1 AUTHOR
-
-Copyright (C) 2005 Rodolphe Quiedeville <rodolphe@quiedeville.org>
-
-=head1 LICENSE
-
-Gnu GPLv2
-
-=begin comment
-
-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; version 2 dated June, 1991.
-
-This program is distributed in the hope that it will be useful, but
-WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 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, write to the Free Software Foundation, Inc.,
-51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-
-If you improve this script please send your version to my email
-address with the copyright notice upgrade with your name.
-
-=end comment
-
-=head1 MAGIC MARKERS
-
- #%# family=contrib
-
-=cut
-
-# #################################################################################
-# Following example from current asterisk 1.4
-#> sip show peers
-#Name/username              Host            Dyn Nat ACL Port     Status
-#104-RANDALLBUILT/104-RAND  74.218.176.166   D          5060     Unmonitored
-#...
-#102-ROCKSOLID/102-ROCKSOL  (Unspecified)    D          0        Unmonitored
-#101-ROCKSOLID/101-ROCKSOL  (Unspecified)    D   N      0        UNKNOWN
-#20 sip peers [Monitored: 0 online, 1 offline Unmonitored: 2 online, 17 offline]
-# #################################################################################
-
-use IO::Socket;
-use strict;
-
-if ($ARGV[0] and $ARGV[0] eq "config")
-{
-    print "graph_title Asterisk sip peers\n";
-    print "graph_args --base 1000 -l 0\n";
-    print "graph_order mon moff umon umoff\n";
-    print "graph_vlabel peers\n";
-    print "graph_category asterisk\n";
-    #print "peers.label total\n";
-    print "mon.draw AREA\n";
-    print "mon.label monitored online\n";
-    print "moff.draw STACK\n";
-    print "moff.label monitored offline\n";
-    print "umon.draw STACK\n";
-    print "umon.label unmonitored online\n";
-    print "umoff.draw STACK\n";
-    print "umoff.label unmonitored offline\n";
-    #graph_scale no
-    #load.warning 10
-    #load.critical 120
-    #graph_info The ... describes ....
-    #load.info Average load for the five minutes.
-    exit 0;
-}
-
-my $host = exists $ENV{'host'} ? $ENV{'host'} : "127.0.0.1";
-my $port = exists $ENV{'port'} ? $ENV{'port'} : "5038";
-
-my $username = $ENV{'username'};
-my $secret   = $ENV{'secret'};
-
-my $pop = new IO::Socket::INET (PeerAddr => $host,
-				PeerPort => $port,
-				Proto => 'tcp');
-die "Could not create socket: $!\n" unless $pop;
-
-## Read connection message.
-my $line = $pop->getline;
-die $line unless $line =~ /^Asterisk/;
-
-## Send user name.
-$pop->print("Action: login\n");
-$pop->print("Username: $username\n");
-$pop->print("Secret: $secret\n");
-$pop->print("Events: off\n");
-$pop->print("\n");
-
-#Response: Success
-#Message: Authentication accepted
-
-## Request status of messages.
-$pop->print("Action: command\n");
-$pop->print("Command: sip show peers\n");
-$pop->print("\n");
-
-my ($peers,$monitor_online,$monitor_offline,$unmonitor_online,$unmonitor_offline)=(0,0,0,0,0);
-
-while (($line = $pop->getline) and ($line !~ /END COMMAND/o))
-{
-    my @fields = split(' ', $line);
-    my $count = @fields;
-    #20 sip peers [Monitored: 0 online, 1 offline Unmonitored: 2 online, 17 offline]
-    if (($count > 10) and ($fields[1] eq 'sip' and $fields[2] eq 'peers')) {
-	$peers = $fields[0];
-	$monitor_online = $fields[4];
-	$monitor_offline = $fields[6];
-	$unmonitor_online = $fields[9];
-	$unmonitor_offline = $fields[11];
-	#print STDERR "$peers $monitor_online $monitor_offline $unmonitor_online $unmonitor_offline\n";
-	last;
-    }
-}
-
-$pop->print("Action: logoff\n");
-$pop->print("\n");
-
-## Exhaust buffer before closing (to avoid polluting Asterisk's logs)
-while ($line = $pop->getline) {}
-
-#print "peers.value $peers\n";
-print "mon.value $monitor_online\n";
-print "moff.value $monitor_offline\n";
-print "umon.value $unmonitor_online\n";
-print "umoff.value $unmonitor_offline\n";
-
-# vim:syntax=perl
diff -pruN 2.0.57-1/plugins/node.d/asterisk_voicemail.in 2.0.69-1/plugins/node.d/asterisk_voicemail.in
--- 2.0.57-1/plugins/node.d/asterisk_voicemail.in	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/plugins/node.d/asterisk_voicemail.in	1970-01-01 00:00:00.000000000 +0000
@@ -1,136 +0,0 @@
-#!@@PERL@@ -w
-# -*- perl -*-
-
-=head1 NAME
-
-asterisk_voicemail - Plugin to monitor number of messages in all
-voicemail boxes
-
-=head1 ABOUT
-
-This plugin uses the asterisk manager API to fetch data.
-
-=head1 CONFIGURATION
-
-The following configuration parameters are used by this plugin
-
- [asterisk_voicemail]
-  env.host     - hostname to connect to
-  env.port     - port number to connect to
-  env.username - username used for authentication
-  env.secret   - secret used for authentication
-
-The "username" and "secret" parameters are mandatory, and have no
-defaults.
-
-=head2 DEFAULT CONFIGURATION
-
- [asterisk_voicemail]
-  env.host 127.0.0.1
-  env.port 5038
-
-=head1 AUTHOR
-
-Copyright (C) 2005-2006 Rodolphe Quiedeville <rodolphe@quiedeville.org>
-
-=head1 LICENSE
-
-Gnu GPLv2
-
-=begin comment
-
-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; version 2 dated June,
-1991.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-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, write to the Free Software Foundation, Inc.,
-51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-
-If you improve this script please send your version to my email address
-with the copyright notice upgrade with your name.
-
-=end comment
-
-=head1 MAGIC MARKERS
-
- #%# family=contrib
-
-=cut
-
-use IO::Socket;
-use strict;
-
-if ($ARGV[0] and $ARGV[0] eq "config")
-{
-    print "graph_title Asterisk Voicemail messages\n";
-    print "graph_args --base 1000 -l 0\n";
-    print "graph_vlabel messages\n";
-    print "graph_category asterisk\n";
-    print "messages.draw AREA\n";
-    print "messages.label messages\n";
-    exit 0;
-}
-
-my $host = exists $ENV{'host'} ? $ENV{'host'} : "127.0.0.1";
-my $port = exists $ENV{'port'} ? $ENV{'port'} : "5038";
-
-my $username = $ENV{'username'};
-my $secret   = $ENV{'secret'};
-
-my $pop = new IO::Socket::INET (PeerAddr => $host,
-				PeerPort => $port,
-				Proto => 'tcp');
-die "Could not create socket: $!\n" unless $pop;
-
-## Read connection message.
-my $line = $pop->getline;
-die $line unless $line =~ /^Asterisk/;
-
-## Send user name.
-$pop->print("Action: login\n");
-$pop->print("Username: $username\n");
-$pop->print("Secret: $secret\n");
-$pop->print("Events: off\n");
-$pop->print("\n");
-
-#Response: Success
-#Message: Authentication accepted
-
-## Request status of messages.
-$pop->print("Action: command\n");
-$pop->print("Command: voicemail show users\n");
-$pop->print("\n");
-
-#Context    Mbox  User                      Zone       NewMsg
-#default    1234  Example Mailbox                           1
-#other      1234  Company2 User                             0
-
-my ($results,$start)=(0,0);
-
-my @fields;
-while (($line = $pop->getline)  and ($line !~ /--END/o))
-{
-    if ($start) {
-	@fields = (split ' ', $line);
-	$results = $results + pop(@fields);
-    }
-
-    $start = 1 if ($line =~ /Context/o);
-}
-
-# Logoff
-$pop->print("Action: logoff\n");
-$pop->print("\n");
-
-## Exhaust buffer before closing (to avoid polluting Asterisk's logs)
-while ($line = $pop->getline) {}
-
-print "messages.value $results\n";
-# vim:syntax=perl
diff -pruN 2.0.57-1/plugins/node.d/courier_mta_mailqueue.in 2.0.69-1/plugins/node.d/courier_mta_mailqueue.in
--- 2.0.57-1/plugins/node.d/courier_mta_mailqueue.in	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/plugins/node.d/courier_mta_mailqueue.in	2021-11-22 22:12:17.000000000 +0000
@@ -29,7 +29,7 @@ None known
 
 =head1 AUTHOR
 
-Rune Nordbøe Skillingstad <runesk@linpro.no>
+Rune NordbÃ¸e Skillingstad <runesk@linpro.no>
 
 =head1 LICENSE
 
diff -pruN 2.0.57-1/plugins/node.d/courier_mta_mailstats.in 2.0.69-1/plugins/node.d/courier_mta_mailstats.in
--- 2.0.57-1/plugins/node.d/courier_mta_mailstats.in	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/plugins/node.d/courier_mta_mailstats.in	2021-11-22 22:12:17.000000000 +0000
@@ -16,7 +16,7 @@ The following environment variables are
 
 =head1 AUTHOR
 
-Rune Nordbøe Skillingstad <runesk@linpro.no>
+Rune NordbÃ¸e Skillingstad <runesk@linpro.no>
 
 =head1 LICENSE
 
diff -pruN 2.0.57-1/plugins/node.d/courier_mta_mailvolume.in 2.0.69-1/plugins/node.d/courier_mta_mailvolume.in
--- 2.0.57-1/plugins/node.d/courier_mta_mailvolume.in	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/plugins/node.d/courier_mta_mailvolume.in	2021-11-22 22:12:17.000000000 +0000
@@ -15,7 +15,7 @@ The following environent variables are u
 
 =head1 AUTHOR
 
-Rune Nordbøe Skillingstad <runesk@linpro.no>
+Rune NordbÃ¸e Skillingstad <runesk@linpro.no>
 
 =head1 LICENSE
 
diff -pruN 2.0.57-1/plugins/node.d/dhcpd3.in 2.0.69-1/plugins/node.d/dhcpd3.in
--- 2.0.57-1/plugins/node.d/dhcpd3.in	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/plugins/node.d/dhcpd3.in	2021-11-22 22:12:17.000000000 +0000
@@ -40,10 +40,6 @@ The plugin shows the number of used leas
   #%# family=contrib
   #%# capabilities=autoconf
 
-=head1 VERSION
-
-  $Id$
-
 =head1 BUGS
 
 If a DHCP config file contains multiple subnets but none of them has a
@@ -53,7 +49,7 @@ of a subnet definition (Munin trac ticke
 
 =head1 AUTHOR
 
-Rune Nordbøe Skillingstad.
+Rune NordbÃ¸e Skillingstad.
 
 =head1 LICENSE
 
diff -pruN 2.0.57-1/plugins/node.d/digitemp_.in 2.0.69-1/plugins/node.d/digitemp_.in
--- 2.0.57-1/plugins/node.d/digitemp_.in	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/plugins/node.d/digitemp_.in	2021-11-22 22:12:17.000000000 +0000
@@ -22,7 +22,7 @@ and create configuration file (default:
 
 =head1 AUTHOR
 
-Copyright (C) 2006 Dagfinn Ilmari Mannsaaker <ilmari@ilmari.org>
+Copyright (C) 2006 Dagfinn Ilmari MannsÃ¥ker <ilmari@ilmari.org>
 
 =head1 LICENSE
 
@@ -88,7 +88,7 @@ fi
 
 
 # check if the digitemp executable is available
-if ! [ -x "$(which "$digitemp_bin")" ]; then
+if ! [ -x "$(command -v "$digitemp_bin")" ]; then
     echo "executable '$digitemp_bin' not found" >&2
     exit 1
 fi
diff -pruN 2.0.57-1/plugins/node.d/ejabberd_.in 2.0.69-1/plugins/node.d/ejabberd_.in
--- 2.0.57-1/plugins/node.d/ejabberd_.in	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/plugins/node.d/ejabberd_.in	2021-11-22 22:12:17.000000000 +0000
@@ -99,7 +99,7 @@ vhosts=${vhosts:-}
 configfile=${configfile:-}
 
 
-EJCTL=$(which ejabberdctl 2>/dev/null) || true
+EJCTL=$(command -v ejabberdctl || true)
 # get ejabberd PID
 # in GNU/Linux Debian Lenny release the pidof command can be executed only by root
 #EJPID=$(pidof -s /usr/lib/erlang/erts-5.6.3/bin/beam.smp)
diff -pruN 2.0.57-1/plugins/node.d/exim_mailqueue_alt.in 2.0.69-1/plugins/node.d/exim_mailqueue_alt.in
--- 2.0.57-1/plugins/node.d/exim_mailqueue_alt.in	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/plugins/node.d/exim_mailqueue_alt.in	2021-11-22 22:12:17.000000000 +0000
@@ -45,18 +45,9 @@ GPLv2
 =cut
 
 PATH='/bin:/sbin:/usr/bin:/usr/sbin'
-# You cannot trust the exit status of which
-EXIM=$(which exim 2>/dev/null)
-case $EXIM:$? in
-    *:1|no*) EXIM=$(which exim4 2>/dev/null)
-esac
-case $EXIM:$? in
-    *:1|no*) EXIM=''
-esac
 
 QUEUECRIT=200
-
-EXIM=${exim:-$EXIM}
+EXIM=${exim:-$(command -v exim || command -v exim4)}
 QUEUEWARN=${queuewarn:-100}
 QUEUECRIT=${queuecrit:-200}
 
diff -pruN 2.0.57-1/plugins/node.d/exim_mailqueue.in 2.0.69-1/plugins/node.d/exim_mailqueue.in
--- 2.0.57-1/plugins/node.d/exim_mailqueue.in	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/plugins/node.d/exim_mailqueue.in	2021-11-22 22:12:17.000000000 +0000
@@ -82,12 +82,10 @@ munin-node.
 
 EOF
 
-# You cannot trust the exit status of which
-EXIQGREP=$(which exiqgrep 2>/dev/null) || true
 
 GRAPHTITLE='Exim Mailqueue'
 
-EXIQGREP=${exiqgrep:-$EXIQGREP}
+EXIQGREP=${exiqgrep:-$(command -v exiqgrep || true)}
 GRAPHTITLE=${graphtitle:-$GRAPHTITLE}
 
 QUEUEWARN=${queuewarn:-100}
diff -pruN 2.0.57-1/plugins/node.d/exim_mailstats.in 2.0.69-1/plugins/node.d/exim_mailstats.in
--- 2.0.57-1/plugins/node.d/exim_mailstats.in	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/plugins/node.d/exim_mailstats.in	2021-11-22 22:12:17.000000000 +0000
@@ -47,10 +47,6 @@ Need some input from an exim postmaster
 
 None known
 
-=head1 VERSION
-
-  $Id$
-
 =head1 AUTHOR
 
 Copyright (C) 2000-2009 Torstein Svendsen, Henrik Grindal Bakken,
diff -pruN 2.0.57-1/plugins/node.d/freeradius_acct.in 2.0.69-1/plugins/node.d/freeradius_acct.in
--- 2.0.57-1/plugins/node.d/freeradius_acct.in	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/plugins/node.d/freeradius_acct.in	2021-11-22 22:12:17.000000000 +0000
@@ -43,7 +43,7 @@ Copyright (C) 2008 Alan DeKok <aland@dep
 
 =cut
 
-RADMIN=${radmin:-$(which radmin 2>/dev/null)}
+RADMIN=${radmin:-$(command -v radmin)}
 RADMIN=${RADMIN:-/usr/sbin/radmin}
 SOCKETFILE=${socketfile:-/var/run/radiusd/radiusd.sock}
 
diff -pruN 2.0.57-1/plugins/node.d/freeradius_auth.in 2.0.69-1/plugins/node.d/freeradius_auth.in
--- 2.0.57-1/plugins/node.d/freeradius_auth.in	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/plugins/node.d/freeradius_auth.in	2021-11-22 22:12:17.000000000 +0000
@@ -43,7 +43,7 @@ Copyright (C) 2008 Alan DeKok <aland@dep
 
 =cut
 
-RADMIN=${radmin:-$(which radmin 2>/dev/null)}
+RADMIN=${radmin:-$(command -v radmin)}
 RADMIN=${RADMIN:-/usr/sbin/radmin}
 SOCKETFILE=${socketfile:-/var/run/radiusd/radiusd.sock}
 
diff -pruN 2.0.57-1/plugins/node.d/freeradius_proxy_acct.in 2.0.69-1/plugins/node.d/freeradius_proxy_acct.in
--- 2.0.57-1/plugins/node.d/freeradius_proxy_acct.in	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/plugins/node.d/freeradius_proxy_acct.in	2021-11-22 22:12:17.000000000 +0000
@@ -43,7 +43,7 @@ Copyright (C) 2008 Alan DeKok <aland@dep
 
 =cut
 
-RADMIN=${radmin:-$(which radmin 2>/dev/null)}
+RADMIN=${radmin:-$(command -v radmin)}
 RADMIN=${RADMIN:-/usr/sbin/radmin}
 SOCKETFILE=${socketfile:-/var/run/radiusd/radiusd.sock}
 
diff -pruN 2.0.57-1/plugins/node.d/freeradius_proxy_auth.in 2.0.69-1/plugins/node.d/freeradius_proxy_auth.in
--- 2.0.57-1/plugins/node.d/freeradius_proxy_auth.in	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/plugins/node.d/freeradius_proxy_auth.in	2021-11-22 22:12:17.000000000 +0000
@@ -43,7 +43,7 @@ Copyright (C) 2008 Alan DeKok <aland@dep
 
 =cut
 
-RADMIN=${radmin:-$(which radmin 2>/dev/null)}
+RADMIN=${radmin:-$(command -v radmin)}
 RADMIN=${RADMIN:-/usr/sbin/radmin}
 SOCKETFILE=${socketfile:-/var/run/radiusd/radiusd.sock}
 
diff -pruN 2.0.57-1/plugins/node.d/haproxy_.in 2.0.69-1/plugins/node.d/haproxy_.in
--- 2.0.57-1/plugins/node.d/haproxy_.in	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/plugins/node.d/haproxy_.in	2021-11-22 22:12:17.000000000 +0000
@@ -38,10 +38,6 @@ This will provide for HTTP basic authent
 
   #%# family=contrib
 
-=head1 VERSION
-
-  $Id$
-
 =head1 AUTHOR
 
 Jimmy Olsen (based on some Apache plugin).  Documented by Nicolai Langfeldt.
diff -pruN 2.0.57-1/plugins/node.d/hddtemp_smartctl.in 2.0.69-1/plugins/node.d/hddtemp_smartctl.in
--- 2.0.57-1/plugins/node.d/hddtemp_smartctl.in	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/plugins/node.d/hddtemp_smartctl.in	2021-11-22 22:12:17.000000000 +0000
@@ -150,7 +150,7 @@ if ($smartctl and `$smartctl --version`
 }
 
 # hdparm is used as a fallback
-my $hdparm = `which hdparm 2>/dev/null`;
+my $hdparm = `sh -c 'command -v hdparm'`;
 chomp $hdparm;
 
 my @drives;
@@ -298,7 +298,12 @@ foreach my $drive (@drives) {
 sub device_for_drive {
     my ($drive) = @_;
 
-    my $dev = $drive =~ /(.*)(?:_\d+)$/ ? $1 : $drive;
+    # The purpose of the following regular expression (removing a numeric suffix starting with an
+    # underscore) is a mystery.  But it is probably meant to detect a partition and select the
+    # parent block device in such a case.
+    # In order to avoid misinterpreting a trailing serial number as such a partition number, we
+    # limit the number of numeric characters after the underscore to just one or two.
+    my $dev = $drive =~ /(.*)(?:_\d{1,2})$/ ? $1 : $drive;
 
     my $fulldev = '/dev/';
     $fulldev .= 'rdsk/' if $^O eq 'solaris';
diff -pruN 2.0.57-1/plugins/node.d/http_loadtime.in 2.0.69-1/plugins/node.d/http_loadtime.in
--- 2.0.57-1/plugins/node.d/http_loadtime.in	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/plugins/node.d/http_loadtime.in	2021-11-22 22:12:17.000000000 +0000
@@ -15,6 +15,8 @@ The following environment variables are
    [http_loadtime]
    env.target http://localhost.de,http://localhost.de/some-site.html
    env.requisites true
+   env.warning 5
+   env.critical 30
 
  Do not enable the download of page requisites (env.requisites) for https
  sites since wget needs incredible long to perform this on big sites...
@@ -35,6 +37,8 @@ GPLv2
 
 =cut
 
+. "$MUNIN_LIBDIR/plugins/plugin.sh"
+
 target=${target:-"http://localhost/"}
 requisites=${requisites:-"false"}
 
@@ -87,6 +91,7 @@ if [ "$1" = "config" ]; then
         if [ "$uri_short" != "$uri" ]; then uri_short="${uri_short}..."; fi
         echo "$(escapeUri "$uri").label $uri_short"
         echo "$(escapeUri "$uri").info page load time"
+        print_thresholds "$(escapeUri "$uri")"
     done
     exit 0
 fi
diff -pruN 2.0.57-1/plugins/node.d/ifx_concurrent_sessions_.in 2.0.69-1/plugins/node.d/ifx_concurrent_sessions_.in
--- 2.0.57-1/plugins/node.d/ifx_concurrent_sessions_.in	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/plugins/node.d/ifx_concurrent_sessions_.in	2021-11-22 22:12:17.000000000 +0000
@@ -34,10 +34,6 @@ command:
 The value of INFORMIXSERVER usually equals to that of DBSERVERNAME in
 the $INFORMIXDIR/etc/onconfig file.
 
-=head1 VERSION
-
- $Id$
-
 =head1 BUGS
 
 This plugin hangs during autoconf - at least on systems without
diff -pruN 2.0.57-1/plugins/node.d/ipmi_.in 2.0.69-1/plugins/node.d/ipmi_.in
--- 2.0.57-1/plugins/node.d/ipmi_.in	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/plugins/node.d/ipmi_.in	2021-11-22 22:12:17.000000000 +0000
@@ -5,7 +5,7 @@
 
 =head1 NAME
 
-ipmi_ - Plugin to monitor temperature or fan speed using IPMI
+ipmi_ - Plugin to monitor temperature, fan speed, watts or volts using IPMI
 
 =head1 CONFIGURATION
 
@@ -15,8 +15,9 @@ This plugin does not use environment var
 
 =head2 WILDCARD PLUGIN
 
-This plugin should be linked as ipmi_temp or ipmi_fans, and will show
-either temperatures or fan speeds based on its link name.
+This plugin should be linked as ipmi_temp, ipmi_fans, ipmi_power or ipmi_volts,
+and will show either temperatures, fan speeds, watts or volts based on its link
+name.
 
 =head1 NOTE
 
@@ -57,7 +58,8 @@ case $1 in
     suggest) echo fans
              echo temp
              echo power
-	     exit 0;;
+             echo volts
+             exit 0;;
     config)  CONFIG=config;;
 esac
 
@@ -65,7 +67,8 @@ case $0 in
     *_temp) MEASURE=temp;;
     *_fans) MEASURE=fans;;
     *_power) MEASURE=power;;
-    *) echo "Please invoke as ipmi_temp, ipmi_fans or ipmi_power" >&2
+    *_volts) MEASURE=volts;;
+    *) echo "Please invoke as ipmi_temp, ipmi_fans, ipmi_power or ipmi_volts" >&2
        exit 1;;
 esac
 
@@ -78,9 +81,11 @@ BEGIN {
     FANS = "";
     TEMPS = "";
     POWER = "";
+    VOLTS = "";
     CFANS = "graph_title Fan speeds based on IPMI\ngraph_vlabel RPM or %\ngraph_category Sensors\n";
     CTEMPS = "graph_title Machine temperature based on IPMI\ngraph_vlabel Degrees celcius\ngraph_category Sensors\n";
     CPOWER = "graph_title Power usage based on IPMI\ngraph_vlabel W\ngraph_category Sensors\n";
+    CVOLTS = "graph_title Volts based on IPMI\ngraph_vlabel V\ngraph_category Sensors\n";
 }
 
 # Remove extraneous spaces to make output prettyer
@@ -156,6 +161,21 @@ BEGIN {
     CPOWER = sprintf("%s%s.label %s\n",CPOWER,NAME,THING);
 }
 
+/Volts/ {
+    NAME=THING=$1
+    gsub(/[^A-Za-z0-9]/,"",NAME);
+    VOLTS_SENSOR=$2;
+
+    # Find unique name
+    while (NAMES[NAME] >= 1) {
+        NAME=sprintf("%si",NAME);
+    }
+    NAMES[NAME]=1;
+
+    VOLTS = sprintf("%s%s.value %s\n",VOLTS,NAME,VOLTS_SENSOR);
+    CVOLTS = sprintf("%s%s.label %s\n",CVOLTS,NAME,THING);
+}
+
 END {
     if (ENVIRON["MEASURE"] == "temp") {
         VALUE=TEMPS;
@@ -163,6 +183,9 @@ END {
     } else if (ENVIRON["MEASURE"] == "power") {
         VALUE=POWER;
         CONFIG=CPOWER;
+    } else if (ENVIRON["MEASURE"] == "volts") {
+        VALUE=VOLTS;
+        CONFIG=CVOLTS;
     } else {
         VALUE=FANS;
         CONFIG=CFANS;
diff -pruN 2.0.57-1/plugins/node.d/ipmi_sensor_.in 2.0.69-1/plugins/node.d/ipmi_sensor_.in
--- 2.0.57-1/plugins/node.d/ipmi_sensor_.in	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/plugins/node.d/ipmi_sensor_.in	2021-11-22 22:12:17.000000000 +0000
@@ -128,7 +128,7 @@ def get_sensor_names():
     try:
         p = Popen(["ipmitool", "-I", "open", "sensor"], shell=False, stdout=PIPE)
     except OSError:
-        return
+        return {}
     data = p.stdout.read().decode().splitlines()
 
     units = {}
@@ -157,13 +157,13 @@ def get_sensors():
             try:
                 p = Popen(["ipmitool", "-I", "open", "sensor"], shell=False, stdout=PIPE)
             except OSError:
-                return
+                return {}
         else:
             try:
                 p = Popen(["ipmitool", "-I", "open", "sensor", "get", "--"] + SENSORS,
                           shell=False, stdout=PIPE)
             except OSError:
-                return
+                return {}
         data = p.stdout.read().decode()
         try:
             with open(cache_filename, "w") as f:
diff -pruN 2.0.57-1/plugins/node.d/loggrep.in 2.0.69-1/plugins/node.d/loggrep.in
--- 2.0.57-1/plugins/node.d/loggrep.in	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/plugins/node.d/loggrep.in	2021-11-22 22:12:17.000000000 +0000
@@ -26,7 +26,7 @@ TODO: Handle rotated logs
 
 =head1 AUTHOR
 
-Copyright (C) 2004 Dagfinn Ilmari Mannsaaker
+Copyright (C) 2004 Dagfinn Ilmari MannsÃ¥ker
 
 =head1 LICENSE
 
diff -pruN 2.0.57-1/plugins/node.d/mailman.in 2.0.69-1/plugins/node.d/mailman.in
--- 2.0.57-1/plugins/node.d/mailman.in	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/plugins/node.d/mailman.in	2021-11-22 22:12:17.000000000 +0000
@@ -61,6 +61,7 @@ else
 if($ARGV[0] and $ARGV[0] eq "config") {
     print "graph_title Mailman usage\n";
     print "graph_args --base 1000\n";
+    print "graph_category mail\n";
     print "posts.label posts per minute\n";
     print "posts.type DERIVE\n";
     print "posts.min 0\n";
diff -pruN 2.0.57-1/plugins/node.d/mbmon_.in 2.0.69-1/plugins/node.d/mbmon_.in
--- 2.0.57-1/plugins/node.d/mbmon_.in	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/plugins/node.d/mbmon_.in	2021-11-22 22:12:17.000000000 +0000
@@ -1,28 +1,61 @@
 #!@@GOODSH@@
 # -*- sh -*-
-#
-# Plugin to monitor Motherboard temparature using mbmon
-#  (http://www.nt.phys.kyushu-u.ac.jp/shimizu/download/download.html)
-
-# Copyright (c) 2005 Arne Schwabe
-# All rights reserved.
-#
-# Redistribution and use in source and binary forms are freely
-# permitted provided that the above copyright notice and this
-# paragraph and the following disclaimer are duplicated in all
-# such forms.
-#
-# This software is provided "AS IS" and without any express or
-# implied warranties, including, without limitation, the implied
-# warranties of merchantability and fitness for a particular
-# purpose.
-#
+
+: <<=cut
+
+=head1 NAME
+
+mbmon_ - monitor motherboard temparature using mbmon
+
+=head1 APPLICABLE SYSTEMS
+
+The software "mbmon" is required:
+ http://www.nt.phys.kyushu-u.ac.jp/shimizu/download/download.html
+
+=head1 CONFIGURATION
+
+The following details can be configured (e.g. below /etc/munin/plugin-conf.d/):
+  [mbmon_*]
+  env.mbmon /usr/local/bin/mbmon
+  env.mbmonargs -I -pit87
+
+Parameters
+  mbmonpath  - path to the mbmon program (default: automatic detection)
+  mbmonargs  - additional arguments given to mbmon
+
+=head1 AUTHOR
+
+Copyright (c) 2005 Arne Schwabe
+
+All rights reserved.
+
+=head1 LICENSE
+
+Redistribution and use in source and binary forms are freely
+permitted provided that the above copyright notice and this
+paragraph and the following disclaimer are duplicated in all
+such forms.
+
+This software is provided "AS IS" and without any express or
+implied warranties, including, without limitation, the implied
+warranties of merchantability and fitness for a particular
+purpose.
+
+=cut
+
 
 #%# family=contrib
 #%# capabilities=autoconf suggest
 
 what=$(basename "$0" | sed 's/^mbmon_//g')
-mbmon=${mbmon:-$(which mbmon)}
+mbmon=${mbmon:-$(command -v mbmon)}
+mbmonargs=${mbmonargs:-}
+
+
+run_mbmon() {
+	# shellcheck disable=SC2086
+	"$mbmon" -c 1 -r $mbmonargs
+}
 
 
 if [ "$1" = "suggest" ]; then
@@ -88,15 +121,15 @@ fi
 
 case $what in
 	TEMP)
-		$mbmon -c 1 -r | sed -e "s/ *: */.value /"  |grep TEMP
+		run_mbmon | sed -e "s/ *: */.value /" | grep TEMP
 		exit 0
 		;;
 	Voltage)
-		$mbmon -c 1 -r | sed -e "s/ *: */.value /"  |grep V
+		run_mbmon | sed -e "s/ *: */.value /" | grep V
 		exit 0
 		;;
 	FAN)
-		$mbmon -c 1 -r | sed -e "s/ *: */.value /"  |grep FAN
+		run_mbmon | sed -e "s/ *: */.value /" | grep FAN
 		exit 0
 		;;
 esac
diff -pruN 2.0.57-1/plugins/node.d/memcached_.in 2.0.69-1/plugins/node.d/memcached_.in
--- 2.0.57-1/plugins/node.d/memcached_.in	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/plugins/node.d/memcached_.in	2021-11-22 22:12:17.000000000 +0000
@@ -15,6 +15,7 @@
 #
 #  config
 #  autoconf
+#  suggest
 #
 # Configurable variables
 #
@@ -25,12 +26,9 @@
 # Slightly based on the original version by Joshua Thijssen
 # <jthijssen@noxlogic.nl>
 #
-# Included in trunk for 1.4 by Nicolai Langfeldt.  Set family to contrib
-# and disabled autoconf due to lack of "suggest".
-#
 # Magic markers:
 #%# family=contrib
-#%# capabilities=noautoconf
+#%# capabilities=autoconf
 use strict;
 my $ret = undef;
 if (! eval "require Cache::Memcached;") {
@@ -41,17 +39,29 @@ my $PORT = exists $ENV{'port'} ? $ENV{'p
 if ( exists $ARGV[0] and $ARGV[0] eq "autoconf" ) {
 	if ($ret) {
 		print "no ($ret)\n";
-		exit 0;
+	} else {
+		use Net::Ping;
+		my $p = Net::Ping->new();
+		$p->port_number($PORT);
+		if ($p->ping($HOST, 1)) {
+			print "yes\n";
+			exit 0;
+		}
+		print "no (cannot connect to $HOST on port $PORT)\n";
 	}
-# Todo: we can always connect to a memcache server without any errors so I cannot really
-# find a way to detect the presence of a memcache instance. Maybe a forced write/read/delete
-# but there should be a better way somewhere...
-	print "yes\n";
+	exit 0;
+}
+
+if (exists $ARGV[0] and $ARGV[0] eq "suggest") {
+	print "bytes\n";
+	print "counters\n";
+	print "rates\n";
 	exit 0;
 }
 
 if($ret) {
-	print "no ($ret)\n";
+	# refuse to execute "config" or "fetch" due to a missing requirement
+	print "memcached_ plugin fails to run: $ret\n";
 	exit 1;
 }
 
diff -pruN 2.0.57-1/plugins/node.d/multips.in 2.0.69-1/plugins/node.d/multips.in
--- 2.0.57-1/plugins/node.d/multips.in	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/plugins/node.d/multips.in	2021-11-22 22:12:17.000000000 +0000
@@ -28,7 +28,7 @@ used to grep with directly.
 
 This plugin simply counts the total number of processes matching the
 configured regular expressions.  The regular expressions are
-interpreted by "grep" (and not egrep or perl).
+interpreted by "grep" (and not grep -E or perl).
 
 =head1 MAGIC MARKERS
 
@@ -93,7 +93,7 @@ for name in $names; do
 	printf "%s.value " "$fieldname"
 
 	eval REGEX='"${regex_'"$name"'-\<'"$name"'\>}"'
-	PGREP=$(which pgrep)
+	PGREP=$(command -v pgrep)
 	if [ -n "$PGREP" ] && [ -x "$PGREP" ]; then
 		"$PGREP" -f -l "$name" | grep "$REGEX" | wc -l
 	elif [ -x /usr/ucb/ps ]; then
diff -pruN 2.0.57-1/plugins/node.d/munin_stats.in 2.0.69-1/plugins/node.d/munin_stats.in
--- 2.0.57-1/plugins/node.d/munin_stats.in	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/plugins/node.d/munin_stats.in	2021-11-22 22:12:17.000000000 +0000
@@ -1,7 +1,7 @@
 #!@@PERL@@
 # -*- perl -*-
 #
-# Copyright (C) 2006-2009 Rodolphe Quiedeville <rodolphe@quiedeville.org>
+# Copyright (C) 2006-2009 Rodolphe QuiÃ©deville <rodolphe@quiedeville.org>
 #
 # This program is free software; you can redistribute it and/or
 # modify it under the terms of the GNU General Public License
@@ -17,8 +17,6 @@
 # along with this program; if not, write to the Free Software
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 #
-# $Id$
-#
 # Magic markers (used by munin-node-configure and some installation scripts):
 #%# family=auto
 #%# capabilities=autoconf
diff -pruN 2.0.57-1/plugins/node.d/mysql_.in 2.0.69-1/plugins/node.d/mysql_.in
--- 2.0.57-1/plugins/node.d/mysql_.in	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/plugins/node.d/mysql_.in	2021-11-22 22:12:17.000000000 +0000
@@ -162,21 +162,26 @@ use warnings;
 use strict;
 use utf8;
 
-use DBI;
+use English qw( -no_match_vars );
 use File::Basename;
-use Math::BigInt; # Used to append "=> lib 'GMP'" here, but GMP caused
-		  # segfault on some occasions. Removed as I don't
-		  # think the tiny performance boost is worth the
-		  # debugging effort.
 use Storable qw(nfreeze thaw);
 
 use Munin::Plugin;
 
 my $has_cache;
+my $has_dbi;
+my $has_math_bigint;
 
 BEGIN {
-    eval 'require Cache::SharedMemoryCache';
-    $has_cache = $@ ? 0 : 1;
+    eval { require Cache::SharedMemoryCache; };
+    $has_cache = $EVAL_ERROR ? 0 : 1;
+    eval { require DBI; DBI->import(); };
+    $has_dbi = $EVAL_ERROR ? 0 : 1;
+    # Used to append "=> lib 'GMP'" here, but GMP caused segfault on some
+    # occasions. Removed as I don't think the tiny performance boost is
+    # worth the debugging effort.
+    eval { require Math::BigInt; Math::BigInt->import(); };
+    $has_math_bigint = $EVAL_ERROR ? 0 : 1;
 }
 
 
@@ -902,6 +907,12 @@ sub main {
     die "Missing dependency Cache::Cache"
 	unless $has_cache || $command eq 'autoconf';
 
+    die "Missing dependency DBI"
+        unless $has_dbi || $command eq 'autoconf';
+
+    die "Missing dependency Math::BigInt"
+        unless $has_math_bigint || $command eq 'autoconf';
+
     return $command_map{$command}->($graph);
 }
 
@@ -919,6 +930,14 @@ sub autoconf {
 	print "no (Missing dependency Cache::Cache)\n";
 	return 0;
     }
+    unless ($has_dbi) {
+	print "no (Missing dependency DBI)\n";
+	return 0;
+    }
+    unless ($has_math_bigint) {
+	print "no (Missing dependency Math::BigInt)\n";
+	return 0;
+    }
 
     eval {
 	db_connect();
diff -pruN 2.0.57-1/plugins/node.d/mysql_innodb.in 2.0.69-1/plugins/node.d/mysql_innodb.in
--- 2.0.57-1/plugins/node.d/mysql_innodb.in	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/plugins/node.d/mysql_innodb.in	2021-11-22 22:12:17.000000000 +0000
@@ -102,7 +102,7 @@ CRITICAL=${critical:-1073741824} # 1GB
 
 mysql_exec() {
     # shellcheck disable=SC2086
-    "$MYSQL" $MYSQLOPTS --batch --skip-column-names --database=information_schema --execute
+    "$MYSQL" $MYSQLOPTS --batch --skip-column-names --database=information_schema --execute "$1"
 }
 
 
diff -pruN 2.0.57-1/plugins/node.d/mysql_isam_space_.in 2.0.69-1/plugins/node.d/mysql_isam_space_.in
--- 2.0.57-1/plugins/node.d/mysql_isam_space_.in	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/plugins/node.d/mysql_isam_space_.in	2021-11-22 22:12:17.000000000 +0000
@@ -51,7 +51,7 @@ munin-node.
 my $DB = `basename $0 | sed 's/^mysql_isam_space_//g' | tr '_' '-'` ;
 chomp $DB;
 my $STATEFILE = $ENV{'statefile'} || "$ENV{MUNIN_PLUGSTATE}/plugin-mysql_isam_space.state";
-my $MYSQLSHOW = $ENV{'mysqlshow'} || `which mysqlshow`;
+my $MYSQLSHOW = $ENV{'mysqlshow'} || `command -v mysqlshow`;
 my $ABSOLUTE  = $ENV{'absolute'} || 0;
 my @mysql_opts = ();
 
diff -pruN 2.0.57-1/plugins/node.d/mysql_queries.in 2.0.69-1/plugins/node.d/mysql_queries.in
--- 2.0.57-1/plugins/node.d/mysql_queries.in	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/plugins/node.d/mysql_queries.in	2021-11-22 22:12:17.000000000 +0000
@@ -36,10 +36,6 @@ Copyright 2003-2008 - Per Andreas Buer
 
 GPLv2
 
-=head1 VERSION
-
-  $Id$
-
 =head1 MAGIC MARKERS
 
   #%# family=manual
diff -pruN 2.0.57-1/plugins/node.d/nginx_request.in 2.0.69-1/plugins/node.d/nginx_request.in
--- 2.0.57-1/plugins/node.d/nginx_request.in	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/plugins/node.d/nginx_request.in	2021-11-22 22:12:17.000000000 +0000
@@ -37,10 +37,6 @@ compiled, and secondly it must be config
   #%# family=auto
   #%# capabilities=autoconf
 
-=head1 VERSION
-
-  $Id$
-
 =head1 BUGS
 
 None known
diff -pruN 2.0.57-1/plugins/node.d/nginx_status.in 2.0.69-1/plugins/node.d/nginx_status.in
--- 2.0.57-1/plugins/node.d/nginx_status.in	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/plugins/node.d/nginx_status.in	2021-11-22 22:12:17.000000000 +0000
@@ -36,10 +36,6 @@ compiled, and secondly it must be config
   #%# family=auto
   #%# capabilities=autoconf
 
-=head1 VERSION
-
-  $Id$
-
 =head1 BUGS
 
 None known
@@ -115,6 +111,9 @@ if ( exists $ARGV[0] and $ARGV[0] eq "co
     exit 0;
 }
 
+# generate a useful error message instead of just bailing out later
+die "Missing dependency: '$ret'" if ($ret);
+
 my $ua = LWP::UserAgent->new(timeout => 30,
 		agent => sprintf("munin/%s (libwww-perl/%s)", $Munin::Common::Defaults::MUNIN_VERSION, $LWP::VERSION));
 
diff -pruN 2.0.57-1/plugins/node.d/nomadix_users_.in 2.0.69-1/plugins/node.d/nomadix_users_.in
--- 2.0.57-1/plugins/node.d/nomadix_users_.in	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/plugins/node.d/nomadix_users_.in	2021-11-22 22:12:17.000000000 +0000
@@ -32,14 +32,17 @@ Should be rewritten as a autoconfigurabl
 name, not sure how specific the OIDs it presents are) plugin using the
 Plugin::SNMP module.
 
-=head1 AUTHOR
+=head1 AUTHORS
 
-(C) Copyright 2006-2009.  Written by Espen Braastad, Linpro AS for OSL
-(2006) Further modified by Erik Inge BolsÃ¸, Linpro AS for OSL (2007)
+Copyright (C) 2006-2009 Espen Braastad, Linpro AS for OSL
+
+Copyright (C) 2007 Erik Inge BolsÃ¸, Linpro AS for OSL
 
 =head1 LICENSE
 
-GPLv2.
+GPLv2
+
+SPDX-License-Identifier: GPL-2.0-only
 
 =head1 MAGIC MARKERS
 
diff -pruN 2.0.57-1/plugins/node.d/ntp_.in 2.0.69-1/plugins/node.d/ntp_.in
--- 2.0.57-1/plugins/node.d/ntp_.in	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/plugins/node.d/ntp_.in	2021-11-22 22:12:17.000000000 +0000
@@ -53,23 +53,35 @@ Same as munin.
 use English qw( -no_match_vars );
 use strict;
 use warnings;
-use Net::DNS;
-use Net::IP;
+# work around "strict" check for this variable exported by "Net::IP"
+my $ip_identical;
+eval {
+    no warnings "once";
+    require Net::DNS;
+    Net::DNS->import();
+    require Net::IP;
+    Net::IP->import();
+    $ip_identical = $Net::IP::IP_IDENTICAL;
+};
+my $has_requirements = $EVAL_ERROR ? 0 : 1;
+
 
 if ($ARGV[0] and $ARGV[0] eq "autoconf") {
-        `ntpq -c help >/dev/null 2>/dev/null`;
-        if ($CHILD_ERROR eq "0") {
-                if (`ntpq -n -c peers | wc -l` > 0) {
-                        print "yes\n";
-                        exit 0;
+        if (!$has_requirements) {
+                print "no (missing Net::DNS or Net::IP modules)\n";
+        } else {
+                `ntpq -c help >/dev/null 2>/dev/null`;
+                if ($CHILD_ERROR eq "0") {
+                        if (`ntpq -n -c peers | wc -l` > 0) {
+                                print "yes\n";
+                        } else {
+                                print "no (ntpq -p returned no peers)\n";
+                        }
                 } else {
-                        print "no (ntpq -p returned no peers)\n";
-                        exit 0;
+                        print "no (ntpq not found)\n";
                 }
-        } else {
-                print "no (ntpq not found)\n";
-                exit 0;
         }
+        exit 0;
 }
 
 if ($ARGV[0] and $ARGV[0] eq "suggest") {
@@ -104,10 +116,10 @@ if ($ARGV[0] and $ARGV[0] eq "config") {
         exit 0;
 }
 
-my $srcadr;
-my $delay;
-my $offset;
-my $jitter;
+my $srcadr = "";
+my $delay = "U";
+my $offset = "U";
+my $jitter = "U";
 my @associations = `ntpq -c associations`;
 
 foreach my $line (@associations) {
@@ -162,7 +174,7 @@ if (lc($srcadr) ne lc($name)) {
                         ($srcadr) = new Net::IP($srcadr);
 
                         ADDRS: foreach my $addr (@addresses) {
-                                if (defined($srcadr->overlaps($addr)) and $srcadr->overlaps($addr) == $IP_IDENTICAL) {
+                                if (defined($srcadr->overlaps($addr)) and $srcadr->overlaps($addr) == $ip_identical) {
                                         $matched = 1;
                                         last ASSOCS;
                                 }
diff -pruN 2.0.57-1/plugins/node.d/ntp_kernel_err.in 2.0.69-1/plugins/node.d/ntp_kernel_err.in
--- 2.0.57-1/plugins/node.d/ntp_kernel_err.in	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/plugins/node.d/ntp_kernel_err.in	2021-11-22 22:12:17.000000000 +0000
@@ -51,9 +51,10 @@ fi
 
 printf 'ntp_err.value '
 
-if [ "$(ntpq -c version | grep --extended-regexp --only-matching '[[:digit:]]\.[[:digit:]]\.[[:digit:]]' | tr -d '.')" -ge 427 ]
-then
-    ntpq -c kerninfo | awk '/^estimated error:/ { print $3 / 1000 }'
+ntpq_name=$(ntpq -c version | sed 's/[^[:alpha:]].*//')
+ntpq_version=$(ntpq -c version | grep --extended-regexp --only-matching '[[:digit:]]\.[[:digit:]]\.[[:digit:]]')
+if [ "$ntpq_name" = "ntpq" ] && [ "$(echo "$ntpq_version" | tr -d '.')" -lt 427 ]; then
+    ntpdc -c kerninfo | awk '/^estimated error:/ { printf("%.9f\n", $3) }'
 else
-    ntpdc -c kerninfo | awk '/^estimated error:/ { print $3 }'
+    ntpq -c kerninfo | awk '/^estimated error:/ { printf("%.9f\n", $3 / 1000) }'
 fi
diff -pruN 2.0.57-1/plugins/node.d/ntp_kernel_pll_freq.in 2.0.69-1/plugins/node.d/ntp_kernel_pll_freq.in
--- 2.0.57-1/plugins/node.d/ntp_kernel_pll_freq.in	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/plugins/node.d/ntp_kernel_pll_freq.in	2021-11-22 22:12:17.000000000 +0000
@@ -23,10 +23,6 @@ Unknown author
 
 GPLv2
 
-=head1 BUGS
-
-Handling of $fcomp is unquoted, and may cause trouble.
-
 =head1 MAGIC MARKERS
 
  #%# family=auto
@@ -65,11 +61,12 @@ fi
 
 printf 'ntp_pll_freq.value '
 
-if [ "$(ntpq -c version | grep --extended-regexp --only-matching '[[:digit:]]\.[[:digit:]]\.[[:digit:]]' | tr -d '.')" -ge 427 ]
-then
-    cmd=ntpq
-else
+ntpq_name=$(ntpq -c version | sed 's/[^[:alpha:]].*//')
+ntpq_version=$(ntpq -c version | grep --extended-regexp --only-matching '[[:digit:]]\.[[:digit:]]\.[[:digit:]]')
+if [ "$ntpq_name" = "ntpq" ] && [ "$(echo "$ntpq_version" | tr -d '.')" -lt 427 ]; then
     cmd=ntpdc
+else
+    cmd=ntpq
 fi
 
-$cmd -c kerninfo | awk -v fcomp=$fcomp '/^pll frequency:/ { print $3 + fcomp }'
+"$cmd" -c kerninfo | awk -v "fcomp=$fcomp" '/^pll frequency:/ { printf("%.9f\n", $3 + fcomp) }'
diff -pruN 2.0.57-1/plugins/node.d/ntp_kernel_pll_off.in 2.0.69-1/plugins/node.d/ntp_kernel_pll_off.in
--- 2.0.57-1/plugins/node.d/ntp_kernel_pll_off.in	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/plugins/node.d/ntp_kernel_pll_off.in	2021-11-22 22:12:17.000000000 +0000
@@ -51,9 +51,10 @@ fi
 
 printf 'ntp_pll_off.value '
 
-if [ "$(ntpq -c version | grep --extended-regexp --only-matching '[[:digit:]]\.[[:digit:]]\.[[:digit:]]' | tr -d '.')" -ge 427 ]
-then
-    ntpq -c kerninfo | awk '/^pll offset:/ { print $3 / 1000 }'
+ntpq_name=$(ntpq -c version | sed 's/[^[:alpha:]].*//')
+ntpq_version=$(ntpq -c version | grep --extended-regexp --only-matching '[[:digit:]]\.[[:digit:]]\.[[:digit:]]')
+if [ "$ntpq_name" = "ntpq" ] && [ "$(echo "$ntpq_version" | tr -d '.')" -lt 427 ]; then
+    ntpdc -c kerninfo | awk '/^pll offset:/ { printf("%.9f\n", $3) }'
 else
-    ntpdc -c kerninfo | awk '/^pll offset:/ { print $3 }'
+    ntpq -c kerninfo | awk '/^pll offset:/ { printf("%.9f\n", $3 / 1000) }'
 fi
diff -pruN 2.0.57-1/plugins/node.d/ntp_offset.in 2.0.69-1/plugins/node.d/ntp_offset.in
--- 2.0.57-1/plugins/node.d/ntp_offset.in	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/plugins/node.d/ntp_offset.in	2021-11-22 22:12:17.000000000 +0000
@@ -37,6 +37,7 @@ Loosely based on ntp_ plugin, but rework
 
 =cut
 
+. "$MUNIN_LIBDIR/plugins/plugin.sh"
 
 nodelay=${nodelay:-}
 
@@ -87,6 +88,9 @@ EOF
     case $nodelay in
 	1) echo "delay.graph no";;
     esac
+    print_thresholds delay
+    print_thresholds offset
+    print_thresholds critical
 }
 
 do_ () {
diff -pruN 2.0.57-1/plugins/node.d/ntp_states.in 2.0.69-1/plugins/node.d/ntp_states.in
--- 2.0.57-1/plugins/node.d/ntp_states.in	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/plugins/node.d/ntp_states.in	2021-11-22 22:12:17.000000000 +0000
@@ -42,13 +42,34 @@ use Munin::Plugin;
 use strict;
 use warnings;
 use File::Spec;
-use Net::DNS;
+eval { require Net::DNS; Net::DNS->import(); };
+my $has_net_dns = $EVAL_ERROR ? 0 : 1;
 
 # Include /usr/local/sbin in the path to use the ntpq installed by
 # ports on FreeBSD instead of the base system, which is probably
 # older.
 $ENV{'PATH'} = File::Spec->catdir(File::Spec->rootdir(), 'usr', 'local', 'sbin') . ":" . $ENV{'PATH'};
 
+if ($ARGV[0] and $ARGV[0] eq "autoconf") {
+        if (!$has_net_dns) {
+                print "no (missing perl module Net::DNS)\n";
+        } else {
+                `ntpq -c help >/dev/null 2>/dev/null`;
+                if ($CHILD_ERROR eq "0") {
+                        if (`ntpq -n -c peers | wc -l` > 0) {
+                                print "yes\n";
+                        } else {
+                                print "no (ntpq -p returned no peers)\n";
+                        }
+                } else {
+                        print "no (ntpq not found)\n";
+                }
+        }
+        exit 0;
+}
+
+die "Aborting due to missing perl module 'Net::DNS'" unless ($has_net_dns);
+
 my %stateval = (
                  "reject"    => 0,
                  "falsetick" => 1,
@@ -140,22 +161,6 @@ sub make_names {
         return ($fieldname, $hostname);
 }
 
-if ($ARGV[0] and $ARGV[0] eq "autoconf") {
-        `ntpq -c help >/dev/null 2>/dev/null`;
-        if ($CHILD_ERROR eq "0") {
-                if (`ntpq -n -c peers | wc -l` > 0) {
-                        print "yes\n";
-                        exit 0;
-                } else {
-                        print "no (ntpq -p returned no peers)\n";
-                        exit 0;
-                }
-        } else {
-                print "no (ntpq not found)\n";
-                exit 0;
-        }
-}
-
 &make_hash;
 
 if ($ARGV[0] and $ARGV[0] eq "config") {
diff -pruN 2.0.57-1/plugins/node.d/nvidia_.in 2.0.69-1/plugins/node.d/nvidia_.in
--- 2.0.57-1/plugins/node.d/nvidia_.in	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/plugins/node.d/nvidia_.in	2021-11-22 22:12:17.000000000 +0000
@@ -43,8 +43,6 @@ the output of the program.
 
 =head1 VERSION
 
-  $Id$
-
 Tested with nvclock version 0.8b3a on a nVidia Geforce 8600GT.
 
 =head1 BUGS
diff -pruN 2.0.57-1/plugins/node.d/openvpn.in 2.0.69-1/plugins/node.d/openvpn.in
--- 2.0.57-1/plugins/node.d/openvpn.in	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/plugins/node.d/openvpn.in	2021-11-22 22:12:17.000000000 +0000
@@ -32,7 +32,7 @@ The default configuration is
 
 =head1 AUTHOR
 
-Copyright (C) 2005 Rodolphe Quiedeville <rodolphe@quiedeville.org>
+Copyright (C) 2005 Rodolphe QuiÃ©deville <rodolphe@quiedeville.org>
 
 =head1 LICENSE
 
diff -pruN 2.0.57-1/plugins/node.d/ping_.in 2.0.69-1/plugins/node.d/ping_.in
--- 2.0.57-1/plugins/node.d/ping_.in	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/plugins/node.d/ping_.in	2021-11-22 22:12:17.000000000 +0000
@@ -59,18 +59,33 @@ Foundation, Inc., 51 Franklin Street, Fi
 
 case $0 in
     *ping6_*)
-        PING=ping6
+        # use "ping6" if available - otherwise fall back to "ping"
+        if command -v ping6 >/dev/null; then
+            ping_func() { ping6 "$@"; }
+        else
+            ping_func() { ping -6 "$@"; }
+        fi
         file_host=${0##*/ping6_}
         V=IPv6
         ;;
     *ping_*)
-        PING=ping
+        if command -v ping4 >/dev/null; then
+            ping_func() { ping4 "$@"; }
+        else
+            # Some implementations (e.g. "inetutils-ping") do not support the "-4" argument.
+            # This careful approach sadly prohibits the explicit selection of the IPv4 address
+            # family.  Thus we are just hoping for the best (as this plugin always did).
+            ping_func() { ping "$@"; }
+        fi
         file_host=${0##*/ping_}
         V=IPv4
         ;;
 esac
 
 host=${host:-${file_host:-www.google.com}}
+if [ -n "${ping:-}" ]; then
+    ping_func() { "$ping" "$@"; }
+fi
 
 if [ "$1" = "config" ]; then
         echo "graph_title $V ping times to $host"
@@ -91,5 +106,5 @@ fi
 
 
 # shellcheck disable=SC2086
-"${ping:-$PING}" ${ping_args:-'-c 2'} "${host}" ${ping_args2:-} \
+ping_func ${ping_args:-'-c 2'} "${host}" ${ping_args2:-} \
 	| perl -n -e 'print "ping.value ", $1 / 1000, "\n" if m@min/avg/max.*\s\d+(?:\.\d+)?/(\d+(?:\.\d+)?)/\d+(?:\.\d+)?@; print "packetloss.value $1\n" if /(\d+)% packet loss/;'
diff -pruN 2.0.57-1/plugins/node.d/postfix_mailqueue.in 2.0.69-1/plugins/node.d/postfix_mailqueue.in
--- 2.0.57-1/plugins/node.d/postfix_mailqueue.in	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/plugins/node.d/postfix_mailqueue.in	2021-11-22 22:12:17.000000000 +0000
@@ -52,7 +52,7 @@ Unreadable or damaged queue files are mo
 =head1 CONFIGURATION
 
 By default "postconf -h queue_directory" is used to determine the
-spool directory.  Is postconf is not available in the $PATH then
+spool directory.  If postconf is not available in the $PATH then
 /var/spool/postfix is assumed.  This can be overridden by the
 "spooldir" environment variable like so:
 
@@ -81,11 +81,13 @@ munin-node.
 
 =cut
 
-# atempt to get spooldir via postconf, but environment overrides.
-
+# Attempt to get spooldir via postconf, but environment overrides.
 # Remember that postconf is not available unless postfix is.
-POSTCONFSPOOL="$(postconf -h queue_directory 2>/dev/null || echo /var/spool/postfix)"
-SPOOLDIR=${spooldir:-$POSTCONFSPOOL}
+if [ -n "${spooldir}" ]; then
+    SPOOLDIR=${spooldir}
+else
+    SPOOLDIR="$(postconf -h queue_directory 2>/dev/null || echo /var/spool/postfix)"
+fi
 
 . "$MUNIN_LIBDIR/plugins/plugin.sh"
 
diff -pruN 2.0.57-1/plugins/node.d/postfix_mailvolume.in 2.0.69-1/plugins/node.d/postfix_mailvolume.in
--- 2.0.57-1/plugins/node.d/postfix_mailvolume.in	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/plugins/node.d/postfix_mailvolume.in	2021-11-22 22:12:17.000000000 +0000
@@ -106,7 +106,7 @@ sub parseLogfile {
 
 if ( $ARGV[0] and $ARGV[0] eq "autoconf" ) {
     my $logfile;
-    `which postconf >/dev/null 2>/dev/null`;
+    `sh -c 'command -v postconf' >/dev/null`;
     if (!$?) {
         $logfile = "$LOGDIR/$LOGFILE";
 
diff -pruN 2.0.57-1/plugins/node.d/postgres_querylength_.in 2.0.69-1/plugins/node.d/postgres_querylength_.in
--- 2.0.57-1/plugins/node.d/postgres_querylength_.in	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/plugins/node.d/postgres_querylength_.in	2021-11-22 22:12:17.000000000 +0000
@@ -65,11 +65,17 @@ my $pg = Munin::Plugin::Pgsql->new(
     info      => 'Most long-running queries and transactions',
     vlabel    => 'Age (seconds)',
     basequery => [
-        "SELECT 'query',COALESCE(max(extract(epoch FROM CURRENT_TIMESTAMP-query_start)),0) FROM pg_stat_activity WHERE state NOT LIKE 'idle%' %%FILTER%%
+        "SELECT 'query',COALESCE(max(extract(epoch FROM CURRENT_TIMESTAMP-query_start)),0) FROM pg_stat_activity WHERE (state NOT LIKE 'idle%' AND xact_start IS NOT NULL) %%FILTER%%
                      UNION ALL
                     SELECT 'transaction',COALESCE(max(extract(epoch FROM CURRENT_TIMESTAMP-xact_start)),0) FROM pg_stat_activity WHERE 1=1 %%FILTER%%",
         [
-            9.1,
+            9.6,
+            "SELECT 'query',COALESCE(max(extract(epoch FROM CURRENT_TIMESTAMP-query_start)),0) FROM pg_stat_activity WHERE state NOT LIKE 'idle%' %%FILTER%%
+                     UNION ALL
+                    SELECT 'transaction',COALESCE(max(extract(epoch FROM CURRENT_TIMESTAMP-xact_start)),0) FROM pg_stat_activity WHERE 1=1 %%FILTER%%",
+        ],
+        [
+            9.4,
             "SELECT 'query',COALESCE(max(extract(epoch FROM CURRENT_TIMESTAMP-query_start)),0) FROM pg_stat_activity WHERE query NOT LIKE '<IDLE%' %%FILTER%%
                      UNION ALL
                     SELECT 'transaction',COALESCE(max(extract(epoch FROM CURRENT_TIMESTAMP-xact_start)),0) FROM pg_stat_activity WHERE 1=1 %%FILTER%%",
diff -pruN 2.0.57-1/plugins/node.d/proxy_plugin.in 2.0.69-1/plugins/node.d/proxy_plugin.in
--- 2.0.57-1/plugins/node.d/proxy_plugin.in	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/plugins/node.d/proxy_plugin.in	2021-11-22 22:12:17.000000000 +0000
@@ -23,10 +23,6 @@ The following environment settings are t
 
   #%# family=manual
 
-=head1 VERSION
-
-  $Id$
-
 =head1 BUGS
 
 The plugin is currently hardcoded to require multigraph. There may be usecases
diff -pruN 2.0.57-1/plugins/node.d/samba.in 2.0.69-1/plugins/node.d/samba.in
--- 2.0.57-1/plugins/node.d/samba.in	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/plugins/node.d/samba.in	2021-11-22 22:12:17.000000000 +0000
@@ -39,7 +39,7 @@ GPLv2
 
 =cut
 
-SMBSTATUS=${smbstatus:-$(which smbstatus)}
+SMBSTATUS=${smbstatus:-$(command -v smbstatus)}
 SMBSTATUS=${SMBSTATUS:-/usr/bin/smbstatus}
 
 if [ "$1" = "autoconf" ]; then
diff -pruN 2.0.57-1/plugins/node.d/sendmail_mailstats.in 2.0.69-1/plugins/node.d/sendmail_mailstats.in
--- 2.0.57-1/plugins/node.d/sendmail_mailstats.in	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/plugins/node.d/sendmail_mailstats.in	2021-11-22 22:12:17.000000000 +0000
@@ -34,7 +34,7 @@ GPLv2
 =cut
 
 
-MAILSTATS=${mailstats:-$(which mailstats 2>/dev/null)}
+MAILSTATS=${mailstats:-$(command -v mailstats)}
 
 
 if [ "$1" = "autoconf" ]; then
diff -pruN 2.0.57-1/plugins/node.d/sendmail_mailtraffic.in 2.0.69-1/plugins/node.d/sendmail_mailtraffic.in
--- 2.0.57-1/plugins/node.d/sendmail_mailtraffic.in	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/plugins/node.d/sendmail_mailtraffic.in	2021-11-22 22:12:17.000000000 +0000
@@ -34,7 +34,7 @@ GPLv2
 =cut
 
 
-MAILSTATS=${mailstats:-$(which mailstats 2>/dev/null)}
+MAILSTATS=${mailstats:-$(command -v mailstats)}
 
 
 if [ "$1" = "autoconf" ]; then
diff -pruN 2.0.57-1/plugins/node.d/slapd_bdb_cache_.in 2.0.69-1/plugins/node.d/slapd_bdb_cache_.in
--- 2.0.57-1/plugins/node.d/slapd_bdb_cache_.in	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/plugins/node.d/slapd_bdb_cache_.in	2021-11-22 22:12:17.000000000 +0000
@@ -1,7 +1,7 @@
 #!@@PERL@@ -w
 # -*- perl -*-
 #
-# Plugin copyright Bjorn Ruberg <bjorn@ruberg.no> 2005-2009
+# Plugin copyright BjÃ¸rn Ruberg <bjorn@ruberg.no> 2005-2009
 #
 # Licensed under GPLv2. Be nice.
 #
diff -pruN 2.0.57-1/plugins/node.d/slapd_.in 2.0.69-1/plugins/node.d/slapd_.in
--- 2.0.57-1/plugins/node.d/slapd_.in	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/plugins/node.d/slapd_.in	2021-11-22 22:12:17.000000000 +0000
@@ -2,7 +2,7 @@
 # -*- perl -*-
 # vim: ft=perl
 
-# Copyright Bjorn Ruberg <bjorn@ruberg.no>
+# Copyright BjÃ¸rn Ruberg <bjorn@ruberg.no>
 # Licenced under GPL v2
 #
 # TODO:
diff -pruN 2.0.57-1/plugins/node.d/smart_.in 2.0.69-1/plugins/node.d/smart_.in
--- 2.0.57-1/plugins/node.d/smart_.in	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/plugins/node.d/smart_.in	2021-11-22 22:12:17.000000000 +0000
@@ -352,8 +352,8 @@ def find_smart_drives():
             try:
                 partitions = open('/proc/partitions', 'r')
                 lines = partitions.readlines()
-                for l in lines:
-                    words = l.split()
+                for line in lines:
+                    words = line.split()
                     if len(words) == 0 or words[0][0] not in string.digits:
                         continue
                     if words[0] in ['1', '9', '58', '254']:
diff -pruN 2.0.57-1/plugins/node.d/snmp__cpuload.in 2.0.69-1/plugins/node.d/snmp__cpuload.in
--- 2.0.57-1/plugins/node.d/snmp__cpuload.in	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/plugins/node.d/snmp__cpuload.in	2021-11-22 22:12:17.000000000 +0000
@@ -43,10 +43,6 @@ hrProcessorTable.
   #%# family=snmpauto
   #%# capabilities=snmpconf
 
-=head1 VERSION
-
-  $Id$
-
 =head1 BUGS
 
 None known.
diff -pruN 2.0.57-1/plugins/node.d/snmp__df.in 2.0.69-1/plugins/node.d/snmp__df.in
--- 2.0.57-1/plugins/node.d/snmp__df.in	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/plugins/node.d/snmp__df.in	2021-11-22 22:12:17.000000000 +0000
@@ -47,13 +47,10 @@ script.
 =cut
 
 use strict;
-use Net::SNMP;
+use Munin::Plugin::SNMP;
 
 my $MAXLABEL = 20;
 
-my $host      = $ENV{host}      || undef;
-my $port      = $ENV{port}      || 161;
-my $community = $ENV{community} || "public";
 my $iface     = $ENV{interface} || undef;
 
 my $response;
@@ -66,21 +63,6 @@ if (defined $ARGV[0] and $ARGV[0] eq "sn
 	exit 0;
 }
 
-if ($0 =~ /^(?:|.*\/)snmp_([^_]+)_df$/)
-{
-	$host  = $1;
-	if ($host =~ /^([^:]+):(\d+)$/)
-	{
-		$host = $1;
-		$port = $2;
-	}
-}
-elsif (!defined($host))
-{
-	print "# Debug: $0 -- $1\n" if $Munin::Plugin::SNMP::DEBUG;
-	die "# Error: couldn't understand what I'm supposed to monitor.";
-}
-
 # Partition level
 my $hrFSIndex              = "1.3.6.1.2.1.25.3.8.1.1."; # Should be more than 0
 my $hrFSMountPoint         = "1.3.6.1.2.1.25.3.8.1.2."; # Used to look up filesystem
@@ -93,16 +75,7 @@ my $hrStorageSize          = "1.3.6.1.2.
 my $hrStorageUsed          = "1.3.6.1.2.1.25.2.3.1.6."; # Data point 2
 
 
-my ($session, $error) = Net::SNMP->session(
-		-hostname  => $host,
-		-community => $community,
-		-port      => $port
-	);
-
-if (!defined ($session))
-{
-	die "Croaking: $error";
-}
+my $session = Munin::Plugin::SNMP->session();
 # Take a look at the partitions...
 
 my %partitions;
@@ -188,6 +161,7 @@ foreach my $part (keys %partitions)
 
 if (defined $ARGV[0] and $ARGV[0] eq "config")
 {
+	my ($host) = Munin::Plugin::SNMP->config_session();
 	print "host_name $host\n" unless $host eq 'localhost';
 	print "graph_title Disk usage in percent\n";
 	print "graph_args --upper-limit 100 -l 0\n";
diff -pruN 2.0.57-1/plugins/node.d/snmp__df_ram.in 2.0.69-1/plugins/node.d/snmp__df_ram.in
--- 2.0.57-1/plugins/node.d/snmp__df_ram.in	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/plugins/node.d/snmp__df_ram.in	2021-11-22 22:12:17.000000000 +0000
@@ -45,14 +45,10 @@ Foundation, Inc., 51 Franklin Street, Fi
 =cut
 
 use strict;
-use Net::SNMP;
+use Munin::Plugin::SNMP;
 
 my $MAXLABEL = 20;
 
-my $host      = $ENV{host}      || undef;
-my $port      = $ENV{port}      || 161;
-my $community = $ENV{community} || "public";
-
 my $response;
 
 if (defined $ARGV[0] and $ARGV[0] eq "snmpconf")
@@ -63,21 +59,6 @@ if (defined $ARGV[0] and $ARGV[0] eq "sn
 	exit 0;
 }
 
-if ($0 =~ /^(?:|.*\/)snmp_([^_]+)_df_ram$/)
-{
-	$host  = $1;
-	if ($host =~ /^([^:]+):(\d+)$/)
-	{
-		$host = $1;
-		$port = $2;
-	}
-}
-elsif (!defined($host))
-{
-	print "# Debug: $0 -- $1\n" if $Munin::Plugin::SNMP::DEBUG;
-	die "# Error: couldn't understand what I'm supposed to monitor.";
-}
-
 # Disk level
 my $hrDeviceType           = "1.3.6.1.2.1.25.3.2.1.2."; # Should be iso.3.6.1.2.1.25.3.1.6 (DiskStorage)
 my $hrDiskStorageRemoveble = "1.3.6.1.2.1.25.3.6.1.3."; # Should be false (2).
@@ -95,16 +76,7 @@ my $hrStorageSize          = "1.3.6.1.2.
 my $hrStorageUsed          = "1.3.6.1.2.1.25.2.3.1.6."; # Data point 2
 
 
-my ($session, $error) = Net::SNMP->session(
-		-hostname  => $host,
-		-community => $community,
-		-port      => $port
-	);
-
-if (!defined ($session))
-{
-	die "Croaking: $error";
-}
+my $session = Munin::Plugin::SNMP->session();
 
 # First we want to find the harddisks...
 my $correct_capacity  = get_by_regex ($session, $hrDiskStorageCapacity, "[1-9]");
@@ -170,6 +142,7 @@ if ($foundpartitions == 0 or defined $pa
 
 if (defined $ARGV[0] and $ARGV[0] eq "config")
 {
+	my ($host) = Munin::Plugin::SNMP->config_session();
 	print "host_name $host\n" unless $host eq 'localhost';
 	print "graph_title Memory usage in percent\n";
 	print "graph_args --upper-limit 100 -l 0\n";
diff -pruN 2.0.57-1/plugins/node.d/snmp__if_err_.in 2.0.69-1/plugins/node.d/snmp__if_err_.in
--- 2.0.57-1/plugins/node.d/snmp__if_err_.in	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/plugins/node.d/snmp__if_err_.in	2021-11-22 22:12:17.000000000 +0000
@@ -19,8 +19,8 @@ As a rule SNMP plugins need site specifi
 configuration (shown here) will only work on insecure sites/devices:
 
    [snmp_*]
-	env.version 2
-        env.community public
+   env.version 2
+   env.community public
 
 In general SNMP is not very secure at all unless you use SNMP version
 3 which supports authentication and privacy (encryption).  But in any
@@ -29,6 +29,19 @@ case the community string for your devic
 Please see 'perldoc Munin::Plugin::SNMP' for further configuration
 information.
 
+Specific interface names (labels) are determined via the SNMP OID for
+aliases (1.3.6.1.2.1.31.1.1.1.18.*).  These can be overridden via the
+"alias" environment variable:
+
+   [snmp_hostname.fqdn_if_2]
+   env.alias WAN
+
+The symlink name of the plugin determines the host and the switch
+port.  The switch port may be a number or the interface name
+(e.g. "ethN.VID@ethN").  This is primarily useful on devices where
+the interface number is not guaranteed to be consistent, such as is
+the case with some Linux based systems.
+
 =head1 INTERPRETATION
 
 The graph shows a stright forward gauge of errors per second.  This
@@ -46,10 +59,6 @@ and IF-MIB::ifOutErrors.
   #%# family=snmpauto
   #%# capabilities=snmpconf
 
-=head1 VERSION
-
-  $Id$
-
 =head1 BUGS
 
 None known.
@@ -58,11 +67,11 @@ Earlier versions of this plugin only rep
 ifOutErrors numbers.  This does not encompas all errors on a interface
 therefore the change.
 
-=head1 AUTHOR
+=head1 AUTHORS
 
-Copyright (C) 2004-2009.  Original authors Jimmy Olsen, Dagfinn Ilmari
-Mannsaaker.  Porting to Munin::Plugin::SNMP, documentation, grooming
-and updates by Nicolai Langfeldt
+Copyright (C) 2004 Jimmy Olsen
+Copyright (C) 2005 Dagfinn Ilmari MannsÃ¥ker
+Copyright (C) 2009 Nicolai Langfeldt
 
 =head1 LICENSE
 
@@ -87,8 +96,17 @@ my ($host) = Munin::Plugin::SNMP->config
 
 my $iface;
 
+my $session = Munin::Plugin::SNMP->session();
+
 if ($Munin::Plugin::me =~ /if_err_(\d+)$/) {
     $iface = $1;
+} elsif ($Munin::Plugin::me =~ /_if_err_([\w\@.-]+)$/) {
+    my $ifAliasContainer = "1.3.6.1.2.1.31.1.1.1.18.";
+    my $if_alias = $session->get_by_regex($ifAliasContainer, "^$1\$");
+    if (keys(%{$if_alias}) != 1) {
+	die "Could not determine interface number from ".$Munin::Plugin::me."\n";
+    }
+    $iface = (keys %{$if_alias})[0];
 } else {
     die "Could not determine interface number from ".$Munin::Plugin::me."\n";
 }
@@ -104,18 +122,17 @@ my $ifInUnknownProtos= "1.3.6.1.2.1.2.2.
 my $ifOutDiscards    = "1.3.6.1.2.1.2.2.1.19.$iface";
 my $ifOutErrors      = "1.3.6.1.2.1.2.2.1.20.$iface";
 
-my $session = Munin::Plugin::SNMP->session();
-
 if ($ARGV[0] and $ARGV[0] eq "config") {
     my ($host) = Munin::Plugin::SNMP->config_session();
 
     print "host_name $host\n" unless $host eq 'localhost';
 
-    my $alias = $session->get_single($ifEntryAlias) ||
+    my $alias = $ENV{alias} ||
+      $session->get_single($ifEntryAlias) ||
       $session->get_single($ifEntryDescr) ||
 	"Interface $iface";
 
-    if (! ($alias =~ /\d+/) ) {
+    if (! ($alias =~ /\d+/ or defined($ENV{alias})) ) {
 	# If there are no numbers in the $alias add the if index
 	$alias .=" (if $iface)";
     }
diff -pruN 2.0.57-1/plugins/node.d/snmp__if_.in 2.0.69-1/plugins/node.d/snmp__if_.in
--- 2.0.57-1/plugins/node.d/snmp__if_.in	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/plugins/node.d/snmp__if_.in	2021-11-22 22:12:17.000000000 +0000
@@ -19,8 +19,8 @@ As a rule SNMP plugins need site specifi
 configuration (shown here) will only work on insecure sites/devices:
 
    [snmp_*]
-	env.version 2
-        env.community public
+   env.version 2
+   env.community public
 
 In general SNMP is not very secure at all unless you use SNMP version
 3 which supports authentication and privacy (encryption).  But in any
@@ -29,6 +29,20 @@ case the community string for your devic
 Please see 'perldoc Munin::Plugin::SNMP' for further configuration
 information.
 
+Specific interface names (labels) are determined via the SNMP OID for
+aliases (1.3.6.1.2.1.31.1.1.1.18.*).  These can be overridden via the
+"alias" environment variable:
+
+   [snmp_hostname.fqdn_if_2]
+   env.alias WAN
+
+The symlink name of the plugin determines the host and the switch
+port.  The switch port may be a number or the interface name
+(e.g. "ethN.VID@ethN").  This is primarily useful on devices where
+the interface number is not guaranteed to be consistent, such as is
+the case with some Linux based systems.
+
+
 =head1 INTERPRETATION
 
 The graph shows a stright forward "bits per second" incomming and
@@ -52,10 +66,6 @@ counters (see FEATURES below).
   #%# family=snmpauto
   #%# capabilities=snmpconf
 
-=head1 VERSION
-
-  $Id$
-
 =head1 BUGS
 
 None known.
@@ -80,7 +90,7 @@ around.
 
 =head1 AUTHOR
 
-Copyright (C) 2004-2009 Jimmy Olsen, Daginn Ilmari Mannsaaker.
+Copyright (C) 2004-2009 Jimmy Olsen, Daginn Ilmari MannsÃ¥ker.
 Documentation, porting to Munin::Plugin::SNMP and further grooming by
 Nicolai Langfeldt.
 
@@ -130,9 +140,22 @@ if (defined $ARGV[0] and $ARGV[0] eq "sn
 	exit 0;
 }
 
+my ($session, $error);
+
+# SNMP needed for both config and fetch.
+$session = Munin::Plugin::SNMP->session();
+$session->translate([-nosuchinstance => 0]);
+
 if ($Munin::Plugin::me =~ /_if_(\d+)$/) {
     # Also accept leading 0 like (snmp_router_if_01 .. snmp_router_if_24)
     $iface = int $1;
+} elsif ($Munin::Plugin::me =~ /_if_([\w\@.-]+)$/) {
+    my $ifAliasContainer = "1.3.6.1.2.1.31.1.1.1.18.";
+    my $if_alias = $session->get_by_regex($ifAliasContainer, "^$1\$");
+    if (keys(%{$if_alias}) != 1) {
+	die "Could not determine interface number from ".$Munin::Plugin::me."\n";
+    }
+    $iface = (keys %{$if_alias})[0];
 } else {
     die "Could not determine interface number from ".$Munin::Plugin::me."\n";
 }
@@ -149,22 +172,17 @@ my $ifEntryAlias       = "1.3.6.1.2.1.31
 my $ifEntryIn64Octets  = "1.3.6.1.2.1.31.1.1.1.6.$iface";
 my $ifEntryOut64Octets = "1.3.6.1.2.1.31.1.1.1.10.$iface";
 
-my ($session, $error);
-
-# SNMP needed for both config and fetch.
-$session = Munin::Plugin::SNMP->session();
-$session->translate([-nosuchinstance => 0]);
-
 if ($ARGV[0] and $ARGV[0] eq "config") {
     my ($host,undef,$version) = Munin::Plugin::SNMP->config_session();
 
     print "host_name $host\n" unless $host eq 'localhost';
 
-    my $alias = $session->get_single($ifEntryAlias) ||
+    my $alias = $ENV{alias} ||
+      $session->get_single($ifEntryAlias) ||
       $session->get_single($ifEntryDescr) ||
 	"Interface $iface";
 
-    if (! ($alias =~ /\d+/) ) {
+    if (! ($alias =~ /\d+/ or defined($ENV{alias})) ) {
 	# If there are no numbers in the $alias add the if index
 	$alias .=" (if $iface)";
     }
diff -pruN 2.0.57-1/plugins/node.d/snmp__if_multi.in 2.0.69-1/plugins/node.d/snmp__if_multi.in
--- 2.0.57-1/plugins/node.d/snmp__if_multi.in	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/plugins/node.d/snmp__if_multi.in	2021-11-22 22:12:17.000000000 +0000
@@ -123,11 +123,11 @@ around.
 
 =head1 AUTHOR
 
-Copyright (C) 2004-2010 Jimmy Olsen, Dagfinn Ilmari Mannsaaker,
+Copyright (C) 2004-2010 Jimmy Olsen, Dagfinn Ilmari MannsÃ¥ker,
 Nicolai Langfeldt, Redpill Linpro AS and others.
 
 Original snmp__if_ plugin: Copyright (C) 2004-2009 Jimmy Olsen, Dagfinn
-Ilmari Mannsaaker.
+Ilmari MannsÃ¥ker.
 
 Initial SNMPv3 support by "Confusedhacker".
 
diff -pruN 2.0.57-1/plugins/node.d/snmp__load.in 2.0.69-1/plugins/node.d/snmp__load.in
--- 2.0.57-1/plugins/node.d/snmp__load.in	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/plugins/node.d/snmp__load.in	2021-11-22 22:12:17.000000000 +0000
@@ -46,17 +46,13 @@ It reports the contents of the laLoad.2
   #%# family=snmpauto
   #%# capabilities=snmpconf
 
-=head1 VERSION
-
-  $Id$
-
 =head1 BUGS
 
 None known.
 
 =head1 AUTHOR
 
-Copyright (C) 2004 Jimmy Olsen, Dagfinn Ilmari Mannsaaker
+Copyright (C) 2004 Jimmy Olsen, Dagfinn Ilmari MannsÃ¥ker
 
 Documented and updated to use Munin::Plugin::SNMP by Matthew Boyle.
 
diff -pruN 2.0.57-1/plugins/node.d/snmp__netapp_diskusage_.in 2.0.69-1/plugins/node.d/snmp__netapp_diskusage_.in
--- 2.0.57-1/plugins/node.d/snmp__netapp_diskusage_.in	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/plugins/node.d/snmp__netapp_diskusage_.in	2021-11-22 22:12:17.000000000 +0000
@@ -46,8 +46,6 @@ Network Appliance. It reports the conten
 
 v1.0 - 06/22/2009 14:05:03 CEST Initial revision
 
-  $Id$
-
 =head1 AUTHOR
 
 This plugin is copyright (c) 2009 by Guillaume Blairon.
diff -pruN 2.0.57-1/plugins/node.d/snmp__netapp_inodeusage_.in 2.0.69-1/plugins/node.d/snmp__netapp_inodeusage_.in
--- 2.0.57-1/plugins/node.d/snmp__netapp_inodeusage_.in	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/plugins/node.d/snmp__netapp_inodeusage_.in	2021-11-22 22:12:17.000000000 +0000
@@ -42,8 +42,6 @@ Network Appliance. It reports the conten
 v1.0 - 06/22/2009 14:05:03 CEST
 Initial revision
 
-  $Id$
-
 =head1 AUTHOR
 
 This plugin is copyright (c) 2009 by Guillaume Blairon.
diff -pruN 2.0.57-1/plugins/node.d/snmp__netstat.in 2.0.69-1/plugins/node.d/snmp__netstat.in
--- 2.0.57-1/plugins/node.d/snmp__netstat.in	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/plugins/node.d/snmp__netstat.in	2021-11-22 22:12:17.000000000 +0000
@@ -43,10 +43,6 @@ the contents of the tcpConnState column
   #%# family=snmpauto
   #%# capabilities=snmpconf
 
-=head1 VERSION
-
-  $Id$
-
 =head1 BUGS
 
 None known.
diff -pruN 2.0.57-1/plugins/node.d/snmp__print_pages.in 2.0.69-1/plugins/node.d/snmp__print_pages.in
--- 2.0.57-1/plugins/node.d/snmp__print_pages.in	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/plugins/node.d/snmp__print_pages.in	2021-11-22 22:12:17.000000000 +0000
@@ -44,7 +44,7 @@ For printers having duplex module: pages
 
 =head1 AUTHOR
 
-Copyright (C) 2006-2009 Rune Nordbøe Skillingstad
+Copyright (C) 2006-2009 Rune NordbÃ¸e Skillingstad
 
 =head1 LICENSE
 
diff -pruN 2.0.57-1/plugins/node.d/snmp__print_supplies.in 2.0.69-1/plugins/node.d/snmp__print_supplies.in
--- 2.0.57-1/plugins/node.d/snmp__print_supplies.in	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/plugins/node.d/snmp__print_supplies.in	2021-11-22 22:12:17.000000000 +0000
@@ -50,7 +50,7 @@ None known.
 
 =head1 AUTHOR
 
-Copyright (C) 2006-2009 Rune Nordbøe Skillingstad, Sveinung Marvik.
+Copyright (C) 2006-2009 Rune NordbÃ¸e Skillingstad, Sveinung Marvik.
 
 =head1 LICENSE
 
diff -pruN 2.0.57-1/plugins/node.d/snmp__processes.in 2.0.69-1/plugins/node.d/snmp__processes.in
--- 2.0.57-1/plugins/node.d/snmp__processes.in	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/plugins/node.d/snmp__processes.in	2021-11-22 22:12:17.000000000 +0000
@@ -42,10 +42,6 @@ reports the contents of the hrSystemProc
   #%# family=snmpauto
   #%# capabilities=snmpconf
 
-=head1 VERSION
-
-  $Id$
-
 =head1 BUGS
 
 None known.
@@ -55,7 +51,7 @@ exists.
 
 =head1 AUTHOR
 
-Copyright (C) 2004 Jimmy Olsen, Dagfinn Ilmari Mannsaaker
+Copyright (C) 2004 Jimmy Olsen, Dagfinn Ilmari MannsÃ¥ker
 
 Documented and updated to use Munin::Plugin::SNMP by Matthew Boyle
 in 2010.
diff -pruN 2.0.57-1/plugins/node.d/snmp__rdp_users.in 2.0.69-1/plugins/node.d/snmp__rdp_users.in
--- 2.0.57-1/plugins/node.d/snmp__rdp_users.in	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/plugins/node.d/snmp__rdp_users.in	2021-11-22 22:12:17.000000000 +0000
@@ -44,10 +44,6 @@ reports the hrSWRunName column of hrSWRu
   #%# family=snmpauto
   #%# capabilities=snmpconf
 
-=head1 VERSION
-
-  $Id$
-
 =head1 BUGS
 
 Unlikely to work on non-Windows RDP servers, since it relies on the
@@ -56,7 +52,7 @@ a thing as a non-Windows RDP server?
 
 =head1 AUTHOR
 
-Copyright (C) 2004 Rune Nordbøe Skillingstad
+Copyright (C) 2004 Rune NordbÃ¸e Skillingstad
 
 Documented and updated to use Munin::Plugin::SNMP by Matthew Boyle.
 
diff -pruN 2.0.57-1/plugins/node.d/snmp__sensors_fsc_bx_fan.in 2.0.69-1/plugins/node.d/snmp__sensors_fsc_bx_fan.in
--- 2.0.57-1/plugins/node.d/snmp__sensors_fsc_bx_fan.in	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/plugins/node.d/snmp__sensors_fsc_bx_fan.in	2021-11-22 22:12:17.000000000 +0000
@@ -26,7 +26,7 @@ Foundation, Inc., 51 Franklin Street, Fi
 
 =head1 AUTHOR
 
-Copyright (C) 2004 Dagfinn Ilmari Mannsaaker
+Copyright (C) 2004 Dagfinn Ilmari MannsÃ¥ker
 
 =head1 MAGIC MARKERS
 
diff -pruN 2.0.57-1/plugins/node.d/snmp__sensors_fsc_bx_temp.in 2.0.69-1/plugins/node.d/snmp__sensors_fsc_bx_temp.in
--- 2.0.57-1/plugins/node.d/snmp__sensors_fsc_bx_temp.in	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/plugins/node.d/snmp__sensors_fsc_bx_temp.in	2021-11-22 22:12:17.000000000 +0000
@@ -23,7 +23,7 @@ version 1.
 
 =head1 AUTHOR
 
-Copyright (C) 2004 Dagfinn Ilmari Mannsaaker
+Copyright (C) 2004 Dagfinn Ilmari MannsÃ¥ker
 
 =head1 LICENSE
 
diff -pruN 2.0.57-1/plugins/node.d/snmp__sensors_fsc_fan.in 2.0.69-1/plugins/node.d/snmp__sensors_fsc_fan.in
--- 2.0.57-1/plugins/node.d/snmp__sensors_fsc_fan.in	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/plugins/node.d/snmp__sensors_fsc_fan.in	2021-11-22 22:12:17.000000000 +0000
@@ -2,7 +2,7 @@
 # -*- perl -*-
 # vim: ft=perl
 #
-# Copyright (C) 2004 Dagfinn Ilmari Mannsaaker
+# Copyright (C) 2004 Dagfinn Ilmari MannsÃ¥ker
 #
 # This program is free software; you can redistribute it and/or
 # modify it under the terms of the GNU General Public License
diff -pruN 2.0.57-1/plugins/node.d/snmp__sensors_fsc_temp.in 2.0.69-1/plugins/node.d/snmp__sensors_fsc_temp.in
--- 2.0.57-1/plugins/node.d/snmp__sensors_fsc_temp.in	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/plugins/node.d/snmp__sensors_fsc_temp.in	2021-11-22 22:12:17.000000000 +0000
@@ -2,7 +2,7 @@
 # -*- perl -*-
 # vim: ft=perl
 #
-# Copyright (C) 2004 Dagfinn Ilmari Mannsaaker
+# Copyright (C) 2004 Dagfinn Ilmari MannsÃ¥ker
 #
 # This program is free software; you can redistribute it and/or
 # modify it under the terms of the GNU General Public License
diff -pruN 2.0.57-1/plugins/node.d/snmp__uptime.in 2.0.69-1/plugins/node.d/snmp__uptime.in
--- 2.0.57-1/plugins/node.d/snmp__uptime.in	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/plugins/node.d/snmp__uptime.in	2021-11-22 22:12:17.000000000 +0000
@@ -55,25 +55,19 @@ contents of the sysUpTimeInstance OID.
   #%# family=snmpauto
   #%# capabilities=snmpconf
 
-=head1 VERSION
-
-  $Id$
-
 =head1 BUGS
 
 None known.
 
 =head1 AUTHOR
 
-Copyright (C) 2000-2009 by various authors.
+Copyright (C) 2000-2009 by various authors
 
-Original Nagios plugin: SÃ©bastien Barbereau.
+Original Nagios plugin: SÃ©bastien Barbereau
 
-Introduced to Munin in 2006 based on the Nagios plugin by: Andreas
-Schuldei
+Copyright (C) 2006 Andreas Schuldei
 
-In 2008 updated for Munin::Plugin::SNMP and documented by Nicolai
-Langfeldt.
+Copyright (C) 2008 Nicolai Langfeldt
 
 =head1 LICENSE
 
diff -pruN 2.0.57-1/plugins/node.d/snmp__users.in 2.0.69-1/plugins/node.d/snmp__users.in
--- 2.0.57-1/plugins/node.d/snmp__users.in	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/plugins/node.d/snmp__users.in	2021-11-22 22:12:17.000000000 +0000
@@ -45,17 +45,13 @@ reports the contents of the hrSystemNumU
   #%# family=snmpauto
   #%# capabilities=snmpconf
 
-=head1 VERSION
-
-  $Id$
-
 =head1 BUGS
 
 None known.
 
 =head1 AUTHOR
 
-Copyright (C) 2004 Jimmy Olsen, Dagfinn Ilmari Mannsaaker
+Copyright (C) 2004 Jimmy Olsen, Dagfinn Ilmari MannsÃ¥ker
 
 Documented and updated to use Munin::Plugin::SNMP by Matthew Boyle.
 
diff -pruN 2.0.57-1/plugins/node.d/snmp__winload.in 2.0.69-1/plugins/node.d/snmp__winload.in
--- 2.0.57-1/plugins/node.d/snmp__winload.in	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/plugins/node.d/snmp__winload.in	2021-11-22 22:12:17.000000000 +0000
@@ -1,7 +1,7 @@
 #!@@PERL@@
 # -*- perl -*-
 #
-# Copyright (C) 2004-2006 Jimmy Olsen, Dagfinn Ilmari Mannsaaker
+# Copyright (C) 2004-2006 Jimmy Olsen, Dagfinn Ilmari MannsÃ¥ker
 #
 # This program is free software; you can redistribute it and/or
 # modify it under the terms of the GNU General Public License
diff -pruN 2.0.57-1/plugins/node.d/snmp__winmem.in 2.0.69-1/plugins/node.d/snmp__winmem.in
--- 2.0.57-1/plugins/node.d/snmp__winmem.in	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/plugins/node.d/snmp__winmem.in	2021-11-22 22:12:17.000000000 +0000
@@ -44,17 +44,13 @@ uses the contents of the hrSWRunPerfMem
   #%# family=snmpauto
   #%# capabilities=snmpconf
 
-=head1 VERSION
-
-  $Id$
-
 =head1 BUGS
 
 None known.
 
 =head1 AUTHOR
 
-Copyright (C) 2004-2006 Jimmy Olsen, Dagfinn Ilmari Mannsaaker
+Copyright (C) 2004-2006 Jimmy Olsen, Dagfinn Ilmari MannsÃ¥ker
 
 Documented and updated to use Munin::Plugin::SNMP by Matthew Boyle.
 
diff -pruN 2.0.57-1/plugins/node.d/squeezebox_.in 2.0.69-1/plugins/node.d/squeezebox_.in
--- 2.0.57-1/plugins/node.d/squeezebox_.in	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/plugins/node.d/squeezebox_.in	2021-11-22 22:12:17.000000000 +0000
@@ -58,7 +58,7 @@ PORT=${squeezecenter_port:-9090}
 NC=${netcat:-nc}
 
 if [ "$1" = "autoconf" ]; then
-        if ! which "$NC" 1>/dev/null 2>&1; then
+        if ! command -v "$NC" >/dev/null; then
 		echo "no (no netcat/nc binary found)"
 		exit 0
 	fi
diff -pruN 2.0.57-1/plugins/node.d/squid_objectsize.in 2.0.69-1/plugins/node.d/squid_objectsize.in
--- 2.0.57-1/plugins/node.d/squid_objectsize.in	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/plugins/node.d/squid_objectsize.in	2021-11-22 22:12:17.000000000 +0000
@@ -17,7 +17,7 @@ The following environment variables are
 
 =head1 AUTHOR
 
-Copyright 2008 Bjorn Ruberg
+Copyright 2008 BjÃ¸rn Ruberg
 
 =head1 NOTES
 
diff -pruN 2.0.57-1/plugins/node.d/tomcat_jvm.in 2.0.69-1/plugins/node.d/tomcat_jvm.in
--- 2.0.57-1/plugins/node.d/tomcat_jvm.in	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/plugins/node.d/tomcat_jvm.in	2021-11-22 22:12:17.000000000 +0000
@@ -50,7 +50,7 @@ tomcat-users.xml example:
 
 =head1 AUTHOR
 
-Rune Nordbøe Skillingstad <runesk@linpro.no>
+Rune NordbÃ¸e Skillingstad <runesk@linpro.no>
 
 =head1 LICENSE
 
diff -pruN 2.0.57-1/plugins/node.d/users.in 2.0.69-1/plugins/node.d/users.in
--- 2.0.57-1/plugins/node.d/users.in	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/plugins/node.d/users.in	2021-11-22 22:12:17.000000000 +0000
@@ -34,10 +34,6 @@ Only tested extensively on Linux.
   #%# family=auto
   #%# capabilities=autoconf
 
-=head1 VERSION
-
-  $Id$
-
 =head1 AUTHOR
 
 Copyright (C) 2004-2008.
diff -pruN 2.0.57-1/plugins/node.d/varnish_.in 2.0.69-1/plugins/node.d/varnish_.in
--- 2.0.57-1/plugins/node.d/varnish_.in	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/plugins/node.d/varnish_.in	2021-11-22 22:12:17.000000000 +0000
@@ -4,7 +4,7 @@
 # varnish_ - Munin plugin to for Varnish
 # Copyright (C) 2009  Redpill Linpro AS
 #
-# Author: Kristian Lyngstol <kristian@bohemians.org>
+# Author: Kristian LyngstÃ¸l <kristian@bohemians.org>
 #
 # 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
@@ -65,10 +65,6 @@ Each graph uses data from varnishstat.
  #%# family=auto
  #%# capabilities=autoconf suggest
 
-=head1 VERSION
-
- $Id$
-
 =head1 BUGS
 
 The hit_rate graph requires munin r2040 or newer to display
@@ -76,13 +72,13 @@ correctly.
 
 =head1 PATCHES-TO
 
-Please send patches to Kristian Lyngstol <kristian@bohemians.org>
+Please send patches to Kristian LyngstÃ¸l <kristian@bohemians.org>
 and/or varnish-misc@varnish-cache.org for significant changes. Munin SVN
 is the authoritative repository for this plugin.
 
 =head1 AUTHOR
 
-Kristian Lyngstol <kristian@bohemians.org>
+Kristian LyngstÃ¸l <kristian@bohemians.org>
 
 =head1 LICENSE
 
@@ -91,9 +87,12 @@ GPLv2
 =cut
 
 
-use XML::Parser;
 use strict;
 
+use English qw( -no_match_vars );
+eval { require XML::Parser; XML::Parser->import(); };
+my $has_xml_parser = $EVAL_ERROR ? 0 : 1;
+
 # Set to 1 to enable output when a variable is defined in a graph but
 # omitted because it doesn't exist in varnishstat.
 my $DEBUG = 0;
@@ -1008,9 +1007,9 @@ sub set_aspect
 # is 'no'.
 sub autoconf
 {
-	# XXX: Solaris outputs errors to stderr and always returns true.
-	# XXX: See #873
-	if (`which $varnishstatexec 2>/dev/null` =~ m{^/}) {
+	if (!$has_xml_parser) {
+		print "no (missing perl module XML::Parser)\n";
+	} elsif (`sh -c 'command -v "$varnishstatexec"'` =~ m{^/}) {
 		print "yes\n";
 	} else {
 		print "no ($varnishstatexec could not be found)\n";
diff -pruN 2.0.57-1/plugins/node.d/zimbra_.in 2.0.69-1/plugins/node.d/zimbra_.in
--- 2.0.57-1/plugins/node.d/zimbra_.in	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/plugins/node.d/zimbra_.in	2021-11-22 22:12:17.000000000 +0000
@@ -68,10 +68,6 @@ redistribute it and/or modify it under t
 Public License as published by the Free Software Foundation; version 2
 dated June, 1991.
 
-=head1 VERSION
-
-  $Id$
-
 =head1 MAGIC MARKERS
 
  #%# family=contrib
diff -pruN 2.0.57-1/plugins/node.d.cygwin/df.in 2.0.69-1/plugins/node.d.cygwin/df.in
--- 2.0.57-1/plugins/node.d.cygwin/df.in	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/plugins/node.d.cygwin/df.in	2021-11-22 22:12:17.000000000 +0000
@@ -33,7 +33,7 @@ Check smb/cifs remote mounts. (Cygwin bu
 
 =head1 AUTHOR
 
-Erik Inge Bolsø <knan-munin@anduin.net>
+Erik Inge BolsÃ¸ <knan-munin@anduin.net>
 
 =head1 LICENSE
 
diff -pruN 2.0.57-1/plugins/node.d.cygwin/netstat.in 2.0.69-1/plugins/node.d.cygwin/netstat.in
--- 2.0.57-1/plugins/node.d.cygwin/netstat.in	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/plugins/node.d.cygwin/netstat.in	2021-11-22 22:12:17.000000000 +0000
@@ -17,7 +17,7 @@ No configuration
 
 =head1 AUTHOR
 
-Erik Inge Bolsø <knan-munin@anduin.net>
+Erik Inge BolsÃ¸ <knan-munin@anduin.net>
 
 Based on node.d.linux/netstat, by unknown author.
 
diff -pruN 2.0.57-1/plugins/node.d.darwin/df_inode.in 2.0.69-1/plugins/node.d.darwin/df_inode.in
--- 2.0.57-1/plugins/node.d.darwin/df_inode.in	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/plugins/node.d.darwin/df_inode.in	2021-11-22 22:12:17.000000000 +0000
@@ -1,7 +1,5 @@
 #!@@GOODSH@@
 #
-# $Id$
-#
 # Plugin to monitor inode-usage.
 #
 # Parameters understood:
diff -pruN 2.0.57-1/plugins/node.d.darwin/if_err_.in 2.0.69-1/plugins/node.d.darwin/if_err_.in
--- 2.0.57-1/plugins/node.d.darwin/if_err_.in	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/plugins/node.d.darwin/if_err_.in	2021-11-22 22:12:17.000000000 +0000
@@ -44,7 +44,7 @@ INTERFACE=${0##*if_err_}
 
 case $1 in
     autoconf)
-        if which netstat >/dev/null; then
+        if command -v netstat >/dev/null; then
             echo yes
             exit 0
         else
@@ -53,7 +53,7 @@ case $1 in
         fi
         ;;
     suggest)
-        if which netstat >/dev/null; then
+        if command -v netstat >/dev/null; then
             netstat -nib | awk '$3 ~ /Link/ && $1 !~ /(Name|lo|gif|stf)/ && $5 != "0" && $7 != "0" { print $1 }'
         fi
         exit 0
diff -pruN 2.0.57-1/plugins/node.d.debug/env.in 2.0.69-1/plugins/node.d.debug/env.in
--- 2.0.57-1/plugins/node.d.debug/env.in	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/plugins/node.d.debug/env.in	2021-11-22 22:12:17.000000000 +0000
@@ -11,7 +11,7 @@ No configuration
 
 =head1 AUTHOR
 
-Copyright (C) 2004 Dagfinn Ilmari Mannsaaker
+Copyright (C) 2004 Dagfinn Ilmari MannsÃ¥ker
 
 =head1 LICENSE
 
diff -pruN 2.0.57-1/plugins/node.d.debug/id.in 2.0.69-1/plugins/node.d.debug/id.in
--- 2.0.57-1/plugins/node.d.debug/id.in	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/plugins/node.d.debug/id.in	2021-11-22 22:12:17.000000000 +0000
@@ -13,7 +13,7 @@ This plugin is used for munin testing an
 
 =head1 AUTHOR
 
-Copyright (C) 2006 Dagfinn Ilmari Mannsaaker <ilmari@ilmari.org>
+Copyright (C) 2006 Dagfinn Ilmari MannsÃ¥ker <ilmari@ilmari.org>
 
 =head1 LICENSE
 
diff -pruN 2.0.57-1/plugins/node.d.debug/if.in 2.0.69-1/plugins/node.d.debug/if.in
--- 2.0.57-1/plugins/node.d.debug/if.in	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/plugins/node.d.debug/if.in	2021-11-22 22:12:17.000000000 +0000
@@ -32,10 +32,6 @@ Link this plugin to @@CONFDIR@@/plugins/
 
 None known.
 
-=head1 VERSION
-
-  $Id$
-
 =head1 AUTHOR
 
 Brian De Wolf
diff -pruN 2.0.57-1/plugins/node.d.debug/tc.in 2.0.69-1/plugins/node.d.debug/tc.in
--- 2.0.57-1/plugins/node.d.debug/tc.in	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/plugins/node.d.debug/tc.in	2021-11-22 22:12:17.000000000 +0000
@@ -32,10 +32,6 @@ Link this plugin to @@CONFDIR@@/plugins/
 
 None known.
 
-=head1 VERSION
-
-  $Id$
-
 =head1 AUTHOR
 
 Brian De Wolf
diff -pruN 2.0.57-1/plugins/node.d.freebsd/coretemp.in 2.0.69-1/plugins/node.d.freebsd/coretemp.in
--- 2.0.57-1/plugins/node.d.freebsd/coretemp.in	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/plugins/node.d.freebsd/coretemp.in	2021-11-22 22:12:17.000000000 +0000
@@ -26,8 +26,6 @@
 # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 # SUCH DAMAGE.
 #
-# $Id$
-#
 
 # This plugin's functionality has been replaced by the dev_cpu_ plugin.
 #%# family=legacy
diff -pruN 2.0.57-1/plugins/node.d.freebsd/cpu.in 2.0.69-1/plugins/node.d.freebsd/cpu.in
--- 2.0.57-1/plugins/node.d.freebsd/cpu.in	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/plugins/node.d.freebsd/cpu.in	2021-11-22 22:12:17.000000000 +0000
@@ -15,7 +15,7 @@
 #%# family=auto
 #%# capabilities=autoconf
 
-SYSCTL_BIN=$(which sysctl)
+SYSCTL_BIN=$(command -v sysctl)
 
 if [ "$1" = "autoconf" ]; then
 	if [ ! -z "$SYSCTL_BIN" ]; then
diff -pruN 2.0.57-1/plugins/node.d.freebsd/dev_cpu_.in 2.0.69-1/plugins/node.d.freebsd/dev_cpu_.in
--- 2.0.57-1/plugins/node.d.freebsd/dev_cpu_.in	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/plugins/node.d.freebsd/dev_cpu_.in	2021-11-22 22:12:17.000000000 +0000
@@ -26,8 +26,6 @@
 # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 # SUCH DAMAGE.
 #
-# $Id$
-#
 
 #%# family=auto
 #%# capabilities=autoconf suggest
diff -pruN 2.0.57-1/plugins/node.d.freebsd/df.in 2.0.69-1/plugins/node.d.freebsd/df.in
--- 2.0.57-1/plugins/node.d.freebsd/df.in	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/plugins/node.d.freebsd/df.in	2021-11-22 22:12:17.000000000 +0000
@@ -1,7 +1,5 @@
 #!@@GOODSH@@
 #
-# $Id$
-#
 # Script to monitor disk usage.
 #
 # Parameters understood:
diff -pruN 2.0.57-1/plugins/node.d.freebsd/df_inode.in 2.0.69-1/plugins/node.d.freebsd/df_inode.in
--- 2.0.57-1/plugins/node.d.freebsd/df_inode.in	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/plugins/node.d.freebsd/df_inode.in	2021-11-22 22:12:17.000000000 +0000
@@ -1,7 +1,5 @@
 #!@@GOODSH@@
 #
-# $Id$
-#
 # Plugin to monitor inode-usage.
 #
 # Parameters understood:
diff -pruN 2.0.57-1/plugins/node.d.hp-ux/df.in 2.0.69-1/plugins/node.d.hp-ux/df.in
--- 2.0.57-1/plugins/node.d.hp-ux/df.in	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/plugins/node.d.hp-ux/df.in	2021-11-22 22:12:17.000000000 +0000
@@ -31,10 +31,6 @@ The plugin aims to be a functional equiv
   #%# family=auto
   #%# capabilities=autoconf
 
-=head1 VERSION
-
-  $Id$
-
 =head1 BUGS
 
 None known
diff -pruN 2.0.57-1/plugins/node.d.hp-ux/df_inode.in 2.0.69-1/plugins/node.d.hp-ux/df_inode.in
--- 2.0.57-1/plugins/node.d.hp-ux/df_inode.in	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/plugins/node.d.hp-ux/df_inode.in	2021-11-22 22:12:17.000000000 +0000
@@ -31,10 +31,6 @@ The plugin aims to be a functional equiv
   #%# family=auto
   #%# capabilities=autoconf
 
-=head1 VERSION
-
-  $Id$
-
 =head1 BUGS
 
 None known
diff -pruN 2.0.57-1/plugins/node.d.hp-ux/gp_gbl_mem_util.in 2.0.69-1/plugins/node.d.hp-ux/gp_gbl_mem_util.in
--- 2.0.57-1/plugins/node.d.hp-ux/gp_gbl_mem_util.in	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/plugins/node.d.hp-ux/gp_gbl_mem_util.in	2021-11-22 22:12:17.000000000 +0000
@@ -51,8 +51,6 @@
 #
 # Contributed by <ralph dot grothe at itdz minus berlin dot de>
 #
-# $Id$
-#
 #%# family=auto
 #%# capabilities=autoconf
 
diff -pruN 2.0.57-1/plugins/node.d.linux/apt_all.in 2.0.69-1/plugins/node.d.linux/apt_all.in
--- 2.0.57-1/plugins/node.d.linux/apt_all.in	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/plugins/node.d.linux/apt_all.in	2021-11-22 22:12:17.000000000 +0000
@@ -17,17 +17,28 @@ graphs.
 You can add some extra options to the apt call, in order to override
 your /etc/apt.conf defaults.
 
-[apt_all]
-env.options -o Debug::pkgDepCache::AutoInstall=false -o APT::Get::Show-Versions=false
-env.releases stable experimental
-
-"options" is empty by default.
-"releases" is a space separated list of release names.  It defaults to
-the empty string.  This default triggers the automatic detection of
-available distributions from the URLs of all configured repositories.
+  [apt_all]
+  env.options -o Debug::pkgDepCache::AutoInstall=false -o APT::Get::Show-Versions=false
+  env.releases stable experimental
 
-Note that apt is called with no extra options by default, so it fully honors
-your /etc/apt.conf defaults.
+=head2 options
+
+This settings defaults to the example given above.
+
+This default overrides potential local customization within
+/etc/apt.conf, which could interfere with the intended operation of
+apt or the output format required for this plugin.
+
+Please note that "apt" honors your /etc/apt.conf defaults.
+Thus you may need to override specific options, if you adjusted your
+local apt.conf setup.
+
+=head2 releases
+
+This configuration may contain a space separated list of release names.
+It defaults to the empty string.  This default triggers the automatic
+detection of available distributions from the URLs of all configured
+repositories.
 
 =head1 USAGE
 
@@ -36,8 +47,8 @@ This plugin needs a cronjob that runs ap
 Example conjob
 
  /etc/cron.d/munin-plugin-apt
- 53  * * * *	root	apt-get update > /dev/null 2>&1
- 23 08 * * * 	root	apt-get update > /dev/null
+ 53  * * * *    root    apt-get update > /dev/null 2>&1
+ 23 08 * * *    root    apt-get update > /dev/null
 
 Remember to randomize when these cronjobs are run on your servers
 
@@ -66,12 +77,19 @@ use Munin::Plugin;
 $ENV{'LANG'}="C";
 $ENV{'LC_ALL'}="C";
 
-my $statefile = ($ENV{MUNIN_PLUGSTATE} || '@@PLUGSTATE@@/nobody/') . "/plugin-apt.state";
+# The plugin is called in two ways:
+#     - via a cron job (without the munin environment provided by "munin-run")
+#     - as a regular plugin
+# Thus the location evaluation below relies on the following assumptions:
+#     - the plugin is configured to run as "nobody"
+#     - the munin plugin state directory location was not reconfigured
+my $statefile = ($ENV{MUNIN_PLUGSTATE} || '@@PLUGSTATE@@/nobody/') . "/plugin-apt_all.state";
+my $apt_options = $ENV{options} || "-o Debug::pkgDepCache::AutoInstall=false -o APT::Get::Show-Versions=false";
 
 
 # try to determine the currently available distributions by inspecting the repository URLs
 sub guess_releases() {
-    open(my $fh, "-|", "apt-get update --print-uris")
+    open(my $fh, "-|", "apt-get $apt_options update --print-uris")
         or die("Failed to determine distribution releases via 'apt-get update --print-uris");
     my %release_names;
     my $line;
@@ -79,11 +97,15 @@ sub guess_releases() {
         defined( $line = readline $fh ) or die "Failed to read line from output of 'apt-get': $!";
         # example line:
         #     'http://ftp.debian.org/debian/dists/stable/InRelease' ftp.debian.org_debian_dists_stable_InRelease 0
-        if ($line =~ m'^.*/dists/([^/]+)/.*$') {
-            $release_names{$1} = 1;
+        if ($line =~ m#^.*/dists/([^']+)/[^/]+/[^/]+/Packages#) {
+            my $release_name = $1;
+            # The security updates are named like "buster/updates". The first part (before the
+            # slash) is sufficient to mach these packages.
+            $release_name =~ s|/updates$||;
+            $release_names{$release_name} = 1;
         }
     }
-    return keys %release_names;
+    return sort keys %release_names;
 }
 
 
@@ -92,134 +114,125 @@ my @releases = split(/\s/, ($ENV{release
 @releases = guess_releases() unless @releases;
 
 
+sub get_clean_release_fieldname {
+    my ($fieldname) = @_;
+    # apply some minor URI-like substitution (avoiding ambiguity between slash and hyphen)
+    $fieldname =~ s#/#_2F#g;
+    return clean_fieldname($fieldname);
+}
+
+
 sub print_state() {
-    if(-l $statefile) {
-	die("$statefile is a symbolic link, refusing to read it.");
+    if (-l $statefile) {
+        die("$statefile is a symbolic link, refusing to read it.");
     }
     if (! -e "$statefile") {
-	update_state ();
+        update_state();
     }
     if (! -e "$statefile") {
-	die ("$statefile does not exist. Something wicked happened.");
+        die("$statefile does not exist. Something wicked happened.");
     }
     open(STATE, "$statefile")
-	or die("Couldn't open state file $statefile for reading.");
+        or die("Couldn't open state file $statefile for reading.");
     while (my $line = <STATE>) {
         foreach my $release (@releases) {
-            my $release_cleaned = clean_fieldname($release);
+            my $release_cleaned = get_clean_release_fieldname($release);
             # print only lines that are exected for the currently requested releases
-	    if ($line =~ /^(hold|pending)_$release_cleaned\.(value|extinfo)/) {
-	    	print $line ;
-            	last;
-	    }
+            if ($line =~ /^(hold|pending)_$release_cleaned\.(value|extinfo)/) {
+                print $line ;
+                last;
+            }
         }
     }
     close STATE;
 }
 
 sub update_state() {
-	if(-l $statefile) {
-		die("$statefile is a symbolic link, refusing to touch it.");
-	}
-	open(STATE, ">$statefile")
-		or die("Couldn't open state file $statefile for writing.");
-	foreach my $release (@releases) {
-	    my $options = $ENV{options} || "";
-	    my $apt="apt-get $options -u dist-upgrade --print-uris --yes -t $release |";
-	    open (APT, "$apt") or exit 22;
-
-	    my @pending = ();
-	    my $hold    = 0;
-	    my @remove  = ();
-	    my @install = ();
-
-	    while (<APT>)
-	    {
-		    if (/^The following packages will be REMOVED:/)
-		    {
-			    my $where = 0;
-			    while (<APT>)
-			    {
-				    last if (/^\S/);
-				    foreach my $package (split /\s+/)
-				    {
-					    next unless ($package =~ /\S/);
-					    push (@remove, "-$package");
-				    }
-			    }
-		    }
-		    if (/^The following NEW packages will be installed:/)
-		    {
-			    my $where = 0;
-			    while (<APT>)
-			    {
-				    last if (/^\S/);
-				    foreach my $package (split /\s+/)
-				    {
-					    next unless ($package =~ /\S/);
-					    push (@install, "+$package");
-				    }
-			    }
-		    }
-		    if (/^The following packages will be upgraded/)
-		    {
-			    my $where = 0;
-			    while (<APT>)
-			    {
-				    last if (/^\S/);
-				    foreach my $package (split /\s+/)
-				    {
-					    next unless ($package =~ /\S/);
-					    push (@pending, $package);
-				    }
-			    }
-		    }
-		    if (/^\d+\supgraded,\s\d+\snewly installed, \d+ to remove and (\d+) not upgraded/)
-		    {
-			    $hold = $1;
-		    }
-	    }
-
-	    push (@pending, @install) if @install;
-	    push (@pending, @remove ) if @remove;
-	    close APT;
-
-            my $release_cleaned = clean_fieldname($release);
-            print STATE "pending_$release_cleaned.value ", scalar (@pending), "\n";
-	    if (@pending)
-	    {
-                print STATE "pending_$release_cleaned.extinfo ", join (' ', @pending), "\n";
-	    }
-            print STATE "hold_$release_cleaned.value $hold\n";
+    if(-l $statefile) {
+        die("$statefile is a symbolic link, refusing to touch it.");
+    }
+    open(STATE, ">$statefile")
+        or die("Couldn't open state file $statefile for writing.");
+    foreach my $release (@releases) {
+        my $apt="apt-get $apt_options -u dist-upgrade --print-uris --yes -t $release |";
+        open (APT, "$apt") or exit 22;
+
+        my @pending = ();
+        my $hold = 0;
+        my @remove = ();
+        my @install = ();
+
+        while (<APT>) {
+            if (/^The following packages will be REMOVED:/) {
+                my $where = 0;
+                while (<APT>) {
+                    last if (/^\S/);
+                    foreach my $package (split /\s+/) {
+                        next unless ($package =~ /\S/);
+                        push (@remove, "-$package");
+                    }
+                }
+            }
+            if (/^The following NEW packages will be installed:/) {
+                my $where = 0;
+                while (<APT>) {
+                    last if (/^\S/);
+                    foreach my $package (split /\s+/) {
+                        next unless ($package =~ /\S/);
+                        push (@install, "+$package");
+                    }
+                }
+            }
+            if (/^The following packages will be upgraded/) {
+                my $where = 0;
+                while (<APT>) {
+                    last if (/^\S/);
+                    foreach my $package (split /\s+/) {
+                        next unless ($package =~ /\S/);
+                        push (@pending, $package);
+                    }
+                }
+            }
+            if (/^\d+\supgraded,\s\d+\snewly installed, \d+ to remove and (\d+) not upgraded/) {
+                $hold = $1;
+            }
+        }
 
-	}
-	close(STATE);
+        push (@pending, @install) if @install;
+        push (@pending, @remove ) if @remove;
+        close APT;
+
+        my $release_cleaned = get_clean_release_fieldname($release);
+        print STATE "pending_$release_cleaned.value ", scalar (@pending), "\n";
+        if (@pending) {
+            print STATE "pending_$release_cleaned.extinfo ", join (' ', @pending), "\n";
+        }
+        print STATE "hold_$release_cleaned.value $hold\n";
+
+    }
+    close(STATE);
 }
 
 sub update_helpandexit() {
-	print("apt update <maxinterval> <probability> -- update apt databases randomly\n\n",
-	      " maxinterval:\n",
-	      "  Enforce the updating of the apt database if it has\n",
-	      "  been more than (maxinterval many seconds since the last update.\n\n",
-	      " probability:\n",
-	      "  There's a 1 in (probability) chance that the database\n",
-	      "  will be updated.\n");
-	exit(1);
-}
-
-if ($ARGV[0] and $ARGV[0] eq "autoconf")
-{
-	`apt-get -v >/dev/null 2>/dev/null`;
-	if ($? eq "0")
-	{
-		print "yes\n";
-		exit 0;
-	}
-	else
-	{
-		print "no (apt-get not found)\n";
-		exit 0;
-	}
+    print("apt update <maxinterval> <probability> -- update apt databases randomly\n\n",
+          " maxinterval:\n",
+          "  Enforce the updating of the apt database if it has\n",
+          "  been more than 'maxinterval' many seconds since the last update.\n\n",
+          " probability:\n",
+          "  There's a 1 in 'probability' chance that the database\n",
+          "  will be updated.\n");
+    exit(1);
+}
+
+if ($ARGV[0] and $ARGV[0] eq "autoconf") {
+    `apt-get -v >/dev/null 2>/dev/null`;
+    if ($? eq "0") {
+        print "yes\n";
+        exit 0;
+    } else {
+        print "no (apt-get not found)\n";
+        exit 0;
+    }
 }
 
 if ($ARGV[0] and $ARGV[0] eq "config") {
@@ -229,7 +242,7 @@ if ($ARGV[0] and $ARGV[0] eq "config") {
     print "graph_category system\n";
 
     foreach my $release (@releases) {
-        my $release_cleaned = clean_fieldname($release);
+        my $release_cleaned = get_clean_release_fieldname($release);
         print "pending_$release_cleaned.label pending ($release)\n";
         print "pending_$release_cleaned.warning 0:0\n";
         print "hold_$release_cleaned.label hold ($release)\n";
@@ -238,21 +251,21 @@ if ($ARGV[0] and $ARGV[0] eq "config") {
 }
 
 if ($ARGV[0] and $ARGV[0] eq "update") {
-	my $maxinterval = $ARGV[1] ? $ARGV[1] : update_helpandexit;
-	my $probability = $ARGV[2] ? $ARGV[2] : update_helpandexit;
+    my $maxinterval = $ARGV[1] ? $ARGV[1] : update_helpandexit;
+    my $probability = $ARGV[2] ? $ARGV[2] : update_helpandexit;
 
-	# The state file needs an update in three situations:
-	#     * it does not exist
-	#     * $maxinterval seconds elapsed since the last update
-	#     * random $probability was hit (one out of $probability)
-	if (!-e $statefile
-			|| ((stat($statefile))[10] + $maxinterval < time())
-			|| (int(rand($probability)) == 0)) {
-		system("/usr/bin/apt-get update") == 0
-			or die("Failed to run 'apt-get update'");
-		update_state();
-	}
-	exit(0);
+    # The state file needs an update in three situations:
+    #     * it does not exist
+    #     * $maxinterval seconds elapsed since the last update
+    #     * random $probability was hit (one out of $probability)
+    if (!-e $statefile
+            || ((stat($statefile))[10] + $maxinterval < time())
+            || (int(rand($probability)) == 0)) {
+        system("/usr/bin/apt-get update") == 0
+            or die("Failed to run 'apt-get update'");
+        update_state();
+    }
+    exit(0);
 }
 
 print_state ();
diff -pruN 2.0.57-1/plugins/node.d.linux/apt.in 2.0.69-1/plugins/node.d.linux/apt.in
--- 2.0.57-1/plugins/node.d.linux/apt.in	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/plugins/node.d.linux/apt.in	2021-11-22 22:12:17.000000000 +0000
@@ -55,10 +55,6 @@ packages, please see the "apt_all" plugi
 
 None known.
 
-=head1 VERSION
-
-$Id$
-
 =head1 AUTHOR
 
 Unknown
diff -pruN 2.0.57-1/plugins/node.d.linux/cpu.in 2.0.69-1/plugins/node.d.linux/cpu.in
--- 2.0.57-1/plugins/node.d.linux/cpu.in	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/plugins/node.d.linux/cpu.in	2021-11-22 22:12:17.000000000 +0000
@@ -15,13 +15,18 @@ All Linux systems
 The following is default configuration
 
   [cpu]
-	env.HZ	100
-	env.scaleto100	no
+    env.HZ          100
+    env.scaleto100  no
 
 "scaleto100" may be "yes" or "no". With "yes" all CPU-related values
 are scaled for a limit of 100.  With "no" (the default) all CPU-related
 values are scaled for a limit of n * 100 ("n" being the number of CPUs).
 
+The "ignore_fields" environment variable (empty by default) may be used
+for listing fields (space separated) that should not be visualized.
+For example hiding the "idle" field may improve the visualization of the
+combined cpu usage.
+
 See "BUGS" for an explanation of the "HZ" setting.
 
 =head2 EXAMPLE WARNING AND CRITICAL SETTINGS
@@ -113,6 +118,16 @@ fi
 
 HZ=${HZ:-100}
 scaleto100=${scaleto100:-no}
+ignore_fields=${ignore_fields:-}
+
+
+maybe_hide_field() {
+    local fieldname="$1"
+    if echo "$ignore_fields" | grep -wq "$fieldname"; then
+        echo "$fieldname.graph no"
+    fi
+}
+
 
 extinfo=""
 
@@ -166,6 +181,7 @@ if [ "$1" = "config" ]; then
 
 	for field in system user nice idle; do
 		print_adjusted_thresholds "$field" "$graphlimit"
+		maybe_hide_field "$field"
 	done
 
 	if [ "$scaleto100" = "yes" ]; then
@@ -198,6 +214,7 @@ if [ "$1" = "config" ]; then
 		fi
 		for field in iowait irq softirq; do
 			print_adjusted_thresholds "$field" "$graphlimit"
+			maybe_hide_field "$field"
 		done
 	fi
 
@@ -208,6 +225,7 @@ if [ "$1" = "config" ]; then
 		echo 'steal.min 0'
 		echo 'steal.type DERIVE'
 		echo 'steal.info The time that a virtual CPU had runnable tasks, but the virtual CPU itself was not running'
+		maybe_hide_field "steal"
 		if [ "$scaleto100" = "yes" ]; then
 			echo "steal.cdef steal,$NCPU,/"
 		fi
@@ -221,6 +239,7 @@ if [ "$1" = "config" ]; then
 		echo 'guest.min 0'
 		echo 'guest.type DERIVE'
 		echo 'guest.info The time spent running a virtual CPU for guest operating systems under the control of the Linux kernel.'
+		maybe_hide_field "guest"
 		if [ "$scaleto100" = "yes" ]; then
 			echo "guest.cdef guest,$NCPU,/"
 		fi
diff -pruN 2.0.57-1/plugins/node.d.linux/cpuspeed.in 2.0.69-1/plugins/node.d.linux/cpuspeed.in
--- 2.0.57-1/plugins/node.d.linux/cpuspeed.in	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/plugins/node.d.linux/cpuspeed.in	2021-11-22 22:12:17.000000000 +0000
@@ -148,7 +148,7 @@ fi
 for c in /sys/devices/system/cpu/cpu[0-9]*; do
     N=${c##*/cpu}
     if [ -r "$ACPI_CPUFREQ_INDICATOR_FILENAME" ]; then
-        value=$(awk '{ cycles += $1 * $2 } END { print(cycles / 100); }' "$c/cpufreq/stats/time_in_state")
+        value=$(awk '{ cycles += $1 * $2 } END { printf("%.0f", cycles / 100); }' "$c/cpufreq/stats/time_in_state")
     elif [ -r "$INTEL_PSTATE_INDICATOR_FILENAME" ]; then
         value=$(cat "$c/cpufreq/scaling_cur_freq")
     else
diff -pruN 2.0.57-1/plugins/node.d.linux/df.in 2.0.69-1/plugins/node.d.linux/df.in
--- 2.0.57-1/plugins/node.d.linux/df.in	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/plugins/node.d.linux/df.in	2021-11-22 22:12:17.000000000 +0000
@@ -70,10 +70,6 @@ Link this plugin to @@CONFDIR@@/plugins/
 Uses device names instead of mount points to identify mounted
 filesystems.
 
-=head1 VERSION
-
-  $Id$
-
 =head1 AUTHOR
 
 Ingvar Hagelund
diff -pruN 2.0.57-1/plugins/node.d.linux/df_inode.in 2.0.69-1/plugins/node.d.linux/df_inode.in
--- 2.0.57-1/plugins/node.d.linux/df_inode.in	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/plugins/node.d.linux/df_inode.in	2021-11-22 22:12:17.000000000 +0000
@@ -67,10 +67,6 @@ Link this plugin to @@CONFDIR@@/plugins/
 Uses device names instead of mount points to identify mounted
 filesystems.
 
-=head1 VERSION
-
-  $Id$
-
 =head1 AUTHOR
 
 Ingvar Hagelund
diff -pruN 2.0.57-1/plugins/node.d.linux/diskstat_.in 2.0.69-1/plugins/node.d.linux/diskstat_.in
--- 2.0.57-1/plugins/node.d.linux/diskstat_.in	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/plugins/node.d.linux/diskstat_.in	2021-11-22 22:12:17.000000000 +0000
@@ -23,6 +23,36 @@ for running as root enter this in a plug
   [diskstat_*]
     user root
 
+You can sym link to this wildcard plugin in various ways:
+
+- diskstat_iops_sda
+- diskstat_latency_nvme2n1
+- diskstat_throughput_nvme0n1
+- diskstat_throughput_nvme4n1_:mnt:extrastorage
+- diskstat_iops_:dev:disk:by-uuid:18edf1f7-961a-4621-8468-92f3981ffabc_:var:www
+
+The segments are separated by _ and denote:
+
+- name of the plugin. Always diskstat.
+- What you're measuring: iops (IO/s), latency (includes utilization) and
+  throughput.
+- Device: like sda, xvda, nvme0n1 (the latter which, incidentally, still
+  denotes a drive, not a partition), or a symlink to a device, with the slashes
+  writtan as colons. So, for example:
+  diskstat_iops_:dev:disk:by-uuid:18edf1f7-961a-4621-8468-92f3981ffabc
+- The last segment is optional, and specifies a custom name. Agan, slashes are
+  written as colons, so :var:www becomes /var/www. This is especially useful
+  when using symlinks to /dev/disk/by-uuid.
+
+As an example, the following:
+
+  diskstat_iops_:dev:disk:by-uuid:18edf1f7-961a-4621-8468-92f3981ffabc_:var:www
+
+Creates an io/s graph for
+/dev/disk/by-uuid/18edf1f7-961a-4621-8468-92f3981ffabc and names it /var/www.
+Without a custom name, the link is followed and the normal device name is used
+(like sdb).
+
 =head1 INTERPRETATION
 
 Among the more self-describing or well-known values like C<throughput>
@@ -101,10 +131,6 @@ information about the C<numbers> involve
 L<http://www.westnet.com/~gsmith/content/linux-pdflush.htm> has a nice
 writeup about the pdflush daemon.
 
-=head1 VERSION
-
-  $Id$
-
 =head1 MAGIC MARKERS
 
   #%# family=manual
@@ -222,7 +248,7 @@ DEVICE:
 # needed from here on
 
 my $basename = basename($0);
-my ( $mode, $device ) = $basename =~ m/diskstat_(\w+)_([-+:\w]+)$/;
+my ( $mode, $device, $name_override ) = $basename =~ m/diskstat_([-+:a-zA-Z0-9]+)_([-+:a-zA-Z0-9]+)(?:_([-+:\w]+))?$/;
 
 if ( not defined $device ) {
     croak
@@ -230,6 +256,13 @@ if ( not defined $device ) {
 }
 
 $device = translate_device_name( $device, 'FROM_FS' );
+if (-l $device) {
+    $device = basename(readlink($device));
+}
+
+if (defined $name_override) {
+    $name_override = translate_device_name( $name_override, 'FROM_FS' );
+}
 
 ##########
 # config #
@@ -243,10 +276,18 @@ if ( defined $ARGV[0] && $ARGV[0] eq 'co
         $pretty_device = translate_devicemapper_name($device);
     }
 
+    my $fullname;
+    if ( defined $name_override && $name_override ne "" ) {
+      $fullname = $name_override;
+    }
+    else {
+      $fullname = "/dev/$pretty_device";
+    }
+
     if ( $mode eq 'latency' ) {
 
         print <<EOF;
-graph_title Disk latency for /dev/$pretty_device
+graph_title Disk latency for $fullname
 graph_args --base 1000
 graph_category disk
 
@@ -277,7 +318,7 @@ EOF
     elsif ( $mode eq 'throughput' ) {
 
         print <<EOF;
-graph_title Disk throughput for /dev/$pretty_device
+graph_title Disk throughput for $fullname
 graph_args --base 1024
 graph_vlabel Bytes/second
 graph_category disk
@@ -294,7 +335,7 @@ EOF
     elsif ( $mode eq 'iops' ) {
 
         print <<EOF;
-graph_title Disk IOs for /dev/$pretty_device
+graph_title Disk IOs for $fullname
 graph_args --base 1000
 graph_vlabel Units/second
 graph_category disk
@@ -582,7 +623,10 @@ sub translate_device_name {
     if ( $mode eq 'FROM_FS' ) {
 
         # Hackaround to mitigate issues with unwisely chosen former separator
-        if ( not( $device =~ m/dm-\d+/ ) ) {
+        if ( $device =~ m/uuid/) {
+            $device =~ tr#:#/#;
+        }
+        elsif ( not( $device =~ m/dm-\d+/ ) ) {
             $device =~ tr#-+:#///#;
         }
 
diff -pruN 2.0.57-1/plugins/node.d.linux/diskstats.in 2.0.69-1/plugins/node.d.linux/diskstats.in
--- 2.0.57-1/plugins/node.d.linux/diskstats.in	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/plugins/node.d.linux/diskstats.in	2021-11-22 22:12:17.000000000 +0000
@@ -1291,10 +1291,6 @@ information about the C<numbers> involve
 L<http://www.westnet.com/~gsmith/content/linux-pdflush.htm> has a nice
 writeup about the pdflush daemon.
 
-=head1 VERSION
-
-  $Id$
-
 =head1 MAGIC MARKERS
 
   #%# family=auto
diff -pruN 2.0.57-1/plugins/node.d.linux/fw_packets.in 2.0.69-1/plugins/node.d.linux/fw_packets.in
--- 2.0.57-1/plugins/node.d.linux/fw_packets.in	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/plugins/node.d.linux/fw_packets.in	2021-11-22 22:12:17.000000000 +0000
@@ -6,7 +6,7 @@ use warnings;
 
 =head1 NAME
 
-fw_packets - Plugin to monitor the throuhgput of a firewall
+fw_packets - Plugin to monitor the throughput of a firewall
 
 =head1 CONFIGURATION
 
diff -pruN 2.0.57-1/plugins/node.d.linux/iostat.in 2.0.69-1/plugins/node.d.linux/iostat.in
--- 2.0.57-1/plugins/node.d.linux/iostat.in	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/plugins/node.d.linux/iostat.in	2021-11-22 22:12:17.000000000 +0000
@@ -35,10 +35,6 @@ To be written...
  #%# family=legacy
  #%# capabilities=autoconf
 
-=head1 VERSION
-
-  $Id$
-
 =head1 AUTHOR
 
 This plugin has been in Munin since it was called "LRRD".  The log for
@@ -171,9 +167,9 @@ sub fetch_detailed() {
 		my $tmpnam = $2;
 		my $major  = $1;
 		if ($tmpnam =~ /\d+$/ and !$include_numbered) {
-		    # Special case for devices like cXdXpX,
-		    # like the cciss driver
-		    next unless $tmpnam =~ /\/c\d+d\d+$/
+			# Special case for devices like cXdXpX, like the cciss driver,
+			# or nvmeXnXpX for nvme.
+			next unless ($tmpnam =~ /\/c\d+d\d+$/ || $tmpnam =~ /nvme\d+n\d+$/)
 		}
 		next unless grep { $_ } @fields;
 
diff -pruN 2.0.57-1/plugins/node.d.linux/iostat_ios.in 2.0.69-1/plugins/node.d.linux/iostat_ios.in
--- 2.0.57-1/plugins/node.d.linux/iostat_ios.in	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/plugins/node.d.linux/iostat_ios.in	2021-11-22 22:12:17.000000000 +0000
@@ -35,10 +35,6 @@ iowait reporting works to fully understa
   #%# family=legacy
   #%# capabilities=autoconf
 
-=head1 VERSION
-
-  $Id$
-
 =head1 BUGS
 
 Should show more useful device names/labels for device-mapper devices,
diff -pruN 2.0.57-1/plugins/node.d.linux/irqstats.in 2.0.69-1/plugins/node.d.linux/irqstats.in
--- 2.0.57-1/plugins/node.d.linux/irqstats.in	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/plugins/node.d.linux/irqstats.in	2021-11-22 22:12:17.000000000 +0000
@@ -34,10 +34,6 @@ other I/O, this is normal.
   #%# family=auto
   #%# capabilities=autoconf
 
-=head1 VERSION
-
-  $Id$
-
 =head1 BUGS
 
 None known
diff -pruN 2.0.57-1/plugins/node.d.linux/memory.in 2.0.69-1/plugins/node.d.linux/memory.in
--- 2.0.57-1/plugins/node.d.linux/memory.in	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/plugins/node.d.linux/memory.in	2021-11-22 22:12:17.000000000 +0000
@@ -85,6 +85,8 @@ if ($ARGV[0] and $ARGV[0] eq "config") {
       "apps ";
     print "page_tables " if exists $mems{'PageTables'};
 
+    print "per_cpu " if exists $mems{'Percpu'};
+
     print "swap_cache " if exists $mems{'SwapCached'};
 
     #print "vmalloc_used " if exists $mems{'VmallocUsed'};
@@ -151,6 +153,12 @@ if ($ARGV[0] and $ARGV[0] eq "config") {
 	  "physical memory addresses.\n";
 	print "page_tables.colour COLOUR1\n";
     }
+    if (exists $mems{'Percpu'}) {
+	print "per_cpu.label per_cpu\n";
+	print "per_cpu.draw STACK\n";
+	print "per_cpu.info Per CPU allocations\n";
+	print "per_cpu.colour COLOUR20\n";
+    }
     if (exists $mems{'VmallocUsed'}) {
 	print "vmalloc_used.label vmalloc_used\n";
 	# print "vmalloc_used.draw STACK\n";
@@ -225,7 +233,7 @@ if ($ARGV[0] and $ARGV[0] eq "config") {
     print "ksm_sharing.info Memory saved by KSM sharing\n";
     print "ksm_sharing.colour COLOUR19\n";
     }
-    for my $field (qw(apps buffers swap cached free slab swap_cache page_tables vmalloc_used committed mapped active active_anon active_cache inactive inact_dirty inact_laundry inact_clean shmem)) {
+    for my $field (qw(apps buffers swap cached free slab swap_cache page_tables per_cpu vmalloc_used committed mapped active active_anon active_cache inactive inact_dirty inact_laundry inact_clean shmem)) {
     	my ($warning, $critical) = get_thresholds($field);
 	my $total = $mems{MemTotal};
 	$total = $mems{SwapTotal} if($field eq "swap");
@@ -259,6 +267,11 @@ if (exists $mems{'PageTables'}) {
 } else {
     $mems{'PageTables'} = 0;
 }
+if (exists $mems{'Percpu'}) {
+    print "per_cpu.value ", $mems{'Percpu'}, "\n";
+} else {
+    $mems{'Percpu'} = 0;
+}
 
 if (exists $mems{'VmallocUsed'}) {
     print "vmalloc_used.value ", $mems{'VmallocUsed'}, "\n";
@@ -272,6 +285,7 @@ $mems{'Buffers'} ||= 0;
 $mems{'Cached'} ||= 0;
 $mems{'Slab'} ||= 0;
 $mems{'PageTables'} ||= 0;
+$mems{'Percpu'} ||= 0;
 $mems{'SwapCached'} ||= 0;
 $mems{'SwapFree'} ||= 0;
 $mems{'SwapTotal'} ||= 0;
@@ -282,6 +296,7 @@ print "apps.value ", $mems{'MemTotal'}
 	-$mems{'Cached'}
 	-$mems{'Slab'}
 	-$mems{'PageTables'}
+	-$mems{'Percpu'}
         -$mems{'SwapCached'}
 	,"\n";
 
diff -pruN 2.0.57-1/plugins/node.d.linux/netstat.in 2.0.69-1/plugins/node.d.linux/netstat.in
--- 2.0.57-1/plugins/node.d.linux/netstat.in	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/plugins/node.d.linux/netstat.in	2021-11-22 22:12:17.000000000 +0000
@@ -65,8 +65,9 @@ fi
 
 if [ "$1" = "config" ]; then
 
-	echo 'graph_title Netstat'
-	echo 'graph_args --base 1000 --logarithmic'
+	echo 'multigraph netstat'
+	echo 'graph_title Netstat, combined'
+	echo 'graph_args --units=si -l 1 --base 1000 --logarithmic'
 	echo 'graph_vlabel TCP connections'
 	echo 'graph_category network'
 	echo 'graph_period second'
@@ -101,10 +102,25 @@ if [ "$1" = "config" ]; then
 	print_critical resets
 	echo 'established.label established'
 	echo 'established.type GAUGE'
-	echo 'established.max 50000'
 	echo 'established.info The number of currently open connections.'
 	print_warning established
 	print_critical established
+
+	echo ''
+
+	echo 'multigraph netstat_established'
+	echo 'graph_title Netstat, established only'
+	echo 'graph_args --lower-limit 0'
+	echo 'graph_vlabel TCP connections'
+	echo 'graph_category network'
+	echo 'graph_period second'
+	echo 'graph_info This graph shows the TCP activity of all the network interfaces combined.'
+	echo 'established.label established'
+	echo 'established.type GAUGE'
+	echo 'established.info The number of currently open connections.'
+	print_warning established
+	print_critical established
+
 	exit 0
 fi
 
@@ -112,9 +128,16 @@ fi
 # openings' string from plural connections to singular. The match hereby is for
 # both cases.
 #
+echo 'multigraph netstat'
 "$NETSTAT_CMD" -s | awk '
 /active connection(s)? ope/  { print "active.value " $1 }
 /passive connection ope/  { print "passive.value " $1 }
 /failed connection/       { print "failed.value " $1 }
 /connection resets/       { print "resets.value " $1 }
 /connections established/ { print "established.value " $1 }'
+
+echo
+
+echo 'multigraph netstat_established'
+"$NETSTAT_CMD" -s | awk '
+/connections established/ { print "established.value " $1 }'
diff -pruN 2.0.57-1/plugins/node.d.linux/netstat_multi.in 2.0.69-1/plugins/node.d.linux/netstat_multi.in
--- 2.0.57-1/plugins/node.d.linux/netstat_multi.in	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/plugins/node.d.linux/netstat_multi.in	2021-11-22 22:12:17.000000000 +0000
@@ -42,10 +42,6 @@ Each graph uses data from the proc files
  #%# family=contrib
  #%# capabilities=autoconf multigraph
 
-=head1 VERSION
-
- $Id$
-
 =head1 PATCHES-TO
 
 The munin-project.
diff -pruN 2.0.57-1/plugins/node.d.linux/port_.in 2.0.69-1/plugins/node.d.linux/port_.in
--- 2.0.57-1/plugins/node.d.linux/port_.in	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/plugins/node.d.linux/port_.in	2021-11-22 22:12:17.000000000 +0000
@@ -23,10 +23,6 @@ a numeric port number.
 
 The plugin doesnt count the tcp6 connections if tcp and tcp6 is used.
 
-=head1 VERSION
-
-$Id$
-
 =head1 AUTHOR
 
 Unknown
diff -pruN 2.0.57-1/plugins/node.d.linux/proc.in 2.0.69-1/plugins/node.d.linux/proc.in
--- 2.0.57-1/plugins/node.d.linux/proc.in	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/plugins/node.d.linux/proc.in	2021-11-22 22:12:17.000000000 +0000
@@ -63,12 +63,8 @@ Each graph uses data from the proc files
 
 =head1 MAGIC MARKERS
 
- #%# family=auto
- #%# capabilities=multigraph
-
-=head1 VERSION
-
- $Id$
+ #%# family=manual
+ #%# capabilities=autoconf multigraph
 
 =head1 BUGS
 
@@ -85,11 +81,11 @@ The munin-project.
 =head1 AUTHOR
 
 Trygve Vea <tv@redpill-linpro.com>
-Kristian Lyngstol <kristian@varnish-software.com>
+Kristian LyngstÃ¸l <kristian@varnish-software.com>
 
 =head1 THANKS
 
-Thanks to Kristian Lyngstol, I stole most of the initial code in this plugin
+Thanks to Kristian LyngstÃ¸l, I stole most of the initial code in this plugin
 from his varnish_-plugin, which is a really nice outline of how a
 wildcardplugin should look like. I've added some weird hacks to make it output
 multigraph. It's pretty ugly, but it works.
@@ -331,15 +327,17 @@ sub populate_stats
         my $procuid = getpwnam($procuser[$i]); # may return undef
 
     STATLINE:
-        foreach my $line(`fgrep -h '($procname[$i])' /proc/[0-9]*/stat`) {
+        foreach my $line(`grep -Fh '($procname[$i])' /proc/[0-9]*/stat`) {
             my ($pid) = $line =~ /^(\d+)/;
 
-            my $cmdline = slurp("/proc/$pid/cmdline") or next STATLINE;
-            $cmdline =~ tr{\0}{ };
-
             my $cmduid = (lstat("/proc/$pid"))[4];
 
-            next STATLINE if $procargs[$i] and $cmdline !~ /$procargs[$i]/;
+            if ( $procargs[$i] ) {
+              my $cmdline = slurp("/proc/$pid/cmdline") or next STATLINE;
+              $cmdline =~ tr{\0}{ };
+
+              next STATLINE if $procargs[$i] and $cmdline !~ /$procargs[$i]/;
+            }
             next STATLINE if defined $procuid and $cmduid != $procuid;
 
             if ($line =~ /^\d+ \(.*\) . \-?\d+ \-?\d+ \-?\d+ \-?\d+ \-?\d+ \d+ \d+ \d+ \d+ \d+ (\d+) (\d+) \d+ \d+ \-?\d+ \-?\d+ (\d+) \-?\d+ \d+ (\d+) (\d+)/) {
@@ -580,8 +578,16 @@ sub check_args
                 }
             }
             exit 0;
+        } elsif ($ARGV[0] eq "autoconf") {
+            if (-r "/proc/self/cmdline") {
+                print "yes\n";
+            } else {
+                print "no (failed to access 'cmdline' for process below /proc/)\n";
+            }
+            exit 0;
+        } else {
+            usage "Unknown argument";
         }
-        usage "Unknown argument";
     }
 }
 
@@ -646,53 +652,53 @@ populate_stats;
 
 foreach (@procaspect) {
     my $asp = $_;
-$i = 0;
-print "multigraph proc_$asp\n";
-foreach (@procname) {
-    if ( $asp eq 'cpu' ) {
-        print "$procuniq[$i].value " .
-              ($procstats{$procuniq[$i]}{'utime'} +
-               $procstats{$procuniq[$i]}{'stime'})."\n";
-    }
-    if ( $asp eq 'ctxt_switches' ) {
-        print "$procuniq[$i].value " .
-              ($procstats{$procuniq[$i]}{'voluntary_ctxt_switches'} +
-               $procstats{$procuniq[$i]}{'nonvoluntary_ctxt_switches'})."\n";
-    }
-    if ( $asp eq 'threads' ) {
-        print "$procuniq[$i].value $procstats{$procuniq[$i]}{'threads'}\n";
-    }
-    if ( $asp eq 'processes' ) {
-        print "$procuniq[$i].value $procstats{$procuniq[$i]}{'processes'}\n";
-    }
-    if ( $asp eq 'memory' ) {
-        print "$procuniq[$i].value $procstats{$procuniq[$i]}{'VmRSS'}\n";
-    }
-    if ( $asp eq 'io' ) {
-        print "$procuniq[$i]_rchar.value $procstats{$procuniq[$i]}{'rchar'}\n";
-        print "$procuniq[$i]_wchar.value $procstats{$procuniq[$i]}{'wchar'}\n";
+    $i = 0;
+    print "multigraph proc_$asp\n";
+    foreach (@procname) {
+        if ( $asp eq 'cpu' ) {
+            print "$procuniq[$i].value " .
+                  ($procstats{$procuniq[$i]}{'utime'} +
+                   $procstats{$procuniq[$i]}{'stime'})."\n";
+        }
+        if ( $asp eq 'ctxt_switches' ) {
+            print "$procuniq[$i].value " .
+                  ($procstats{$procuniq[$i]}{'voluntary_ctxt_switches'} +
+                   $procstats{$procuniq[$i]}{'nonvoluntary_ctxt_switches'})."\n";
+        }
+        if ( $asp eq 'threads' ) {
+            print "$procuniq[$i].value $procstats{$procuniq[$i]}{'threads'}\n";
+        }
+        if ( $asp eq 'processes' ) {
+            print "$procuniq[$i].value $procstats{$procuniq[$i]}{'processes'}\n";
+        }
+        if ( $asp eq 'memory' ) {
+            print "$procuniq[$i].value $procstats{$procuniq[$i]}{'VmRSS'}\n";
+        }
+        if ( $asp eq 'io' ) {
+            print "$procuniq[$i]_rchar.value $procstats{$procuniq[$i]}{'rchar'}\n";
+            print "$procuniq[$i]_wchar.value $procstats{$procuniq[$i]}{'wchar'}\n";
+        }
+        $i++;
     }
-    $i++;
-}
-print "\n";
-$i = 0;
-# Print the individual graph statistics
-foreach (@procname) {
-    print "multigraph proc_$asp.$procuniq[$i]\n";
-    foreach my $value (sort keys %{$ASPECTS{$asp}{'values'}}) {
-        if (defined($ASPECTS{$asp}{'values'}{$value}{'rpn'})) {
-            print "$value.value ";
-            rpn($ASPECTS{$asp}{'values'}{$value}{'rpn'});
-        } else {
-            print "$value.value ";
-            if (!defined($procstats{$procuniq[$i]}{$value})) {
-                print "0\n";
-                next;
+    print "\n";
+    $i = 0;
+    # Print the individual graph statistics
+    foreach (@procname) {
+        print "multigraph proc_$asp.$procuniq[$i]\n";
+        foreach my $value (sort keys %{$ASPECTS{$asp}{'values'}}) {
+            if (defined($ASPECTS{$asp}{'values'}{$value}{'rpn'})) {
+                print "$value.value ";
+                rpn($ASPECTS{$asp}{'values'}{$value}{'rpn'});
+            } else {
+                print "$value.value ";
+                if (!defined($procstats{$procuniq[$i]}{$value})) {
+                    print "0\n";
+                    next;
+                }
+                print "$procstats{$procuniq[$i]}{$value}\n";
             }
-            print "$procstats{$procuniq[$i]}{$value}\n";
         }
+        print "\n";
+        $i++;
     }
-    print "\n";
-    $i++;
-}
 }
diff -pruN 2.0.57-1/plugins/node.d.linux/proc_pri.in 2.0.69-1/plugins/node.d.linux/proc_pri.in
--- 2.0.57-1/plugins/node.d.linux/proc_pri.in	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/plugins/node.d.linux/proc_pri.in	2021-11-22 22:12:17.000000000 +0000
@@ -31,7 +31,7 @@ GNU GPL
 
 . "$MUNIN_LIBDIR/plugins/plugin.sh"
 
-PS=$(which ps 2>/dev/null) || true
+PS=$(command -v ps || true)
 if [ "$1" = "autoconf" ]; then
 	if ! [ -x "$PS" ]; then
 		echo "no (command ps not found)"
diff -pruN 2.0.57-1/plugins/node.d.linux/sensors_.in 2.0.69-1/plugins/node.d.linux/sensors_.in
--- 2.0.57-1/plugins/node.d.linux/sensors_.in	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/plugins/node.d.linux/sensors_.in	2021-11-22 22:12:17.000000000 +0000
@@ -137,7 +137,7 @@ my %config = (
 
             (?:\.\d+)?)# Zero or one match of '.' char followed by one or more
                        # digits. '?:' means it is not a numbered capture group.
-            [Â°\s]      # Match degree char or space char
+            [Â°\s*]     # Match degree, space, or asterisk char
             C          # Match 'C' char
 
             (?:        # >>>>Match the following statement zero or one time.
@@ -154,7 +154,7 @@ my %config = (
 
             (?:\.\d+)?)# Zero or one match of '.' char followed by one or more
                        # digits. '?:' means it is not a numbered capture group.
-            [Â°\s]      # Match degree char or space char
+            [Â°\s*]     # Match degree, space, or asterisk char
             C,?\s*     # 'C' followed by optional comma and zero or more spaces
             (?:        # >>>Match the following non-capture group zero or more times
             (?:crit|hyst(?:eresis)?) # 'crit' or 'hyst' string followed by optional 'eresis' string.
@@ -166,7 +166,7 @@ my %config = (
                        # (Match hyst value) followed by
             (?:\.\d+)?)# Zero or one match of '.' char followed by one or more
                        # digits. '?:' means it is not a numbered capture group.
-            [Â°\s]C     # Match degree char or space char, and then 'C' char
+            [Â°\s*]C    # Match degree, space, or asterisk char, and then 'C' char
             )?         # >>>end of group
             \)         # ')' char
             )?         # >>>>end of group
@@ -279,7 +279,7 @@ if ( defined $ARGV[0] and $ARGV[0] eq 'a
     exit 0;
   }
 
-  unless ($text =~ /[Â° ]C/) {
+  unless ($text =~ /[Â°\s*]C/) {
     print "no (no temperature readings)\n";
     exit 0;
   }
diff -pruN 2.0.57-1/plugins/node.d.linux/vserver_cpu_.in 2.0.69-1/plugins/node.d.linux/vserver_cpu_.in
--- 2.0.57-1/plugins/node.d.linux/vserver_cpu_.in	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/plugins/node.d.linux/vserver_cpu_.in	2021-11-22 22:12:17.000000000 +0000
@@ -36,7 +36,9 @@ or links to define what to monitor:
 
 =head1 AUTHOR
 
-Copyright (C) 2006-2008 Holger Levsen and Micah Anderson
+Copyright (C) 2006-2008 Holger Levsen
+
+Copyright (C) 2006-2008 Micah Anderson
 
 =head1 LICENSE
 
diff -pruN 2.0.57-1/plugins/node.d.netbsd/df.in 2.0.69-1/plugins/node.d.netbsd/df.in
--- 2.0.57-1/plugins/node.d.netbsd/df.in	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/plugins/node.d.netbsd/df.in	2021-11-22 22:12:17.000000000 +0000
@@ -11,8 +11,6 @@
 #       warning  Percentage at which to give warning, default 92
 #       critical Percentage at which to give critical, default 98
 #
-# $Id$
-#
 # This package has added support for NetBSD, via a number of new plugin
 # scripts where specific steps needs to be taken to collect information.
 #
diff -pruN 2.0.57-1/plugins/node.d.netbsd/df_inode.in 2.0.69-1/plugins/node.d.netbsd/df_inode.in
--- 2.0.57-1/plugins/node.d.netbsd/df_inode.in	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/plugins/node.d.netbsd/df_inode.in	2021-11-22 22:12:17.000000000 +0000
@@ -7,8 +7,6 @@
 # 	config   (required)
 # 	autoconf (optional - used by munin-config)
 #
-# $Id$
-#
 # Magic markers (optional - used by munin-config and installation
 # scripts):
 #
diff -pruN 2.0.57-1/plugins/node.d.netbsd/interrupts.in 2.0.69-1/plugins/node.d.netbsd/interrupts.in
--- 2.0.57-1/plugins/node.d.netbsd/interrupts.in	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/plugins/node.d.netbsd/interrupts.in	2021-11-22 22:12:17.000000000 +0000
@@ -2,7 +2,7 @@
 #
 # Plugin to monitor the number of interrupts and context switches on a system.
 #
-# Idea and base from Ragnar Wisløff.
+# Idea and base from Ragnar WislÃ¸ff.
 #
 # Usage: Link or copy into /etc/munin/node.d/
 #
diff -pruN 2.0.57-1/plugins/PluginsBuilder.pm 2.0.69-1/plugins/PluginsBuilder.pm
--- 2.0.57-1/plugins/PluginsBuilder.pm	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/plugins/PluginsBuilder.pm	2021-11-22 22:12:17.000000000 +0000
@@ -1,7 +1,5 @@
 package PluginsBuilder;
 
-# $Id$
-
 use base qw(Module::Build);
 
 use lib '../common/lib';
diff -pruN 2.0.57-1/plugins/plugin.sh.in 2.0.69-1/plugins/plugin.sh.in
--- 2.0.57-1/plugins/plugin.sh.in	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/plugins/plugin.sh.in	2021-11-22 22:12:17.000000000 +0000
@@ -23,19 +23,19 @@ clean_fieldname () {
 
 get_warning () {
     # Skip $2 if it isn't defined
-    if [ -n "$2" ]; then
-        local warntmp=$(eval "echo \$$2")
+    if [ -n "${2:-}" ]; then
+        eval "local warntmp=\$$2"
         if [ -n "$warntmp" ]; then
             echo "${warntmp}"
             return
         fi
     fi
-    local warntmp=$(eval "echo \$${1}_warning")
+    eval "local warntmp=\$${1}_warning"
     if [ -n "$warntmp" ]; then
         echo "${warntmp}"
         return
     fi
-    local warntmp=$warning
+    local warntmp="${warning:-}"
     if [ -n "$warntmp" ]; then
         echo "${warntmp}"
         return
@@ -44,11 +44,10 @@ get_warning () {
 
 
 # Usage:
-#   warning=${warning:-92}
-#   print_warning "$name"
+#   warning=${warning:-92} print_warning "$name"
 
 print_warning () {
-    warnout=$(get_warning $1 $2)
+    warnout=$(get_warning "$@")
     if [ -n "${warnout}" ]; then
         echo "${1}.warning ${warnout}"
     fi
@@ -58,27 +57,31 @@ print_warning () {
 
 get_critical () {
     # Skip $2 if it isn't defined
-    if [ -n "$2" ]; then
-        local crittmp=$(eval "echo \$$2")
+    if [ -n "${2:-}" ]; then
+        eval "local crittmp=\$$2"
         if [ -n "$crittmp" ]; then
             echo "${crittmp}"
             return
         fi
     fi
-    local crittmp=$(eval "echo \$${1}_critical")
+    eval "local crittmp=\$${1}_critical"
     if [ -n "$crittmp" ]; then
         echo "${crittmp}"
         return
     fi
-    local crittmp=$critical
+    local crittmp="${critical:-}"
     if [ -n "$crittmp" ]; then
         echo "${crittmp}"
         return
     fi
 }
 
+
+# Usage:
+#   critical=${critical:-98} print_critical "$name"
+
 print_critical () {
-    critout=$(get_critical $1 $2)
+    critout=$(get_critical "$@")
     if [ -n "${critout}" ]; then
         echo "${1}.critical ${critout}"
     fi
@@ -94,10 +97,10 @@ print_critical () {
 #
 adjust_threshold () {
 
-    if [ -n "$1" -a -n "$2" ]; then
+    if [ -n "$1" ] && [ -n "$2" ]; then
         echo "$1" | awk "BEGIN { FS=\":\"; OFS=\":\" }
-        \$1 ~ /.*%/ {\$1 = $2 * substr(\$1, 0, length(\$1) - 1) / 100}
-        \$2 ~ /.*%/ {\$2 = $2 * substr(\$2, 0, length(\$2) - 1) / 100}
+        \$1 ~ /.*%/ {\$1 = $2 * substr(\$1, 1, length(\$1) - 1) / 100}
+        \$2 ~ /.*%/ {\$2 = $2 * substr(\$2, 1, length(\$2) - 1) / 100}
 
         { print }"
     fi
@@ -119,8 +122,8 @@ adjust_threshold () {
 #   user.critical 40
 
 print_thresholds() {
-    print_warning $1 $2
-    print_critical $1 $3
+    print_warning "$1" "${2:-}"
+    print_critical "$1" "${3:-}"
 }
 
 # print_adjusted_thresholds() takes four arguments.  The first is the field
@@ -137,11 +140,11 @@ print_thresholds() {
 #   user.critical 320
 #
 print_adjusted_thresholds () {
-    tempthresh=$(get_warning $1 $3)
+    tempthresh=$(get_warning "$1" "${3:-}")
     if [ -n "$tempthresh" ]; then
         echo "$1.warning $(adjust_threshold "$tempthresh" "$2")"
     fi
-    tempthresh=$(get_critical $1 $4)
+    tempthresh=$(get_critical "$1" "${4:-}")
     if [ -n "$tempthresh" ]; then
         echo "$1.critical $(adjust_threshold "$tempthresh" "$2")"
     fi
@@ -159,7 +162,7 @@ is_multigraph () {
     # sure it does not interact with old node installations at all
     # and thus does not break anything.
     #
-    case $MUNIN_CAP_MULTIGRAPH:$1 in
+    case "${MUNIN_CAP_MULTIGRAPH:-0}:${1:-}" in
     1:*) return;; # Yes! Rock and roll!
     *:autoconf)
         echo 'no (no multigraph support)'
@@ -182,22 +185,10 @@ is_multigraph () {
 
 is_dirtyconfig () {
     # Detect if node/server supports dirty config (feature not yet supported)
-    case $MUNIN_CAP_DIRTYCONFIG in
+    case "${MUNIN_CAP_DIRTYCONFIG:-0}" in
     1) exit 1;;
     *) exit 0;;
     esac
 }
 
-
-
-# janl_: can I in a shell script save STDOUT so I can restore it after
-#        a "exec >>somefile"?
-# james: exec 2>&4 etc.
-# janl_: this saves handle 2 in handle 4?
-# james: yes, that's basically the same as dup
-# james: dup2, even
-# janl_: so... ... "exec 4>&2" to restore?
-# james: Actually you can do: exec 4>&2- ... which closes 4 afterwards ...
-#        I think that's historical behaviour and not a newish extension
-
 # vim: ft=sh sw=4 ts=4 et
diff -pruN 2.0.57-1/RELEASE 2.0.69-1/RELEASE
--- 2.0.57-1/RELEASE	2020-03-10 15:18:49.000000000 +0000
+++ 2.0.69-1/RELEASE	2021-11-23 20:36:52.000000000 +0000
@@ -1 +1 @@
-2.0.57
+2.0.69
diff -pruN 2.0.57-1/.travis.yml 2.0.69-1/.travis.yml
--- 2.0.57-1/.travis.yml	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/.travis.yml	2021-11-22 22:12:17.000000000 +0000
@@ -68,3 +68,4 @@ script:
   # the old travis environment requires an old flake8 invocation
   - PYTHON_LINT_CALL="python3 -m flake8.main" make lint
   - make test
+  - make clean && dev_scripts/install && dev_scripts/run munin-node-configure --suggest
diff -pruN 2.0.57-1/UPGRADING-1.4 2.0.69-1/UPGRADING-1.4
--- 2.0.57-1/UPGRADING-1.4	2020-03-09 01:59:44.000000000 +0000
+++ 2.0.69-1/UPGRADING-1.4	2021-11-22 22:12:17.000000000 +0000
@@ -95,10 +95,10 @@ how to set these levels.
 
 Too audit the differences in warning and critical levels you can make
 a copy of the munin file called "datafile" before upgrading (or get
-one from backup), and use egrep to get a listing of the settings prior
+one from backup), and use grep -E to get a listing of the settings prior
 to update:
 
-  egrep '(warning|critical)' datafile.old
+  grep -E '(warning|critical)' datafile.old
 
 and again on the post-upgrade datafile to compare the lists so you can
 specify the ones you need.
