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
|
#!/usr/libexec/platform-python
# Nagios check for Asterisk PJSIP endpoints
#
# Copyright (c) 2023 stonewall@sacredheartsc.com
# MIT License https://opensource.org/licenses/MIT
import requests
import json
import argparse
import sys
from enum import Enum
class Status(Enum):
OK = 0
WARN = 1
CRIT = 2
UNKNOWN = 3
parser = argparse.ArgumentParser()
parser.add_argument('-H', '--host', help='asterisk host', type=str, required=True)
parser.add_argument('-P', '--port', help='asterisk ARI port', type=int, default=8089)
parser.add_argument('-u', '--username', help='asterisk ARI username', type=str, required=True)
parser.add_argument('-p', '--password', help='asterisk ARI password', type=str, required=True)
parser.add_argument('endpoints', nargs='+', help='endpoint name to check', metavar='ENDPOINT')
args = parser.parse_args()
try:
r = requests.get(f'https://{args.host}:{args.port}/ari/endpoints', auth=(args.username, args.password))
if r.status_code == 200:
state = {i['resource']: i['state'] for i in r.json() if i['technology'] == 'PJSIP'}
results = []
for endpoint in args.endpoints:
if endpoint in state:
status = Status.OK if state[endpoint] == 'online' else Status.CRIT
message = f'{endpoint} is {state[endpoint]}'
results.append((status, message))
else:
results.append((Status.UNKNOWN, f'{endpoint} not found'))
results.sort(key=lambda x:x[0].value, reverse=True)
if results[0][0] == Status.OK:
print('all endpoints connected')
elif results[0][0] == Status.UNKNOWN:
print('endpoint(s) not found in ARI!')
else:
print('endpoint not connected!')
for result in results:
print(f'{result[0].name}: {result[1]}')
sys.exit(results[0][0].value)
else:
print('failed to retrieve data from ARI!')
sys.exit(Status.UNKNOWN.value)
except Exception as e:
print(str(e))
sys.exit(Status.UNKNOWN.value)
|