#!/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)