]>
Commit | Line | Data |
---|---|---|
1 | #!/usr/bin/env perl | |
2 | ||
3 | use strict; | |
4 | use Getopt::Std; | |
5 | use File::Basename; | |
6 | use Date::Parse; | |
7 | use POSIX qw(strftime); | |
8 | ||
9 | $| = 1; | |
10 | ||
11 | my %opts; | |
12 | getopts('hH:l:s:p:f:i:n:r:', \%opts); | |
13 | ||
14 | my $STATE_OK = 0; | |
15 | my $STATE_WARNING = 1; | |
16 | my $STATE_CRITICAL = 2; | |
17 | my $STATE_UNKNOWN = 3; | |
18 | ||
19 | if ($opts{'h'} || scalar(%opts) == 0) { | |
20 | &print_help(); | |
21 | exit($STATE_OK); | |
22 | } | |
23 | ||
24 | my $port = $opts{'p'}; | |
25 | my $host = $opts{'H'}; | |
26 | my $login = $opts{'l'}; | |
27 | if ($login ne '') { | |
28 | $login = "$login@"; | |
29 | } | |
30 | ||
31 | my $identity = $opts{'i'}; | |
32 | my $local_directory = $opts{'n'}; | |
33 | my $return_path = $opts{'r'}; | |
34 | ||
35 | my @emails_to_send = split(/,/, $opts{'s'}); | |
36 | my @emails_to_expect = split(/,/, $opts{'f'}); | |
37 | ||
38 | my $cmd_result; | |
39 | if ($local_directory ne '') { | |
40 | if (@emails_to_expect and ! -d $local_directory) { | |
41 | print "Emails $host UNKNOWN - Could not find local directory"; | |
42 | exit($STATE_UNKNOWN); | |
43 | } | |
44 | $cmd_result = `send_mails $local_directory $return_path @emails_to_send 2>&1`; | |
45 | } else { | |
46 | $cmd_result = `ssh -o BatchMode=yes -o UserKnownHostsFile=/dev/null -o CheckHostIP=no -o StrictHostKeyChecking=no -p $port -i $identity $login$host send_mails @emails_to_send 2>&1`; | |
47 | ||
48 | if ($cmd_result =~ /Host key verification failed./) { | |
49 | print "Emails $host UNKNOWN - Could not connect to host with ssh key\n"; | |
50 | exit($STATE_UNKNOWN); | |
51 | } | |
52 | } | |
53 | ||
54 | my @lines = split(/\n/, $cmd_result); | |
55 | ||
56 | my %found_emails; | |
57 | ||
58 | foreach my $line (@lines) { | |
59 | my @split_line = split(/;/, $line, 2); | |
60 | $found_emails{$split_line[0]} = $split_line[1]; | |
61 | } | |
62 | ||
63 | my $output = ""; | |
64 | foreach my $email_from (@emails_to_expect) { | |
65 | my @email_split = split(/:/, $email_from); | |
66 | my $email = $email_split[0]; | |
67 | my $from = $email_split[1]; | |
68 | ||
69 | if ( exists $found_emails{$email} ) { | |
70 | my $email_date = str2time($found_emails{$email}); | |
71 | my $current_date = strftime "%s", localtime; | |
72 | ||
73 | if ($current_date - $email_date > 60*30) { | |
74 | $output = "$output$email ($found_emails{$email} from $from) "; | |
75 | } | |
76 | } else { | |
77 | $output = "$output$email (missing) " | |
78 | } | |
79 | } | |
80 | ||
81 | if ($output ne '') { | |
82 | print "Emails $host CRITICAL - expecting emails: $output\n"; | |
83 | exit($STATE_CRITICAL); | |
84 | } else { | |
85 | print "Emails $host OK\n"; | |
86 | exit($STATE_OK); | |
87 | } | |
88 | ||
89 | sub print_help() { | |
90 | print << "EOF"; | |
91 | Check sent emails | |
92 | ||
93 | Options: | |
94 | -h | |
95 | Print detailed help screen | |
96 | ||
97 | -H | |
98 | Host to check | |
99 | ||
100 | -l | |
101 | Login | |
102 | ||
103 | -i | |
104 | Identity file | |
105 | ||
106 | -n | |
107 | Don’t use ssh, pass that directory to script | |
108 | ||
109 | -r | |
110 | Return path for local e-mails | |
111 | ||
112 | -s | |
113 | Comma separated list of emails to send from the host. | |
114 | ||
115 | -f | |
116 | Comma separated list of emails to expect on the host. | |
117 | EOF | |
118 | } | |
119 |