Files
NetAlertX/front/plugins/_publisher_pushover/pushover.py
2025-05-10 14:33:27 +10:00

126 lines
3.8 KiB
Python
Executable File

#!/usr/bin/env python3
import os
import pathlib
import sys
import json
import requests
# Register NetAlertX directories
INSTALL_PATH="/app"
sys.path.extend([f"{INSTALL_PATH}/front/plugins", f"{INSTALL_PATH}/server"])
from plugin_helper import Plugin_Objects, handleEmpty # noqa: E402
from logger import mylog, Logger # noqa: E402
from helper import timeNowTZ, get_setting_value, hide_string # noqa: E402
from models.notification_instance import NotificationInstance # noqa: E402
from database import DB # noqa: E402
import conf
from const import confFileName, logPath
from pytz import timezone
# Make sure the TIMEZONE for logging is correct
conf.tz = timezone(get_setting_value('TIMEZONE'))
# Make sure log level is initialized correctly
Logger(get_setting_value('LOG_LEVEL'))
pluginName = "PUSHOVER"
LOG_PATH = logPath + '/plugins'
RESULT_FILE = os.path.join(LOG_PATH, f'last_result.{pluginName}.log')
def main():
mylog("verbose", f"[{pluginName}](publisher) In script")
# Check if basic config settings supplied
if not validate_config():
mylog(
"none",
f"[{pluginName}] ⚠ ERROR: Publisher notification gateway not set up correctly. "
f"Check your {confFileName} {pluginName}_* variables.",
)
return
# Create a database connection
db = DB() # instance of class DB
db.open()
# Initialize the Plugin obj output file
plugin_objects = Plugin_Objects(RESULT_FILE)
# Create a NotificationInstance instance
notifications = NotificationInstance(db)
# Retrieve new notifications
new_notifications = notifications.getNew()
# Process the new notifications
for notification in new_notifications:
# Send notification
response_text, response_status_code = send(notification["Text"])
# Log result
plugin_objects.add_object(
primaryId=pluginName,
secondaryId=timeNowTZ(),
watched1=notification["GUID"],
watched2=handleEmpty(response_text),
watched3=response_status_code,
watched4="null",
extra="null",
foreignKey=notification["GUID"],
)
plugin_objects.write_result_file()
def send(text):
response_text = ""
response_status_code = ""
user_key = get_setting_value("PUSHOVER_USER_KEY")
app_token = get_setting_value("PUSHOVER_APP_TOKEN")
device_name = (
None
if get_setting_value("PUSHOVER_DEVICE_NAME") == "DEVICE_NAME"
else get_setting_value("PUSHOVER_DEVICE_NAME")
)
mylog("verbose", f'[{pluginName}] PUSHOVER_USER_KEY: "{hide_string(user_key)}"')
mylog("verbose", f'[{pluginName}] PUSHOVER_APP_TOKEN: "{hide_string(app_token)}"')
data = {"token": app_token, "user": user_key, "message": text}
# Add device_name to the data dictionary only if it is not None
if device_name:
data["device"] = device_name
try:
response = requests.post("https://api.pushover.net/1/messages.json", data=data)
# Update response_status_code with the actual status code from the response
response_status_code = response.status_code
# Check if the request was successful (status code 200)
if response_status_code == 200:
response_text = response.text # This captures the response body/message
else:
response_text = json.dumps(response.text)
except requests.exceptions.RequestException as e:
mylog("none", f"[{pluginName}] ⚠ ERROR: {e}")
response_text = str(e)
return response_text, response_status_code
def validate_config():
user_key = get_setting_value("PUSHOVER_USER_KEY")
app_token = get_setting_value("PUSHOVER_APP_TOKEN")
return user_key != "USER_KEY" and app_token != "APP_TOKEN"
if __name__ == "__main__":
sys.exit(main())