feat: add support for uptime kuma 1.21.2

This commit is contained in:
lucasheld 2023-04-07 21:03:33 +02:00
parent be537a14d2
commit d7f033030e
6 changed files with 152 additions and 139 deletions

View file

@ -8,7 +8,7 @@ This package was developed to configure Uptime Kuma with Ansible. The Ansible co
Python version 3.6+ is required. Python version 3.6+ is required.
Supported Uptime Kuma versions: 1.17.0 - 1.21.1 Supported Uptime Kuma versions: 1.17.0 - 1.21.2
Installation Installation
--- ---

View file

@ -5,7 +5,7 @@ if [ $version ]
then then
versions=("$version") versions=("$version")
else else
versions=(1.21.1 1.20.2 1.19.6 1.18.5 1.17.1) versions=(1.21.2 1.21.1 1.20.2 1.19.6 1.18.5 1.17.1)
fi fi
for version in ${versions[*]} for version in ${versions[*]}

View file

@ -24,20 +24,15 @@ 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": []
} }
if parse_version(self.api.version) >= parse_version("1.21.2"):
expected_maintenance.update({
"timezone": "Europe/Berlin"
})
# add maintenance # add maintenance
r = self.api.add_maintenance(**expected_maintenance) r = self.api.add_maintenance(**expected_maintenance)
self.assertEqual(r["msg"], "Added Successfully.") self.assertEqual(r["msg"], "Added Successfully.")
@ -119,18 +114,6 @@ 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": []
} }
@ -147,16 +130,6 @@ 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": []
} }
@ -246,12 +219,33 @@ class TestMaintenance(UptimeKumaTestCase):
10, 10,
20, 20,
30, 30,
"lastDay4", "lastDay1"
"lastDay2"
] ]
} }
self.do_test_maintenance_strategy(expected_maintenance) self.do_test_maintenance_strategy(expected_maintenance)
def test_maintenance_strategy_cron(self):
if parse_version(self.api.version) < parse_version("1.21.2"):
self.skipTest("Unsupported in this Uptime Kuma version")
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,
"timezone": "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)

View file

@ -184,49 +184,6 @@ def _build_docker_host_data(
return data return data
def _build_maintenance_data(
title: str,
strategy: MaintenanceStrategy,
active: bool = True,
description: str = "",
dateRange: list = None,
intervalDay: int = 1,
weekdays: list = None,
daysOfMonth: list = None,
timeRange: list = None
) -> dict:
if not dateRange:
dateRange = [
datetime.date.today().strftime("%Y-%m-%d 00:00:00")
]
if not timeRange:
timeRange = [
{
"hours": 2,
"minutes": 0,
}, {
"hours": 3,
"minutes": 0,
}
]
if not weekdays:
weekdays = []
if not daysOfMonth:
daysOfMonth = []
data = {
"title": title,
"active": active,
"intervalDay": intervalDay,
"dateRange": dateRange,
"description": description,
"strategy": strategy,
"weekdays": weekdays,
"daysOfMonth": daysOfMonth,
"timeRange": timeRange
}
return data
def _build_tag_data( def _build_tag_data(
name: str, name: str,
color: str color: str
@ -611,7 +568,7 @@ class UptimeKumaApi(object):
interval: int = 60, interval: int = 60,
retryInterval: int = 60, retryInterval: int = 60,
resendInterval: int = 0, resendInterval: int = 0,
maxretries: int = 0, maxretries: int = 1,
upsideDown: bool = False, upsideDown: bool = False,
notificationIDList: list = None, notificationIDList: list = None,
httpBodyEncoding: str = "json", httpBodyEncoding: str = "json",
@ -686,6 +643,10 @@ class UptimeKumaApi(object):
# GAMEDIG # GAMEDIG
game: str = None game: str = None
) -> dict: ) -> dict:
# https://github.com/louislam/uptime-kuma/compare/1.21.1...1.21.2#diff-f672603317047f3e6f27b0d7a44f6f244b7dbb5d0d0a85f1059a6b0bc2cb9aa0L910
if parse_version(self.version) < parse_version("1.21.2"):
maxretries = 0
data = { data = {
"type": type, "type": type,
"name": name, "name": name,
@ -828,6 +789,58 @@ class UptimeKumaApi(object):
return data return data
def _build_maintenance_data(
self,
title: str,
strategy: MaintenanceStrategy,
active: bool = True,
description: str = "",
dateRange: list = None,
intervalDay: int = 1,
weekdays: list = None,
daysOfMonth: list = None,
timeRange: list = None,
cron: str = "30 3 * * *",
durationMinutes: int = 60,
timezone: str = None
) -> dict:
if not dateRange:
dateRange = [
datetime.date.today().strftime("%Y-%m-%d 00:00:00")
]
if not timeRange:
timeRange = [
{
"hours": 2,
"minutes": 0,
}, {
"hours": 3,
"minutes": 0,
}
]
if not weekdays:
weekdays = []
if not daysOfMonth:
daysOfMonth = []
data = {
"title": title,
"active": active,
"intervalDay": intervalDay,
"dateRange": dateRange,
"description": description,
"strategy": strategy,
"weekdays": weekdays,
"daysOfMonth": daysOfMonth,
"timeRange": timeRange
}
if parse_version(self.version) >= parse_version("1.21.2"):
data.update({
"cron": cron,
"durationMinutes": durationMinutes,
"timezone": timezone,
})
return data
# monitor # monitor
def get_monitors(self) -> list: def get_monitors(self) -> list:
@ -875,7 +888,7 @@ class UptimeKumaApi(object):
'keyword': None, 'keyword': None,
'maintenance': False, 'maintenance': False,
'maxredirects': 10, 'maxredirects': 10,
'maxretries': 0, 'maxretries': 1,
'method': 'GET', 'method': 'GET',
'mqttPassword': None, 'mqttPassword': None,
'mqttSuccessMessage': None, 'mqttSuccessMessage': None,
@ -957,7 +970,7 @@ class UptimeKumaApi(object):
'keyword': None, 'keyword': None,
'maintenance': False, 'maintenance': False,
'maxredirects': 10, 'maxredirects': 10,
'maxretries': 0, 'maxretries': 1,
'method': 'GET', 'method': 'GET',
'mqttPassword': None, 'mqttPassword': None,
'mqttSuccessMessage': None, 'mqttSuccessMessage': None,
@ -2838,29 +2851,27 @@ class UptimeKumaApi(object):
], ],
"timeRange": [ "timeRange": [
{ {
"hours": 2, "hours": 0,
"minutes": 0, "minutes": 0
"seconds": 0
}, },
{ {
"hours": 3, "hours": 0,
"minutes": 0, "minutes": 0
"seconds": 0
} }
], ],
"weekdays": [], "weekdays": [],
"daysOfMonth": [], "daysOfMonth": [],
"timeslotList": [ "timeslotList": [
{ {
"id": 1, "startDate": "2022-12-27 22:36:00",
"startDate": "2022-12-27 14:39:00", "endDate": "2022-12-29 22:36:00"
"endDate": "2022-12-30 14:39:00",
"startDateServerTimezone": "2022-12-27 15:39",
"endDateServerTimezone": "2022-12-30 15:39",
"serverTimezoneOffset": "+01:00"
} }
], ],
"status": "under-maintenance" "cron": "",
"durationMinutes": null,
"timezone": "Europe/Berlin",
"timezoneOffset": "+02:00",
"status": "ended"
} }
] ]
""" """
@ -2891,29 +2902,28 @@ class UptimeKumaApi(object):
], ],
"timeRange": [ "timeRange": [
{ {
"hours": 2, "hours": 0,
"minutes": 0, "minutes": 0
"seconds": 0
}, },
{ {
"hours": 3, "hours": 0,
"minutes": 0, "minutes": 0
"seconds": 0
} }
], ],
"weekdays": [], "weekdays": [],
"daysOfMonth": [], "daysOfMonth": [],
"timeslotList": [ "timeslotList": [
{ {
"id": 1, "startDate": "2022-12-27 22:36:00",
"startDate": "2022-12-27 14:39:00", "endDate": "2022-12-29 22:36:00"
"endDate": "2022-12-30 14:39:00",
"startDateServerTimezone": "2022-12-27 15:39",
"endDateServerTimezone": "2022-12-30 15:39",
"serverTimezoneOffset": "+01:00"
} }
], ],
"status": "under-maintenance" "cron": null,
"duration": null,
"durationMinutes": 0,
"timezone": "Europe/Berlin",
"timezoneOffset": "+02:00",
"status": "ended"
} }
""" """
return self._call('getMaintenance', id_)["maintenance"] return self._call('getMaintenance', id_)["maintenance"]
@ -2938,18 +2948,6 @@ class UptimeKumaApi(object):
... 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=[]
... ) ... )
@ -2970,20 +2968,9 @@ class UptimeKumaApi(object):
... "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,
... "seconds": 0
... },
... {
... "hours": 3,
... "minutes": 0,
... "seconds": 0
... }
... ],
... weekdays=[], ... weekdays=[],
... daysOfMonth=[] ... daysOfMonth=[],
... timezone="Europe/Berlin"
... ) ... )
{ {
"msg": "Added Successfully.", "msg": "Added Successfully.",
@ -3015,7 +3002,8 @@ class UptimeKumaApi(object):
... } ... }
... ], ... ],
... weekdays=[], ... weekdays=[],
... daysOfMonth=[] ... daysOfMonth=[],
... timezone="Europe/Berlin"
... ) ... )
{ {
"msg": "Added Successfully.", "msg": "Added Successfully.",
@ -3052,7 +3040,8 @@ class UptimeKumaApi(object):
... 5, ... 5,
... 0 ... 0
... ], ... ],
... daysOfMonth=[] ... daysOfMonth=[],
... timezone="Europe/Berlin"
... ) ... )
{ {
"msg": "Added Successfully.", "msg": "Added Successfully.",
@ -3089,15 +3078,39 @@ class UptimeKumaApi(object):
... 10, ... 10,
... 20, ... 20,
... 30, ... 30,
... "lastDay2" ... "lastDay1"
... ] ... ],
... timezone="Europe/Berlin"
... )
{
"msg": "Added Successfully.",
"maintenanceID": 1
}
Example (strategy: :attr:`~.MaintenanceStrategy.CRON`)::
>>> api.add_maintenance(
... title="test",
... description="test",
... strategy=MaintenanceStrategy.CRON,
... active=True,
... intervalDay=1,
... dateRange=[
... "2022-12-27 22:39:00",
... "2022-12-31 22:39:00"
... ],
... weekdays=[],
... daysOfMonth=[],
... cron="50 5 * * *",
... durationMinutes=120,
... timezone="Europe/Berlin"
... ) ... )
{ {
"msg": "Added Successfully.", "msg": "Added Successfully.",
"maintenanceID": 1 "maintenanceID": 1
} }
""" """
data = _build_maintenance_data(**kwargs) data = self._build_maintenance_data(**kwargs)
_check_arguments_maintenance(data) _check_arguments_maintenance(data)
return self._call('addMaintenance', data) return self._call('addMaintenance', data)

View file

@ -319,8 +319,11 @@ 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 (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 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 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)
""" """

View file

@ -18,3 +18,6 @@ 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"""