]> git.immae.eu Git - perso/Immae/Config/Nix.git/blob - modules/private/monitoring/plugins/check_emails
Add status engine website
[perso/Immae/Config/Nix.git] / modules / private / monitoring / plugins / check_emails
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 my $old = 0;
65 foreach my $email_from (@emails_to_expect) {
66 my @email_split = split(/:/, $email_from);
67 my $email = $email_split[0];
68 my $from = $email_split[1];
69
70 if ( exists $found_emails{$email} ) {
71 my $email_date = str2time($found_emails{$email});
72 my $current_date = strftime "%s", localtime;
73
74 if ($current_date - $email_date > 60*30) {
75 $output = "$output$email ($found_emails{$email} from $from) ";
76 }
77 $old = ($current_date - $email_date) > $old ? ($current_date - $email_date) : $old;
78 } else {
79 $output = "$output$email (missing) "
80 }
81 }
82
83 if ($output ne '') {
84 print "Emails $host CRITICAL - expecting emails: $output | timestamp=${old}s;;;;\n";
85 exit($STATE_CRITICAL);
86 } else {
87 print "Emails $host OK | timestamp=${old}s;;;;\n";
88 exit($STATE_OK);
89 }
90
91 sub print_help() {
92 print << "EOF";
93 Check sent emails
94
95 Options:
96 -h
97 Print detailed help screen
98
99 -H
100 Host to check
101
102 -l
103 Login
104
105 -i
106 Identity file
107
108 -n
109 Don’t use ssh, pass that directory to script
110
111 -r
112 Return path for local e-mails
113
114 -s
115 Comma separated list of emails to send from the host.
116
117 -f
118 Comma separated list of emails to expect on the host.
119 EOF
120 }
121