set $user to <unknown> if lsof could not tell the username
[mirror/dsa-nagios.git] / dsa-nagios-checks / checks / dsa-check-libs
index 4406413..fd9e338 100755 (executable)
@@ -1,6 +1,6 @@
 #!/usr/bin/perl -w
 
-# Copyright (C) 2005, 2006, 2007, 2008, 2012 Peter Palfrader <peter@palfrader.org>
+# Copyright (C) 2005, 2006, 2007, 2008, 2012, 2015 Peter Palfrader <peter@palfrader.org>
 #               2012 Uli Martens <uli@youam.net>
 #
 # Permission is hereby granted, free of charge, to any person obtaining
@@ -30,7 +30,7 @@ $ENV{'PATH'} = '/bin:/sbin:/usr/bin:/usr/sbin';
 delete @ENV{'IFS', 'CDPATH', 'ENV', 'BASH_ENV'};
 
 my $LSOF = '/usr/bin/lsof -F0';
-my $VERSION = '0.2012042101';
+my $VERSION = '0.2015012901';
 
 # nagios exit codes
 my $OK = 0;
@@ -53,6 +53,7 @@ if (!GetOptions (
        '--version'     => \$params->{'version'},
        '--quiet'       => \$params->{'quiet'},
        '--verbose'     => \$params->{'verbose'},
+       '-v'            => \$params->{'verbose'},
        '--config=s'    => \$params->{'config'},
        )) {
        dief ("$PROGRAM_NAME: Usage: $PROGRAM_NAME [--help|--version] [--verbose] [--quiet] [--config=<CONFIGFILE>]\n");
@@ -142,7 +143,7 @@ sub inVserver() {
 my $INVSERVER = inVserver();
 
 print STDERR "Running $LSOF -n\n" if $params->{'verbose'};
-open (LSOF, "$LSOF -n|") or dief ("Cannot run $LSOF -n: $!\n");
+open (LSOF, "$LSOF -n 2>/dev/null|") or dief ("Cannot run $LSOF -n: $!\n");
 my @lsof=<LSOF>;
 close LSOF;
 if ($CHILD_ERROR) { # program failed
@@ -155,7 +156,7 @@ LINE: for my $line (@lsof)  {
                my %fields = map { m/^(.)(.*)$/ ; $1 => $2 } grep { defined $_  and length $_ >1} split /\0/, $line;
                $process = $fields{c};
                $pid     = $fields{p};
-               $user    = $fields{L};
+               $user    = $fields{L} || '<unknown>';
                next;
        }
 
@@ -169,7 +170,11 @@ LINE: for my $line (@lsof)  {
        my $fd    = $fields{f};
        my $inode = $fields{i};
        my $path  = $fields{n};
-       if ($path =~ m/\.dpkg-/ || $path =~ m/\(deleted\)/ || $path =~ /path inode=/ || $fd eq 'DEL') {
+       if ($path =~ m/\.dpkg-/ || $path =~ m/\(deleted\)/ || $path =~ /path inode=/ || $path =~ m#/\.nfs# || $fd eq 'DEL') {
+               my $deleted_in_path = ($path =~ m/\(deleted\)/ || $path =~ m/\.nfs/);
+               next if ($deleted_in_path && $fd =~ /^[0-9]*$/); # Ignore deleted files that are open via normal file handles.
+               next if ($deleted_in_path && $fd eq 'cwd'); # Ignore deleted directories that we happen to be in.
+
                $path =~ s/^\(deleted\)//; # in some cases "(deleted)" is at the beginning of the string
                for my $i (@{$config->{'ignorelist'}}) {
                        my $ignore = eval($i);