Package: release.debian.org
Severity: normal
User: release.debian....@packages.debian.org
Usertags: unblock

Please unblock package munin, it fixes three important bugs (and a bunch
of normal bugs). munin is a leaf package and 2.0.49 is just another bugfix
release and has been in sid since 11 days without any new issues reported.

munin (2.0.49-1) unstable; urgency=medium

  [ Lars Kruse ]
  * New upstream version 2.0.49, fixing the upstream issue #1187
    (https://github.com/munin-monitoring/munin/issues/1187) which breaks the
    visualization of comparison pages and the "problems" overview for munin's
    default settings ("html_strategy" and "graph_strategy" being "cron").
  * New upstream version 2.0.48, fixing various issues, including bugs in:
    - Accept DNS names in "allow" (Closes: #483617)
    - Natural sort output on cpuspeed plugin (Closes: #924366)
    - postgres_connections_ "Query failed!" (Closes: #924424)
    - diskstat_ plugin fails with 4.19 kernels (Closes: #926146)
    - open_files max is 18 quintillion, obscuring graph (Closes: #928211)
    - upstream issues:
      * https://github.com/munin-monitoring/munin/issues/579:
        A connection issue with a node leads to the premature removal of all
        its graphs from the master visualization, if any plugin (from any
        node) returned an invalid output.
      * https://github.com/munin-monitoring/munin/issues/951:
        munin-async failed to handle plugins with names containing special
        characters. Such valid plugins worked only locally, but not via
        munin-async.
      * https://github.com/munin-monitoring/munin/issues/460:
        In an fcgid-based setup (recommended when using nginx) every but the
        first request for a "comparison" page returned invalid graphs due to
        a mistaken permanent internal state change. This long-standing issue
        plagued munin since wheezy.
  * Re-export upstream signing key without extra signatures.
  * Ensure that /var/cache/munin/www exists.
    Thanks to Marvin Gülker (Closes: #927692)
  * Keep permission of /run/munin in sync for systemd and sysvinit

 -- Holger Levsen <hol...@debian.org>  Thu, 16 May 2019 01:21:08 +0200

$ debdiff munin_2.0.47-1.dsc  munin_2.0.49-1.dsc | diffstat
 ChangeLog                                           |   56 ++++++++++++
 RELEASE                                             |    2 
 debian/changelog                                    |   57 ++++++++++--
 debian/examples/systemd-fastcgi/munin-graph.service |   11 ++
 debian/examples/systemd-fastcgi/munin-graph.socket  |    8 +
 debian/examples/systemd-fastcgi/munin-html.service  |   11 ++
 debian/examples/systemd-fastcgi/munin-html.socket   |    8 +
 debian/munin-common.tmpfile                         |    2 
 debian/munin-node.tmpfile                           |    2 
 debian/munin.examples                               |    1 
 debian/munin.init                                   |   10 +-
 debian/tests/munin-node/02.plugins.t                |    4 
 debian/upstream/signing-key.asc                     |   39 --------
 master/lib/Munin/Master/Config.pm                   |   21 +++-
 master/lib/Munin/Master/HTMLOld.pm                  |   92 ++++++++++++++++++--
 master/lib/Munin/Master/Node.pm                     |   32 ++++--
 master/lib/Munin/Master/Update.pm                   |    3 
 master/lib/Munin/Master/UpdateWorker.pm             |   26 ++++-
 node/_bin/munin-asyncd.in                           |    5 -
 node/lib/Munin/Node/Config.pm                       |    1 
 node/lib/Munin/Node/SpoolWriter.pm                  |    9 +
 node/t/munin_node_spoolreader.t                     |   40 ++++----
 node/t/munin_node_spoolwriter.t                     |    4 
 plugins/node.d.linux/acpi.in                        |    2 
 plugins/node.d.linux/cpuspeed.in                    |    2 
 plugins/node.d.linux/diskstat_.in                   |    4 
 plugins/node.d.linux/open_files.in                  |    6 -
 plugins/node.d/nutups_.in                           |   16 ++-
 plugins/node.d/postgres_connections_.in             |    2 
 plugins/node.d/snmp__if_.in                         |    4 
 30 files changed, 348 insertions(+), 132 deletions(-)

The full debdiff is attached.

unblock munin/2.0.49-1


-- 
tschau,
        Holger

-------------------------------------------------------------------------------
               holger@(debian|reproducible-builds|layer-acht).org
       PGP fingerprint: B8BF 5413 7B09 D35C F026 FE9D 091A B856 069A AA1C

Dance like no one's watching. Encrypt like everyone is.
diff -Nru munin-2.0.47/ChangeLog munin-2.0.49/ChangeLog
--- munin-2.0.47/ChangeLog	2019-02-28 15:43:36.000000000 +0100
+++ munin-2.0.49/ChangeLog	2019-05-09 05:45:43.000000000 +0200
@@ -1,5 +1,60 @@
 -*- text -*-
 
+munin-2.0.49, 2019-05-09
+
+-------
+Summary
+-------
+
+Bugfix release.
+
+------------------
+Detailed Changelog
+------------------
+
+Lars Kruse (2):
+      Fix the reversal of path manipulation
+      Add image path manipulation for "problems" graphs
+
+
+munin-2.0.48, 2019-05-03
+
+-------
+Summary
+-------
+
+Bugfix release.
+
+------------------
+Detailed Changelog
+------------------
+
+Lars Kruse (10):
+      munin-cgi-html: avoid accidental permanent path manipulation
+      Plugins: use natural order for numbered items with multiple digits
+      Ignore malformed lines when parsing "datafile"
+      Plugin snmp__if: handle broken "zero" speed announcements
+      Plugin diskstat_: accept block device information of newer kernel
+      tests: verify name munging of remote plugins via async
+      Plugin open_files: remove "max" field from graph
+      Allow node-specific TLS settings on the master
+      Add support for the Net::Server option "reverse_lookups"
+
+Matthew Gabeler-Lee (1):
+      fix(nutups): make frequency chart aware of input, output, not polling
+
+Valentin Lorentz (1):
+      Sanitise plugin names in munin-asyncd.
+
+Vincas Dargis (1):
+      Remove stray comment in postgresql_connections_
+
+Zenon Mousmoulas (3):
+      Let the server use max timestamp rather than now for non-timestamped
+      Do not fall back to current timestamp for spoolfetch
+      Use a named constant rather than hardcoding -1
+
+
 munin-2.0.47, 2019-02-28
 
 -------
@@ -16,6 +71,7 @@
       fix t/munin_master_update.t warning
       t: remove munin_master_processmanager.t
 
+
 munin-2.0.46, 2019-02-28
 
 -------
diff -Nru munin-2.0.47/debian/changelog munin-2.0.49/debian/changelog
--- munin-2.0.47/debian/changelog	2019-02-28 16:06:07.000000000 +0100
+++ munin-2.0.49/debian/changelog	2019-05-16 01:21:08.000000000 +0200
@@ -1,3 +1,37 @@
+munin (2.0.49-1) unstable; urgency=medium
+
+  [ Lars Kruse ]
+  * New upstream version 2.0.49, fixing the upstream issue #1187
+    (https://github.com/munin-monitoring/munin/issues/1187) which breaks the
+    visualization of comparison pages and the "problems" overview for munin's
+    default settings ("html_strategy" and "graph_strategy" being "cron").
+  * New upstream version 2.0.48, fixing various issues, including bugs in:
+    - Accept DNS names in "allow" (Closes: #483617)
+    - Natural sort output on cpuspeed plugin (Closes: #924366)
+    - postgres_connections_ "Query failed!" (Closes: #924424)
+    - diskstat_ plugin fails with 4.19 kernels (Closes: #926146)
+    - open_files max is 18 quintillion, obscuring graph (Closes: #928211)
+    - upstream issues:
+      * https://github.com/munin-monitoring/munin/issues/579:
+        A connection issue with a node leads to the premature removal of all
+        its graphs from the master visualization, if any plugin (from any
+        node) returned an invalid output.
+      * https://github.com/munin-monitoring/munin/issues/951:
+        munin-async failed to handle plugins with names containing special
+        characters. Such valid plugins worked only locally, but not via
+        munin-async.
+      * https://github.com/munin-monitoring/munin/issues/460:
+        In an fcgid-based setup (recommended when using nginx) every but the
+        first request for a "comparison" page returned invalid graphs due to
+        a mistaken permanent internal state change. This long-standing issue
+        plagued munin since wheezy.
+  * Re-export upstream signing key without extra signatures.
+  * Ensure that /var/cache/munin/www exists.
+    Thanks to Marvin Gülker (Closes: #927692)
+  * Keep permission of /run/munin in sync for systemd and sysvinit
+
+ -- Holger Levsen <hol...@debian.org>  Thu, 16 May 2019 01:21:08 +0200
+
 munin (2.0.47-1) unstable; urgency=medium
 
   [ Holger Levsen ]
@@ -8,14 +42,14 @@
   * Add 'Webservice' field to upstream metadata.
   * munin-node.README.Debian: update plugin customization hints
   * munin-node.README.Debian: mention behavioural changes due to systemd
-    (Closes: #921985)
+    (Closes: #918851, #921985)
   * Remove references to "munin-sched" (removed by upstream)
 
  -- Holger Levsen <hol...@debian.org>  Thu, 28 Feb 2019 16:06:07 +0100
 
 munin (2.0.45-1) unstable; urgency=medium
 
-  * New upstream release.
+  * New upstream release. (Closes: #918105)
 
  -- Holger Levsen <hol...@debian.org>  Thu, 07 Feb 2019 00:10:46 +0100
 
@@ -32,7 +66,7 @@
 
 munin (2.0.44-1) unstable; urgency=medium
 
-  * New upstream bugfix release.
+  * New upstream bugfix release. (Closes: #914138, #914156)
 
   [ Lars Kruse ]
   * Move plugin-related "Suggests" from "munin-node" to plugin packages.
@@ -63,7 +97,7 @@
 munin (2.0.43-1) unstable; urgency=medium
 
   [ Lars Kruse ]
-  * New upstream version 2.0.43, Closes: #913661
+  * New upstream version 2.0.43, Closes: #913661, #914157
   * Remove duplicate systemd-tmpfiles line for /run/munin from munin-node.
     Thanks to Vincas Dargis (Closes: #913784)
   * Add autopktest for default user context of plugins.
@@ -239,7 +273,7 @@
 munin (2.0.37-1) unstable; urgency=medium
 
   * New upstream version 2.0.37.
-  * New upstream version 2.0.36, Closes: #894017.
+  * New upstream version 2.0.36, Closes: #806172, #862240, #894017
   * New upstream version 2.0.35, fixing various issues, including bugs in:
     - plugin http_loadtime: Closes: #798258, #862794, #886517
     - plugin netstat: Closes: #861851
@@ -352,15 +386,16 @@
 
 munin (2.0.28-1) unstable; urgency=medium
 
-  * New upstream version. (Closes: #846391, #598554), see upstream ChangeLog
-    for details.
+  * New upstream version. (Closes: #846391, #598554, #682782), see
+    upstream ChangeLog for details.
 
  -- Holger Levsen <hol...@debian.org>  Tue, 06 Dec 2016 13:15:50 +0100
 
 munin (2.0.27-1) unstable; urgency=medium
 
-  * New upstream version, (Closes: #767032, #768553, #825136, #834194), see
-    upstream ChangeLog for details.
+  * New upstream version,
+    (Closes: #640168, #698302, #767032, #768553, #825136, #834194),
+    see upstream ChangeLog for details.
 
  -- Holger Levsen <hol...@debian.org>  Mon, 31 Oct 2016 21:59:54 +0100
 
@@ -607,7 +642,7 @@
     your work, Tom and Steve!
 
   [ Stig Sandbeck Mathisen ]
-  * New upstream version (Closes: #710527, #710529)
+  * New upstream version (Closes: #710527, #710528, #710529)
   * Add dep8 autopkg tests
   * Remove /var/lib/munin-node/ when purging munin-node
 
@@ -657,7 +692,7 @@
 
 munin (2.0.10-1) experimental; urgency=low
 
-  * New upstream release (Closes: #615957, #671448)
+  * New upstream release (Closes: #615957, #671448, #703149)
 
  -- Stig Sandbeck Mathisen <s...@debian.org>  Thu, 10 Jan 2013 11:07:33 +0100
 
diff -Nru munin-2.0.47/debian/examples/systemd-fastcgi/munin-graph.service munin-2.0.49/debian/examples/systemd-fastcgi/munin-graph.service
--- munin-2.0.47/debian/examples/systemd-fastcgi/munin-graph.service	1970-01-01 01:00:00.000000000 +0100
+++ munin-2.0.49/debian/examples/systemd-fastcgi/munin-graph.service	2019-05-06 14:57:26.000000000 +0200
@@ -0,0 +1,11 @@
+[Unit]
+Description=Munin FastCGI Graph
+Requires=munin-graph.socket
+
+[Service]
+User=munin
+Group=munin
+ExecStart=/usr/lib/munin/cgi/munin-cgi-graph
+StandardInput=socket
+StandardOutput=inherit
+StandardError=journal
diff -Nru munin-2.0.47/debian/examples/systemd-fastcgi/munin-graph.socket munin-2.0.49/debian/examples/systemd-fastcgi/munin-graph.socket
--- munin-2.0.47/debian/examples/systemd-fastcgi/munin-graph.socket	1970-01-01 01:00:00.000000000 +0100
+++ munin-2.0.49/debian/examples/systemd-fastcgi/munin-graph.socket	2019-05-06 14:57:26.000000000 +0200
@@ -0,0 +1,8 @@
+[Unit]
+Description=Munin FastCGI Graph Socket
+
+[Socket]
+ListenStream=/run/munin/fcgi-graph.sock
+
+[Install]
+WantedBy=sockets.target
diff -Nru munin-2.0.47/debian/examples/systemd-fastcgi/munin-html.service munin-2.0.49/debian/examples/systemd-fastcgi/munin-html.service
--- munin-2.0.47/debian/examples/systemd-fastcgi/munin-html.service	1970-01-01 01:00:00.000000000 +0100
+++ munin-2.0.49/debian/examples/systemd-fastcgi/munin-html.service	2019-05-06 14:57:26.000000000 +0200
@@ -0,0 +1,11 @@
+[Unit]
+Description=Munin FastCGI HTML
+Requires=munin-html.socket
+
+[Service]
+User=munin
+Group=munin
+ExecStart=/usr/lib/munin/cgi/munin-cgi-html
+StandardInput=socket
+StandardOutput=inherit
+StandardError=journal
diff -Nru munin-2.0.47/debian/examples/systemd-fastcgi/munin-html.socket munin-2.0.49/debian/examples/systemd-fastcgi/munin-html.socket
--- munin-2.0.47/debian/examples/systemd-fastcgi/munin-html.socket	1970-01-01 01:00:00.000000000 +0100
+++ munin-2.0.49/debian/examples/systemd-fastcgi/munin-html.socket	2019-05-06 14:57:26.000000000 +0200
@@ -0,0 +1,8 @@
+[Unit]
+Description=Munin FastCGI HTML Socket
+
+[Socket]
+ListenStream=/run/munin/fcgi-html.sock
+
+[Install]
+WantedBy=sockets.target
diff -Nru munin-2.0.47/debian/munin-common.tmpfile munin-2.0.49/debian/munin-common.tmpfile
--- munin-2.0.47/debian/munin-common.tmpfile	2019-02-28 15:50:42.000000000 +0100
+++ munin-2.0.49/debian/munin-common.tmpfile	2019-05-09 15:20:41.000000000 +0200
@@ -5,4 +5,6 @@
 # See tmpfiles.d(5) for details
 #
 
+# keep in sync with debian/munin.init (non-systemd)
 d /run/munin 0755 munin root
+d /var/cache/munin/www 0755 munin munin
diff -Nru munin-2.0.47/debian/munin.examples munin-2.0.49/debian/munin.examples
--- munin-2.0.47/debian/munin.examples	2019-02-28 15:50:43.000000000 +0100
+++ munin-2.0.49/debian/munin.examples	2019-05-06 14:57:26.000000000 +0200
@@ -1 +1,2 @@
 debian/examples/nginx
+debian/examples/systemd-fastcgi
diff -Nru munin-2.0.47/debian/munin.init munin-2.0.49/debian/munin.init
--- munin-2.0.47/debian/munin.init	2019-02-28 15:50:43.000000000 +0100
+++ munin-2.0.49/debian/munin.init	2019-05-09 15:20:41.000000000 +0200
@@ -6,8 +6,8 @@
 # Required-Stop:     $network $named $local_fs $remote_fs
 # Default-Start:     2 3 4 5
 # Default-Stop:      0 1 6
-# Short-Description: Create /run/munin on boot
-# Description:       Create /run/munin on boot. Munin itself runs as CGI and has no extra startscript...
+# Short-Description: Create munin master directories on boot
+# Description:       Create munin master directories on boot. Munin itself runs as CGI or via cron and does not run a separate daemon.
 ### END INIT INFO
 
 
@@ -19,8 +19,10 @@
 
 case "$1" in
   start|restart|force-reload)
-	# Create various dirs
-	mkdir -p /run/munin && chown munin /run/munin
+	# Create various directories
+	# keep in sync with debian/munin-common.tmpfile (systemd-only)
+	mkdir -p /run/munin && chown munin /run/munin && chmod 755 /run/munin
+	mkdir -p /var/cache/munin/www && chown munin. /var/cache/munin/www && chmod 755 /var/cache/munin/www
 	exit $?
 	;;
   stop)
diff -Nru munin-2.0.47/debian/munin-node.tmpfile munin-2.0.49/debian/munin-node.tmpfile
--- munin-2.0.47/debian/munin-node.tmpfile	2019-02-28 15:50:42.000000000 +0100
+++ munin-2.0.49/debian/munin-node.tmpfile	2019-05-09 15:20:41.000000000 +0200
@@ -1,3 +1,3 @@
-# keep in sync with debian/munin.munin-node.init (non-systemd)
+# keep in sync with debian/munin-node.init (non-systemd)
 # /run/munin is handled by the dependent package "munin-common" (see debian/munin-common.tmpfile)
 d /var/log/munin 0755 munin adm
diff -Nru munin-2.0.47/debian/tests/munin-node/02.plugins.t munin-2.0.49/debian/tests/munin-node/02.plugins.t
--- munin-2.0.47/debian/tests/munin-node/02.plugins.t	2019-02-28 15:50:43.000000000 +0100
+++ munin-2.0.49/debian/tests/munin-node/02.plugins.t	2019-05-09 15:19:30.000000000 +0200
@@ -27,7 +27,6 @@
 irqstats
 load
 memory
-netstat
 open_files
 open_inodes
 proc_pri
@@ -51,6 +50,9 @@
       echo fw_conntrack
       echo fw_forwarded_local
     fi
+    if [ -x /bin/netstat ]; then
+      echo netstat
+    fi
   } | sort >expected_plugins
   test_cmp expected_plugins all_without_network_interfaces
 '
diff -Nru munin-2.0.47/debian/upstream/signing-key.asc munin-2.0.49/debian/upstream/signing-key.asc
--- munin-2.0.47/debian/upstream/signing-key.asc	2019-02-28 15:50:43.000000000 +0100
+++ munin-2.0.49/debian/upstream/signing-key.asc	2019-05-09 15:20:41.000000000 +0200
@@ -1,5 +1,4 @@
 -----BEGIN PGP PUBLIC KEY BLOCK-----
-Version: GnuPG v1
 
 mQINBE9Z0UYBEAChD/KVfJFENj65GLjiVEnrLwPqN6wF2EPsu3hnacKmXBJIUVOh
 ER6XC9hFmR2ZIXd8vkaHIIJ/3QmeUQsJWtd4JjHKV7vpTwStFbxtsexU0HVGpO10
@@ -73,40 +72,6 @@
 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
-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
-KKdSbY0AFQ==
-=qrF0
+L7FW3jHudm/cMmq68DXxQA==
+=WQyk
 -----END PGP PUBLIC KEY BLOCK-----
diff -Nru munin-2.0.47/master/lib/Munin/Master/Config.pm munin-2.0.49/master/lib/Munin/Master/Config.pm
--- munin-2.0.47/master/lib/Munin/Master/Config.pm	2019-02-28 15:43:36.000000000 +0100
+++ munin-2.0.49/master/lib/Munin/Master/Config.pm	2019-05-09 05:45:43.000000000 +0200
@@ -470,17 +470,26 @@
 
 sub _parse_config_line {
     # Parse and save contents of random user configuration.
-    my ($self, $prefix, $key, $value) = @_;
-    
-    my $longkey = $self->_concat_config_line_ok($prefix,$key,$value);
+    my ($self, $prefix, $key, $value, $skip_on_error) = @_;
+    my $longkey;
 
+    if ($skip_on_error) {
+        eval { $longkey = $self->_concat_config_line_ok($prefix, $key, $value); };
+        # Skip single malformed lines (error messages were emitted before).
+        # This is suitable for fault tolerant parsing of "datafile".
+        return if $EVAL_ERROR;
+    } else {
+        # A problem with a malformed line is allowed to rise to the file level.
+        # This is suitable for configuration files.
+        $longkey = $self->_concat_config_line_ok($prefix, $key, $value);
+    }
     $self->set_value($longkey,$value);
 }
 
 
 sub parse_config {
-    my ($self, $io) = @_;
-        
+    my ($self, $io, $skip_line_on_error) = @_;
+
     my $section = undef;
 
     my $continuation = '';
@@ -513,7 +522,7 @@
 	    $prefix = $1;
 	} else {
 	    my($key,$value) = split(/\s+/,$line,2);
-	    $self->_parse_config_line($prefix,$key,$value);
+	    $self->_parse_config_line($prefix, $key, $value, $skip_line_on_error);
         }
     }
 }
diff -Nru munin-2.0.47/master/lib/Munin/Master/HTMLOld.pm munin-2.0.49/master/lib/Munin/Master/HTMLOld.pm
--- munin-2.0.47/master/lib/Munin/Master/HTMLOld.pm	2019-02-28 15:43:36.000000000 +0100
+++ munin-2.0.49/master/lib/Munin/Master/HTMLOld.pm	2019-05-09 05:45:43.000000000 +0200
@@ -285,6 +285,9 @@
     # or even worse within a category inside it. We strip out the
     # extra '../' that is used to generate a relative path which is no
     # longer valid.
+    # Sadly this change is permanent and will influence successive
+    # responses in a permanent execution environment like fcgid or
+    # as a systemd socket service.  Thus we need to revert it later.
     foreach my $cat(@{$key->{'comparecategories'}}) {
         foreach my $service(@{$cat->{'services'}}) {
             foreach my $node(@{$service->{'nodes'}}) {
@@ -292,6 +295,8 @@
                               cimgday cimgweek cimgmonth cimgyear
                               zoomday zoomweek zoommonth zoomyear)) {
                     next unless defined($node->{$imgsrc});
+                    # keep a copy of the original value (to be restored below)
+                    $node->{"orig_$imgsrc"} = $node->{$imgsrc};
                     $node->{$imgsrc} =~ s|^\.\./\.\./(?:\.\./)?|../|;
                 }
             }
@@ -322,13 +327,32 @@
 									NWARNING => scalar(@{$htmlconfig->{"problems"}->{"warnings"}}),
 									NUNKNOWN => scalar(@{$htmlconfig->{"problems"}->{"unknowns"}}),
     );
+
+    # store template output before reverting links
+    my $template_output = $comparisontemplates{$t}->output;
+
+    # restore the paths to their original value
+    foreach my $cat(@{$key->{'comparecategories'}}) {
+        foreach my $service(@{$cat->{'services'}}) {
+            foreach my $node(@{$service->{'nodes'}}) {
+                foreach my $imgsrc(qw(imgday imgweek imgmonth imgyear
+                              cimgday cimgweek cimgmonth cimgyear
+                              zoomday zoomweek zoommonth zoomyear)) {
+                    next unless defined($node->{$imgsrc});
+                    $node->{$imgsrc} = $node->{"orig_$imgsrc"};
+                    delete($node->{"orig_$imgsrc"});
+                }
+            }
+        }
+    }
+
     if($emit_to_stdout){
-		print $comparisontemplates{$t}->output;
+        print $template_output;
 	} else {
 		ensure_dir_exists($file);
 	    open(my $FILE, '>', $file)
     	    or die "Cannot open $file for writing: $!";
-	    print $FILE $comparisontemplates{$t}->output;
+        print $FILE $template_output;
     	close $FILE;
 	}
 }
@@ -402,12 +426,18 @@
 
     DEBUG "[DEBUG] Creating global category page ".$filename;
 
+    # Manipulate the relative paths for the requested root-level context.
+    # Sadly this change is permanent and will influence successive
+    # responses in a permanent execution environment like fcgid or
+    # as a systemd socket service.  Thus we need to revert it later.
     foreach my $graphs(@{$key->{'graphs'}}) {
         foreach my $graph(@{$graphs->{'graphs'}}) {
             foreach my $imgsrc(qw(imgday imgweek imgmonth imgyear
                               cimgday cimgweek cimgmonth cimgyear
                               zoomday zoomweek zoommonth zoomyear)) {
-                $graph->{$imgsrc} =~ s|^(?:\.\./)+||
+                # keep a copy of the original value (to be restored below)
+                $graph->{"orig_$imgsrc"} = $graph->{$imgsrc};
+                $graph->{$imgsrc} =~ s|^(?:\.\./)+||;
             }
         }
     }
@@ -432,13 +462,28 @@
 						  NUNKNOWN => scalar(@{$htmlconfig->{"problems"}->{"unknowns"}}),
                          );
 
+    # store template output before reverting links
+    my $template_output = $graphtemplate->output;
+
+    # restore the paths to their original value
+    foreach my $graphs(@{$key->{'graphs'}}) {
+        foreach my $graph(@{$graphs->{'graphs'}}) {
+            foreach my $imgsrc(qw(imgday imgweek imgmonth imgyear
+                              cimgday cimgweek cimgmonth cimgyear
+                              zoomday zoomweek zoommonth zoomyear)) {
+                $graph->{$imgsrc} = $graph->{"orig_$imgsrc"};
+                delete($graph->{"orig_$imgsrc"});
+            }
+        }
+    }
+
     if($emit_to_stdout){
-		print $graphtemplate->output;
+        print $template_output;
 	} else {
 		ensure_dir_exists($filename);
 	    open(my $FILE, '>', $filename)
 			or die "Cannot open $filename for writing: $!";
-    	print $FILE $graphtemplate->output;
+        print $FILE $template_output;
 	    close $FILE;
 	}
 }
@@ -465,6 +510,23 @@
 
     INFO "[INFO] Creating problem page ".$filename;
 
+    # Manipulate the relative paths for the requested root-level context.
+    # Sadly this change is permanent and will influence successive
+    # responses in a permanent execution environment like fcgid or
+    # as a systemd socket service.  Thus we need to revert it later.
+    foreach my $problem_graphs (values %{$htmlconfig->{"problems"}}) {
+        foreach my $graph(@$problem_graphs) {
+            foreach my $imgsrc(qw(imgday imgweek imgmonth imgyear
+                                  cimgday cimgweek cimgmonth cimgyear
+                                  zoomday zoomweek zoommonth zoomyear)) {
+                next unless defined($graph->{$imgsrc});
+                # keep a copy of the original value (to be restored below)
+                $graph->{"orig_$imgsrc"} = $graph->{$imgsrc};
+                $graph->{$imgsrc} =~ s|^(?:\.\./)+||;
+            }
+        }
+    }
+
     $graphtemplate->param(
                           CSS_NAME    => get_css_name(),
                           R_PATH      => ".",
@@ -483,13 +545,29 @@
 						  NUNKNOWN => scalar(@{$htmlconfig->{"problems"}->{"unknowns"}}),
                          );
 
+    # store template output before reverting links
+    my $template_output = $graphtemplate->output;
+
+    # restore the paths to their original value
+    foreach my $problem_graphs (values %{$htmlconfig->{"problems"}}) {
+        foreach my $graph(@$problem_graphs) {
+            foreach my $imgsrc(qw(imgday imgweek imgmonth imgyear
+                                  cimgday cimgweek cimgmonth cimgyear
+                                  zoomday zoomweek zoommonth zoomyear)) {
+                next unless defined($graph->{$imgsrc});
+                $graph->{$imgsrc} = $graph->{"orig_$imgsrc"};
+                delete($graph->{"orig_$imgsrc"});
+            }
+        }
+    }
+
     if($emit_to_stdout){
-		print $graphtemplate->output;
+        print $template_output;
 	} else {
 		ensure_dir_exists($filename);
 	    open(my $FILE, '>', $filename)
 			or die "Cannot open $filename for writing: $!";
-    	print $FILE $graphtemplate->output;
+        print $FILE $template_output;
 	    close $FILE;
 	}
 }
diff -Nru munin-2.0.47/master/lib/Munin/Master/Node.pm munin-2.0.49/master/lib/Munin/Master/Node.pm
--- munin-2.0.47/master/lib/Munin/Master/Node.pm	2019-02-28 15:43:36.000000000 +0100
+++ munin-2.0.49/master/lib/Munin/Master/Node.pm	2019-05-09 05:45:43.000000000 +0200
@@ -17,6 +17,9 @@
 use Time::HiRes qw( gettimeofday tv_interval );
 use IO::Socket::INET6;
 
+# Used as a timestamp value, this declares none was found
+use constant NO_TIMESTAMP => -1;
+
 my $config = Munin::Master::Config->instance()->{config};
 
 # Quick version, to enable "DEBUG ... if $debug" constructs
@@ -151,13 +154,19 @@
     return 1;
 }
 
+
+sub _get_node_or_global_setting {
+    my ($self, $key) = @_;
+    return exists $self->{configref}->{$key} ? $self->{configref}->{$key} : $config->{$key};
+}
+
+
 sub _run_starttls_if_required {
     my ($self) = @_;
 
     # TLS should only be attempted if explicitly enabled. The default
     # value is therefore "disabled" (and not "auto" as before).
-    my $tls_requirement = exists $self->{configref}->{tls} ?
-                                   $self->{configref}->{tls} : $config->{tls};
+    my $tls_requirement = $self->_get_node_or_global_setting("tls");
     DEBUG "TLS set to \"$tls_requirement\".";
     return if $tls_requirement eq 'disabled';
     my $logger = Log::Log4perl->get_logger("Munin::Master");
@@ -166,13 +175,13 @@
         logger       => sub { $logger->warn(@_) },
         read_fd      => fileno($self->{reader}),
         read_func    => sub { _node_read_single($self) },
-        tls_ca_cert  => $config->{tls_ca_certificate},
-        tls_cert     => $config->{tls_certificate},
-        tls_paranoia => $tls_requirement, 
-        tls_priv     => $config->{tls_private_key},
-        tls_vdepth   => $config->{tls_verify_depth},
-        tls_verify   => $config->{tls_verify_certificate},
-        tls_match    => $config->{tls_match},
+        tls_ca_cert  => $self->_get_node_or_global_setting("tls_ca_certificate"),
+        tls_cert     => $self->_get_node_or_global_setting("tls_certificate"),
+        tls_paranoia => $tls_requirement,
+        tls_priv     => $self->_get_node_or_global_setting("tls_private_key"),
+        tls_vdepth   => $self->_get_node_or_global_setting("tls_verify_depth"),
+        tls_verify   => $self->_get_node_or_global_setting("tls_verify_certificate"),
+        tls_match    => $self->_get_node_or_global_setting("tls_match"),
         write_fd     => fileno($self->{writer}),
         write_func   => sub { _node_write_single($self, @_) },
     });
@@ -312,9 +321,6 @@
 
     new_service($service);
 
-    # every 'N' has the same value. Should not take parsing time into the equation
-    my $now = time;
-
     for my $line (@$lines) {
 
 	DEBUG "[CONFIG from $plugin] $line" if $debug;
@@ -362,7 +368,7 @@
         } elsif ($line =~ m{\A ([^\.]+)\.value \s+ (.+?) \s* $}xms) {
 	    $correct++;
 	    # Special case for dirtyconfig
-            my ($ds_name, $value, $when) = ($1, $2, $now);
+            my ($ds_name, $value, $when) = ($1, $2, NO_TIMESTAMP);
             
 	    $ds_name = $self->_sanitise_fieldname($ds_name);
 	    if ($value =~ /^(\d+):(.+)$/) {
diff -Nru munin-2.0.47/master/lib/Munin/Master/Update.pm munin-2.0.49/master/lib/Munin/Master/Update.pm
--- munin-2.0.47/master/lib/Munin/Master/Update.pm	2019-02-28 15:43:36.000000000 +0100
+++ munin-2.0.49/master/lib/Munin/Master/Update.pm	2019-05-09 05:45:43.000000000 +0200
@@ -81,7 +81,8 @@
 	    return {};
 	}
 	eval {
-	    $oldconfig->parse_config($file);
+            # parse file but skip malformed lines
+            $oldconfig->parse_config($file, 1);
 	};
 	if ($EVAL_ERROR) {
 	    WARN "[Warning] Could not parse datafile $datafile: $EVAL_ERROR";
diff -Nru munin-2.0.47/master/lib/Munin/Master/UpdateWorker.pm munin-2.0.49/master/lib/Munin/Master/UpdateWorker.pm
--- munin-2.0.47/master/lib/Munin/Master/UpdateWorker.pm	2019-02-28 15:43:36.000000000 +0100
+++ munin-2.0.49/master/lib/Munin/Master/UpdateWorker.pm	2019-05-09 05:45:43.000000000 +0200
@@ -224,7 +224,9 @@
 		    %{$service_config{global}});
 
 		my $last_updated_timestamp = $self->_update_rrd_files(\%service_config, \%service_data);
-          	$self->set_spoolfetch_timestamp($last_updated_timestamp);
+		if ($last_updated_timestamp) {
+		    $self->set_spoolfetch_timestamp($last_updated_timestamp);
+		}
 	    } # for @plugins
 
 	    # Send "quit" to node
@@ -574,7 +576,17 @@
     my $nodedesignation = $self->{host}{host_name}."/".
 	$self->{host}{address}.":".$self->{host}{port};
 
-    my $last_timestamp = 0;
+    my $last_timestamp =
+    	max(0,
+    	    map {
+    		my $svc = $_;
+    		map {
+    		    my $ds = $_;
+    		    @{$nested_service_data->{$svc}->{$ds}->{when} || []};
+    		} keys %{$nested_service_config->{data_source}{$svc}};
+    	    } keys %{$nested_service_config->{data_source}}
+    	);
+    my $last_timestamp_or_now = ($last_timestamp > 0) ? $last_timestamp : time;
 
     for my $service (keys %{$nested_service_config->{data_source}}) {
 
@@ -608,7 +620,7 @@
 	    my $rrd_file = $self->_create_rrd_file_if_needed($service, $ds_name, $ds_config, $first_epoch);
 
 	    if (defined($service_data) and defined($service_data->{$ds_name})) {
-		$last_timestamp = max($last_timestamp, $self->_update_rrd_file($rrd_file, $ds_name, $service_data->{$ds_name}));
+		$self->_update_rrd_file($rrd_file, $ds_name, $service_data->{$ds_name}, $last_timestamp_or_now);
 	    }
 	    else {
 		WARN "[WARNING] Service $service on $nodedesignation returned no data for label $ds_name";
@@ -848,7 +860,7 @@
 }
 
 sub _update_rrd_file {
-    my ($self, $rrd_file, $ds_name, $ds_values) = @_;
+    my ($self, $rrd_file, $ds_name, $ds_values, $max_timestamp) = @_;
 
     my $values = $ds_values->{value};
 
@@ -874,6 +886,10 @@
         my $value = $values->[$i];
         my $when = $ds_values->{when}[$i];
 
+	if ($when == $self->{node}->NO_TIMESTAMP) {
+	    $when = $max_timestamp;
+	}
+
 	# Ignore values that is not in monotonic increasing timestamp for the RRD.
 	# Otherwise it will reject the whole update
 	next if ($current_updated_timestamp && $when <= $current_updated_timestamp);
@@ -926,7 +942,7 @@
     $self->{state}{value}{"$rrd_file:42"}{current} = [ $current_updated_timestamp, $current_updated_value ]; 
     $self->{state}{value}{"$rrd_file:42"}{previous} = [ $previous_updated_timestamp, $previous_updated_value ]; 
 
-    return $current_updated_timestamp;
+    return scalar @update_rrd_data;
 }
 
 sub dump_to_file
diff -Nru munin-2.0.47/node/_bin/munin-asyncd.in munin-2.0.49/node/_bin/munin-asyncd.in
--- munin-2.0.47/node/_bin/munin-asyncd.in	2019-02-28 15:43:36.000000000 +0100
+++ munin-2.0.49/node/_bin/munin-asyncd.in	2019-05-09 05:45:43.000000000 +0200
@@ -125,7 +125,10 @@
 			"w",
 		);
 
-		print $fh_list $plugins_line;
+		my $sanitised_plugins_line = $plugins_line;
+		$sanitised_plugins_line =~ s/[^_A-Za-z0-9 ]/_/g;
+
+		print $fh_list $sanitised_plugins_line;
 		print $fh_list "\n";
 	}
 
diff -Nru munin-2.0.47/node/lib/Munin/Node/Config.pm munin-2.0.49/node/lib/Munin/Node/Config.pm
--- munin-2.0.47/node/lib/Munin/Node/Config.pm	2019-02-28 15:43:36.000000000 +0100
+++ munin-2.0.49/node/lib/Munin/Node/Config.pm	2019-05-09 05:45:43.000000000 +0200
@@ -138,6 +138,7 @@
           deny
           cidr_allow
           cidr_deny
+          reverse_lookups
      );
 
     sub _handled_by_net_server {
diff -Nru munin-2.0.47/node/lib/Munin/Node/SpoolWriter.pm munin-2.0.49/node/lib/Munin/Node/SpoolWriter.pm
--- munin-2.0.47/node/lib/Munin/Node/SpoolWriter.pm	2019-02-28 15:43:36.000000000 +0100
+++ munin-2.0.49/node/lib/Munin/Node/SpoolWriter.pm	2019-05-09 05:45:43.000000000 +0200
@@ -102,6 +102,10 @@
 {
     my ($self, $timestamp, $service, $data) = @_;
 
+    # squash the $service name with the same rules as the munin-update when using plain TCP
+    # Closes D:710529
+    $service =~ s/[^_A-Za-z0-9]/_/g;
+
     my $fmtTimestamp = $self->_snap_to_epoch_boundary($timestamp);
 
     open my $fh , '>>', "$self->{spooldir}/munin-daemon.$service.$fmtTimestamp." . $self->{interval_size}
@@ -110,10 +114,7 @@
 
     print {$fh} "timestamp $timestamp\n";
 
-    # squash the $service name with the same rules as the munin-update when using plain TCP
-    # Closes D:710529
-    my $service_squashed = $service; $service_squashed =~ tr/.:/__/;
-    print {$fh} "multigraph $service_squashed\n" unless $data->[0] =~ m{^multigraph};
+    print {$fh} "multigraph $service\n" unless $data->[0] =~ m{^multigraph};
 
     foreach my $line (@$data) {
         # Ignore blank lines and "."-ones.
diff -Nru munin-2.0.47/node/t/munin_node_spoolreader.t munin-2.0.49/node/t/munin_node_spoolreader.t
--- munin-2.0.47/node/t/munin_node_spoolreader.t	2019-02-28 15:43:36.000000000 +0100
+++ munin-2.0.49/node/t/munin_node_spoolreader.t	2019-05-09 05:45:43.000000000 +0200
@@ -38,52 +38,52 @@
     my $reader = Munin::Node::SpoolReader->new(spooldir => $dir);
 
     # write some data
-    $writer->write(1234567890, 'fnord', [
+    $writer->write(1234567890, 'fnord-foo', [
         'graph_title CPU usage',
         'system.label system',
         'system.value 1',
     ]);
 
-    $writer->write(1234567900, 'fnord', [
+    $writer->write(1234567900, 'fnord-foo', [
         'graph_title CPU usage',
         'system.label system',
         'system.value 2',
     ]);
 
-    $writer->write(1234567910, 'fnord', [
+    $writer->write(1234567910, 'fnord-foo', [
         'graph_title CPU usage',
         'system.label system',
         'system.value 3',
     ]);
 
     is_string($reader->fetch(1234567899), <<EOS, 'Fetched data since the write');
-multigraph fnord
+multigraph fnord_foo
 graph_title CPU usage
 system.label system
 system.value 1234567900:2
-multigraph fnord
+multigraph fnord_foo
 graph_title CPU usage
 system.label system
 system.value 1234567910:3
 EOS
 
     is_string($reader->fetch(1234567900), <<EOS, 'Start timestamp is not inclusive');
-multigraph fnord
+multigraph fnord_foo
 graph_title CPU usage
 system.label system
 system.value 1234567910:3
 EOS
 
     is_string($reader->fetch(1), <<EOS, 'Timestamp predates all result: all results are returned');
-multigraph fnord
+multigraph fnord_foo
 graph_title CPU usage
 system.label system
 system.value 1234567890:1
-multigraph fnord
+multigraph fnord_foo
 graph_title CPU usage
 system.label system
 system.value 1234567900:2
-multigraph fnord
+multigraph fnord_foo
 graph_title CPU usage
 system.label system
 system.value 1234567910:3
@@ -97,7 +97,7 @@
     my $reader = Munin::Node::SpoolReader->new(spooldir => $dir);
 
     # write some data
-    $writer->write(1234567890, 'fnord', [
+    $writer->write(1234567890, 'fnord-foo', [
         'graph_title CPU usage',
         'system.label system',
         '',
@@ -106,7 +106,7 @@
     ]);
 
     is_string($reader->fetch(1), <<EOS, 'Blank lines are ignored');
-multigraph fnord
+multigraph fnord_foo
 graph_title CPU usage
 system.label system
 system.value 1234567890:1
@@ -119,7 +119,7 @@
     my $reader = Munin::Node::SpoolReader->new(spooldir => $dir);
 
     # write results for two different plugins
-    $writer->write(1234567890, 'fnord', [
+    $writer->write(1234567890, 'fnord-foo', [
         'graph_title CPU usage',
         'system.label system',
         'system.value 3',
@@ -134,7 +134,7 @@
     ok(my $fetched = $reader->fetch(1234567800), 'Several services to fetch');
 
     my $f1 = <<EOT;
-multigraph fnord
+multigraph fnord_foo
 graph_title CPU usage
 system.label system
 system.value 1234567890:3
@@ -162,13 +162,13 @@
     my $reader = Munin::Node::SpoolReader->new(spooldir => $dir);
 
     # write two sets of results, with a slightly different config
-    $writer->write(1234567890, 'fnord', [
+    $writer->write(1234567890, 'fnord-foo', [
         'graph_title CPU usage',
         'system.label system',
         'system.value 3',
     ]);
 
-    $writer->write(1234567990, 'fnord', [
+    $writer->write(1234567990, 'fnord-foo', [
         'graph_title CPU usage!',  # this line has changed
         'system.label system',
         'system.value 4',
@@ -177,13 +177,13 @@
     ok(my $fetched = $reader->fetch(1234567800), 'Several sets of results to fetch');
 
     my $f1 = <<EOT;
-multigraph fnord
+multigraph fnord_foo
 graph_title CPU usage
 system.label system
 system.value 1234567890:3
 EOT
     my $f2 = <<EOT;
-multigraph fnord
+multigraph fnord_foo
 graph_title CPU usage!
 system.label system
 system.value 1234567990:4
@@ -203,7 +203,7 @@
     is($reader->list, "\n", 'No spooled plugins to list');
 
     # write "results" for several plugins
-    $writer->write(1234567890, 'fnord', [
+    $writer->write(1234567890, 'fnord-foo', [
         'graph_title CPU usage',
         'system.label system',
         'system.value 1',
@@ -228,7 +228,7 @@
     print $cruft "rubbish\n";
     close $cruft;
 
-    is_deeply([ sort $reader->_get_spooled_plugins ], [ sort qw( fnord floop blort ) ], 'Retrieved list of spooled plugins');
-    is($reader->list, "blort floop fnord\n", 'Retrieved stringified list of spooled plugins');
+    is_deeply([ sort $reader->_get_spooled_plugins ], [ sort qw( fnord_foo floop blort ) ], 'Retrieved list of spooled plugins');
+    is($reader->list, "blort floop fnord_foo\n", 'Retrieved stringified list of spooled plugins');
 }
 
diff -Nru munin-2.0.47/node/t/munin_node_spoolwriter.t munin-2.0.49/node/t/munin_node_spoolwriter.t
--- munin-2.0.47/node/t/munin_node_spoolwriter.t	2019-02-28 15:43:36.000000000 +0100
+++ munin-2.0.49/node/t/munin_node_spoolwriter.t	2019-05-09 05:45:43.000000000 +0200
@@ -144,7 +144,7 @@
     my $dir = tempdir( CLEANUP => 1 );
     my $writer = Munin::Node::SpoolWriter->new(spooldir => $dir);
 
-    $writer->write(1234567890, 'fnord', [
+    $writer->write(1234567890, 'fnord-foo', [
         'multigraph fnord',
         'graph_title CPU usage',
         'system.label system',
@@ -155,7 +155,7 @@
         'subsystem.value 123',
     ]);
 
-    my $data_file = "$dir/munin-daemon.fnord.1234483200" . "." . Munin::Node::SpoolWriter::DEFAULT_TIME;
+    my $data_file = "$dir/munin-daemon.fnord_foo.1234483200" . "." . Munin::Node::SpoolWriter::DEFAULT_TIME;
     ok( -r $data_file, 'spool file is readable') or last;
 
     my $data = read_file($data_file);
diff -Nru munin-2.0.47/plugins/node.d/nutups_.in munin-2.0.49/plugins/node.d/nutups_.in
--- munin-2.0.47/plugins/node.d/nutups_.in	2019-02-28 15:43:36.000000000 +0100
+++ munin-2.0.49/plugins/node.d/nutups_.in	2019-05-09 05:45:43.000000000 +0200
@@ -80,15 +80,19 @@
 frequency() {
 	if [ "$1" = "config" ]; then
 
-		echo "graph_title $UPS input AC frequency"
+		echo "graph_title $UPS AC frequency"
 		echo "graph_args --base 1000 -l 0"
 		echo "graph_vlabel frequency 1/s"
-		echo "acfreq.label AC frequency"
-		echo "acfreq.type GAUGE"
-		echo "acfreq.max 100"
-		echo "acfreq.min 5"
+		echo "inputfreq.label Input AC frequency"
+		echo "inputfreq.type GAUGE"
+		echo "inputfreq.max 100"
+		echo "inputfreq.min 5"
+		echo "outputfreq.label Output AC frequency"
+		echo "outputfreq.type GAUGE"
+		echo "outputfreq.max 100"
+		echo "outputfreq.min 5"
 	else
-		"$UPSC" "$UPS" | sed -n '/^[^:]*freq/{s/.*:/acfreq.value/;p}'
+		"$UPSC" "$UPS" | sed -n '/^[^:]*\(input\|output\)\.frequency:/{s/.*\(input\|output\).*:/\1freq.value/;p}'
 	fi
 }
 
diff -Nru munin-2.0.47/plugins/node.d/postgres_connections_.in munin-2.0.49/plugins/node.d/postgres_connections_.in
--- munin-2.0.47/plugins/node.d/postgres_connections_.in	2019-02-28 15:43:36.000000000 +0100
+++ munin-2.0.49/plugins/node.d/postgres_connections_.in	2019-05-09 05:45:43.000000000 +0200
@@ -78,7 +78,7 @@
                  count(*) AS count
                  FROM (SELECT act.state, act.wait_event_type, EXISTS (SELECT FROM pg_locks AS l WHERE l.pid = act.pid) AS locked, act.query
                        FROM pg_stat_activity AS act
-                       WHERE act.pid != pg_backend_pid() AND act.backend_type = 'client backend' /*%%FILTER%%*/)
+                       WHERE act.pid != pg_backend_pid() AND act.backend_type = 'client backend' %%FILTER%%)
                  AS a GROUP BY 1
                  ) AS tmp2
                 ON tmp.mstate=tmp2.mstate
diff -Nru munin-2.0.47/plugins/node.d/snmp__if_.in munin-2.0.49/plugins/node.d/snmp__if_.in
--- munin-2.0.47/plugins/node.d/snmp__if_.in	2019-02-28 15:43:36.000000000 +0100
+++ munin-2.0.49/plugins/node.d/snmp__if_.in	2019-05-09 05:45:43.000000000 +0200
@@ -238,14 +238,14 @@
     print "recv.cdef recv,8,*\n";
     print "recv.max $speed\n";
     print "recv.min 0\n";
-    print "recv.warning ", ($warn), "\n" if defined $warn;
+    print "recv.warning ", ($warn), "\n" if defined $warn && ($warn != 0);
     print "send.label bps\n";
     print "send.type DERIVE\n";
     print "send.negative recv\n";
     print "send.cdef send,8,*\n";
     print "send.max $speed\n";
     print "send.min 0\n";
-    print "send.warning $warn\n" if defined $warn;
+    print "send.warning $warn\n" if defined $warn && ($warn != 0);
     exit 0;
 }
 
diff -Nru munin-2.0.47/plugins/node.d.linux/acpi.in munin-2.0.49/plugins/node.d.linux/acpi.in
--- munin-2.0.47/plugins/node.d.linux/acpi.in	2019-02-28 15:43:36.000000000 +0100
+++ munin-2.0.49/plugins/node.d.linux/acpi.in	2019-05-09 05:45:43.000000000 +0200
@@ -50,7 +50,7 @@
 
 # directories containing thermal zone information
 if [ -d /sys/class/thermal/ ]; then
-    ATZ=$(find /sys/class/thermal/ -maxdepth 1 -name "thermal_zone*")
+    ATZ=$(find /sys/class/thermal/ -maxdepth 1 -name "thermal_zone*" | sort -V)
 else
     ATZ=
 fi
diff -Nru munin-2.0.47/plugins/node.d.linux/cpuspeed.in munin-2.0.49/plugins/node.d.linux/cpuspeed.in
--- munin-2.0.47/plugins/node.d.linux/cpuspeed.in	2019-02-28 15:43:36.000000000 +0100
+++ munin-2.0.49/plugins/node.d.linux/cpuspeed.in	2019-05-09 05:45:43.000000000 +0200
@@ -141,7 +141,7 @@
         print_warning "cpu$N"
         print_critical "cpu$N"
 
-    done
+    done | sort -V
     if [ "${MUNIN_CAP_DIRTYCONFIG:-0}" != 1 ]; then exit 0; fi
 fi
 
diff -Nru munin-2.0.47/plugins/node.d.linux/diskstat_.in munin-2.0.49/plugins/node.d.linux/diskstat_.in
--- munin-2.0.47/plugins/node.d.linux/diskstat_.in	2019-02-28 15:43:36.000000000 +0100
+++ munin-2.0.49/plugins/node.d.linux/diskstat_.in	2019-05-09 05:45:43.000000000 +0200
@@ -502,8 +502,8 @@
 
         my @elems = split /\s+/, $line;
 
-        croak "'$stats_file' doesn't contain exactly 11 values. Aborting"
-            if ( @elems != 11 );
+        croak "'$stats_file' contains less than 11 values. Aborting"
+            if ( @elems < 11 );
 
         # Translate the devicename back before storing the information
         $cur_device =~ tr#!#/#;
diff -Nru munin-2.0.47/plugins/node.d.linux/open_files.in munin-2.0.49/plugins/node.d.linux/open_files.in
--- munin-2.0.47/plugins/node.d.linux/open_files.in	2019-02-28 15:43:36.000000000 +0100
+++ munin-2.0.49/plugins/node.d.linux/open_files.in	2019-05-09 05:45:43.000000000 +0200
@@ -53,11 +53,7 @@
 	p_critical=$(print_critical used)
 	[ -z "$p_warning" ] && echo "used.warning $computed_warning" || echo "$p_warning"
 	[ -z "$p_critical" ] && echo "used.critical $computed_critical" || echo "$p_critical"
-	echo 'max.label max open files'
-	echo 'max.info The maximum supported number of open files. Tune by modifying /proc/sys/fs/file-max.'
-	print_warning max
-	print_critical max
 	exit 0
 fi
 
-awk '{print "used.value " $1-$2 "\nmax.value " $3}' < /proc/sys/fs/file-nr
+awk '{print "used.value " $1-$2}' < /proc/sys/fs/file-nr
diff -Nru munin-2.0.47/RELEASE munin-2.0.49/RELEASE
--- munin-2.0.47/RELEASE	2019-02-28 15:45:50.000000000 +0100
+++ munin-2.0.49/RELEASE	2019-05-09 09:26:27.000000000 +0200
@@ -1 +1 @@
-2.0.47
+2.0.49

Attachment: signature.asc
Description: PGP signature

Reply via email to