From 8ba2f944dd2823da3579ed8def08ec42412002b4 Mon Sep 17 00:00:00 2001 From: Julien Malka Date: Sat, 7 Dec 2024 20:02:06 +0100 Subject: [PATCH 1/4] feat: delete unused monitors --- stateless_uptime_kuma/uptime_kuma.py | 45 ++++++++++++++++++++++++---- 1 file changed, 40 insertions(+), 5 deletions(-) diff --git a/stateless_uptime_kuma/uptime_kuma.py b/stateless_uptime_kuma/uptime_kuma.py index 7208ba3..866e9dd 100644 --- a/stateless_uptime_kuma/uptime_kuma.py +++ b/stateless_uptime_kuma/uptime_kuma.py @@ -5,6 +5,8 @@ Classes to make the needed operations to reach the specified state. import logging import sys +from requests.api import delete + logger = logging.getLogger(__name__) @@ -13,6 +15,7 @@ class Manager: self.api = api self.prune_unused = prune_unused self.target_tree = target_tree + self.to_prune = [] def process(self): self.sync_tags() @@ -20,6 +23,7 @@ class Manager: self.sync_monitors() self.sync_status_pages() self.sync_settings() + self.prune() self.save() def save(self): @@ -27,25 +31,34 @@ class Manager: for i in v: i.save() # this method should be safe to be called in whatever order + def prune(self): + for e in self.to_prune: + e.prune() + + def sync_monitors(self): + logger.debug(f"Syncing monitors...") old = self.api.get_monitors() new = self.target_tree.get("monitors", []) - self.sync(new, old, "name") + self.sync(new, old, "name", Monitor) def sync_notifications(self): + logger.debug(f"Syncing notifications...") old = self.api.get_notifications() new = self.target_tree.get("notifications", []) - self.sync(new, old, "name") + self.sync(new, old, "name", Notification) def sync_tags(self): + logger.debug(f"Syncing tags...") old = self.api.get_tags() new = self.target_tree.get("tags", []) - self.sync(new, old, "name") + self.sync(new, old, "name", Tag) def sync_status_pages(self): + logger.debug(f"Syncing status pages...") old = self.api.get_status_pages() new = self.target_tree.get("status_pages", []) - self.sync(new, old, "slug") + self.sync(new, old, "slug", StatusPage) def sync_settings(self): if "settings" not in self.target_tree: @@ -58,8 +71,9 @@ class Manager: if k not in new.kwargs: new.kwargs[k] = v - def sync(self, new, old, pk): + def sync(self, new, old, pk, item_t): indexed_old = {elem[pk]: elem for elem in old} + indexed_new = {elem.name: elem for elem in new} for k in new: if k.name in indexed_old: k.id = indexed_old[k.name]["id"] @@ -72,6 +86,14 @@ class Manager: else: k.id = None # Useless logger.debug(f"Creating key {k}") + for k in indexed_old: + if k not in indexed_new: + if item_t == StatusPage: + self.to_prune.append(item_t(api=None, name=indexed_old[k]["slug"], id=indexed_old[k]["id"])) + else: + self.to_prune.append(item_t(api=self.api, name=indexed_old[k]["name"], id=indexed_old[k]["id"])) + + class Item: @@ -85,6 +107,10 @@ class Item: def save(self): raise NotImplementedError() + def prune(self): + print(f"Would prune: {self}") + + def __setattr__(self, name, value): if name != "saved": self.saved = False @@ -157,6 +183,12 @@ class Monitor(Item): self.api.add_monitor_tag(tag_id=t.id, monitor_id=self.id, value=v) self.saved = True + + def prune(self): + logger.debug(f"Deleting monitor {self.name}") + self.api.delete_monitor(self.id) + + def __repr__(self): return f"Monitor({str(self)})" @@ -185,6 +217,9 @@ class Tag(Item): ) self.saved = True + def prune(self): + pass + def __repr__(self): return f"Tag({str(self)})" From ebe17beb8b12f627871f4b4584cabf6f3236ff17 Mon Sep 17 00:00:00 2001 From: Julien Malka Date: Sat, 7 Dec 2024 22:57:27 +0100 Subject: [PATCH 2/4] test stuff --- .envrc | 1 + test.json | 17 +++++++++++++++++ 2 files changed, 18 insertions(+) create mode 100644 .envrc create mode 100644 test.json diff --git a/.envrc b/.envrc new file mode 100644 index 0000000..1d953f4 --- /dev/null +++ b/.envrc @@ -0,0 +1 @@ +use nix diff --git a/test.json b/test.json new file mode 100644 index 0000000..a721d1f --- /dev/null +++ b/test.json @@ -0,0 +1,17 @@ +{ + "monitors": { + "mdr": { + "accepted_statuscodes": [ + "200-299" + ], + "headers": "{\n \"Host\": \"julienmalka.me\"\n}\n", + "keyword": "Ulm", + "type": "keyword", + "url": "https://82.67.34.230" + } + }, + "notifications": {}, + "settings": {}, + "status_pages": {}, + "tags": {} +} From caf3169829647809805caaf968c8c0d4015ef187 Mon Sep 17 00:00:00 2001 From: Julien Malka Date: Sat, 7 Dec 2024 23:49:25 +0100 Subject: [PATCH 3/4] update api --- uptime-kuma-api.nix | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/uptime-kuma-api.nix b/uptime-kuma-api.nix index d3fdc66..98dca3d 100644 --- a/uptime-kuma-api.nix +++ b/uptime-kuma-api.nix @@ -1,7 +1,7 @@ { lib, buildPythonPackage, - fetchFromGitHub, + fetchFromGitea, setuptools, wheel, packaging, @@ -11,14 +11,15 @@ buildPythonPackage rec { pname = "uptime-kuma-api"; - version = "1.2.1"; + version = "2.0.0"; pyproject = true; - src = fetchFromGitHub { - owner = "lucasheld"; + src = fetchFromGitea { + domain = "git.dgnum.eu"; + owner = "Luj"; repo = "uptime-kuma-api"; - rev = version; - hash = "sha256-Mgp4bSQPiEeulK9dAl+Di4Nj1HG3oVFGKr1bIdRZI44="; + rev = "782037348df18dd32c3904c812c289f3d2d79170"; + hash = "sha256-YK4KMtKPlxqWwzB6lLyFqLvq1RCiUWrIILcVmuiirFw="; }; nativeBuildInputs = [ From 78564e5f2c4fad5175f709560e6ee75d30115b22 Mon Sep 17 00:00:00 2001 From: Luj Date: Sat, 18 Jan 2025 00:13:09 +0100 Subject: [PATCH 4/4] hack to have impure notifications --- stateless_uptime_kuma/uptime_kuma.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/stateless_uptime_kuma/uptime_kuma.py b/stateless_uptime_kuma/uptime_kuma.py index 866e9dd..8d133d9 100644 --- a/stateless_uptime_kuma/uptime_kuma.py +++ b/stateless_uptime_kuma/uptime_kuma.py @@ -159,7 +159,6 @@ class Monitor(Item): if self.id is None: rslt = self.api.add_monitor( name=self.name, - notificationIDList=[i.id for i in self.notifications], **self.kwargs, ) self.id = rslt["monitorID"] @@ -169,7 +168,6 @@ class Monitor(Item): rslt = self.api.edit_monitor( self.id, name=self.name, - notificationIDList=[i.id for i in self.notifications], **self.kwargs, ) current_tags = set(