feat: Implement monitoring heartbeat
All checks were successful
Mirror to Forgejo / mirror-to-codeberg (push) Successful in 3s

This commit is contained in:
Jiří Štefka 2025-01-19 07:15:04 +01:00
parent daaf79cdbc
commit 608a967fc4
Signed by: jiriks74
GPG key ID: 1D5E30D3DB2264DE
2 changed files with 35 additions and 10 deletions

View file

@ -1,13 +1,17 @@
{ {
"ntfy_base_url": "https://ntfy.sh", "ntfy_base_url": "https://ntfy.sh",
"ntfy_topic": "nextcloud", "ntfy_topic": "nextcloud",
"ntfy_auth": "false", "ntfy_auth": false,
"ntfy_token": "authentication_token", "ntfy_token": "authentication_token",
"nextcloud_base_url": "https://nextcloud.example.com", "nextcloud_base_url": "https://nextcloud.example.com",
"nextcloud_username": "user", "nextcloud_username": "user",
"nextcloud_password": "application_password", "nextcloud_password": "application_password",
"heartbeat": false,
"heartbeat_url": "url",
"heartbeat_interval": 30,
"nextcloud_poll_interval_seconds": 60, "nextcloud_poll_interval_seconds": 60,
"nextcloud_error_sleep_seconds": 600, "nextcloud_error_sleep_seconds": 600,

View file

@ -1,6 +1,7 @@
import logging as log import logging as log
import argparse import argparse
import threading
import requests import requests
import json import json
import base64 import base64
@ -12,6 +13,7 @@ from datetime import datetime
# - 1: Response from 'ntfy' was < 400 while pushing notification # - 1: Response from 'ntfy' was < 400 while pushing notification
# - 2: No ntfy authentication token was provided # - 2: No ntfy authentication token was provided
# - 3: Provided 'ntfy' authentication token is invalid # - 3: Provided 'ntfy' authentication token is invalid
# - 4: No heartbeat url was given
log_levels = { log_levels = {
"DEBUG": log.DEBUG, "DEBUG": log.DEBUG,
@ -116,12 +118,15 @@ def load_config(config_file: str) -> dict:
default_config = { default_config = {
"ntfy_base_url": "https://ntfy.sh", "ntfy_base_url": "https://ntfy.sh",
"ntfy_topic": "nextcloud", "ntfy_topic": "nextcloud",
"ntfy_auth": "false", "ntfy_auth": False,
"ntfy_token": "authentication_token", "ntfy_token": "authentication_token",
"nextcloud_base_url": "https://nextcloud.example.com", "nextcloud_base_url": "https://nextcloud.example.com",
"nextcloud_notification_path": "/ocs/v2.php/apps/notifications/api/v2/notifications", "nextcloud_notification_path": "/ocs/v2.php/apps/notifications/api/v2/notifications",
"nextcloud_username": "user", "nextcloud_username": "user",
"nextcloud_password": "application_password", "nextcloud_password": "application_password",
"heartbeat": False,
"heartbeat_url": "url",
"heartbeat_interval": 30,
"nextcloud_poll_interval_seconds": 60, "nextcloud_poll_interval_seconds": 60,
"nextcloud_error_sleep_seconds": 600, "nextcloud_error_sleep_seconds": 600,
"nextcloud_204_sleep_seconds": 3600, "nextcloud_204_sleep_seconds": 3600,
@ -138,22 +143,25 @@ def load_config(config_file: str) -> dict:
if key not in config_data: if key not in config_data:
config_data[key] = value config_data[key] = value
if config_data["ntfy_auth"] == "false": if config_data["ntfy_auth"] == False:
config_data["ntfy_token"] == "" config_data["ntfy_token"] == ""
elif config_data["ntfy_auth"] == "true" and ( elif config_data["ntfy_auth"] == True and (
config_data["ntfy_token"] == "" config_data["ntfy_token"] == ""
or config_data["ntfy_token"] == "authentication_token" or config_data["ntfy_token"] == "authentication_token"):
):
print( print(
"Error: Option 'ntfy_auth' is set to 'true' but not 'ntfy_token' was set!" "Error: Option 'ntfy_auth' is set to 'true' but not 'ntfy_token' was set!"
) )
exit(2) exit(2)
elif config_data["ntfy_auth"] == "true" and not config_data[ elif config_data["ntfy_auth"] == True and not config_data[
"ntfy_token" "ntfy_token" ].startswith("tk_"):
].startswith("tk_"):
print("Error: Authentication token set in 'ntfy_token' is invalid!") print("Error: Authentication token set in 'ntfy_token' is invalid!")
exit(3) exit(3)
if config_data["heartbeat"] == True:
if config_data["heartbeat_url"] == "url" or config_data["heartbeat_url"] == "":
print("Error: 'heartbeat' is set to 'true' but no url was given.")
exit(4)
return config_data return config_data
except FileNotFoundError: except FileNotFoundError:
@ -165,6 +173,13 @@ def load_config(config_file: str) -> dict:
return default_config return default_config
def monitoring_heartbeat(url, interval):
while True:
response = requests.get(url)
log.info("Sent heartbeat.")
log.debug(f"Response: {response}")
sleep(interval)
def main(): def main():
args = arg_parser() args = arg_parser()
config = load_config(args.config_file) config = load_config(args.config_file)
@ -177,6 +192,13 @@ def main():
) )
log.info("Started Nextcloud to ntfy.sh notification bridge.") log.info("Started Nextcloud to ntfy.sh notification bridge.")
if config["heartbeat"] == True:
heartbeat = threading.Thread(target=monitoring_heartbeat,
daemon=True,
args=("https://uptime.stfka.eu/api/push/pRCW5ARYxn?status=up&msg=OK&ping=",
config["heartbeat_interval"]))
heartbeat.start()
last_datetime = datetime.fromisoformat("1970-01-01T00:00:00Z") last_datetime = datetime.fromisoformat("1970-01-01T00:00:00Z")
nextcloud_auth_header = f"Basic {base64.b64encode(f"{config["nextcloud_username"]}:{config["nextcloud_password"]}".encode("utf-8")).decode("utf-8")}" nextcloud_auth_header = f"Basic {base64.b64encode(f"{config["nextcloud_username"]}:{config["nextcloud_password"]}".encode("utf-8")).decode("utf-8")}"
nextcloud_request_headers = { nextcloud_request_headers = {
@ -281,6 +303,5 @@ def main():
sleep(config["nextcloud_poll_interval_seconds"]) sleep(config["nextcloud_poll_interval_seconds"])
if __name__ == "__main__": if __name__ == "__main__":
main() main()