aboutsummaryrefslogtreecommitdiff
path: root/modules/private/monitoring/plugins/check_command
blob: 2b546c1f3c0ae3fa43ba36da889646f1689a54cc (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
#!/usr/bin/env perl

use strict;
use Getopt::Std;
$| = 1;

my %opts;
getopts('hr:C:c:s:o:', \%opts);

my $STATE_OK = 0;
my $STATE_WARNING = 1;
my $STATE_CRITICAL = 2;
my $STATE_UNKNOWN = 3;

if ($opts{'h'} || scalar(%opts) == 0) {
  &print_help();
  exit($STATE_OK);
}

my $command = $opts{'c'};
if ($command eq '') {
  print "You must provide a command to check.\n";
  exit($STATE_UNKNOWN);
}

my $expected_output = $opts{'o'};
my $expected_status = $opts{'s'};
my $other_command   = $opts{'C'};

if ($other_command eq '' and $expected_status eq '' and $expected_output eq '') {
  $expected_status = 0;
}

my $cmd = $command . ' 2>&1';
my $other_cmd;
if ($other_command ne '') {
  $other_cmd = $other_command . ' 2>&1';
}

my $run_as;
if ($opts{'r'}) {
  $run_as = $opts{'r'};
  $cmd = "sudo -u $run_as -n $cmd";

  if ($other_command ne '') {
    $other_cmd = "sudo -u $run_as -n $other_cmd";
  }

}

my $cmd_result = `$cmd`;
my $other_cmd_result;
if ($other_command ne '') {
  $other_cmd_result = `$other_cmd`;
  chomp($other_cmd_result);
}

chomp($cmd_result);
if ($cmd_result =~ /sudo/i) {
  print "$command CRITICAL - No sudo right to run the command | result=1;;;;\n";
  exit($STATE_UNKNOWN);
} elsif ($expected_status ne '') {
    if ($? != $expected_status) {
      print "$command CRITICAL - Response status $? | result=1;;;;\n";
      exit($STATE_CRITICAL);
    } else {
      print "$command OK - Response status $? | result=0;;;;\n";
      exit($STATE_OK);
    }
} elsif ($other_command ne '') {
  if ($cmd_result ne $other_cmd_result) {
    print "$command CRITICAL - Expected output not matching other command output | result=1;;;;\n";
    exit($STATE_CRITICAL);
  } else {
    print "$command OK - Expected output matching other command output | result=0;;;;\n";
    exit($STATE_OK);
  }
} else {
  if ($cmd_result !~ /$expected_output/) {
    print "$command CRITICAL - Expected output not matching | result=1;;;;\n";
    exit($STATE_CRITICAL);
  } else {
    print "$command OK - Expected output matching | result=0;;;;\n";
    exit($STATE_OK);
  }
}

sub print_help() {
  print << "EOF";
Check whether the given command responds as expected. One of -o -C or -s must be selected.

Options:
-h
    Print detailed help screen

-c
    command to run (required)

-C
    other command to compare output

-r user
    Run as user via sudo.

-s
    status code to check

-o
    output to check

EOF
}