From 3722e31f9385e9a1edad92073167c7122dbcfcb9 Mon Sep 17 00:00:00 2001 From: "Adam D. Barratt" Date: Mon, 28 Jan 2019 15:05:26 +0000 Subject: [PATCH] dsa-check-soas: fix error when 0 (or more than 1) records returned 3956f21a moved some processing into resolve_ns. When an unexpected number of records is returned, an attempt is made to update the list of warnings, which is not within resolve_ns()'s local scope. The result is an "undefined local variable" error. Resolve this by explicitly marking the "warnings" list as in instance scope. (Although it is not currently a problem, the "OKs" list is also similarly marked, for future-proofing.) Signed-off-by: Adam D. Barratt --- dsa-nagios-checks/checks/dsa-check-soas | 26 ++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/dsa-nagios-checks/checks/dsa-check-soas b/dsa-nagios-checks/checks/dsa-check-soas index eb28d8c..7c762a0 100755 --- a/dsa-nagios-checks/checks/dsa-check-soas +++ b/dsa-nagios-checks/checks/dsa-check-soas @@ -133,13 +133,13 @@ class DSADNS < Resolv::DNS end end -warnings = [] -oks = [] +@warnings = [] +@oks = [] def resolve_ns(dns, domain, nameserver) puts "Getting A record for nameserver #{nameserver} for #{domain}" if @verbose > 0 arecords = dns.getresources(nameserver, Resolv::DNS::Resource::IN::A) - warnings << "Nameserver #{nameserver} for #{domain} has #{arecords.length} A records" if arecords.length != 1 + @warnings << "Nameserver #{nameserver} for #{domain} has #{arecords.length} A records" if arecords.length != 1 addresses = arecords.map { |a| a.address.to_s } puts "Addresses for nameserver #{nameserver} for #{domain}: #{addresses.join(', ')}" if @verbose > 0 return addresses @@ -154,7 +154,7 @@ ARGV.each{ |domain| nameservernames = nameservers.collect{ |ns| ns.name.to_s } nameservernames.each do |nameserver| addrs = resolve_ns(dns, domain, nameserver) - warnings << "Duplicate nameserver #{nameserver} for #{domain}" if nameserver_addresses[nameserver] + @warnings << "Duplicate nameserver #{nameserver} for #{domain}" if nameserver_addresses[nameserver] nameserver_addresses[nameserver] = addrs end end @@ -165,7 +165,7 @@ ARGV.each{ |domain| rescue ArgumentError addrs = resolve_ns(dns, domain, ns) end - warnings << "Duplicate nameserver #{ns} for #{domain}" if nameserver_addresses[ns] + @warnings << "Duplicate nameserver #{ns} for #{domain}" if nameserver_addresses[ns] nameserver_addresses[ns] = addrs end @@ -178,10 +178,10 @@ ARGV.each{ |domain| resolver.rd = 0 soas = resolver.getresources(domain, Resolv::DNS::Resource::IN::SOA) rescue SystemCallError => e - warnings << "Could not resolve #{domain} on #{nameserver}: #{e.message}" + @warnings << "Could not resolve #{domain} on #{nameserver}: #{e.message}" else resolver.close - warnings << "Nameserver #{nameserver} for #{domain} returns #{soas.length} SOAs" if soas.length != 1 + @warnings << "Nameserver #{nameserver} for #{domain} returns #{soas.length} SOAs" if soas.length != 1 soas.each do |soa| puts " Nameserver #{nameserver} returns serial #{soa.serial} for #{domain}" if @verbose > 0 sn = soa.serial.to_i @@ -196,23 +196,23 @@ ARGV.each{ |domain| end case serial.keys.length when 0 - warnings << "Found no serials for #{domain}" + @warnings << "Found no serials for #{domain}" when 1 - oks << "#{domain} is at #{serial.keys.first}" + @oks << "#{domain} is at #{serial.keys.first}" else text = [] serial.keys.sort.each do |sn| text << "#{sn} (#{serial[sn].join(', ')})" end - warnings << "Nameservers disagree on serials for #{domain}: found #{text.join(', ')}" + @warnings << "Nameservers disagree on serials for #{domain}: found #{text.join(', ')}" end } dns.close -if warnings.length > 0 - puts warnings.join('; ') +if @warnings.length > 0 + puts @warnings.join('; ') exit NAGIOS_STATUS[:WARNING] else - puts oks.join('; ') + puts @oks.join('; ') exit NAGIOS_STATUS[:OK] end -- 2.20.1