-
Notifications
You must be signed in to change notification settings - Fork 0
/
notify-by-pushover.pl
108 lines (91 loc) · 2.6 KB
/
notify-by-pushover.pl
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
#!/usr/bin/perl
# nagios: -epn
# Copyright (c) 2015 Marcus van Dam <[email protected]>
# This code is licensed under the MIT License (MIT)
use strict;
use warnings;
use Getopt::Long;
use URI::Escape;
use LWP::UserAgent;
# PushOver priorities.
use constant {
P_LOW => -1,
P_NORMAL => 0,
P_HIGH => 1,
P_EMERG => 2,
};
# Get keys and url.
my ($appKey, $usrKey, $url);
GetOptions(
"appkey|a=s" => \$appKey,
"usrkey|u=s" => \$usrKey,
"url|l=s" => \$url,
) or die "Usage: $0 --appkey|-a <key> --usrkey|-u <key> --url|-l <icinga url>", "\n";
die "Missing API Keys" ,"\n" unless ($appKey && $usrKey);
# Filter types.
exit unless grep(
$ENV{ICINGA_NOTIFICATIONTYPE},
[
"PROBLEM",
"RECOVERY",
"ACKNOWLEDGEMENT"
]
);
my $type = $ENV{ICINGA_SERVICEATTEMPT} ? 'service' : 'host';
# Build subject and message lines.
my $subject = sprintf('%s %s Alert: %s is %s',
$ENV{ICINGA_NOTIFICATIONTYPE},
ucfirst($type),
$type eq 'service' ? $ENV{ICINGA_HOSTNAME} . '/' . $ENV{ICINGA_SERVICEDESC} : $ENV{ICINGA_HOSTNAME},
$type eq 'service' ? $ENV{ICINGA_SERVICESTATE} : $ENV{ICINGA_HOSTSTATE}
);
my $message = sprintf('%s (%s)',
$type eq 'service' ? $ENV{ICINGA_SERVICEOUTPUT} : $ENV{ICINGA_HOSTOUTPUT},
$ENV{ICINGA_SHORTDATETIME}
);
# Build URL link to Icinga.
my $url_desc = "Open in Icinga";
my $url_base = $url // "http://" . qx{hostname -f};
my $url_link = $type eq 'service' ?
sprintf('%s/cgi-bin/icinga/extinfo.cgi?type=2&host=%s&service=%s',
$url_base,
$ENV{ICINGA_HOSTNAME},
uri_escape($ENV{ICINGA_SERVICEDESC})
)
:
sprintf('%s/cgi-bin/icinga/status.cgi?host=%s',
$url_base,
$ENV{ICINGA_HOSTNAME}
);
# Map state => priority.
my %priorities = (
WARNING => P_NORMAL,
UNKNOWN => P_LOW,
OK => P_NORMAL,
CRITICAL => P_HIGH,
UP => P_NORMAL,
DOWN => P_HIGH,
UNREACHABLE => P_LOW,
);
# Send request to PushOver API.
my $response = LWP::UserAgent->new->post(
"https://api.pushover.net/1/messages.json",
[
"token" => $appKey,
"user" => $usrKey,
"message" => $message,
"title" => $subject,
"priority" => $priorities{
$type eq 'service' ? $ENV{ICINGA_SERVICESTATE} : $ENV{ICINGA_HOSTSTATE}
},
"url_title" => $url_desc,
"url" => $url_link,
]
);
# Error handling. Exit in silence.
if ($response->is_success) {
exit (0);
} else {
die $response->code, " - ", $response->message, "\n";
}
exit(3)