#!/usr/bin/env python3 import asyncio from os import environ from sys import argv from alerting import alerts from alerting.enum import AlertType, Severity type_priority_map = { "ONLINE": Severity.INFO, # UPS is back online "ONBATT": Severity.WARNING, # UPS is on battery "LOWBATT": Severity.CRITICAL, # UPS is on battery and has a low battery (is critical) "FSD": Severity.CRITICAL, # UPS is being shutdown by the primary (FSD = "Forced Shutdown") "COMMOK": Severity.INFO, # Communications established with the UPS "COMMBAD": Severity.WARNING, # Communications lost to the UPS "SHUTDOWN": Severity.CRITICAL, # The system is being shutdown "REPLBATT": Severity.WARNING, # The UPS battery is bad and needs to be replaced "NOCOMM": Severity.WARNING, # A UPS is unavailable (can’t be contacted for monitoring) "NOPARENT": Severity.CRITICAL, # upsmon parent process died - shutdown impossible "CAL": Severity.INFO, # UPS calibration in progress "NOTCAL": Severity.INFO, # UPS calibration finished "OFF": Severity.CRITICAL, # UPS administratively OFF or asleep "NOTOFF": Severity.INFO, # UPS no longer administratively OFF or asleep "BYPASS": Severity.WARNING, # UPS on bypass (powered, not protecting) "NOTBYPASS": Severity.INFO, # UPS no longer on bypass None: Severity.CRITICAL, # unknown alert type } async def main(): """Sends an alert about a UPS event. Meant to be used from upsmon with NOTIFYCMD""" if len(argv) != 2: raise Exception("provide exactly one argument: alert message") message = argv[1] typestr = environ.get("NOTIFYTYPE", None) severity = type_priority_map[typestr] alert = alerts.Alert(alert_type=AlertType.UPS, message=message, severity=severity) await alerts.send_alert(alert) if __name__ == "__main__": asyncio.run(main())