Compare commits

..

No commits in common. "master" and "0.8.0" have entirely different histories.

46 changed files with 1147 additions and 2790 deletions

View file

@ -1,94 +1,5 @@
## Changelog ## Changelog
### Release 1.2.1
#### Bugfixes
- drop first info event without a version
### Release 1.2.0
#### Features
- add support for uptime kuma 1.23.0 and 1.23.1
#### Bugfixes
- remove `name` from maintenance monitors and status pages
- rstip url globally
- convert sendUrl from bool to int
- validate accepted status codes types
### Release 1.1.0
#### Features
- add support for uptime kuma 1.22.0 and 1.22.1
### Release 1.0.1
#### Bugfixes
- fix ValueError if monitor authMethod is None
### Release 1.0.0
#### Features
- add `ssl_verify` parameter
- add `wait_events` parameter
- implement context manager for UptimeKumaApi class
- drop Python 3.6 support
- implement `get_monitor_status` helper method
- implement timeouts for all methods (`timeout` parameter)
- add support for uptime kuma 1.21.3
- drop support for Uptime Kuma versions < 1.21.3
- check for required notification arguments
- raise exception when deleting an element that does not exist
- replace raw return values with enum values
#### Bugfixes
- adjust monitor `status` type to allow all used values
- fix memory leak
#### BREAKING CHANGES
- Python 3.7+ required
- maintenance parameter `timezone` renamed to `timezoneOption`
- Removed the `wait_timeout` parameter. Use the new `timeout` parameter instead. The `timeout` parameter specifies how many seconds the client should wait for the connection, an expected event or a server response.
- changed return values of methods `get_heartbeats`, `get_important_heartbeats`, `avg_ping`, `uptime`, `cert_info`
- Uptime Kuma versions < 1.21.3 are not supported in uptime-kuma-api 1.0.0+
- Removed the `get_heartbeat` method. This method was never intended to retrieve information. Use `get_heartbeats` or `get_important_heartbeats` instead.
- Types of return values changed to enum values:
- monitor: `type` (str -> MonitorType), `status` (bool -> MonitorStatus), `authMethod` (str -> AuthMethod)
- notification: `type` (str -> NotificationType)
- docker host: `dockerType` (str -> DockerType)
- status page: `style` (str -> IncidentStyle)
- maintenance: `strategy` (str -> MaintenanceStrategy)
- proxy: `protocol` (str -> ProxyProtocol)
### Release 0.13.0
#### Feature
- add support for uptime kuma 1.21.2
- implement custom socketio headers
#### Bugfix
- do not wait for events that have already arrived
### Release 0.12.0
#### Feature
- add support for uptime kuma 1.21.1
### Release 0.11.0
#### Feature
- add support for uptime kuma 1.21.0
### Release 0.10.0
#### Feature
- add support for uptime kuma 1.20.0
### Release 0.9.0
#### Feature
- add support for uptime kuma 1.19.5
### Release 0.8.0 ### Release 0.8.0
#### Feature #### Feature

View file

@ -1,6 +1,6 @@
MIT License MIT License
Copyright (c) 2023 Lucas Held Copyright (c) 2022 Lucas Held
Permission is hereby granted, free of charge, to any person obtaining a copy Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal of this software and associated documentation files (the "Software"), to deal

View file

@ -6,14 +6,9 @@ uptime-kuma-api is a Python wrapper for the [Uptime Kuma](https://github.com/lou
This package was developed to configure Uptime Kuma with Ansible. The Ansible collection can be found at https://github.com/lucasheld/ansible-uptime-kuma. This package was developed to configure Uptime Kuma with Ansible. The Ansible collection can be found at https://github.com/lucasheld/ansible-uptime-kuma.
Python version 3.7+ is required. Python version 3.6+ is required.
Supported Uptime Kuma versions: Supported Uptime Kuma versions: 1.17.0 - 1.19.3
| Uptime Kuma | uptime-kuma-api |
|-----------------|-----------------|
| 1.21.3 - 1.23.2 | 1.0.0 - 1.2.1 |
| 1.17.0 - 1.21.2 | 0.1.0 - 0.13.0 |
Installation Installation
--- ---
@ -29,7 +24,7 @@ Documentation
--- ---
The API Reference is available on [Read the Docs](https://uptime-kuma-api.readthedocs.io). The API Reference is available on [Read the Docs](https://uptime-kuma-api.readthedocs.io).
Example Examples
--- ---
Once you have installed the python package, you can use it to communicate with an Uptime Kuma instance. Once you have installed the python package, you can use it to communicate with an Uptime Kuma instance.
@ -54,17 +49,3 @@ At the end, the connection to the API must be disconnected so that the program d
```python ```python
>>> api.disconnect() >>> api.disconnect()
``` ```
With a context manager, the disconnect method is called automatically:
```python
from uptime_kuma_api import UptimeKumaApi
with UptimeKumaApi('INSERT_URL') as api:
api.login('INSERT_USERNAME', 'INSERT_PASSWORD')
api.add_monitor(
type=MonitorType.HTTP,
name="Google",
url="https://google.com"
)
```

View file

@ -1,4 +0,0 @@
Sphinx==5.3.0
pyotp==2.8.0
Jinja2==3.1.2
BeautifulSoup4==4.12.2

View file

@ -19,9 +19,6 @@ Enums
.. autoclass:: MonitorType .. autoclass:: MonitorType
:members: :members:
.. autoclass:: MonitorStatus
:members:
.. autoclass:: NotificationType .. autoclass:: NotificationType
:members: :members:
@ -42,5 +39,3 @@ Exceptions
---------- ----------
.. autoexception:: UptimeKumaException .. autoexception:: UptimeKumaException
.. autoexception:: Timeout

View file

@ -13,7 +13,7 @@ import uptime_kuma_api
# https://www.sphinx-doc.org/en/master/usage/configuration.html#project-information # https://www.sphinx-doc.org/en/master/usage/configuration.html#project-information
project = 'uptime-kuma-api' project = 'uptime-kuma-api'
copyright = '2023, Lucas Held' copyright = '2022, Lucas Held'
author = 'Lucas Held' author = 'Lucas Held'
version = uptime_kuma_api.__version__ version = uptime_kuma_api.__version__

1
docs/requirements.txt Normal file
View file

@ -0,0 +1 @@
Sphinx==5.3.0

View file

@ -5,7 +5,7 @@ if [ $version ]
then then
versions=("$version") versions=("$version")
else else
versions=(1.23.2 1.23.0 1.22.1 1.22.0 1.21.3) versions=(1.19.3 1.18.5 1.17.1)
fi fi
for version in ${versions[*]} for version in ${versions[*]}
@ -23,7 +23,6 @@ do
echo "Stopping uptime kuma..." echo "Stopping uptime kuma..."
docker stop uptimekuma > /dev/null docker stop uptimekuma > /dev/null
sleep 1
echo '' echo ''
done done

View file

@ -1,57 +1,37 @@
import glob import glob
import re import re
from bs4 import BeautifulSoup
from utils import deduplicate_list, parse_vue_template, diff, type_html_to_py from utils import deduplicate_list, parse_vue_template
input_ignores = { ROOT = "uptime-kuma"
"settings": [
"$root.styleElapsedTime"
]
}
def parse_model_keys(content, object_name): def parse_model_keys(content, object_name):
soup = BeautifulSoup(content, "html.parser") match = re.findall(object_name + r"\.[0-9a-zA-Z_$]+", content)
keys = []
soup_inputs = soup.find_all(attrs={"v-model": True}) for m in match:
inputs = [] key = m.replace(object_name + ".", "")
for soup_input in soup_inputs: keys.append(key)
key = soup_input["v-model"] keys = deduplicate_list(keys)
if key in input_ignores.get(object_name, []): return keys
continue
else:
key = re.sub(r'^' + object_name + r'\.', "", key)
type_ = soup_input.get("type", "text")
type_ = type_html_to_py(type_)
if type_ == "bool":
value = True if soup_input.get("checked") else False
else:
value = soup_input.get("value")
inputs.append({
"key": key,
"type": type_,
"default": value,
})
return inputs
def parse_proxy_keys(root): def parse_proxy_keys():
content = parse_vue_template(f"{root}/src/components/ProxyDialog.vue") content = parse_vue_template(f"{ROOT}/src/components/ProxyDialog.vue")
keys = parse_model_keys(content, "proxy") keys = parse_model_keys(content, "proxy")
return keys return keys
def parse_notification_keys(root): def parse_notification_keys():
content = parse_vue_template(f"{root}/src/components/NotificationDialog.vue") content = parse_vue_template(f"{ROOT}/src/components/NotificationDialog.vue")
keys = parse_model_keys(content, "notification") keys = parse_model_keys(content, "notification")
return keys return keys
def parse_settings_keys(root): def parse_settings_keys():
all_keys = [] all_keys = []
for path in glob.glob(f'{root}/src/components/settings/*'): for path in glob.glob('uptime-kuma/src/components/settings/*'):
content = parse_vue_template(path) content = parse_vue_template(path)
keys = parse_model_keys(content, "settings") keys = parse_model_keys(content, "settings")
all_keys.extend(keys) all_keys.extend(keys)
@ -59,20 +39,20 @@ def parse_settings_keys(root):
return all_keys return all_keys
def parse_monitor_keys(root): def parse_monitor_keys():
content = parse_vue_template(f"{root}/src/pages/EditMonitor.vue") content = parse_vue_template(f"{ROOT}/src/pages/EditMonitor.vue")
keys = parse_model_keys(content, "monitor") keys = parse_model_keys(content, "monitor")
return keys return keys
def parse_status_page_keys(root): def parse_status_page_keys():
all_keys = ["id"] all_keys = ["id"]
content = parse_vue_template(f"{root}/src/pages/StatusPage.vue") content = parse_vue_template(f"{ROOT}/src/pages/StatusPage.vue")
keys = parse_model_keys(content, "config") keys = parse_model_keys(content, "config")
all_keys.extend(keys) all_keys.extend(keys)
content = parse_vue_template(f"{root}/src/pages/ManageStatusPage.vue") content = parse_vue_template(f"{ROOT}/src/pages/ManageStatusPage.vue")
keys = parse_model_keys(content, "statusPage") keys = parse_model_keys(content, "statusPage")
all_keys.extend(keys) all_keys.extend(keys)
@ -80,28 +60,30 @@ def parse_status_page_keys(root):
return all_keys return all_keys
def parse_maintenance_keys(root): def parse_maintenance_keys():
content = parse_vue_template(f"{root}/src/pages/EditMaintenance.vue") content = parse_vue_template(f"{ROOT}/src/pages/EditMaintenance.vue")
keys = parse_model_keys(content, "maintenance") keys = parse_model_keys(content, "maintenance")
return keys return keys
def main(): def main():
root_old = "uptime-kuma-old" proxy_keys = parse_proxy_keys()
root_new = "uptime-kuma" print("proxy:", proxy_keys)
for name, func in [ notification_keys = parse_notification_keys()
["proxy", parse_proxy_keys], print("notification:", notification_keys)
["notification", parse_notification_keys],
["settings", parse_settings_keys], settings_keys = parse_settings_keys()
["monitor", parse_monitor_keys], print("settings:", settings_keys)
["status_page", parse_status_page_keys],
["maintenance", parse_maintenance_keys], monitor_keys = parse_monitor_keys()
]: print("monitor:", monitor_keys)
keys_old = func(root_old)
keys_new = func(root_new) status_page_keys = parse_status_page_keys()
print(f"{name}:") print("status_page:", status_page_keys)
diff(keys_old, keys_new)
maintenance_keys = parse_maintenance_keys()
print("maintenance:", maintenance_keys)
if __name__ == "__main__": if __name__ == "__main__":

View file

@ -1,6 +1,7 @@
import re import re
from pprint import pprint
from utils import deduplicate_list, diff from utils import deduplicate_list
def parse_json_keys(data): def parse_json_keys(data):
@ -18,8 +19,17 @@ def parse_json_keys(data):
return keys return keys
def parse_heartbeat(root): # def parse_object_keys(code, object_name):
with open(f'{root}/server/model/heartbeat.js') as f: # match = re.findall(object_name + r'\.[0-9a-zA-Z_$]+', code)
# keys = []
# for m in match:
# key = m.replace(object_name + ".", "")
# keys.append(key)
# return list(set(keys))
def parse_heartbeat():
with open('uptime-kuma/server/model/heartbeat.js') as f:
content = f.read() content = f.read()
all_keys = [] all_keys = []
match = re.search(r'toJSON\(\) {\s+return.*{([^}]+)}', content) match = re.search(r'toJSON\(\) {\s+return.*{([^}]+)}', content)
@ -34,8 +44,8 @@ def parse_heartbeat(root):
return all_keys return all_keys
def parse_incident(root): def parse_incident():
with open(f'{root}/server/model/incident.js') as f: with open('uptime-kuma/server/model/incident.js') as f:
content = f.read() content = f.read()
match = re.search(r'toPublicJSON\(\) {\s+return.*{([^}]+)}', content) match = re.search(r'toPublicJSON\(\) {\s+return.*{([^}]+)}', content)
data = match.group(1) data = match.group(1)
@ -43,9 +53,9 @@ def parse_incident(root):
return keys return keys
def parse_monitor(root): def parse_monitor():
# todo: toPublicJSON ??? # todo: toPublicJSON ???
with open(f'{root}/server/model/monitor.js') as f: with open('uptime-kuma/server/model/monitor.js') as f:
content = f.read() content = f.read()
matches = re.findall(r'data = {([^}]+)}', content) matches = re.findall(r'data = {([^}]+)}', content)
all_keys = [] all_keys = []
@ -57,8 +67,8 @@ def parse_monitor(root):
return all_keys return all_keys
def parse_proxy(root): def parse_proxy():
with open(f'{root}/server/model/proxy.js') as f: with open('uptime-kuma/server/model/proxy.js') as f:
content = f.read() content = f.read()
match = re.search(r'toJSON\(\) {\s+return.*{([^}]+)}', content) match = re.search(r'toJSON\(\) {\s+return.*{([^}]+)}', content)
data = match.group(1) data = match.group(1)
@ -89,7 +99,7 @@ def parse_proxy(root):
# # input (add, edit proxy) # # input (add, edit proxy)
# def parse_proxy2(): # def parse_proxy2():
# with open(f'{root}/server/proxy.js') as f: # with open('uptime-kuma/server/proxy.js') as f:
# content = f.read() # content = f.read()
# #
# code = parse_function(r'async save\([^)]+\) ', content) # code = parse_function(r'async save\([^)]+\) ', content)
@ -97,8 +107,8 @@ def parse_proxy(root):
# return keys # return keys
def parse_status_page(root): def parse_status_page():
with open(f'{root}/server/model/status_page.js') as f: with open('uptime-kuma/server/model/status_page.js') as f:
content = f.read() content = f.read()
all_keys = [] all_keys = []
match = re.search(r'toJSON\(\) {\s+return.*{([^}]+)}', content) match = re.search(r'toJSON\(\) {\s+return.*{([^}]+)}', content)
@ -113,8 +123,8 @@ def parse_status_page(root):
return all_keys return all_keys
def parse_tag(root): def parse_tag():
with open(f'{root}/server/model/tag.js') as f: with open('uptime-kuma/server/model/tag.js') as f:
content = f.read() content = f.read()
match = re.search(r'toJSON\(\) {\s+return.*{([^}]+)}', content) match = re.search(r'toJSON\(\) {\s+return.*{([^}]+)}', content)
data = match.group(1) data = match.group(1)
@ -122,22 +132,33 @@ def parse_tag(root):
return keys return keys
if __name__ == "__main__": print("heartbeat")
root_old = "uptime-kuma-old" pprint(parse_heartbeat())
root_new = "uptime-kuma" print("")
for name, func in [ print("incident")
["heartbeat", parse_heartbeat], pprint(parse_incident())
["incident", parse_incident], print("")
["monitor", parse_monitor],
["proxy", parse_proxy], print("monitor")
["status page", parse_status_page], pprint(parse_monitor())
["tag", parse_tag], print("")
]:
keys_old = func(root_old) print("proxy")
keys_new = func(root_new) pprint(parse_proxy())
print(f"{name}:") print("")
diff(keys_old, keys_new)
# print("prox2")
# pprint(parse_proxy2())
# print("")
print("status page")
pprint(parse_status_page())
print("")
print("tag")
pprint(parse_tag())
print("")
# TODO: # TODO:

View file

@ -3,32 +3,6 @@ from bs4 import BeautifulSoup
from utils import parse_vue_template, write_to_file from utils import parse_vue_template, write_to_file
titles = {
"http": "HTTP(s)",
"port": "TCP Port",
"ping": "Ping",
"keyword": "HTTP(s) - Keyword",
"grpc-keyword": "gRPC(s) - Keyword",
"dns": "DNS",
"docker": "Docker Container",
"push": "Push",
"steam": "Steam Game Server",
"gamedig": "GameDig",
"mqtt": "MQTT",
"sqlserver": "Microsoft SQL Server",
"postgres": "PostgreSQL",
"mysql": "MySQL/MariaDB",
"mongodb": "MongoDB",
"radius": "Radius",
"redis": "Redis",
"group": "Group",
"json-query": "HTTP(s) - Json Query",
"real-browser": "HTTP(s) - Browser Engine (Chrome/Chromium)",
"kafka-producer": "Kafka Producer",
"tailscale-ping": "Tailscale Ping"
}
def parse_monitor_types(): def parse_monitor_types():
content = parse_vue_template("uptime-kuma/src/pages/EditMonitor.vue") content = parse_vue_template("uptime-kuma/src/pages/EditMonitor.vue")
@ -36,13 +10,10 @@ def parse_monitor_types():
select = soup.find("select", id="type") select = soup.find("select", id="type")
options = select.find_all("option") options = select.find_all("option")
types = {} types = []
for o in options: for o in options:
type_ = o.attrs["value"] type_ = o.attrs["value"]
types[type_] = { types.append(type_)
"value": type_,
"title": titles[type_]
}
return types return types

View file

@ -1,109 +1,7 @@
from uptime_kuma_api import notification_provider_options from uptime_kuma_api import notification_provider_options
data = {
"lunaseaTarget": """Allowed values: "device", "user".""",
"lunaseaUserID": """User ID.""",
"lunaseaDevice": """Device ID.""",
"pagertreeAutoResolve": """
Available values are:
- ``0``: Do Nothing
- ``resolve``: Auto Resolve""",
"pagertreeUrgency": """
Available values are:
- ``silent``: Silent
- ``low``: Low
- ``medium``: Medium
- ``high``: High
- ``critical``: Critical""",
"promosmsAllowLongSMS": "Allow long SMS.",
"promosmsPhoneNumber": "Phone number (for Polish recipient You can skip area codes).",
"promosmsSMSType": """
Available values are:
- ``0``: SMS FLASH - Message will automatically show on recipient device. Limited only to Polish recipients.
- ``1``: SMS ECO - cheap but slow and often overloaded. Limited only to Polish recipients.
- ``3``: SMS FULL - Premium tier of SMS, You can use your Sender Name (You need to register name first). Reliable for alerts.
- ``4``: SMS SPEED - Highest priority in system. Very quick and reliable but costly (about twice of SMS FULL price).""",
"smseagleEncoding": "True to send messages in unicode.",
"smseaglePriority": "Message priority (0-9, default = 0).",
"smseagleRecipientType": """Recipient type.
Available values are:
- ``smseagle-to``: Phone number(s)
- ``smseagle-group``: Phonebook group name(s)
- ``smseagle-contact``: Phonebook contact name(s)""",
"smseagleToken": "API Access token.",
"smseagleRecipient": "Recipient(s) (multiple must be separated with comma).",
"smseagleUrl": "Your SMSEagle device URL.",
"splunkAutoResolve": """Auto resolve or acknowledged.
Available values are:
- ``0``: do nothing
- ``ACKNOWLEDGEMENT``: auto acknowledged
- ``RECOVERY``: auto resolve""",
"splunkSeverity": """Severity.
Available values are:
- ``INFO``
- ``WARNING``
- ``CRITICAL``""",
"splunkRestURL": "Splunk Rest URL.",
"opsgeniePriority": "Priority. Available values are numbers between ``1`` and ``5``.",
"opsgenieRegion": """Region. Available values are:
- ``us``: US (Default)
- ``eu``: EU""",
"opsgenieApiKey": "API Key.",
"twilioAccountSID": "Account SID.",
"twilioAuthToken": "Auth Token.",
"twilioToNumber": "To Number.",
"twilioFromNumber": "From Number.",
"pushoverttl": "Message TTL (Seconds).",
"ntfyaccesstoken": "Access Token.",
"ntfyAuthenticationMethod": "Authentication Method.",
}
for provider in notification_provider_options: for provider in notification_provider_options:
provider_options = notification_provider_options[provider] provider_options = notification_provider_options[provider]
for option in provider_options: for option in provider_options:
type_ = provider_options[option]["type"] type_ = provider_options[option]["type"]
required = provider_options[option]["required"] print(f":param {type_} {option}: (optional) Notification option for ``type`` :attr:`~.NotificationType.{provider.name}`")
text = data.get(option)
line = f":param {type_}{', optional' if required else ''} {option}: Notification option for ``type`` :attr:`~.NotificationType.{provider.name}`."
if text:
line += f" {text}"
print(line)

View file

@ -3,96 +3,12 @@ import re
from bs4 import BeautifulSoup from bs4 import BeautifulSoup
from utils import deduplicate_list, write_to_file, type_html_to_py from utils import deduplicate_list, write_to_file
# deprecated or wrong inputs def build_notification_providers(root):
ignored_inputs = { providers = []
"slack": [ for path in glob.glob(f'{root}/server/notification-providers/*'):
"slackbutton"
],
"rocket.chat": [
"rocketbutton"
],
"octopush": [
"octopushDMLogin",
"octopushDMAPIKey",
"octopushDMPhoneNumber",
"octopushDMSenderName",
"octopushDMSMSType"
],
"Splunk": [
"pagerdutyIntegrationKey"
]
}
input_overwrites = {
"showAdditionalHeadersField": "webhookAdditionalHeaders"
}
titles = {
"alerta": "Alerta",
"AlertNow": "AlertNow",
"apprise": "Apprise (Support 50+ Notification services)",
"Bark": "Bark",
"clicksendsms": "ClickSend SMS",
"discord": "Discord",
"GoogleChat": "Google Chat (Google Workspace)",
"gorush": "Gorush",
"gotify": "Gotify",
"HomeAssistant": "Home Assistant",
"Kook": "Kook",
"line": "LINE Messenger",
"LineNotify": "LINE Notify",
"lunasea": "LunaSea",
"matrix": "Matrix",
"mattermost": "Mattermost",
"ntfy": "Ntfy",
"octopush": "Octopush",
"OneBot": "OneBot",
"Opsgenie": "Opsgenie",
"PagerDuty": "PagerDuty",
"PagerTree": "PagerTree",
"pushbullet": "Pushbullet",
"PushByTechulus": "Push by Techulus",
"pushover": "Pushover",
"pushy": "Pushy",
"rocket.chat": "Rocket.Chat",
"signal": "Signal",
"slack": "Slack",
"squadcast": "SquadCast",
"SMSEagle": "SMSEagle",
"smtp": "Email (SMTP)",
"stackfield": "Stackfield",
"teams": "Microsoft Teams",
"telegram": "Telegram",
"twilio": "Twilio",
"Splunk": "Splunk",
"webhook": "Webhook",
"GoAlert": "GoAlert",
"ZohoCliq": "ZohoCliq",
"AliyunSMS": "AliyunSMS",
"DingDing": "DingDing",
"Feishu": "Feishu",
"FreeMobile": "FreeMobile (mobile.free.fr)",
"PushDeer": "PushDeer",
"promosms": "PromoSMS",
"serwersms": "SerwerSMS.pl",
"SMSManager": "SmsManager (smsmanager.cz)",
"WeCom": "WeCom",
"ServerChan": "ServerChan",
"nostr": "Nostr",
"FlashDuty": "FlashDuty",
"smsc": "SMSC",
}
def build_notification_providers():
root = "uptime-kuma"
providers = {}
# get providers and input names
for path in sorted(glob.glob(f'{root}/server/notification-providers/*')):
with open(path) as f: with open(path) as f:
content = f.read() content = f.read()
match = re.search(r'class [^ ]+ extends NotificationProvider {', content) match = re.search(r'class [^ ]+ extends NotificationProvider {', content)
@ -100,19 +16,19 @@ def build_notification_providers():
match = re.search(r'name = "([^"]+)";', content) match = re.search(r'name = "([^"]+)";', content)
name = match.group(1) name = match.group(1)
inputs = re.findall(r'notification\??\.([^ ,.;})\]]+)', content) inputs = re.findall(r'notification\.([^ ,.;})\]]+)', content)
inputs = deduplicate_list(inputs) inputs = deduplicate_list(inputs)
inputs = [i.strip() for i in inputs] inputs = [i.strip() for i in inputs]
providers[name] = { providers.append({
"title": titles[name], "name": name,
"inputs": {}, "inputs": inputs,
} })
for input_ in inputs: return providers
if input_ not in ignored_inputs.get(name, []):
providers[name]["inputs"][input_] = {}
# get inputs
def build_notification_provider_conditions(root):
conditions = {}
for path in glob.glob(f'{root}/src/components/notifications/*'): for path in glob.glob(f'{root}/src/components/notifications/*'):
if path.endswith("index.js"): if path.endswith("index.js"):
continue continue
@ -121,62 +37,43 @@ def build_notification_providers():
match = re.search(r'<template>[\s\S]+</template>', content, re.MULTILINE) match = re.search(r'<template>[\s\S]+</template>', content, re.MULTILINE)
html = match.group(0) html = match.group(0)
soup = BeautifulSoup(html, "html.parser") soup = BeautifulSoup(html, "html.parser")
inputs = soup.find_all(attrs={"v-model": True}) inputs = soup.find_all("input")
for input_ in inputs: for input in inputs:
conditions = {} condition = {}
attrs = input_.attrs attrs = input.attrs
v_model = attrs.get("v-model") v_model = attrs.get("v-model")
v_model_overwrite = input_overwrites.get(v_model)
if v_model_overwrite:
param_name = v_model_overwrite
else:
param_name = re.match(r'\$parent.notification.(.*)$', v_model).group(1)
type_ = attrs.get("type")
type_ = type_html_to_py(type_)
required_true_values = ['', 'true']
if attrs.get("required") in required_true_values or attrs.get(":required") in required_true_values:
required = True
else:
required = False
min_ = attrs.get("min") min_ = attrs.get("min")
if min_:
conditions["min"] = int(min_)
max_ = attrs.get("max") max_ = attrs.get("max")
if min_:
condition["min"] = int(min_)
if max_: if max_:
conditions["max"] = int(max_) condition["max"] = int(max_)
param_name = re.match(r'\$parent.notification.(.*)$', v_model).group(1)
# find provider inputs dict if condition:
input_found = False conditions[param_name] = condition
for name in list(providers.keys()): return conditions
inputs = providers[name]["inputs"]
for provider_input in inputs:
if provider_input == param_name:
input_found = True
providers[name]["inputs"][provider_input] = {
"conditions": conditions,
"type": type_,
"required": required
}
assert input_found
return providers
notification_providers = build_notification_providers() def diff(old, new):
for i in new:
if i not in old:
print("+", i)
for i in old:
if i not in new:
print("-", i)
print("")
notification_provider_conditions = {}
for notification_provider in notification_providers:
for notification_provider_input_name in notification_providers[notification_provider]["inputs"]:
notification_provider_input = notification_providers[notification_provider]["inputs"][notification_provider_input_name]
if notification_provider_input["conditions"]:
notification_provider_conditions[notification_provider_input_name] = notification_provider_input["conditions"]
write_to_file( # write_to_file(
"notification_providers.py.j2", "./../uptime_kuma_api/notification_providers.py", # "notification_providers.py.j2", "./../uptime_kuma_api/notification_providers.py",
notification_providers=notification_providers, # notification_providers=notification_providers,
notification_provider_conditions=notification_provider_conditions # notification_provider_conditions=notification_provider_conditions
) # )
notification_providers_old = build_notification_providers("uptime-kuma-old")
notification_providers_new = build_notification_providers("uptime-kuma")
diff(notification_providers_old, notification_providers_new)
notification_provider_conditions_old = build_notification_provider_conditions("uptime-kuma-old")
notification_provider_conditions_new = build_notification_provider_conditions("uptime-kuma")
diff(notification_provider_conditions_old, notification_provider_conditions_new)

View file

@ -0,0 +1,6 @@
notification = [
"type",
"isDefault",
"userId",
"applyExisting",
]

View file

@ -2,10 +2,7 @@ from enum import Enum
class MonitorType(str, Enum): class MonitorType(str, Enum):
"""Enumerate monitor types.""" {%- for name in monitor_types %}
{{""}} {{ name.upper() }} = "{{ name }}"
{%- for type_ in monitor_types.values() %} {%- endfor %}
{{ type_["value"].upper().replace("-", "_") }} = "{{ type_["value"] }}"
"""{{ type_["title"] }}"""
{% endfor -%}

View file

@ -2,30 +2,30 @@ from enum import Enum
class NotificationType(str, Enum): class NotificationType(str, Enum):
"""Enumerate notification types.""" {%- for notification_provider in notification_providers %}
{% for provider in notification_providers %} {%- set name = notification_provider["name"] %}
{{ provider.upper().replace(".", "_") }} = "{{ provider }}" {{ name.upper().replace(".", "_") }} = "{{ name }}"
"""{{ notification_providers[provider]["title"] }}""" {%- endfor %}
{% endfor %}
notification_provider_options = { notification_provider_options = {
{%- for provider in notification_providers %} {%- for notification_provider in notification_providers %}
NotificationType.{{ provider.upper().replace(".", "_") }}: dict( {%- set name = notification_provider["name"] %}
{%- for input_name in notification_providers[provider]["inputs"] %} NotificationType.{{ name.upper().replace(".", "_") }}: [
{%- set input = notification_providers[provider]["inputs"][input_name] %} {%- for input in notification_provider["inputs"] %}
{{ input_name }}=dict(type="{{ input["type"] }}", required={{ input["required"] }}), "{{ input }}",
{%- endfor %} {%- endfor %}
), ],
{%- endfor %} {%- endfor %}
} }
notification_provider_conditions = dict( notification_provider_conditions = {
{%- for provider in notification_provider_conditions %} {%- for provider in notification_provider_conditions %}
{{ provider }}=dict( "{{ provider }}": {
{%- for key, value in notification_provider_conditions[provider].items() %} {%- for key, value in notification_provider_conditions[provider].items() %}
{{ key }}={{ value }}, "{{ key }}": {{ value }},
{%- endfor %} {%- endfor %}
), },
{%- endfor %} {%- endfor %}
) }

2
scripts/requirenents.txt Normal file
View file

@ -0,0 +1,2 @@
Jinja2==3.1.2
BeautifulSoup4==4.11.1

View file

@ -24,23 +24,3 @@ def write_to_file(template, destination, **kwargs):
rendered = template.render(**kwargs) rendered = template.render(**kwargs)
with open(destination, "w") as f: with open(destination, "w") as f:
f.write(rendered) f.write(rendered)
def diff(old, new):
for i in new:
if i not in old:
print("+", i)
for i in old:
if i not in new:
print("-", i)
print("")
def type_html_to_py(type_):
if type_ == "number":
type_ = "int"
elif type_ == "checkbox":
type_ = "bool"
else:
type_ = "str"
return type_

View file

@ -29,13 +29,13 @@ setup(
author_email="lucasheld@hotmail.de", author_email="lucasheld@hotmail.de",
license=info["__license__"], license=info["__license__"],
packages=["uptime_kuma_api"], packages=["uptime_kuma_api"],
python_requires=">=3.7, <4", python_requires=">=3.6, <4",
install_requires=[ install_requires=[
"python-socketio[client]>=5.0.0", "python-socketio[client]>=5.0.0",
"packaging" "packaging"
], ],
classifiers=[ classifiers=[
"Development Status :: 5 - Production/Stable", "Development Status :: 1 - Planning",
"Environment :: Web Environment", "Environment :: Web Environment",
"Intended Audience :: Developers", "Intended Audience :: Developers",
"License :: OSI Approved :: MIT License", "License :: OSI Approved :: MIT License",
@ -43,6 +43,7 @@ setup(
"Operating System :: OS Independent", "Operating System :: OS Independent",
"Programming Language :: Python", "Programming Language :: Python",
"Programming Language :: Python :: 3", "Programming Language :: Python :: 3",
"Programming Language :: Python :: 3.6",
"Programming Language :: Python :: 3.7", "Programming Language :: Python :: 3.7",
"Programming Language :: Python :: 3.8", "Programming Language :: Python :: 3.8",
"Programming Language :: Python :: 3.9", "Programming Language :: Python :: 3.9",

1
tests/requirements.txt Normal file
View file

@ -0,0 +1 @@
pyotp==2.6.0

View file

@ -1,59 +0,0 @@
import unittest
from uptime_kuma_api import UptimeKumaException
from uptime_kuma_test_case import UptimeKumaTestCase
class TestApiKey(UptimeKumaTestCase):
def test_api_key(self):
# get empty list to make sure that future accesses will also work
self.api.get_api_keys()
expected = {
"name": "name 1",
"expires": "2023-03-30 12:20:00",
"active": True
}
# add api key
r = self.api.add_api_key(**expected)
self.assertEqual(r["msg"], "Added Successfully.")
api_key_id = r["keyID"]
# get api key
api_key = self.api.get_api_key(api_key_id)
self.compare(api_key, expected)
# get api keys
api_keys = self.api.get_api_keys()
api_key = self.find_by_id(api_keys, api_key_id)
self.assertIsNotNone(api_key)
self.compare(api_key, expected)
# disable api key
r = self.api.disable_api_key(api_key_id)
self.assertEqual(r["msg"], "Disabled Successfully.")
api_key = self.api.get_api_key(api_key_id)
expected["active"] = False
self.compare(api_key, expected)
# enable api key
r = self.api.enable_api_key(api_key_id)
self.assertEqual(r["msg"], "Enabled Successfully")
api_key = self.api.get_api_key(api_key_id)
expected["active"] = True
self.compare(api_key, expected)
# delete api key
r = self.api.delete_api_key(api_key_id)
self.assertEqual(r["msg"], "Deleted Successfully.")
with self.assertRaises(UptimeKumaException):
self.api.get_api_key(api_key_id)
def test_delete_not_existing_api_key(self):
with self.assertRaises(UptimeKumaException):
self.api.delete_api_key(42)
if __name__ == '__main__':
unittest.main()

View file

@ -6,6 +6,12 @@ from uptime_kuma_test_case import UptimeKumaTestCase
class TestDockerHost(UptimeKumaTestCase): class TestDockerHost(UptimeKumaTestCase):
def setUp(self):
super(TestDockerHost, self).setUp()
if parse_version(self.api.version) < parse_version("1.18"):
super(TestDockerHost, self).tearDown()
self.skipTest("Unsupported in this Uptime Kuma version")
def test_docker_host(self): def test_docker_host(self):
# get empty list to make sure that future accesses will also work # get empty list to make sure that future accesses will also work
self.api.get_docker_hosts() self.api.get_docker_hosts()
@ -17,8 +23,6 @@ class TestDockerHost(UptimeKumaTestCase):
} }
# test docker host # test docker host
if parse_version(self.api.version) != parse_version("1.23.0"):
# test_docker_host does not work in 1.23.0 (https://github.com/louislam/uptime-kuma/issues/3605)
with self.assertRaisesRegex(UptimeKumaException, r'connect ENOENT /var/run/docker.sock'): with self.assertRaisesRegex(UptimeKumaException, r'connect ENOENT /var/run/docker.sock'):
self.api.test_docker_host(**expected_docker_host) self.api.test_docker_host(**expected_docker_host)
@ -33,7 +37,6 @@ class TestDockerHost(UptimeKumaTestCase):
# get docker hosts # get docker hosts
docker_hosts = self.api.get_docker_hosts() docker_hosts = self.api.get_docker_hosts()
self.assertTrue(type(docker_hosts[0]["dockerType"]) == DockerType)
docker_host = self.find_by_id(docker_hosts, docker_host_id) docker_host = self.find_by_id(docker_hosts, docker_host_id)
self.assertIsNotNone(docker_host) self.assertIsNotNone(docker_host)
self.compare(docker_host, expected_docker_host) self.compare(docker_host, expected_docker_host)
@ -51,10 +54,6 @@ class TestDockerHost(UptimeKumaTestCase):
with self.assertRaises(UptimeKumaException): with self.assertRaises(UptimeKumaException):
self.api.get_docker_host(docker_host_id) self.api.get_docker_host(docker_host_id)
def test_delete_not_existing_docker_host(self):
with self.assertRaises(UptimeKumaException):
self.api.delete_docker_host(42)
if __name__ == '__main__': if __name__ == '__main__':
unittest.main() unittest.main()

View file

@ -1,13 +0,0 @@
import unittest
from uptime_kuma_test_case import UptimeKumaTestCase
class TestGameList(UptimeKumaTestCase):
def test_game_list(self):
game_list = self.api.get_game_list()
self.assertTrue("keys" in game_list[0])
if __name__ == '__main__':
unittest.main()

View file

@ -1,19 +1,14 @@
import unittest import unittest
from uptime_kuma_api import MonitorStatus
from uptime_kuma_test_case import UptimeKumaTestCase from uptime_kuma_test_case import UptimeKumaTestCase
class TestHeartbeat(UptimeKumaTestCase): class TestHeartbeat(UptimeKumaTestCase):
def test_get_heartbeats(self): def test_get_heartbeats(self):
self.add_monitor() self.api.get_heartbeats()
r = self.api.get_heartbeats()
self.assertTrue(type(list(r.values())[0][0]["status"]) == MonitorStatus)
def test_get_important_heartbeats(self): def test_get_important_heartbeats(self):
self.add_monitor() self.api.get_important_heartbeats()
r = self.api.get_important_heartbeats()
self.assertTrue(type(list(r.values())[0][0]["status"]) == MonitorStatus)
if __name__ == '__main__': if __name__ == '__main__':

View file

@ -1,15 +0,0 @@
import unittest
from uptime_kuma_api import MonitorStatus
from uptime_kuma_test_case import UptimeKumaTestCase
class TestHelperMethods(UptimeKumaTestCase):
def test_monitor_status(self):
monitor_id = self.add_monitor()
status = self.api.get_monitor_status(monitor_id)
self.assertTrue(type(status) == MonitorStatus)
if __name__ == '__main__':
unittest.main()

View file

@ -1,6 +1,5 @@
import unittest import unittest
from uptime_kuma_api import UptimeKumaApi
from uptime_kuma_test_case import UptimeKumaTestCase from uptime_kuma_test_case import UptimeKumaTestCase
@ -10,16 +9,6 @@ class TestInfo(UptimeKumaTestCase):
self.assertIn("version", info) self.assertIn("version", info)
self.assertIn("latestVersion", info) self.assertIn("latestVersion", info)
def test_info_with_version(self):
# If wait_events is set to 0, the first info event is normally used.
# The info event handler needs to drop this first event without a version.
self.api.logout()
self.api.disconnect()
self.api = UptimeKumaApi(self.url, wait_events=0)
self.api.login(self.username, self.password)
info = self.api.info()
self.assertIn("version", info)
if __name__ == '__main__': if __name__ == '__main__':
unittest.main() unittest.main()

View file

@ -1,10 +1,18 @@
import unittest import unittest
from packaging.version import parse as parse_version
from uptime_kuma_api import UptimeKumaException, MaintenanceStrategy from uptime_kuma_api import UptimeKumaException, MaintenanceStrategy
from uptime_kuma_test_case import UptimeKumaTestCase from uptime_kuma_test_case import UptimeKumaTestCase
class TestMaintenance(UptimeKumaTestCase): class TestMaintenance(UptimeKumaTestCase):
def setUp(self):
super(TestMaintenance, self).setUp()
if parse_version(self.api.version) < parse_version("1.19"):
super(TestMaintenance, self).tearDown()
self.skipTest("Unsupported in this Uptime Kuma version")
def test_maintenance(self): def test_maintenance(self):
expected_maintenance = { expected_maintenance = {
"title": "maintenance 1", "title": "maintenance 1",
@ -16,9 +24,18 @@ class TestMaintenance(UptimeKumaTestCase):
"2022-12-27 22:36:00", "2022-12-27 22:36:00",
"2022-12-29 22:36:00" "2022-12-29 22:36:00"
], ],
"timeRange": [
{
"hours": 2,
"minutes": 0
},
{
"hours": 3,
"minutes": 0
}
],
"weekdays": [], "weekdays": [],
"daysOfMonth": [], "daysOfMonth": []
"timezoneOption": "Europe/Berlin"
} }
# add maintenance # add maintenance
@ -28,12 +45,10 @@ class TestMaintenance(UptimeKumaTestCase):
# get maintenance # get maintenance
maintenance = self.api.get_maintenance(maintenance_id) maintenance = self.api.get_maintenance(maintenance_id)
self.assertTrue(type(maintenance["strategy"]) == MaintenanceStrategy)
self.compare(maintenance, expected_maintenance) self.compare(maintenance, expected_maintenance)
# get maintenances # get maintenances
maintenances = self.api.get_maintenances() maintenances = self.api.get_maintenances()
self.assertTrue(type(maintenances[0]["strategy"]) == MaintenanceStrategy)
maintenance = self.find_by_id(maintenances, maintenance_id) maintenance = self.find_by_id(maintenances, maintenance_id)
self.assertIsNotNone(maintenance) self.assertIsNotNone(maintenance)
self.compare(maintenance, expected_maintenance) self.compare(maintenance, expected_maintenance)
@ -59,7 +74,8 @@ class TestMaintenance(UptimeKumaTestCase):
monitor_id = self.add_monitor(monitor_name) monitor_id = self.add_monitor(monitor_name)
monitors = [ monitors = [
{ {
"id": monitor_id "id": monitor_id,
"name": monitor_name
}, },
] ]
r = self.api.add_monitor_maintenance(maintenance_id, monitors) r = self.api.add_monitor_maintenance(maintenance_id, monitors)
@ -75,7 +91,8 @@ class TestMaintenance(UptimeKumaTestCase):
status_page_id = self.add_status_page(status_page_title) status_page_id = self.add_status_page(status_page_title)
status_pages = [ status_pages = [
{ {
"id": status_page_id "id": status_page_id,
"name": status_page_title
} }
] ]
r = self.api.add_status_page_maintenance(maintenance_id, status_pages) r = self.api.add_status_page_maintenance(maintenance_id, status_pages)
@ -102,6 +119,18 @@ class TestMaintenance(UptimeKumaTestCase):
"dateRange": [ "dateRange": [
"2022-12-27 00:00:00" "2022-12-27 00:00:00"
], ],
"timeRange": [
{
"hours": 2,
"minutes": 0,
"seconds": 0
},
{
"hours": 3,
"minutes": 0,
"seconds": 0
}
],
"weekdays": [], "weekdays": [],
"daysOfMonth": [] "daysOfMonth": []
} }
@ -118,6 +147,16 @@ class TestMaintenance(UptimeKumaTestCase):
"2022-12-27 22:36:00", "2022-12-27 22:36:00",
"2022-12-29 22:36:00" "2022-12-29 22:36:00"
], ],
"timeRange": [
{
"hours": 2,
"minutes": 0
},
{
"hours": 3,
"minutes": 0
}
],
"weekdays": [], "weekdays": [],
"daysOfMonth": [] "daysOfMonth": []
} }
@ -207,30 +246,12 @@ class TestMaintenance(UptimeKumaTestCase):
10, 10,
20, 20,
30, 30,
"lastDay1" "lastDay4",
"lastDay2"
] ]
} }
self.do_test_maintenance_strategy(expected_maintenance) self.do_test_maintenance_strategy(expected_maintenance)
def test_maintenance_strategy_cron(self):
expected_maintenance = {
"title": "test",
"description": "test",
"strategy": MaintenanceStrategy.CRON,
"active": True,
"intervalDay": 1,
"dateRange": [
"2022-12-27 22:37:00",
"2022-12-31 22:37:00"
],
"weekdays": [],
"daysOfMonth": [],
"cron": "50 5 * * *",
"durationMinutes": 120,
"timezoneOption": "Europe/Berlin"
}
self.do_test_maintenance_strategy(expected_maintenance)
def do_test_maintenance_strategy(self, expected_maintenance): def do_test_maintenance_strategy(self, expected_maintenance):
# add maintenance # add maintenance
r = self.api.add_maintenance(**expected_maintenance) r = self.api.add_maintenance(**expected_maintenance)
@ -260,10 +281,6 @@ class TestMaintenance(UptimeKumaTestCase):
with self.assertRaises(UptimeKumaException): with self.assertRaises(UptimeKumaException):
self.api.get_maintenance(maintenance_id) self.api.get_maintenance(maintenance_id)
def test_delete_not_existing_maintenance(self):
with self.assertRaises(UptimeKumaException):
self.api.delete_maintenance(42)
if __name__ == '__main__': if __name__ == '__main__':
unittest.main() unittest.main()

View file

@ -1,7 +1,7 @@
import unittest import unittest
from packaging.version import parse as parse_version from packaging.version import parse as parse_version
from uptime_kuma_api import UptimeKumaException, MonitorType, AuthMethod, MonitorStatus from uptime_kuma_api import UptimeKumaException, MonitorType, AuthMethod
from uptime_kuma_test_case import UptimeKumaTestCase from uptime_kuma_test_case import UptimeKumaTestCase
@ -21,9 +21,12 @@ class TestMonitor(UptimeKumaTestCase):
"maxretries": 0, "maxretries": 0,
"notificationIDList": [notification_id_1, notification_id_2], "notificationIDList": [notification_id_1, notification_id_2],
"upsideDown": False, "upsideDown": False,
"url": "http://127.0.0.1", "url": "http://127.0.0.1"
"resendInterval": 0
} }
if parse_version(self.api.version) >= parse_version("1.18"):
expected_monitor.update({
"resendInterval": 0
})
# add monitor # add monitor
r = self.api.add_monitor(**expected_monitor) r = self.api.add_monitor(**expected_monitor)
@ -36,11 +39,7 @@ class TestMonitor(UptimeKumaTestCase):
# get monitors # get monitors
monitors = self.api.get_monitors() monitors = self.api.get_monitors()
self.assertTrue(type(monitors[0]["type"]) == MonitorType)
self.assertTrue(type(monitors[0]["authMethod"]) == AuthMethod)
monitor = self.find_by_id(monitors, monitor_id) monitor = self.find_by_id(monitors, monitor_id)
self.assertTrue(type(monitor["type"]) == MonitorType)
self.assertTrue(type(monitor["authMethod"]) == AuthMethod)
self.assertIsNotNone(monitor) self.assertIsNotNone(monitor)
self.compare(monitor, expected_monitor) self.compare(monitor, expected_monitor)
@ -63,8 +62,7 @@ class TestMonitor(UptimeKumaTestCase):
self.assertEqual(r["msg"], "Resumed Successfully.") self.assertEqual(r["msg"], "Resumed Successfully.")
# get monitor beats # get monitor beats
r = self.api.get_monitor_beats(monitor_id, 6) self.api.get_monitor_beats(monitor_id, 6)
self.assertTrue(type(r[0]["status"]) == MonitorStatus)
# delete monitor # delete monitor
r = self.api.delete_monitor(monitor_id) r = self.api.delete_monitor(monitor_id)
@ -134,17 +132,6 @@ class TestMonitor(UptimeKumaTestCase):
} }
self.do_test_monitor_type(expected_monitor) self.do_test_monitor_type(expected_monitor)
expected_monitor = {
"type": MonitorType.HTTP,
"name": "monitor 1",
"url": "http://127.0.0.1",
"authMethod": AuthMethod.MTLS,
"tlsCert": "cert",
"tlsKey": "key",
"tlsCa": "ca",
}
self.do_test_monitor_type(expected_monitor)
def test_monitor_type_port(self): def test_monitor_type_port(self):
expected_monitor = { expected_monitor = {
"type": MonitorType.PORT, "type": MonitorType.PORT,
@ -158,8 +145,7 @@ class TestMonitor(UptimeKumaTestCase):
expected_monitor = { expected_monitor = {
"type": MonitorType.PING, "type": MonitorType.PING,
"name": "monitor 1", "name": "monitor 1",
"hostname": "127.0.0.1", "hostname": "127.0.0.1"
"packetSize": 56
} }
self.do_test_monitor_type(expected_monitor) self.do_test_monitor_type(expected_monitor)
@ -173,6 +159,9 @@ class TestMonitor(UptimeKumaTestCase):
self.do_test_monitor_type(expected_monitor) self.do_test_monitor_type(expected_monitor)
def test_monitor_type_grpc_keyword(self): def test_monitor_type_grpc_keyword(self):
if parse_version(self.api.version) < parse_version("1.19"):
self.skipTest("Unsupported in this Uptime Kuma version")
expected_monitor = { expected_monitor = {
"type": MonitorType.GRPC_KEYWORD, "type": MonitorType.GRPC_KEYWORD,
"name": "monitor 1", "name": "monitor 1",
@ -195,6 +184,9 @@ class TestMonitor(UptimeKumaTestCase):
self.do_test_monitor_type(expected_monitor) self.do_test_monitor_type(expected_monitor)
def test_monitor_type_docker(self): def test_monitor_type_docker(self):
if parse_version(self.api.version) < parse_version("1.18"):
self.skipTest("Unsupported in this Uptime Kuma version")
docker_host_id = self.add_docker_host() docker_host_id = self.add_docker_host()
expected_monitor = { expected_monitor = {
"type": MonitorType.DOCKER, "type": MonitorType.DOCKER,
@ -223,18 +215,6 @@ class TestMonitor(UptimeKumaTestCase):
} }
self.do_test_monitor_type(expected_monitor) self.do_test_monitor_type(expected_monitor)
def test_monitor_type_gamedig(self):
game_list = self.api.get_game_list()
game = game_list[0]["keys"][0]
expected_monitor = {
"type": MonitorType.GAMEDIG,
"name": "monitor 1",
"hostname": "127.0.0.1",
"port": 8888,
"game": game
}
self.do_test_monitor_type(expected_monitor)
def test_monitor_type_mqtt(self): def test_monitor_type_mqtt(self):
expected_monitor = { expected_monitor = {
"type": MonitorType.MQTT, "type": MonitorType.MQTT,
@ -259,6 +239,9 @@ class TestMonitor(UptimeKumaTestCase):
self.do_test_monitor_type(expected_monitor) self.do_test_monitor_type(expected_monitor)
def test_monitor_type_postgres(self): def test_monitor_type_postgres(self):
if parse_version(self.api.version) < parse_version("1.18"):
self.skipTest("Unsupported in this Uptime Kuma version")
expected_monitor = { expected_monitor = {
"type": MonitorType.POSTGRES, "type": MonitorType.POSTGRES,
"name": "monitor 1", "name": "monitor 1",
@ -268,6 +251,9 @@ class TestMonitor(UptimeKumaTestCase):
self.do_test_monitor_type(expected_monitor) self.do_test_monitor_type(expected_monitor)
def test_monitor_type_mysql(self): def test_monitor_type_mysql(self):
if parse_version(self.api.version) < parse_version("1.19"):
self.skipTest("Unsupported in this Uptime Kuma version")
expected_monitor = { expected_monitor = {
"type": MonitorType.MYSQL, "type": MonitorType.MYSQL,
"name": "monitor 1", "name": "monitor 1",
@ -276,15 +262,10 @@ class TestMonitor(UptimeKumaTestCase):
} }
self.do_test_monitor_type(expected_monitor) self.do_test_monitor_type(expected_monitor)
def test_monitor_type_mongodb(self):
expected_monitor = {
"type": MonitorType.MONGODB,
"name": "monitor 1",
"databaseConnectionString": "mongodb://username:password@host:port/database"
}
self.do_test_monitor_type(expected_monitor)
def test_monitor_type_radius(self): def test_monitor_type_radius(self):
if parse_version(self.api.version) < parse_version("1.18"):
self.skipTest("Unsupported in this Uptime Kuma version")
expected_monitor = { expected_monitor = {
"type": MonitorType.RADIUS, "type": MonitorType.RADIUS,
"name": "monitor 1", "name": "monitor 1",
@ -296,85 +277,6 @@ class TestMonitor(UptimeKumaTestCase):
} }
self.do_test_monitor_type(expected_monitor) self.do_test_monitor_type(expected_monitor)
def test_monitor_type_redis(self):
expected_monitor = {
"type": MonitorType.REDIS,
"name": "monitor 1",
"databaseConnectionString": "redis://user:password@host:port"
}
self.do_test_monitor_type(expected_monitor)
def test_monitor_type_group(self):
if parse_version(self.api.version) < parse_version("1.22"):
self.skipTest("Unsupported in this Uptime Kuma version")
# create monitor group
expected_monitor = {
"type": MonitorType.GROUP,
"name": "monitor 1"
}
group_monitor = self.do_test_monitor_type(expected_monitor)
group_monitor_id = group_monitor["id"]
# use monitor group as parent for another monitor
expected_monitor = {
"type": MonitorType.PUSH,
"name": "monitor 1",
"parent": group_monitor_id
}
self.do_test_monitor_type(expected_monitor)
def test_monitor_type_json_query(self):
if parse_version(self.api.version) < parse_version("1.23"):
self.skipTest("Unsupported in this Uptime Kuma version")
expected_monitor = {
"type": MonitorType.JSON_QUERY,
"name": "monitor 1",
"url": "http://127.0.0.1",
"jsonPath": "address.country",
"expectedValue": "germany",
}
self.do_test_monitor_type(expected_monitor)
def test_monitor_type_real_browser(self):
if parse_version(self.api.version) < parse_version("1.23"):
self.skipTest("Unsupported in this Uptime Kuma version")
expected_monitor = {
"type": MonitorType.REAL_BROWSER,
"name": "monitor 1",
"url": "http://127.0.0.1",
}
self.do_test_monitor_type(expected_monitor)
def test_monitor_type_kafka_producer(self):
if parse_version(self.api.version) < parse_version("1.23"):
self.skipTest("Unsupported in this Uptime Kuma version")
expected_monitor = {
"type": MonitorType.KAFKA_PRODUCER,
"name": "monitor 1",
"kafkaProducerTopic": "topic",
"kafkaProducerMessage": "message",
}
self.do_test_monitor_type(expected_monitor)
def test_monitor_type_tailscale_ping(self):
if parse_version(self.api.version) < parse_version("1.23"):
self.skipTest("Unsupported in this Uptime Kuma version")
expected_monitor = {
"type": MonitorType.TAILSCALE_PING,
"name": "monitor 1",
"hostname": "127.0.0.1"
}
self.do_test_monitor_type(expected_monitor)
def test_delete_not_existing_monitor(self):
with self.assertRaises(UptimeKumaException):
self.api.delete_monitor(42)
if __name__ == '__main__': if __name__ == '__main__':
unittest.main() unittest.main()

View file

@ -1,6 +1,5 @@
import unittest import unittest
from uptime_kuma_api import UptimeKumaException
from uptime_kuma_test_case import UptimeKumaTestCase from uptime_kuma_test_case import UptimeKumaTestCase
@ -33,10 +32,6 @@ class TestMonitorTag(UptimeKumaTestCase):
monitor = self.find_by_id(monitors, monitor_id) monitor = self.find_by_id(monitors, monitor_id)
self.assertEqual(monitor["tags"], []) self.assertEqual(monitor["tags"], [])
def test_delete_not_existing_monitor_tag(self):
with self.assertRaises(UptimeKumaException):
self.api.delete_monitor_tag(42, 42, 42)
if __name__ == '__main__': if __name__ == '__main__':
unittest.main() unittest.main()

View file

@ -13,13 +13,12 @@ class TestNotification(UptimeKumaTestCase):
"name": "notification 1", "name": "notification 1",
"isDefault": True, "isDefault": True,
"applyExisting": True, "applyExisting": True,
"type": NotificationType.TELEGRAM, "type": NotificationType.PUSHBYTECHULUS,
"telegramChatID": "123456789", "pushAPIKey": "123456789"
"telegramBotToken": "987654321"
} }
# test notification # test notification
with self.assertRaisesRegex(UptimeKumaException, r'Not Found'): with self.assertRaisesRegex(UptimeKumaException, r'Invalid API key'):
self.api.test_notification(**expected_notification) self.api.test_notification(**expected_notification)
# add notification # add notification
@ -33,9 +32,7 @@ class TestNotification(UptimeKumaTestCase):
# get notifications # get notifications
notifications = self.api.get_notifications() notifications = self.api.get_notifications()
self.assertTrue(type(notifications[0]["type"]) == NotificationType)
notification = self.find_by_id(notifications, notification_id) notification = self.find_by_id(notifications, notification_id)
self.assertTrue(type(notification["type"]) == NotificationType)
self.assertIsNotNone(notification) self.assertIsNotNone(notification)
self.compare(notification, expected_notification) self.compare(notification, expected_notification)
@ -45,8 +42,7 @@ class TestNotification(UptimeKumaTestCase):
expected_notification["applyExisting"] = False expected_notification["applyExisting"] = False
expected_notification["type"] = NotificationType.PUSHDEER expected_notification["type"] = NotificationType.PUSHDEER
expected_notification["pushdeerKey"] = "987654321" expected_notification["pushdeerKey"] = "987654321"
del expected_notification["telegramChatID"] del expected_notification["pushAPIKey"]
del expected_notification["telegramBotToken"]
r = self.api.edit_notification(notification_id, **expected_notification) r = self.api.edit_notification(notification_id, **expected_notification)
self.assertEqual(r["msg"], "Saved") self.assertEqual(r["msg"], "Saved")
notification = self.api.get_notification(notification_id) notification = self.api.get_notification(notification_id)
@ -59,10 +55,6 @@ class TestNotification(UptimeKumaTestCase):
with self.assertRaises(UptimeKumaException): with self.assertRaises(UptimeKumaException):
self.api.delete_notification(notification_id) self.api.delete_notification(notification_id)
def test_delete_not_existing_notification(self):
with self.assertRaises(UptimeKumaException):
self.api.delete_notification(42)
if __name__ == '__main__': if __name__ == '__main__':
unittest.main() unittest.main()

View file

@ -31,7 +31,6 @@ class TestProxy(UptimeKumaTestCase):
# get proxies # get proxies
proxies = self.api.get_proxies() proxies = self.api.get_proxies()
self.assertTrue(type(proxies[0]["protocol"]) == ProxyProtocol)
proxy = self.find_by_id(proxies, proxy_id) proxy = self.find_by_id(proxies, proxy_id)
self.assertIsNotNone(proxy) self.assertIsNotNone(proxy)
self.compare(proxy, expected_proxy) self.compare(proxy, expected_proxy)
@ -51,10 +50,6 @@ class TestProxy(UptimeKumaTestCase):
with self.assertRaises(UptimeKumaException): with self.assertRaises(UptimeKumaException):
self.api.get_proxy(proxy_id) self.api.get_proxy(proxy_id)
def test_delete_not_existing_proxy(self):
with self.assertRaises(UptimeKumaException):
self.api.delete_proxy(42)
if __name__ == '__main__': if __name__ == '__main__':
unittest.main() unittest.main()

View file

@ -1,5 +1,6 @@
import json import json
import unittest import unittest
from packaging.version import parse as parse_version
from uptime_kuma_test_case import UptimeKumaTestCase from uptime_kuma_test_case import UptimeKumaTestCase
@ -15,12 +16,20 @@ class TestSettings(UptimeKumaTestCase):
"primaryBaseURL": "", "primaryBaseURL": "",
"steamAPIKey": "", "steamAPIKey": "",
"tlsExpiryNotifyDays": [7, 14, 21], "tlsExpiryNotifyDays": [7, 14, 21],
"disableAuth": False, "disableAuth": False
"trustProxy": False,
"serverTimezone": "Europe/Berlin",
"dnsCache": True
} }
if parse_version(self.api.version) >= parse_version("1.18"):
expected_settings.update({
"trustProxy": False
})
if parse_version(self.api.version) >= parse_version("1.19"):
expected_settings.update({
"serverTimezone": "Europe/Berlin",
"dnsCache": True,
})
# set settings # set settings
r = self.api.set_settings(self.password, **expected_settings) r = self.api.set_settings(self.password, **expected_settings)
self.assertEqual(r["msg"], "Saved") self.assertEqual(r["msg"], "Saved")

View file

@ -34,8 +34,7 @@ class TestStatusPage(UptimeKumaTestCase):
} }
] ]
} }
], ]
"googleAnalyticsId": ""
} }
# add status page # add status page
@ -71,11 +70,9 @@ class TestStatusPage(UptimeKumaTestCase):
"style": IncidentStyle.DANGER "style": IncidentStyle.DANGER
} }
incident = self.api.post_incident(slug, **incident_expected) incident = self.api.post_incident(slug, **incident_expected)
self.assertTrue(type(incident["style"]) == IncidentStyle)
self.compare(incident, incident_expected) self.compare(incident, incident_expected)
status_page = self.api.get_status_page(slug) status_page = self.api.get_status_page(slug)
self.compare(status_page["incident"], incident) self.compare(status_page["incident"], incident)
self.assertTrue(type(status_page["incident"]["style"]) == IncidentStyle)
# unpin incident # unpin incident
self.api.unpin_incident(slug) self.api.unpin_incident(slug)
@ -91,10 +88,6 @@ class TestStatusPage(UptimeKumaTestCase):
status_page = self.find_by_id(status_pages, slug, "slug") status_page = self.find_by_id(status_pages, slug, "slug")
self.assertIsNone(status_page) self.assertIsNone(status_page)
def test_delete_not_existing_status_page(self):
with self.assertRaises(UptimeKumaException):
self.api.delete_status_page("slug42")
if __name__ == '__main__': if __name__ == '__main__':
unittest.main() unittest.main()

View file

@ -26,24 +26,12 @@ class TestTag(UptimeKumaTestCase):
self.assertIsNotNone(tag) self.assertIsNotNone(tag)
self.compare(tag, expected_tag) self.compare(tag, expected_tag)
# edit tag
expected_tag["name"] = "tag 1 new"
expected_tag["color"] = "#000000"
r = self.api.edit_tag(tag_id, **expected_tag)
self.assertEqual(r["msg"], "Saved")
tag = self.api.get_tag(tag_id)
self.compare(tag, expected_tag)
# delete tag # delete tag
r = self.api.delete_tag(tag_id) r = self.api.delete_tag(tag_id)
self.assertEqual(r["msg"], "Deleted Successfully.") self.assertEqual(r["msg"], "Deleted Successfully.")
with self.assertRaises(UptimeKumaException): with self.assertRaises(UptimeKumaException):
self.api.get_tag(tag_id) self.api.get_tag(tag_id)
def test_delete_not_existing_tag(self):
with self.assertRaises(UptimeKumaException):
self.api.delete_tag(42)
if __name__ == '__main__': if __name__ == '__main__':
unittest.main() unittest.main()

View file

@ -1,7 +1,8 @@
import unittest import unittest
import warnings import warnings
from packaging.version import parse as parse_version
from uptime_kuma_api import UptimeKumaApi, MonitorType, DockerType from uptime_kuma_api import UptimeKumaApi, MonitorType, DockerType, UptimeKumaException
token = None token = None
@ -37,7 +38,7 @@ class UptimeKumaTestCase(unittest.TestCase):
def setUp(self): def setUp(self):
warnings.simplefilter("ignore", ResourceWarning) warnings.simplefilter("ignore", ResourceWarning)
self.api = UptimeKumaApi(self.url, timeout=1, wait_events=0.01) self.api = UptimeKumaApi(self.url)
global token global token
if not token: if not token:
@ -73,21 +74,12 @@ class UptimeKumaTestCase(unittest.TestCase):
for status_page in status_pages: for status_page in status_pages:
self.api.delete_status_page(status_page["slug"]) self.api.delete_status_page(status_page["slug"])
if parse_version(self.api.version) >= parse_version("1.18"):
# delete docker hosts # delete docker hosts
docker_hosts = self.api.get_docker_hosts() docker_hosts = self.api.get_docker_hosts()
for docker_host in docker_hosts: for docker_host in docker_hosts:
self.api.delete_docker_host(docker_host["id"]) self.api.delete_docker_host(docker_host["id"])
# delete maintenances
maintenances = self.api.get_maintenances()
for maintenance in maintenances:
self.api.delete_maintenance(maintenance["id"])
# delete api keys
api_keys = self.api.get_api_keys()
for api_key in api_keys:
self.api.delete_api_key(api_key["id"])
# login again to receive initial messages # login again to receive initial messages
self.api.disconnect() self.api.disconnect()
self.api = UptimeKumaApi(self.url) self.api = UptimeKumaApi(self.url)

View file

@ -1,12 +1,11 @@
from .__version__ import __title__, __version__, __author__, __copyright__ from .__version__ import __title__, __version__, __author__, __copyright__
from .auth_method import AuthMethod from .auth_method import AuthMethod
from .monitor_status import MonitorStatus
from .monitor_type import MonitorType from .monitor_type import MonitorType
from .notification_providers import NotificationType, notification_provider_options, notification_provider_conditions from .notification_providers import NotificationType, notification_provider_options, notification_provider_conditions
from .proxy_protocol import ProxyProtocol from .proxy_protocol import ProxyProtocol
from .incident_style import IncidentStyle from .incident_style import IncidentStyle
from .docker_type import DockerType from .docker_type import DockerType
from .maintenance_strategy import MaintenanceStrategy from .maintenance_strategy import MaintenanceStrategy
from .exceptions import UptimeKumaException, Timeout from .exceptions import UptimeKumaException
from .event import Event from .event import Event
from .api import UptimeKumaApi from .api import UptimeKumaApi

View file

@ -1,5 +1,5 @@
__title__ = "uptime_kuma_api" __title__ = "uptime_kuma_api"
__version__ = "1.2.1" __version__ = "0.8.0"
__author__ = "Lucas Held" __author__ = "Lucas Held"
__license__ = "MIT" __license__ = "MIT"
__copyright__ = "Copyright 2023 Lucas Held" __copyright__ = "Copyright 2022 Lucas Held"

File diff suppressed because one or more lines are too long

View file

@ -12,9 +12,3 @@ class AuthMethod(str, Enum):
NTLM = "ntlm" NTLM = "ntlm"
"""NTLM Authentication.""" """NTLM Authentication."""
MTLS = "mtls"
"""mTLS Authentication."""
OAUTH2_CC = "oauth2-cc"
"""OAuth2: Client Credentials"""

View file

@ -18,8 +18,6 @@ def monitor_docstring(mode) -> str:
return f""" return f"""
:param MonitorType{", optional" if mode == "edit" else ""} type: Monitor Type :param MonitorType{", optional" if mode == "edit" else ""} type: Monitor Type
:param str{", optional" if mode == "edit" else ""} name: Friendly Name :param str{", optional" if mode == "edit" else ""} name: Friendly Name
:param str, optional parent: Id of the monitor group, defaults to None
:param str, optional description: Description, defaults to None
:param int, optional interval: Heartbeat Interval, defaults to 60 :param int, optional interval: Heartbeat Interval, defaults to 60
:param int, optional retryInterval: Retry every X seconds, defaults to 60 :param int, optional retryInterval: Retry every X seconds, defaults to 60
:param int, optional resendInterval: Resend every X times, defaults to 0 :param int, optional resendInterval: Resend every X times, defaults to 0
@ -33,41 +31,18 @@ def monitor_docstring(mode) -> str:
:param list, optional accepted_statuscodes: Accepted Status Codes. Select status codes which are considered as a successful response., defaults to None :param list, optional accepted_statuscodes: Accepted Status Codes. Select status codes which are considered as a successful response., defaults to None
:param int, optional proxyId: Proxy, defaults to None :param int, optional proxyId: Proxy, defaults to None
:param str, optional method: Method, defaults to "GET" :param str, optional method: Method, defaults to "GET"
:param str, optional httpBodyEncoding: Body Encoding, defaults to "json". Allowed values: "json", "xml".
:param str, optional body: Body, defaults to None :param str, optional body: Body, defaults to None
:param str, optional headers: Headers, defaults to None :param str, optional headers: Headers, defaults to None
:param AuthMethod, optional authMethod: Method, defaults to :attr:`~.AuthMethod.NONE` :param AuthMethod, optional authMethod: Method, defaults to :attr:`~.AuthMethod.NONE`
:param str, optional tlsCert: Cert for ``authMethod`` :attr:`~.AuthMethod.MTLS`, defaults to None. :param str, optional basic_auth_user: Username, defaults to None
:param str, optional tlsKey: Key for ``authMethod`` :attr:`~.AuthMethod.MTLS`, defaults to None. :param str, optional basic_auth_pass: Password, defaults to None
:param str, optional tlsCa: Ca for ``authMethod`` :attr:`~.AuthMethod.MTLS`, defaults to None. :param str, optional authDomain: Domain, defaults to None
:param str, optional basic_auth_user: Username for ``authMethod`` :attr:`~.AuthMethod.HTTP_BASIC` and :attr:`~.AuthMethod.NTLM`, defaults to None :param str, optional authWorkstation: Workstation, defaults to None
:param str, optional basic_auth_pass: Password for ``authMethod`` :attr:`~.AuthMethod.HTTP_BASIC` and :attr:`~.AuthMethod.NTLM`, defaults to None
:param str, optional authDomain: Domain for ``authMethod`` :attr:`~.AuthMethod.NTLM`, defaults to None
:param str, optional authWorkstation: Workstation for ``authMethod`` :attr:`~.AuthMethod.NTLM`, defaults to None
:param str, optional oauth_auth_method: Authentication Method, defaults to None
:param str, optional oauth_token_url: OAuth Token URL, defaults to None
:param str, optional oauth_client_id: Client ID, defaults to None
:param str, optional oauth_client_secret: Client Secret, defaults to None
:param str, optional oauth_scopes: OAuth Scope, defaults to None
:param int, optional timeout: Request Timeout, defaults to None
:param str, optional keyword: Keyword. Search keyword in plain HTML or JSON response. The search is case-sensitive., defaults to None :param str, optional keyword: Keyword. Search keyword in plain HTML or JSON response. The search is case-sensitive., defaults to None
:param bool, optional invertKeyword: Invert Keyword. Look for the keyword to be absent rather than present., defaults to False
:param str, optional hostname: Hostname, defaults to None :param str, optional hostname: Hostname, defaults to None
:param int, optional packetSize: Packet Size, defaults to None
:param int, optional port: Port, ``type`` :attr:`~.MonitorType.DNS` defaults to ``53`` and ``type`` :attr:`~.MonitorType.RADIUS` defaults to ``1812`` :param int, optional port: Port, ``type`` :attr:`~.MonitorType.DNS` defaults to ``53`` and ``type`` :attr:`~.MonitorType.RADIUS` defaults to ``1812``
:param str, optional dns_resolve_server: Resolver Server, defaults to "1.1.1.1" :param str, optional dns_resolve_server: Resolver Server, defaults to "1.1.1.1"
:param str, optional dns_resolve_type: Resource Record Type, defaults to "A". Available values are: :param str, optional dns_resolve_type: Resource Record Type, defaults to "A"
- "A"
- "AAAA"
- "CAA"
- "CNAME"
- "MX"
- "NS"
- "PTR"
- "SOA"
- "SRV"
- "TXT"
:param str, optional mqttUsername: MQTT Username, defaults to None :param str, optional mqttUsername: MQTT Username, defaults to None
:param str, optional mqttPassword: MQTT Password, defaults to None :param str, optional mqttPassword: MQTT Password, defaults to None
:param str, optional mqttTopic: MQTT Topic, defaults to None :param str, optional mqttTopic: MQTT Topic, defaults to None
@ -81,30 +56,6 @@ def monitor_docstring(mode) -> str:
:param str, optional radiusSecret: Radius Secret. Shared Secret between client and server., defaults to None :param str, optional radiusSecret: Radius Secret. Shared Secret between client and server., defaults to None
:param str, optional radiusCalledStationId: Called Station Id. Identifier of the called device., defaults to None :param str, optional radiusCalledStationId: Called Station Id. Identifier of the called device., defaults to None
:param str, optional radiusCallingStationId: Calling Station Id. Identifier of the calling device., defaults to None :param str, optional radiusCallingStationId: Calling Station Id. Identifier of the calling device., defaults to None
:param str, optional game: Game, defaults to None
:param bool, optional gamedigGivenPortOnly: Gamedig: Guess Port. The port used by Valve Server Query Protocol may be different from the client port. Try this if the monitor cannot connect to your server., defaults to False
:param str, optional jsonPath: Json Query, defaults to None
:param str, optional expectedValue: Expected Value, defaults to None
:param str, optional kafkaProducerBrokers: Kafka Broker list, defaults to None
:param str, optional kafkaProducerTopic: Kafka Topic Name, defaults to None
:param str, optional kafkaProducerMessage: Kafka Producer Message, defaults to None
:param bool, optional kafkaProducerSsl: Enable Kafka SSL, defaults to False
:param bool, optional kafkaProducerAllowAutoTopicCreation: Enable Kafka Producer Auto Topic Creation, defaults to False
:param dict, optional kafkaProducerSaslOptions: Kafka SASL Options
- **mechanism** (*str*, *optional*): Mechanism, defaults to "None". Available values are:
- "None"
- "plain"
- "scram-sha-256"
- "scram-sha-512"
- "aws"
- **username** (*str*, *optional*): Username, defaults to None
- **password** (*str*, *optional*): Password, defaults to None
- **authorizationIdentity** (*str*, *optional*): Authorization Identity, defaults to None
- **accessKeyId** (*str*, *optional*): AccessKey Id, defaults to None
- **secretAccessKey** (*str*, *optional*): Secret AccessKey, defaults to None
- **sessionToken** (*str*, *optional*): Session Token, defaults to None
""" """
@ -115,229 +66,158 @@ def notification_docstring(mode) -> str:
:param bool, optional isDefault: Default enabled. This notification will be enabled by default for new monitors. You can still disable the notification separately for each monitor., defaults to False :param bool, optional isDefault: Default enabled. This notification will be enabled by default for new monitors. You can still disable the notification separately for each monitor., defaults to False
:param bool, optional applyExisting: Apply on all existing monitors, defaults to False :param bool, optional applyExisting: Apply on all existing monitors, defaults to False
:param str, optional alertaApiEndpoint: Notification option for ``type`` :attr:`~.NotificationType.ALERTA`. :param str, optional alertaApiEndpoint: Notification option for ``type`` :attr:`~.NotificationType.ALERTA`
:param str, optional alertaApiKey: Notification option for ``type`` :attr:`~.NotificationType.ALERTA`. :param str, optional alertaApiKey: Notification option for ``type`` :attr:`~.NotificationType.ALERTA`
:param str, optional alertaEnvironment: Notification option for ``type`` :attr:`~.NotificationType.ALERTA`. :param str, optional alertaEnvironment: Notification option for ``type`` :attr:`~.NotificationType.ALERTA`
:param str, optional alertaAlertState: Notification option for ``type`` :attr:`~.NotificationType.ALERTA`. :param str, optional alertaAlertState: Notification option for ``type`` :attr:`~.NotificationType.ALERTA`
:param str, optional alertaRecoverState: Notification option for ``type`` :attr:`~.NotificationType.ALERTA`. :param str, optional alertaRecoverState: Notification option for ``type`` :attr:`~.NotificationType.ALERTA`
:param str, optional alertNowWebhookURL: Notification option for ``type`` :attr:`~.NotificationType.ALERTNOW`. :param str, optional phonenumber: Notification option for ``type`` :attr:`~.NotificationType.ALIYUNSMS`
:param str, optional phonenumber: Notification option for ``type`` :attr:`~.NotificationType.ALIYUNSMS`. :param str, optional templateCode: Notification option for ``type`` :attr:`~.NotificationType.ALIYUNSMS`
:param str, optional templateCode: Notification option for ``type`` :attr:`~.NotificationType.ALIYUNSMS`. :param str, optional signName: Notification option for ``type`` :attr:`~.NotificationType.ALIYUNSMS`
:param str, optional signName: Notification option for ``type`` :attr:`~.NotificationType.ALIYUNSMS`. :param str, optional accessKeyId: Notification option for ``type`` :attr:`~.NotificationType.ALIYUNSMS`
:param str, optional accessKeyId: Notification option for ``type`` :attr:`~.NotificationType.ALIYUNSMS`. :param str, optional secretAccessKey: Notification option for ``type`` :attr:`~.NotificationType.ALIYUNSMS`
:param str, optional secretAccessKey: Notification option for ``type`` :attr:`~.NotificationType.ALIYUNSMS`. :param str, optional appriseURL: Notification option for ``type`` :attr:`~.NotificationType.APPRISE`
:param str, optional appriseURL: Notification option for ``type`` :attr:`~.NotificationType.APPRISE`. :param str, optional title: Notification option for ``type`` :attr:`~.NotificationType.APPRISE`
:param str title: Notification option for ``type`` :attr:`~.NotificationType.APPRISE`. :param str, optional clicksendsmsLogin: Notification option for ``type`` :attr:`~.NotificationType.CLICKSENDSMS`
:param str, optional barkEndpoint: Notification option for ``type`` :attr:`~.NotificationType.BARK`. :param str, optional clicksendsmsPassword: Notification option for ``type`` :attr:`~.NotificationType.CLICKSENDSMS`
:param str, optional barkGroup: Notification option for ``type`` :attr:`~.NotificationType.BARK`. :param str, optional clicksendsmsToNumber: Notification option for ``type`` :attr:`~.NotificationType.CLICKSENDSMS`
:param str, optional barkSound: Notification option for ``type`` :attr:`~.NotificationType.BARK`. :param str, optional clicksendsmsSenderName: Notification option for ``type`` :attr:`~.NotificationType.CLICKSENDSMS`
:param str, optional clicksendsmsLogin: Notification option for ``type`` :attr:`~.NotificationType.CLICKSENDSMS`. :param str, optional webHookUrl: Notification option for ``type`` :attr:`~.NotificationType.DINGDING`
:param str, optional clicksendsmsPassword: Notification option for ``type`` :attr:`~.NotificationType.CLICKSENDSMS`. :param str, optional secretKey: Notification option for ``type`` :attr:`~.NotificationType.DINGDING`
:param str, optional clicksendsmsToNumber: Notification option for ``type`` :attr:`~.NotificationType.CLICKSENDSMS`. :param str, optional discordUsername: Notification option for ``type`` :attr:`~.NotificationType.DISCORD`
:param str clicksendsmsSenderName: Notification option for ``type`` :attr:`~.NotificationType.CLICKSENDSMS`. :param str, optional discordWebhookUrl: Notification option for ``type`` :attr:`~.NotificationType.DISCORD`
:param str, optional webHookUrl: Notification option for ``type`` :attr:`~.NotificationType.DINGDING`. :param str, optional discordPrefixMessage: Notification option for ``type`` :attr:`~.NotificationType.DISCORD`
:param str, optional secretKey: Notification option for ``type`` :attr:`~.NotificationType.DINGDING`. :param str, optional feishuWebHookUrl: Notification option for ``type`` :attr:`~.NotificationType.FEISHU`
:param str discordUsername: Notification option for ``type`` :attr:`~.NotificationType.DISCORD`. :param str, optional googleChatWebhookURL: Notification option for ``type`` :attr:`~.NotificationType.GOOGLECHAT`
:param str, optional discordWebhookUrl: Notification option for ``type`` :attr:`~.NotificationType.DISCORD`. :param str, optional gorushDeviceToken: Notification option for ``type`` :attr:`~.NotificationType.GORUSH`
:param str discordPrefixMessage: Notification option for ``type`` :attr:`~.NotificationType.DISCORD`. :param str, optional gorushPlatform: Notification option for ``type`` :attr:`~.NotificationType.GORUSH`
:param str, optional feishuWebHookUrl: Notification option for ``type`` :attr:`~.NotificationType.FEISHU`. :param str, optional gorushTitle: Notification option for ``type`` :attr:`~.NotificationType.GORUSH`
:param str, optional flashdutySeverity: Notification option for ``type`` :attr:`~.NotificationType.FLASHDUTY`. :param str, optional gorushPriority: Notification option for ``type`` :attr:`~.NotificationType.GORUSH`
:param str flashdutyIntegrationKey: Notification option for ``type`` :attr:`~.NotificationType.FLASHDUTY`. :param str, optional gorushRetry: Notification option for ``type`` :attr:`~.NotificationType.GORUSH`
:param str, optional freemobileUser: Notification option for ``type`` :attr:`~.NotificationType.FREEMOBILE`. :param str, optional gorushTopic: Notification option for ``type`` :attr:`~.NotificationType.GORUSH`
:param str, optional freemobilePass: Notification option for ``type`` :attr:`~.NotificationType.FREEMOBILE`. :param str, optional gorushServerURL: Notification option for ``type`` :attr:`~.NotificationType.GORUSH`
:param str, optional goAlertBaseURL: Notification option for ``type`` :attr:`~.NotificationType.GOALERT`. :param str, optional gotifyserverurl: Notification option for ``type`` :attr:`~.NotificationType.GOTIFY`
:param str, optional goAlertToken: Notification option for ``type`` :attr:`~.NotificationType.GOALERT`. :param str, optional gotifyapplicationToken: Notification option for ``type`` :attr:`~.NotificationType.GOTIFY`
:param str, optional googleChatWebhookURL: Notification option for ``type`` :attr:`~.NotificationType.GOOGLECHAT`. :param int, optional gotifyPriority: Notification option for ``type`` :attr:`~.NotificationType.GOTIFY`
:param str, optional gorushDeviceToken: Notification option for ``type`` :attr:`~.NotificationType.GORUSH`. :param str, optional lineChannelAccessToken: Notification option for ``type`` :attr:`~.NotificationType.LINE`
:param str gorushPlatform: Notification option for ``type`` :attr:`~.NotificationType.GORUSH`. :param str, optional lineUserID: Notification option for ``type`` :attr:`~.NotificationType.LINE`
:param str gorushTitle: Notification option for ``type`` :attr:`~.NotificationType.GORUSH`. :param str, optional lunaseaDevice: Notification option for ``type`` :attr:`~.NotificationType.LUNASEA`
:param str gorushPriority: Notification option for ``type`` :attr:`~.NotificationType.GORUSH`. :param str, optional internalRoomId: Notification option for ``type`` :attr:`~.NotificationType.MATRIX`
:param int gorushRetry: Notification option for ``type`` :attr:`~.NotificationType.GORUSH`. :param str, optional accessToken: Notification option for ``type`` :attr:`~.NotificationType.MATRIX`
:param str gorushTopic: Notification option for ``type`` :attr:`~.NotificationType.GORUSH`. :param str, optional homeserverUrl: Notification option for ``type`` :attr:`~.NotificationType.MATRIX`
:param str, optional gorushServerURL: Notification option for ``type`` :attr:`~.NotificationType.GORUSH`. :param str, optional mattermostusername: Notification option for ``type`` :attr:`~.NotificationType.MATTERMOST`
:param str, optional gotifyserverurl: Notification option for ``type`` :attr:`~.NotificationType.GOTIFY`. :param str, optional mattermostWebhookUrl: Notification option for ``type`` :attr:`~.NotificationType.MATTERMOST`
:param str, optional gotifyapplicationToken: Notification option for ``type`` :attr:`~.NotificationType.GOTIFY`. :param str, optional mattermostchannel: Notification option for ``type`` :attr:`~.NotificationType.MATTERMOST`
:param int, optional gotifyPriority: Notification option for ``type`` :attr:`~.NotificationType.GOTIFY`. :param str, optional mattermosticonemo: Notification option for ``type`` :attr:`~.NotificationType.MATTERMOST`
:param str notificationService: Notification option for ``type`` :attr:`~.NotificationType.HOMEASSISTANT`. :param str, optional mattermosticonurl: Notification option for ``type`` :attr:`~.NotificationType.MATTERMOST`
:param str, optional homeAssistantUrl: Notification option for ``type`` :attr:`~.NotificationType.HOMEASSISTANT`. :param str, optional httpAddr: Notification option for ``type`` :attr:`~.NotificationType.ONEBOT`
:param str, optional longLivedAccessToken: Notification option for ``type`` :attr:`~.NotificationType.HOMEASSISTANT`. :param str, optional accessToken: Notification option for ``type`` :attr:`~.NotificationType.ONEBOT`
:param str, optional kookGuildID: Notification option for ``type`` :attr:`~.NotificationType.KOOK`. :param str, optional msgType: Notification option for ``type`` :attr:`~.NotificationType.ONEBOT`
:param str, optional kookBotToken: Notification option for ``type`` :attr:`~.NotificationType.KOOK`. :param str, optional recieverId: Notification option for ``type`` :attr:`~.NotificationType.ONEBOT`
:param str, optional lineChannelAccessToken: Notification option for ``type`` :attr:`~.NotificationType.LINE`. :param str, optional pagerdutyAutoResolve: Notification option for ``type`` :attr:`~.NotificationType.PAGERDUTY`
:param str, optional lineUserID: Notification option for ``type`` :attr:`~.NotificationType.LINE`. :param str, optional pagerdutyIntegrationUrl: Notification option for ``type`` :attr:`~.NotificationType.PAGERDUTY`
:param str, optional lineNotifyAccessToken: Notification option for ``type`` :attr:`~.NotificationType.LINENOTIFY`. :param str, optional pagerdutyPriority: Notification option for ``type`` :attr:`~.NotificationType.PAGERDUTY`
:param str, optional lunaseaTarget: Notification option for ``type`` :attr:`~.NotificationType.LUNASEA`. Allowed values: "device", "user". :param str, optional pagerdutyIntegrationKey: Notification option for ``type`` :attr:`~.NotificationType.PAGERDUTY`
:param str lunaseaUserID: Notification option for ``type`` :attr:`~.NotificationType.LUNASEA`. User ID. :param str, optional promosmsLogin: Notification option for ``type`` :attr:`~.NotificationType.PROMOSMS`
:param str lunaseaDevice: Notification option for ``type`` :attr:`~.NotificationType.LUNASEA`. Device ID. :param str, optional promosmsPassword: Notification option for ``type`` :attr:`~.NotificationType.PROMOSMS`
:param str, optional internalRoomId: Notification option for ``type`` :attr:`~.NotificationType.MATRIX`. :param str, optional promosmsPhoneNumber: Notification option for ``type`` :attr:`~.NotificationType.PROMOSMS`
:param str, optional accessToken: Notification option for ``type`` :attr:`~.NotificationType.MATRIX`. :param str, optional promosmsSMSType: Notification option for ``type`` :attr:`~.NotificationType.PROMOSMS`
:param str, optional homeserverUrl: Notification option for ``type`` :attr:`~.NotificationType.MATRIX`. :param str, optional promosmsSenderName: Notification option for ``type`` :attr:`~.NotificationType.PROMOSMS`
:param str mattermostusername: Notification option for ``type`` :attr:`~.NotificationType.MATTERMOST`. :param str, optional pushbulletAccessToken: Notification option for ``type`` :attr:`~.NotificationType.PUSHBULLET`
:param str, optional mattermostWebhookUrl: Notification option for ``type`` :attr:`~.NotificationType.MATTERMOST`. :param str, optional pushdeerKey: Notification option for ``type`` :attr:`~.NotificationType.PUSHDEER`
:param str mattermostchannel: Notification option for ``type`` :attr:`~.NotificationType.MATTERMOST`. :param str, optional pushoveruserkey: Notification option for ``type`` :attr:`~.NotificationType.PUSHOVER`
:param str mattermosticonemo: Notification option for ``type`` :attr:`~.NotificationType.MATTERMOST`. :param str, optional pushoverapptoken: Notification option for ``type`` :attr:`~.NotificationType.PUSHOVER`
:param str mattermosticonurl: Notification option for ``type`` :attr:`~.NotificationType.MATTERMOST`. :param str, optional pushoversounds: Notification option for ``type`` :attr:`~.NotificationType.PUSHOVER`
:param str, optional sender: Notification option for ``type`` :attr:`~.NotificationType.NOSTR`. :param str, optional pushoverpriority: Notification option for ``type`` :attr:`~.NotificationType.PUSHOVER`
:param str, optional recipients: Notification option for ``type`` :attr:`~.NotificationType.NOSTR`. :param str, optional pushovertitle: Notification option for ``type`` :attr:`~.NotificationType.PUSHOVER`
:param str, optional relays: Notification option for ``type`` :attr:`~.NotificationType.NOSTR`. :param str, optional pushoverdevice: Notification option for ``type`` :attr:`~.NotificationType.PUSHOVER`
:param str ntfyAuthenticationMethod: Notification option for ``type`` :attr:`~.NotificationType.NTFY`. Authentication Method. :param str, optional pushyAPIKey: Notification option for ``type`` :attr:`~.NotificationType.PUSHY`
:param str ntfyusername: Notification option for ``type`` :attr:`~.NotificationType.NTFY`. :param str, optional pushyToken: Notification option for ``type`` :attr:`~.NotificationType.PUSHY`
:param str ntfypassword: Notification option for ``type`` :attr:`~.NotificationType.NTFY`. :param str, optional rocketchannel: Notification option for ``type`` :attr:`~.NotificationType.ROCKET_CHAT`
:param str ntfyaccesstoken: Notification option for ``type`` :attr:`~.NotificationType.NTFY`. Access Token. :param str, optional rocketusername: Notification option for ``type`` :attr:`~.NotificationType.ROCKET_CHAT`
:param str, optional ntfytopic: Notification option for ``type`` :attr:`~.NotificationType.NTFY`. :param str, optional rocketiconemo: Notification option for ``type`` :attr:`~.NotificationType.ROCKET_CHAT`
:param int, optional ntfyPriority: Notification option for ``type`` :attr:`~.NotificationType.NTFY`. :param str, optional rocketwebhookURL: Notification option for ``type`` :attr:`~.NotificationType.ROCKET_CHAT`
:param str, optional ntfyserverurl: Notification option for ``type`` :attr:`~.NotificationType.NTFY`. :param str, optional rocketbutton: Notification option for ``type`` :attr:`~.NotificationType.ROCKET_CHAT`
:param str ntfyIcon: Notification option for ``type`` :attr:`~.NotificationType.NTFY`. :param str, optional serwersmsUsername: Notification option for ``type`` :attr:`~.NotificationType.SERWERSMS`
:param str octopushVersion: Notification option for ``type`` :attr:`~.NotificationType.OCTOPUSH`. :param str, optional serwersmsPassword: Notification option for ``type`` :attr:`~.NotificationType.SERWERSMS`
:param str, optional octopushAPIKey: Notification option for ``type`` :attr:`~.NotificationType.OCTOPUSH`. :param str, optional serwersmsPhoneNumber: Notification option for ``type`` :attr:`~.NotificationType.SERWERSMS`
:param str, optional octopushLogin: Notification option for ``type`` :attr:`~.NotificationType.OCTOPUSH`. :param str, optional serwersmsSenderName: Notification option for ``type`` :attr:`~.NotificationType.SERWERSMS`
:param str, optional octopushPhoneNumber: Notification option for ``type`` :attr:`~.NotificationType.OCTOPUSH`. :param str, optional signalNumber: Notification option for ``type`` :attr:`~.NotificationType.SIGNAL`
:param str octopushSMSType: Notification option for ``type`` :attr:`~.NotificationType.OCTOPUSH`. :param str, optional signalRecipients: Notification option for ``type`` :attr:`~.NotificationType.SIGNAL`
:param str octopushSenderName: Notification option for ``type`` :attr:`~.NotificationType.OCTOPUSH`. :param str, optional signalURL: Notification option for ``type`` :attr:`~.NotificationType.SIGNAL`
:param str, optional httpAddr: Notification option for ``type`` :attr:`~.NotificationType.ONEBOT`. :param str, optional slackbutton: Notification option for ``type`` :attr:`~.NotificationType.SLACK`
:param str, optional accessToken: Notification option for ``type`` :attr:`~.NotificationType.ONEBOT`. :param str, optional slackchannel: Notification option for ``type`` :attr:`~.NotificationType.SLACK`
:param str msgType: Notification option for ``type`` :attr:`~.NotificationType.ONEBOT`. :param str, optional slackusername: Notification option for ``type`` :attr:`~.NotificationType.SLACK`
:param str, optional recieverId: Notification option for ``type`` :attr:`~.NotificationType.ONEBOT`. :param str, optional slackiconemo: Notification option for ``type`` :attr:`~.NotificationType.SLACK`
:param int opsgeniePriority: Notification option for ``type`` :attr:`~.NotificationType.OPSGENIE`. Priority. Available values are numbers between ``1`` and ``5``. :param str, optional slackwebhookURL: Notification option for ``type`` :attr:`~.NotificationType.SLACK`
:param str, optional opsgenieRegion: Notification option for ``type`` :attr:`~.NotificationType.OPSGENIE`. Region. Available values are: :param str, optional smtpHost: Notification option for ``type`` :attr:`~.NotificationType.SMTP`
:param int, optional smtpPort: Notification option for ``type`` :attr:`~.NotificationType.SMTP`
- ``us``: US (Default) :param str, optional smtpSecure: Notification option for ``type`` :attr:`~.NotificationType.SMTP`
- ``eu``: EU :param str, optional smtpIgnoreTLSError: Notification option for ``type`` :attr:`~.NotificationType.SMTP`
:param str, optional opsgenieApiKey: Notification option for ``type`` :attr:`~.NotificationType.OPSGENIE`. API Key. :param str, optional smtpDkimDomain: Notification option for ``type`` :attr:`~.NotificationType.SMTP`
:param str pagerdutyAutoResolve: Notification option for ``type`` :attr:`~.NotificationType.PAGERDUTY`. :param str, optional smtpDkimKeySelector: Notification option for ``type`` :attr:`~.NotificationType.SMTP`
:param str pagerdutyIntegrationUrl: Notification option for ``type`` :attr:`~.NotificationType.PAGERDUTY`. :param str, optional smtpDkimPrivateKey: Notification option for ``type`` :attr:`~.NotificationType.SMTP`
:param str pagerdutyPriority: Notification option for ``type`` :attr:`~.NotificationType.PAGERDUTY`. :param str, optional smtpDkimHashAlgo: Notification option for ``type`` :attr:`~.NotificationType.SMTP`
:param str, optional pagerdutyIntegrationKey: Notification option for ``type`` :attr:`~.NotificationType.PAGERDUTY`. :param str, optional smtpDkimheaderFieldNames: Notification option for ``type`` :attr:`~.NotificationType.SMTP`
:param str pagertreeAutoResolve: Notification option for ``type`` :attr:`~.NotificationType.PAGERTREE`. :param str, optional smtpDkimskipFields: Notification option for ``type`` :attr:`~.NotificationType.SMTP`
:param str, optional smtpUsername: Notification option for ``type`` :attr:`~.NotificationType.SMTP`
Available values are: :param str, optional smtpPassword: Notification option for ``type`` :attr:`~.NotificationType.SMTP`
:param str, optional customSubject: Notification option for ``type`` :attr:`~.NotificationType.SMTP`
- ``0``: Do Nothing :param str, optional smtpFrom: Notification option for ``type`` :attr:`~.NotificationType.SMTP`
- ``resolve``: Auto Resolve :param str, optional smtpCC: Notification option for ``type`` :attr:`~.NotificationType.SMTP`
:param str pagertreeIntegrationUrl: Notification option for ``type`` :attr:`~.NotificationType.PAGERTREE`. :param str, optional smtpBCC: Notification option for ``type`` :attr:`~.NotificationType.SMTP`
:param str pagertreeUrgency: Notification option for ``type`` :attr:`~.NotificationType.PAGERTREE`. :param str, optional smtpTo: Notification option for ``type`` :attr:`~.NotificationType.SMTP`
:param str, optional stackfieldwebhookURL: Notification option for ``type`` :attr:`~.NotificationType.STACKFIELD`
Available values are: :param str, optional pushAPIKey: Notification option for ``type`` :attr:`~.NotificationType.PUSHBYTECHULUS`
:param str, optional telegramBotToken: Notification option for ``type`` :attr:`~.NotificationType.TELEGRAM`
- ``silent``: Silent :param str, optional telegramChatID: Notification option for ``type`` :attr:`~.NotificationType.TELEGRAM`
- ``low``: Low :param str, optional webhookContentType: Notification option for ``type`` :attr:`~.NotificationType.WEBHOOK`
- ``medium``: Medium :param str, optional webhookAdditionalHeaders: Notification option for ``type`` :attr:`~.NotificationType.WEBHOOK`
- ``high``: High :param str, optional webhookURL: Notification option for ``type`` :attr:`~.NotificationType.WEBHOOK`
- ``critical``: Critical :param str, optional weComBotKey: Notification option for ``type`` :attr:`~.NotificationType.WECOM`
:param bool promosmsAllowLongSMS: Notification option for ``type`` :attr:`~.NotificationType.PROMOSMS`. Allow long SMS. :param str, optional alertNowWebhookURL: Notification option for ``type`` :attr:`~.NotificationType.ALERTNOW`
:param str, optional promosmsLogin: Notification option for ``type`` :attr:`~.NotificationType.PROMOSMS`. :param str, optional homeAssistantUrl: Notification option for ``type`` :attr:`~.NotificationType.HOMEASSISTANT`
:param str, optional promosmsPassword: Notification option for ``type`` :attr:`~.NotificationType.PROMOSMS`. :param str, optional longLivedAccessToken: Notification option for ``type`` :attr:`~.NotificationType.HOMEASSISTANT`
:param str, optional promosmsPhoneNumber: Notification option for ``type`` :attr:`~.NotificationType.PROMOSMS`. Phone number (for Polish recipient You can skip area codes). :param str, optional lineNotifyAccessToken: Notification option for ``type`` :attr:`~.NotificationType.LINENOTIFY`
:param str promosmsSMSType: Notification option for ``type`` :attr:`~.NotificationType.PROMOSMS`. :param str, optional barkEndpoint: Notification option for ``type`` :attr:`~.NotificationType.BARK`
:param str, optional barkGroup: Notification option for ``type`` :attr:`~.NotificationType.BARK`
Available values are: :param str, optional barkSound: Notification option for ``type`` :attr:`~.NotificationType.BARK`
:param str, optional goAlertBaseURL: Notification option for ``type`` :attr:`~.NotificationType.GOALERT`
- ``0``: SMS FLASH - Message will automatically show on recipient device. Limited only to Polish recipients. :param str, optional goAlertToken: Notification option for ``type`` :attr:`~.NotificationType.GOALERT`
- ``1``: SMS ECO - cheap but slow and often overloaded. Limited only to Polish recipients. :param str, optional octopushVersion: Notification option for ``type`` :attr:`~.NotificationType.OCTOPUSH`
- ``3``: SMS FULL - Premium tier of SMS, You can use your Sender Name (You need to register name first). Reliable for alerts. :param str, optional octopushAPIKey: Notification option for ``type`` :attr:`~.NotificationType.OCTOPUSH`
- ``4``: SMS SPEED - Highest priority in system. Very quick and reliable but costly (about twice of SMS FULL price). :param str, optional octopushLogin: Notification option for ``type`` :attr:`~.NotificationType.OCTOPUSH`
:param str promosmsSenderName: Notification option for ``type`` :attr:`~.NotificationType.PROMOSMS`. :param str, optional octopushPhoneNumber: Notification option for ``type`` :attr:`~.NotificationType.OCTOPUSH`
:param str, optional pushbulletAccessToken: Notification option for ``type`` :attr:`~.NotificationType.PUSHBULLET`. :param str, optional octopushSMSType: Notification option for ``type`` :attr:`~.NotificationType.OCTOPUSH`
:param str pushdeerServer: Notification option for ``type`` :attr:`~.NotificationType.PUSHDEER`. :param str, optional octopushSenderName: Notification option for ``type`` :attr:`~.NotificationType.OCTOPUSH`
:param str, optional pushdeerKey: Notification option for ``type`` :attr:`~.NotificationType.PUSHDEER`. :param str, optional octopushDMLogin: Notification option for ``type`` :attr:`~.NotificationType.OCTOPUSH`
:param str, optional pushoveruserkey: Notification option for ``type`` :attr:`~.NotificationType.PUSHOVER`. :param str, optional octopushDMAPIKey: Notification option for ``type`` :attr:`~.NotificationType.OCTOPUSH`
:param str, optional pushoverapptoken: Notification option for ``type`` :attr:`~.NotificationType.PUSHOVER`. :param str, optional octopushDMPhoneNumber: Notification option for ``type`` :attr:`~.NotificationType.OCTOPUSH`
:param str pushoversounds: Notification option for ``type`` :attr:`~.NotificationType.PUSHOVER`. :param str, optional octopushDMSenderName: Notification option for ``type`` :attr:`~.NotificationType.OCTOPUSH`
:param str pushoverpriority: Notification option for ``type`` :attr:`~.NotificationType.PUSHOVER`. :param str, optional octopushDMSMSType: Notification option for ``type`` :attr:`~.NotificationType.OCTOPUSH`
:param str pushovertitle: Notification option for ``type`` :attr:`~.NotificationType.PUSHOVER`. :param str, optional serverChanSendKey: Notification option for ``type`` :attr:`~.NotificationType.SERVERCHAN`
:param str pushoverdevice: Notification option for ``type`` :attr:`~.NotificationType.PUSHOVER`. :param str, optional smsmanagerApiKey: Notification option for ``type`` :attr:`~.NotificationType.SMSMANAGER`
:param int pushoverttl: Notification option for ``type`` :attr:`~.NotificationType.PUSHOVER`. Message TTL (Seconds). :param str, optional numbers: Notification option for ``type`` :attr:`~.NotificationType.SMSMANAGER`
:param str, optional pushyAPIKey: Notification option for ``type`` :attr:`~.NotificationType.PUSHY`. :param str, optional messageType: Notification option for ``type`` :attr:`~.NotificationType.SMSMANAGER`
:param str, optional pushyToken: Notification option for ``type`` :attr:`~.NotificationType.PUSHY`. :param str, optional squadcastWebhookURL: Notification option for ``type`` :attr:`~.NotificationType.SQUADCAST`
:param str rocketchannel: Notification option for ``type`` :attr:`~.NotificationType.ROCKET_CHAT`. :param str, optional webhookUrl: Notification option for ``type`` :attr:`~.NotificationType.TEAMS`
:param str rocketusername: Notification option for ``type`` :attr:`~.NotificationType.ROCKET_CHAT`. :param str, optional freemobileUser: Notification option for ``type`` :attr:`~.NotificationType.FREEMOBILE`
:param str rocketiconemo: Notification option for ``type`` :attr:`~.NotificationType.ROCKET_CHAT`. :param str, optional freemobilePass: Notification option for ``type`` :attr:`~.NotificationType.FREEMOBILE`
:param str, optional rocketwebhookURL: Notification option for ``type`` :attr:`~.NotificationType.ROCKET_CHAT`. :param str, optional ntfyusername: Notification option for ``type`` :attr:`~.NotificationType.NTFY`
:param str, optional serverChanSendKey: Notification option for ``type`` :attr:`~.NotificationType.SERVERCHAN`. :param str, optional ntfypassword: Notification option for ``type`` :attr:`~.NotificationType.NTFY`
:param str, optional serwersmsUsername: Notification option for ``type`` :attr:`~.NotificationType.SERWERSMS`. :param str, optional ntfytopic: Notification option for ``type`` :attr:`~.NotificationType.NTFY`
:param str, optional serwersmsPassword: Notification option for ``type`` :attr:`~.NotificationType.SERWERSMS`. :param int, optional ntfyPriority: Notification option for ``type`` :attr:`~.NotificationType.NTFY`
:param str, optional serwersmsPhoneNumber: Notification option for ``type`` :attr:`~.NotificationType.SERWERSMS`. :param str, optional ntfyIcon: Notification option for ``type`` :attr:`~.NotificationType.NTFY`
:param str serwersmsSenderName: Notification option for ``type`` :attr:`~.NotificationType.SERWERSMS`. :param str, optional ntfyserverurl: Notification option for ``type`` :attr:`~.NotificationType.NTFY`
:param str, optional signalNumber: Notification option for ``type`` :attr:`~.NotificationType.SIGNAL`. :param bool, optional smseagleEncoding: Notification option for ``type`` :attr:`~.NotificationType.SMSEAGLE`. True to send messages in unicode.
:param str, optional signalRecipients: Notification option for ``type`` :attr:`~.NotificationType.SIGNAL`. :param int, optional smseaglePriority: Notification option for ``type`` :attr:`~.NotificationType.SMSEAGLE`. Message priority (0-9, default = 0).
:param str, optional signalURL: Notification option for ``type`` :attr:`~.NotificationType.SIGNAL`. :param str, optional smseagleRecipientType: Notification option for ``type`` :attr:`~.NotificationType.SMSEAGLE`. Recipient type. Available values are "smseagle-to" (Phone number(s)), "smseagle-group" (Phonebook group name(s)) and "smseagle-contact" (Phonebook contact name(s)).
:param bool slackchannelnotify: Notification option for ``type`` :attr:`~.NotificationType.SLACK`.
:param str slackchannel: Notification option for ``type`` :attr:`~.NotificationType.SLACK`.
:param str slackusername: Notification option for ``type`` :attr:`~.NotificationType.SLACK`.
:param str slackiconemo: Notification option for ``type`` :attr:`~.NotificationType.SLACK`.
:param str, optional slackwebhookURL: Notification option for ``type`` :attr:`~.NotificationType.SLACK`.
:param str smscTranslit: Notification option for ``type`` :attr:`~.NotificationType.SMSC`.
:param str, optional smscLogin: Notification option for ``type`` :attr:`~.NotificationType.SMSC`.
:param str, optional smscPassword: Notification option for ``type`` :attr:`~.NotificationType.SMSC`.
:param str, optional smscToNumber: Notification option for ``type`` :attr:`~.NotificationType.SMSC`.
:param str smscSenderName: Notification option for ``type`` :attr:`~.NotificationType.SMSC`.
:param bool smseagleEncoding: Notification option for ``type`` :attr:`~.NotificationType.SMSEAGLE`. True to send messages in unicode.
:param int smseaglePriority: Notification option for ``type`` :attr:`~.NotificationType.SMSEAGLE`. Message priority (0-9, default = 0).
:param str smseagleRecipientType: Notification option for ``type`` :attr:`~.NotificationType.SMSEAGLE`. Recipient type.
Available values are:
- ``smseagle-to``: Phone number(s)
- ``smseagle-group``: Phonebook group name(s)
- ``smseagle-contact``: Phonebook contact name(s)
:param str, optional smseagleToken: Notification option for ``type`` :attr:`~.NotificationType.SMSEAGLE`. API Access token. :param str, optional smseagleToken: Notification option for ``type`` :attr:`~.NotificationType.SMSEAGLE`. API Access token.
:param str, optional smseagleRecipient: Notification option for ``type`` :attr:`~.NotificationType.SMSEAGLE`. Recipient(s) (multiple must be separated with comma). :param str, optional smseagleRecipient: Notification option for ``type`` :attr:`~.NotificationType.SMSEAGLE`. Recipient(s) (multiple must be separated with comma).
:param str, optional smseagleUrl: Notification option for ``type`` :attr:`~.NotificationType.SMSEAGLE`. Your SMSEagle device URL. :param str, optional smseagleUrl: Notification option for ``type`` :attr:`~.NotificationType.SMSEAGLE`. Your SMSEagle device URL.
:param str smsmanagerApiKey: Notification option for ``type`` :attr:`~.NotificationType.SMSMANAGER`. :param str, optional webhookUrl: Notification option for ``type`` :attr:`~.NotificationType.ZOHOCLIQ`
:param str numbers: Notification option for ``type`` :attr:`~.NotificationType.SMSMANAGER`. :param str, optional kookGuildID: Notification option for ``type`` :attr:`~.NotificationType.KOOK`
:param str messageType: Notification option for ``type`` :attr:`~.NotificationType.SMSMANAGER`. :param str, optional kookBotToken: Notification option for ``type`` :attr:`~.NotificationType.KOOK`
:param str, optional smtpHost: Notification option for ``type`` :attr:`~.NotificationType.SMTP`.
:param int, optional smtpPort: Notification option for ``type`` :attr:`~.NotificationType.SMTP`.
:param str smtpSecure: Notification option for ``type`` :attr:`~.NotificationType.SMTP`.
:param bool smtpIgnoreTLSError: Notification option for ``type`` :attr:`~.NotificationType.SMTP`.
:param str smtpDkimDomain: Notification option for ``type`` :attr:`~.NotificationType.SMTP`.
:param str smtpDkimKeySelector: Notification option for ``type`` :attr:`~.NotificationType.SMTP`.
:param str smtpDkimPrivateKey: Notification option for ``type`` :attr:`~.NotificationType.SMTP`.
:param str smtpDkimHashAlgo: Notification option for ``type`` :attr:`~.NotificationType.SMTP`.
:param str smtpDkimheaderFieldNames: Notification option for ``type`` :attr:`~.NotificationType.SMTP`.
:param str smtpDkimskipFields: Notification option for ``type`` :attr:`~.NotificationType.SMTP`.
:param str smtpUsername: Notification option for ``type`` :attr:`~.NotificationType.SMTP`.
:param str smtpPassword: Notification option for ``type`` :attr:`~.NotificationType.SMTP`.
:param str customSubject: Notification option for ``type`` :attr:`~.NotificationType.SMTP`.
:param str, optional smtpFrom: Notification option for ``type`` :attr:`~.NotificationType.SMTP`.
:param str smtpCC: Notification option for ``type`` :attr:`~.NotificationType.SMTP`.
:param str smtpBCC: Notification option for ``type`` :attr:`~.NotificationType.SMTP`.
:param str smtpTo: Notification option for ``type`` :attr:`~.NotificationType.SMTP`.
:param str splunkAutoResolve: Notification option for ``type`` :attr:`~.NotificationType.SPLUNK`. Auto resolve or acknowledged.
Available values are:
- ``0``: do nothing
- ``ACKNOWLEDGEMENT``: auto acknowledged
- ``RECOVERY``: auto resolve
:param str splunkSeverity: Notification option for ``type`` :attr:`~.NotificationType.SPLUNK`. Severity.
Available values are:
- ``INFO``
- ``WARNING``
- ``CRITICAL``
:param str, optional splunkRestURL: Notification option for ``type`` :attr:`~.NotificationType.SPLUNK`. Splunk Rest URL.
:param str, optional squadcastWebhookURL: Notification option for ``type`` :attr:`~.NotificationType.SQUADCAST`.
:param str, optional stackfieldwebhookURL: Notification option for ``type`` :attr:`~.NotificationType.STACKFIELD`.
:param str, optional webhookUrl: Notification option for ``type`` :attr:`~.NotificationType.TEAMS`.
:param str, optional pushAPIKey: Notification option for ``type`` :attr:`~.NotificationType.PUSHBYTECHULUS`.
:param str, optional telegramChatID: Notification option for ``type`` :attr:`~.NotificationType.TELEGRAM`.
:param bool telegramSendSilently: Notification option for ``type`` :attr:`~.NotificationType.TELEGRAM`.
:param bool telegramProtectContent: Notification option for ``type`` :attr:`~.NotificationType.TELEGRAM`.
:param str telegramMessageThreadID: Notification option for ``type`` :attr:`~.NotificationType.TELEGRAM`.
:param str, optional telegramBotToken: Notification option for ``type`` :attr:`~.NotificationType.TELEGRAM`.
:param str, optional twilioAccountSID: Notification option for ``type`` :attr:`~.NotificationType.TWILIO`. Account SID.
:param str twilioApiKey: Notification option for ``type`` :attr:`~.NotificationType.TWILIO`.
:param str, optional twilioAuthToken: Notification option for ``type`` :attr:`~.NotificationType.TWILIO`. Auth Token.
:param str, optional twilioToNumber: Notification option for ``type`` :attr:`~.NotificationType.TWILIO`. To Number.
:param str, optional twilioFromNumber: Notification option for ``type`` :attr:`~.NotificationType.TWILIO`. From Number.
:param str, optional webhookContentType: Notification option for ``type`` :attr:`~.NotificationType.WEBHOOK`.
:param str webhookCustomBody: Notification option for ``type`` :attr:`~.NotificationType.WEBHOOK`.
:param str webhookAdditionalHeaders: Notification option for ``type`` :attr:`~.NotificationType.WEBHOOK`.
:param str, optional webhookURL: Notification option for ``type`` :attr:`~.NotificationType.WEBHOOK`.
:param str, optional weComBotKey: Notification option for ``type`` :attr:`~.NotificationType.WECOM`.
:param str, optional webhookUrl: Notification option for ``type`` :attr:`~.NotificationType.ZOHOCLIQ`.
""" """
@ -362,7 +242,6 @@ def docker_host_docstring(mode) -> str:
:param str, optional dockerDaemon: Docker Daemon, defaults to None :param str, optional dockerDaemon: Docker Daemon, defaults to None
""" """
def maintenance_docstring(mode) -> str: def maintenance_docstring(mode) -> str:
return f""" return f"""
:param str{", optional" if mode == "edit" else ""} title: Title :param str{", optional" if mode == "edit" else ""} title: Title
@ -372,16 +251,6 @@ def maintenance_docstring(mode) -> str:
:param list, optional dateRange: DateTime Range, defaults to ``["<current date>"]`` :param list, optional dateRange: DateTime Range, defaults to ``["<current date>"]``
:param int, optional intervalDay: Interval (Run once every day), defaults to ``1`` :param int, optional intervalDay: Interval (Run once every day), defaults to ``1``
:param list, optional weekdays: List that contains the days of the week on which the maintenance is enabled (Sun = ``0``, Mon = ``1``, ..., Sat = ``6``). Required for ``strategy`` :attr:`~.MaintenanceStrategy.RECURRING_WEEKDAY`., defaults to ``[]``. :param list, optional weekdays: List that contains the days of the week on which the maintenance is enabled (Sun = ``0``, Mon = ``1``, ..., Sat = ``6``). Required for ``strategy`` :attr:`~.MaintenanceStrategy.RECURRING_WEEKDAY`., defaults to ``[]``.
:param list, optional daysOfMonth: List that contains the days of the month on which the maintenance is enabled (Day 1 = ``1``, Day 2 = ``2``, ..., Day 31 = ``31``) and the last day of the month (``"lastDay1"``). Required for ``strategy`` :attr:`~.MaintenanceStrategy.RECURRING_DAY_OF_MONTH`., defaults to ``[]``. :param list, optional daysOfMonth: List that contains the days of the month on which the maintenance is enabled (Day 1 = ``1``, Day 2 = ``2``, ..., Day 31 = ``31``) and the last day of the month (Last Day of Month = ``"lastDay1"``, 2nd Last Day of Month = ``"lastDay2"``, 3rd Last Day of Month = ``"lastDay3"``, 4th Last Day of Month = ``"lastDay4"``). Required for ``strategy`` :attr:`~.MaintenanceStrategy.RECURRING_DAY_OF_MONTH`., defaults to ``[]``.
:param list, optional timeRange: Maintenance Time Window of a Day, defaults to ``[{{"hours": 2, "minutes": 0}}, {{"hours": 3, "minutes": 0}}]``. :param list, optional timeRange: Maintenance Time Window of a Day, defaults to ``[{{"hours": 2, "minutes": 0}}, {{"hours": 3, "minutes": 0}}]``.
:param str, optional cron: Cron Schedule. Required for ``strategy`` :attr:`~.MaintenanceStrategy.CRON`., defaults to ``"30 3 * * *"``
:param int, optional durationMinutes: Duration (Minutes). Required for ``strategy`` :attr:`~.MaintenanceStrategy.CRON`., defaults to ``60``
:param str, optional timezone: Timezone, defaults to ``None`` (Server Timezone)
"""
def tag_docstring(mode) -> str:
return f"""
:param str{", optional" if mode == "edit" else ""} name: Tag name
:param str{", optional" if mode == "edit" else ""} color: Tag color
""" """

View file

@ -19,4 +19,3 @@ class Event(str, Enum):
AUTO_LOGIN = "autoLogin" AUTO_LOGIN = "autoLogin"
INIT_SERVER_TIMEZONE = "initServerTimezone" INIT_SERVER_TIMEZONE = "initServerTimezone"
MAINTENANCE_LIST = "maintenanceList" MAINTENANCE_LIST = "maintenanceList"
API_KEY_LIST = "apiKeyList"

View file

@ -2,9 +2,4 @@ class UptimeKumaException(Exception):
""" """
There was an exception that occurred while communicating with Uptime Kuma. There was an exception that occurred while communicating with Uptime Kuma.
""" """
pass
class Timeout(UptimeKumaException):
"""
A timeout has occurred while communicating with Uptime Kuma.
"""

View file

@ -18,6 +18,3 @@ class MaintenanceStrategy(str, Enum):
RECURRING_DAY_OF_MONTH = "recurring-day-of-month" RECURRING_DAY_OF_MONTH = "recurring-day-of-month"
"""Recurring - Day of Month""" """Recurring - Day of Month"""
CRON = "cron"
"""Cron Expression"""

View file

@ -1,17 +0,0 @@
from enum import Enum
class MonitorStatus(int, Enum):
"""Enumerate monitor statuses."""
DOWN = 0
"""DOWN"""
UP = 1
"""UP"""
PENDING = 2
"""PENDING"""
MAINTENANCE = 3
"""MAINTENANCE"""

View file

@ -4,9 +4,6 @@ from enum import Enum
class MonitorType(str, Enum): class MonitorType(str, Enum):
"""Enumerate monitor types.""" """Enumerate monitor types."""
GROUP = "group"
"""Group"""
HTTP = "http" HTTP = "http"
"""HTTP(s)""" """HTTP(s)"""
@ -19,9 +16,6 @@ class MonitorType(str, Enum):
KEYWORD = "keyword" KEYWORD = "keyword"
"""HTTP(s) - Keyword""" """HTTP(s) - Keyword"""
JSON_QUERY = "json-query"
"""HTTP(s) - Json Query"""
GRPC_KEYWORD = "grpc-keyword" GRPC_KEYWORD = "grpc-keyword"
"""gRPC(s) - Keyword""" """gRPC(s) - Keyword"""
@ -31,24 +25,15 @@ class MonitorType(str, Enum):
DOCKER = "docker" DOCKER = "docker"
"""Docker Container""" """Docker Container"""
REAL_BROWSER = "real-browser"
"""HTTP(s) - Browser Engine (Chrome/Chromium)"""
PUSH = "push" PUSH = "push"
"""Push""" """Push"""
STEAM = "steam" STEAM = "steam"
"""Steam Game Server""" """Steam Game Server"""
GAMEDIG = "gamedig"
"""GameDig"""
MQTT = "mqtt" MQTT = "mqtt"
"""MQTT""" """MQTT"""
KAFKA_PRODUCER = "kafka-producer"
"""Kafka Producer"""
SQLSERVER = "sqlserver" SQLSERVER = "sqlserver"
"""Microsoft SQL Server""" """Microsoft SQL Server"""
@ -58,14 +43,5 @@ class MonitorType(str, Enum):
MYSQL = "mysql" MYSQL = "mysql"
"""MySQL/MariaDB""" """MySQL/MariaDB"""
MONGODB = "mongodb"
"""MongoDB"""
RADIUS = "radius" RADIUS = "radius"
"""Radius""" """Radius"""
REDIS = "redis"
"""Redis"""
TAILSCALE_PING = "tailscale-ping"
"""Tailscale Ping"""

View file

@ -7,18 +7,12 @@ class NotificationType(str, Enum):
ALERTA = "alerta" ALERTA = "alerta"
"""Alerta""" """Alerta"""
ALERTNOW = "AlertNow"
"""AlertNow"""
ALIYUNSMS = "AliyunSMS" ALIYUNSMS = "AliyunSMS"
"""AliyunSMS""" """AliyunSMS"""
APPRISE = "apprise" APPRISE = "apprise"
"""Apprise (Support 50+ Notification services)""" """Apprise (Support 50+ Notification services)"""
BARK = "Bark"
"""Bark"""
CLICKSENDSMS = "clicksendsms" CLICKSENDSMS = "clicksendsms"
"""ClickSend SMS""" """ClickSend SMS"""
@ -31,17 +25,8 @@ class NotificationType(str, Enum):
FEISHU = "Feishu" FEISHU = "Feishu"
"""Feishu""" """Feishu"""
FLASHDUTY = "FlashDuty"
"""FlashDuty"""
FREEMOBILE = "FreeMobile"
"""FreeMobile (mobile.free.fr)"""
GOALERT = "GoAlert"
"""GoAlert"""
GOOGLECHAT = "GoogleChat" GOOGLECHAT = "GoogleChat"
"""Google Chat (Google Workspace)""" """Google Chat (Google Workspace only)"""
GORUSH = "gorush" GORUSH = "gorush"
"""Gorush""" """Gorush"""
@ -49,17 +34,8 @@ class NotificationType(str, Enum):
GOTIFY = "gotify" GOTIFY = "gotify"
"""Gotify""" """Gotify"""
HOMEASSISTANT = "HomeAssistant"
"""Home Assistant"""
KOOK = "Kook"
"""Kook"""
LINE = "line" LINE = "line"
"""LINE Messenger""" """Line Messenger"""
LINENOTIFY = "LineNotify"
"""LINE Notify"""
LUNASEA = "lunasea" LUNASEA = "lunasea"
"""LunaSea""" """LunaSea"""
@ -70,27 +46,12 @@ class NotificationType(str, Enum):
MATTERMOST = "mattermost" MATTERMOST = "mattermost"
"""Mattermost""" """Mattermost"""
NOSTR = "nostr"
"""Nostr"""
NTFY = "ntfy"
"""Ntfy"""
OCTOPUSH = "octopush"
"""Octopush"""
ONEBOT = "OneBot" ONEBOT = "OneBot"
"""OneBot""" """OneBot"""
OPSGENIE = "Opsgenie"
"""Opsgenie"""
PAGERDUTY = "PagerDuty" PAGERDUTY = "PagerDuty"
"""PagerDuty""" """PagerDuty"""
PAGERTREE = "PagerTree"
"""PagerTree"""
PROMOSMS = "promosms" PROMOSMS = "promosms"
"""PromoSMS""" """PromoSMS"""
@ -109,9 +70,6 @@ class NotificationType(str, Enum):
ROCKET_CHAT = "rocket.chat" ROCKET_CHAT = "rocket.chat"
"""Rocket.Chat""" """Rocket.Chat"""
SERVERCHAN = "ServerChan"
"""ServerChan"""
SERWERSMS = "serwersms" SERWERSMS = "serwersms"
"""SerwerSMS.pl""" """SerwerSMS.pl"""
@ -121,362 +79,334 @@ class NotificationType(str, Enum):
SLACK = "slack" SLACK = "slack"
"""Slack""" """Slack"""
SMSC = "smsc"
"""SMSC"""
SMSEAGLE = "SMSEagle"
"""SMSEagle"""
SMSMANAGER = "SMSManager"
"""SmsManager (smsmanager.cz)"""
SMTP = "smtp" SMTP = "smtp"
"""Email (SMTP)""" """Email (SMTP)"""
SPLUNK = "Splunk"
"""Splunk"""
SQUADCAST = "squadcast"
"""SquadCast"""
STACKFIELD = "stackfield" STACKFIELD = "stackfield"
"""Stackfield""" """Stackfield"""
TEAMS = "teams"
"""Microsoft Teams"""
PUSHBYTECHULUS = "PushByTechulus" PUSHBYTECHULUS = "PushByTechulus"
"""Push by Techulus""" """Push by Techulus"""
TELEGRAM = "telegram" TELEGRAM = "telegram"
"""Telegram""" """Telegram"""
TWILIO = "twilio"
"""Twilio"""
WEBHOOK = "webhook" WEBHOOK = "webhook"
"""Webhook""" """Webhook"""
WECOM = "WeCom" WECOM = "WeCom"
"""WeCom""" """WeCom"""
ALERTNOW = "AlertNow"
"""AlertNow"""
HOMEASSISTANT = "HomeAssistant"
"""Home Assistant"""
LINENOTIFY = "LineNotify"
"""LineNotify"""
BARK = "Bark"
"""Bark"""
GOALERT = "GoAlert"
"""GoAlert"""
OCTOPUSH = "octopush"
"""Octopush"""
SERVERCHAN = "ServerChan"
"""ServerChan"""
SMSMANAGER = "SMSManager"
"""SMSManager"""
SQUADCAST = "squadcast"
"""Squadcast"""
TEAMS = "teams"
"""Microsoft Teams"""
FREEMOBILE = "FreeMobile"
"""FreeMobile"""
NTFY = "ntfy"
"""ntfy"""
SMSEAGLE = "SMSEagle"
"""SMSEagle"""
ZOHOCLIQ = "ZohoCliq" ZOHOCLIQ = "ZohoCliq"
"""ZohoCliq""" """ZohoCliq"""
KOOK = "Kook"
"""Kook"""
notification_provider_options = { notification_provider_options = {
NotificationType.ALERTA: dict( NotificationType.ALERTA: dict(
alertaApiEndpoint=dict(type="str", required=True), alertaApiEndpoint=dict(
alertaApiKey=dict(type="str", required=True), type="str"
alertaEnvironment=dict(type="str", required=True),
alertaAlertState=dict(type="str", required=True),
alertaRecoverState=dict(type="str", required=True),
), ),
NotificationType.ALERTNOW: dict( alertaApiKey=dict(type="str"),
alertNowWebhookURL=dict(type="str", required=True), alertaEnvironment=dict(type="str"),
alertaAlertState=dict(type="str"),
alertaRecoverState=dict(type="str"),
), ),
NotificationType.ALIYUNSMS: dict( NotificationType.ALIYUNSMS: dict(
phonenumber=dict(type="str", required=True), phonenumber=dict(type="str"),
templateCode=dict(type="str", required=True), templateCode=dict(type="str"),
signName=dict(type="str", required=True), signName=dict(type="str"),
accessKeyId=dict(type="str", required=True), accessKeyId=dict(type="str"),
secretAccessKey=dict(type="str", required=True), secretAccessKey=dict(type="str"),
), ),
NotificationType.APPRISE: dict( NotificationType.APPRISE: dict(
appriseURL=dict(type="str", required=True), appriseURL=dict(type="str"),
title=dict(type="str", required=False), title=dict(type="str"),
),
NotificationType.BARK: dict(
barkEndpoint=dict(type="str", required=True),
barkGroup=dict(type="str", required=True),
barkSound=dict(type="str", required=True),
), ),
NotificationType.CLICKSENDSMS: dict( NotificationType.CLICKSENDSMS: dict(
clicksendsmsLogin=dict(type="str", required=True), clicksendsmsLogin=dict(type="str"),
clicksendsmsPassword=dict(type="str", required=True), clicksendsmsPassword=dict(type="str"),
clicksendsmsToNumber=dict(type="str", required=True), clicksendsmsToNumber=dict(type="str"),
clicksendsmsSenderName=dict(type="str", required=False), clicksendsmsSenderName=dict(type="str"),
), ),
NotificationType.DINGDING: dict( NotificationType.DINGDING: dict(
webHookUrl=dict(type="str", required=True), webHookUrl=dict(type="str"),
secretKey=dict(type="str", required=True), secretKey=dict(type="str"),
), ),
NotificationType.DISCORD: dict( NotificationType.DISCORD: dict(
discordUsername=dict(type="str", required=False), discordUsername=dict(type="str"),
discordWebhookUrl=dict(type="str", required=True), discordWebhookUrl=dict(type="str"),
discordPrefixMessage=dict(type="str", required=False), discordPrefixMessage=dict(type="str"),
), ),
NotificationType.FEISHU: dict( NotificationType.FEISHU: dict(
feishuWebHookUrl=dict(type="str", required=True), feishuWebHookUrl=dict(type="str"),
),
NotificationType.FLASHDUTY: dict(
flashdutySeverity=dict(type="str", required=True),
flashdutyIntegrationKey=dict(type="str", required=False),
),
NotificationType.FREEMOBILE: dict(
freemobileUser=dict(type="str", required=True),
freemobilePass=dict(type="str", required=True),
),
NotificationType.GOALERT: dict(
goAlertBaseURL=dict(type="str", required=True),
goAlertToken=dict(type="str", required=True),
), ),
NotificationType.GOOGLECHAT: dict( NotificationType.GOOGLECHAT: dict(
googleChatWebhookURL=dict(type="str", required=True), googleChatWebhookURL=dict(type="str"),
), ),
NotificationType.GORUSH: dict( NotificationType.GORUSH: dict(
gorushDeviceToken=dict(type="str", required=True), gorushDeviceToken=dict(type="str"),
gorushPlatform=dict(type="str", required=False), gorushPlatform=dict(type="str"),
gorushTitle=dict(type="str", required=False), gorushTitle=dict(type="str"),
gorushPriority=dict(type="str", required=False), gorushPriority=dict(type="str"),
gorushRetry=dict(type="int", required=False), gorushRetry=dict(type="str"),
gorushTopic=dict(type="str", required=False), gorushTopic=dict(type="str"),
gorushServerURL=dict(type="str", required=True), gorushServerURL=dict(type="str"),
), ),
NotificationType.GOTIFY: dict( NotificationType.GOTIFY: dict(
gotifyserverurl=dict(type="str", required=True), gotifyserverurl=dict(type="str"),
gotifyapplicationToken=dict(type="str", required=True), gotifyapplicationToken=dict(type="str"),
gotifyPriority=dict(type="int", required=True), gotifyPriority=dict(type="int"),
),
NotificationType.HOMEASSISTANT: dict(
notificationService=dict(type="str", required=False),
homeAssistantUrl=dict(type="str", required=True),
longLivedAccessToken=dict(type="str", required=True),
),
NotificationType.KOOK: dict(
kookGuildID=dict(type="str", required=True),
kookBotToken=dict(type="str", required=True),
), ),
NotificationType.LINE: dict( NotificationType.LINE: dict(
lineChannelAccessToken=dict(type="str", required=True), lineChannelAccessToken=dict(type="str"),
lineUserID=dict(type="str", required=True), lineUserID=dict(type="str"),
),
NotificationType.LINENOTIFY: dict(
lineNotifyAccessToken=dict(type="str", required=True),
), ),
NotificationType.LUNASEA: dict( NotificationType.LUNASEA: dict(
lunaseaTarget=dict(type="str", required=True), lunaseaDevice=dict(type="str"),
lunaseaUserID=dict(type="str", required=False),
lunaseaDevice=dict(type="str", required=False),
), ),
NotificationType.MATRIX: dict( NotificationType.MATRIX: dict(
internalRoomId=dict(type="str", required=True), internalRoomId=dict(type="str"),
accessToken=dict(type="str", required=True), accessToken=dict(type="str"),
homeserverUrl=dict(type="str", required=True), homeserverUrl=dict(type="str"),
), ),
NotificationType.MATTERMOST: dict( NotificationType.MATTERMOST: dict(
mattermostusername=dict(type="str", required=False), mattermostusername=dict(type="str"),
mattermostWebhookUrl=dict(type="str", required=True), mattermostWebhookUrl=dict(type="str"),
mattermostchannel=dict(type="str", required=False), mattermostchannel=dict(type="str"),
mattermosticonemo=dict(type="str", required=False), mattermosticonemo=dict(type="str"),
mattermosticonurl=dict(type="str", required=False), mattermosticonurl=dict(type="str"),
),
NotificationType.NOSTR: dict(
sender=dict(type="str", required=True),
recipients=dict(type="str", required=True),
relays=dict(type="str", required=True),
),
NotificationType.NTFY: dict(
ntfyAuthenticationMethod=dict(type="str", required=False),
ntfyusername=dict(type="str", required=False),
ntfypassword=dict(type="str", required=False),
ntfyaccesstoken=dict(type="str", required=False),
ntfytopic=dict(type="str", required=True),
ntfyPriority=dict(type="int", required=True),
ntfyserverurl=dict(type="str", required=True),
ntfyIcon=dict(type="str", required=False),
),
NotificationType.OCTOPUSH: dict(
octopushVersion=dict(type="str", required=False),
octopushAPIKey=dict(type="str", required=True),
octopushLogin=dict(type="str", required=True),
octopushPhoneNumber=dict(type="str", required=True),
octopushSMSType=dict(type="str", required=False),
octopushSenderName=dict(type="str", required=False),
), ),
NotificationType.ONEBOT: dict( NotificationType.ONEBOT: dict(
httpAddr=dict(type="str", required=True), httpAddr=dict(type="str"),
accessToken=dict(type="str", required=True), accessToken=dict(type="str"),
msgType=dict(type="str", required=False), msgType=dict(type="str"),
recieverId=dict(type="str", required=True), recieverId=dict(type="str"),
),
NotificationType.OPSGENIE: dict(
opsgeniePriority=dict(type="int", required=False),
opsgenieRegion=dict(type="str", required=True),
opsgenieApiKey=dict(type="str", required=True),
), ),
NotificationType.PAGERDUTY: dict( NotificationType.PAGERDUTY: dict(
pagerdutyAutoResolve=dict(type="str", required=False), pagerdutyAutoResolve=dict(type="str"),
pagerdutyIntegrationUrl=dict(type="str", required=False), pagerdutyIntegrationUrl=dict(type="str"),
pagerdutyPriority=dict(type="str", required=False), pagerdutyPriority=dict(type="str"),
pagerdutyIntegrationKey=dict(type="str", required=True), pagerdutyIntegrationKey=dict(type="str"),
),
NotificationType.PAGERTREE: dict(
pagertreeAutoResolve=dict(type="str", required=False),
pagertreeIntegrationUrl=dict(type="str", required=False),
pagertreeUrgency=dict(type="str", required=False),
), ),
NotificationType.PROMOSMS: dict( NotificationType.PROMOSMS: dict(
promosmsAllowLongSMS=dict(type="bool", required=False), promosmsLogin=dict(type="str"),
promosmsLogin=dict(type="str", required=True), promosmsPassword=dict(type="str"),
promosmsPassword=dict(type="str", required=True), promosmsPhoneNumber=dict(type="str"),
promosmsPhoneNumber=dict(type="str", required=True), promosmsSMSType=dict(type="str"),
promosmsSMSType=dict(type="str", required=False), promosmsSenderName=dict(type="str"),
promosmsSenderName=dict(type="str", required=False),
), ),
NotificationType.PUSHBULLET: dict( NotificationType.PUSHBULLET: dict(
pushbulletAccessToken=dict(type="str", required=True), pushbulletAccessToken=dict(type="str"),
), ),
NotificationType.PUSHDEER: dict( NotificationType.PUSHDEER: dict(
pushdeerServer=dict(type="str", required=False), pushdeerKey=dict(type="str"),
pushdeerKey=dict(type="str", required=True),
), ),
NotificationType.PUSHOVER: dict( NotificationType.PUSHOVER: dict(
pushoveruserkey=dict(type="str", required=True), pushoveruserkey=dict(type="str"),
pushoverapptoken=dict(type="str", required=True), pushoverapptoken=dict(type="str"),
pushoversounds=dict(type="str", required=False), pushoversounds=dict(type="str"),
pushoverpriority=dict(type="str", required=False), pushoverpriority=dict(type="str"),
pushovertitle=dict(type="str", required=False), pushovertitle=dict(type="str"),
pushoverdevice=dict(type="str", required=False), pushoverdevice=dict(type="str"),
pushoverttl=dict(type="int", required=False),
), ),
NotificationType.PUSHY: dict( NotificationType.PUSHY: dict(
pushyAPIKey=dict(type="str", required=True), pushyAPIKey=dict(type="str"),
pushyToken=dict(type="str", required=True), pushyToken=dict(type="str"),
), ),
NotificationType.ROCKET_CHAT: dict( NotificationType.ROCKET_CHAT: dict(
rocketchannel=dict(type="str", required=False), rocketchannel=dict(type="str"),
rocketusername=dict(type="str", required=False), rocketusername=dict(type="str"),
rocketiconemo=dict(type="str", required=False), rocketiconemo=dict(type="str"),
rocketwebhookURL=dict(type="str", required=True), rocketwebhookURL=dict(type="str"),
), rocketbutton=dict(type="str"),
NotificationType.SERVERCHAN: dict(
serverChanSendKey=dict(type="str", required=True),
), ),
NotificationType.SERWERSMS: dict( NotificationType.SERWERSMS: dict(
serwersmsUsername=dict(type="str", required=True), serwersmsUsername=dict(type="str"),
serwersmsPassword=dict(type="str", required=True), serwersmsPassword=dict(type="str"),
serwersmsPhoneNumber=dict(type="str", required=True), serwersmsPhoneNumber=dict(type="str"),
serwersmsSenderName=dict(type="str", required=False), serwersmsSenderName=dict(type="str"),
), ),
NotificationType.SIGNAL: dict( NotificationType.SIGNAL: dict(
signalNumber=dict(type="str", required=True), signalNumber=dict(type="str"),
signalRecipients=dict(type="str", required=True), signalRecipients=dict(type="str"),
signalURL=dict(type="str", required=True), signalURL=dict(type="str"),
), ),
NotificationType.SLACK: dict( NotificationType.SLACK: dict(
slackchannelnotify=dict(type="bool", required=False), slackbutton=dict(type="str"),
slackchannel=dict(type="str", required=False), slackchannel=dict(type="str"),
slackusername=dict(type="str", required=False), slackusername=dict(type="str"),
slackiconemo=dict(type="str", required=False), slackiconemo=dict(type="str"),
slackwebhookURL=dict(type="str", required=True), slackwebhookURL=dict(type="str"),
),
NotificationType.SMSC: dict(
smscTranslit=dict(type="str", required=False),
smscLogin=dict(type="str", required=True),
smscPassword=dict(type="str", required=True),
smscToNumber=dict(type="str", required=True),
smscSenderName=dict(type="str", required=False),
),
NotificationType.SMSEAGLE: dict(
smseagleEncoding=dict(type="bool", required=False),
smseaglePriority=dict(type="int", required=False),
smseagleRecipientType=dict(type="str", required=False),
smseagleToken=dict(type="str", required=True),
smseagleRecipient=dict(type="str", required=True),
smseagleUrl=dict(type="str", required=True),
),
NotificationType.SMSMANAGER: dict(
smsmanagerApiKey=dict(type="str", required=False),
numbers=dict(type="str", required=False),
messageType=dict(type="str", required=False),
), ),
NotificationType.SMTP: dict( NotificationType.SMTP: dict(
smtpHost=dict(type="str", required=True), smtpHost=dict(type="str"),
smtpPort=dict(type="int", required=True), smtpPort=dict(type="int"),
smtpSecure=dict(type="str", required=False), smtpSecure=dict(type="str"),
smtpIgnoreTLSError=dict(type="bool", required=False), smtpIgnoreTLSError=dict(type="str"),
smtpDkimDomain=dict(type="str", required=False), smtpDkimDomain=dict(type="str"),
smtpDkimKeySelector=dict(type="str", required=False), smtpDkimKeySelector=dict(type="str"),
smtpDkimPrivateKey=dict(type="str", required=False), smtpDkimPrivateKey=dict(type="str"),
smtpDkimHashAlgo=dict(type="str", required=False), smtpDkimHashAlgo=dict(type="str"),
smtpDkimheaderFieldNames=dict(type="str", required=False), smtpDkimheaderFieldNames=dict(type="str"),
smtpDkimskipFields=dict(type="str", required=False), smtpDkimskipFields=dict(type="str"),
smtpUsername=dict(type="str", required=False), smtpUsername=dict(type="str"),
smtpPassword=dict(type="str", required=False), smtpPassword=dict(type="str"),
customSubject=dict(type="str", required=False), customSubject=dict(type="str"),
smtpFrom=dict(type="str", required=True), smtpFrom=dict(type="str"),
smtpCC=dict(type="str", required=False), smtpCC=dict(type="str"),
smtpBCC=dict(type="str", required=False), smtpBCC=dict(type="str"),
smtpTo=dict(type="str", required=False), smtpTo=dict(type="str"),
),
NotificationType.SPLUNK: dict(
splunkAutoResolve=dict(type="str", required=False),
splunkSeverity=dict(type="str", required=False),
splunkRestURL=dict(type="str", required=True),
),
NotificationType.SQUADCAST: dict(
squadcastWebhookURL=dict(type="str", required=True),
), ),
NotificationType.STACKFIELD: dict( NotificationType.STACKFIELD: dict(
stackfieldwebhookURL=dict(type="str", required=True), stackfieldwebhookURL=dict(type="str"),
),
NotificationType.TEAMS: dict(
webhookUrl=dict(type="str", required=True),
), ),
NotificationType.PUSHBYTECHULUS: dict( NotificationType.PUSHBYTECHULUS: dict(
pushAPIKey=dict(type="str", required=True), pushAPIKey=dict(type="str"),
), ),
NotificationType.TELEGRAM: dict( NotificationType.TELEGRAM: dict(
telegramChatID=dict(type="str", required=True), telegramBotToken=dict(type="str"),
telegramSendSilently=dict(type="bool", required=False), telegramChatID=dict(type="str"),
telegramProtectContent=dict(type="bool", required=False),
telegramMessageThreadID=dict(type="str", required=False),
telegramBotToken=dict(type="str", required=True),
),
NotificationType.TWILIO: dict(
twilioAccountSID=dict(type="str", required=True),
twilioApiKey=dict(type="str", required=False),
twilioAuthToken=dict(type="str", required=True),
twilioToNumber=dict(type="str", required=True),
twilioFromNumber=dict(type="str", required=True),
), ),
NotificationType.WEBHOOK: dict( NotificationType.WEBHOOK: dict(
webhookContentType=dict(type="str", required=True), webhookContentType=dict(type="str"),
webhookCustomBody=dict(type="str", required=False), webhookAdditionalHeaders=dict(type="str"),
webhookAdditionalHeaders=dict(type="str", required=False), webhookURL=dict(type="str"),
webhookURL=dict(type="str", required=True),
), ),
NotificationType.WECOM: dict( NotificationType.WECOM: dict(
weComBotKey=dict(type="str", required=True), weComBotKey=dict(type="str"),
),
NotificationType.ALERTNOW: dict(
alertNowWebhookURL=dict(type="str"),
),
NotificationType.HOMEASSISTANT: dict(
homeAssistantUrl=dict(type="str"),
longLivedAccessToken=dict(type="str"),
),
NotificationType.LINENOTIFY: dict(
lineNotifyAccessToken=dict(type="str"),
),
NotificationType.BARK: dict(
barkEndpoint=dict(type="str"),
barkGroup=dict(type="str"),
barkSound=dict(type="str"),
),
NotificationType.GOALERT: dict(
goAlertBaseURL=dict(type="str"),
goAlertToken=dict(type="str"),
),
NotificationType.OCTOPUSH: dict(
octopushVersion=dict(type="str"),
octopushAPIKey=dict(type="str"),
octopushLogin=dict(type="str"),
octopushPhoneNumber=dict(type="str"),
octopushSMSType=dict(type="str"),
octopushSenderName=dict(type="str"),
octopushDMLogin=dict(type="str"),
octopushDMAPIKey=dict(type="str"),
octopushDMPhoneNumber=dict(type="str"),
octopushDMSenderName=dict(type="str"),
octopushDMSMSType=dict(type="str"),
),
NotificationType.SERVERCHAN: dict(
serverChanSendKey=dict(type="str"),
),
NotificationType.SMSMANAGER: dict(
smsmanagerApiKey=dict(type="str"),
numbers=dict(type="str"),
messageType=dict(type="str"),
),
NotificationType.SQUADCAST: dict(
squadcastWebhookURL=dict(type="str"),
),
NotificationType.TEAMS: dict(
webhookUrl=dict(type="str"),
),
NotificationType.FREEMOBILE: dict(
freemobileUser=dict(type="str"),
freemobilePass=dict(type="str"),
),
NotificationType.NTFY: dict(
ntfyusername=dict(type="str"),
ntfypassword=dict(type="str"),
ntfytopic=dict(type="str"),
ntfyPriority=dict(type="int"),
ntfyIcon=dict(type="str"),
ntfyserverurl=dict(type="str"),
),
NotificationType.SMSEAGLE: dict(
smseagleEncoding=dict(type="bool"),
smseaglePriority=dict(type="int"),
smseagleRecipientType=dict(type="str"),
smseagleToken=dict(type="str"),
smseagleRecipient=dict(type="str"),
smseagleUrl=dict(type="str")
), ),
NotificationType.ZOHOCLIQ: dict( NotificationType.ZOHOCLIQ: dict(
webhookUrl=dict(type="str", required=True), webhookUrl=dict(type="str")
),
NotificationType.KOOK: dict(
kookGuildID=dict(type="str"),
kookBotToken=dict(type="str")
), ),
} }
notification_provider_conditions = dict( notification_provider_conditions = dict(
gotifyPriority=dict( gotifyPriority=dict(
min=0, min=0,
max=10, max=10
),
ntfyPriority=dict(
min=1,
max=5,
),
opsgeniePriority=dict(
min=1,
max=5,
),
pushoverttl=dict(
min=0,
),
smseaglePriority=dict(
min=0,
max=9,
), ),
smtpPort=dict( smtpPort=dict(
min=0, min=0,
max=65535, max=65535
), ),
ntfyPriority=dict(
min=1,
max=5
),
smseaglePriority=dict(
min=0,
max=9
)
) )