From 497d4fff30853072bb59ede8976c8622f64e6949 Mon Sep 17 00:00:00 2001 From: Sophie Schiller Date: Wed, 4 Sep 2024 21:25:50 +0200 Subject: [PATCH 001/252] miniserver: element-web update --- nodes/sophie/miniserver.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nodes/sophie/miniserver.py b/nodes/sophie/miniserver.py index b2d6db9..57fe6f4 100644 --- a/nodes/sophie/miniserver.py +++ b/nodes/sophie/miniserver.py @@ -63,7 +63,7 @@ nodes['htz-cloud.miniserver'] = { }, 'element-web': { 'url': 'chat.sophies-kitchen.eu', - 'version': 'v1.11.72', + 'version': 'v1.11.76', 'config': { 'default_server_config': { 'm.homeserver': { From b9216f230b5f8c7e4af75a385cc70ae6633e2521 Mon Sep 17 00:00:00 2001 From: Sophie Schiller Date: Wed, 4 Sep 2024 23:06:07 +0200 Subject: [PATCH 002/252] matrix-media-repo: extend rate limits --- bundles/matrix-media-repo/files/config.yaml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/bundles/matrix-media-repo/files/config.yaml b/bundles/matrix-media-repo/files/config.yaml index 0b07b0f..3726bb2 100644 --- a/bundles/matrix-media-repo/files/config.yaml +++ b/bundles/matrix-media-repo/files/config.yaml @@ -31,7 +31,7 @@ homeservers: % endfor accessTokens: - maxCacheTimeSeconds: 0 + maxCacheTimeSeconds: 10 useLocalAppserviceConfig: false admins: @@ -137,8 +137,8 @@ thumbnails: rateLimit: enabled: true - requestsPerSecond: 10 - burst: 50 + requestsPerSecond: 100 + burst: 5000 identicons: enabled: true From 121a261ecdb269761a9a6834b01060e92f70bd1f Mon Sep 17 00:00:00 2001 From: Sophie Schiller Date: Wed, 4 Sep 2024 23:06:23 +0200 Subject: [PATCH 003/252] miniserver: actually use signing key --- nodes/sophie/miniserver.py | 1 + 1 file changed, 1 insertion(+) diff --git a/nodes/sophie/miniserver.py b/nodes/sophie/miniserver.py index 57fe6f4..a6603b9 100644 --- a/nodes/sophie/miniserver.py +++ b/nodes/sophie/miniserver.py @@ -118,6 +118,7 @@ nodes['htz-cloud.miniserver'] = { 'sophies-kitchen.eu': { 'domain': 'http://[::1]:20080/', 'api': 'synapse', + 'signing_key_path': "/etc/matrix-synapse/mmr.signing.key" }, }, 'admins': { From 95c5b28469de154ff5fbb5220802dc4431081e4b Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Mon, 16 Sep 2024 07:02:27 +0200 Subject: [PATCH 004/252] basic monitoring for proxmox-backupstorage --- nodes/htz-hel/proxmox-backupstorage.toml | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/nodes/htz-hel/proxmox-backupstorage.toml b/nodes/htz-hel/proxmox-backupstorage.toml index 19d83d3..0c6d7ac 100644 --- a/nodes/htz-hel/proxmox-backupstorage.toml +++ b/nodes/htz-hel/proxmox-backupstorage.toml @@ -1,5 +1,6 @@ hostname = "2a01:4f9:6b:2d99::c0ff:ee" -dummy = true +#dummy = true +bundles = ["sshmon", "smartd"] # How to install: # - Get server at Hetzner (no IPv4) @@ -17,3 +18,11 @@ dummy = true # - IPv6 only # - IP from the /64 hetzner gives us # - Gateway is the host itself, to work around the MAC filter hetzner uses + +[metadata.smartd] +disks = [ + "/dev/sda", + "/dev/sdb", + "/dev/sdc", + "/dev/sdd", +] From c6421c7bd4edbff517168b196e4cfab747a287bd Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Fri, 20 Sep 2024 15:33:56 +0200 Subject: [PATCH 005/252] update travelynx to 2.8.39 --- nodes/carlene.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nodes/carlene.toml b/nodes/carlene.toml index 14deee9..5466246 100644 --- a/nodes/carlene.toml +++ b/nodes/carlene.toml @@ -256,7 +256,7 @@ disks = [ ] [metadata.travelynx] -version = "2.8.38" +version = "2.8.39" mail_from = "travelynx@franzi.business" domain = "travelynx.franzi.business" From 423049667fa765c28d0c01ab04f7de26dce6edfa Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Mon, 23 Sep 2024 18:09:49 +0200 Subject: [PATCH 006/252] bundles/nftables: improve handling for icmp --- bundles/nftables/files/nftables.conf | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/bundles/nftables/files/nftables.conf b/bundles/nftables/files/nftables.conf index c39e8be..56fba34 100644 --- a/bundles/nftables/files/nftables.conf +++ b/bundles/nftables/files/nftables.conf @@ -23,9 +23,8 @@ table inet filter { icmp type timestamp-request drop icmp type timestamp-reply drop - ip protocol icmp accept + meta l4proto {icmp, ipv6-icmp} accept - ip6 nexthdr ipv6-icmp accept % for ruleset, rules in sorted(input.items()): # ${ruleset} From abdc7f751e50b29653caac146a88837503938583 Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Wed, 25 Sep 2024 21:45:52 +0200 Subject: [PATCH 007/252] update pretalx-halfnarp to 1.1.2 --- nodes/voc/pretalx.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nodes/voc/pretalx.py b/nodes/voc/pretalx.py index 845aa23..b75ba3c 100644 --- a/nodes/voc/pretalx.py +++ b/nodes/voc/pretalx.py @@ -64,7 +64,7 @@ nodes['voc.pretalx'] = { }, 'halfnarp': { 'repo': 'https://github.com/seibert-media/pretalx-halfnarp.git', - 'rev': '1.1.0', + 'rev': '1.1.2', }, 'media.ccc.de': { 'repo': 'https://github.com/pretalx/pretalx-media-ccc-de.git', From 4a28bc55c0d3c07d08f8bedf5ca62e0a4fbb3aa4 Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Fri, 27 Sep 2024 08:42:58 +0200 Subject: [PATCH 008/252] bundles/homeassistant: rework check_homeassistant_update --- .../files/check_homeassistant_update | 72 +++++++++---------- bundles/homeassistant/items.py | 2 +- nodes/home.hass.toml | 2 +- 3 files changed, 35 insertions(+), 41 deletions(-) diff --git a/bundles/homeassistant/files/check_homeassistant_update b/bundles/homeassistant/files/check_homeassistant_update index ff2b0d7..0e6f2e8 100644 --- a/bundles/homeassistant/files/check_homeassistant_update +++ b/bundles/homeassistant/files/check_homeassistant_update @@ -2,48 +2,42 @@ from sys import exit -import requests from packaging import version +from requests import get -bearer = "${bearer}" -domain = "${domain}" -OK = 0 -WARN = 1 -CRITICAL = 2 -UNKNOWN = 3 - -status = 3 -message = "Unknown Update Status" - - -domain = "hass.home.kunbox.net" - -s = requests.Session() -s.headers.update({"Content-Type": "application/json"}) +API_TOKEN = "${token}" +DOMAIN = "${domain}" try: - stable_version = version.parse( - s.get("https://version.home-assistant.io/stable.json").json()["homeassistant"][ - "generic-x86-64" - ] - ) - s.headers.update( - {"Authorization": f"Bearer {bearer}", "Content-Type": "application/json"} - ) - running_version = version.parse( - s.get(f"https://{domain}/api/config").json()["version"] - ) - if running_version == stable_version: - status = 0 - message = f"OK - running version {running_version} equals stable version {stable_version}" - elif running_version > stable_version: - status = 1 - message = f"WARNING - stable version {stable_version} is lower than running version {running_version}, check if downgrade is necessary." - else: - status = 2 - message = f"CRITICAL - update necessary, running version {running_version} is lower than stable version {stable_version}" + r = get("https://version.home-assistant.io/stable.json") + r.raise_for_status() + stable_version = r.json()["homeassistant"]["generic-x86-64"] except Exception as e: - message = f"{message}: {repr(e)}" + print(f"Could not get stable version information from home-assistant.io: {e!r}") + exit(3) -print(message) -exit(status) +try: + r = get( + f"https://{DOMAIN}/api/config", + headers={"Authorization": f"Bearer {API_TOKEN}", "Content-Type": "application/json"}, + ) + r.raise_for_status() + running_version = r.json()["version"] +except Exception as e: + print(f"Could not get running version information from homeassistant: {e!r}") + exit(3) + +try: + if stable_version > running_version: + print( + f"There is a newer version available: {stable_version} (currently installed: {running_version})" + ) + exit(2) + else: + print( + f"Currently running version {running_version} matches newest release on home-assistant.io" + ) + exit(0) +except Exception as e: + print(repr(e)) + exit(3) diff --git a/bundles/homeassistant/items.py b/bundles/homeassistant/items.py index 67042d1..92f097b 100644 --- a/bundles/homeassistant/items.py +++ b/bundles/homeassistant/items.py @@ -30,7 +30,7 @@ files = { '/usr/local/share/icinga/plugins/check_homeassistant_update': { 'content_type': 'mako', 'context': { - 'bearer': repo.vault.decrypt(node.metadata.get('homeassistant/api_secret')), + 'token': node.metadata.get('homeassistant/api_secret'), 'domain': node.metadata.get('homeassistant/domain'), }, 'mode': '0755', diff --git a/nodes/home.hass.toml b/nodes/home.hass.toml index b29dd0e..2c52708 100644 --- a/nodes/home.hass.toml +++ b/nodes/home.hass.toml @@ -22,7 +22,7 @@ ram = 2 [metadata.homeassistant] domain = 'hass.home.kunbox.net' -api_secret = 'encrypt$gAAAAABjpyuqXLoilokQW5c0zV8shHcOzN1zkEbS-I6WAAX-xDO_OF33YbjbkpELU2HGBzqiWX40J0hsaEbYJOnCHFk8gJ-Xt0vdqqbQ5vca_TGPNQHZPAS4qZoPTcUhmX_I-0EdT6ukhxejXFYBiYRZikTLjH3lcNM5qnckCm-H9NbRdjLb9hbCDIjbEglHmBl_g08S1_ukvX3dDSCIHIxgXXGsdK_Go1KxPJd8G22FL_MMhCfsTW-6ioIqoHSeSA1NGk3MZHEIM2errckiopKBxoBaROsacO9Uqk1zrrgXOs2NsgiTRtrbV1TNlFVaIX9mZdsUnMGZ' +api_secret = '!decrypt:encrypt$gAAAAABm9lNg_mNhyzb4S6WRtVRDmQFBnPpoCwyqMnilRrAFUXc-EDvv-nYXPbSIbjTf7ZReTPtqr8k3WrGPqiuqhJ60LVv4A5DMqT5c6hTVr4WbhP4DPEIPgfd5aq6U9_-H9WDyQYHKjnunLJEYtEREzmhTq3XsYeQ05DyE7hfnQ-zVoBb0CsAK7GdhihRTdvhXv2N9M04_rigyBP-roRcUgCqwyHuWJc0IPAyn3R4Mr43ZqgR2fn6dNV_YUVKn9c0nWxIwRnYy6Ff_Te9NoGVmXxkiNUX-90bBLKFiCzrRAtizxrTiQb2SRipaWbgOlV6wbMy2KNux' [metadata.nginx] restrict-to = [ From c699f0d5105e5234a2b8c1eb36c1eda012cc8d25 Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Fri, 27 Sep 2024 08:50:52 +0200 Subject: [PATCH 009/252] update element-web to 1.11.78 --- nodes/carlene.toml | 2 +- nodes/htz-cloud.afra.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/nodes/carlene.toml b/nodes/carlene.toml index 5466246..1ec3187 100644 --- a/nodes/carlene.toml +++ b/nodes/carlene.toml @@ -40,7 +40,7 @@ imap_pass = "!bwpass_attr:t-online.de/franzi.kunsmann@t-online.de:imap" [metadata.element-web] url = "chat.franzi.business" -version = "v1.11.77" +version = "v1.11.78" [metadata.element-web.config] default_server_config.'m.homeserver'.base_url = "https://matrix.franzi.business" default_server_config.'m.homeserver'.server_name = "franzi.business" diff --git a/nodes/htz-cloud.afra.toml b/nodes/htz-cloud.afra.toml index e75586d..443ffa3 100644 --- a/nodes/htz-cloud.afra.toml +++ b/nodes/htz-cloud.afra.toml @@ -32,7 +32,7 @@ routes.'172.19.128.0/20'.via = "172.19.137.1" [metadata.element-web] url = "element.afra.berlin" -version = "v1.11.77" +version = "v1.11.78" [metadata.element-web.config] default_server_config.'m.homeserver'.base_url = "https://matrix.afra.berlin" From 8a28886012b17faa12810aad809c152e48ad33df Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Fri, 27 Sep 2024 08:51:08 +0200 Subject: [PATCH 010/252] update netbox to 4.1.2 --- nodes/carlene.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nodes/carlene.toml b/nodes/carlene.toml index 1ec3187..7241f6c 100644 --- a/nodes/carlene.toml +++ b/nodes/carlene.toml @@ -126,7 +126,7 @@ domain = "rss.franzi.business" [metadata.netbox] domain = "netbox.franzi.business" -version = "v4.1.1" +version = "v4.1.2" admins.kunsi = "hostmaster@kunbox.net" [metadata.nextcloud] From 2564f416c22b203eb53f0a8a362c8e7777a951dc Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Fri, 27 Sep 2024 08:51:20 +0200 Subject: [PATCH 011/252] update paperless to 2.12.1 --- nodes/home/paperless.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nodes/home/paperless.py b/nodes/home/paperless.py index aeb9c78..859eb07 100644 --- a/nodes/home/paperless.py +++ b/nodes/home/paperless.py @@ -48,7 +48,7 @@ nodes['home.paperless'] = { }, 'paperless': { 'domain': 'paperless.home.kunbox.net', - 'version': 'v2.12.0', + 'version': 'v2.12.1', 'timezone': 'Europe/Berlin', }, 'postgresql': { From 7b6d811128371a07b83439663b1dc4cedc72f559 Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Fri, 27 Sep 2024 10:02:27 +0200 Subject: [PATCH 012/252] bundles/sshmon: better cpu check --- bundles/sshmon/files/check_cpu_stats | 25 ++++++++++++++----------- bundles/sshmon/metadata.py | 2 ++ 2 files changed, 16 insertions(+), 11 deletions(-) diff --git a/bundles/sshmon/files/check_cpu_stats b/bundles/sshmon/files/check_cpu_stats index 36e5ae3..c0985ef 100644 --- a/bundles/sshmon/files/check_cpu_stats +++ b/bundles/sshmon/files/check_cpu_stats @@ -4,27 +4,30 @@ from re import findall from subprocess import check_output from sys import exit +ITERATIONS = 10 + try: top_output = None - for line in check_output(['top', '-b', '-n1', '-d1']).decode('UTF-8').splitlines(): - if line.lower().strip().startswith('%cpu'): - top_output = line.lower().split(':', 2)[1] - break - - if not top_output: - print('%cpu not found in top output') - exit(3) + top_output = check_output(rf"top -b -n{ITERATIONS} -d1 | grep -i '^%cpu'", shell=True).decode('UTF-8') cpu_usage = {} for value, identifier in findall('([0-9\.\,]{3,5}) ([a-z]{2})', top_output): - cpu_usage[identifier] = float(value.replace(',', '.')) + if identifier not in cpu_usage: + cpu_usage[identifier] = 0.0 + cpu_usage[identifier] += float(value.replace(',', '.')) + + output = [] + for identifier, value_added in cpu_usage.items(): + value = value_added / ITERATIONS + output.append(f"{value:.2f} {identifier}") + cpu_usage[identifier] = value + + print(f"Average over {ITERATIONS} seconds: " + ", ".join(output)) warn = set() crit = set() - print(top_output) - # steal if cpu_usage['st'] > 10: crit.add('CPU steal is {}% (>10%)'.format(cpu_usage['st'])) diff --git a/bundles/sshmon/metadata.py b/bundles/sshmon/metadata.py index 8d5bb6b..2142623 100644 --- a/bundles/sshmon/metadata.py +++ b/bundles/sshmon/metadata.py @@ -19,6 +19,8 @@ defaults = { 'services': { 'CPU': { 'command_on_monitored_host': '/usr/local/share/icinga/plugins/check_cpu_stats', + # takes samples over 10 seconds + 'vars.sshmon_timeout': 20 }, 'LOAD': { 'command_on_monitored_host': '/usr/lib/nagios/plugins/check_load -r -w 4,2,1 -c 8,4,2', From 54f669313a37f443abb50b3e8faa099a67326316 Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Fri, 27 Sep 2024 10:15:50 +0200 Subject: [PATCH 013/252] home.nas: nas dataset goes ssd --- nodes/home/nas.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/nodes/home/nas.py b/nodes/home/nas.py index bf404e4..1122e43 100644 --- a/nodes/home/nas.py +++ b/nodes/home/nas.py @@ -300,7 +300,7 @@ nodes['home.nas'] = { 'acltype': 'off', 'atime': 'off', 'compression': 'off', - 'mountpoint': '/media/nas', + 'mountpoint': '/storage/nas', }, 'encrypted/paperless': { 'mountpoint': '/media/paperless', @@ -318,7 +318,7 @@ nodes['home.nas'] = { 'acltype': 'off', 'atime': 'off', 'compression': 'off', - 'mountpoint': '/storage/nas', + 'mountpoint': '/media/nas_old', }, 'storage/paperless': { 'mountpoint': '/srv/paperless', From 8c28d612cbcd820dbc96206c34ecc44635fc2d38 Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Fri, 27 Sep 2024 10:16:07 +0200 Subject: [PATCH 014/252] groups/sophie: fix group conflict --- groups/locations.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/groups/locations.py b/groups/locations.py index 8f56c2b..43e7674 100644 --- a/groups/locations.py +++ b/groups/locations.py @@ -61,6 +61,9 @@ groups['home'] = { } groups['sophie'] = { + 'supergroups': { + 'linux', + }, 'member_patterns': { r"sophie\..*", }, @@ -69,7 +72,7 @@ groups['sophie'] = { 'exclude_from_monitoring': True, }, 'backup-client': { - 'target': 'htz-hel.backup-sohpie', + 'target': 'htz-hel.backup-sophie', }, 'users': { 'sophie': {}, From 67f901c1c91aaa8274c27735163ed451842204c5 Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Fri, 27 Sep 2024 10:19:01 +0200 Subject: [PATCH 015/252] bundles/powerdnsadmin: fix dependencies --- bundles/powerdnsadmin/items.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bundles/powerdnsadmin/items.py b/bundles/powerdnsadmin/items.py index fb1bf0d..8398916 100644 --- a/bundles/powerdnsadmin/items.py +++ b/bundles/powerdnsadmin/items.py @@ -71,8 +71,8 @@ actions = { 'chown -R powerdnsadmin:powerdnsadmin /opt/powerdnsadmin/src/powerdnsadmin/static/', ]), 'needs': { - 'action:nodejs_install_yarn', 'action:powerdnsadmin_install_deps', + 'bundle:nodejs', 'pkg_apt:', }, }, From 8ba63e112c273f6f5939f641c0d1695dcf070485 Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Fri, 27 Sep 2024 10:22:58 +0200 Subject: [PATCH 016/252] bundles/sshmon: fix SyntaxWarning --- bundles/sshmon/files/check_cpu_stats | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bundles/sshmon/files/check_cpu_stats b/bundles/sshmon/files/check_cpu_stats index c0985ef..f0c3a35 100644 --- a/bundles/sshmon/files/check_cpu_stats +++ b/bundles/sshmon/files/check_cpu_stats @@ -12,7 +12,7 @@ try: top_output = check_output(rf"top -b -n{ITERATIONS} -d1 | grep -i '^%cpu'", shell=True).decode('UTF-8') cpu_usage = {} - for value, identifier in findall('([0-9\.\,]{3,5}) ([a-z]{2})', top_output): + for value, identifier in findall(r'([0-9\.\,]{3,5}) ([a-z]{2})', top_output): if identifier not in cpu_usage: cpu_usage[identifier] = 0.0 cpu_usage[identifier] += float(value.replace(',', '.')) From 52e891d3a7406f9c5e4924d82de4585ca94544f3 Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Sun, 29 Sep 2024 13:46:21 +0200 Subject: [PATCH 017/252] move afra.berlin redirect to carlene --- nodes/carlene.toml | 4 ++++ nodes/htz-cloud.afra.toml | 21 --------------------- 2 files changed, 4 insertions(+), 21 deletions(-) diff --git a/nodes/carlene.toml b/nodes/carlene.toml index 7241f6c..92ce624 100644 --- a/nodes/carlene.toml +++ b/nodes/carlene.toml @@ -136,6 +136,10 @@ domain = "warnochwas.de" contact = "mailto:security@kunsmann.eu" Encryption = "https://franzi.business/gpg_hi-kunsmann.eu.asc" +[metadata.nginx.vhosts.'afra.berlin'.locations.'/'] +redirect = "https://afra-berlin.de" +mode = 302 + [metadata.nginx.vhosts.forgejo] domain_aliases = ["git.kunsmann.eu"] diff --git a/nodes/htz-cloud.afra.toml b/nodes/htz-cloud.afra.toml index 443ffa3..b938c2f 100644 --- a/nodes/htz-cloud.afra.toml +++ b/nodes/htz-cloud.afra.toml @@ -65,27 +65,6 @@ trusted_key_servers = [ "matrix.org", "franzi.business", ] -wellknown_also_on_vhosts = ["redirect"] - -[metadata.nginx.vhosts.redirect] -domain = "afra.berlin" - -[metadata.nginx.vhosts.redirect.locations.'/'] -redirect = "https://afra-berlin.de" -mode = 302 - -#[metadata.nginx.vhosts.redirect.locations.'/.well-known/host-meta'] -#redirect = "https://fedi.afra.berlin/.well-known/host-meta" -#mode = 301 -#[metadata.nginx.vhosts.redirect.locations.'/.well-known/nodeinfo'] -#redirect = "https://fedi.afra.berlin/.well-known/nodeinfo" -#mode = 301 -#[metadata.nginx.vhosts.redirect.locations.'/.well-known/webfinger'] -#redirect = "https://fedi.afra.berlin/.well-known/webfinger" -#mode = 301 - -[metadata.nginx.vhosts.redirect.locations.'/matrix/'] -target = "http://127.0.0.1:20100/" [metadata.postgresql] version = "15" From 95860e978b919ab3ddf8a191eb39003568ff70cc Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Sun, 29 Sep 2024 16:17:48 +0200 Subject: [PATCH 018/252] remove htz-cloud.afra --- nodes/htz-cloud.afra.toml | 79 --------------------------------------- 1 file changed, 79 deletions(-) delete mode 100644 nodes/htz-cloud.afra.toml diff --git a/nodes/htz-cloud.afra.toml b/nodes/htz-cloud.afra.toml deleted file mode 100644 index b938c2f..0000000 --- a/nodes/htz-cloud.afra.toml +++ /dev/null @@ -1,79 +0,0 @@ -hostname = "91.107.203.234" -bundles = [ - "element-web", - "matrix-media-repo", - "matrix-registration", - "matrix-synapse", - "nodejs", - "postgresql", - "zfs", -] -groups = [ - "debian-bookworm", - "webserver", -] - -[metadata.icinga_options] -pretty_name = "afra.berlin" - -[metadata.interfaces.eth0] -ips = [ - "91.107.203.234/32", - "2a01:4f8:c010:b0e1::1/64", -] -gateway4 = '172.31.1.1' -gateway6 = 'fe80::1' - -[metadata.interfaces.ens10] -ips = [ - "172.19.137.7/32", -] -routes.'172.19.128.0/20'.via = "172.19.137.1" - -[metadata.element-web] -url = "element.afra.berlin" -version = "v1.11.78" - -[metadata.element-web.config] -default_server_config.'m.homeserver'.base_url = "https://matrix.afra.berlin" -default_server_config.'m.homeserver'.server_name = "afra.berlin" -brand = "afra.berlin" -defaultCountryCode = "DE" -jitsi.preferredDomain = "meet.ffmuc.net" - -[metadata.matrix-media-repo] -admins = ['@administress:afra.berlin'] -datastore_id = "e33b50474021fba9977f912414cdd7fe8890ed57" -sha1 = "3e2bb7089b0898b86000243a82cc58ae998dc9d9" -upload_max_mb = 50 -version = "v1.3.7" - -[metadata.matrix-media-repo.homeservers.'afra.berlin'] -domain = "http://[::1]:20080/" -api = "synapse" -signing_key_path = "/etc/matrix-synapse/mmr.signing.key" - -[metadata.matrix-registration] -base_path = "/matrix" -client_redirect = "https://element.afra.berlin" - -[metadata.matrix-synapse] -server_name = "afra.berlin" -baseurl = "matrix.afra.berlin" -admin_contact = 'mailto:hostmaster@kunbox.net' -trusted_key_servers = [ - "matrix.org", - "franzi.business", -] - -[metadata.postgresql] -version = "15" -work_mem = 1024 -cache_size = 2048 - -[[metadata.zfs.pools.tank.when_creating.config]] -devices = ["/dev/disk/by-id/scsi-0HC_Volume_32207877"] - -[metadata.vm] -cpu = 2 -ram = 8 From 663f7eec9f56b998b62e784e65cad3b1aafcd0fe Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Mon, 30 Sep 2024 10:20:01 +0200 Subject: [PATCH 019/252] remove finallycoffee.eu from trusted key servers --- nodes/carlene.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nodes/carlene.toml b/nodes/carlene.toml index 92ce624..19a59cc 100644 --- a/nodes/carlene.toml +++ b/nodes/carlene.toml @@ -90,7 +90,7 @@ user_id = "@dimension:franzi.business" admin_contact = "mailto:hostmaster@kunbox.net" baseurl = "matrix.franzi.business" server_name = "franzi.business" -trusted_key_servers = ["matrix.org", "finallycoffee.eu"] +trusted_key_servers = ["matrix.org", "161.rocks"] additional_client_config.'im.vector.riot.jitsi'.preferredDomain = "meet.ffmuc.net" wellknown_also_on_vhosts = ["franzi.business"] [metadata.matrix-synapse.sliding_sync] From e2b430fd0e112dd7752898e69ae6faa236627886 Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Mon, 30 Sep 2024 10:21:05 +0200 Subject: [PATCH 020/252] update travelynx to 2.8.40 --- nodes/carlene.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nodes/carlene.toml b/nodes/carlene.toml index 19a59cc..40a421b 100644 --- a/nodes/carlene.toml +++ b/nodes/carlene.toml @@ -260,7 +260,7 @@ disks = [ ] [metadata.travelynx] -version = "2.8.39" +version = "2.8.40" mail_from = "travelynx@franzi.business" domain = "travelynx.franzi.business" From a1d1351411566a8cde61cac13a473907a7a47dc6 Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Mon, 30 Sep 2024 22:24:34 +0200 Subject: [PATCH 021/252] update infobeamer-cms to current version --- bundles/infobeamer-cms/items.py | 10 +--------- nodes/voc/infobeamer-cms.py | 11 ++++++----- 2 files changed, 7 insertions(+), 14 deletions(-) diff --git a/bundles/infobeamer-cms/items.py b/bundles/infobeamer-cms/items.py index 2d2f8c0..aa424a1 100644 --- a/bundles/infobeamer-cms/items.py +++ b/bundles/infobeamer-cms/items.py @@ -23,7 +23,7 @@ actions = { git_deploy = { '/opt/infobeamer-cms/src': { 'rev': 'master', - 'repo': 'https://github.com/sophieschi/36c3-cms.git', + 'repo': 'https://github.com/voc/infobeamer-cms.git', 'needs': { 'directory:/opt/infobeamer-cms/src', }, @@ -96,14 +96,6 @@ files = { }, } -pkg_pip = { - 'github-flask': { - 'needed_by': { - 'svc_systemd:infobeamer-cms', - }, - }, -} - svc_systemd = { 'infobeamer-cms': { 'needs': { diff --git a/nodes/voc/infobeamer-cms.py b/nodes/voc/infobeamer-cms.py index 77c21c4..9e38edc 100644 --- a/nodes/voc/infobeamer-cms.py +++ b/nodes/voc/infobeamer-cms.py @@ -39,11 +39,6 @@ nodes['voc.infobeamer-cms'] = { 'GITHUB_CLIENT_SECRET': vault.decrypt('encrypt$gAAAAABiNwHtdZC2XQ8IjosL7vsmrxZMwDIM6AD5dUlLo996tJs4qV7KJETHgYYZil2aMzClwhcE6JmxdhARRp7IJQ4rQQibelTNmyYSzj_V4puVpvma7SU0UZkTIG95SdPpoHY--Zba'), 'HOSTED_API_KEY': vault.decrypt('encrypt$gAAAAABhxJPH2sIGMAibU2Us1HoCVlNfF0SQQnVl0eiod48Zu8webL_-xk3wDw3yXw1Hkglj-2usl-D3Yd095yTSq0vZMCv2fh-JWwSPdJewQ45x9Ai4vXVD4CNz5vuJBESKS9xQWXTc'), 'INTERRUPT_KEY': vault.human_password_for('infobeamer-cms interrupt key'), - 'MQTT_MESSAGE': '{{"level":"info","component":"infobeamer-cms","msg":"{asset} uploaded by {user}. Check it at {url}"}}', - 'MQTT_PASSWORD': vault.decrypt('encrypt$gAAAAABhxakfhhwWn0vxhoO1FiMEpdCkomWvo0dHIuBrqDKav8WDpI6dXpb0hoXiWRsPV6p5m-8RlbfFbjPhz47AY-nFOOAAW6Yis3-IVD-U-InKJo9dvms='), - 'MQTT_SERVER': 'mqtt.c3voc.de', - 'MQTT_TOPIC': '/voc/alert', - 'MQTT_USERNAME': vault.decrypt('encrypt$gAAAAABhxakKHC_kHmHP2mFHorb4niuNTH4F24w1D6m5JUxl117N7znlZA6fpMmY3_NcmBr2Ihw4hL3FjZr9Fm_1oUZ1ZQdADA=='), 'SETUP_IDS': [ 250294, ], @@ -56,6 +51,12 @@ nodes['voc.infobeamer-cms'] = { # 'x2': 110, # 'y2': 1070, # }], + 'NOTIFIER': { + 'MQTT_PASSWORD': vault.decrypt('encrypt$gAAAAABhxakfhhwWn0vxhoO1FiMEpdCkomWvo0dHIuBrqDKav8WDpI6dXpb0hoXiWRsPV6p5m-8RlbfFbjPhz47AY-nFOOAAW6Yis3-IVD-U-InKJo9dvms='), + 'MQTT_SERVER': 'mqtt.c3voc.de', + 'MQTT_TOPIC': '/voc/alert', + 'MQTT_USERNAME': vault.decrypt('encrypt$gAAAAABhxakKHC_kHmHP2mFHorb4niuNTH4F24w1D6m5JUxl117N7znlZA6fpMmY3_NcmBr2Ihw4hL3FjZr9Fm_1oUZ1ZQdADA=='), + }, }, 'rooms': { 'Saal 1': 34430, From 4fbbf83952a89f3115ba4b858167224920d67a39 Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Mon, 30 Sep 2024 22:24:53 +0200 Subject: [PATCH 022/252] update infobeamer-cms to debian bookworm --- nodes/voc/infobeamer-cms.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/nodes/voc/infobeamer-cms.py b/nodes/voc/infobeamer-cms.py index 9e38edc..152e199 100644 --- a/nodes/voc/infobeamer-cms.py +++ b/nodes/voc/infobeamer-cms.py @@ -1,12 +1,12 @@ nodes['voc.infobeamer-cms'] = { - 'hostname': 'infobeamer-cms.c3voc.de', + 'hostname': 'infobeamer.c3voc.de', 'bundles': { 'infobeamer-cms', 'infobeamer-monitor', 'redis', }, 'groups': { - 'debian-bullseye', + 'debian-bookworm', 'webserver', }, 'metadata': { From df69b876a9e8a7cf9c1077cc5d59a1292cb72d7a Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Mon, 30 Sep 2024 22:40:07 +0200 Subject: [PATCH 023/252] voc.infobeamer-cms: prepare for mrmcd --- nodes/voc/infobeamer-cms.py | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/nodes/voc/infobeamer-cms.py b/nodes/voc/infobeamer-cms.py index 152e199..ba41766 100644 --- a/nodes/voc/infobeamer-cms.py +++ b/nodes/voc/infobeamer-cms.py @@ -25,8 +25,8 @@ nodes['voc.infobeamer-cms'] = { }, 'infobeamer-cms': { 'domain': 'infobeamer.c3voc.de', - 'event_start_date': '2024-05-29', - 'event_duration_days': 5, + 'event_start_date': '2024-10-03', + 'event_duration_days': 4, 'config': { 'ADMIN_USERS': [ 'hexchen', @@ -59,15 +59,15 @@ nodes['voc.infobeamer-cms'] = { }, }, 'rooms': { - 'Saal 1': 34430, - 'Saal G': 26598, - 'Saal Z': 26610, - 'Saal E (SoS/Lightning-Talks)': 32814, - 'Saal F (Sendezentrum/DLF)': 9717, +# 'Saal 1': 34430, +# 'Saal G': 26598, +# 'Saal Z': 26610, +# 'Saal E (SoS/Lightning-Talks)': 32814, +# 'Saal F (Sendezentrum/DLF)': 9717, }, 'interrupts': { - 'Questions': 'questions', - 'Translations': 'translations', +# 'Questions': 'questions', +# 'Translations': 'translations', }, }, 'infobeamer-monitor': { From a5ea87b4e99c7392b78528008f734e906bce11ff Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Tue, 1 Oct 2024 10:53:04 +0200 Subject: [PATCH 024/252] voc.infobeamer-cms: fix mqtt config --- nodes/voc/infobeamer-cms.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nodes/voc/infobeamer-cms.py b/nodes/voc/infobeamer-cms.py index ba41766..0de3e17 100644 --- a/nodes/voc/infobeamer-cms.py +++ b/nodes/voc/infobeamer-cms.py @@ -53,7 +53,7 @@ nodes['voc.infobeamer-cms'] = { # }], 'NOTIFIER': { 'MQTT_PASSWORD': vault.decrypt('encrypt$gAAAAABhxakfhhwWn0vxhoO1FiMEpdCkomWvo0dHIuBrqDKav8WDpI6dXpb0hoXiWRsPV6p5m-8RlbfFbjPhz47AY-nFOOAAW6Yis3-IVD-U-InKJo9dvms='), - 'MQTT_SERVER': 'mqtt.c3voc.de', + 'MQTT_HOST': 'mqtt.c3voc.de', 'MQTT_TOPIC': '/voc/alert', 'MQTT_USERNAME': vault.decrypt('encrypt$gAAAAABhxakKHC_kHmHP2mFHorb4niuNTH4F24w1D6m5JUxl117N7znlZA6fpMmY3_NcmBr2Ihw4hL3FjZr9Fm_1oUZ1ZQdADA=='), }, From ef8d3368c163732a73c0253595a68f25f951ed8b Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Tue, 1 Oct 2024 11:03:50 +0200 Subject: [PATCH 025/252] voc.infobeamer-cms: add FAQ entries --- nodes/voc/infobeamer-cms.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/nodes/voc/infobeamer-cms.py b/nodes/voc/infobeamer-cms.py index 0de3e17..4f636a6 100644 --- a/nodes/voc/infobeamer-cms.py +++ b/nodes/voc/infobeamer-cms.py @@ -57,6 +57,15 @@ nodes['voc.infobeamer-cms'] = { 'MQTT_TOPIC': '/voc/alert', 'MQTT_USERNAME': vault.decrypt('encrypt$gAAAAABhxakKHC_kHmHP2mFHorb4niuNTH4F24w1D6m5JUxl117N7znlZA6fpMmY3_NcmBr2Ihw4hL3FjZr9Fm_1oUZ1ZQdADA=='), }, + 'FAQ': { + 'SOURCE': 'https://github.com/voc/infobeamer-cms', + 'CONTACT': ''' + Please use the IRC + Channel #infobeamer on irc.hackint.org (also + bridged to matrix) + or #info-beamer on the cccv rocketchat instance. + '''.strip(), + }, }, 'rooms': { # 'Saal 1': 34430, From b57f2056964fe8262fb40217d41f2929a1fca88f Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Wed, 2 Oct 2024 17:45:58 +0200 Subject: [PATCH 026/252] voc.infobeamer-cms: prepare for mrmcd24 --- nodes/voc/infobeamer-cms.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/nodes/voc/infobeamer-cms.py b/nodes/voc/infobeamer-cms.py index 4f636a6..a048c89 100644 --- a/nodes/voc/infobeamer-cms.py +++ b/nodes/voc/infobeamer-cms.py @@ -40,7 +40,7 @@ nodes['voc.infobeamer-cms'] = { 'HOSTED_API_KEY': vault.decrypt('encrypt$gAAAAABhxJPH2sIGMAibU2Us1HoCVlNfF0SQQnVl0eiod48Zu8webL_-xk3wDw3yXw1Hkglj-2usl-D3Yd095yTSq0vZMCv2fh-JWwSPdJewQ45x9Ai4vXVD4CNz5vuJBESKS9xQWXTc'), 'INTERRUPT_KEY': vault.human_password_for('infobeamer-cms interrupt key'), 'SETUP_IDS': [ - 250294, + 253559, ], # 'EXTRA_ASSETS': [{ # 'type': "image", @@ -56,6 +56,9 @@ nodes['voc.infobeamer-cms'] = { 'MQTT_HOST': 'mqtt.c3voc.de', 'MQTT_TOPIC': '/voc/alert', 'MQTT_USERNAME': vault.decrypt('encrypt$gAAAAABhxakKHC_kHmHP2mFHorb4niuNTH4F24w1D6m5JUxl117N7znlZA6fpMmY3_NcmBr2Ihw4hL3FjZr9Fm_1oUZ1ZQdADA=='), + 'NTFY': [ + vault.decrypt('encrypt$gAAAAABm_RXKqIgRfe24frA_uvUMwJECr0TmL6TWPOmrPlS0CJuuBlpN6vGHrMkm5pjD5c5h1brC-aqQavsTk_AHXwq8bHG1QiZtQwqPxGuD_fEVP4-xOZ3t-RjqG3kPLz6ebqPoqyPl'), + ], }, 'FAQ': { 'SOURCE': 'https://github.com/voc/infobeamer-cms', From 3ff7db7d6d743b7df7404645be8d6ee70b9dd437 Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Thu, 3 Oct 2024 22:43:25 +0200 Subject: [PATCH 027/252] bundles/sshmon: more letsencrypt issuer hashes --- bundles/sshmon/files/check_https_certificate_at_url | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/bundles/sshmon/files/check_https_certificate_at_url b/bundles/sshmon/files/check_https_certificate_at_url index e9fb507..ce0f0ba 100644 --- a/bundles/sshmon/files/check_https_certificate_at_url +++ b/bundles/sshmon/files/check_https_certificate_at_url @@ -22,7 +22,8 @@ case "$issuer_hash" in # 462422cf: issuer=C = US, O = Let's Encrypt, CN = E5 # 9aad238c: issuer=C = US, O = Let's Encrypt, CN = E6 # 31dfb39d: issuer=C = US, O = Let's Encrypt, CN = R11 - 4f06f81d|8d33f237|462422cf|9aad238c|31dfb39d) + # aa578057: issuer=C = US, O = Let's Encrypt, CN = R10 + 4f06f81d|8d33f237|462422cf|9aad238c|31dfb39d|aa578057) warn_days=10 crit_days=3 ;; From 814b67a9d033de19c88a713b6c832767579fad89 Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Sat, 5 Oct 2024 16:58:50 +0200 Subject: [PATCH 028/252] voc.infobeamer-cms add v0tti to admins --- nodes/voc/infobeamer-cms.py | 1 + 1 file changed, 1 insertion(+) diff --git a/nodes/voc/infobeamer-cms.py b/nodes/voc/infobeamer-cms.py index a048c89..ea48a85 100644 --- a/nodes/voc/infobeamer-cms.py +++ b/nodes/voc/infobeamer-cms.py @@ -34,6 +34,7 @@ nodes['voc.infobeamer-cms'] = { 'jwacalex', 'kunsi', 'sophieschi', + 'v0tti', ], 'GITHUB_CLIENT_ID': vault.decrypt('encrypt$gAAAAABiNwHfIu9PYFfJrF7qirn_9vdvvUlEhJnadoNSS5XlCDbI_aMyj21_ZYQxaCkc6_eVX6Cj1jEHZ7Vs6wM-XyQdW0nUOahtqG4uvnYCiM3GFKHW_wQ='), 'GITHUB_CLIENT_SECRET': vault.decrypt('encrypt$gAAAAABiNwHtdZC2XQ8IjosL7vsmrxZMwDIM6AD5dUlLo996tJs4qV7KJETHgYYZil2aMzClwhcE6JmxdhARRp7IJQ4rQQibelTNmyYSzj_V4puVpvma7SU0UZkTIG95SdPpoHY--Zba'), From c5fb1b8a2885632997f5728ef21f305976faeda4 Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Thu, 10 Oct 2024 19:39:38 +0200 Subject: [PATCH 029/252] htz-cloud.wireguard: add wg connection to fra-jana --- nodes/htz-cloud/wireguard.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/nodes/htz-cloud/wireguard.py b/nodes/htz-cloud/wireguard.py index 42c187d..df618ea 100644 --- a/nodes/htz-cloud/wireguard.py +++ b/nodes/htz-cloud/wireguard.py @@ -37,6 +37,7 @@ nodes['htz-cloud.wireguard'] = { '172.19.137.0/24', '172.19.136.62/31', '172.19.136.64/31', + '192.168.100.0/24', }, }, 'nftables': { @@ -80,6 +81,17 @@ nodes['htz-cloud.wireguard'] = { '10.73.0.0/16', }, }, + 'fra-jana': { + 'endpoint': 'gw.as212226.net:40000', + 'my_ip': '192.168.48.11/24', + 'my_port': 51802, + 'their_ip': '192.168.48.1', + 'pubkey': vault.decrypt('encrypt$gAAAAABnCA7M0Jg0cQwIaYCYEYN74MOSQK30rbhxD6tDIi2VEBqPh-UHrt7MdRzI4AUZ-p0MzjIdsps_DdGBkUTwA_UKD15Q_tg_LJNwDb04zvgSqc3hnJ4jeS2ZZEED0T1dVJ7E0YNS'), + 'masquerade': True, + 'routes': { + '192.168.100.0/24', + }, + }, 'kunsi-oneplus7': { 'endpoint': None, 'exclude_from_monitoring': True, From e35fbdd1834ac08ef8ede9a131e18237f59e9781 Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Thu, 10 Oct 2024 19:40:01 +0200 Subject: [PATCH 030/252] add rottenraptor-server --- nodes/rottenraptor-server.toml | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 nodes/rottenraptor-server.toml diff --git a/nodes/rottenraptor-server.toml b/nodes/rottenraptor-server.toml new file mode 100644 index 0000000..b73bba4 --- /dev/null +++ b/nodes/rottenraptor-server.toml @@ -0,0 +1,14 @@ +hostname = "172.19.138.98" +groups = ["debian-bookworm"] +bundles = ["ipmitool"] + +[metadata] +backups.exclude_from_backups = true + +[metadata.interfaces.eno4] +ips = [ + "91.198.192.207/27", + "2001:67c:b54:1::e/64", +] +gateway4 = "91.198.192.193" +gateway6 = "2001:67c:b54:1::1" From 07a44598d2bba277dd539f8de3f1cabd64d05063 Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Thu, 24 Oct 2024 18:16:48 +0200 Subject: [PATCH 031/252] rottenraptor-server is in its colo now --- nodes/rottenraptor-server-ipmi.toml | 7 +++++++ nodes/rottenraptor-server.toml | 5 ++++- 2 files changed, 11 insertions(+), 1 deletion(-) create mode 100644 nodes/rottenraptor-server-ipmi.toml diff --git a/nodes/rottenraptor-server-ipmi.toml b/nodes/rottenraptor-server-ipmi.toml new file mode 100644 index 0000000..fdc76b9 --- /dev/null +++ b/nodes/rottenraptor-server-ipmi.toml @@ -0,0 +1,7 @@ +dummy = true + +[metadata.icinga_options] +period = "daytime" + +[metadata.interfaces.default] +ips = ["192.168.100.27/24"] diff --git a/nodes/rottenraptor-server.toml b/nodes/rottenraptor-server.toml index b73bba4..6c60d62 100644 --- a/nodes/rottenraptor-server.toml +++ b/nodes/rottenraptor-server.toml @@ -1,10 +1,13 @@ -hostname = "172.19.138.98" +hostname = "91.198.192.207" groups = ["debian-bookworm"] bundles = ["ipmitool"] [metadata] backups.exclude_from_backups = true +[metadata.icinga_options] +period = "daytime" + [metadata.interfaces.eno4] ips = [ "91.198.192.207/27", From d1b369fb26ced0b6c67a3ec18c3ab9361deea116 Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Thu, 24 Oct 2024 19:25:00 +0200 Subject: [PATCH 032/252] bundles/smartd: do not try to guess disk names --- bundles/smartd/metadata.py | 24 ------------------------ nodes/carlene.toml | 4 ++-- nodes/home/nas.py | 8 ++++++++ 3 files changed, 10 insertions(+), 26 deletions(-) diff --git a/bundles/smartd/metadata.py b/bundles/smartd/metadata.py index 73789d0..5202068 100644 --- a/bundles/smartd/metadata.py +++ b/bundles/smartd/metadata.py @@ -43,30 +43,6 @@ if node.has_bundle('telegraf'): } -@metadata_reactor.provides( - 'smartd/disks', -) -def zfs_disks_to_metadata(metadata): - disks = set() - - for config in metadata.get('zfs/pools', {}).values(): - for option in config['when_creating']['config']: - if option.get('type', '') in {'log', 'cache'}: - continue - - for disk in option['devices']: - if search(r'p([0-9]+)$', disk) or disk.startswith('/dev/mapper/'): - continue - - disks.add(disk) - - return { - 'smartd': { - 'disks': disks, - }, - } - - @metadata_reactor.provides( 'icinga2_api/smartd/services', ) diff --git a/nodes/carlene.toml b/nodes/carlene.toml index 40a421b..42847d0 100644 --- a/nodes/carlene.toml +++ b/nodes/carlene.toml @@ -255,8 +255,8 @@ dkim = "uO4aNejDvVdw8BKne3KJIqAvCQMJ0416" [metadata.smartd] disks = [ - "/dev/nvme0", - "/dev/nvme1", + "/dev/disk/by-id/nvme-SAMSUNG_MZVL22T0HBLB-00B00_S677NF0W508470", + "/dev/disk/by-id/nvme-SAMSUNG_MZVL22T0HBLB-00B00_S677NX0W114380", ] [metadata.travelynx] diff --git a/nodes/home/nas.py b/nodes/home/nas.py index 1122e43..0415c87 100644 --- a/nodes/home/nas.py +++ b/nodes/home/nas.py @@ -190,6 +190,14 @@ nodes['home.nas'] = { 'disks': { '/dev/nvme0', + # old nas disks + '/dev/disk/by-id/ata-WDC_WD6003FFBX-68MU3N0_V8GE15GR', + '/dev/disk/by-id/ata-WDC_WD6003FFBX-68MU3N0_V8HJ406R', + '/dev/disk/by-id/ata-WDC_WD6003FFBX-68MU3N0_V8HJBTLR', + '/dev/disk/by-id/ata-WDC_WD6003FFBX-68MU3N0_V8HJGN6R', + '/dev/disk/by-id/ata-WDC_WD6003FFBX-68MU3N0_V8J8ZKRR', + '/dev/disk/by-id/ata-WDC_WD6003FFBX-68MU3N0_V9JS5UYL', + # encrypted disks '/dev/disk/by-id/ata-Samsung_SSD_870_QVO_8TB_S5SSNJ0X409404K', '/dev/disk/by-id/ata-Samsung_SSD_870_QVO_8TB_S5SSNJ0X409845F', From ed9607433d1e6923a954237e16ecc79f25c44d47 Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Thu, 24 Oct 2024 19:25:23 +0200 Subject: [PATCH 033/252] rottenraptor-server: add smartd and zfs --- nodes/rottenraptor-server.toml | 36 +++++++++++++++++++++++++++++++++- 1 file changed, 35 insertions(+), 1 deletion(-) diff --git a/nodes/rottenraptor-server.toml b/nodes/rottenraptor-server.toml index 6c60d62..b0dd56b 100644 --- a/nodes/rottenraptor-server.toml +++ b/nodes/rottenraptor-server.toml @@ -1,6 +1,6 @@ hostname = "91.198.192.207" groups = ["debian-bookworm"] -bundles = ["ipmitool"] +bundles = ["ipmitool", "smartd", "zfs"] [metadata] backups.exclude_from_backups = true @@ -15,3 +15,37 @@ ips = [ ] gateway4 = "91.198.192.193" gateway6 = "2001:67c:b54:1::1" + +[metadata.smartd] +disks = [ + "/dev/disk/by-id/ata-WDC_WD30EZRX-00DC0B0_WD-WMC1T0287704", + "/dev/disk/by-id/ata-WDC_WD30EZRX-00DC0B0_WD-WMC1T0387139", + "/dev/disk/by-id/ata-WDC_WDS100T1R0A-68A4W0_21133V800321", + "/dev/disk/by-id/ata-WDC_WDS100T1R0A-68A4W0_21283J446103", + "/dev/disk/by-id/nvme-TOSHIBA-RC100_58UPC29HPW5S", +] + +[metadata.zfs.pools.tank.when_creating] +ashift = 12 + +[[metadata.zfs.pools.tank.when_creating.config]] +type = "mirror" +devices = [ + "/dev/disk/by-id/ata-WDC_WD30EZRX-00DC0B0_WD-WMC1T0287704", + "/dev/disk/by-id/ata-WDC_WD30EZRX-00DC0B0_WD-WMC1T0387139", +] + +[[metadata.zfs.pools.tank.when_creating.config]] +type = "log" +devices = [ + "/dev/disk/by-id/ata-WDC_WDS100T1R0A-68A4W0_21133V800321-part1", + "/dev/disk/by-id/ata-WDC_WDS100T1R0A-68A4W0_21283J446103-part1", +] + +[[metadata.zfs.pools.tank.when_creating.config]] +type = "cache" +devices = [ + "/dev/disk/by-id/ata-WDC_WDS100T1R0A-68A4W0_21133V800321-part2", + "/dev/disk/by-id/ata-WDC_WDS100T1R0A-68A4W0_21283J446103-part2", +] + From a83b380490062b7616457c54a48808a200208bef Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Sat, 26 Oct 2024 08:19:43 +0200 Subject: [PATCH 034/252] bundles/nginx: more config options --- bundles/nginx/files/nginx.conf | 3 --- bundles/nginx/files/site_template | 6 +++--- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/bundles/nginx/files/nginx.conf b/bundles/nginx/files/nginx.conf index dae0a26..3f4a9a9 100644 --- a/bundles/nginx/files/nginx.conf +++ b/bundles/nginx/files/nginx.conf @@ -10,9 +10,6 @@ events { http { include /etc/nginx/mime.types; - types { - application/javascript js mjs; - } default_type application/octet-stream; charset UTF-8; override_charset on; diff --git a/bundles/nginx/files/site_template b/bundles/nginx/files/site_template index a967893..96875c8 100644 --- a/bundles/nginx/files/site_template +++ b/bundles/nginx/files/site_template @@ -149,18 +149,18 @@ server { % if 'target' in options: proxy_pass ${options['target']}; proxy_http_version ${options.get('http_version', '1.1')}; - proxy_set_header Host ${domain}; + proxy_set_header Host ${options.get('proxy_pass_host', domain)}; % if options.get('websockets', False): proxy_set_header Connection "upgrade"; proxy_set_header Upgrade $http_upgrade; % endif proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; - proxy_set_header X-Forwarded-Host ${options.get('x_forwarded_host', domain)}; + proxy_set_header X-Forwarded-Host ${options.get('x_forwarded_host', options.get('proxy_pass_host', domain))}; % for option, value in options.get('proxy_set_header', {}).items(): proxy_set_header ${option} ${value}; % endfor -% if location != '/': +% if location != '/' and location != '= /': proxy_set_header X-Script-Name ${location}; % endif proxy_buffering off; From 078d52c075d948a0af82ed42f41159aef4fe6f4a Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Sat, 26 Oct 2024 08:20:01 +0200 Subject: [PATCH 035/252] carlene: rework kunsitracker --- nodes/carlene.toml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/nodes/carlene.toml b/nodes/carlene.toml index 42847d0..e94a0b2 100644 --- a/nodes/carlene.toml +++ b/nodes/carlene.toml @@ -152,8 +152,10 @@ owner = "skye" [metadata.nginx.vhosts.kunsitracker] domain = "kunsitracker.de" -locations.'/'.redirect = "https://travelynx.franzi.business/p/Kunsi" -locations.'/'.mode = 302 +locations.'/'.target = "https://travelynx.franzi.business/" +locations.'/'.proxy_pass_host = "travelynx.franzi.business" +locations.'= /'.target = "https://travelynx.franzi.business/p/Kunsi" +locations.'= /'.proxy_pass_host = "travelynx.franzi.business" [metadata.nginx.vhosts.mta-sts] domain = "mta-sts.kunbox.net" From c4e3d0abc298db806471f480e620d43f5dd231c6 Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Sat, 26 Oct 2024 16:24:47 +0200 Subject: [PATCH 036/252] bundles/nginx: we need a type definition for .mjs --- bundles/nginx/files/nginx.conf | 3 +++ 1 file changed, 3 insertions(+) diff --git a/bundles/nginx/files/nginx.conf b/bundles/nginx/files/nginx.conf index 3f4a9a9..2c20144 100644 --- a/bundles/nginx/files/nginx.conf +++ b/bundles/nginx/files/nginx.conf @@ -10,6 +10,9 @@ events { http { include /etc/nginx/mime.types; + types { + application/javascript mjs; + } default_type application/octet-stream; charset UTF-8; override_charset on; From 729b975b776adb46f6ba85ef25a09b201df67c8a Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Sat, 26 Oct 2024 16:25:06 +0200 Subject: [PATCH 037/252] bundles/redis: ensure protected mode is off --- bundles/redis/files/redis.conf | 1 + 1 file changed, 1 insertion(+) diff --git a/bundles/redis/files/redis.conf b/bundles/redis/files/redis.conf index f479be2..f636ddf 100644 --- a/bundles/redis/files/redis.conf +++ b/bundles/redis/files/redis.conf @@ -48,3 +48,4 @@ tcp-keepalive 0 timeout 0 zset-max-ziplist-entries 128 zset-max-ziplist-value 64 +protected-mode no From 4238eeb6d8a658e2273d2246e030f84d408e7cc1 Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Sat, 26 Oct 2024 16:25:54 +0200 Subject: [PATCH 038/252] add bundle:docker-engine --- .../files/check_docker_container | 39 ++++++++ bundles/docker-engine/files/docker-wrapper | 50 ++++++++++ .../files/docker-wrapper.service | 14 +++ bundles/docker-engine/items.py | 99 +++++++++++++++++++ bundles/docker-engine/metadata.py | 83 ++++++++++++++++ bundles/nftables/metadata.py | 2 +- data/apt/files/gpg-keys/docker.asc | 62 ++++++++++++ 7 files changed, 348 insertions(+), 1 deletion(-) create mode 100644 bundles/docker-engine/files/check_docker_container create mode 100644 bundles/docker-engine/files/docker-wrapper create mode 100644 bundles/docker-engine/files/docker-wrapper.service create mode 100644 bundles/docker-engine/items.py create mode 100644 bundles/docker-engine/metadata.py create mode 100644 data/apt/files/gpg-keys/docker.asc diff --git a/bundles/docker-engine/files/check_docker_container b/bundles/docker-engine/files/check_docker_container new file mode 100644 index 0000000..2d8216a --- /dev/null +++ b/bundles/docker-engine/files/check_docker_container @@ -0,0 +1,39 @@ +#!/usr/bin/env python3 + +from json import loads +from subprocess import check_output +from sys import argv + +try: + container_name = argv[1] + + docker_ps = check_output([ + 'docker', + 'container', + 'ls', + '--all', + '--format', + 'json', + '--filter', + f'name={container_name}' + ]) + + containers = loads(f"[{','.join([l for l in docker_ps.decode().splitlines() if l])}]") + + if not containers: + print(f'CRITICAL: container {container_name} not found!') + exit(2) + + if len(containers) > 1: + print(f'Found more than one container matching {container_name}!') + print(docker_ps) + exit(3) + + if containers[0]['State'] != 'running': + print(f'WARNING: container {container_name} not "running"') + exit(2) + + print(f"OK: {containers[0]['Status']}") +except Exception as e: + print(repr(e)) + exit(2) diff --git a/bundles/docker-engine/files/docker-wrapper b/bundles/docker-engine/files/docker-wrapper new file mode 100644 index 0000000..c225ceb --- /dev/null +++ b/bundles/docker-engine/files/docker-wrapper @@ -0,0 +1,50 @@ +#!/bin/bash + +[[ -n "$DEBUG" ]] && set -x + +ACTION="$1" + +set -euo pipefail + +if [[ -z "$ACTION" ]] +then + echo "Usage: $0 start|stop" + exit 1 +fi + +PUID="$(id -u "docker-${name}")" +PGID="$(id -g "docker-${name}")" + +if [ "$ACTION" == "start" ] +then + docker run -d \ + --name "${name}" \ + --env "PUID=$PUID" \ + --env "PGID=$PGID" \ + --env "TZ=${timezone}" \ +% for k, v in sorted(environment.items()): + --env "${k}=${v}" \ +% endfor + --network host \ +% for host_port, container_port in sorted(ports.items()): + --expose "127.0.0.1:${host_port}:${container_port}" \ +% endfor +% for host_path, container_path in sorted(volumes.items()): + --volume "/var/opt/docker-engine/${name}/${host_path}:${container_path}" \ +% endfor + --restart unless-stopped \ + "${image}" + +elif [ "$ACTION" == "stop" ] +then + docker stop "${name}" + docker rm "${name}" + +else + echo "Unknown action $ACTION" + exit 1 +fi + +% if node.has_bundle('nftables'): +systemctl reload nftables +% endif diff --git a/bundles/docker-engine/files/docker-wrapper.service b/bundles/docker-engine/files/docker-wrapper.service new file mode 100644 index 0000000..a908c86 --- /dev/null +++ b/bundles/docker-engine/files/docker-wrapper.service @@ -0,0 +1,14 @@ +[Unit] +Description=docker-engine app ${name} +After=network.target +Requires=${' '.join(sorted(requires))} + +[Service] +WorkingDirectory=/var/opt/docker-engine/${name}/ +ExecStart=/opt/docker-engine/${name} start +ExecStop=/opt/docker-engine/${name} stop +Type=simple +RemainAfterExit=true + +[Install] +WantedBy=multi-user.target diff --git a/bundles/docker-engine/items.py b/bundles/docker-engine/items.py new file mode 100644 index 0000000..9e52eca --- /dev/null +++ b/bundles/docker-engine/items.py @@ -0,0 +1,99 @@ +from bundlewrap.metadata import metadata_to_json + +deps = { + 'pkg_apt:docker-ce', + 'pkg_apt:docker-ce-cli', +} + +directories['/opt/docker-engine'] = { + 'purge': True, +} +directories['/var/opt/docker-engine'] = {} + +files['/etc/docker/daemon.json'] = { + 'content': metadata_to_json(node.metadata.get('docker-engine/config')), + 'triggers': { + 'svc_systemd:docker:restart', + }, + # install config before installing packages to ensure the config is + # applied to the first start as well + 'before': deps, +} + +svc_systemd['docker'] = { + 'needs': deps, +} + +files['/usr/local/share/icinga/plugins/check_docker_container'] = { + 'mode': '0755', +} + +for app, config in node.metadata.get('docker-engine/containers', {}).items(): + volumes = config.get('volumes', {}) + + files[f'/opt/docker-engine/{app}'] = { + 'source': 'docker-wrapper', + 'content_type': 'mako', + 'context': { + 'environment': config.get('environment', {}), + 'image': config['image'], + 'name': app, + 'ports': config.get('ports', {}), + 'timezone': node.metadata.get('timezone'), + 'volumes': volumes, + }, + 'mode': '0755', + 'triggers': { + f'svc_systemd:docker-{app}:restart', + }, + } + + users[f'docker-{app}'] = { + 'home': f'/var/opt/docker-engine/{app}', + 'groups': { + 'docker', + }, + 'after': { + # provides docker group + 'pkg_apt:docker-ce', + }, + } + + files[f'/usr/local/lib/systemd/system/docker-{app}.service'] = { + 'source': 'docker-wrapper.service', + 'content_type': 'mako', + 'context': { + 'name': app, + 'requires': { + *set(config.get('requires', set())), + 'docker.service', + } + }, + 'triggers': { + 'action:systemd-reload', + f'svc_systemd:docker-{app}:restart', + }, + } + + svc_systemd[f'docker-{app}'] = { + 'needs': { + *deps, + f'file:/opt/docker-engine/{app}', + f'file:/usr/local/lib/systemd/system/docker-{app}.service', + f'user:docker-{app}', + 'svc_systemd:docker', + *set(config.get('needs', set())), + }, + } + + for volume in volumes: + directories[f'/var/opt/docker-engine/{app}/{volume}'] = { + 'owner': f'docker-{app}', + 'group': f'docker-{app}', + 'needed_by': { + f'svc_systemd:docker-{app}', + }, + # don't do anything if the directory exists, docker images + # mangle owners + 'unless': f'test -d /var/opt/docker-engine/{app}/{volume}', + } diff --git a/bundles/docker-engine/metadata.py b/bundles/docker-engine/metadata.py new file mode 100644 index 0000000..fa55b5e --- /dev/null +++ b/bundles/docker-engine/metadata.py @@ -0,0 +1,83 @@ +defaults = { + 'apt': { + 'packages': { + 'docker-ce': {}, + 'docker-ce-cli': {}, + 'docker-compose-plugin': {}, + }, + 'repos': { + 'docker': { + 'items': { + 'deb https://download.docker.com/linux/debian {os_release} stable', + }, + }, + }, + }, + 'backups': { + 'paths': { + '/var/opt/docker-engine', + }, + }, + 'hosts': { + 'entries': { + '172.17.0.1': { + 'host.docker.internal', + }, + }, + }, + 'docker-engine': { + 'config': { + 'iptables': False, + 'no-new-privileges': True, + }, + }, + 'zfs': { + 'datasets': { + 'tank/docker-data': { + 'mountpoint': '/var/opt/docker-engine', + }, + }, + }, +} + + +@metadata_reactor.provides( + 'icinga2_api/docker-engine/services', +) +def monitoring(metadata): + services = { + 'DOCKER PROCESS': { + 'command_on_monitored_host': '/usr/lib/nagios/plugins/check_procs -C dockerd -c 1:', + }, + } + + for app in metadata.get('docker-engine/containers', {}): + services[f'DOCKER CONTAINER {app}'] = { + 'command_on_monitored_host': f'sudo /usr/local/share/icinga/plugins/check_docker_container {app}' + } + + return { + 'icinga2_api': { + 'docker-engine': { + 'services': services, + }, + }, + } + + +@metadata_reactor.provides( + 'zfs/datasets', +) +def zfs(metadata): + datasets = {} + + for app in metadata.get('docker-engine/containers', {}): + datasets[f'tank/docker-data/{app}'] = { + 'mountpoint': f'/var/opt/docker-engine/{app}' + } + + return { + 'zfs': { + 'datasets': datasets, + }, + } diff --git a/bundles/nftables/metadata.py b/bundles/nftables/metadata.py index 8212d3c..15f34d4 100644 --- a/bundles/nftables/metadata.py +++ b/bundles/nftables/metadata.py @@ -29,7 +29,7 @@ defaults = { }, } -if not node.has_bundle('vmhost'): +if not node.has_bundle('vmhost') and not node.has_bundle('docker-engine'): # see comment in bundles/vmhost/items.py defaults['apt']['packages']['iptables'] = { 'installed': False, diff --git a/data/apt/files/gpg-keys/docker.asc b/data/apt/files/gpg-keys/docker.asc new file mode 100644 index 0000000..ee7872e --- /dev/null +++ b/data/apt/files/gpg-keys/docker.asc @@ -0,0 +1,62 @@ +-----BEGIN PGP PUBLIC KEY BLOCK----- + +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 +YT90qFF93M3v01BbxP+EIY2/9tiIPbrd +=0YYh +-----END PGP PUBLIC KEY BLOCK----- From 453d2a78891e676dc7a0847e5f1c399f0e4d8052 Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Sat, 26 Oct 2024 16:27:16 +0200 Subject: [PATCH 039/252] home.r630: add docker, fix firewall --- nodes/home.r630.toml | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/nodes/home.r630.toml b/nodes/home.r630.toml index 2a18418..cdfc4ba 100644 --- a/nodes/home.r630.toml +++ b/nodes/home.r630.toml @@ -1,9 +1,15 @@ hostname = "172.19.138.22" groups = ["debian-bookworm"] +bundles = ["docker-engine", "nginx", "redis"] [metadata] icinga_options.exclude_from_monitoring = true +[metadata.docker-engine.config] +# this is a dev machine, it's fine if docker does shenanigans with +# iptables +iptables = true + [metadata.interfaces.eno3] ips = [ "172.19.138.22/24", @@ -11,7 +17,7 @@ ips = [ gateway4 = "172.19.138.1" ipv6_accept_ra = true -[metadata.nftable.forward] +[metadata.nftables.forward] 50-local-forward = [ 'ct state { related, established } accept', 'iifname eno3 accept', From 2e8cbd60616eb60e4d4865e19e110d064e29d364 Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Sat, 26 Oct 2024 16:27:54 +0200 Subject: [PATCH 040/252] add bundle:docker-immich --- bundles/docker-immich/metadata.py | 64 +++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100644 bundles/docker-immich/metadata.py diff --git a/bundles/docker-immich/metadata.py b/bundles/docker-immich/metadata.py new file mode 100644 index 0000000..b41ea36 --- /dev/null +++ b/bundles/docker-immich/metadata.py @@ -0,0 +1,64 @@ +assert node.has_bundle('docker-engine') +assert node.has_bundle('redis') +assert not node.has_bundle('postgresql') # docker container uses that port + +defaults = { + 'docker-engine': { + 'containers': { + 'immich': { + 'image': 'ghcr.io/imagegenius/immich:latest', + 'environment': { + 'DB_DATABASE_NAME': 'immich', + 'DB_HOSTNAME': 'host.docker.internal', + 'DB_PASSWORD': repo.vault.password_for(f'{node.name} postgresql immich'), + 'DB_USERNAME': 'immich', + 'REDIS_HOSTNAME': 'host.docker.internal', + }, + 'volumes': { + 'config': '/config', + 'libraries': '/libraries', + 'photos': '/photos', + }, + 'needs': { + 'svc_systemd:docker-postgresql14', + }, + 'requires': { + 'docker-postgresql14.service', + }, + }, + 'postgresql14': { + 'image': 'tensorchord/pgvecto-rs:pg14-v0.2.0', + 'environment': { + 'POSTGRES_PASSWORD': repo.vault.password_for(f'{node.name} postgresql immich'), + 'POSTGRES_USER': 'immich', + 'POSTGRES_DB': 'immich', + }, + 'volumes': { + 'database': '/var/lib/postgresql/data', + }, + }, + }, + }, + 'nginx': { + 'vhosts': { + 'immich': { + 'locations': { + '/': { + 'target': 'http://127.0.0.1:8080/', + 'websockets': True, + 'max_body_size': '500m', + }, + #'/api/socket.io/': { + # 'target': 'http://127.0.0.1:8081/', + # 'websockets': True, + #}, + }, + }, + }, + }, + 'redis': { + 'bind': '0.0.0.0', + }, +} + + From 6647e714842bed36593009d90bbf0b7c6992a8e1 Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Sat, 26 Oct 2024 16:28:09 +0200 Subject: [PATCH 041/252] rottenraptor-server: add docker-immich --- nodes/rottenraptor-server.toml | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/nodes/rottenraptor-server.toml b/nodes/rottenraptor-server.toml index b0dd56b..5e53f81 100644 --- a/nodes/rottenraptor-server.toml +++ b/nodes/rottenraptor-server.toml @@ -1,9 +1,16 @@ hostname = "91.198.192.207" -groups = ["debian-bookworm"] -bundles = ["ipmitool", "smartd", "zfs"] - -[metadata] -backups.exclude_from_backups = true +groups = [ + "debian-bookworm", + "webserver", +] +bundles = [ + "docker-engine", + "docker-immich", + "ipmitool", + "redis", + "smartd", + "zfs", +] [metadata.icinga_options] period = "daytime" @@ -16,6 +23,9 @@ ips = [ gateway4 = "91.198.192.193" gateway6 = "2001:67c:b54:1::1" +[metadata.nginx.vhosts.immich] +domain = "rr-immich.franzi.business" + [metadata.smartd] disks = [ "/dev/disk/by-id/ata-WDC_WD30EZRX-00DC0B0_WD-WMC1T0287704", From 84867ff1e61a8091d255e31d0fe5cf08c6f7a075 Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Sun, 27 Oct 2024 11:19:05 +0100 Subject: [PATCH 042/252] bundles/postfix: provide myhostname from reactor --- bundles/dovecot/files/dovecot.conf | 4 ++-- bundles/postfix/files/main.cf | 6 +++--- bundles/postfix/items.py | 2 +- bundles/postfix/metadata.py | 13 ++++++++++++- 4 files changed, 18 insertions(+), 7 deletions(-) diff --git a/bundles/dovecot/files/dovecot.conf b/bundles/dovecot/files/dovecot.conf index 804c6a9..73afeaf 100644 --- a/bundles/dovecot/files/dovecot.conf +++ b/bundles/dovecot/files/dovecot.conf @@ -29,8 +29,8 @@ mail_location = maildir:/var/mail/vmail/%d/%n protocols = imap lmtp sieve ssl = required -ssl_cert = % if node.has_bundle('postfixadmin'): -smtpd_tls_cert_file = /var/lib/dehydrated/certs/${node.metadata.get('postfix/myhostname', node.metadata['hostname'])}/fullchain.pem -smtpd_tls_key_file = /var/lib/dehydrated/certs/${node.metadata.get('postfix/myhostname', node.metadata['hostname'])}/privkey.pem +smtpd_tls_cert_file = /var/lib/dehydrated/certs/${node.metadata.get('postfix/myhostname')}/fullchain.pem +smtpd_tls_key_file = /var/lib/dehydrated/certs/${node.metadata.get('postfix/myhostname')}/privkey.pem <%text> smtpd_use_tls=yes smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache diff --git a/bundles/postfix/items.py b/bundles/postfix/items.py index d1bf0c2..5518c90 100644 --- a/bundles/postfix/items.py +++ b/bundles/postfix/items.py @@ -25,7 +25,7 @@ my_package = 'pkg_pacman:postfix' if node.os == 'arch' else 'pkg_apt:postfix' files = { '/etc/mailname': { - 'content': node.metadata.get('postfix/myhostname', node.metadata['hostname']), + 'content': node.metadata.get('postfix/myhostname'), 'before': { my_package, }, diff --git a/bundles/postfix/metadata.py b/bundles/postfix/metadata.py index 4788de6..3c3be24 100644 --- a/bundles/postfix/metadata.py +++ b/bundles/postfix/metadata.py @@ -87,7 +87,7 @@ def letsencrypt(metadata): } result['domains'] = { - metadata.get('postfix/myhostname', metadata.get('hostname')): set(), + metadata.get('postfix/myhostname'): set(), } return { @@ -148,3 +148,14 @@ def icinga2(metadata): }, }, } + + +@metadata_reactor.provides( + 'postfix/myhostname', +) +def myhostname(metadata): + return { + 'postfix': { + 'myhostname': metadata.get('hostname'), + }, + } From 9bfb5312149ca432ff5cd3fb454977ee419eddea Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Sun, 27 Oct 2024 11:19:26 +0100 Subject: [PATCH 043/252] kunsi-p14s: clean up packages --- nodes/kunsi-p14s.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/nodes/kunsi-p14s.py b/nodes/kunsi-p14s.py index 5e63351..b94f2b0 100644 --- a/nodes/kunsi-p14s.py +++ b/nodes/kunsi-p14s.py @@ -97,16 +97,15 @@ nodes['kunsi-p14s'] = { 'xf86-video-amdgpu': {}, # all that other random stuff one needs - 'abcde': {}, - 'apachedirectorystudio': {}, + #'abcde': {}, 'claws-mail': {}, 'claws-mail-themes': {}, 'ferdium-bin': {}, 'gumbo-parser': {}, # for claws litehtml 'inkstitch': {}, # for RZL embroidery machine 'obs-studio': {}, - 'perl-musicbrainz-discid': {}, # for abcde - 'perl-webservice-musicbrainz': {}, # for abcde + #'perl-musicbrainz-discid': {}, # for abcde + #'perl-webservice-musicbrainz': {}, # for abcde 'sdl_ttf': {}, # for compiling testcard 'x32edit': {}, }, From ec8af84fb1000011318e5da4384b0bb89d67dd16 Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Sun, 27 Oct 2024 11:19:42 +0100 Subject: [PATCH 044/252] bundles/postfix: add devnull@myhostname mail address --- bundles/postfix/files/blocked_recipients | 2 ++ bundles/postfix/files/main.cf | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/bundles/postfix/files/blocked_recipients b/bundles/postfix/files/blocked_recipients index 736e9d4..4aff372 100644 --- a/bundles/postfix/files/blocked_recipients +++ b/bundles/postfix/files/blocked_recipients @@ -1,3 +1,5 @@ +devnull@${node.metadata.get('postfix/myhostname')} DISCARD DEV-NULL + % for address in sorted(blocked): ${address} REJECT % endfor diff --git a/bundles/postfix/files/main.cf b/bundles/postfix/files/main.cf index e0261b0..770114b 100644 --- a/bundles/postfix/files/main.cf +++ b/bundles/postfix/files/main.cf @@ -48,7 +48,7 @@ smtpd_client_restrictions = permit_mynetworks permit_sasl_authenticated smtpd_helo_required = yes smtpd_helo_restrictions = permit_mynetworks reject_invalid_helo_hostname smtpd_data_restrictions = reject_unauth_pipelining -smtpd_recipient_restrictions = permit_mynetworks, check_recipient_access hash:/etc/postfix/blocked_recipients +smtpd_recipient_restrictions = check_recipient_access hash:/etc/postfix/blocked_recipients, permit_mynetworks smtpd_relay_before_recipient_restrictions = yes # https://ssl-config.mozilla.org/#server=postfix&version=3.7.10&config=intermediate&openssl=3.0.11&guideline=5.7 From 58964cc10f376e230f78ab0a0543fb10295ee5ac Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Sun, 27 Oct 2024 11:21:12 +0100 Subject: [PATCH 045/252] bundles/rspamd: send dmarc report emails from devnull address --- bundles/rspamd/files/local.d/dmarc.conf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/bundles/rspamd/files/local.d/dmarc.conf b/bundles/rspamd/files/local.d/dmarc.conf index fa42ec0..195361e 100644 --- a/bundles/rspamd/files/local.d/dmarc.conf +++ b/bundles/rspamd/files/local.d/dmarc.conf @@ -1,7 +1,7 @@ reporting { enabled = true; - email = 'dmarc+${node.name.replace('.', '-')}@kunbox.net'; - domain = '${node.metadata.get('hostname')}'; + email = 'devnull@${node.metadata.get('postfix/myhostname')}'; + domain = '${node.metadata.get('postfix/myhostname')}'; org_name = 'kunbox.net'; smtp = '127.0.0.1'; smtp_port = 25; From 4f0ced4d9a696a7553a70363fc7291640fb34510 Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Sun, 27 Oct 2024 17:37:14 +0100 Subject: [PATCH 046/252] bundles/homeassistant: fix version check --- bundles/homeassistant/files/check_homeassistant_update | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/bundles/homeassistant/files/check_homeassistant_update b/bundles/homeassistant/files/check_homeassistant_update index 0e6f2e8..853c467 100644 --- a/bundles/homeassistant/files/check_homeassistant_update +++ b/bundles/homeassistant/files/check_homeassistant_update @@ -2,7 +2,7 @@ from sys import exit -from packaging import version +from packaging.version import parse from requests import get API_TOKEN = "${token}" @@ -11,7 +11,7 @@ DOMAIN = "${domain}" try: r = get("https://version.home-assistant.io/stable.json") r.raise_for_status() - stable_version = r.json()["homeassistant"]["generic-x86-64"] + stable_version = parse(r.json()["homeassistant"]["generic-x86-64"]) except Exception as e: print(f"Could not get stable version information from home-assistant.io: {e!r}") exit(3) @@ -22,7 +22,7 @@ try: headers={"Authorization": f"Bearer {API_TOKEN}", "Content-Type": "application/json"}, ) r.raise_for_status() - running_version = r.json()["version"] + running_version = parse(r.json()["version"]) except Exception as e: print(f"Could not get running version information from homeassistant: {e!r}") exit(3) From 9b0e6272745924a6349edbf4c5f89b534bec853d Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Sun, 27 Oct 2024 17:45:22 +0100 Subject: [PATCH 047/252] bundles/homeassistant: ensure virtualenv is in PATH --- bundles/homeassistant/files/homeassistant.service | 2 ++ 1 file changed, 2 insertions(+) diff --git a/bundles/homeassistant/files/homeassistant.service b/bundles/homeassistant/files/homeassistant.service index a650f17..ed0f2a9 100644 --- a/bundles/homeassistant/files/homeassistant.service +++ b/bundles/homeassistant/files/homeassistant.service @@ -5,6 +5,8 @@ After=network-online.target [Service] Type=simple User=homeassistant +Environment="VIRTUAL_ENV=/opt/homeassistant/venv" +Environment="PATH=/opt/homeassistant/venv/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" WorkingDirectory=/var/opt/homeassistant ExecStart=/opt/homeassistant/venv/bin/hass -c "/var/opt/homeassistant" RestartForceExitStatus=100 From 12c735f4aa1460dfc2cbebd4baba24b568524600 Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Mon, 28 Oct 2024 16:16:10 +0100 Subject: [PATCH 048/252] update element-web to 1.11.82 --- nodes/carlene.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nodes/carlene.toml b/nodes/carlene.toml index e94a0b2..be10e09 100644 --- a/nodes/carlene.toml +++ b/nodes/carlene.toml @@ -40,7 +40,7 @@ imap_pass = "!bwpass_attr:t-online.de/franzi.kunsmann@t-online.de:imap" [metadata.element-web] url = "chat.franzi.business" -version = "v1.11.78" +version = "v1.11.82" [metadata.element-web.config] default_server_config.'m.homeserver'.base_url = "https://matrix.franzi.business" default_server_config.'m.homeserver'.server_name = "franzi.business" From 1be5ab268b4252bcb82191ecbbcc672bdcd0f841 Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Mon, 28 Oct 2024 16:16:24 +0100 Subject: [PATCH 049/252] update forgejo to 9.0.1 --- nodes/carlene.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/nodes/carlene.toml b/nodes/carlene.toml index be10e09..f9bc638 100644 --- a/nodes/carlene.toml +++ b/nodes/carlene.toml @@ -49,8 +49,8 @@ defaultCountryCode = "DE" jitsi.preferredDomain = "meet.ffmuc.net" [metadata.forgejo] -version = "8.0.3" -sha1 = "a19aa24f26c1ff5a38cf12619b6a6064242d0cf2" +version = "9.0.1" +sha1 = "060d9f00aaf595875eaf1897cbb24e760ef54d64" domain = "git.franzi.business" enable_git_hooks = true install_ssh_key = true From c006748165ee114d3ac417c2ae90ef4eb356fd3d Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Mon, 28 Oct 2024 16:16:36 +0100 Subject: [PATCH 050/252] update mautrix-whatsapp to 0.11.0 --- nodes/carlene.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/nodes/carlene.toml b/nodes/carlene.toml index f9bc638..3949e12 100644 --- a/nodes/carlene.toml +++ b/nodes/carlene.toml @@ -114,8 +114,8 @@ provisioning.shared_secret = "!decrypt:encrypt$gAAAAABfVKflEMAi07C_QGP8cy97hF-4g "'@kunsi:franzi.business'" = "admin" [metadata.mautrix-whatsapp] -version = "v0.10.9" -sha1 = "1619579ec6b9fca84fec085a94842d309d3f730c" +version = "v0.11.0" +sha1 = "997c794eb246e6cc67ac050c106d54f88531f213" permissions."'@kunsi:franzi.business'" = "admin" [metadata.mautrix-whatsapp.homeserver] domain = "franzi.business" From 6eb2c6651b7f4df7c21697cd2d8e728751c85053 Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Mon, 28 Oct 2024 16:16:48 +0100 Subject: [PATCH 051/252] update netbox to 4.1.4 --- nodes/carlene.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nodes/carlene.toml b/nodes/carlene.toml index 3949e12..9f4a66d 100644 --- a/nodes/carlene.toml +++ b/nodes/carlene.toml @@ -126,7 +126,7 @@ domain = "rss.franzi.business" [metadata.netbox] domain = "netbox.franzi.business" -version = "v4.1.2" +version = "v4.1.4" admins.kunsi = "hostmaster@kunbox.net" [metadata.nextcloud] From f6cb540007dee76d796ef55109e4b0c64ac0fe79 Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Mon, 28 Oct 2024 16:17:16 +0100 Subject: [PATCH 052/252] update paperless-ngx to 2.13.0 --- nodes/home/paperless.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nodes/home/paperless.py b/nodes/home/paperless.py index 859eb07..ded32c5 100644 --- a/nodes/home/paperless.py +++ b/nodes/home/paperless.py @@ -48,7 +48,7 @@ nodes['home.paperless'] = { }, 'paperless': { 'domain': 'paperless.home.kunbox.net', - 'version': 'v2.12.1', + 'version': 'v2.13.0', 'timezone': 'Europe/Berlin', }, 'postgresql': { From e29a838fad051196347df912dfe86eb1edd7d95c Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Mon, 28 Oct 2024 16:54:53 +0100 Subject: [PATCH 053/252] bundles/forgejo: fix website_check_string --- bundles/forgejo/metadata.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bundles/forgejo/metadata.py b/bundles/forgejo/metadata.py index 714568f..16190e2 100644 --- a/bundles/forgejo/metadata.py +++ b/bundles/forgejo/metadata.py @@ -100,7 +100,7 @@ def nginx(metadata): }, }, 'website_check_path': '/user/login', - 'website_check_string': 'Sign In', + 'website_check_string': 'Sign in', }, }, }, From 46ec4cc2e7af4197dd58eba4a340d80780d3a140 Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Mon, 28 Oct 2024 16:55:10 +0100 Subject: [PATCH 054/252] bundles/postgresql: please also always do dumps --- bundles/postgresql/items.py | 6 +----- bundles/postgresql/metadata.py | 3 +-- 2 files changed, 2 insertions(+), 7 deletions(-) diff --git a/bundles/postgresql/items.py b/bundles/postgresql/items.py index f9cdc46..0a1b09f 100644 --- a/bundles/postgresql/items.py +++ b/bundles/postgresql/items.py @@ -57,7 +57,7 @@ files = { }, } -if node.has_bundle('backup-client') and not node.has_bundle('zfs'): +if node.has_bundle('backup-client'): files['/etc/backup-pre-hooks.d/90-postgresql-dump-all'] = { 'source': 'backup-pre-hook', 'content_type': 'mako', @@ -67,10 +67,6 @@ if node.has_bundle('backup-client') and not node.has_bundle('zfs'): 'mode': '0700', } directories['/var/tmp/postgresdumps'] = {} -else: - files['/var/tmp/postgresdumps'] = { - 'delete': True, - } postgres_roles = { 'root': { diff --git a/bundles/postgresql/metadata.py b/bundles/postgresql/metadata.py index e69a117..b624bae 100644 --- a/bundles/postgresql/metadata.py +++ b/bundles/postgresql/metadata.py @@ -11,6 +11,7 @@ defaults = { 'backups': { 'paths': { '/var/lib/postgresql', + '/var/tmp/postgresdumps', }, }, 'bash_functions': { @@ -74,8 +75,6 @@ if node.has_bundle('zfs'): }, }, } -else: - defaults['backups']['paths'].add('/var/tmp/postgresdumps') @metadata_reactor.provides( From 6f5b862a38828dc2392a01c119ab9d52806479b6 Mon Sep 17 00:00:00 2001 From: Sophie Schiller Date: Wed, 30 Oct 2024 20:41:13 +0100 Subject: [PATCH 055/252] sophies backupserver hostname --- nodes/sophie/backupserver.py | 1 + 1 file changed, 1 insertion(+) diff --git a/nodes/sophie/backupserver.py b/nodes/sophie/backupserver.py index efabae1..42c6292 100644 --- a/nodes/sophie/backupserver.py +++ b/nodes/sophie/backupserver.py @@ -37,6 +37,7 @@ nodes['htz-hel.backup-sophie'] = { }, 'backup-server': { 'zfs-base': 'tank/backups', + 'my_hostname': 'backup.sophies-kitchen.eu', }, 'nftables': { 'input': { From c1c3e1f9289dc6492a37244b9b3e28434414523a Mon Sep 17 00:00:00 2001 From: Sophie Schiller Date: Wed, 30 Oct 2024 20:41:42 +0100 Subject: [PATCH 056/252] miniserver: diverse updates --- nodes/sophie/miniserver.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/nodes/sophie/miniserver.py b/nodes/sophie/miniserver.py index 2656fa5..5088f87 100644 --- a/nodes/sophie/miniserver.py +++ b/nodes/sophie/miniserver.py @@ -62,7 +62,7 @@ nodes['htz-cloud.miniserver'] = { }, 'element-web': { 'url': 'chat.sophies-kitchen.eu', - 'version': 'v1.11.76', + 'version': 'v1.11.83', 'config': { 'default_server_config': { 'm.homeserver': { @@ -81,7 +81,7 @@ nodes['htz-cloud.miniserver'] = { }, }, 'hedgedoc': { - 'version': '1.9.9', + 'version': '1.10.0', 'config': { 'production': { 'allowAnonymousEdits': True, From ec49c8d3ffce91cfa3c5ba9c9e1eedbf5b9edb75 Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Thu, 31 Oct 2024 16:36:07 +0100 Subject: [PATCH 057/252] voc.infobeamer-cms: hackint changed their webirc service --- nodes/voc/infobeamer-cms.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nodes/voc/infobeamer-cms.py b/nodes/voc/infobeamer-cms.py index ea48a85..b5dae71 100644 --- a/nodes/voc/infobeamer-cms.py +++ b/nodes/voc/infobeamer-cms.py @@ -64,7 +64,7 @@ nodes['voc.infobeamer-cms'] = { 'FAQ': { 'SOURCE': 'https://github.com/voc/infobeamer-cms', 'CONTACT': ''' - Please use the IRC + Please use the IRC Channel #infobeamer on irc.hackint.org (also bridged to matrix) or #info-beamer on the cccv rocketchat instance. From 2c83a5c4fccf1034bcab70261515c94a896a9c4b Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Thu, 31 Oct 2024 16:58:26 +0100 Subject: [PATCH 058/252] voc.infobeamer-cms: prepare for 38c3 --- nodes/voc/infobeamer-cms.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/nodes/voc/infobeamer-cms.py b/nodes/voc/infobeamer-cms.py index b5dae71..f0dc6cf 100644 --- a/nodes/voc/infobeamer-cms.py +++ b/nodes/voc/infobeamer-cms.py @@ -25,8 +25,8 @@ nodes['voc.infobeamer-cms'] = { }, 'infobeamer-cms': { 'domain': 'infobeamer.c3voc.de', - 'event_start_date': '2024-10-03', - 'event_duration_days': 4, + 'event_start_date': '2024-12-26', + 'event_duration_days': 5, 'config': { 'ADMIN_USERS': [ 'hexchen', @@ -39,7 +39,7 @@ nodes['voc.infobeamer-cms'] = { 'GITHUB_CLIENT_ID': vault.decrypt('encrypt$gAAAAABiNwHfIu9PYFfJrF7qirn_9vdvvUlEhJnadoNSS5XlCDbI_aMyj21_ZYQxaCkc6_eVX6Cj1jEHZ7Vs6wM-XyQdW0nUOahtqG4uvnYCiM3GFKHW_wQ='), 'GITHUB_CLIENT_SECRET': vault.decrypt('encrypt$gAAAAABiNwHtdZC2XQ8IjosL7vsmrxZMwDIM6AD5dUlLo996tJs4qV7KJETHgYYZil2aMzClwhcE6JmxdhARRp7IJQ4rQQibelTNmyYSzj_V4puVpvma7SU0UZkTIG95SdPpoHY--Zba'), 'HOSTED_API_KEY': vault.decrypt('encrypt$gAAAAABhxJPH2sIGMAibU2Us1HoCVlNfF0SQQnVl0eiod48Zu8webL_-xk3wDw3yXw1Hkglj-2usl-D3Yd095yTSq0vZMCv2fh-JWwSPdJewQ45x9Ai4vXVD4CNz5vuJBESKS9xQWXTc'), - 'INTERRUPT_KEY': vault.human_password_for('infobeamer-cms interrupt key'), + 'INTERRUPT_KEY': vault.human_password_for('infobeamer-cms interrupt key 38c3', words=1), 'SETUP_IDS': [ 253559, ], From 72638e0856c8dc100f4ca067eaa4d2693f004368 Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Sun, 3 Nov 2024 17:40:46 +0100 Subject: [PATCH 059/252] bundles/infobeamer-monitor: add account data monitoring --- bundles/infobeamer-monitor/files/monitor.py | 72 ++++++++++++++++----- 1 file changed, 57 insertions(+), 15 deletions(-) diff --git a/bundles/infobeamer-monitor/files/monitor.py b/bundles/infobeamer-monitor/files/monitor.py index 6f353e6..2aa2daf 100644 --- a/bundles/infobeamer-monitor/files/monitor.py +++ b/bundles/infobeamer-monitor/files/monitor.py @@ -61,8 +61,6 @@ def mqtt_dump_state(device): out.append("Location: {}".format(device["location"])) out.append("Setup: {} ({})".format(device["setup"]["name"], device["setup"]["id"])) out.append("Resolution: {}".format(device["run"].get("resolution", "unknown"))) - if not device["is_synced"]: - out.append("syncing ...") mqtt_out( " - ".join(out), @@ -73,6 +71,9 @@ def mqtt_dump_state(device): mqtt_out("Monitor starting up") while True: try: + online_devices = set() + available_credits = None + try: r = get( "https://info-beamer.com/api/v1/device/list", @@ -88,7 +89,6 @@ while True: ) else: new_state = {} - online_devices = set() for device in ib_state: did = str(device["id"]) @@ -140,16 +140,15 @@ while True: if device["is_online"]: if device["maintenance"]: mqtt_out( - "maintenance required: {}".format(' '.join( - sorted(device["maintenance"]) - )), + "maintenance required: {}".format( + " ".join(sorted(device["maintenance"])) + ), level="WARN", device=device, ) if ( - device["is_synced"] != state[did]["is_synced"] - or device["location"] != state[did]["location"] + device["location"] != state[did]["location"] or device["setup"]["id"] != state[did]["setup"]["id"] or device["run"].get("resolution") != state[did]["run"].get("resolution") @@ -171,13 +170,56 @@ while True: state = new_state - if ( - datetime.now(timezone.utc).strftime("%H%M") == "1312" - and online_devices - and int(datetime.now(timezone.utc).strftime("%S")) < 30 - ): - mqtt_out("Online Devices: {}".format(", ".join(sorted(online_devices)))) - sleep(30) + try: + r = get( + "https://info-beamer.com/api/v1/account", + auth=("", CONFIG["api_key"]), + ) + r.raise_for_status() + ib_account = r.json() + except RequestException as e: + LOG.exception("Could not get data from info-beamer") + mqtt_out( + f"Could not get data from info-beamer: {e!r}", + level="WARN", + ) + else: + available_credits = ib_account["balance"] + if available_credits < 50: + mqtt_out( + f"balance has dropped below 50 credits! (available: {available_credits})", + level="ERROR", + ) + elif available_credits < 100: + mqtt_out( + f"balance has dropped below 100 credits! (available: {available_credits})", + level="WARN", + ) + + for quota_name, quota_config in sorted(ib_account["quotas"].items()): + value = quota_config["count"]["value"] + limit = quota_config["count"]["limit"] + if value > limit * 0.9: + mqtt_out( + f"quota {quota_name} is over 90% (limit {limit}, value {value})", + level="ERROR", + ) + elif value > limit * 0.8: + mqtt_out( + f"quota {quota_name} is over 80% (limit {limit}, value {value})", + level="WARN", + ) + + if datetime.now(timezone.utc).strftime("%H%M") == "1312": + if available_credits is not None: + mqtt_out(f"Available Credits: {available_credits}") + + if online_devices: + mqtt_out( + "Online Devices: {}".format(", ".join(sorted(online_devices))) + ) + + sleep(60) except KeyboardInterrupt: break From e51c24f837b116c033b639ddfcc90ad59b3ddad3 Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Fri, 8 Nov 2024 06:39:05 +0100 Subject: [PATCH 060/252] bundles/powerdns: use *repo* commit time instead of *file* commit time for serial --- bundles/powerdns/items.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/bundles/powerdns/items.py b/bundles/powerdns/items.py index a0c89d2..329694a 100644 --- a/bundles/powerdns/items.py +++ b/bundles/powerdns/items.py @@ -2,6 +2,7 @@ from datetime import datetime from os import listdir from os.path import isfile, join from subprocess import check_output +from bundlewrap.utils.ui import io zone_path = join(repo.path, 'data', 'powerdns', 'files', 'bind-zones') @@ -79,9 +80,10 @@ if node.metadata.get('powerdns/features/bind', False): continue try: - output = check_output(['git', 'log', '-1', '--pretty=%ci', join(zone_path, zone)]).decode('utf-8').strip() + output = check_output(['git', 'log', '-1', '--pretty=%ci']).decode('utf-8').strip() serial = datetime.strptime(output, '%Y-%m-%d %H:%M:%S %z').strftime('%y%m%d%H%M') - except: + except Exception as e: + io.stderr(f"Error while parsing commit time for {zone} serial: {e!r}") serial = datetime.now().strftime('%y%m%d0000') primary_zones.add(zone) From 209dedccf90b5e1ad164ec39cb21c1fb7b998740 Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Fri, 8 Nov 2024 06:39:59 +0100 Subject: [PATCH 061/252] `isort` the whole repo --- bundles/powerdns/items.py | 1 + bundles/pppd/files/dyndns | 1 - bundles/pppd/files/dyndns_periodic | 1 - bundles/routeros/metadata.py | 1 - libs/demagify.py | 1 + libs/ssh.py | 6 +++--- nodes/attributes.py | 5 +++-- 7 files changed, 8 insertions(+), 8 deletions(-) diff --git a/bundles/powerdns/items.py b/bundles/powerdns/items.py index 329694a..b6a5e8f 100644 --- a/bundles/powerdns/items.py +++ b/bundles/powerdns/items.py @@ -2,6 +2,7 @@ from datetime import datetime from os import listdir from os.path import isfile, join from subprocess import check_output + from bundlewrap.utils.ui import io zone_path = join(repo.path, 'data', 'powerdns', 'files', 'bind-zones') diff --git a/bundles/pppd/files/dyndns b/bundles/pppd/files/dyndns index 5058b2f..633915f 100644 --- a/bundles/pppd/files/dyndns +++ b/bundles/pppd/files/dyndns @@ -7,7 +7,6 @@ from subprocess import check_output from requests import get - UPDATE_URL = '${url}' USERNAME = '${username}' PASSWORD = '${password}' diff --git a/bundles/pppd/files/dyndns_periodic b/bundles/pppd/files/dyndns_periodic index 236c4fc..353ee6d 100644 --- a/bundles/pppd/files/dyndns_periodic +++ b/bundles/pppd/files/dyndns_periodic @@ -5,7 +5,6 @@ from ipaddress import ip_address from json import loads from subprocess import check_output, run - DOMAIN = '${domain}' # <%text> diff --git a/bundles/routeros/metadata.py b/bundles/routeros/metadata.py index ca7979f..e987a4e 100644 --- a/bundles/routeros/metadata.py +++ b/bundles/routeros/metadata.py @@ -2,7 +2,6 @@ import re from json import load from os.path import join - with open(join(repo.path, 'configs', 'netbox', f'{node.name}.json')) as f: netbox = load(f) diff --git a/libs/demagify.py b/libs/demagify.py index 5fe492c..02180f0 100644 --- a/libs/demagify.py +++ b/libs/demagify.py @@ -1,5 +1,6 @@ import bwpass + def demagify(something, vault): if isinstance(something, str): if something.startswith('!bwpass:'): diff --git a/libs/ssh.py b/libs/ssh.py index 89c643a..fe3b9b4 100644 --- a/libs/ssh.py +++ b/libs/ssh.py @@ -4,9 +4,9 @@ from hashlib import sha3_224 from cryptography.hazmat.primitives.asymmetric.ed25519 import Ed25519PrivateKey from cryptography.hazmat.primitives.serialization import (Encoding, - NoEncryption, - PrivateFormat, - PublicFormat) + NoEncryption, + PrivateFormat, + PublicFormat) from bundlewrap.utils import Fault diff --git a/nodes/attributes.py b/nodes/attributes.py index 85fa36d..eda23f4 100644 --- a/nodes/attributes.py +++ b/nodes/attributes.py @@ -1,6 +1,7 @@ -from bundlewrap.utils.ui import io from bundlewrap.utils.scm import get_rev -from bundlewrap.utils.text import red, bold +from bundlewrap.utils.text import bold, red +from bundlewrap.utils.ui import io + @node_attribute def needs_apply(node): From 563ba266ff0f93981e97d3e4d03e172fc497e5ba Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Sun, 10 Nov 2024 18:56:35 +0100 Subject: [PATCH 062/252] fix icinga2 bundle (gpg key / packages) --- bundles/icinga2/metadata.py | 1 - data/apt/files/gpg-keys/icinga2.asc | 53 ++++++++++++++--------------- 2 files changed, 26 insertions(+), 28 deletions(-) diff --git a/bundles/icinga2/metadata.py b/bundles/icinga2/metadata.py index 494ff89..60d28fe 100644 --- a/bundles/icinga2/metadata.py +++ b/bundles/icinga2/metadata.py @@ -17,7 +17,6 @@ defaults = { 'icinga2': {}, 'icinga2-ido-pgsql': {}, 'icingaweb2': {}, - 'icingaweb2-module-monitoring': {}, 'python3-easysnmp': {}, 'python3-flask': {}, 'snmp': {}, diff --git a/data/apt/files/gpg-keys/icinga2.asc b/data/apt/files/gpg-keys/icinga2.asc index 901c78c..165344f 100644 --- a/data/apt/files/gpg-keys/icinga2.asc +++ b/data/apt/files/gpg-keys/icinga2.asc @@ -1,30 +1,29 @@ -----BEGIN PGP PUBLIC KEY BLOCK----- -Version: GnuPG v2.0.19 (GNU/Linux) -mQGiBFKHzk4RBACSHMIFTtfw4ZsNKAA03Gf5t7ovsKWnS7kcMYleAidypqhOmkGg -0petiYsMPYT+MOepCJFGNzwQwJhZrdLUxxMSWay4Xj0ArgpD9vbvU+gj8Tb02l+x -SqNGP8jXMV5UnK4gZsrYGLUPvx47uNNYRIRJAGOPYTvohhnFJiG402dzlwCg4u5I -1RdFplkp9JM6vNM9VBIAmcED/2jr7UQGsPs8YOiPkskGHLh/zXgO8SvcNAxCLgbp -BjGcF4Iso/A2TAI/2KGJW6kBW/Paf722ltU6s/6mutdXJppgNAz5nfpEt4uZKZyu -oSWf77179B2B/Wl1BsX/Oc3chscAgQb2pD/qPF/VYRJU+hvdQkq1zfi6cVsxyREV -k+IwA/46nXh51CQxE29ayuy1BoIOxezvuXFUXZ8rP6aCh4KaiN9AJoy7pBieCzsq -d7rPEeGIzBjI+yhEu8p92W6KWzL0xduWfYg9I7a2GTk8CaLX2OCLuwnKd7RVDyyZ -yzRjWs0T5U7SRAWspLStYxMdKert9lLyQiRHtLwmlgBPqa0gh7Q+SWNpbmdhIE9w -ZW4gU291cmNlIE1vbml0b3JpbmcgKEJ1aWxkIHNlcnZlcikgPGluZm9AaWNpbmdh -Lm9yZz6IYAQTEQIAIAUCUofOTgIbAwYLCQgHAwIEFQIIAwQWAgMBAh4BAheAAAoJ -EMbjGcM0QQaCgSQAnRjXdbsyqziqhmxfAKffNJYuMPwdAKCS/IRCVyQzApFBtIBQ -1xuoym/4C7kCDQRSh85OEAgAvPwjlURCi8z6+7i60no4n16dNcSzd6AT8Kizpv2r -9BmNBff/GNYGnHyob/DMtmO2esEuVG8w62rO9m1wzzXzjbtmtU7NZ1Tg+C+reU2I -GNVu3SYtEVK/UTJHAhLcgry9yD99610tYPN2Fx33Efse94mXOreBfCvDsmFGSc7j -GVNCWXpMR3jTYyGj1igYd5ztOzG63D8gPyOucTTl+RWN/G9EoGBv6sWqk5eCd1Fs -JlWyQX4BJn3YsCZx3uj1DWL0dAl2zqcn6m1M4oj1ozW47MqM/efKOcV6VvCs9SL8 -F/NFvZcH4LKzeupCQ5jEONqcTlVlnLlIqId95Z4DI4AV9wADBQf/S6sKA4oH49tD -Yb5xAfUyEp5ben05TzUJbXs0Z7hfRQzy9+vQbWGamWLgg3QRUVPx1e4IT+W5vEm5 -dggNTMEwlLMI7izCPDcD32B5oxNVxlfj428KGllYWCFj+edY+xKTvw/PHnn+drKs -LE65Gwx4BPHm9EqWHIBX6aPzbgbJZZ06f6jWVBi/N7e/5n8lkxXqS23DBKemapyu -S1i56sH7mQSMaRZP/iiOroAJemPNxv1IQkykxw2woWMmTLKLMCD/i+4DxejE50tK -dxaOLTc4HDCsattw/RVJO6fwE414IXHMv330z4HKWJevMQ+CmQGfswvCwgeBP9n8 -PItLjBQAXIhJBBgRAgAJBQJSh85OAhsMAAoJEMbjGcM0QQaCzpAAmwUNoRyySf9p -5G3/2UD1PMueIwOtAKDVVDXEq5LJPVg4iafNu0SRMwgP0Q== -=icbY +mQINBGZMb30BEAC6c5P5lo5cLN2wX9+jA7TEEJ/NiiOM9VxBwB/c2PFd6AjdGBbe +28VcXWmFdETg1N3Woq08yNVXdxS1tMslyl9apmmyCiSC2OPMmTOveLzZ196IljYR +DeZMF8C+rdzNKXZzn7+nEp9xRy34QUZRfx6pEnugMd0VK0d/ZKgMbcq2IvcRQwap +60+9t8ppesXhgaRBsAzvrj1twngqXP90JwzKGaR+iaGzrvvJn6cgXkw3MyXhskKY +4J0c7TV6DmTOIfL6RmBp8+SSco8xXD/O/YIpG8LWe+sbMqSaq7jFvKCINWgK4RAt +7mBRHvx81Y8IwV6B2wch/lSyYxKXTbE7uMefy3vyP9A9IFhMbFpc0EJA/4tHYEL4 +qPZyR44mizsxa+1h6AXO258ERtzL+FoksXnWTcQqBKjd6SHhLwN4BLsjrlWsJ6lD +VaSKsekEwMFTLvZiLxYXBLPU04dvGNgX7nbkFMEK6RxHqfMu+m6+0jPXzQ+ejuae +xoBBT61O7v5PPTqbZFBKnVzQPf7fBIHW5/AGAc+qAI459viwcCSlJ21RCzirFYc0 +/KDuSoo61yyNcq4G271lbT5SNeMZNlDxKkiHjbCpIU6iEF7uK828F1ZGKOMRztok +bzE7j1IDIfDQ3P/zfq73Rr2S9FfHlXvEmLIuj5G4PO7p0IwUlCD1a9oY+QARAQAB +tCxJY2luZ2EgR21iSCAoQnVpbGQgc2VydmVyKSA8aW5mb0BpY2luZ2EuY29tPokC +TgQTAQoAOBYhBN069hmO0AC0wLc5VswRb1WqfyOCBQJmTG99AhsDBQsJCAcCBhUK +CQgLAgQWAgMBAh4BAheAAAoJEMwRb1WqfyOCGrIP/i/4fYEkdCi4nhQGMzSP0Eyh +UhJjsUP9mEqSQRqOAplvjYa1yBbrSPLfkRE0oAL/o+4eUKcAQFeDQtDXJ/D4xl3Q +J5MehRJYzklrSs5XkEscb73HoDBUfFSgCVM2zK+JkCX0CPJ4ZLWtZGJ+8pCLpnkH +nCPonbGc6sS+m2JsPRwxyxAhdXxWSAesXd8dUSW3MOQz9JlC4/idQcCFs03fdhuZ +4jGMry08OihWVudTDK8nkwRZLzNoOivAQ3mIeaTcRMmgPJfYN4k0o90lXJWAbG+2 +j8p7Pyjv71OctI8KUbS4+f2H8i6r5Pc4M4hlUQh6QAN9o1oPJrXxurdp0EXgQXSy +rVH2MeguqprFJxGjdlTCSTYgQEmEXMixRAGzteEgCf/Qk9mPXoxFTNyNg4/Lkglb +Nj6dY6or6w+IsbdrcePqDAs+j9t5B97vU7Ldquloj85myQjkWPP8kjlsOlsXBkQ/ +C+mD+5iW2AiWh+yCasf6mOZwUfINZF+VDpmfIsZZbWpcMgp1f32fpRFZ3ietnsnR ++luNb19hUHKyyDDHMe/YM7H9P5vtX9BGz6O9kNpo1LAnigkSQSFBZlK3Po3Yk9eg +XPbDT5HsU3TMyS5ZnSDRRPPJwsyGPXz+0pCADae9H9hCc2C2LZIrrtwlOFPWuViA +ifY/dQmUP37n5XgMADRc +=O0zm -----END PGP PUBLIC KEY BLOCK----- From fcd097599d9efcbe428d389d31b64640032dea10 Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Fri, 15 Nov 2024 10:17:37 +0100 Subject: [PATCH 063/252] home.nas: samba share for music videos --- nodes/home/nas.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/nodes/home/nas.py b/nodes/home/nas.py index 0415c87..741fa75 100644 --- a/nodes/home/nas.py +++ b/nodes/home/nas.py @@ -181,6 +181,10 @@ nodes['home.nas'] = { 'path': '/storage/nas/Musik', 'force_group': 'nas', }, + 'music_videos': { + 'path': '/storage/nas/Musikvideos', + 'force_group': 'nas', + }, }, 'restrict-to': { '172.19.138.0/24', From 50b71bc8b864991392ee011d2f1e649b25eaa2ec Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Fri, 15 Nov 2024 10:24:13 +0100 Subject: [PATCH 064/252] update element-web to 1.11.85 --- nodes/carlene.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nodes/carlene.toml b/nodes/carlene.toml index 9f4a66d..939cf1c 100644 --- a/nodes/carlene.toml +++ b/nodes/carlene.toml @@ -40,7 +40,7 @@ imap_pass = "!bwpass_attr:t-online.de/franzi.kunsmann@t-online.de:imap" [metadata.element-web] url = "chat.franzi.business" -version = "v1.11.82" +version = "v1.11.85" [metadata.element-web.config] default_server_config.'m.homeserver'.base_url = "https://matrix.franzi.business" default_server_config.'m.homeserver'.server_name = "franzi.business" From 3a56995ab112f3b07b79e492b2e79e7c886bec1e Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Fri, 15 Nov 2024 10:24:28 +0100 Subject: [PATCH 065/252] update netbox to 4.1.6 --- nodes/carlene.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nodes/carlene.toml b/nodes/carlene.toml index 939cf1c..99ec9ed 100644 --- a/nodes/carlene.toml +++ b/nodes/carlene.toml @@ -126,7 +126,7 @@ domain = "rss.franzi.business" [metadata.netbox] domain = "netbox.franzi.business" -version = "v4.1.4" +version = "v4.1.6" admins.kunsi = "hostmaster@kunbox.net" [metadata.nextcloud] From fa63ad72d52a54bc40e77fa17ee4e6fd713fd4f1 Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Fri, 15 Nov 2024 10:24:42 +0100 Subject: [PATCH 066/252] update paperless-ngx to 2.13.5 --- nodes/home/paperless.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nodes/home/paperless.py b/nodes/home/paperless.py index ded32c5..6297179 100644 --- a/nodes/home/paperless.py +++ b/nodes/home/paperless.py @@ -48,7 +48,7 @@ nodes['home.paperless'] = { }, 'paperless': { 'domain': 'paperless.home.kunbox.net', - 'version': 'v2.13.0', + 'version': 'v2.13.5', 'timezone': 'Europe/Berlin', }, 'postgresql': { From 9884b703cd62500378903c7f0faa25edcff68488 Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Sat, 16 Nov 2024 12:11:01 +0100 Subject: [PATCH 067/252] update forgejo to 9.0.2 --- nodes/carlene.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/nodes/carlene.toml b/nodes/carlene.toml index 99ec9ed..32bca34 100644 --- a/nodes/carlene.toml +++ b/nodes/carlene.toml @@ -49,8 +49,8 @@ defaultCountryCode = "DE" jitsi.preferredDomain = "meet.ffmuc.net" [metadata.forgejo] -version = "9.0.1" -sha1 = "060d9f00aaf595875eaf1897cbb24e760ef54d64" +version = "9.0.2" +sha1 = "5aecc64f93e8ef05c6d6f83d4b647bdb2c831d9f" domain = "git.franzi.business" enable_git_hooks = true install_ssh_key = true From 669b28f6ed511e90114383fd0f3532126d768d4c Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Sat, 16 Nov 2024 13:02:39 +0100 Subject: [PATCH 068/252] voc.pretalx: update to 2023.3.1 --- nodes/voc/pretalx.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/nodes/voc/pretalx.py b/nodes/voc/pretalx.py index b75ba3c..376a5e6 100644 --- a/nodes/voc/pretalx.py +++ b/nodes/voc/pretalx.py @@ -49,14 +49,15 @@ nodes['voc.pretalx'] = { }, }, 'pretalx': { - 'version': 'v2024.2.1', + # 2023.3.1 with some bugfixes + 'version': '05e377398cecdd45d3ca6013040c5857bbe225d6', 'domain': 'pretalx.c3voc.de', 'mail_from': 'pretalx@c3voc.de', 'administrators-from-group-id': 1, 'plugins': { 'broadcast_tools': { 'repo': 'https://github.com/Kunsi/pretalx-plugin-broadcast-tools.git', - 'rev': 'main', + 'rev': '2.4.0', }, 'downstream': { 'repo': 'https://github.com/pretalx/pretalx-downstream.git', @@ -81,6 +82,6 @@ nodes['voc.pretalx'] = { }, }, 'os': 'debian', - 'os_version': (11,), + 'os_version': (12,), 'pip_command': 'pip3', } From 6a203085b97085565a1f2a8be0eb6d48028e5ad1 Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Sat, 16 Nov 2024 13:35:24 +0100 Subject: [PATCH 069/252] bundles/pretalx: we do not need to regenerate_css anymore --- bundles/pretalx/items.py | 19 +++---------------- 1 file changed, 3 insertions(+), 16 deletions(-) diff --git a/bundles/pretalx/items.py b/bundles/pretalx/items.py index 8a57eae..75e4c09 100644 --- a/bundles/pretalx/items.py +++ b/bundles/pretalx/items.py @@ -1,5 +1,5 @@ assert node.has_bundle('redis'), f'{node.name}: pretalx needs redis' -assert node.has_bundle('nodejs'), f'{node.name}: pretalx needs nodejs for rebuild and regenerate_css step' +assert node.has_bundle('nodejs'), f'{node.name}: pretalx needs nodejs for rebuild step' actions = { 'pretalx_create_virtualenv': { @@ -53,17 +53,6 @@ actions = { }, 'triggered': True, }, - 'pretalx_regenerate-css': { - 'command': 'sudo -u pretalx PRETALX_CONFIG_FILE=/opt/pretalx/pretalx.cfg /opt/pretalx/venv/bin/python -m pretalx regenerate_css', - 'needs': { - 'action:pretalx_migrate', - 'directory:/opt/pretalx/data', - 'directory:/opt/pretalx/static', - 'file:/opt/pretalx/pretalx.cfg', - 'bundle:nodejs', - }, - 'triggered': True, - }, } users = { @@ -90,7 +79,6 @@ git_deploy = { 'action:pretalx_install', 'action:pretalx_migrate', 'action:pretalx_rebuild', - 'action:pretalx_regenerate-css', 'svc_systemd:pretalx-web:restart', 'svc_systemd:pretalx-worker:restart', }, @@ -121,7 +109,6 @@ svc_systemd = { 'action:pretalx_install', 'action:pretalx_migrate', 'action:pretalx_rebuild', - 'action:pretalx_regenerate-css', 'file:/etc/systemd/system/pretalx-web.service', 'file:/opt/pretalx/pretalx.cfg', }, @@ -129,7 +116,8 @@ svc_systemd = { 'pretalx-worker': { 'needs': { 'action:pretalx_install', - 'action:pretalx_migrate', + 'action:pretalx_migrate',, + 'action:pretalx_rebuild', 'file:/etc/systemd/system/pretalx-worker.service', 'file:/opt/pretalx/pretalx.cfg', }, @@ -204,7 +192,6 @@ for plugin_name, plugin_config in node.metadata.get('pretalx/plugins', {}).items 'triggers': { 'action:pretalx_migrate', 'action:pretalx_rebuild', - 'action:pretalx_regenerate-css', 'svc_systemd:pretalx-web:restart', 'svc_systemd:pretalx-worker:restart', }, From b3070a8b8bf7c11ec8004ec16c466bb01631ecb1 Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Sat, 16 Nov 2024 14:14:05 +0100 Subject: [PATCH 070/252] bundles/infobeamer-monitor: announce online devices at 09:00 CE(S)T --- bundles/infobeamer-monitor/files/monitor.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/bundles/infobeamer-monitor/files/monitor.py b/bundles/infobeamer-monitor/files/monitor.py index 2aa2daf..5a253e3 100644 --- a/bundles/infobeamer-monitor/files/monitor.py +++ b/bundles/infobeamer-monitor/files/monitor.py @@ -1,9 +1,10 @@ #!/usr/bin/env python3 import logging -from datetime import datetime, timezone +from datetime import datetime from json import dumps from time import sleep +from zoneinfo import ZoneInfo import paho.mqtt.client as mqtt from requests import RequestException, get @@ -210,7 +211,7 @@ while True: level="WARN", ) - if datetime.now(timezone.utc).strftime("%H%M") == "1312": + if datetime.now(ZoneInfo("Europe/Berlin")).strftime("%H%M") == "0900": if available_credits is not None: mqtt_out(f"Available Credits: {available_credits}") From 8f705fc8e3d554a5bb574a8a99e21fa3413e5fca Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Sun, 17 Nov 2024 11:48:08 +0100 Subject: [PATCH 071/252] update mautrix-whatsapp to 0.11.1 --- nodes/carlene.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/nodes/carlene.toml b/nodes/carlene.toml index 32bca34..ea1625f 100644 --- a/nodes/carlene.toml +++ b/nodes/carlene.toml @@ -114,8 +114,8 @@ provisioning.shared_secret = "!decrypt:encrypt$gAAAAABfVKflEMAi07C_QGP8cy97hF-4g "'@kunsi:franzi.business'" = "admin" [metadata.mautrix-whatsapp] -version = "v0.11.0" -sha1 = "997c794eb246e6cc67ac050c106d54f88531f213" +version = "v0.11.1" +sha1 = "ada2dc6acfd5cb15fae341266b383d3f6e8b42bd" permissions."'@kunsi:franzi.business'" = "admin" [metadata.mautrix-whatsapp.homeserver] domain = "franzi.business" From a9b16c18ad36592e15f384e1064528830dd85ffb Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Fri, 22 Nov 2024 20:50:52 +0100 Subject: [PATCH 072/252] bundles/postfix: remove smtp_use_tls option Log says: postconf: warning: /etc/postfix/main.cf: support for parameter "smtp_use_tls" will be removed; instead, specify "smtp_tls_security_level" --- bundles/postfix/files/main.cf | 1 - 1 file changed, 1 deletion(-) diff --git a/bundles/postfix/files/main.cf b/bundles/postfix/files/main.cf index 770114b..9d74175 100644 --- a/bundles/postfix/files/main.cf +++ b/bundles/postfix/files/main.cf @@ -25,7 +25,6 @@ inet_interfaces = 127.0.0.1 % endif <%text> -smtp_use_tls = yes smtp_tls_loglevel = 1 smtp_tls_note_starttls_offer = yes smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache From 3a5db80843568696ac377a661354a5d26d5814a9 Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Sat, 23 Nov 2024 13:30:22 +0100 Subject: [PATCH 073/252] bundles/icinga2: notify per sms if ntfy does not respond in time --- .../icinga2/files/scripts/icinga_notification_wrapper | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/bundles/icinga2/files/scripts/icinga_notification_wrapper b/bundles/icinga2/files/scripts/icinga_notification_wrapper index 612882d..fbecd8e 100644 --- a/bundles/icinga2/files/scripts/icinga_notification_wrapper +++ b/bundles/icinga2/files/scripts/icinga_notification_wrapper @@ -129,11 +129,14 @@ def notify_per_ntfy(): data=message_text, headers=headers, auth=(CONFIG['ntfy']['user'], CONFIG['ntfy']['password']), + timeout=10, ) r.raise_for_status() except Exception as e: log_to_syslog('Sending a Notification failed: {}'.format(repr(e))) + return False + return True def notify_per_mail(): @@ -199,7 +202,8 @@ if __name__ == '__main__': notify_per_mail() if args.sms: - if not args.service_name: - notify_per_sms() + ntfy_worked = False if CONFIG['ntfy']['user']: - notify_per_ntfy() + ntfy_worked = notify_per_ntfy() + if not args.service_name or not ntfy_worked: + notify_per_sms() From 3b608d95ece971098d6fc38449f4f010989063c1 Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Sat, 23 Nov 2024 13:31:00 +0100 Subject: [PATCH 074/252] add static ip reservation for mixer96 as well --- nodes/home.mixer96.toml | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 nodes/home.mixer96.toml diff --git a/nodes/home.mixer96.toml b/nodes/home.mixer96.toml new file mode 100644 index 0000000..815205f --- /dev/null +++ b/nodes/home.mixer96.toml @@ -0,0 +1,9 @@ +dummy = true + +[metadata.interfaces.default] +ips = ["172.19.138.98"] +dhcp = true +mac = "54:e1:ad:a6:0d:1f" + +[metadata.icinga_options] +exclude_from_monitoring = true From 8e237474003a0ba1c8961dc58e45f01976256632 Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Thu, 28 Nov 2024 08:27:17 +0100 Subject: [PATCH 075/252] home.hass: remove nginx ip restriction --- nodes/home.hass.toml | 6 ------ 1 file changed, 6 deletions(-) diff --git a/nodes/home.hass.toml b/nodes/home.hass.toml index 2c52708..52a2388 100644 --- a/nodes/home.hass.toml +++ b/nodes/home.hass.toml @@ -24,12 +24,6 @@ ram = 2 domain = 'hass.home.kunbox.net' api_secret = '!decrypt:encrypt$gAAAAABm9lNg_mNhyzb4S6WRtVRDmQFBnPpoCwyqMnilRrAFUXc-EDvv-nYXPbSIbjTf7ZReTPtqr8k3WrGPqiuqhJ60LVv4A5DMqT5c6hTVr4WbhP4DPEIPgfd5aq6U9_-H9WDyQYHKjnunLJEYtEREzmhTq3XsYeQ05DyE7hfnQ-zVoBb0CsAK7GdhihRTdvhXv2N9M04_rigyBP-roRcUgCqwyHuWJc0IPAyn3R4Mr43ZqgR2fn6dNV_YUVKn9c0nWxIwRnYy6Ff_Te9NoGVmXxkiNUX-90bBLKFiCzrRAtizxrTiQb2SRipaWbgOlV6wbMy2KNux' -[metadata.nginx] -restrict-to = [ - '172.19.136.0/25', - '172.19.138.0/24', -] - [metadata.pyenv] version = 'v2.3.36' python_versions = ["3.12.2"] From 128a61706e5211b73eeb4cc5bbf4be4122b68a57 Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Thu, 28 Nov 2024 08:27:36 +0100 Subject: [PATCH 076/252] bundles/infobeamer-monitor: some more improvements in status display --- bundles/infobeamer-monitor/files/monitor.py | 39 +++++++-------------- 1 file changed, 13 insertions(+), 26 deletions(-) diff --git a/bundles/infobeamer-monitor/files/monitor.py b/bundles/infobeamer-monitor/files/monitor.py index 5a253e3..e5755c2 100644 --- a/bundles/infobeamer-monitor/files/monitor.py +++ b/bundles/infobeamer-monitor/files/monitor.py @@ -25,7 +25,8 @@ logging.basicConfig( ) LOG = logging.getLogger("main") -MLOG = logging.getLogger("mqtt") +TZ = ZoneInfo("Europe/Berlin") +DUMP_TIME = "0900" state = None @@ -68,13 +69,12 @@ def mqtt_dump_state(device): device=device, ) +def is_dump_time(): + return datetime.now(TZ).strftime("%H%M") == DUMP_TIME mqtt_out("Monitor starting up") while True: try: - online_devices = set() - available_credits = None - try: r = get( "https://info-beamer.com/api/v1/device/list", @@ -83,9 +83,9 @@ while True: r.raise_for_status() ib_state = r.json()["devices"] except RequestException as e: - LOG.exception("Could not get data from info-beamer") + LOG.exception("Could not get device data from info-beamer") mqtt_out( - f"Could not get data from info-beamer: {e!r}", + f"Could not get device data from info-beamer: {e!r}", level="WARN", ) else: @@ -98,7 +98,8 @@ while True: continue new_state[did] = device - must_dump_state = False + # force information output for every online device at 09:00 CE(S)T + must_dump_state = is_dump_time() if state is not None: if did not in state: @@ -161,14 +162,6 @@ while True: else: LOG.info("adding device {} to empty state".format(device["id"])) - if device["is_online"]: - online_devices.add( - "{} ({})".format( - device["id"], - device["description"], - ) - ) - state = new_state try: @@ -179,13 +172,16 @@ while True: r.raise_for_status() ib_account = r.json() except RequestException as e: - LOG.exception("Could not get data from info-beamer") + LOG.exception("Could not get account data from info-beamer") mqtt_out( - f"Could not get data from info-beamer: {e!r}", + f"Could not get account data from info-beamer: {e!r}", level="WARN", ) else: available_credits = ib_account["balance"] + if is_dump_time(): + mqtt_out(f"Available Credits: {available_credits}") + if available_credits < 50: mqtt_out( f"balance has dropped below 50 credits! (available: {available_credits})", @@ -211,15 +207,6 @@ while True: level="WARN", ) - if datetime.now(ZoneInfo("Europe/Berlin")).strftime("%H%M") == "0900": - if available_credits is not None: - mqtt_out(f"Available Credits: {available_credits}") - - if online_devices: - mqtt_out( - "Online Devices: {}".format(", ".join(sorted(online_devices))) - ) - sleep(60) except KeyboardInterrupt: break From ba1de350bb8d55f661f09008884455123e3122dc Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Sat, 30 Nov 2024 11:34:20 +0100 Subject: [PATCH 077/252] update element-web to 1.11.85 --- nodes/carlene.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nodes/carlene.toml b/nodes/carlene.toml index ea1625f..03eb3a3 100644 --- a/nodes/carlene.toml +++ b/nodes/carlene.toml @@ -40,7 +40,7 @@ imap_pass = "!bwpass_attr:t-online.de/franzi.kunsmann@t-online.de:imap" [metadata.element-web] url = "chat.franzi.business" -version = "v1.11.85" +version = "v1.11.86" [metadata.element-web.config] default_server_config.'m.homeserver'.base_url = "https://matrix.franzi.business" default_server_config.'m.homeserver'.server_name = "franzi.business" From 19359f72e6259c92403a3de2e77187001ee2843c Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Sat, 30 Nov 2024 11:34:39 +0100 Subject: [PATCH 078/252] update netbox to 4.1.7 --- nodes/carlene.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nodes/carlene.toml b/nodes/carlene.toml index 03eb3a3..3955616 100644 --- a/nodes/carlene.toml +++ b/nodes/carlene.toml @@ -126,7 +126,7 @@ domain = "rss.franzi.business" [metadata.netbox] domain = "netbox.franzi.business" -version = "v4.1.6" +version = "v4.1.7" admins.kunsi = "hostmaster@kunbox.net" [metadata.nextcloud] From 49c5d0b1e37795ebde6cd8a3ac80e784d0f056c2 Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Sat, 30 Nov 2024 11:34:53 +0100 Subject: [PATCH 079/252] update postfixadmin to 3.3.14 --- nodes/carlene.toml | 2 +- nodes/htz-cloud/pirmasens.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/nodes/carlene.toml b/nodes/carlene.toml index 3955616..18a7966 100644 --- a/nodes/carlene.toml +++ b/nodes/carlene.toml @@ -213,7 +213,7 @@ blocked_recipients = [ [metadata.postfixadmin] domain = "postfixadmin.franzi.business" setup_password = "!decrypt:encrypt$gAAAAABgnNGpAqUs--qBXII9ZPcHtxaELy9e2Dx9O44n4l0O4nMHPoIyaPW5HkvpQ2zWTlh5OfjjOgunRtE_voJuY0Kdtji37ixAnuL9ErOJ0LDY5QfMkNPUgPs5alwz1baqYq6rqJ7NDmB0gHraY46v5eG79R2EyQ==" -version = "3.3.13" +version = "3.3.14" [metadata.postgresql] version = 15 diff --git a/nodes/htz-cloud/pirmasens.py b/nodes/htz-cloud/pirmasens.py index b4c405d..46f4638 100644 --- a/nodes/htz-cloud/pirmasens.py +++ b/nodes/htz-cloud/pirmasens.py @@ -71,7 +71,7 @@ nodes['htz-cloud.pirmasens'] = { }, 'postfixadmin': { 'domain': 'mail.kunsmann.info', - 'version': '3.3.13', + 'version': '3.3.14', 'setup_password': vault.decrypt('encrypt$gAAAAABgnNGpAqUs--qBXII9ZPcHtxaELy9e2Dx9O44n4l0O4nMHPoIyaPW5HkvpQ2zWTlh5OfjjOgunRtE_voJuY0Kdtji37ixAnuL9ErOJ0LDY5QfMkNPUgPs5alwz1baqYq6rqJ7NDmB0gHraY46v5eG79R2EyQ=='), }, 'postgresql': { From 9be4ba75eb0ec08e8caf649cdf99589f1345b678 Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Sat, 30 Nov 2024 11:35:05 +0100 Subject: [PATCH 080/252] update travelynx to 2.9.2 --- nodes/carlene.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nodes/carlene.toml b/nodes/carlene.toml index 18a7966..b0f1593 100644 --- a/nodes/carlene.toml +++ b/nodes/carlene.toml @@ -262,7 +262,7 @@ disks = [ ] [metadata.travelynx] -version = "2.8.40" +version = "2.9.2" mail_from = "travelynx@franzi.business" domain = "travelynx.franzi.business" From a6f29fe3890c8838ed15c5db896421b848de94a2 Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Sat, 30 Nov 2024 11:37:06 +0100 Subject: [PATCH 081/252] bump certificate for *.home.kunbox.net --- data/ssl/_.home.kunbox.net.crt.pem | 30 ++++++++++++------------ data/ssl/_.home.kunbox.net.key.pem.vault | 2 +- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/data/ssl/_.home.kunbox.net.crt.pem b/data/ssl/_.home.kunbox.net.crt.pem index a263c3f..06ea249 100644 --- a/data/ssl/_.home.kunbox.net.crt.pem +++ b/data/ssl/_.home.kunbox.net.crt.pem @@ -1,22 +1,22 @@ -----BEGIN CERTIFICATE----- -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 -----END CERTIFICATE----- diff --git a/data/ssl/_.home.kunbox.net.key.pem.vault b/data/ssl/_.home.kunbox.net.key.pem.vault index df3ed76..f5fa8b4 100644 --- a/data/ssl/_.home.kunbox.net.key.pem.vault +++ b/data/ssl/_.home.kunbox.net.key.pem.vault @@ -1 +1 @@ -encrypt$gAAAAABm2JL0vVqh3Zut-a1Gfn8iOtDZS8aBpGobV3-d3u8My0MPunYmbQ6kXUAw7U0Bu87AAPXNsmi1pxrxcu8vXvhw4uM445WwKj-UqaV5fmk-ZasHGq-O6K52YqEgK6wo-9u_sOBubbwJSwFVaHxT3gczLW_GVRHhFIFGgdnRlz4YoAz4NXcos_uNO9GMEOGhfGx9e2c2GOIg64vXkj_1LjXEDoV9HYMzy-2wLt4A6q-ZiZwCoKl8-lt8sY_rLk_yfmy3sMvzqg8JaE7T4sunmXDdf4HQlnvl_cu1uW33Rrsq4-080HKx6rKNsZQGhWD2yls016xBAYZvQbDjHd6-7bld1bs5RUF5tfEC3Kx567TBdMaf5C7-PnNB7O_MC4I6SkmUElGRdYyCHuP5HXf9dKtiGCtjHyfEzqTBrcI0xPt631_IGPWMNId7zyLqfLHpMFTPS9jgGVKoT1TXwKe4NSHaGxXO-A== \ No newline at end of file +encrypt$gAAAAABnSurPS00unDJP1C7wyToyZOzKrEruyT6itqZG1Bbv6IZPVrkdcbgyfPrXY8ViPSRwtdVJsju-X8pvLHZGSHXvxhpNlNrNQTas2_VCMwYIihGnp7VI6ovQXd_iVHON5sXaNpKURRwCsvnYhHQfn4qPGLSN8II2QdpJ4A4nDschZwN2u-8X9omGPOcC6zeivoew4UcpossYuJDskHeJnRnR3roGwrHuPWfEKRgRJ_eTHgij00uyoJZxhWGRV9nS_MnacbGUP6KBXfaZP_23DFJPMMq734qVfcLObhYa8nam9kLHh4TaloET2pK-IVqcb_FOorWiipiGBSNCw9EQr57d8AOLEFAwMmb_1fgPCjpchVZaSKD4OhdjPt1CU3unzR-zPkrjBdL-az0ci984vJnLolr4z8nMW6oR1SyJGyccJ-lmoMf34M3oI3zIlNg2GPdGcZMFa6GhvmLYwDb7r0PHil_GRA== \ No newline at end of file From 94868e726f8446a27e12e25a3278ecb5a5782b51 Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Sun, 1 Dec 2024 13:28:15 +0100 Subject: [PATCH 082/252] prepare for 38c3 --- nodes/voc/infobeamer-cms.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/nodes/voc/infobeamer-cms.py b/nodes/voc/infobeamer-cms.py index f0dc6cf..ceebc9e 100644 --- a/nodes/voc/infobeamer-cms.py +++ b/nodes/voc/infobeamer-cms.py @@ -41,7 +41,7 @@ nodes['voc.infobeamer-cms'] = { 'HOSTED_API_KEY': vault.decrypt('encrypt$gAAAAABhxJPH2sIGMAibU2Us1HoCVlNfF0SQQnVl0eiod48Zu8webL_-xk3wDw3yXw1Hkglj-2usl-D3Yd095yTSq0vZMCv2fh-JWwSPdJewQ45x9Ai4vXVD4CNz5vuJBESKS9xQWXTc'), 'INTERRUPT_KEY': vault.human_password_for('infobeamer-cms interrupt key 38c3', words=1), 'SETUP_IDS': [ - 253559, + 255228, ], # 'EXTRA_ASSETS': [{ # 'type': "image", @@ -72,15 +72,15 @@ nodes['voc.infobeamer-cms'] = { }, }, 'rooms': { -# 'Saal 1': 34430, -# 'Saal G': 26598, -# 'Saal Z': 26610, -# 'Saal E (SoS/Lightning-Talks)': 32814, -# 'Saal F (Sendezentrum/DLF)': 9717, + 'Saal 1': 34430, + 'Saal G': 26598, + 'Saal Z': 26610, + 'Saal E (SoS/Lightning-Talks)': 32814, + 'Saal F (Sendezentrum/DLF)': 9717, }, 'interrupts': { -# 'Questions': 'questions', -# 'Translations': 'translations', + 'Questions': 'questions', + 'Translations': 'translations', }, }, 'infobeamer-monitor': { From 3ad6a0fed8a3bd31cdc98be2f087b819c26a7bd4 Mon Sep 17 00:00:00 2001 From: Sophie Schiller Date: Sun, 1 Dec 2024 21:06:47 +0100 Subject: [PATCH 083/252] miniserver: updates --- nodes/sophie/miniserver.py | 365 +++++++++++++++++++------------------ 1 file changed, 185 insertions(+), 180 deletions(-) diff --git a/nodes/sophie/miniserver.py b/nodes/sophie/miniserver.py index 5088f87..7be112f 100644 --- a/nodes/sophie/miniserver.py +++ b/nodes/sophie/miniserver.py @@ -1,255 +1,260 @@ # sophie's miniserver -nodes['htz-cloud.miniserver'] = { - 'bundles': { - 'element-web', - 'hedgedoc', - 'matrix-media-repo', - 'matrix-synapse', +nodes["htz-cloud.miniserver"] = { + "bundles": { + "element-web", + "hedgedoc", + "matrix-media-repo", + "matrix-synapse", "matrix-stickerpicker", - 'nodejs', - 'ntfy', - 'mautrix-telegram', - 'postgresql', - 'zfs', + "nodejs", + "ntfy", + "mautrix-telegram", + "postgresql", + "zfs", }, - 'groups': { - 'debian-bookworm', - 'sophie', - 'webserver', + "groups": { + "debian-bookworm", + "sophie", + "webserver", }, - 'metadata': { - 'interfaces': { - 'eth0': { - 'ips': { - '157.90.20.62', - '2a01:4f8:c2c:840f::1/64', + "metadata": { + "interfaces": { + "eth0": { + "ips": { + "157.90.20.62", + "2a01:4f8:c2c:840f::1/64", }, - 'gateway4': '172.31.1.1', - 'gateway6': 'fe80::1', + "gateway4": "172.31.1.1", + "gateway6": "fe80::1", }, }, - 'apt': { - 'packages': { - 'mosh': {}, - 'weechat': {}, - 'weechat-core': {}, - 'weechat-curses': {}, - 'weechat-perl': {}, - 'weechat-plugins': {}, - 'weechat-python': {}, - 'weechat-ruby': {}, + "apt": { + "packages": { + "mosh": {}, + "weechat": {}, + "weechat-core": {}, + "weechat-curses": {}, + "weechat-perl": {}, + "weechat-plugins": {}, + "weechat-python": {}, + "weechat-ruby": {}, }, - 'repos': { - 'weechat': { - 'items': { - 'deb https://weechat.org/debian {os_release} main', + "repos": { + "weechat": { + "items": { + "deb https://weechat.org/debian {os_release} main", }, }, }, }, - 'backup-client': { - 'pre-hooks': { - 'sophie-weechat': \ - 'echo \'core.weechat */layout store\' >> /home/sophie/.weechat/weechat_fifo\n' \ - 'echo \'core.weechat */save\' >> /home/sophie/.weechat/weechat_fifo\n', + "backup-client": { + "pre-hooks": { + "sophie-weechat": "echo 'core.weechat */layout store' >> /home/sophie/.weechat/weechat_fifo\n" + "echo 'core.weechat */save' >> /home/sophie/.weechat/weechat_fifo\n", }, }, - 'backups': { - 'paths': { - '/home/sophie/.weechat', + "backups": { + "paths": { + "/home/sophie/.weechat", }, }, - 'element-web': { - 'url': 'chat.sophies-kitchen.eu', - 'version': 'v1.11.83', - 'config': { - 'default_server_config': { - 'm.homeserver': { - 'base_url': 'https://matrix.sophies-kitchen.eu', - 'server_name': 'sophies-kitchen.eu', + "element-web": { + "url": "chat.sophies-kitchen.eu", + "version": "v1.11.86", + "config": { + "default_server_config": { + "m.homeserver": { + "base_url": "https://matrix.sophies-kitchen.eu", + "server_name": "sophies-kitchen.eu", }, }, - 'brand': 'sophies-kitchen.eu', - 'showLabsSettings': True, - 'default_theme': 'dark', - 'defaultCountryCode': 'DE', - 'jitsi': { - 'preferredDomain': 'meet.ffmuc.net', + "brand": "sophies-kitchen.eu", + "showLabsSettings": True, + "default_theme": "dark", + "defaultCountryCode": "DE", + "jitsi": { + "preferredDomain": "meet.ffmuc.net", }, - 'map_style_url': "https://api.maptiler.com/maps/openstreetmap/style.json?key=fU3vlMsMn4Jb6dnEIFsx" + "map_style_url": "https://api.maptiler.com/maps/openstreetmap/style.json?key=fU3vlMsMn4Jb6dnEIFsx", }, }, - 'hedgedoc': { - 'version': '1.10.0', - 'config': { - 'production': { - 'allowAnonymousEdits': True, - 'domain': 'pad.sophies-kitchen.eu', + "hedgedoc": { + "version": "1.10.0", + "config": { + "production": { + "allowAnonymousEdits": True, + "domain": "pad.sophies-kitchen.eu", }, }, }, - 'letsencrypt': { - 'concat_and_deploy': { - 'sophie-weechat': { - 'match_domain': 'i.sophies-kitchen.eu', - 'target': '/home/sophie/.weechat/ssl/relay.pem', - 'chown': 'sophie:sophie', - 'chmod': '0440', - 'commands': [ - 'echo \'core.weechat */relay sslcertkey\' >> /home/sophie/.weechat/weechat_fifo' + "letsencrypt": { + "concat_and_deploy": { + "sophie-weechat": { + "match_domain": "i.sophies-kitchen.eu", + "target": "/home/sophie/.weechat/ssl/relay.pem", + "chown": "sophie:sophie", + "chmod": "0440", + "commands": [ + "echo 'core.weechat */relay sslcertkey' >> /home/sophie/.weechat/weechat_fifo" ], }, }, - 'domains': { - 'i.sophies-kitchen.eu': set(), - 'webdump.sophies-kitchen.eu': set(), - 'matrix.sophies-kitchen.eu': { - 'sophies-kitchen.eu', + "domains": { + "i.sophies-kitchen.eu": set(), + "webdump.sophies-kitchen.eu": set(), + "matrix.sophies-kitchen.eu": { + "sophies-kitchen.eu", }, }, }, - 'matrix-media-repo': { - 'version': 'v1.3.7', - 'datastore_id': '99c09e24edc4e9be6c4c9486bc147e385bc87044', - 'sha1': '3e2bb7089b0898b86000243a82cc58ae998dc9d9', - 'homeservers': { - 'sophies-kitchen.eu': { - 'domain': 'http://[::1]:20080/', - 'api': 'synapse', - 'signing_key_path': "/etc/matrix-synapse/mmr.signing.key" + "matrix-media-repo": { + "version": "v1.3.7", + "datastore_id": "99c09e24edc4e9be6c4c9486bc147e385bc87044", + "sha1": "3e2bb7089b0898b86000243a82cc58ae998dc9d9", + "homeservers": { + "sophies-kitchen.eu": { + "domain": "http://[::1]:20080/", + "api": "synapse", + "signing_key_path": "/etc/matrix-synapse/mmr.signing.key", }, }, - 'admins': { - '@sophie:sophies-kitchen.eu', + "admins": { + "@sophie:sophies-kitchen.eu", }, - 'upload_max_mb': 500, + "upload_max_mb": 500, }, - 'matrix-stickerpicker': { - # use this bot token for telegram import: encrypt$gAAAAABg4bcQVzBF_iXdDtjRQD-O37GHdbHwWXyhCLPOuJLbv3ezUeXKR203hkCXkjfItSHi4NiTEgQPadDZTRkavaRpvAoaQV1a4srCS_Y-NU4RiOmkrVFJ_Xhw6UZvwjQUQ0QPOx9t - 'domain': "matrix-stickers.sophies-kitchen.eu", - 'config': { - 'access_token': vault.decrypt('encrypt$gAAAAABg4btB0KGk068ahGZzR0w_Lm1bj1wUbB2WfNNs2bp3PwM4Ftp6MjQnrF-CejZfrF0NjPJw9Z4MrgileHP0sVw04mvgKSHfTf8gv4kTB6WuCIxHeMWHUDx00LTWL73fSlhCK0o1'), - 'homeserver': "https://matrix.sophies-kitchen.eu", - 'user_id': "@dimension:sophies-kitchen.eu", + "matrix-stickerpicker": { + # use this bot token for telegram import: encrypt$gAAAAABg4bcQVzBF_iXdDtjRQD-O37GHdbHwWXyhCLPOuJLbv3ezUeXKR203hkCXkjfItSHi4NiTEgQPadDZTRkavaRpvAoaQV1a4srCS_Y-NU4RiOmkrVFJ_Xhw6UZvwjQUQ0QPOx9t + "domain": "matrix-stickers.sophies-kitchen.eu", + "config": { + "access_token": vault.decrypt( + "encrypt$gAAAAABg4btB0KGk068ahGZzR0w_Lm1bj1wUbB2WfNNs2bp3PwM4Ftp6MjQnrF-CejZfrF0NjPJw9Z4MrgileHP0sVw04mvgKSHfTf8gv4kTB6WuCIxHeMWHUDx00LTWL73fSlhCK0o1" + ), + "homeserver": "https://matrix.sophies-kitchen.eu", + "user_id": "@dimension:sophies-kitchen.eu", }, }, - 'matrix-synapse': { - 'server_name': 'sophies-kitchen.eu', - 'baseurl': 'matrix.sophies-kitchen.eu', - 'admin_contact': 'mailto:foobar@sophies-kitchen.eu', - 'trusted_key_servers': { - 'matrix.org', + "matrix-synapse": { + "server_name": "sophies-kitchen.eu", + "baseurl": "matrix.sophies-kitchen.eu", + "admin_contact": "mailto:foobar@sophies-kitchen.eu", + "trusted_key_servers": { + "matrix.org", }, }, - 'mautrix-telegram': { - 'version': 'v0.15.2', - 'homeserver': { - 'domain': 'sophies-kitchen.eu', - 'url': 'https://matrix.sophies-kitchen.eu', + "mautrix-telegram": { + "version": "v0.15.2", + "homeserver": { + "domain": "sophies-kitchen.eu", + "url": "https://matrix.sophies-kitchen.eu", }, - 'provisioning': { - 'enabled': False, - 'shared_secret': '""', + "provisioning": { + "enabled": False, + "shared_secret": '""', }, - 'permissions': { - 'sophies-kitchen.eu': 'full', - "'@sophie:sophies-kitchen.eu'": 'admin', + "permissions": { + "sophies-kitchen.eu": "full", + "'@sophie:sophies-kitchen.eu'": "admin", }, - 'telegram': { - 'api_id': vault.decrypt('encrypt$gAAAAABgnqdXhCTwtCXJhSaCZsiNfHPtjwlYtV1sUAux7JZdejN3xItU9RJLeNu4gUniv36XbBoxKwVtqqyV3RcAs-PgumcfYQ=='), - 'api_token': vault.decrypt('encrypt$gAAAAABgnqd5IdpYRmW-C4ONBSXQfiJrpTVQX0rP0eKoDnLnVTLg-5olSjcw2gVvEKWLnsGEZIgVcG7yEs-sqYRxeiQLFFpSn-Z4We0mhj0CUeFoD-eXJsp-bAgLv9PJoMv5Gjb8r9i6'), - 'bot_token': '""', + "telegram": { + "api_id": vault.decrypt( + "encrypt$gAAAAABgnqdXhCTwtCXJhSaCZsiNfHPtjwlYtV1sUAux7JZdejN3xItU9RJLeNu4gUniv36XbBoxKwVtqqyV3RcAs-PgumcfYQ==" + ), + "api_token": vault.decrypt( + "encrypt$gAAAAABgnqd5IdpYRmW-C4ONBSXQfiJrpTVQX0rP0eKoDnLnVTLg-5olSjcw2gVvEKWLnsGEZIgVcG7yEs-sqYRxeiQLFFpSn-Z4We0mhj0CUeFoD-eXJsp-bAgLv9PJoMv5Gjb8r9i6" + ), + "bot_token": '""', }, }, - 'nameservers': { - '213.133.98.98', - '213.133.99.99', - '213.133.100.100', - '2a01:4f8:0:1::add:1010', - '2a01:4f8:0:1::add:9999', - '2a01:4f8:0:1::add:9898', + "nameservers": { + "213.133.98.98", + "213.133.99.99", + "213.133.100.100", + "2a01:4f8:0:1::add:1010", + "2a01:4f8:0:1::add:9999", + "2a01:4f8:0:1::add:9898", }, - 'nftables': { - 'input': { - '50-sophie-weechat': [ - 'udp dport { 60000-61000 } accept', - 'tcp dport 9001 accept', + "nftables": { + "input": { + "50-sophie-weechat": [ + "udp dport { 60000-61000 } accept", + "tcp dport 9001 accept", ], }, }, - 'nginx': { - 'vhosts': { - 'sophies-kitchen.eu': { - 'webroot': '/var/www/sophies-kitchen.eu/_site/', - 'extras': True, + "nginx": { + "vhosts": { + "sophies-kitchen.eu": { + "webroot": "/var/www/sophies-kitchen.eu/_site/", + "extras": True, }, - 'matrix-synapse': { - 'domain': 'matrix.sophies-kitchen.eu', + "matrix-synapse": { + "domain": "matrix.sophies-kitchen.eu", }, - 'webdump.sophies-kitchen.eu': { - 'webroot_config': { - 'owner': 'sophie', - 'group': 'sophie', - 'mode': '0755', + "webdump.sophies-kitchen.eu": { + "webroot_config": { + "owner": "sophie", + "group": "sophie", + "mode": "0755", }, - 'extras': True, + "extras": True, }, - 'recipes.sophies-kitchen.eu': { - 'webroot_config': { - 'owner': 'sophie', - 'group': 'sophie', - 'mode': '0755', + "recipes.sophies-kitchen.eu": { + "webroot_config": { + "owner": "sophie", + "group": "sophie", + "mode": "0755", }, }, }, }, - 'nodejs': { - 'version': 20, + "nodejs": { + "version": 20, }, - 'ntfy': { - 'domain': 'ntfy.sophies-kitchen.eu', - 'allow_unauthorized_write': True, + "ntfy": { + "domain": "ntfy.sophies-kitchen.eu", + "allow_unauthorized_write": True, }, - 'postgresql': { - 'version': '11', + "postgresql": { + "version": "11", }, - 'sysctl': { - 'options': { + "sysctl": { + "options": { # XXX find out if this is really needed - 'net.ipv4.conf.all.forwarding': '1', - 'net.ipv6.conf.all.forwarding': '1', + "net.ipv4.conf.all.forwarding": "1", + "net.ipv6.conf.all.forwarding": "1", }, }, - 'vm': { - 'cpu': 2, - 'ram': 4, + "vm": { + "cpu": 2, + "ram": 4, }, - 'users': { - 'sophie': { - 'enable_linger': True, - 'ssh_pubkey': [ + "users": { + "sophie": { + "enable_linger": True, + "ssh_pubkey": [ "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDILcYrMQNRVXAm5L+7No1ZumqfCyRc1QZmTY3O7Q8hsE4+fCAvwsWm2aSMfLL3NnIl8Nm1Rixzic5jdYKYNIY3SlX1wvTB+MhGb2eyVSd7c/Y98aCLSlDkQ2sebjpdA1FoJOeGD3qxqDwj0+KckXU2ZaSSQY7CxVsjH65UxCHqVAg+6uLdNbj7j850s1B9NXVXef+sBQ5jUngXxnqQWwNh2Mn8auwumkeEG4SYf96wyFkLvmBitOng/GyLWl9YPnXXHHDnatcVipy7y34qw4CQ4P84anecbA+Bqr9IcxBW6qYmYgRKEnAcmEfjQd+BI1gCLB1BBEmb/qp+mVLd4tOh sophie@carbon" ], }, }, - 'zfs': { + "zfs": { "datasets": { "tank/webdump": { "mountpoint": "/var/www/webdump.sophies-kitchen.eu", - "needed_by": [ - "directory:/var/www/webdump.sophies-kitchen.eu" - ] + "needed_by": ["directory:/var/www/webdump.sophies-kitchen.eu"], } }, - 'pools': { - 'tank': { - 'when_creating': { - 'config': [{ - 'devices': { - '/dev/disk/by-id/scsi-0HC_Volume_23952298', - }, - }] + "pools": { + "tank": { + "when_creating": { + "config": [ + { + "devices": { + "/dev/disk/by-id/scsi-0HC_Volume_23952298", + }, + } + ] }, }, }, From 9c382ed8f59ac49837c75909e2e2ec816875ee08 Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Mon, 2 Dec 2024 20:17:54 +0100 Subject: [PATCH 084/252] bundles/systemd: move timezone information to metadata defaults --- bundles/systemd/items.py | 2 +- bundles/systemd/metadata.py | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/bundles/systemd/items.py b/bundles/systemd/items.py index c8ecbd9..005696e 100644 --- a/bundles/systemd/items.py +++ b/bundles/systemd/items.py @@ -1,4 +1,4 @@ -timezone = node.metadata.get('timezone', 'UTC') +timezone = node.metadata.get('timezone') actions['systemd-reload'] = { 'command': 'systemctl daemon-reload', diff --git a/bundles/systemd/metadata.py b/bundles/systemd/metadata.py index 15f9b8a..76f2016 100644 --- a/bundles/systemd/metadata.py +++ b/bundles/systemd/metadata.py @@ -21,6 +21,7 @@ defaults = { }, }, }, + 'timezone': 'UTC', } if not node.has_bundle('rsyslogd'): From 77b2d02e6631b0d785ecedad1eafc343a33c4c59 Mon Sep 17 00:00:00 2001 From: Sophie Schiller Date: Sat, 7 Dec 2024 22:41:10 +0100 Subject: [PATCH 085/252] sophie.unbound: new node --- nodes/sophie/unbound.py | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 nodes/sophie/unbound.py diff --git a/nodes/sophie/unbound.py b/nodes/sophie/unbound.py new file mode 100644 index 0000000..e0cb10d --- /dev/null +++ b/nodes/sophie/unbound.py @@ -0,0 +1,32 @@ +nodes["sophie.unbound"] = { + "hostname": "172.19.164.4", + "bundles": { + "unbound", + }, + "groups": { + "debian-bookworm", + }, + "metadata": { + "interfaces": { + "enp1s0": { + "ips": { + "172.19.164.4/24", + "fe80::4/64", + }, + "gateway4": "172.19.164.1", + "ipv6_accept_ra": True, + }, + }, + "vm": { + "cpu": 2, + "ram": 2, + }, + "unbound": { + "dns64": False, + "restrict-to": { + "172.19.164.0/24", + "fe80::/64", + }, + }, + }, +} From c03690fe88eb997e583aed16266dc3ec1f9bdf8e Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Sun, 8 Dec 2024 14:10:59 +0100 Subject: [PATCH 086/252] bundles/pacman: always use linux-lts please --- bundles/pacman/files/pacman.conf | 14 +------------- bundles/pacman/items.py | 8 ++------ bundles/pacman/metadata.py | 1 + bundles/zfs/items.py | 3 +++ bundles/zfs/metadata.py | 27 ++++++--------------------- nodes/kunsi-p14s.py | 8 ++++---- 6 files changed, 17 insertions(+), 44 deletions(-) diff --git a/bundles/pacman/files/pacman.conf b/bundles/pacman/files/pacman.conf index 834108e..7fb4e48 100644 --- a/bundles/pacman/files/pacman.conf +++ b/bundles/pacman/files/pacman.conf @@ -32,21 +32,9 @@ Include = /etc/pacman.d/mirrorlist Server = ${node.metadata.get('pacman/repository')} Include = /etc/pacman.d/mirrorlist % endif -% if node.metadata.get('pacman/enable_aurto', True): +% if node.metadata.get('pacman/enable_aurto'): [aurto] Server = https://aurto.kunbox.net/ SigLevel = Optional TrustAll % endif -% if node.has_bundle('zfs'): - -[archzfs] -Server = http://archzfs.com/archzfs/x86_64 - -% if node.metadata.get('pacman/linux-lts', False): -[zfs-linux-lts] -% else: -[zfs-linux] -% endif -Server = http://kernels.archzfs.com/$repo/ -% endif diff --git a/bundles/pacman/items.py b/bundles/pacman/items.py index 9f80ca7..fe4f605 100644 --- a/bundles/pacman/items.py +++ b/bundles/pacman/items.py @@ -33,6 +33,7 @@ svc_systemd['paccache.timer'] = { } pkg_pacman = { + 'acpi_call-lts': {}, 'at': {}, 'autoconf': {}, 'automake': {}, @@ -61,6 +62,7 @@ pkg_pacman = { 'ldns': {}, 'less': {}, 'libtool': {}, + 'linux-lts': {}, 'logrotate': {}, 'lsof': {}, 'm4': {}, @@ -102,12 +104,6 @@ pkg_pacman = { 'zip': {}, } -if node.metadata.get('pacman/linux-lts', False): - pkg_pacman['linux-lts'] = {} - pkg_pacman['acpi_call-lts'] = {} -else: - pkg_pacman['linux'] = {} - pkg_pacman['acpi_call'] = {} for pkg, config in node.metadata.get('pacman/packages', {}).items(): pkg_pacman[pkg] = config diff --git a/bundles/pacman/metadata.py b/bundles/pacman/metadata.py index fb69a04..1c60981 100644 --- a/bundles/pacman/metadata.py +++ b/bundles/pacman/metadata.py @@ -4,6 +4,7 @@ defaults = { 'glibc', 'pacman', }, + 'enable_aurto': True, 'no_extract': { 'etc/cron.d/0hourly', # don't install systemd-homed pam module. It produces a lot of spam in diff --git a/bundles/zfs/items.py b/bundles/zfs/items.py index c63250e..8b13f4b 100644 --- a/bundles/zfs/items.py +++ b/bundles/zfs/items.py @@ -2,6 +2,9 @@ from json import dumps from bundlewrap.metadata import MetadataJSONEncoder +if node.has_bundle('pacman'): + assert node.metadata.get('pacman/enable_aurto'), f'{node.name}: bundle:zfs needs aurto for zfs-linux-lts package' + files = { '/etc/modprobe.d/zfs.conf': { 'source': 'zfs-modprobe.conf', diff --git a/bundles/zfs/metadata.py b/bundles/zfs/metadata.py index 01ed900..4191834 100644 --- a/bundles/zfs/metadata.py +++ b/bundles/zfs/metadata.py @@ -48,6 +48,12 @@ defaults = { 'etc/sudoers.d/zfs', }, 'packages': { + 'zfs-linux-lts': { + 'needed_by': { + 'zfs_dataset:', + 'zfs_pool:', + }, + }, 'zfs-utils': { 'needed_by': { 'svc_systemd:zfs-zed', @@ -121,27 +127,6 @@ if node.has_bundle('telegraf'): } -@metadata_reactor.provides( - 'pacman/packages', -) -def packages(metadata): - if node.metadata.get('pacman/linux-lts', False): - pkgname = 'zfs-linux-lts' - else: - pkgname = 'zfs-linux' - return { - 'pacman': { - 'packages': { - pkgname: { - 'needed_by': { - 'zfs_dataset:', - 'zfs_pool:', - }, - }, - }, - }, - } - @metadata_reactor.provides( 'apt/packages', ) diff --git a/nodes/kunsi-p14s.py b/nodes/kunsi-p14s.py index b94f2b0..385cf3f 100644 --- a/nodes/kunsi-p14s.py +++ b/nodes/kunsi-p14s.py @@ -115,10 +115,10 @@ nodes['kunsi-p14s'] = { 'entries': { 'arch': { 'title': 'Arch Linux', - 'linux': '/vmlinuz-linux', + 'linux': '/vmlinuz-linux-lts', 'initrd': [ '/amd-ucode.img', - '/initramfs-linux.img', + '/initramfs-linux-lts.img', ], 'options': { 'net.ifnames=0', @@ -128,9 +128,9 @@ nodes['kunsi-p14s'] = { }, 'arch-fallback': { 'title': 'Arch Linux (no ucode, fallback initramfs)', - 'linux': '/vmlinuz-linux', + 'linux': '/vmlinuz-linux-lts', 'initrd': [ - '/initramfs-linux-fallback.img', + '/initramfs-linux-lts-fallback.img', ], 'options': { 'net.ifnames=0', From c084048905a0c3e51ffb30c30f622a770f1514c2 Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Sun, 8 Dec 2024 14:18:40 +0100 Subject: [PATCH 087/252] home.nas: add samba share for various TV streams --- nodes/home/nas.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/nodes/home/nas.py b/nodes/home/nas.py index 741fa75..c9b630e 100644 --- a/nodes/home/nas.py +++ b/nodes/home/nas.py @@ -177,6 +177,10 @@ nodes['home.nas'] = { }, 'samba': { 'shares': { + 'TV': { + 'path': '/storage/nas/TV', + 'force_group': 'nas', + }, 'music': { 'path': '/storage/nas/Musik', 'force_group': 'nas', From e55f32bfb6562549de7d66187b12045991c9bd78 Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Sun, 8 Dec 2024 15:49:19 +0100 Subject: [PATCH 088/252] use device serial if description is not set --- bundles/infobeamer-monitor/files/monitor.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/bundles/infobeamer-monitor/files/monitor.py b/bundles/infobeamer-monitor/files/monitor.py index e5755c2..01ffe29 100644 --- a/bundles/infobeamer-monitor/files/monitor.py +++ b/bundles/infobeamer-monitor/files/monitor.py @@ -40,7 +40,10 @@ def mqtt_out(message, level="INFO", device=None): key = "infobeamer" if device: key += f"/{device['id']}" - message = f"[{device['description']}] {message}" + if device["description"]: + message = f"[{device['description']}] {message}" + else: + message = f"[{device['serial']}] {message}" client.publish( CONFIG["mqtt"]["topic"], From 316ba1c1c6fabb1417b53ab1816b792765416b4f Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Sun, 8 Dec 2024 15:52:54 +0100 Subject: [PATCH 089/252] voc.infobeamer-cms: room names --- nodes/voc/infobeamer-cms.py | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/nodes/voc/infobeamer-cms.py b/nodes/voc/infobeamer-cms.py index ceebc9e..c610345 100644 --- a/nodes/voc/infobeamer-cms.py +++ b/nodes/voc/infobeamer-cms.py @@ -72,11 +72,12 @@ nodes['voc.infobeamer-cms'] = { }, }, 'rooms': { - 'Saal 1': 34430, - 'Saal G': 26598, - 'Saal Z': 26610, - 'Saal E (SoS/Lightning-Talks)': 32814, - 'Saal F (Sendezentrum/DLF)': 9717, + 'Saal 1': 34430, # s1 + 'Saal GLITCH': 37731, # s2 + 'Saal ZIGZAG': 26610, # s3 + 'Saal HUFF': 38641, # s4 + 'Saal YELL': 38642, # s5 + 'Sendezentrum': 35042, # s6 }, 'interrupts': { 'Questions': 'questions', From bd2662b87ae085f2753ee229601a98130e911b80 Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Thu, 12 Dec 2024 11:02:14 +0100 Subject: [PATCH 090/252] update travelynx to 2.9.6 --- nodes/carlene.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nodes/carlene.toml b/nodes/carlene.toml index b0f1593..f027fcd 100644 --- a/nodes/carlene.toml +++ b/nodes/carlene.toml @@ -262,7 +262,7 @@ disks = [ ] [metadata.travelynx] -version = "2.9.2" +version = "2.9.6" mail_from = "travelynx@franzi.business" domain = "travelynx.franzi.business" From 58304bf5c6aeacc9fd3c3fb0d94f6f69d9aff6c5 Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Wed, 18 Dec 2024 10:43:35 +0100 Subject: [PATCH 091/252] voc.infobeamer-cms: add evilscientress and stblassitude --- nodes/voc/infobeamer-cms.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/nodes/voc/infobeamer-cms.py b/nodes/voc/infobeamer-cms.py index c610345..2e4e8cb 100644 --- a/nodes/voc/infobeamer-cms.py +++ b/nodes/voc/infobeamer-cms.py @@ -29,6 +29,7 @@ nodes['voc.infobeamer-cms'] = { 'event_duration_days': 5, 'config': { 'ADMIN_USERS': [ + 'evilscientress', 'hexchen', 'jbeyerstedt', 'jwacalex', @@ -36,6 +37,9 @@ nodes['voc.infobeamer-cms'] = { 'sophieschi', 'v0tti', ], + 'NO_LIMIT_USERS': [ + 'stblassitude', + ], 'GITHUB_CLIENT_ID': vault.decrypt('encrypt$gAAAAABiNwHfIu9PYFfJrF7qirn_9vdvvUlEhJnadoNSS5XlCDbI_aMyj21_ZYQxaCkc6_eVX6Cj1jEHZ7Vs6wM-XyQdW0nUOahtqG4uvnYCiM3GFKHW_wQ='), 'GITHUB_CLIENT_SECRET': vault.decrypt('encrypt$gAAAAABiNwHtdZC2XQ8IjosL7vsmrxZMwDIM6AD5dUlLo996tJs4qV7KJETHgYYZil2aMzClwhcE6JmxdhARRp7IJQ4rQQibelTNmyYSzj_V4puVpvma7SU0UZkTIG95SdPpoHY--Zba'), 'HOSTED_API_KEY': vault.decrypt('encrypt$gAAAAABhxJPH2sIGMAibU2Us1HoCVlNfF0SQQnVl0eiod48Zu8webL_-xk3wDw3yXw1Hkglj-2usl-D3Yd095yTSq0vZMCv2fh-JWwSPdJewQ45x9Ai4vXVD4CNz5vuJBESKS9xQWXTc'), From 2f73aae13b42a3b37b815e906b6aa63ce8a483a5 Mon Sep 17 00:00:00 2001 From: Sophie Schiller Date: Thu, 19 Dec 2024 03:15:27 +0100 Subject: [PATCH 092/252] bw/ssl new cert for home.sophie --- data/ssl/_.home.sophies-kitchen.eu.crt.pem | 38 +++++++++---------- ...me.sophies-kitchen.eu.crt_intermediate.pem | 36 +++++++++--------- .../_.home.sophies-kitchen.eu.key.pem.vault | 2 +- 3 files changed, 38 insertions(+), 38 deletions(-) diff --git a/data/ssl/_.home.sophies-kitchen.eu.crt.pem b/data/ssl/_.home.sophies-kitchen.eu.crt.pem index df6ad40..c0e1bad 100644 --- a/data/ssl/_.home.sophies-kitchen.eu.crt.pem +++ b/data/ssl/_.home.sophies-kitchen.eu.crt.pem @@ -1,23 +1,23 @@ -----BEGIN CERTIFICATE----- -MIIDxjCCA0ygAwIBAgISBIbwgyWchKDri2pD+Lk46M3eMAoGCCqGSM49BAMDMDIx +MIIDxzCCA02gAwIBAgISA1HOrGT03Yk2QXIKpt4i5P2mMAoGCCqGSM49BAMDMDIx CzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MQswCQYDVQQDEwJF -NTAeFw0yNDA5MTkxOTQ5NDFaFw0yNDEyMTgxOTQ5NDBaMCIxIDAeBgNVBAMTF2hv -bWUuc29waGllcy1raXRjaGVuLmV1MHYwEAYHKoZIzj0CAQYFK4EEACIDYgAE4rKd -PfAtfQts90WjdnsscizZzlUF/HZBx97kT4/eWgyU/MNOFGF4WqGA92OX0ymZVJ7l -D4CnHq96odx0LqHBQ+W+MXNlsWnwBTUOPKp8XyUeDhZbkgNJDR8nGtHje9a8o4IC -MzCCAi8wDgYDVR0PAQH/BAQDAgeAMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEF -BQcDAjAMBgNVHRMBAf8EAjAAMB0GA1UdDgQWBBSONIAWFPI0mqJYBqnWk1J0Ea27 -sDAfBgNVHSMEGDAWgBSfK1/PPCFPnQS37SssxMZwi9LXDTBVBggrBgEFBQcBAQRJ -MEcwIQYIKwYBBQUHMAGGFWh0dHA6Ly9lNS5vLmxlbmNyLm9yZzAiBggrBgEFBQcw -AoYWaHR0cDovL2U1LmkubGVuY3Iub3JnLzA9BgNVHREENjA0ghkqLmhvbWUuc29w +NjAeFw0yNDEyMTkwMTE2MTdaFw0yNTAzMTkwMTE2MTZaMCIxIDAeBgNVBAMTF2hv +bWUuc29waGllcy1raXRjaGVuLmV1MHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEKI2X +YK5pxQUcBjOYQwH6OQBEaj2kVhtj1BgRXXrap/U3Zi9M1oKpDk22husbUDS4fACo +IFAsNYbFi15ayAwvkkcWEe4VkgYEdPVJes3XnkL1YOGzUpT9+eC6VbjCxjfdo4IC +NDCCAjAwDgYDVR0PAQH/BAQDAgeAMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEF +BQcDAjAMBgNVHRMBAf8EAjAAMB0GA1UdDgQWBBRQB7GGtPhw9dPLCx28NgPOq+Wa +jjAfBgNVHSMEGDAWgBSTJ0aYA6lRaI6Y1sRCSNsjv1iU0jBVBggrBgEFBQcBAQRJ +MEcwIQYIKwYBBQUHMAGGFWh0dHA6Ly9lNi5vLmxlbmNyLm9yZzAiBggrBgEFBQcw +AoYWaHR0cDovL2U2LmkubGVuY3Iub3JnLzA9BgNVHREENjA0ghkqLmhvbWUuc29w aGllcy1raXRjaGVuLmV1ghdob21lLnNvcGhpZXMta2l0Y2hlbi5ldTATBgNVHSAE -DDAKMAgGBmeBDAECATCCAQMGCisGAQQB1nkCBAIEgfQEgfEA7wB1AEiw42vapkc0 -D+VqAvqdMOscUgHLVt0sgdm7v6s52IRzAAABkgwK350AAAQDAEYwRAIga5zPs7YZ -mJqbxhinEJKKQ9XCe1w/MhBzFMzwHFGbaPgCIHeprkwET14Y3h5dmUF7szwTg1Ey -zqLM+GQL3t7EAX2cAHYAPxdLT9ciR1iUHWUchL4NEu2QN38fhWrrwb8ohez4ZG4A -AAGSDArfogAABAMARzBFAiEA0faR1cyqpmCyHo/0KCv04fkpwgzWdMY+WopJXDLD -zz8CIEBKANatmiRstc5D69jKhq2beHldLZB3jRfm1WlWqmxJMAoGCCqGSM49BAMD -A2gAMGUCMCrpe2jxoTH410jNJPOnbN4ae0Ng54JtRNcFWHlcwpk07NrByJSTPWDd -zr7AYsbbVQIxAOGboJcIxsuf+rN30iWoe5KwCY3sd5XW8bEKFQnugIVHxAQKnHNc -0InWz2sVWYKNBA== +DDAKMAgGBmeBDAECATCCAQQGCisGAQQB1nkCBAIEgfUEgfIA8AB3AKLjCuRF772t +m3447Udnd1PXgluElNcrXhssxLlQpEfnAAABk9yyNhIAAAQDAEgwRgIhAOsCeRvZ +GUN1z2lGajkrKcCtffuDhwNRPAIN2we+oXuzAiEA7XeLDROcGGcOYUMin5xKE+qr +XwitlCEyUejC5xKJm1QAdQDM+w9qhXEJZf6Vm1PO6bJ8IumFXA2XjbapflTA/kwN +sAAAAZPcsjYwAAAEAwBGMEQCIFRahCu7PZCNkSF6+oyB3MAWoLQYmjlDXxeI91E0 +QfOkAiBGaToUTmM1n16nkX0hMVhNm7icCFojHkNCUzfSJ0wk8zAKBggqhkjOPQQD +AwNoADBlAjAgbshjfMt0K8pG2NzhVW1m/es3HJEtK4QGAe/BR5lgjLy1bJG/iLr9 +eXPh4xACg5wCMQDx7cF2C2T06e9ogshtJGODQSM9tGHbtt2rpAbUAzWNZgu+F3XL +mwaSjFAL7mBYSMM= -----END CERTIFICATE----- diff --git a/data/ssl/_.home.sophies-kitchen.eu.crt_intermediate.pem b/data/ssl/_.home.sophies-kitchen.eu.crt_intermediate.pem index 59039ae..4652201 100644 --- a/data/ssl/_.home.sophies-kitchen.eu.crt_intermediate.pem +++ b/data/ssl/_.home.sophies-kitchen.eu.crt_intermediate.pem @@ -1,27 +1,27 @@ -----BEGIN CERTIFICATE----- -MIIEVzCCAj+gAwIBAgIRAIOPbGPOsTmMYgZigxXJ/d4wDQYJKoZIhvcNAQELBQAw +MIIEVzCCAj+gAwIBAgIRALBXPpFzlydw27SHyzpFKzgwDQYJKoZIhvcNAQELBQAw TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMjQwMzEzMDAwMDAw WhcNMjcwMzEyMjM1OTU5WjAyMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNTGV0J3Mg -RW5jcnlwdDELMAkGA1UEAxMCRTUwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQNCzqK -a2GOtu/cX1jnxkJFVKtj9mZhSAouWXW0gQI3ULc/FnncmOyhKJdyIBwsz9V8UiBO -VHhbhBRrwJCuhezAUUE8Wod/Bk3U/mDR+mwt4X2VEIiiCFQPmRpM5uoKrNijgfgw +RW5jcnlwdDELMAkGA1UEAxMCRTYwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAATZ8Z5G +h/ghcWCoJuuj+rnq2h25EqfUJtlRFLFhfHWWvyILOR/VvtEKRqotPEoJhC6+QJVV +6RlAN2Z17TJOdwRJ+HB7wxjnzvdxEP6sdNgA1O1tHHMWMxCcOrLqbGL0vbijgfgw gfUwDgYDVR0PAQH/BAQDAgGGMB0GA1UdJQQWMBQGCCsGAQUFBwMCBggrBgEFBQcD -ATASBgNVHRMBAf8ECDAGAQH/AgEAMB0GA1UdDgQWBBSfK1/PPCFPnQS37SssxMZw -i9LXDTAfBgNVHSMEGDAWgBR5tFnme7bl5AFzgAiIyBpY9umbbjAyBggrBgEFBQcB +ATASBgNVHRMBAf8ECDAGAQH/AgEAMB0GA1UdDgQWBBSTJ0aYA6lRaI6Y1sRCSNsj +v1iU0jAfBgNVHSMEGDAWgBR5tFnme7bl5AFzgAiIyBpY9umbbjAyBggrBgEFBQcB AQQmMCQwIgYIKwYBBQUHMAKGFmh0dHA6Ly94MS5pLmxlbmNyLm9yZy8wEwYDVR0g BAwwCjAIBgZngQwBAgEwJwYDVR0fBCAwHjAcoBqgGIYWaHR0cDovL3gxLmMubGVu -Y3Iub3JnLzANBgkqhkiG9w0BAQsFAAOCAgEAH3KdNEVCQdqk0LKyuNImTKdRJY1C -2uw2SJajuhqkyGPY8C+zzsufZ+mgnhnq1A2KVQOSykOEnUbx1cy637rBAihx97r+ -bcwbZM6sTDIaEriR/PLk6LKs9Be0uoVxgOKDcpG9svD33J+G9Lcfv1K9luDmSTgG -6XNFIN5vfI5gs/lMPyojEMdIzK9blcl2/1vKxO8WGCcjvsQ1nJ/Pwt8LQZBfOFyV -XP8ubAp/au3dc4EKWG9MO5zcx1qT9+NXRGdVWxGvmBFRAajciMfXME1ZuGmk3/GO -koAM7ZkjZmleyokP1LGzmfJcUd9s7eeu1/9/eg5XlXd/55GtYjAM+C4DG5i7eaNq -cm2F+yxYIPt6cbbtYVNJCGfHWqHEQ4FYStUyFnv8sjyqU8ypgZaNJ9aVcWSICLOI -E1/Qv/7oKsnZCWJ926wU6RqG1OYPGOi1zuABhLw61cuPVDT28nQS/e6z95cJXq0e -K1BcaJ6fJZsmbjRgD5p3mvEf5vdQM7MCEvU0tHbsx2I5mHHJoABHb8KVBgWp/lcX -GWiWaeOyB7RP+OfDtvi2OsapxXiV7vNVs7fMlrRjY1joKaqmmycnBvAq14AEbtyL -sVfOS66B8apkeFX2NY4XPEYV4ZSCe8VHPrdrERk2wILG3T/EGmSIkCYVUMSnjmJd -VQD9F6Na/+zmXCc= +Y3Iub3JnLzANBgkqhkiG9w0BAQsFAAOCAgEAfYt7SiA1sgWGCIpunk46r4AExIRc +MxkKgUhNlrrv1B21hOaXN/5miE+LOTbrcmU/M9yvC6MVY730GNFoL8IhJ8j8vrOL +pMY22OP6baS1k9YMrtDTlwJHoGby04ThTUeBDksS9RiuHvicZqBedQdIF65pZuhp +eDcGBcLiYasQr/EO5gxxtLyTmgsHSOVSBcFOn9lgv7LECPq9i7mfH3mpxgrRKSxH +pOoZ0KXMcB+hHuvlklHntvcI0mMMQ0mhYj6qtMFStkF1RpCG3IPdIwpVCQqu8GV7 +s8ubknRzs+3C/Bm19RFOoiPpDkwvyNfvmQ14XkyqqKK5oZ8zhD32kFRQkxa8uZSu +h4aTImFxknu39waBxIRXE4jKxlAmQc4QjFZoq1KmQqQg0J/1JF8RlFvJas1VcjLv +YlvUB2t6npO6oQjB3l+PNf0DpQH7iUx3Wz5AjQCi6L25FjyE06q6BZ/QlmtYdl/8 +ZYao4SRqPEs/6cAiF+Qf5zg2UkaWtDphl1LKMuTNLotvsX99HP69V2faNyegodQ0 +LyTApr/vT01YPE46vNsDLgK+4cL6TrzC/a4WcmF5SRJ938zrv/duJHLXQIku5v0+ +EwOy59Hdm0PT/Er/84dDV0CSjdR/2XuZM3kpysSKLgD1cKiDA+IRguODCxfO9cyY +Ig46v9mFmBvyH04= -----END CERTIFICATE----- diff --git a/data/ssl/_.home.sophies-kitchen.eu.key.pem.vault b/data/ssl/_.home.sophies-kitchen.eu.key.pem.vault index ce7b75d..4b79230 100644 --- a/data/ssl/_.home.sophies-kitchen.eu.key.pem.vault +++ b/data/ssl/_.home.sophies-kitchen.eu.key.pem.vault @@ -1 +1 @@ -encrypt$gAAAAABm7I7N50TwtCs2LUt_MArRJnLQ-xLFVhr-zDtdWUVMejViIN2O9h5d_RP45jWt5BpxIkTORarcULXprEXp7zbb-CR5CTwbsNK6HnvSHPwuwXuxJQKRJtT4wWfYEFOxY9aUR9gxvXc3arsYHwVsGyLOeWA_6YzjO5IpL1LfQrsJuUE_1p9sKRyPpslmOJtD5OihMtIfAJNzBDwOSE_gdtLa8iae3DHtSvmKbGKSvwQEZ0pkJxVTVXJY4wddQmdsuV0ky04ls_tUINH8t6IMTJCt_5_ELzpTSdcHgV6W4yh8r_LTEH38n2boYnz3fKgieHnDHDWxFW1EYA2JWjkamH7hQ8iOMl8bqQieFAENnYjF41iz6tSCjfxVyKt_OfJUAwMScVMhPsuaI_i_ZB0Ge6BLsMwkw0d3yw06CwRQ3N7PcPPJLhL_eQS3EuV7Y-7Vv64secplJJIkcFfm1t5zcGkkm4-pDw== \ No newline at end of file +encrypt$gAAAAABnY4Ga6MmpudhHnOVKVh3j6R071y-Bs6es3e3hNHkZP7Tfj6IomEhTSxWb_oG9HYZmhkadw66cmVRQcxp1wGChWWLye-ykadgy0xUCxGW3YmBWp4t--Yesvbjamaa5OlvDFWQVG5Zt4fsY7BloXRdio8XUdPKBkbi2MV0quvpqsFfOqr_ZmIOOkjLlZojfw9HQ7odM9lSAm8cVS5NXimOhA1ks_gK6CzJbzwhpbekCOcx5_sGhdb8XFUxLN-VBtmQ2HGIncou66rE1P3mBg2hDSyqiXapVMkqMjNoVM71V_5lUnAF7Lxce3nG72SnOe2oITnxRNcnaavxDEgd0ffM5revuCd-XWlaUW1iQrgSyQzJyD6Ukv-mM2IRpuoq79JdTZK_LNJkAmJozrGBT0c5ZwGVNLmZEcjQ1dk8jyYslF5s7rK1lmNvcTUaHGpFToXc1p-qFY8NNWj_Iu-MLE8PNrIscDg== \ No newline at end of file From 8f61fec65f069fecfa4ea117947eb909f8ed2c0e Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Fri, 20 Dec 2024 10:24:36 +0100 Subject: [PATCH 093/252] bundles/infobeamer-cms: ensure we have and use redis --- bundles/infobeamer-cms/metadata.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/bundles/infobeamer-cms/metadata.py b/bundles/infobeamer-cms/metadata.py index 9d602e0..f340e01 100644 --- a/bundles/infobeamer-cms/metadata.py +++ b/bundles/infobeamer-cms/metadata.py @@ -1,10 +1,13 @@ from datetime import datetime, timedelta +assert node.has_bundle('redis') + defaults = { 'infobeamer-cms': { 'config': { 'MAX_UPLOADS': 5, 'PREFERRED_URL_SCHEME': 'https', + 'REDIS_HOST': '127.0.0.1', 'SESSION_COOKIE_NAME': '__Host-sess', 'STATIC_PATH': '/opt/infobeamer-cms/static', 'URL_KEY': repo.vault.password_for(f'{node.name} infobeamer-cms url key'), From 6cd20c2e43195d6948b25e50859bd1552e8dd0fe Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Fri, 20 Dec 2024 13:14:57 +0100 Subject: [PATCH 094/252] fix device names for s4, s5 and s6 --- nodes/voc/infobeamer-cms.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/nodes/voc/infobeamer-cms.py b/nodes/voc/infobeamer-cms.py index 2e4e8cb..023a589 100644 --- a/nodes/voc/infobeamer-cms.py +++ b/nodes/voc/infobeamer-cms.py @@ -79,9 +79,9 @@ nodes['voc.infobeamer-cms'] = { 'Saal 1': 34430, # s1 'Saal GLITCH': 37731, # s2 'Saal ZIGZAG': 26610, # s3 - 'Saal HUFF': 38641, # s4 - 'Saal YELL': 38642, # s5 - 'Sendezentrum': 35042, # s6 + 'Sendezentrum': 38641, # s4 + 'Stage YELL': 38642, # s5 + 'Stage HUFF': 35042, # s6 }, 'interrupts': { 'Questions': 'questions', From 12d179235e6ec74bbdb9f664a3fd1eb0726341a6 Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Sun, 22 Dec 2024 04:59:29 +0100 Subject: [PATCH 095/252] bump nodejs versions --- bundles/element-web/metadata.py | 2 +- bundles/paperless-ng/metadata.py | 2 +- bundles/powerdnsadmin/metadata.py | 2 +- bundles/pretalx/metadata.py | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/bundles/element-web/metadata.py b/bundles/element-web/metadata.py index b68b481..5ee7449 100644 --- a/bundles/element-web/metadata.py +++ b/bundles/element-web/metadata.py @@ -20,7 +20,7 @@ def nodejs(metadata): if version >= (1, 11, 71): return { 'nodejs': { - 'version': 20, + 'version': 22, }, } else: diff --git a/bundles/paperless-ng/metadata.py b/bundles/paperless-ng/metadata.py index 91a18c6..6746616 100644 --- a/bundles/paperless-ng/metadata.py +++ b/bundles/paperless-ng/metadata.py @@ -34,7 +34,7 @@ defaults = { }, }, 'nodejs': { - 'version': 18, + 'version': 22, }, 'postgresql': { 'roles': { diff --git a/bundles/powerdnsadmin/metadata.py b/bundles/powerdnsadmin/metadata.py index e6f5014..c2b2c1e 100644 --- a/bundles/powerdnsadmin/metadata.py +++ b/bundles/powerdnsadmin/metadata.py @@ -14,7 +14,7 @@ defaults = { }, }, 'nodejs': { - 'version': 18, + 'version': 22, }, 'users': { 'powerdnsadmin': { diff --git a/bundles/pretalx/metadata.py b/bundles/pretalx/metadata.py index 7bbad24..15b61e3 100644 --- a/bundles/pretalx/metadata.py +++ b/bundles/pretalx/metadata.py @@ -27,7 +27,7 @@ defaults = { }, }, 'nodejs': { - 'version': 18, + 'version': 22, }, 'pretalx': { 'database': { From 958ea3c9e3b10c4ea76663c317a9c50bb70c685f Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Sun, 22 Dec 2024 04:59:55 +0100 Subject: [PATCH 096/252] libs/tools: add option to only add private ips if system has only private ips --- libs/tools.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/libs/tools.py b/libs/tools.py index 7a984df..4f98677 100644 --- a/libs/tools.py +++ b/libs/tools.py @@ -5,7 +5,7 @@ from bundlewrap.utils.text import bold, red from bundlewrap.utils.ui import io -def resolve_identifier(repo, identifier, linklocal=False, only_physical=False): +def resolve_identifier(repo, identifier, linklocal=False, only_physical=False, allow_private=True): """ Try to resolve an identifier (group or node). Return a set of ip addresses valid for this identifier. @@ -62,10 +62,15 @@ def resolve_identifier(repo, identifier, linklocal=False, only_physical=False): 'ipv6': set(), } + has_public_ips = bool([ip for ip in found_ips if not ip.is_private]) + for ip in found_ips: if ip.is_link_local and not linklocal: continue + if ip.is_private and not allow_private and has_public_ips: + continue + if isinstance(ip, IPv4Address): ip_dict['ipv4'].add(ip) else: From 6f6b1932e2889fc024f562d98989481b198c5b78 Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Sun, 22 Dec 2024 05:03:54 +0100 Subject: [PATCH 097/252] bundles/pretalx: fix syntax error --- bundles/pretalx/items.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bundles/pretalx/items.py b/bundles/pretalx/items.py index 75e4c09..e6b22a4 100644 --- a/bundles/pretalx/items.py +++ b/bundles/pretalx/items.py @@ -116,7 +116,7 @@ svc_systemd = { 'pretalx-worker': { 'needs': { 'action:pretalx_install', - 'action:pretalx_migrate',, + 'action:pretalx_migrate', 'action:pretalx_rebuild', 'file:/etc/systemd/system/pretalx-worker.service', 'file:/opt/pretalx/pretalx.cfg', From 9ba35569d6702a939164dc9d26e3799a689e4e59 Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Sun, 22 Dec 2024 05:25:44 +0100 Subject: [PATCH 098/252] home.hass: bump python version for home assistant --- nodes/home.hass.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/nodes/home.hass.toml b/nodes/home.hass.toml index 52a2388..afb204f 100644 --- a/nodes/home.hass.toml +++ b/nodes/home.hass.toml @@ -25,8 +25,8 @@ domain = 'hass.home.kunbox.net' api_secret = '!decrypt:encrypt$gAAAAABm9lNg_mNhyzb4S6WRtVRDmQFBnPpoCwyqMnilRrAFUXc-EDvv-nYXPbSIbjTf7ZReTPtqr8k3WrGPqiuqhJ60LVv4A5DMqT5c6hTVr4WbhP4DPEIPgfd5aq6U9_-H9WDyQYHKjnunLJEYtEREzmhTq3XsYeQ05DyE7hfnQ-zVoBb0CsAK7GdhihRTdvhXv2N9M04_rigyBP-roRcUgCqwyHuWJc0IPAyn3R4Mr43ZqgR2fn6dNV_YUVKn9c0nWxIwRnYy6Ff_Te9NoGVmXxkiNUX-90bBLKFiCzrRAtizxrTiQb2SRipaWbgOlV6wbMy2KNux' [metadata.pyenv] -version = 'v2.3.36' -python_versions = ["3.12.2"] +version = 'v2.4.23' +python_versions = ["3.13.1"] [metadata.nginx.vhosts.homeassistant] ssl = '_.home.kunbox.net' From 4124e6788f4b01cc8da361e90cb811f9996f5722 Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Sun, 22 Dec 2024 11:32:35 +0100 Subject: [PATCH 099/252] bundles/infobeamer-monitor: sort by device id --- bundles/infobeamer-monitor/files/monitor.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bundles/infobeamer-monitor/files/monitor.py b/bundles/infobeamer-monitor/files/monitor.py index 01ffe29..7646fa6 100644 --- a/bundles/infobeamer-monitor/files/monitor.py +++ b/bundles/infobeamer-monitor/files/monitor.py @@ -93,7 +93,7 @@ while True: ) else: new_state = {} - for device in ib_state: + for device in sorted(ib_state, key=lambda x: x["id"]): did = str(device["id"]) if did in new_state: From 54ccb5f44fbacdbccb7f75906f035fdfbf604fb1 Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Sun, 22 Dec 2024 11:39:37 +0100 Subject: [PATCH 100/252] update element-web to 1.11.89 --- nodes/carlene.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nodes/carlene.toml b/nodes/carlene.toml index f027fcd..eb7dba7 100644 --- a/nodes/carlene.toml +++ b/nodes/carlene.toml @@ -40,7 +40,7 @@ imap_pass = "!bwpass_attr:t-online.de/franzi.kunsmann@t-online.de:imap" [metadata.element-web] url = "chat.franzi.business" -version = "v1.11.86" +version = "v1.11.89" [metadata.element-web.config] default_server_config.'m.homeserver'.base_url = "https://matrix.franzi.business" default_server_config.'m.homeserver'.server_name = "franzi.business" From c552dad9b4fb5e8d70b2c237ba4ebae211a8c522 Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Sun, 22 Dec 2024 11:39:53 +0100 Subject: [PATCH 101/252] update forgejo to 9.0.3 --- nodes/carlene.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/nodes/carlene.toml b/nodes/carlene.toml index eb7dba7..9ca4691 100644 --- a/nodes/carlene.toml +++ b/nodes/carlene.toml @@ -49,8 +49,8 @@ defaultCountryCode = "DE" jitsi.preferredDomain = "meet.ffmuc.net" [metadata.forgejo] -version = "9.0.2" -sha1 = "5aecc64f93e8ef05c6d6f83d4b647bdb2c831d9f" +version = "9.0.3" +sha1 = "a04a8d5bee7321610d91da780a24e18f7407403c" domain = "git.franzi.business" enable_git_hooks = true install_ssh_key = true From ca72edd77511a4358c7767990f888081230ea469 Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Sun, 22 Dec 2024 11:40:06 +0100 Subject: [PATCH 102/252] update mautrix-whatsapp to 0.11.2 --- nodes/carlene.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/nodes/carlene.toml b/nodes/carlene.toml index 9ca4691..2288222 100644 --- a/nodes/carlene.toml +++ b/nodes/carlene.toml @@ -114,8 +114,8 @@ provisioning.shared_secret = "!decrypt:encrypt$gAAAAABfVKflEMAi07C_QGP8cy97hF-4g "'@kunsi:franzi.business'" = "admin" [metadata.mautrix-whatsapp] -version = "v0.11.1" -sha1 = "ada2dc6acfd5cb15fae341266b383d3f6e8b42bd" +version = "v0.11.2" +sha1 = "0bd8ebef237473989c4e9658c72595e9f7c09d44" permissions."'@kunsi:franzi.business'" = "admin" [metadata.mautrix-whatsapp.homeserver] domain = "franzi.business" From 71705f8b231183e5cecbf584609a1c4e131585e0 Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Sun, 22 Dec 2024 11:40:27 +0100 Subject: [PATCH 103/252] update netbox to 4.1.9 --- nodes/carlene.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nodes/carlene.toml b/nodes/carlene.toml index 2288222..85ac262 100644 --- a/nodes/carlene.toml +++ b/nodes/carlene.toml @@ -126,7 +126,7 @@ domain = "rss.franzi.business" [metadata.netbox] domain = "netbox.franzi.business" -version = "v4.1.7" +version = "v4.1.9" admins.kunsi = "hostmaster@kunbox.net" [metadata.nextcloud] From 17ff238b24125f6c8e6c7edb7d454db9e18d5fe9 Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Sun, 22 Dec 2024 11:40:40 +0100 Subject: [PATCH 104/252] update postfixadmin to 3.3.15 --- nodes/carlene.toml | 2 +- nodes/htz-cloud/pirmasens.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/nodes/carlene.toml b/nodes/carlene.toml index 85ac262..6d90334 100644 --- a/nodes/carlene.toml +++ b/nodes/carlene.toml @@ -213,7 +213,7 @@ blocked_recipients = [ [metadata.postfixadmin] domain = "postfixadmin.franzi.business" setup_password = "!decrypt:encrypt$gAAAAABgnNGpAqUs--qBXII9ZPcHtxaELy9e2Dx9O44n4l0O4nMHPoIyaPW5HkvpQ2zWTlh5OfjjOgunRtE_voJuY0Kdtji37ixAnuL9ErOJ0LDY5QfMkNPUgPs5alwz1baqYq6rqJ7NDmB0gHraY46v5eG79R2EyQ==" -version = "3.3.14" +version = "3.3.15" [metadata.postgresql] version = 15 diff --git a/nodes/htz-cloud/pirmasens.py b/nodes/htz-cloud/pirmasens.py index 46f4638..655f325 100644 --- a/nodes/htz-cloud/pirmasens.py +++ b/nodes/htz-cloud/pirmasens.py @@ -71,7 +71,7 @@ nodes['htz-cloud.pirmasens'] = { }, 'postfixadmin': { 'domain': 'mail.kunsmann.info', - 'version': '3.3.14', + 'version': '3.3.15', 'setup_password': vault.decrypt('encrypt$gAAAAABgnNGpAqUs--qBXII9ZPcHtxaELy9e2Dx9O44n4l0O4nMHPoIyaPW5HkvpQ2zWTlh5OfjjOgunRtE_voJuY0Kdtji37ixAnuL9ErOJ0LDY5QfMkNPUgPs5alwz1baqYq6rqJ7NDmB0gHraY46v5eG79R2EyQ=='), }, 'postgresql': { From 9395fcb7f5253ac75c557e264ad208b32bb3c999 Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Sun, 22 Dec 2024 20:01:26 +0100 Subject: [PATCH 105/252] home.nas: rename zpool --- nodes/home/nas.py | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/nodes/home/nas.py b/nodes/home/nas.py index c9b630e..52a2bfd 100644 --- a/nodes/home/nas.py +++ b/nodes/home/nas.py @@ -264,7 +264,7 @@ nodes['home.nas'] = { 'zfs_arc_max_gb': 8, }, 'pools': { - 'storage': { + 'tank': { 'when_creating': { 'config': [ { @@ -321,22 +321,22 @@ nodes['home.nas'] = { 'encrypted/paperless': { 'mountpoint': '/media/paperless', }, - 'storage': { + 'tank': { 'primarycache': 'metadata', }, - 'storage/opt-yate': { + 'tank/opt-yate': { 'mountpoint': '/opt/yate', }, - 'storage/download': { + 'tank/download': { 'mountpoint': '/storage/download', }, - 'storage/nas': { + 'tank/nas': { 'acltype': 'off', 'atime': 'off', 'compression': 'off', 'mountpoint': '/media/nas_old', }, - 'storage/paperless': { + 'tank/paperless': { 'mountpoint': '/srv/paperless', }, }, @@ -359,19 +359,19 @@ nodes['home.nas'] = { 'weekly': 6, 'monthly': 24, }, - 'storage/download': { + 'tank/download': { 'hourly': 48, 'daily': 0, 'weekly': 0, 'monthly': 0, }, - 'storage/nas': { + 'tank/nas': { # juuuuuuuust to be sure. 'daily': 14, 'weekly': 6, 'monthly': 12, }, - 'storage/paperless': { + 'tank/paperless': { 'daily': 14, 'weekly': 6, 'monthly': 24, From 91432197e8fae83fbc133d1c113ae111dc88bd5d Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Sun, 22 Dec 2024 20:19:59 +0100 Subject: [PATCH 106/252] add bundle:avahi-daemon --- bundles/avahi-daemon/files/avahi-daemon.conf | 21 ++++++++++++++++++++ bundles/avahi-daemon/items.py | 17 ++++++++++++++++ bundles/avahi-daemon/metadata.py | 7 +++++++ 3 files changed, 45 insertions(+) create mode 100644 bundles/avahi-daemon/files/avahi-daemon.conf create mode 100644 bundles/avahi-daemon/items.py create mode 100644 bundles/avahi-daemon/metadata.py diff --git a/bundles/avahi-daemon/files/avahi-daemon.conf b/bundles/avahi-daemon/files/avahi-daemon.conf new file mode 100644 index 0000000..7a639fd --- /dev/null +++ b/bundles/avahi-daemon/files/avahi-daemon.conf @@ -0,0 +1,21 @@ +[server] +host-name=${node.name.split('.')[-1]} +use-ipv4=yes +use-ipv6=yes +ratelimit-interval-usec=1000000 +ratelimit-burst=1000 + +[wide-area] +enable-wide-area=yes + +[publish] +disable-publishing=no +disable-user-service-publishing=no +publish-hinfo=yes +publish-workstation=no +publish-aaaa-on-ipv4=yes +publish-a-on-ipv6=no + +[reflector] + +[rlimits] diff --git a/bundles/avahi-daemon/items.py b/bundles/avahi-daemon/items.py new file mode 100644 index 0000000..74bcdd3 --- /dev/null +++ b/bundles/avahi-daemon/items.py @@ -0,0 +1,17 @@ +directories['/etc/avahi/services'] = { + 'purge': True, +} + +files['/etc/avahi/avahi-daemon.conf'] = { + 'content_type': 'mako', + 'triggers': { + 'svc_systemd:avahi-daemon:restart', + }, +} + +svc_systemd['avahi-daemon'] = { + 'needs': { + 'file:/etc/avahi/avahi-daemon.conf', + 'pkg_apt:avahi-daemon', + }, +} diff --git a/bundles/avahi-daemon/metadata.py b/bundles/avahi-daemon/metadata.py new file mode 100644 index 0000000..b1400d9 --- /dev/null +++ b/bundles/avahi-daemon/metadata.py @@ -0,0 +1,7 @@ +defaults = { + 'apt': { + 'packages': { + 'avahi-daemon': {}, + }, + }, +} From ab717f62e7bd57c179f55d6f6480660a96e196b1 Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Sun, 22 Dec 2024 20:20:20 +0100 Subject: [PATCH 107/252] bundles/samba: add code to show up as time machine backup target --- bundles/samba/files/smb.conf | 28 +++++++++++++++++++++++++ bundles/samba/files/timemachine.service | 21 +++++++++++++++++++ bundles/samba/items.py | 26 +++++++++++++++++++++++ bundles/samba/metadata.py | 27 ++++++++++++++++++++++++ 4 files changed, 102 insertions(+) create mode 100644 bundles/samba/files/timemachine.service diff --git a/bundles/samba/files/smb.conf b/bundles/samba/files/smb.conf index c9a7859..22905ee 100644 --- a/bundles/samba/files/smb.conf +++ b/bundles/samba/files/smb.conf @@ -13,6 +13,13 @@ map to guest = bad user load printers = no usershare allow guests = yes allow insecure wide links = yes +min protocol = SMB2 +% if timemachine: +vfs objects = fruit +fruit:aapl = yes +fruit:copyfile = yes +fruit:model = MacSamba +% endif % for name, opts in sorted(node.metadata.get('samba/shares', {}).items()): [${name}] @@ -37,3 +44,24 @@ follow symlinks = yes wide links = yes % endif % endfor +% for name in sorted(timemachine): + +[timemachine-${name}] +comment = Time Machine backup for ${name} +available = yes +browseable = yes +guest ok = no +read only = false +valid users = timemachine-${name} +path = /srv/timemachine/${name} +durable handles = yes +vfs objects = catia fruit streams_xattr + +fruit:delete_empty_adfiles = yes +fruit:metadata = stream +fruit:posix_rename = yes +fruit:time machine = yes +fruit:time machine max size = 750G +fruit:veto_appledouble = no +fruit:wipe_intentionally_left_blank_rfork = yes +% endfor diff --git a/bundles/samba/files/timemachine.service b/bundles/samba/files/timemachine.service new file mode 100644 index 0000000..d25e6e5 --- /dev/null +++ b/bundles/samba/files/timemachine.service @@ -0,0 +1,21 @@ + + + + %h + + _smb._tcp + 445 + + + _device-info._tcp + 0 + model=RackMac1,2 + + + _adisk._tcp +% for idx, share_name in enumerate(sorted(shares)): + dk${idx}=adVN=timemachine-${share_name},adVF=0x82 +% endfor + sys=waMa=0,adVF=0x100 + + diff --git a/bundles/samba/items.py b/bundles/samba/items.py index 333a338..a9567b4 100644 --- a/bundles/samba/items.py +++ b/bundles/samba/items.py @@ -11,9 +11,14 @@ svc_systemd = { }, } +timemachine_shares = node.metadata.get('samba/timemachine-shares', set()) + files = { '/etc/samba/smb.conf': { 'content_type': 'mako', + 'context': { + 'timemachine': timemachine_shares, + }, 'triggers': { 'svc_systemd:nmbd:restart', 'svc_systemd:smbd:restart', @@ -57,3 +62,24 @@ for user, uconfig in node.metadata.get('users', {}).items(): last_action = { f'action:smbpasswd_for_user_{user}', } + +if timemachine_shares: + assert node.has_bundle('avahi-daemon'), f'{node.name}: samba needs avahi-daemon to publish time machine shares' + + files['/etc/avahi/services/timemachine.service'] = { + 'content_type': 'mako', + 'context': { + 'shares': timemachine_shares, + }, + } + + for share_name in timemachine_shares: + users[f'timemachine-{share_name}'] = { + 'home': f'/srv/timemachine/{share_name}', + } + + directories[f'/srv/timemachine/{share_name}'] = { + 'owner': f'timemachine-{share_name}', + 'group': f'timemachine-{share_name}', + 'mode': '0700', + } diff --git a/bundles/samba/metadata.py b/bundles/samba/metadata.py index 7b9400c..c8243af 100644 --- a/bundles/samba/metadata.py +++ b/bundles/samba/metadata.py @@ -24,3 +24,30 @@ def firewall(metadata): }, }, } + + +@metadata_reactor.provides( + 'zfs/datasets', +) +def timemachine_zfs(metadata): + shares = metadata.get('samba/timemachine-shares', set()) + + if not shares: + return {} + + assert node.has_bundle('zfs'), f'{node.name}: time machine backups require zfs' + + datasets = { + 'tank/timemachine': {}, + } + + for share_name in shares: + datasets[f'tank/timemachine/{share_name}'] = { + 'mountpoint': f'/srv/timemachine/{share_name}', + } + + return { + 'zfs': { + 'datasets': datasets, + }, + } From 884c6f73af94678cf121f0ed6727a61cd4d5f444 Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Sun, 22 Dec 2024 20:24:20 +0100 Subject: [PATCH 108/252] home.nas: clean up some datasets --- nodes/home/nas.py | 29 ----------------------------- 1 file changed, 29 deletions(-) diff --git a/nodes/home/nas.py b/nodes/home/nas.py index 52a2bfd..84d4aff 100644 --- a/nodes/home/nas.py +++ b/nodes/home/nas.py @@ -309,18 +309,12 @@ nodes['home.nas'] = { 'encrypted': { 'primarycache': 'metadata', }, - 'encrypted/download': { - 'mountpoint': '/media/download', - }, 'encrypted/nas': { 'acltype': 'off', 'atime': 'off', 'compression': 'off', 'mountpoint': '/storage/nas', }, - 'encrypted/paperless': { - 'mountpoint': '/media/paperless', - }, 'tank': { 'primarycache': 'metadata', }, @@ -330,47 +324,24 @@ nodes['home.nas'] = { 'tank/download': { 'mountpoint': '/storage/download', }, - 'tank/nas': { - 'acltype': 'off', - 'atime': 'off', - 'compression': 'off', - 'mountpoint': '/media/nas_old', - }, 'tank/paperless': { 'mountpoint': '/srv/paperless', }, }, 'snapshots': { 'retain_per_dataset': { - 'encrypted/download': { - 'hourly': 6, - 'daily': 0, - 'weekly': 0, - 'monthly': 0, - }, 'encrypted/nas': { # juuuuuuuust to be sure. 'daily': 14, 'weekly': 6, 'monthly': 12, }, - 'encrypted/paperless': { - 'daily': 14, - 'weekly': 6, - 'monthly': 24, - }, 'tank/download': { 'hourly': 48, 'daily': 0, 'weekly': 0, 'monthly': 0, }, - 'tank/nas': { - # juuuuuuuust to be sure. - 'daily': 14, - 'weekly': 6, - 'monthly': 12, - }, 'tank/paperless': { 'daily': 14, 'weekly': 6, From fe4cd98612084da4c9b5c82d4d625d6ab2a64991 Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Sun, 22 Dec 2024 20:24:35 +0100 Subject: [PATCH 109/252] home.nas: prepare for time machine backups --- nodes/home/nas.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/nodes/home/nas.py b/nodes/home/nas.py index 84d4aff..bf14b89 100644 --- a/nodes/home/nas.py +++ b/nodes/home/nas.py @@ -3,6 +3,7 @@ nodes['home.nas'] = { 'hostname': '172.19.138.20', 'bundles': { + 'avahi-daemon', 'backup-client', 'dm-crypt', 'jellyfin', @@ -193,6 +194,9 @@ nodes['home.nas'] = { 'restrict-to': { '172.19.138.0/24', }, + 'timemachine-shares': { + #'apfelcomputer', # hostname TBD + }, }, 'smartd': { 'disks': { From c455718847fdfae59a6f8062e5f21d020373322c Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Sun, 22 Dec 2024 20:29:39 +0100 Subject: [PATCH 110/252] bundles/avahi-daemon: install more dependencies and limit to interfaces that are configured --- bundles/avahi-daemon/files/avahi-daemon.conf | 1 + bundles/avahi-daemon/items.py | 1 + bundles/avahi-daemon/metadata.py | 1 + 3 files changed, 3 insertions(+) diff --git a/bundles/avahi-daemon/files/avahi-daemon.conf b/bundles/avahi-daemon/files/avahi-daemon.conf index 7a639fd..efdd222 100644 --- a/bundles/avahi-daemon/files/avahi-daemon.conf +++ b/bundles/avahi-daemon/files/avahi-daemon.conf @@ -2,6 +2,7 @@ host-name=${node.name.split('.')[-1]} use-ipv4=yes use-ipv6=yes +allow-interfaces=${','.join(sorted(node.metadata.get('interfaces', {}).keys()))} ratelimit-interval-usec=1000000 ratelimit-burst=1000 diff --git a/bundles/avahi-daemon/items.py b/bundles/avahi-daemon/items.py index 74bcdd3..0a0f1aa 100644 --- a/bundles/avahi-daemon/items.py +++ b/bundles/avahi-daemon/items.py @@ -13,5 +13,6 @@ svc_systemd['avahi-daemon'] = { 'needs': { 'file:/etc/avahi/avahi-daemon.conf', 'pkg_apt:avahi-daemon', + 'pkg_apt:libnss-mdns', }, } diff --git a/bundles/avahi-daemon/metadata.py b/bundles/avahi-daemon/metadata.py index b1400d9..0bb909f 100644 --- a/bundles/avahi-daemon/metadata.py +++ b/bundles/avahi-daemon/metadata.py @@ -2,6 +2,7 @@ defaults = { 'apt': { 'packages': { 'avahi-daemon': {}, + 'libnss-mdns': {}, }, }, } From 0df4c8f75e100064cc7d4e89452121c9e59d4e4a Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Mon, 23 Dec 2024 09:56:55 +0100 Subject: [PATCH 111/252] bump as3320 and as8881 routes --- configs/as3320.txt | 75 +++++++++++++++++++++++++++++----------------- configs/as8881.txt | 16 ++++++++-- 2 files changed, 61 insertions(+), 30 deletions(-) diff --git a/configs/as3320.txt b/configs/as3320.txt index 5c42e56..0ac3052 100644 --- a/configs/as3320.txt +++ b/configs/as3320.txt @@ -1,3 +1,4 @@ +109.203.176.0/21 109.237.176.0/20 109.72.116.0/24 116.50.16.0/21 @@ -19,7 +20,6 @@ 141.77.0.0/16 143.99.213.0/24 145.225.16.0/23 -146.247.58.0/24 147.161.22.0/24 147.78.17.0/24 147.79.8.0/21 @@ -31,10 +31,13 @@ 149.237.203.0/24 149.237.250.0/24 149.237.251.0/24 +149.237.254.0/24 149.243.232.0/22 149.249.244.0/22 149.249.244.0/23 149.249.246.0/23 +151.243.168.0/24 +151.243.173.0/24 153.17.244.8/29 153.17.249.0/24 153.17.250.0/24 @@ -46,12 +49,13 @@ 153.96.218.0/24 153.96.22.0/24 153.97.32.0/24 +153.97.34.0/24 158.116.231.0/24 -160.211.126.0/24 163.5.156.0/24 163.5.170.0/24 163.5.186.0/24 163.5.220.0/24 +163.5.47.0/24 163.5.66.0/24 164.133.10.0/24 164.133.11.0/24 @@ -96,6 +100,7 @@ 185.202.32.0/21 185.207.46.0/24 185.21.247.0/24 +185.224.0.0/24 185.237.0.0/24 185.237.1.0/24 185.237.2.0/24 @@ -108,11 +113,16 @@ 185.28.208.0/22 185.39.12.0/22 185.48.0.0/22 -185.57.231.0/24 185.57.24.0/24 185.82.160.0/23 +185.97.227.0/24 +188.208.124.0/24 +188.208.125.0/24 +188.209.223.0/24 +188.214.136.0/24 +188.214.137.0/24 +188.214.138.0/24 188.214.139.0/24 -192.109.121.0/24 192.109.122.0/24 192.109.124.0/24 192.109.129.0/24 @@ -153,7 +163,6 @@ 193.100.248.0/22 193.100.252.0/24 193.100.3.0/24 -193.101.12.0/22 193.101.128.0/22 193.101.139.0/24 193.101.162.0/23 @@ -285,6 +294,7 @@ 194.127.242.0/23 194.127.254.0/24 194.145.252.0/24 +194.147.171.0/24 194.15.194.0/24 194.15.60.0/24 194.15.61.0/24 @@ -319,7 +329,6 @@ 194.180.64.0/20 194.25.0.0/16 194.25.1.5/32 -194.26.191.0/24 194.31.142.0/24 194.31.208.0/24 194.31.209.0/24 @@ -330,6 +339,11 @@ 194.33.115.0/24 194.33.120.0/24 194.33.121.0/24 +194.33.50.0/24 +194.38.48.0/24 +194.38.49.0/24 +194.38.50.0/24 +194.38.51.0/24 194.39.175.0/24 194.39.189.0/24 194.39.48.0/20 @@ -429,6 +443,9 @@ 205.142.63.0/24 212.184.0.0/15 212.185.0.0/16 +212.68.172.0/22 +212.68.176.0/22 +212.68.180.0/22 213.145.90.0/23 213.145.92.0/23 213.173.0.0/19 @@ -437,7 +454,7 @@ 213.209.156.0/24 217.0.0.0/13 217.117.96.0/24 -217.198.189.0/24 +217.177.33.0/24 217.224.0.0/11 217.24.32.0/20 217.24.33.0/24 @@ -447,17 +464,22 @@ 31.224.0.0/11 31.6.56.0/23 37.143.0.0/22 +37.230.61.0/24 37.46.11.0/24 37.50.0.0/15 37.80.0.0/12 +45.112.192.0/24 +45.129.165.0/24 45.132.80.0/22 45.141.54.0/24 45.145.16.0/24 45.147.227.0/24 +45.149.7.0/24 45.155.77.0/24 45.81.255.0/24 45.83.136.0/22 45.93.186.0/23 +46.202.0.0/24 46.250.224.0/21 46.250.232.0/21 46.78.0.0/15 @@ -474,6 +496,7 @@ 62.224.0.0/14 62.56.208.0/21 62.68.73.0/24 +62.72.172.0/24 64.137.119.0/24 64.137.125.0/24 64.137.127.0/24 @@ -516,7 +539,9 @@ 84.32.48.0/22 84.55.0.0/24 84.55.1.0/24 +84.55.17.0/24 84.55.2.0/24 +84.55.22.0/24 84.55.3.0/24 84.55.4.0/24 84.55.5.0/24 @@ -527,13 +552,19 @@ 85.116.30.0/24 85.116.31.0/24 85.119.160.0/23 +85.133.193.0/24 +85.133.208.0/24 +85.133.214.0/24 +85.133.254.0/24 85.204.181.0/24 85.208.248.0/24 85.208.249.0/24 85.208.250.0/24 85.208.251.0/24 86.105.211.0/24 +86.105.58.0/24 86.107.164.0/24 +86.110.57.0/24 86.38.248.0/21 86.38.37.0/24 87.128.0.0/10 @@ -545,7 +576,6 @@ 89.116.64.0/22 89.213.186.0/23 89.39.97.0/24 -89.43.34.0/24 91.0.0.0/10 91.103.240.0/21 91.124.135.0/24 @@ -559,7 +589,6 @@ 91.124.27.0/24 91.124.28.0/24 91.124.31.0/24 -91.124.32.0/24 91.124.33.0/24 91.124.34.0/24 91.124.36.0/24 @@ -606,27 +635,15 @@ 91.222.232.0/22 91.227.98.0/23 91.232.54.0/24 -92.112.128.0/24 -92.112.155.0/24 -92.112.157.0/24 +91.246.176.0/21 +92.112.10.0/24 +92.112.158.0/24 92.112.16.0/22 -92.112.160.0/24 -92.112.162.0/24 -92.112.165.0/24 -92.112.167.0/24 92.112.20.0/22 92.112.48.0/24 -92.112.49.0/24 -92.112.52.0/24 -92.112.54.0/24 -92.112.59.0/24 -92.112.63.0/24 -92.112.64.0/24 -92.112.67.0/24 -92.112.79.0/24 -92.112.81.0/24 -92.112.83.0/24 -92.112.94.0/24 +92.112.6.0/24 +92.112.7.0/24 +92.112.8.0/24 92.114.44.0/22 92.119.164.0/22 92.119.208.0/24 @@ -635,8 +652,12 @@ 92.119.211.0/24 93.113.70.0/24 93.119.201.0/24 +93.119.232.0/24 93.192.0.0/10 94.126.98.0/24 +94.176.72.0/24 +94.176.74.0/24 +94.176.79.0/24 94.26.110.0/23 94.26.64.0/23 95.178.8.0/21 diff --git a/configs/as8881.txt b/configs/as8881.txt index cd09176..aa354f9 100644 --- a/configs/as8881.txt +++ b/configs/as8881.txt @@ -6,6 +6,7 @@ 109.250.192.0/19 109.250.224.0/19 109.250.64.0/18 +109.72.113.0/24 134.101.0.0/21 14.102.90.0/24 143.58.64.0/18 @@ -121,6 +122,7 @@ 202.71.128.0/20 202.71.141.0/24 212.204.0.0/19 +212.23.205.0/24 212.7.128.0/19 212.8.0.0/19 212.80.224.0/19 @@ -152,6 +154,8 @@ 46.142.96.0/19 46.142.96.0/20 46.189.0.0/17 +46.203.156.0/24 +46.203.227.0/24 61.8.128.0/19 61.8.128.0/22 61.8.132.0/22 @@ -164,6 +168,7 @@ 62.214.224.0/19 62.217.32.0/19 62.220.0.0/19 +62.220.1.0/24 62.68.82.0/24 62.72.64.0/19 62.72.70.0/24 @@ -224,6 +229,7 @@ 88.130.0.0/16 88.130.136.0/21 88.130.144.0/20 +88.130.172.0/22 88.130.176.0/21 88.130.192.0/23 88.130.194.0/23 @@ -242,14 +248,16 @@ 88.130.63.0/24 88.130.64.0/19 88.130.96.0/19 +89.187.24.0/24 +89.187.26.0/24 89.207.200.0/21 89.244.0.0/14 89.244.120.0/21 89.244.160.0/21 89.244.176.0/20 89.244.192.0/19 -89.244.224.0/20 -89.244.76.0/24 +89.244.224.0/19 +89.244.76.0/22 89.244.78.0/23 89.244.80.0/20 89.244.96.0/22 @@ -266,7 +274,6 @@ 89.245.64.0/19 89.245.96.0/20 89.246.0.0/19 -89.246.112.0/22 89.246.122.0/24 89.246.124.0/22 89.246.160.0/21 @@ -325,6 +332,8 @@ 92.117.248.0/21 92.117.64.0/19 92.117.96.0/19 +93.114.90.0/24 +93.114.91.0/24 94.134.0.0/15 94.134.0.0/18 94.134.112.0/22 @@ -350,6 +359,7 @@ 2001:1438:1:a00::/56 2001:1438:2000::/36 2001:1438:3000::/36 +2001:1438:300::/56 2001:1438:4000::/36 2001:1438::/32 2001:16b8:1000::/40 From 0adf14a2934fad72711071094e224aca003b5c6f Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Mon, 23 Dec 2024 10:15:00 +0100 Subject: [PATCH 112/252] bundles/infobeamer-cms: times are in UTC, please --- bundles/infobeamer-cms/metadata.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/bundles/infobeamer-cms/metadata.py b/bundles/infobeamer-cms/metadata.py index f340e01..4413d5a 100644 --- a/bundles/infobeamer-cms/metadata.py +++ b/bundles/infobeamer-cms/metadata.py @@ -1,4 +1,4 @@ -from datetime import datetime, timedelta +from datetime import datetime, timedelta, timezone assert node.has_bundle('redis') @@ -52,7 +52,7 @@ def nginx(metadata): 'infobeamer-cms/config/TIME_MIN', ) def event_times(metadata): - event_start = datetime.strptime(metadata.get('infobeamer-cms/event_start_date'), '%Y-%m-%d') + event_start = datetime.strptime(metadata.get('infobeamer-cms/event_start_date'), '%Y-%m-%d').replace(tzinfo=timezone.utc) event_duration = metadata.get('infobeamer-cms/event_duration_days', 4) event_end = event_start + timedelta(days=event_duration) From 1c1be571d8b53710fbbea3a0e51c595142e3092d Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Mon, 23 Dec 2024 13:41:24 +0100 Subject: [PATCH 113/252] update travelynx to 2.9.8 --- nodes/carlene.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nodes/carlene.toml b/nodes/carlene.toml index 6d90334..645a460 100644 --- a/nodes/carlene.toml +++ b/nodes/carlene.toml @@ -262,7 +262,7 @@ disks = [ ] [metadata.travelynx] -version = "2.9.6" +version = "2.9.8" mail_from = "travelynx@franzi.business" domain = "travelynx.franzi.business" From 158b091487066635202d988943fa09f485b93384 Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Mon, 23 Dec 2024 19:05:59 +0100 Subject: [PATCH 114/252] voc.infobeamer-cms: new sso setup --- nodes/voc/infobeamer-cms.py | 29 +++++++++++++++++++---------- 1 file changed, 19 insertions(+), 10 deletions(-) diff --git a/nodes/voc/infobeamer-cms.py b/nodes/voc/infobeamer-cms.py index 023a589..2a743fa 100644 --- a/nodes/voc/infobeamer-cms.py +++ b/nodes/voc/infobeamer-cms.py @@ -29,21 +29,20 @@ nodes['voc.infobeamer-cms'] = { 'event_duration_days': 5, 'config': { 'ADMIN_USERS': [ - 'evilscientress', - 'hexchen', - 'jbeyerstedt', - 'jwacalex', - 'kunsi', - 'sophieschi', - 'v0tti', + 'github:evilscientress', + 'github:hexchen', + 'github:jbeyerstedt', + 'github:jwacalex', + 'github:sophieschi', + 'github:v0tti', ], 'NO_LIMIT_USERS': [ - 'stblassitude', + 'github:stblassitude', ], - 'GITHUB_CLIENT_ID': vault.decrypt('encrypt$gAAAAABiNwHfIu9PYFfJrF7qirn_9vdvvUlEhJnadoNSS5XlCDbI_aMyj21_ZYQxaCkc6_eVX6Cj1jEHZ7Vs6wM-XyQdW0nUOahtqG4uvnYCiM3GFKHW_wQ='), - 'GITHUB_CLIENT_SECRET': vault.decrypt('encrypt$gAAAAABiNwHtdZC2XQ8IjosL7vsmrxZMwDIM6AD5dUlLo996tJs4qV7KJETHgYYZil2aMzClwhcE6JmxdhARRp7IJQ4rQQibelTNmyYSzj_V4puVpvma7SU0UZkTIG95SdPpoHY--Zba'), 'HOSTED_API_KEY': vault.decrypt('encrypt$gAAAAABhxJPH2sIGMAibU2Us1HoCVlNfF0SQQnVl0eiod48Zu8webL_-xk3wDw3yXw1Hkglj-2usl-D3Yd095yTSq0vZMCv2fh-JWwSPdJewQ45x9Ai4vXVD4CNz5vuJBESKS9xQWXTc'), 'INTERRUPT_KEY': vault.human_password_for('infobeamer-cms interrupt key 38c3', words=1), + 'DEFAULT_SSO_PROVIDER': 'github', + 'DEFAULT_ADMIN_SSO_PROVIDER': 'c3voc', 'SETUP_IDS': [ 255228, ], @@ -74,6 +73,16 @@ nodes['voc.infobeamer-cms'] = { or #info-beamer on the cccv rocketchat instance. '''.strip(), }, + 'oauth2_providers': { + 'github': { + 'client_id': vault.decrypt('encrypt$gAAAAABiNwHfIu9PYFfJrF7qirn_9vdvvUlEhJnadoNSS5XlCDbI_aMyj21_ZYQxaCkc6_eVX6Cj1jEHZ7Vs6wM-XyQdW0nUOahtqG4uvnYCiM3GFKHW_wQ='), + 'client_secret': vault.decrypt('encrypt$gAAAAABiNwHtdZC2XQ8IjosL7vsmrxZMwDIM6AD5dUlLo996tJs4qV7KJETHgYYZil2aMzClwhcE6JmxdhARRp7IJQ4rQQibelTNmyYSzj_V4puVpvma7SU0UZkTIG95SdPpoHY--Zba'), + }, + 'c3voc': { + 'client_id': 'uqzN2mYeMq4vxnHL6HNmBC80hsvYcfhzniiczdqV', + 'client_secret': vault.decrypt('encrypt$gAAAAABnaZ0z-hQ3yYf8P1g4gyLLvNHcNkiXVtIq7M11qswbzcVM4upfgtxCWBlCgwLN3v7CxwDFQbJnosEq0hbX4c0TEoOausV4upJD0-5zP_1U18gbMGicpZ0TCzYyEhOqvCye7UmFOWzOmplSX1fz43Pf7peDeaPxHjqmxjw0khyExzWw4JPOd1V7LhnesJmPCfGKXn5YHMDicrdYeqFf0FySN1yA5gfLNo7y-S1QMJ6-n6Jct7uuifF9t2OV-zyOj3cKK13B'), + }, + }, }, 'rooms': { 'Saal 1': 34430, # s1 From f06607df60329e1998c4871c75df51ea4503c7eb Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Mon, 23 Dec 2024 19:27:34 +0100 Subject: [PATCH 115/252] voc.infobeamer-cms: remove github admins of c3voc sso users --- nodes/voc/infobeamer-cms.py | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/nodes/voc/infobeamer-cms.py b/nodes/voc/infobeamer-cms.py index 2a743fa..e6de7d2 100644 --- a/nodes/voc/infobeamer-cms.py +++ b/nodes/voc/infobeamer-cms.py @@ -28,14 +28,7 @@ nodes['voc.infobeamer-cms'] = { 'event_start_date': '2024-12-26', 'event_duration_days': 5, 'config': { - 'ADMIN_USERS': [ - 'github:evilscientress', - 'github:hexchen', - 'github:jbeyerstedt', - 'github:jwacalex', - 'github:sophieschi', - 'github:v0tti', - ], + 'ADMIN_USERS': [], 'NO_LIMIT_USERS': [ 'github:stblassitude', ], From f3f78700e712b56a9d9779d8e920ed0b417eb0e1 Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Tue, 24 Dec 2024 12:46:59 +0100 Subject: [PATCH 116/252] voc.infobeamer-cms: add 38c3 hub sso --- nodes/voc/infobeamer-cms.py | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/nodes/voc/infobeamer-cms.py b/nodes/voc/infobeamer-cms.py index e6de7d2..e577141 100644 --- a/nodes/voc/infobeamer-cms.py +++ b/nodes/voc/infobeamer-cms.py @@ -67,14 +67,18 @@ nodes['voc.infobeamer-cms'] = { '''.strip(), }, 'oauth2_providers': { - 'github': { - 'client_id': vault.decrypt('encrypt$gAAAAABiNwHfIu9PYFfJrF7qirn_9vdvvUlEhJnadoNSS5XlCDbI_aMyj21_ZYQxaCkc6_eVX6Cj1jEHZ7Vs6wM-XyQdW0nUOahtqG4uvnYCiM3GFKHW_wQ='), - 'client_secret': vault.decrypt('encrypt$gAAAAABiNwHtdZC2XQ8IjosL7vsmrxZMwDIM6AD5dUlLo996tJs4qV7KJETHgYYZil2aMzClwhcE6JmxdhARRp7IJQ4rQQibelTNmyYSzj_V4puVpvma7SU0UZkTIG95SdPpoHY--Zba'), - }, + #'github': { + # 'client_id': vault.decrypt('encrypt$gAAAAABiNwHfIu9PYFfJrF7qirn_9vdvvUlEhJnadoNSS5XlCDbI_aMyj21_ZYQxaCkc6_eVX6Cj1jEHZ7Vs6wM-XyQdW0nUOahtqG4uvnYCiM3GFKHW_wQ='), + # 'client_secret': vault.decrypt('encrypt$gAAAAABiNwHtdZC2XQ8IjosL7vsmrxZMwDIM6AD5dUlLo996tJs4qV7KJETHgYYZil2aMzClwhcE6JmxdhARRp7IJQ4rQQibelTNmyYSzj_V4puVpvma7SU0UZkTIG95SdPpoHY--Zba'), + #}, 'c3voc': { 'client_id': 'uqzN2mYeMq4vxnHL6HNmBC80hsvYcfhzniiczdqV', 'client_secret': vault.decrypt('encrypt$gAAAAABnaZ0z-hQ3yYf8P1g4gyLLvNHcNkiXVtIq7M11qswbzcVM4upfgtxCWBlCgwLN3v7CxwDFQbJnosEq0hbX4c0TEoOausV4upJD0-5zP_1U18gbMGicpZ0TCzYyEhOqvCye7UmFOWzOmplSX1fz43Pf7peDeaPxHjqmxjw0khyExzWw4JPOd1V7LhnesJmPCfGKXn5YHMDicrdYeqFf0FySN1yA5gfLNo7y-S1QMJ6-n6Jct7uuifF9t2OV-zyOj3cKK13B'), }, + 'c3hub': { + 'client_id': '16oHBcVstcOKwt3EuX9E2urpYeVC0Dfo3Gzn2XhS', + 'client_secret': vault.decrypt('encrypt$gAAAAABnaoRKbORUcceyKu3tda3lgMIFC-e0cG0AeMdDYJ--EnTRxp8QcULOTf2oBtKQUk17hgwfsafTFi4eZq1FrjNgq1h5gm83oJYWLQ6pp8Rsp9kjwgtAXf72jIU-AOQxx02SoFMU8r5pdEFEX4FkU_ksbU6s7xgBW8oxq_WO2CXAppTUX61TeB9me2nSLFdJc5-v6RDpQfDvVAm7yNS_PhMvMgVzfEZrFM-EWF_bl0S_q0ejf88o9zaXHIMJpzMruVZOXD0T'), + }, }, }, 'rooms': { From 1c385514674a4326fd4b3de3bdb3a67cb47aa366 Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Tue, 24 Dec 2024 13:39:38 +0100 Subject: [PATCH 117/252] voc.infobeamer-cms: set default sso provider --- nodes/voc/infobeamer-cms.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/nodes/voc/infobeamer-cms.py b/nodes/voc/infobeamer-cms.py index e577141..043c7a5 100644 --- a/nodes/voc/infobeamer-cms.py +++ b/nodes/voc/infobeamer-cms.py @@ -34,8 +34,6 @@ nodes['voc.infobeamer-cms'] = { ], 'HOSTED_API_KEY': vault.decrypt('encrypt$gAAAAABhxJPH2sIGMAibU2Us1HoCVlNfF0SQQnVl0eiod48Zu8webL_-xk3wDw3yXw1Hkglj-2usl-D3Yd095yTSq0vZMCv2fh-JWwSPdJewQ45x9Ai4vXVD4CNz5vuJBESKS9xQWXTc'), 'INTERRUPT_KEY': vault.human_password_for('infobeamer-cms interrupt key 38c3', words=1), - 'DEFAULT_SSO_PROVIDER': 'github', - 'DEFAULT_ADMIN_SSO_PROVIDER': 'c3voc', 'SETUP_IDS': [ 255228, ], @@ -66,6 +64,8 @@ nodes['voc.infobeamer-cms'] = { or #info-beamer on the cccv rocketchat instance. '''.strip(), }, + 'DEFAULT_SSO_PROVIDER': 'c3hub', + 'DEFAULT_ADMIN_SSO_PROVIDER': 'c3voc', 'oauth2_providers': { #'github': { # 'client_id': vault.decrypt('encrypt$gAAAAABiNwHfIu9PYFfJrF7qirn_9vdvvUlEhJnadoNSS5XlCDbI_aMyj21_ZYQxaCkc6_eVX6Cj1jEHZ7Vs6wM-XyQdW0nUOahtqG4uvnYCiM3GFKHW_wQ='), From 1c8d2ccb665ea7234420aeb363cd0a54b5ec4db4 Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Fri, 27 Dec 2024 09:59:14 +0100 Subject: [PATCH 118/252] home.nas: add time machine share for apfelcomputer --- nodes/home/nas.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nodes/home/nas.py b/nodes/home/nas.py index bf14b89..bcf1f80 100644 --- a/nodes/home/nas.py +++ b/nodes/home/nas.py @@ -195,7 +195,7 @@ nodes['home.nas'] = { '172.19.138.0/24', }, 'timemachine-shares': { - #'apfelcomputer', # hostname TBD + 'apfelcomputer', }, }, 'smartd': { From 9e2b36767f7361b96832516a3e2b0939a892fa1d Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Fri, 27 Dec 2024 09:59:35 +0100 Subject: [PATCH 119/252] home.nas: remove inbox user --- nodes/home/nas.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/nodes/home/nas.py b/nodes/home/nas.py index bcf1f80..ad18be3 100644 --- a/nodes/home/nas.py +++ b/nodes/home/nas.py @@ -252,11 +252,11 @@ nodes['home.nas'] = { 'enable_x_forwarding_for_admins': True, }, 'users': { - 'inbox': { - 'ssh_pubkey': { - #'command="/usr/share/rsync/scripts/rrsync -wo /storage/inbox/",no-agent-forwarding,no-port-forwarding,no-pty,no-user-rc,no-X11-forwarding ', - }, - }, + #'inbox': { + # 'ssh_pubkey': { + # #'command="/usr/share/rsync/scripts/rrsync -wo /storage/inbox/",no-agent-forwarding,no-port-forwarding,no-pty,no-user-rc,no-X11-forwarding ', + # }, + #}, 'kunsi': { 'groups': { 'nas', From 81376c950c862a3201315bd463b41db3f4ede616 Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Sat, 28 Dec 2024 10:26:30 +0100 Subject: [PATCH 120/252] bundles/samba: increase time machine disk size --- bundles/samba/files/smb.conf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bundles/samba/files/smb.conf b/bundles/samba/files/smb.conf index 22905ee..7c4ad0b 100644 --- a/bundles/samba/files/smb.conf +++ b/bundles/samba/files/smb.conf @@ -61,7 +61,7 @@ fruit:delete_empty_adfiles = yes fruit:metadata = stream fruit:posix_rename = yes fruit:time machine = yes -fruit:time machine max size = 750G +fruit:time machine max size = 2000G fruit:veto_appledouble = no fruit:wipe_intentionally_left_blank_rfork = yes % endfor From 3e6872c96b8c1c004ac2855685353ac8960f9310 Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Sat, 28 Dec 2024 12:05:17 +0100 Subject: [PATCH 121/252] add .envrc --- .envrc | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 .envrc diff --git a/.envrc b/.envrc new file mode 100644 index 0000000..20da331 --- /dev/null +++ b/.envrc @@ -0,0 +1,3 @@ +layout python3 + + source_env_if_exists .envrc.local From 5afe534d9cf5dfa28864571fe4b88ce8936d8c00 Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Sat, 28 Dec 2024 12:32:27 +0100 Subject: [PATCH 122/252] scripts/update-ssh-client-config: add configurable extra line --- scripts/update-ssh-client-config | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/scripts/update-ssh-client-config b/scripts/update-ssh-client-config index 0c2f7fd..dc86661 100755 --- a/scripts/update-ssh-client-config +++ b/scripts/update-ssh-client-config @@ -12,10 +12,20 @@ BW_TABLE_STYLE=grep bw nodes -a hostname -- "lambda:not node.dummy" | \ while read node addr do + if [[ -z "$BW_SSH_HOOK_EXTRA_LINE" ]] + then + echo "Host $addr" >>"$tmpfile" + echo "$BW_SSH_HOOK_EXTRA_LINE" >>"$tmpfile" + echo "" >>"$tmpfile" + fi echo "Host $node" >>"$tmpfile" echo "HostName $addr" >>"$tmpfile" + if [[ -z "$BW_SSH_HOOK_EXTRA_LINE" ]] + then + echo "$BW_SSH_HOOK_EXTRA_LINE" >>"$tmpfile" + fi echo "" >>"$tmpfile" done - mv "$tmpfile" ~/.ssh/bwnodes + mv "$tmpfile" ~/.ssh/config.d/bwnodes ) & From 1c3768100c292100631c68ae73d528dddc295ff5 Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Sat, 28 Dec 2024 12:34:37 +0100 Subject: [PATCH 123/252] update netbox to 4.1.10 --- nodes/carlene.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nodes/carlene.toml b/nodes/carlene.toml index 645a460..4581a4b 100644 --- a/nodes/carlene.toml +++ b/nodes/carlene.toml @@ -126,7 +126,7 @@ domain = "rss.franzi.business" [metadata.netbox] domain = "netbox.franzi.business" -version = "v4.1.9" +version = "v4.1.10" admins.kunsi = "hostmaster@kunbox.net" [metadata.nextcloud] From b84bfb909f80cc6bce577d45ce5847f41df996ed Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Sat, 28 Dec 2024 17:22:21 +0100 Subject: [PATCH 124/252] fix update-ssh-client-config --- .gitignore | 2 ++ scripts/update-ssh-client-config | 4 ++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index bbb5845..7a53a34 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,5 @@ .secrets.cfg* __pycache__ *.swp +.direnv +.envrc.local diff --git a/scripts/update-ssh-client-config b/scripts/update-ssh-client-config index dc86661..ba5acde 100755 --- a/scripts/update-ssh-client-config +++ b/scripts/update-ssh-client-config @@ -12,7 +12,7 @@ BW_TABLE_STYLE=grep bw nodes -a hostname -- "lambda:not node.dummy" | \ while read node addr do - if [[ -z "$BW_SSH_HOOK_EXTRA_LINE" ]] + if [[ -n "$BW_SSH_HOOK_EXTRA_LINE" ]] then echo "Host $addr" >>"$tmpfile" echo "$BW_SSH_HOOK_EXTRA_LINE" >>"$tmpfile" @@ -20,7 +20,7 @@ fi echo "Host $node" >>"$tmpfile" echo "HostName $addr" >>"$tmpfile" - if [[ -z "$BW_SSH_HOOK_EXTRA_LINE" ]] + if [[ -n "$BW_SSH_HOOK_EXTRA_LINE" ]] then echo "$BW_SSH_HOOK_EXTRA_LINE" >>"$tmpfile" fi From 0b18ae0d1b7ae028f3b57b2531ddbb99c1907525 Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Sat, 28 Dec 2024 17:26:55 +0100 Subject: [PATCH 125/252] add new ssh key for kunsi --- users.json | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/users.json b/users.json index 5d5b066..031215c 100644 --- a/users.json +++ b/users.json @@ -11,7 +11,8 @@ }, "kunsi": { "ssh_pubkey": [ - "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQC+ja1z5VRQzaKCCePsUM14qMr9QR94qlWc7Je5Poki9UmC1t/TyxRVzcCBL1ZdIfBGx6QKtfkEbvhgb3nxVt3PvXjoJrc6wwGLmNrVsU6B88y35g7nzupQiPKYJwkNzJ9j6Dmkgj1F5Q+aY2SitDaX6vqICLJ4Al/ZFw2IQxVJfC7JXRJ9jRMG5o9gWoE3gWDYEAmw+HU2mNzyeuaD12qJw9DHUimAlgkOWzll3gh9WclsYnnXGrCCn5fyHFUCJl+XXAIy519z7YTpKih02rsIOw5dnaGClBZD/YQu2ZKVFZiwIVH7aBiqHOmtgRyWTQgjbh/fMpIN0ar2f/iZsWYUjd6et48TOmXZYIPCQ5FivXNvxt9oo1XZfq76UHBwlmypLJIWROMbz375n2M6hr3hECuxuPjKEUXAv05KiC1aJ4xc6pFoVhqwAR99hvHw5U4o7/ko2NVjNpTu6Jr5DT5VaQLIdDDjC/93kUjMpdD/8P72bEn7454+WexU6OE6uvNiHj1fetrptr2UAuzVfnCoaV8pBqY7X95gk+lnSENdpr8ltJYMg8s0Z7Pzz0OxsZtzzDY5VmWfC9TCdJkN5lT8IbnaixsYlWdjQl1lMmZGElmelfU3K7YQLAbZiHmHKe4hTl9ZoCcWdTQ3d4y2t1DBos+N2HZNdtFCyOS8esDdMw== cardno:000609506971" + "ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBG56iljhXQfY0euup1tUtMaFTONGI022uq/kpFOmIQVXeuIClcVB2p4BjL+GwRV51NnpqH9J+qow0/XK3YQkiHY=", + "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQC+ja1z5VRQzaKCCePsUM14qMr9QR94qlWc7Je5Poki9UmC1t/TyxRVzcCBL1ZdIfBGx6QKtfkEbvhgb3nxVt3PvXjoJrc6wwGLmNrVsU6B88y35g7nzupQiPKYJwkNzJ9j6Dmkgj1F5Q+aY2SitDaX6vqICLJ4Al/ZFw2IQxVJfC7JXRJ9jRMG5o9gWoE3gWDYEAmw+HU2mNzyeuaD12qJw9DHUimAlgkOWzll3gh9WclsYnnXGrCCn5fyHFUCJl+XXAIy519z7YTpKih02rsIOw5dnaGClBZD/YQu2ZKVFZiwIVH7aBiqHOmtgRyWTQgjbh/fMpIN0ar2f/iZsWYUjd6et48TOmXZYIPCQ5FivXNvxt9oo1XZfq76UHBwlmypLJIWROMbz375n2M6hr3hECuxuPjKEUXAv05KiC1aJ4xc6pFoVhqwAR99hvHw5U4o7/ko2NVjNpTu6Jr5DT5VaQLIdDDjC/93kUjMpdD/8P72bEn7454+WexU6OE6uvNiHj1fetrptr2UAuzVfnCoaV8pBqY7X95gk+lnSENdpr8ltJYMg8s0Z7Pzz0OxsZtzzDY5VmWfC9TCdJkN5lT8IbnaixsYlWdjQl1lMmZGElmelfU3K7YQLAbZiHmHKe4hTl9ZoCcWdTQ3d4y2t1DBos+N2HZNdtFCyOS8esDdMw==" ], "email": "encrypt$gAAAAABfuXj1DQ3yUn0rEdN2koT1hzgHwCwNp00a0KkWoT_FTsild1zIBpfIiI07AmgIZ5FpyhKH5bSdCVLKc0p4rQuxLrLWpw==", "phone": "encrypt$gAAAAABfuXkP2GetSvTd9JJFz4V2v5r5NubihFRg2AB91mtvXpUVUiflzy1VHQJ_qbp6Rke5LEXbtlluNkAa3OOAr_c9L6Pstw==", @@ -19,7 +20,7 @@ }, "sophie": { "ssh_pubkey": [ - "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDU7XmpX4w+rGQDi+dF6M0q65K2iHVgD1wHBoHREjyqCzmPGZgrnLIv6EN9WWJXjCgRdLEUXgPn7PNJnAgBs3U8G8MsF55yrPNUIsEeg6v+Y6zibEujMrwmeDSk0XAn8iSZcy+4cnqykIMk9Hd5WXW7ZhSHGs4MftWn3Z/q15qPHl/w9OyaKDJAjk8yEsD1sZoAQMhomKliKjJ5a6jNyf7otS3HdbZx4KXABJNuWn/IvmwkcaIU8ljyuPkPkiMn5JWhcUK2kE81Y4a5zJxxusSXSF6Ip7W2Rhv+4gnScTjhTPsG70HlSF/LAB2ytKo0F0N/ZB2hJk+Jq6cAwNBzuST7 sophie@ejgwmobile" + "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDU7XmpX4w+rGQDi+dF6M0q65K2iHVgD1wHBoHREjyqCzmPGZgrnLIv6EN9WWJXjCgRdLEUXgPn7PNJnAgBs3U8G8MsF55yrPNUIsEeg6v+Y6zibEujMrwmeDSk0XAn8iSZcy+4cnqykIMk9Hd5WXW7ZhSHGs4MftWn3Z/q15qPHl/w9OyaKDJAjk8yEsD1sZoAQMhomKliKjJ5a6jNyf7otS3HdbZx4KXABJNuWn/IvmwkcaIU8ljyuPkPkiMn5JWhcUK2kE81Y4a5zJxxusSXSF6Ip7W2Rhv+4gnScTjhTPsG70HlSF/LAB2ytKo0F0N/ZB2hJk+Jq6cAwNBzuST7" ] } } From 68fced83d6610353b44fb231768e6bb10bbda06b Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Tue, 31 Dec 2024 09:30:46 +0000 Subject: [PATCH 126/252] htz-cloud.wireguard: replace vpn of kunsi-p14s with apfelcomputer --- nodes/htz-cloud/wireguard.py | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/nodes/htz-cloud/wireguard.py b/nodes/htz-cloud/wireguard.py index df618ea..d7f97ff 100644 --- a/nodes/htz-cloud/wireguard.py +++ b/nodes/htz-cloud/wireguard.py @@ -101,12 +101,21 @@ nodes['htz-cloud.wireguard'] = { 'psk': vault.decrypt('encrypt$gAAAAABlbr26kyQ_DNIObVNtG31e1uSZkfDKH9Y1tzq8ZNSAMeuEh30cMJBZQskLLYqt5HUGd-YFwYQB_E7oa-WWbHmDh4vAxJ22Efr85tA0TWsgkc2KvKHqZrNo-GCXhxCqs7SqhW1C'), 'pubkey': vault.decrypt('encrypt$gAAAAABlbr27doNVsPXF7hMpAp93fP-h_jlW10zycZAHy05r4R7rOZrLqf5b-lhdamx_kQxypYtcW-jOCYgcqWNsId7RluEmFo3drFuUYKIa32YU_U0Pe5EjVRFz_tuf9NRPPugmHb22'), }, - 'kunsi-p14s': { + #'kunsi-p14s': { + # 'endpoint': None, + # 'exclude_from_monitoring': True, + # 'my_ip': '172.19.136.64', + # 'my_port': 1194, + # 'their_ip': '172.19.136.65', + #}, + 'apfelcomputer': { 'endpoint': None, 'exclude_from_monitoring': True, 'my_ip': '172.19.136.64', 'my_port': 1194, 'their_ip': '172.19.136.65', + 'psk': vault.decrypt('encrypt$gAAAAABnc7LZSHWmOOQJpbtnpMn9QuWnbiB-6rShwgqbilVd45GzkUwOfEHBw28P_TVm9XJgFiQPOIo12DdxPCzSxKRtcqzji72QCzTlze4ZYWjL-iHm7TydLcKzXOTCO42LKpkMPUgR'), + 'pubkey': vault.decrypt('encrypt$gAAAAABnc7LZpfAeig8yCdcZ-NegshXl-DmkJr0F2OlQR2fqhVnrfKPjgOu-5Cq09KnhdvhomGx_9ZtoFS_3OsVqcFHEasBh27aQN41xZPzEN5-qIPQRnmVoTHpufcU6tC-37Fq-PeAE'), }, }, }, From fed3d5dfdcf36c5289ef80976bcd31fbd68d36b6 Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Tue, 31 Dec 2024 13:17:07 +0000 Subject: [PATCH 127/252] correct kunsi ssh key --- users.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/users.json b/users.json index 031215c..d422a05 100644 --- a/users.json +++ b/users.json @@ -11,7 +11,7 @@ }, "kunsi": { "ssh_pubkey": [ - "ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBG56iljhXQfY0euup1tUtMaFTONGI022uq/kpFOmIQVXeuIClcVB2p4BjL+GwRV51NnpqH9J+qow0/XK3YQkiHY=", + "ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBKxEkRuXD/83N6cB1/hz8e0VvwEbPDNvnA/NiEeKOtAI0s2AlluJ5VrQHzxmLkwpBca9SlZo56MskzSYNqN6AgI=", "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQC+ja1z5VRQzaKCCePsUM14qMr9QR94qlWc7Je5Poki9UmC1t/TyxRVzcCBL1ZdIfBGx6QKtfkEbvhgb3nxVt3PvXjoJrc6wwGLmNrVsU6B88y35g7nzupQiPKYJwkNzJ9j6Dmkgj1F5Q+aY2SitDaX6vqICLJ4Al/ZFw2IQxVJfC7JXRJ9jRMG5o9gWoE3gWDYEAmw+HU2mNzyeuaD12qJw9DHUimAlgkOWzll3gh9WclsYnnXGrCCn5fyHFUCJl+XXAIy519z7YTpKih02rsIOw5dnaGClBZD/YQu2ZKVFZiwIVH7aBiqHOmtgRyWTQgjbh/fMpIN0ar2f/iZsWYUjd6et48TOmXZYIPCQ5FivXNvxt9oo1XZfq76UHBwlmypLJIWROMbz375n2M6hr3hECuxuPjKEUXAv05KiC1aJ4xc6pFoVhqwAR99hvHw5U4o7/ko2NVjNpTu6Jr5DT5VaQLIdDDjC/93kUjMpdD/8P72bEn7454+WexU6OE6uvNiHj1fetrptr2UAuzVfnCoaV8pBqY7X95gk+lnSENdpr8ltJYMg8s0Z7Pzz0OxsZtzzDY5VmWfC9TCdJkN5lT8IbnaixsYlWdjQl1lMmZGElmelfU3K7YQLAbZiHmHKe4hTl9ZoCcWdTQ3d4y2t1DBos+N2HZNdtFCyOS8esDdMw==" ], "email": "encrypt$gAAAAABfuXj1DQ3yUn0rEdN2koT1hzgHwCwNp00a0KkWoT_FTsild1zIBpfIiI07AmgIZ5FpyhKH5bSdCVLKc0p4rQuxLrLWpw==", From d27c42d51ad6c2b6d218f3eae8c569e5462caf8e Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Tue, 31 Dec 2024 13:17:25 +0000 Subject: [PATCH 128/252] home.nas: allow molly to coonect to mqtt --- nodes/home/nas.py | 1 + 1 file changed, 1 insertion(+) diff --git a/nodes/home/nas.py b/nodes/home/nas.py index ad18be3..576aa3e 100644 --- a/nodes/home/nas.py +++ b/nodes/home/nas.py @@ -148,6 +148,7 @@ nodes['home.nas'] = { 'restrict-to': { '172.19.136.0/25', '172.19.138.0/24', + 'htz-cloud.molly-connector', }, }, 'nfs-server': { From f67de1ea1b3b78c7b38fb0a27f2072a97699f9b2 Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Sun, 5 Jan 2025 10:46:51 +0100 Subject: [PATCH 129/252] ihome.nas: disable ipv6 on avahi to try to mitigate intermittent problems --- bundles/avahi-daemon/files/avahi-daemon.conf | 4 ++-- bundles/avahi-daemon/metadata.py | 3 +++ nodes/home/nas.py | 3 +++ 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/bundles/avahi-daemon/files/avahi-daemon.conf b/bundles/avahi-daemon/files/avahi-daemon.conf index efdd222..0ad1412 100644 --- a/bundles/avahi-daemon/files/avahi-daemon.conf +++ b/bundles/avahi-daemon/files/avahi-daemon.conf @@ -1,7 +1,7 @@ [server] host-name=${node.name.split('.')[-1]} use-ipv4=yes -use-ipv6=yes +use-ipv6=${'yes' if node.metadata.get('avahi-daemon/use-ipv6') else 'no'} allow-interfaces=${','.join(sorted(node.metadata.get('interfaces', {}).keys()))} ratelimit-interval-usec=1000000 ratelimit-burst=1000 @@ -14,7 +14,7 @@ disable-publishing=no disable-user-service-publishing=no publish-hinfo=yes publish-workstation=no -publish-aaaa-on-ipv4=yes +publish-aaaa-on-ipv4=no publish-a-on-ipv6=no [reflector] diff --git a/bundles/avahi-daemon/metadata.py b/bundles/avahi-daemon/metadata.py index 0bb909f..f6c3ef5 100644 --- a/bundles/avahi-daemon/metadata.py +++ b/bundles/avahi-daemon/metadata.py @@ -5,4 +5,7 @@ defaults = { 'libnss-mdns': {}, }, }, + 'avahi-daemon': { + 'use-ipv6': True, + } } diff --git a/nodes/home/nas.py b/nodes/home/nas.py index 576aa3e..c1adeb1 100644 --- a/nodes/home/nas.py +++ b/nodes/home/nas.py @@ -56,6 +56,9 @@ nodes['home.nas'] = { # systemctl start yate }, }, + 'avahi-daemon': { + 'use-ipv6': False, # because having a dynamic address confuses the network somehow + }, 'backups': { 'paths': { '/storage/nas/Audiobooks', From 1a34555530953ed16a12f9637be22f5abb0fbfc8 Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Mon, 6 Jan 2025 19:44:06 +0100 Subject: [PATCH 130/252] bundles/rspamd: use metadata.get() --- bundles/rspamd/items.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bundles/rspamd/items.py b/bundles/rspamd/items.py index 0491d17..2f9aacb 100644 --- a/bundles/rspamd/items.py +++ b/bundles/rspamd/items.py @@ -96,7 +96,7 @@ if 'dkim' in node.metadata.get('rspamd', {}): }, } - dkim_key = repo.libs.faults.ensure_fault_or_none(node.metadata['rspamd']['dkim']) + dkim_key = repo.libs.faults.ensure_fault_or_none(node.metadata.get('rspamd/dkim')) actions = { 'rspamd_assure_dkim_key_permissions': { From 46c761a3c21617223650c976b51634e8b7f48ddc Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Mon, 6 Jan 2025 19:44:41 +0100 Subject: [PATCH 131/252] home.nas: more weird avahi fixups --- nodes/home/nas.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/nodes/home/nas.py b/nodes/home/nas.py index c1adeb1..a5b904d 100644 --- a/nodes/home/nas.py +++ b/nodes/home/nas.py @@ -71,6 +71,11 @@ nodes['home.nas'] = { '/storage/nas/normen', }, }, + 'cron': { + 'jobs': { + 'avahi-aruba-fixup': '17,47 * * * * root /usr/bin/systemctl restart avahi-daemon.service', + }, + }, 'dm-crypt': { 'encrypted-devices': { '/dev/disk/by-id/ata-Samsung_SSD_870_QVO_8TB_S5SSNJ0X409404K': { From 5df7bdf2da4f847b1020cee481a6e60f5a8fe8a5 Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Mon, 6 Jan 2025 19:46:13 +0100 Subject: [PATCH 132/252] fix kunsis ssh key (again) --- users.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/users.json b/users.json index d422a05..0dab537 100644 --- a/users.json +++ b/users.json @@ -11,7 +11,7 @@ }, "kunsi": { "ssh_pubkey": [ - "ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBKxEkRuXD/83N6cB1/hz8e0VvwEbPDNvnA/NiEeKOtAI0s2AlluJ5VrQHzxmLkwpBca9SlZo56MskzSYNqN6AgI=", + "ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBLpRRSFhzPC8xNorYiNDG37JivSSER+oUNjSFwJ+4Gn8QdcM5sjQZsokAEFs5AsAWl1i7d/qceA2JGG4jCwDBx0=", "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQC+ja1z5VRQzaKCCePsUM14qMr9QR94qlWc7Je5Poki9UmC1t/TyxRVzcCBL1ZdIfBGx6QKtfkEbvhgb3nxVt3PvXjoJrc6wwGLmNrVsU6B88y35g7nzupQiPKYJwkNzJ9j6Dmkgj1F5Q+aY2SitDaX6vqICLJ4Al/ZFw2IQxVJfC7JXRJ9jRMG5o9gWoE3gWDYEAmw+HU2mNzyeuaD12qJw9DHUimAlgkOWzll3gh9WclsYnnXGrCCn5fyHFUCJl+XXAIy519z7YTpKih02rsIOw5dnaGClBZD/YQu2ZKVFZiwIVH7aBiqHOmtgRyWTQgjbh/fMpIN0ar2f/iZsWYUjd6et48TOmXZYIPCQ5FivXNvxt9oo1XZfq76UHBwlmypLJIWROMbz375n2M6hr3hECuxuPjKEUXAv05KiC1aJ4xc6pFoVhqwAR99hvHw5U4o7/ko2NVjNpTu6Jr5DT5VaQLIdDDjC/93kUjMpdD/8P72bEn7454+WexU6OE6uvNiHj1fetrptr2UAuzVfnCoaV8pBqY7X95gk+lnSENdpr8ltJYMg8s0Z7Pzz0OxsZtzzDY5VmWfC9TCdJkN5lT8IbnaixsYlWdjQl1lMmZGElmelfU3K7YQLAbZiHmHKe4hTl9ZoCcWdTQ3d4y2t1DBos+N2HZNdtFCyOS8esDdMw==" ], "email": "encrypt$gAAAAABfuXj1DQ3yUn0rEdN2koT1hzgHwCwNp00a0KkWoT_FTsild1zIBpfIiI07AmgIZ5FpyhKH5bSdCVLKc0p4rQuxLrLWpw==", From 0b09537ba4643c99c3d28d41ddc22738eb838755 Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Mon, 6 Jan 2025 20:12:06 +0100 Subject: [PATCH 133/252] dismantle all arch infrastructure --- bundles/arch-with-gui/files/50-network.conf | 5 - bundles/arch-with-gui/files/autologin.conf | 3 - bundles/arch-with-gui/items.py | 110 -------- bundles/arch-with-gui/metadata.py | 124 --------- bundles/basic/items.py | 1 - bundles/bird/items.py | 9 +- bundles/bird/metadata.py | 9 - bundles/cron/items.py | 11 +- bundles/cron/metadata.py | 5 - bundles/icinga2/items.py | 16 -- bundles/ipmitool/metadata.py | 5 - bundles/letsencrypt/metadata.py | 9 - bundles/lldp/metadata.py | 11 - bundles/lm-sensors/metadata.py | 5 - bundles/nfs-client/items.py | 9 +- bundles/nfs-client/metadata.py | 5 - bundles/nftables/items.py | 7 +- bundles/nftables/metadata.py | 17 -- bundles/nginx/files/arch-override.conf | 9 - bundles/nginx/files/nginx.conf | 2 +- bundles/nginx/items.py | 22 +- bundles/nginx/metadata.py | 5 - bundles/openssh/items.py | 13 +- bundles/openssh/metadata.py | 5 - .../pacman/files/check_unattended_upgrades | 38 --- bundles/pacman/files/do-unattended-upgrades | 18 -- bundles/pacman/files/faillock.conf | 2 - bundles/pacman/files/pacman.conf | 40 --- bundles/pacman/files/upgrade-and-reboot | 49 ---- bundles/pacman/files/upgrade-and-reboot.conf | 3 - bundles/pacman/items.py | 109 -------- bundles/pacman/metadata.py | 55 ---- bundles/postfix/files/arch-override.conf | 6 - bundles/postfix/items.py | 19 +- bundles/postfix/metadata.py | 8 +- bundles/sshmon/items.py | 9 - bundles/sshmon/metadata.py | 8 - bundles/sudo/metadata.py | 5 - bundles/systemd-boot/files/entry | 13 - bundles/systemd-boot/files/loader.conf | 5 - bundles/systemd-boot/files/pacman_hook | 9 - bundles/systemd-boot/items.py | 32 --- bundles/telegraf/metadata.py | 10 - bundles/users/metadata.py | 5 - bundles/vmhost/items.py | 9 - bundles/vmhost/metadata.py | 9 - .../files/crs-runner.service | 16 -- bundles/voc-tracker-worker/files/environment | 6 - bundles/voc-tracker-worker/items.py | 56 ---- bundles/voc-tracker-worker/metadata.py | 52 ---- bundles/wireguard/metadata.py | 2 +- .../files/zfs-import-scan-override.service | 4 - bundles/zfs/items.py | 3 - bundles/zfs/metadata.py | 18 -- groups/os.py | 8 - hooks/test_zfs_consistency.py | 2 +- nodes/fkusei-locutus.py | 190 ------------- nodes/htz-cloud.aurto.toml | 59 ---- nodes/kunsi-p14s.py | 251 ------------------ 59 files changed, 21 insertions(+), 1524 deletions(-) delete mode 100644 bundles/arch-with-gui/files/50-network.conf delete mode 100644 bundles/arch-with-gui/files/autologin.conf delete mode 100644 bundles/arch-with-gui/items.py delete mode 100644 bundles/arch-with-gui/metadata.py delete mode 100644 bundles/nginx/files/arch-override.conf delete mode 100644 bundles/pacman/files/check_unattended_upgrades delete mode 100644 bundles/pacman/files/do-unattended-upgrades delete mode 100644 bundles/pacman/files/faillock.conf delete mode 100644 bundles/pacman/files/pacman.conf delete mode 100644 bundles/pacman/files/upgrade-and-reboot delete mode 100644 bundles/pacman/files/upgrade-and-reboot.conf delete mode 100644 bundles/pacman/items.py delete mode 100644 bundles/pacman/metadata.py delete mode 100644 bundles/postfix/files/arch-override.conf delete mode 100755 bundles/systemd-boot/files/entry delete mode 100755 bundles/systemd-boot/files/loader.conf delete mode 100644 bundles/systemd-boot/files/pacman_hook delete mode 100644 bundles/systemd-boot/items.py delete mode 100644 bundles/voc-tracker-worker/files/crs-runner.service delete mode 100644 bundles/voc-tracker-worker/files/environment delete mode 100644 bundles/voc-tracker-worker/items.py delete mode 100644 bundles/voc-tracker-worker/metadata.py delete mode 100644 nodes/fkusei-locutus.py delete mode 100644 nodes/htz-cloud.aurto.toml delete mode 100644 nodes/kunsi-p14s.py diff --git a/bundles/arch-with-gui/files/50-network.conf b/bundles/arch-with-gui/files/50-network.conf deleted file mode 100644 index 39c38f2..0000000 --- a/bundles/arch-with-gui/files/50-network.conf +++ /dev/null @@ -1,5 +0,0 @@ -context.exec = [ - { path = "pactl" args = "load-module module-native-protocol-tcp" } - { path = "pactl" args = "load-module module-zeroconf-discover" } - { path = "pactl" args = "load-module module-zeroconf-publish" } -] diff --git a/bundles/arch-with-gui/files/autologin.conf b/bundles/arch-with-gui/files/autologin.conf deleted file mode 100644 index 9398062..0000000 --- a/bundles/arch-with-gui/files/autologin.conf +++ /dev/null @@ -1,3 +0,0 @@ -[Autologin] -User=${user} -Session=i3.desktop diff --git a/bundles/arch-with-gui/items.py b/bundles/arch-with-gui/items.py deleted file mode 100644 index 5a35931..0000000 --- a/bundles/arch-with-gui/items.py +++ /dev/null @@ -1,110 +0,0 @@ -from os import listdir -from os.path import join - -actions = { - 'fc-cache_flush': { - 'command': 'fc-cache -f', - 'triggered': True, - 'needs': { - 'pkg_pacman:fontconfig', - }, - }, - 'i3pystatus_create_virtualenv': { - 'command': '/usr/bin/python3 -m virtualenv -p python3 /opt/i3pystatus/venv/', - 'unless': 'test -d /opt/i3pystatus/venv/', - 'needs': { - 'directory:/opt/i3pystatus/src', - 'pkg_pacman:python-virtualenv', - }, - }, - 'i3pystatus_install': { - 'command': ' && '.join([ - 'cd /opt/i3pystatus/src', - '/opt/i3pystatus/venv/bin/pip install --upgrade pip colour netifaces basiciw pytz', - '/opt/i3pystatus/venv/bin/pip install --upgrade -e .', - ]), - 'needs': { - 'action:i3pystatus_create_virtualenv', - }, - 'triggered': True, - }, -} - -directories = { - '/etc/sddm.conf.d': { - 'purge': True, - }, - '/opt/i3pystatus/src': {}, - '/usr/share/fonts/bundlewrap': { - 'purge': True, - 'triggers': { - 'action:fc-cache_flush', - }, - }, -} - -svc_systemd = { - 'avahi-daemon': { - 'needs': { - 'pkg_pacman:avahi', - }, - }, - 'sddm': { - 'needs': { - 'pkg_pacman:sddm', - }, - }, -} - -git_deploy = { - '/opt/i3pystatus/src': { - 'repo': 'https://github.com/enkore/i3pystatus.git', - 'rev': 'current', - 'triggers': { - 'action:i3pystatus_install', - }, - }, -} - -files['/etc/pipewire/pipewire-pulse.conf.d/50-network.conf'] = {} - -for filename in listdir(join(repo.path, 'data', 'arch-with-gui', 'files', 'fonts')): - if filename.startswith('.'): - continue - - if filename.endswith('.vault'): - # XXX remove this once we have a new bundlewrap release - # https://github.com/bundlewrap/bundlewrap/commit/2429b153dd1ca6781cf3812e2dec9c2b646a546b - from os import environ - if environ.get('BW_VAULT_DUMMY_MODE', '0') == '1': - continue - - font_name = filename[:-6] - attrs = { - 'content': repo.vault.decrypt_file_as_base64(join('arch-with-gui', 'files', 'fonts', filename)), - 'content_type': 'base64', - } - else: - font_name = filename - attrs = { - 'source': join('fonts', filename), - 'content_type': 'binary', - } - - files[f'/usr/share/fonts/bundlewrap/{font_name}'] = { - 'triggers': { - 'action:fc-cache_flush', - }, - **attrs, - } - -if node.metadata.get('arch-with-gui/autologin_as', None): - files['/etc/sddm.conf.d/autologin.conf'] = { - 'context': { - 'user': node.metadata.get('arch-with-gui/autologin_as'), - }, - 'content_type': 'mako', - 'before': { - 'svc_systemd:sddm', - }, - } diff --git a/bundles/arch-with-gui/metadata.py b/bundles/arch-with-gui/metadata.py deleted file mode 100644 index f1fa8d0..0000000 --- a/bundles/arch-with-gui/metadata.py +++ /dev/null @@ -1,124 +0,0 @@ -assert node.os == 'arch' - -defaults = { - 'backups': { - 'paths': { - '/etc/netctl', - }, - }, - 'icinga_options': { - 'exclude_from_monitoring': True, - }, - 'nftables': { - 'input': { - '50-avahi': { - 'udp dport 5353 accept', - 'udp sport 5353 accept', - }, - }, - }, - 'pacman': { - 'packages': { - # fonts - 'fontconfig': {}, - 'ttf-dejavu': { - 'needed_by': { - 'pkg_pacman:sddm', - }, - }, - - # login management - 'sddm': {}, - - # networking - 'avahi': {}, - 'netctl': {}, - 'util-linux': {}, # provides rfkill - 'wpa_supplicant': {}, - 'wpa_actiond': {}, - - # shell and other gui stuff - 'dunst': {}, - 'fish': {}, - 'kitty': {}, - 'libnotify': {}, # provides notify-send - 'light': {}, - 'redshift': {}, - 'rofi': {}, - - # sound - 'calf': {}, - 'easyeffects': {}, - 'lsp-plugins': {}, - 'pavucontrol': {}, - 'pipewire': {}, - 'pipewire-jack': {}, - 'pipewire-pulse': {}, - 'pipewire-zeroconf': {}, - 'qpwgraph': {}, - - # window management - 'i3-wm': {}, - 'i3lock': {}, - 'xss-lock': {}, - - # i3pystatus dependencies - 'iw': {}, - 'wireless_tools': {}, - - # Xorg - 'xf86-input-libinput': {}, - 'xf86-input-wacom': {}, - 'xorg-server': {}, - 'xorg-setxkbmap': {}, - 'xorg-xev': {}, - 'xorg-xinput': {}, - 'xorg-xset': {}, - - # all them apps - 'browserpass': {}, - 'browserpass-firefox': {}, - 'ffmpeg': {}, - 'firefox': {}, - 'gimp': {}, - 'imagemagick': {}, - 'inkscape': {}, - 'kdenlive': {}, - 'maim': {}, - 'mosh': {}, - 'mosquitto': {}, - 'mpv': {}, - 'pass': {}, - 'pass-otp': {}, - 'pdftk': {}, - 'pwgen': {}, - 'qpdfview': {}, - 'samba': {}, - 'shotcut': {}, - 'sipcalc': {}, - 'the_silver_searcher': {}, - 'tlp': {}, - 'virt-manager': {}, - 'xclip': {}, - 'xdotool': {}, # needed for maim window selection - }, - }, -} - -@metadata_reactor.provides( - 'backups/paths', -) -def backup_every_user_home(metadata): - paths = set() - - for user, config in metadata.get('users', {}).items(): - if config.get('delete', False): - continue - - paths.add(config.get('home', f'/home/{user}')) - - return { - 'backups': { - 'paths': paths, - }, - } diff --git a/bundles/basic/items.py b/bundles/basic/items.py index e0f9242..c2cdd49 100644 --- a/bundles/basic/items.py +++ b/bundles/basic/items.py @@ -24,7 +24,6 @@ files = { 'before': { 'action:', 'pkg_apt:', - 'pkg_pacman:', }, }, } diff --git a/bundles/bird/items.py b/bundles/bird/items.py index 38a1549..4c4b51c 100644 --- a/bundles/bird/items.py +++ b/bundles/bird/items.py @@ -1,10 +1,5 @@ -if node.os == 'arch': - filename = '/etc/bird.conf' -else: - filename = '/etc/bird/bird.conf' - files = { - filename: { + '/etc/bird/bird.conf': { 'content_type': 'mako', 'triggers': { 'svc_systemd:bird:reload', @@ -15,7 +10,7 @@ files = { svc_systemd = { 'bird': { 'needs': { - f'file:{filename}', + f'file:/etc/bird/bird.conf', }, }, } diff --git a/bundles/bird/metadata.py b/bundles/bird/metadata.py index bc6be9a..f6096a7 100644 --- a/bundles/bird/metadata.py +++ b/bundles/bird/metadata.py @@ -13,15 +13,6 @@ defaults = { }, }, }, - 'pacman': { - 'packages': { - 'bird': { - 'needed_by': { - 'svc_systemd:bird', - }, - }, - }, - }, 'sysctl': { 'options': { 'net.ipv4.conf.all.forwarding': '1', diff --git a/bundles/cron/items.py b/bundles/cron/items.py index 72e8711..577bb59 100644 --- a/bundles/cron/items.py +++ b/bundles/cron/items.py @@ -1,10 +1,3 @@ -if node.os == 'arch': - service_name = 'cronie' - package_name = 'pkg_pacman:cronie' -else: - service_name = 'cron' - package_name = 'pkg_apt:cron' - files = { '/etc/crontab': { 'content_type': 'mako', @@ -24,9 +17,9 @@ directories = { } svc_systemd = { - service_name: { + 'cron': { 'needs': { - package_name, + 'pkg_apt:cron', }, }, } diff --git a/bundles/cron/metadata.py b/bundles/cron/metadata.py index 66d612a..67b2b22 100644 --- a/bundles/cron/metadata.py +++ b/bundles/cron/metadata.py @@ -4,9 +4,4 @@ defaults = { 'cron': {}, }, }, - 'pacman': { - 'packages': { - 'cronie': {}, - }, - }, } diff --git a/bundles/icinga2/items.py b/bundles/icinga2/items.py index 804d920..6f8de54 100644 --- a/bundles/icinga2/items.py +++ b/bundles/icinga2/items.py @@ -401,22 +401,6 @@ for rnode in sorted(repo.nodes): DAYS_TO_STRING[day%7]: f'{hour}:{minute}-{hour}:{minute+15}', }, }) - elif ( - rnode.has_bundle('pacman') - and rnode.metadata.get('pacman/unattended-upgrades/is_enabled', False) - ): - day = rnode.metadata.get('pacman/unattended-upgrades/day') - hour = rnode.metadata.get('pacman/unattended-upgrades/hour') - minute = rnode.magic_number%30 - - downtimes.append({ - 'name': 'unattended-upgrades', - 'host': rnode.name, - 'comment': f'Downtime for upgrade-and-reboot of node {rnode.name}', - 'times': { - DAYS_TO_STRING[day%7]: f'{hour}:{minute}-{hour}:{minute+15}', - }, - }) files['/etc/icinga2/conf.d/groups.conf'] = { 'source': 'icinga2/groups.conf', diff --git a/bundles/ipmitool/metadata.py b/bundles/ipmitool/metadata.py index a340a7a..e908366 100644 --- a/bundles/ipmitool/metadata.py +++ b/bundles/ipmitool/metadata.py @@ -19,9 +19,4 @@ defaults = { '/usr/bin/ipmitool *', }, }, - 'pacman': { - 'packages': { - 'ipmitool': {}, - }, - }, } diff --git a/bundles/letsencrypt/metadata.py b/bundles/letsencrypt/metadata.py index 09620c4..ffeb084 100644 --- a/bundles/letsencrypt/metadata.py +++ b/bundles/letsencrypt/metadata.py @@ -13,15 +13,6 @@ defaults = { }, }, }, - 'pacman': { - 'packages': { - 'dehydrated': { - 'needed_by': { - 'action:letsencrypt_update_certificates', - }, - }, - }, - }, } diff --git a/bundles/lldp/metadata.py b/bundles/lldp/metadata.py index 7a499dd..2f1875c 100644 --- a/bundles/lldp/metadata.py +++ b/bundles/lldp/metadata.py @@ -10,15 +10,4 @@ defaults = { }, }, }, - 'pacman': { - 'packages': { - 'lldpd': { - 'needed_by': { - 'directory:/etc/lldpd.d', - 'file:/etc/lldpd.conf', - 'svc_systemd:lldpd', - }, - }, - }, - }, } diff --git a/bundles/lm-sensors/metadata.py b/bundles/lm-sensors/metadata.py index ffd3900..01a6d1a 100644 --- a/bundles/lm-sensors/metadata.py +++ b/bundles/lm-sensors/metadata.py @@ -4,11 +4,6 @@ defaults = { 'lm-sensors': {}, }, }, - 'pacman': { - 'packages': { - 'lm_sensors': {}, - }, - }, 'telegraf': { 'input_plugins': { 'builtin': { diff --git a/bundles/nfs-client/items.py b/bundles/nfs-client/items.py index 918d02c..97cebc4 100644 --- a/bundles/nfs-client/items.py +++ b/bundles/nfs-client/items.py @@ -1,8 +1,3 @@ -if node.has_bundle('pacman'): - package = 'pkg_pacman:nfs-utils' -else: - package = 'pkg_apt:nfs-common' - for mount, data in node.metadata.get('nfs-client/mounts',{}).items(): data['mount'] = mount data['mount_options'] = set(data.get('mount_options', set())) @@ -42,7 +37,7 @@ for mount, data in node.metadata.get('nfs-client/mounts',{}).items(): 'file:/etc/systemd/system/{}.automount'.format(unitname), 'directory:{}'.format(data['mountpoint']), 'svc_systemd:systemd-networkd', - package, + 'pkg_apt:nfs-common', }, } else: @@ -58,7 +53,7 @@ for mount, data in node.metadata.get('nfs-client/mounts',{}).items(): 'file:/etc/systemd/system/{}.mount'.format(unitname), 'directory:{}'.format(data['mountpoint']), 'svc_systemd:systemd-networkd', - package, + 'pkg_apt:nfs-common', }, } diff --git a/bundles/nfs-client/metadata.py b/bundles/nfs-client/metadata.py index c59ee60..93bf66e 100644 --- a/bundles/nfs-client/metadata.py +++ b/bundles/nfs-client/metadata.py @@ -4,11 +4,6 @@ defaults = { 'nfs-common': {}, }, }, - 'pacman': { - 'packages': { - 'nfs-utils': {}, - }, - }, } if node.has_bundle('telegraf'): diff --git a/bundles/nftables/items.py b/bundles/nftables/items.py index 9bbe11f..fc943d4 100644 --- a/bundles/nftables/items.py +++ b/bundles/nftables/items.py @@ -1,8 +1,3 @@ -if node.has_bundle('pacman'): - package = 'pkg_pacman:nftables' -else: - package = 'pkg_apt:nftables' - directories = { # used by other bundles '/etc/nftables-rules.d': { @@ -42,7 +37,7 @@ svc_systemd = { 'nftables': { 'needs': { 'file:/etc/nftables.conf', - package, + 'pkg_apt:nftables', }, }, } diff --git a/bundles/nftables/metadata.py b/bundles/nftables/metadata.py index 15f34d4..4fac791 100644 --- a/bundles/nftables/metadata.py +++ b/bundles/nftables/metadata.py @@ -10,23 +10,6 @@ defaults = { 'blocked_v4': repo.libs.firewall.global_ip4_blocklist, 'blocked_v6': repo.libs.firewall.global_ip6_blocklist, }, - 'pacman': { - 'packages': { - 'nftables': {}, -# https://github.com/bundlewrap/bundlewrap/issues/688 -# 'iptables': { -# 'installed': False, -# 'needed_by': { -# 'pkg_pacman:iptables-nft', -# }, -# }, - 'iptables-nft': { - 'needed_by': { - 'pkg_pacman:nftables', - }, - }, - }, - }, } if not node.has_bundle('vmhost') and not node.has_bundle('docker-engine'): diff --git a/bundles/nginx/files/arch-override.conf b/bundles/nginx/files/arch-override.conf deleted file mode 100644 index 5496fe6..0000000 --- a/bundles/nginx/files/arch-override.conf +++ /dev/null @@ -1,9 +0,0 @@ -[Service] -ExecStart= -ExecStart=/usr/sbin/nginx -c /etc/nginx/nginx.conf - -ExecReload= -ExecReload=/bin/sh -c "/bin/kill -s HUP $(/bin/cat /var/run/nginx.pid)" - -ExecStop= -ExecStop=/bin/sh -c "/bin/kill -s TERM $(/bin/cat /var/run/nginx.pid)" diff --git a/bundles/nginx/files/nginx.conf b/bundles/nginx/files/nginx.conf index 2c20144..7f7bd77 100644 --- a/bundles/nginx/files/nginx.conf +++ b/bundles/nginx/files/nginx.conf @@ -1,4 +1,4 @@ -user ${username}; +user www-data; worker_processes ${worker_processes}; pid /var/run/nginx.pid; diff --git a/bundles/nginx/items.py b/bundles/nginx/items.py index 53edc86..2928686 100644 --- a/bundles/nginx/items.py +++ b/bundles/nginx/items.py @@ -1,12 +1,5 @@ from datetime import datetime, timedelta -if node.has_bundle('pacman'): - package = 'pkg_pacman:nginx' - username = 'http' -else: - package = 'pkg_apt:nginx' - username = 'www-data' - directories = { '/etc/nginx/sites': { 'purge': True, @@ -24,9 +17,9 @@ directories = { }, }, '/var/log/nginx-timing': { - 'owner': username, + 'owner': 'www-data', 'needs': { - package, + 'pkg_apt:nginx', }, }, '/var/www': {}, @@ -40,7 +33,6 @@ files = { '/etc/nginx/nginx.conf': { 'content_type': 'mako', 'context': { - 'username': username, **node.metadata['nginx'], }, 'triggers': { @@ -69,21 +61,13 @@ files = { '/var/www/error.html': {}, '/var/www/not_found.html': {}, } -if node.has_bundle('pacman'): - files['/etc/systemd/system/nginx.service.d/bundlewrap.conf'] = { - 'source': 'arch-override.conf', - 'triggers': { - 'action:systemd-reload', - 'svc_systemd:nginx:restart', - }, - } svc_systemd = { 'nginx': { 'needs': { 'action:generate-dhparam', 'directory:/var/log/nginx-timing', - package, + 'pkg_apt:nginx', }, }, } diff --git a/bundles/nginx/metadata.py b/bundles/nginx/metadata.py index 2715065..28395ff 100644 --- a/bundles/nginx/metadata.py +++ b/bundles/nginx/metadata.py @@ -33,11 +33,6 @@ defaults = { 'nginx': { 'worker_connections': 768, }, - 'pacman': { - 'packages': { - 'nginx': {}, - }, - }, } if node.has_bundle('telegraf'): diff --git a/bundles/openssh/items.py b/bundles/openssh/items.py index a93b873..0b9fa04 100644 --- a/bundles/openssh/items.py +++ b/bundles/openssh/items.py @@ -27,29 +27,22 @@ files = { }, } -if node.has_bundle('pacman'): - package = 'pkg_pacman:openssh' - service = 'sshd' -else: - package = 'pkg_apt:openssh-server' - service = 'ssh' - actions = { 'sshd_check_config': { 'command': 'sshd -T -C user=root -C host=localhost -C addr=localhost', 'triggered': True, 'triggers': { - 'svc_systemd:{}:restart'.format(service), + 'svc_systemd:ssh:restart', }, }, } svc_systemd = { - service: { + 'ssh': { 'needs': { 'file:/etc/systemd/system/ssh.service.d/bundlewrap.conf', 'file:/etc/ssh/sshd_config', - package, + 'pkg_apt:openssh-server', }, }, } diff --git a/bundles/openssh/metadata.py b/bundles/openssh/metadata.py index 630b851..4db6d78 100644 --- a/bundles/openssh/metadata.py +++ b/bundles/openssh/metadata.py @@ -8,11 +8,6 @@ defaults = { 'openssh-sftp-server': {}, }, }, - 'pacman': { - 'packages': { - 'openssh': {}, - }, - }, } @metadata_reactor.provides( diff --git a/bundles/pacman/files/check_unattended_upgrades b/bundles/pacman/files/check_unattended_upgrades deleted file mode 100644 index 1cafab5..0000000 --- a/bundles/pacman/files/check_unattended_upgrades +++ /dev/null @@ -1,38 +0,0 @@ -#!/bin/bash - -statusfile="/var/tmp/unattended_upgrades.status" -if ! [[ -f "$statusfile" ]] -then - echo "Status file not found" - exit 3 -fi - -mtime=$(stat -c %Y $statusfile) -now=$(date +%s) -if (( $now - $mtime > 60*60*24*8 )) -then - echo "Status file is older than 8 days!" - exit 3 -fi - -exitcode=$(cat $statusfile) -case "$exitcode" in - abort_ssh) - echo "Upgrades skipped due to active SSH login" - exit 1 - ;; - 0) - if [[ -f /var/run/reboot-required ]] - then - echo "OK, but updates require a reboot" - exit 1 - else - echo "OK" - exit 0 - fi - ;; - *) - echo "Last exitcode was $exitcode" - exit 2 - ;; -esac diff --git a/bundles/pacman/files/do-unattended-upgrades b/bundles/pacman/files/do-unattended-upgrades deleted file mode 100644 index a04b5fc..0000000 --- a/bundles/pacman/files/do-unattended-upgrades +++ /dev/null @@ -1,18 +0,0 @@ -#!/bin/bash - -set -xeuo pipefail - -pacman -Syu --noconfirm --noprogressbar - -% for affected, restarts in sorted(restart_triggers.items()): -up_since=$(systemctl show "${affected}" | sed -n 's/^ActiveEnterTimestamp=//p' || echo 0) -up_since_ts=$(date -d "$up_since" +%s || echo 0) -now=$(date +%s) - -if [ $((now - up_since_ts)) -lt 3600 ] -then -% for restart in sorted(restarts): - systemctl restart "${restart}" || true -% endfor -fi -% endfor diff --git a/bundles/pacman/files/faillock.conf b/bundles/pacman/files/faillock.conf deleted file mode 100644 index 19c0ff3..0000000 --- a/bundles/pacman/files/faillock.conf +++ /dev/null @@ -1,2 +0,0 @@ -# just disable faillock. -deny = 0 diff --git a/bundles/pacman/files/pacman.conf b/bundles/pacman/files/pacman.conf deleted file mode 100644 index 7fb4e48..0000000 --- a/bundles/pacman/files/pacman.conf +++ /dev/null @@ -1,40 +0,0 @@ -[options] -Architecture = auto -CheckSpace -Color -HoldPkg = ${' '.join(sorted(node.metadata.get('pacman/ask_before_removal')))} -ILoveCandy -IgnorePkg = ${' '.join(sorted(node.metadata.get('pacman/ignore_packages', set())))} -LocalFileSigLevel = Optional -NoExtract=${' '.join(sorted(node.metadata.get('pacman/no_extract', set())))} -ParallelDownloads = ${node.metadata.get('pacman/parallel_downloads')} -SigLevel = Required DatabaseOptional -VerbosePkgLists - -% for line in sorted(node.metadata.get('pacman/additional_config', set())): -${line} -% endfor - -[core] -Server = ${node.metadata.get('pacman/repository')} -Include = /etc/pacman.d/mirrorlist - -[extra] -Server = ${node.metadata.get('pacman/repository')} -Include = /etc/pacman.d/mirrorlist - -[community] -Server = ${node.metadata.get('pacman/repository')} -Include = /etc/pacman.d/mirrorlist -% if node.metadata.get('pacman/enable_multilib', False): - -[multilib] -Server = ${node.metadata.get('pacman/repository')} -Include = /etc/pacman.d/mirrorlist -% endif -% if node.metadata.get('pacman/enable_aurto'): - -[aurto] -Server = https://aurto.kunbox.net/ -SigLevel = Optional TrustAll -% endif diff --git a/bundles/pacman/files/upgrade-and-reboot b/bundles/pacman/files/upgrade-and-reboot deleted file mode 100644 index 41973aa..0000000 --- a/bundles/pacman/files/upgrade-and-reboot +++ /dev/null @@ -1,49 +0,0 @@ -#!/bin/bash - -# With systemd, we can force logging to the journal. This is better than -# spamming the world with cron mails. You can then view these logs using -# "journalctl -rat upgrade-and-reboot". -if which logger >/dev/null 2>&1 -then - # Dump stdout and stderr to logger, which will then put everything - # into the journal. - exec 1> >(logger -t upgrade-and-reboot -p user.info) - exec 2> >(logger -t upgrade-and-reboot -p user.error) -fi - -. /etc/upgrade-and-reboot.conf - -echo "Starting upgrade-and-reboot for node $nodename ..." - -statusfile="/var/tmp/unattended_upgrades.status" -# Workaround, because /var/tmp is usually 1777 -[[ "$UID" == 0 ]] && chown root:root "$statusfile" - -logins=$(ps h -C sshd -o euser | awk '$1 != "root" && $1 != "sshd" && $1 != "sshmon" && $1 != "nobody"') -if [[ -n "$logins" ]] -then - echo "Will abort now, there are active SSH logins: $logins" - echo "abort_ssh" > "$statusfile" - exit 1 -fi - -softlockdir=/var/lib/bundlewrap/soft-$nodename -mkdir -p "$softlockdir" -printf '{"comment": "UPDATE", "date": %s, "expiry": %s, "id": "UNATTENDED", "items": ["*"], "user": "root@localhost"}\n' \ - $(date +%s) \ - $(date -d 'now + 30 mins' +%s) \ - >"$softlockdir"/UNATTENDED -trap 'rm -f "$softlockdir"/UNATTENDED' EXIT - -do-unattended-upgrades -ret=$? - -echo "$ret" > "$statusfile" -if (( $ret != 0 )) -then - exit 1 -fi - -systemctl reboot - -echo "upgrade-and-reboot for node $nodename is DONE" diff --git a/bundles/pacman/files/upgrade-and-reboot.conf b/bundles/pacman/files/upgrade-and-reboot.conf deleted file mode 100644 index ca71dce..0000000 --- a/bundles/pacman/files/upgrade-and-reboot.conf +++ /dev/null @@ -1,3 +0,0 @@ -nodename="${node.name}" -reboot_mail_to="${node.metadata.get('apt/unattended-upgrades/reboot_mail_to', '')}" -auto_reboot_enabled="${node.metadata.get('apt/unattended-upgrades/reboot_enabled', True)}" diff --git a/bundles/pacman/items.py b/bundles/pacman/items.py deleted file mode 100644 index fe4f605..0000000 --- a/bundles/pacman/items.py +++ /dev/null @@ -1,109 +0,0 @@ -from bundlewrap.exceptions import BundleError - -if not node.os == 'arch': - raise BundleError(f'{node.name}: bundle:pacman requires arch linux') - -files = { - '/etc/pacman.conf': { - 'content_type': 'mako', - }, - '/etc/upgrade-and-reboot.conf': { - 'content_type': 'mako', - }, - '/etc/security/faillock.conf': {}, - '/usr/local/sbin/upgrade-and-reboot': { - 'mode': '0700', - }, - '/usr/local/sbin/do-unattended-upgrades': { - 'content_type': 'mako', - 'mode': '0700', - 'context': { - 'restart_triggers': node.metadata.get('pacman/restart_triggers', {}), - } - }, - '/usr/local/share/icinga/plugins/check_unattended_upgrades': { - 'mode': '0755', - }, -} - -svc_systemd['paccache.timer'] = { - 'needs': { - 'pkg_pacman:pacman-contrib', - }, -} - -pkg_pacman = { - 'acpi_call-lts': {}, - 'at': {}, - 'autoconf': {}, - 'automake': {}, - 'bind': {}, - 'binutils': {}, - 'bison': {}, - 'bzip2': {}, - 'curl': {}, - 'dialog': {}, - 'diffutils': {}, - 'fakeroot': {}, - 'file': {}, - 'findutils': {}, - 'flex': {}, - 'fwupd': {}, - 'gawk': {}, - 'gcc': {}, - 'gettext': {}, - 'git': {}, - 'gnu-netcat': {}, - 'grep': {}, - 'groff': {}, - 'gzip': {}, - 'htop': {}, - 'jq': {}, - 'ldns': {}, - 'less': {}, - 'libtool': {}, - 'linux-lts': {}, - 'logrotate': {}, - 'lsof': {}, - 'm4': {}, - 'mailutils': {}, - 'make': {}, - 'man-db': {}, - 'man-pages': {}, - 'moreutils': {}, - 'mtr': {}, - 'ncdu': {}, - 'nmap': {}, - 'pacman-contrib': {}, - 'patch': {}, - 'pkgconf': {}, - 'python': {}, - 'python-setuptools': { - 'needed_by': { - 'pkg_pip:', - }, - }, - 'python-pip': { - 'needed_by': { - 'pkg_pip:', - }, - }, - 'python-virtualenv': {}, - 'rsync': {}, - 'run-parts': {}, - 'sed': {}, - 'tar': {}, - 'texinfo': {}, - 'tmux': {}, - 'tree': {}, - 'unzip': {}, - 'vim': {}, - 'wget': {}, - 'which': {}, - 'whois': {}, - 'zip': {}, -} - - -for pkg, config in node.metadata.get('pacman/packages', {}).items(): - pkg_pacman[pkg] = config diff --git a/bundles/pacman/metadata.py b/bundles/pacman/metadata.py deleted file mode 100644 index 1c60981..0000000 --- a/bundles/pacman/metadata.py +++ /dev/null @@ -1,55 +0,0 @@ -defaults = { - 'pacman': { - 'ask_before_removal': { - 'glibc', - 'pacman', - }, - 'enable_aurto': True, - 'no_extract': { - 'etc/cron.d/0hourly', - # don't install systemd-homed pam module. It produces a lot of spam in - # journal about systemd-homed not being active, so just get rid of it. - # Requires reinstall of systemd package, though - 'usr/lib/security/pam_systemd_home.so', - }, - 'parallel_downloads': 4, - 'repository': 'http://ftp.uni-kl.de/pub/linux/archlinux/$repo/os/$arch', - 'unattended-upgrades': { - 'day': 5, - 'hour': 21, - }, - }, -} - - -@metadata_reactor.provides( - 'cron/jobs/upgrade-and-reboot', - 'icinga2_api/pacman/services', -) -def patchday(metadata): - if not metadata.get('pacman/unattended-upgrades/is_enabled', False): - return {} - - day = metadata.get('pacman/unattended-upgrades/day') - hour = metadata.get('pacman/unattended-upgrades/hour') - - return { - 'cron': { - 'jobs': { - 'upgrade-and-reboot': '{minute} {hour} * * {day} root /usr/local/sbin/upgrade-and-reboot'.format( - minute=node.magic_number % 30, - hour=hour, - day=day, - ), - }, - }, - 'icinga2_api': { - 'pacman': { - 'services': { - 'UNATTENDED UPGRADES': { - 'command_on_monitored_host': '/usr/local/share/icinga/plugins/check_unattended_upgrades', - }, - }, - }, - }, - } diff --git a/bundles/postfix/files/arch-override.conf b/bundles/postfix/files/arch-override.conf deleted file mode 100644 index 3b3e46d..0000000 --- a/bundles/postfix/files/arch-override.conf +++ /dev/null @@ -1,6 +0,0 @@ -[Service] -# arch postfix is not set up for chrooting by default -ExecStartPre=-/usr/sbin/mkdir -p /var/spool/postfix/etc -% for file in ['/etc/localtime', '/etc/nsswitch.conf', '/etc/resolv.conf', '/etc/services']: -ExecStartPre=-/usr/sbin/cp -p ${file} /var/spool/postfix${file} -% endfor diff --git a/bundles/postfix/items.py b/bundles/postfix/items.py index 5518c90..aeceed1 100644 --- a/bundles/postfix/items.py +++ b/bundles/postfix/items.py @@ -21,13 +21,12 @@ for identifier in node.metadata.get('postfix/mynetworks', set()): netmask = '128' mynetworks.add(f'[{ip6}]/{netmask}') -my_package = 'pkg_pacman:postfix' if node.os == 'arch' else 'pkg_apt:postfix' files = { '/etc/mailname': { 'content': node.metadata.get('postfix/myhostname'), 'before': { - my_package, + 'pkg_apt:postfix', }, 'triggers': { 'svc_systemd:postfix:restart', @@ -82,7 +81,7 @@ actions = { 'command': 'newaliases', 'triggered': True, 'needs': { - my_package, + 'pkg_apt:postfix', }, 'before': { 'svc_systemd:postfix', @@ -92,7 +91,7 @@ actions = { 'command': 'postmap hash:/etc/postfix/blocked_recipients', 'triggered': True, 'needs': { - my_package, + 'pkg_apt:postfix', }, 'before': { 'svc_systemd:postfix', @@ -105,17 +104,7 @@ svc_systemd = { 'needs': { 'file:/etc/postfix/master.cf', 'file:/etc/postfix/main.cf', - my_package, + 'pkg_apt:postfix', }, }, } - -if node.os == 'arch': - files['/etc/systemd/system/postfix.service.d/bundlewrap.conf'] = { - 'source': 'arch-override.conf', - 'content_type': 'mako', - 'triggers': { - 'action:systemd-reload', - 'svc_systemd:postfix:restart', - }, - } diff --git a/bundles/postfix/metadata.py b/bundles/postfix/metadata.py index 3c3be24..1ccf633 100644 --- a/bundles/postfix/metadata.py +++ b/bundles/postfix/metadata.py @@ -14,7 +14,7 @@ defaults = { 'postfix': { 'services': { 'POSTFIX PROCESS': { - 'command_on_monitored_host': '/usr/local/share/icinga/plugins/check_systemd_unit postfix' + ('' if node.os == 'arch' else '@-'), + 'command_on_monitored_host': '/usr/local/share/icinga/plugins/check_systemd_unit postfix@-', }, 'POSTFIX QUEUE': { 'command_on_monitored_host': 'sudo /usr/local/share/icinga/plugins/check_postfix_queue -w 20 -c 40 -d 50', @@ -22,12 +22,6 @@ defaults = { }, }, }, - 'pacman': { - 'packages': { - 'postfix': {}, - 's-nail': {}, - }, - }, } if node.has_bundle('postfixadmin'): diff --git a/bundles/sshmon/items.py b/bundles/sshmon/items.py index 3250f39..be9a9a4 100644 --- a/bundles/sshmon/items.py +++ b/bundles/sshmon/items.py @@ -64,12 +64,3 @@ for check in { files["/usr/local/share/icinga/plugins/check_{}".format(check)] = { 'mode': "0755", } - - -if node.has_bundle('pacman'): - symlinks['/usr/lib/nagios/plugins'] = { - 'target': '/usr/lib/monitoring-plugins', - 'needs': { - 'pkg_pacman:monitoring-plugins', - }, - } diff --git a/bundles/sshmon/metadata.py b/bundles/sshmon/metadata.py index 2142623..3026479 100644 --- a/bundles/sshmon/metadata.py +++ b/bundles/sshmon/metadata.py @@ -36,14 +36,6 @@ defaults = { 'sshmon', }, }, - 'pacman': { - 'packages': { - 'gawk': {}, - 'perl-libwww': {}, - 'monitoring-plugins': {}, - 'python-requests': {}, - }, - }, } diff --git a/bundles/sudo/metadata.py b/bundles/sudo/metadata.py index 82b007d..e76edaf 100644 --- a/bundles/sudo/metadata.py +++ b/bundles/sudo/metadata.py @@ -4,9 +4,4 @@ defaults = { 'sudo': {}, }, }, - 'pacman': { - 'packages': { - 'sudo': {}, - }, - }, } diff --git a/bundles/systemd-boot/files/entry b/bundles/systemd-boot/files/entry deleted file mode 100755 index 00d3d8f..0000000 --- a/bundles/systemd-boot/files/entry +++ /dev/null @@ -1,13 +0,0 @@ -title ${config['title']} - -% if 'linux' in config: -linux ${config['linux']} -% for line in config['initrd']: -initrd ${line} -% endfor -% if config.get('options', set()): -options ${' '.join(sorted(config['options']))} -% endif -% else: -efi ${config['efi']} -% endif diff --git a/bundles/systemd-boot/files/loader.conf b/bundles/systemd-boot/files/loader.conf deleted file mode 100755 index b30de61..0000000 --- a/bundles/systemd-boot/files/loader.conf +++ /dev/null @@ -1,5 +0,0 @@ -auto-entries no -auto-firmware yes -console-mode keep -default ${config['default']} -timeout ${config.get('timeout', 5)} diff --git a/bundles/systemd-boot/files/pacman_hook b/bundles/systemd-boot/files/pacman_hook deleted file mode 100644 index d65c027..0000000 --- a/bundles/systemd-boot/files/pacman_hook +++ /dev/null @@ -1,9 +0,0 @@ -[Trigger] -Type = Package -Operation = Upgrade -Target = systemd - -[Action] -Description = Gracefully upgrading systemd-boot... -When = PostTransaction -Exec = /usr/bin/systemctl restart systemd-boot-update.service diff --git a/bundles/systemd-boot/items.py b/bundles/systemd-boot/items.py deleted file mode 100644 index 0f26d00..0000000 --- a/bundles/systemd-boot/items.py +++ /dev/null @@ -1,32 +0,0 @@ -assert node.os == 'arch' -assert node.metadata.get('systemd-boot/default') in node.metadata.get('systemd-boot/entries') - -files = { - '/etc/pacman.d/hooks/99-systemd-boot-update': { - 'source': 'pacman_hook', - }, - '/boot/loader/loader.conf': { - 'content_type': 'mako', - 'context': { - 'config': node.metadata.get('systemd-boot'), - }, - 'mode': None, - }, -} - -directories = { - '/boot/loader/entries': { - 'purge': True, - }, -} - -for entry, config in node.metadata.get('systemd-boot/entries').items(): - files[f'/boot/loader/entries/{entry}.conf'] = { - 'source': 'entry', - 'content_type': 'mako', - 'context': { - 'entry': entry, - 'config': config, - }, - 'mode': None, - } diff --git a/bundles/telegraf/metadata.py b/bundles/telegraf/metadata.py index 097750e..4af8190 100644 --- a/bundles/telegraf/metadata.py +++ b/bundles/telegraf/metadata.py @@ -25,14 +25,4 @@ defaults = { }, }, }, - 'pacman': { - 'packages': { - 'telegraf-bin': { - 'needed_by': { - 'svc_systemd:telegraf', - 'user:telegraf', - }, - }, - }, - }, } diff --git a/bundles/users/metadata.py b/bundles/users/metadata.py index 48a8b72..e6f3498 100644 --- a/bundles/users/metadata.py +++ b/bundles/users/metadata.py @@ -7,11 +7,6 @@ defaults = { 'kitty-terminfo': {}, }, }, - 'pacman': { - 'packages': { - 'kitty-terminfo': {}, - }, - }, 'users': { 'root': { 'home': '/root', diff --git a/bundles/vmhost/items.py b/bundles/vmhost/items.py index e432a40..402e8ec 100644 --- a/bundles/vmhost/items.py +++ b/bundles/vmhost/items.py @@ -24,12 +24,3 @@ if node.has_bundle('nftables') and node.has_bundle('apt'): 'svc_systemd:nftables:reload', }, } - -if node.has_bundle('pacman'): - svc_systemd['libvirtd'] = { - 'running': None, # triggered via .socket - } - svc_systemd['virtlogd'] = { - 'running': None, # triggered via .socket - 'enabled': None, # triggered via .socket - } diff --git a/bundles/vmhost/metadata.py b/bundles/vmhost/metadata.py index 3aaa10e..79f9d8a 100644 --- a/bundles/vmhost/metadata.py +++ b/bundles/vmhost/metadata.py @@ -21,12 +21,6 @@ defaults = { }, }, }, - 'pacman': { - 'packages': { - 'edk2-ovmf': {}, - 'libvirt': {}, - }, - }, } if node.os == 'debian' and node.os_version[0] < 11: @@ -42,9 +36,6 @@ if node.has_bundle('nftables'): }, } -if node.has_bundle('arch-with-gui'): - defaults['pacman']['packages']['virt-manager'] = {} - @metadata_reactor.provides( 'users', diff --git a/bundles/voc-tracker-worker/files/crs-runner.service b/bundles/voc-tracker-worker/files/crs-runner.service deleted file mode 100644 index 1c85a33..0000000 --- a/bundles/voc-tracker-worker/files/crs-runner.service +++ /dev/null @@ -1,16 +0,0 @@ -[Unit] -Description=CRS runner for ${script} -After=network.target - -[Service] -User=voc -Group=voc -EnvironmentFile=/etc/default/crs-worker -ExecStart=/opt/crs-scripts/bin/crs_run ${script} -WorkingDirectory=/opt/crs-scripts -Restart=on-failure -RestartSec=10 -SyslogIdentifier=crs-${worker} - -[Install] -WantedBy=crs-worker.target diff --git a/bundles/voc-tracker-worker/files/environment b/bundles/voc-tracker-worker/files/environment deleted file mode 100644 index 98f40ea..0000000 --- a/bundles/voc-tracker-worker/files/environment +++ /dev/null @@ -1,6 +0,0 @@ -CRS_TRACKER=${url} -CRS_TOKEN=${token} -CRS_SECRET=${secret} -% if use_vaapi: -CRS_USE_VAAPI=yes -% endif diff --git a/bundles/voc-tracker-worker/items.py b/bundles/voc-tracker-worker/items.py deleted file mode 100644 index 6f28a8b..0000000 --- a/bundles/voc-tracker-worker/items.py +++ /dev/null @@ -1,56 +0,0 @@ -paths = { # subpaths of /video - 'capture', - 'encoded', - 'fuse', - 'intros', - 'repair', - 'tmp', -} - -directories = { - '/opt/crs-scripts': {}, -} - -for path in paths: - directories[f'/video/{path}'] = { - 'owner': 'voc', - 'group': 'voc', - } - -git_deploy = { - '/opt/crs-scripts': { - 'repo': 'https://github.com/crs-tools/crs-scripts.git', - 'rev': 'master', - }, -} - -files = { - '/etc/default/crs-worker': { - 'content_type': 'mako', - 'source': 'environment', - 'context': node.metadata.get('voc-tracker-worker'), - }, -} - -for worker, script in { - 'recording-scheduler': 'script-A-recording-scheduler.pl', - 'mount4cut': 'script-B-mount4cut.pl', - 'cut-postprocessor': 'script-C-cut-postprocessor.pl', - 'encoding': 'script-D-encoding.pl', - 'postencoding': 'script-E-postencoding-auphonic.pl', - 'postprocessing': 'script-F-postprocessing-upload.pl', -}.items(): - files[f'/etc/systemd/system/crs-{worker}.service'] = { - 'content_type': 'mako', - 'source': 'crs-runner.service', - 'context': { - 'worker': worker, - 'script': script, - }, - 'needs': { - 'file:/etc/default/crs-worker', - }, - 'triggers': { - 'action:systemd-reload', - }, - } diff --git a/bundles/voc-tracker-worker/metadata.py b/bundles/voc-tracker-worker/metadata.py deleted file mode 100644 index 3a741a8..0000000 --- a/bundles/voc-tracker-worker/metadata.py +++ /dev/null @@ -1,52 +0,0 @@ -defaults = { - 'apt': { - 'packages': { - 'ffmpeg': {}, - 'fuse': {}, - 'fuse-ts': {}, - 'libboolean-perl': {}, - 'libconfig-inifiles-perl': {}, - 'libdatetime-perl': {}, - 'libfile-which-perl': {}, - 'libipc-run3-perl': {}, - 'libjson-perl': {}, - 'libmath-round-perl': {}, - 'libproc-processtable-perl': {}, - 'libwww-curl-perl': {}, - 'libxml-rpc-fast-perl': {}, - 'libxml-simple-perl': {}, - }, - }, - 'voc-tracker-worker': { - 'use_vaapi': False, - }, - 'users': { - 'voc': { - 'home': '/opt/voc', - }, - }, - 'pacman': { - 'packages': { - 'ffmpeg': {}, - 'fuse2': {}, - 'fuse3': {}, - # fuse-ts missing - 'perl-boolean': {}, # from aurto - 'perl-config-inifiles': {}, - 'perl-datetime': {}, - 'perl-file-which': {}, - 'perl-ipc-run3': {}, - 'perl-json': {}, - 'perl-math-round': {}, - 'perl-proc-processtable': {}, - 'perl-www-curl': {}, # from aurto - 'perl-xml-simple': {}, - }, - }, -} - -# Install manually from CPAN: -# IO::Socket::SSL -# LWP::Protocol::https -# Types::Serialiser::Error -# XML::RPC::Fast diff --git a/bundles/wireguard/metadata.py b/bundles/wireguard/metadata.py index c08d5ca..267be6a 100644 --- a/bundles/wireguard/metadata.py +++ b/bundles/wireguard/metadata.py @@ -283,7 +283,7 @@ def interface_ips(metadata): 'nftables/postrouting/10-wireguard', ) def snat(metadata): - if not node.has_bundle('nftables') or node.os == 'arch': + if not node.has_bundle('nftables'): raise DoNotRunAgain snat_ip = metadata.get('wireguard/snat_ip', None) diff --git a/bundles/zfs/files/zfs-import-scan-override.service b/bundles/zfs/files/zfs-import-scan-override.service index 3853425..9004ee2 100644 --- a/bundles/zfs/files/zfs-import-scan-override.service +++ b/bundles/zfs/files/zfs-import-scan-override.service @@ -3,8 +3,4 @@ ConditionPathExists= [Service] ExecStart= -% if node.os == 'arch': -ExecStart=/usr/bin/zpool import -aN -o cachefile=none -% else: ExecStart=/usr/sbin/zpool import -aN -o cachefile=none -% endif diff --git a/bundles/zfs/items.py b/bundles/zfs/items.py index 8b13f4b..c63250e 100644 --- a/bundles/zfs/items.py +++ b/bundles/zfs/items.py @@ -2,9 +2,6 @@ from json import dumps from bundlewrap.metadata import MetadataJSONEncoder -if node.has_bundle('pacman'): - assert node.metadata.get('pacman/enable_aurto'), f'{node.name}: bundle:zfs needs aurto for zfs-linux-lts package' - files = { '/etc/modprobe.d/zfs.conf': { 'source': 'zfs-modprobe.conf', diff --git a/bundles/zfs/metadata.py b/bundles/zfs/metadata.py index 4191834..3b63e0b 100644 --- a/bundles/zfs/metadata.py +++ b/bundles/zfs/metadata.py @@ -43,24 +43,6 @@ defaults = { }, }, }, - 'pacman': { - 'no_extract': { - 'etc/sudoers.d/zfs', - }, - 'packages': { - 'zfs-linux-lts': { - 'needed_by': { - 'zfs_dataset:', - 'zfs_pool:', - }, - }, - 'zfs-utils': { - 'needed_by': { - 'svc_systemd:zfs-zed', - }, - }, - }, - }, 'systemd-timers': { 'timers': { 'zfs-auto-snapshot-daily': { diff --git a/groups/os.py b/groups/os.py index a6fca0f..d6f1d6b 100644 --- a/groups/os.py +++ b/groups/os.py @@ -13,7 +13,6 @@ groups['raspberry'] = { groups['linux'] = { 'subgroups': { - 'arch', 'debian', 'raspberry', }, @@ -48,13 +47,6 @@ groups['linux'] = { 'pip_command': 'pip3', } -groups['arch'] = { - 'bundles': { - 'pacman', - }, - 'os': 'arch', -} - groups['debian'] = { 'subgroup_patterns': { '^debian-[a-z]+$', diff --git a/hooks/test_zfs_consistency.py b/hooks/test_zfs_consistency.py index 132afe3..d7231e5 100644 --- a/hooks/test_zfs_consistency.py +++ b/hooks/test_zfs_consistency.py @@ -25,7 +25,7 @@ def test_node(repo, node, **kwargs): pool_name = name.split('/', 1)[0] - if pool_name not in zfs_pools and node.os != 'arch': + if pool_name not in zfs_pools: raise BundleError('{n} zfs_dataset:{ds} wants zfs_pool:{pool}, which wasn\'t found'.format( n=node.name, ds=name, diff --git a/nodes/fkusei-locutus.py b/nodes/fkusei-locutus.py deleted file mode 100644 index 23118bd..0000000 --- a/nodes/fkusei-locutus.py +++ /dev/null @@ -1,190 +0,0 @@ -nodes['fkusei-locutus'] = { - 'dummy': True, - 'hostname': '10.5.99.29', - 'bundles': { - 'arch-with-gui', - 'bird', - 'lldp', - 'lm-sensors', - 'nfs-client', - 'systemd-boot', - 'telegraf-battery-usage', - 'wireguard', - 'voc-tracker-worker', - 'zfs', - }, - 'groups': { - 'arch', - }, - 'metadata': { - 'arch-with-gui': { - 'autologin_as': 'fkunsmann', - }, - 'bird': { - 'bgp_neighbors': { - 'smedia': { - 'local_as': 4200128002, - 'local_ip': '10.200.128.2', - 'neighbor_as': 64900, - 'neighbor_ip': '10.200.128.1', - }, - }, - }, - 'firewall': { - 'port_rules': { - # obs websocket thingie - just allow all RFC1918 ips here - #'4444': { - # '10.0.0.0/8', - # '172.16.0.0/12', - # '192.168.0.0/16', - #}, - # For the occasional file-share using `python -m http.server` - '8000/tcp': {'*'}, - }, - }, - 'interfaces': { - 'eth*': { - 'dhcp': True, - }, - # there is also wlan0, but that's managed by netctl - }, - 'location': 'home', # not actually true, but needed for static dhcp lease - 'nfs-client': { - 'mounts': { - 'nas-storage': { - 'mountpoint': '/mnt/nas', - 'serverpath': '172.19.138.20:/storage/nas', - 'mount_options': { - 'retry=0', - 'ro', - }, - }, - }, - }, - 'openssh': { - 'restrict-to': { - 'rfc1918', - }, - }, - 'pacman': { - 'packages': { - 'amd-ucode': {}, - 'xf86-video-amdgpu': {}, - - # all that other random stuff one needs - 'apachedirectorystudio': {}, - 'direnv': {}, - 'freerdp': {}, - 'sdl_ttf': {}, # for compiling testcard - 'thermald': {}, - }, - }, - 'sysctl': { - 'options': { - # accept RA even though forwarding is enabled - 'net.ipv4.conf.all.accept_ra': '2', - 'net.ipv4.conf.wlan0.accept_ra': '2', - }, - }, - 'systemd-boot': { - 'default': 'arch', - 'entries': { - 'arch': { - 'title': 'Arch Linux', - 'linux': '/vmlinuz-linux', - 'initrd': [ - '/amd-ucode.img', - '/initramfs-linux.img', - ], - 'options': { - 'net.ifnames=0', - 'rw', - 'zfs=zroot/system/root', - }, - }, - 'arch-fallback': { - 'title': 'Arch Linux (no ucode, fallback initramfs)', - 'linux': '/vmlinuz-linux', - 'initrd': [ - '/initramfs-linux-fallback.img', - ], - 'options': { - 'net.ifnames=0', - 'rw', - 'zfs=zroot/system/root', - }, - }, - }, - }, - 'timezone': 'Europe/Berlin', - 'users': { - 'fkunsmann': { - 'password': vault.decrypt('encrypt$gAAAAABgLmmuQGRUStrQawoPee-758emIYn2u8-8ebrgzNAFSp7ifeFDdXXvs-zL3QogwNYlCtBHboH2xfy1rSj6OF5bbNO-tg=='), - 'shell': '/usr/bin/fish', - }, - }, - 'voc-tracker-worker': { - 'url': 'https://tracker.c3voc.de/rpc', - 'token': vault.decrypt('encrypt$gAAAAABiYqaFl4CqOc8DTQIn49Qq0KgAJSzA19GKPNMbyHIjYg0JkvY0sK43ps8CbJWMRR6hJHVK-nP4vrWLwyoWWqt8N8aASMur4odC2s8pEHQKM0TXg4cRwobQz_lyJgrYa2VYdhcD'), - 'secret': vault.decrypt('encrypt$gAAAAABiYqaYbY-3IbnRk-S25pqxrOGN7ovgPo3kBYz8ZqKDedPRzskKZefpLHxBbCOZKjg1XNT4cKbIs5cPCLdj7HdY4beAhnXl4EHZZdxU1zVC7sJCmz9XOS_Ac0UOgOlUFMiet14U'), - }, - 'wireguard': { - 'privatekey': vault.decrypt('smedia$NotViaThisRepository'), - 'peers': { - 'smedia': { - 'endpoint': 'wireguard.htz-cloud.kunbox.net:1194', - 'their_ip': '10.200.128.1', - 'my_ip': '10.200.128.2/20', - 'my_port': 51820, - 'endpoint': '185.122.180.82:51820', - 'psk': vault.decrypt('smedia$NotViaThisRepository'), - 'pubkey': vault.decrypt('smedia$NotViaThisRepository'), - }, - }, - }, - 'zfs': { - 'pools': { - 'zroot': { - 'when_creating': { - 'config': [], - }, - }, - }, - 'datasets': { - # this is not a complete list, but we can't create that - # structure using bundlewrap anyway, so there's no point - # in adding it here. - 'zroot': { - 'compression': 'lz4', - 'relatime': 'on', - 'xattr': 'sa', - 'primarycache': 'metadata' - # encryption is enabled, too. - }, - 'zroot/system/journal': { - 'mountpoint': '/var/log/journal', - 'acltype': 'posix', - }, - 'zroot/system/root': { - 'canmount': 'noauto', - 'mountpoint': '/', - }, - 'zroot/user/fkunsmann': { - 'mountpoint': '/home/fkunsmann', - }, - }, - 'snapshots': { - 'retain_per_dataset': { - 'zroot/user/fkunsmann': { - # juuuuuuuust to be sure - 'hourly': 100, - }, - }, - 'snapshot_never': { - 'zroot/system/journal', - }, - }, - }, - }, - 'os': 'arch', -} diff --git a/nodes/htz-cloud.aurto.toml b/nodes/htz-cloud.aurto.toml deleted file mode 100644 index 16fbf9a..0000000 --- a/nodes/htz-cloud.aurto.toml +++ /dev/null @@ -1,59 +0,0 @@ -hostname = "2a01:4f9:c010:95fa::2" -bundles = ["backup-client"] -groups = [ - "arch", - "webserver", -] - -[metadata] -description = [ - "When adding packages to aurto, please also add those packages to ~/PACKAGES", - "Wenn Pakete zu aurto hinzugefügt werden, trage sie bitte auch in ~/PACKAGES ein", -] - -[metadata.icinga_options] -period = "daytime" - -[metadata.backups] -paths = [ - "/var/cache/pacman/aurto", -] - -[metadata.interfaces.enp1s0] -ips = ["2a01:4f9:c010:95fa::2/64"] -gateway6 = "fe80::1" - -[metadata.interfaces.enp7s0] -ips = ["172.19.137.4/32"] -gateway4 = "172.19.137.1" - -[metadata.nginx.vhosts.aurto] -domain = "aurto.kunbox.net" -webroot = "/var/cache/pacman/aurto" -extras = true - -[metadata.pacman] -enable_aurto = false -additional_config = [ - "Include = /etc/pacman.d/aurto", -] - -[metadata.pacman.unattended-upgrades] -is_enabled = true - -[metadata.sudo.extra_configs] -50_aurto_passwordless = [ - "%wheel ALL=(ALL) NOPASSWD: /usr/bin/arch-nspawn", - "%wheel ALL=(ALL) NOPASSWD: /usr/bin/pacsync aurto", - "%wheel ALL=(ALL) NOPASSWD:SETENV: /usr/bin/makechrootpkg", -] - -[metadata.users.aurto] -groups = ["wheel"] -ssh_pubkey = [ - "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAICYst1HK+gJYhNxzqJGnz4iB73pa89Xz2yH+8wufOcsA", # kunsi work - "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQC+ja1z5VRQzaKCCePsUM14qMr9QR94qlWc7Je5Poki9UmC1t/TyxRVzcCBL1ZdIfBGx6QKtfkEbvhgb3nxVt3PvXjoJrc6wwGLmNrVsU6B88y35g7nzupQiPKYJwkNzJ9j6Dmkgj1F5Q+aY2SitDaX6vqICLJ4Al/ZFw2IQxVJfC7JXRJ9jRMG5o9gWoE3gWDYEAmw+HU2mNzyeuaD12qJw9DHUimAlgkOWzll3gh9WclsYnnXGrCCn5fyHFUCJl+XXAIy519z7YTpKih02rsIOw5dnaGClBZD/YQu2ZKVFZiwIVH7aBiqHOmtgRyWTQgjbh/fMpIN0ar2f/iZsWYUjd6et48TOmXZYIPCQ5FivXNvxt9oo1XZfq76UHBwlmypLJIWROMbz375n2M6hr3hECuxuPjKEUXAv05KiC1aJ4xc6pFoVhqwAR99hvHw5U4o7/ko2NVjNpTu6Jr5DT5VaQLIdDDjC/93kUjMpdD/8P72bEn7454+WexU6OE6uvNiHj1fetrptr2UAuzVfnCoaV8pBqY7X95gk+lnSENdpr8ltJYMg8s0Z7Pzz0OxsZtzzDY5VmWfC9TCdJkN5lT8IbnaixsYlWdjQl1lMmZGElmelfU3K7YQLAbZiHmHKe4hTl9ZoCcWdTQ3d4y2t1DBos+N2HZNdtFCyOS8esDdMw==", # kunsi privat -] - -[metadata.users.kunsi] -groups = ["wheel"] diff --git a/nodes/kunsi-p14s.py b/nodes/kunsi-p14s.py deleted file mode 100644 index 385cf3f..0000000 --- a/nodes/kunsi-p14s.py +++ /dev/null @@ -1,251 +0,0 @@ -nodes['kunsi-p14s'] = { - 'hostname': 'localhost', - 'bundles': { - 'arch-with-gui', - 'backup-client', - 'lldp', - 'lm-sensors', - 'nfs-client', - 'systemd-boot', - 'telegraf-battery-usage', - 'vmhost', - 'wireguard', - 'zfs', - }, - 'groups': { - 'arch', - }, - 'metadata': { - 'arch-with-gui': { - 'autologin_as': 'kunsi', - }, - 'backup-client': { - 'exclude_from_monitoring': False, - # only alert people if we're missing more than a week of backups - 'one_backup_every_hours': 7 * 24, - }, - 'firewall': { - 'port_rules': { - # obs websocket thingie - just allow all RFC1918 ips here - #'4444': { - # '10.0.0.0/8', - # '172.16.0.0/12', - # '192.168.0.0/16', - #}, - # For the occasional file-share using `python -m http.server` - '8000/tcp': {'*'}, - }, - }, - 'interfaces': { - 'br0': { - 'ips': {'10.73.100.112/16'}, - 'gateway4': '10.73.0.254', - 'dhcp': True, - }, - # there is also wlp3s0, but that's managed by netctl - }, - 'nfs-client': { - 'mounts': { - 'nas-scansnap': { - 'mountpoint': '/mnt/scansnap', - 'serverpath': '172.19.138.20:/srv/scansnap', - 'mount_options': { - 'retry=0', - 'rw', - }, - }, - 'nas-storage': { - 'mountpoint': '/mnt/nas', - 'serverpath': '172.19.138.20:/storage/nas', - 'mount_options': { - 'retry=0', - 'ro', - }, - }, - }, - }, - 'nftables': { - 'forward': { - '50-routing': [ - 'ct state { related, established } accept', - 'oifname wlan0 accept', - ], - }, - 'postrouting': { - '50-routing': [ - 'oifname wlan0 masquerade', - ], - }, - }, - 'openssh': { - 'restrict-to': { - 'rfc1918', - }, - }, - 'pacman': { - 'no_extract': { - 'etc/sudoers.d/ctdb', # samba junk - }, - 'packages': { - # for hardware support - 'amd-ucode': {}, - 'mesa': {}, - - # various video drivers - 'libva-mesa-driver': {}, - 'mesa-vdpau': {}, - 'xf86-video-amdgpu': {}, - - # all that other random stuff one needs - #'abcde': {}, - 'claws-mail': {}, - 'claws-mail-themes': {}, - 'ferdium-bin': {}, - 'gumbo-parser': {}, # for claws litehtml - 'inkstitch': {}, # for RZL embroidery machine - 'obs-studio': {}, - #'perl-musicbrainz-discid': {}, # for abcde - #'perl-webservice-musicbrainz': {}, # for abcde - 'sdl_ttf': {}, # for compiling testcard - 'x32edit': {}, - }, - }, - 'systemd-boot': { - 'default': 'arch', - 'entries': { - 'arch': { - 'title': 'Arch Linux', - 'linux': '/vmlinuz-linux-lts', - 'initrd': [ - '/amd-ucode.img', - '/initramfs-linux-lts.img', - ], - 'options': { - 'net.ifnames=0', - 'rw', - 'zfs=zroot/system/root', - }, - }, - 'arch-fallback': { - 'title': 'Arch Linux (no ucode, fallback initramfs)', - 'linux': '/vmlinuz-linux-lts', - 'initrd': [ - '/initramfs-linux-lts-fallback.img', - ], - 'options': { - 'net.ifnames=0', - 'rw', - 'zfs=zroot/system/root', - }, - }, - }, - }, - 'sysctl': { - 'options': { - 'net.ipv4.conf.all.forwarding': '1', - }, - }, - 'systemd-networkd': { - 'bridges': { - 'br0': { - 'match': { - 'en*', - 'eth*', - }, - }, - }, - }, - 'timezone': 'Europe/Berlin', - 'users': { - 'kunsi': { - 'password': vault.decrypt('encrypt$gAAAAABgLmmuQGRUStrQawoPee-758emIYn2u8-8ebrgzNAFSp7ifeFDdXXvs-zL3QogwNYlCtBHboH2xfy1rSj6OF5bbNO-tg=='), - 'shell': '/usr/bin/fish', - }, - }, - 'wireguard': { - 'peers': { - 'htz-cloud.wireguard': { - 'auto_connection': False, - 'endpoint': 'wireguard.htz-cloud.kunbox.net:1194', - 'my_ip': '172.19.136.65', - 'my_port': 51819, - 'their_ip': '172.19.136.64', - 'routes': { - '10.73.0.0/16', - '172.19.128.0/20', - }, - }, - }, - }, - 'zfs': { - 'pools': { - 'zroot': { - 'when_creating': { - 'config': [{ - 'devices': [ - '/dev/disk/by-id/nvme-UMIS_RPETJ1T24MGE2QDQ_SS0L25218X3RC1BG1182-part2', - ], - }], - 'ashift': 12, - }, - }, - }, - 'datasets': { - # this is not a complete list, but we can't create that - # structure using bundlewrap anyway, so there's no point - # in adding it here. - 'zroot': { - 'compression': 'lz4', - 'relatime': 'on', - 'xattr': 'sa', - 'primarycache': 'metadata' - # encryption is enabled, too. - }, - 'zroot/movies': { - 'mountpoint': '/media/movies', - }, - 'zroot/nextcloud': { - 'mountpoint': '/home/kunsi/nextcloud', - }, - 'zroot/system/journal': { - 'mountpoint': '/var/log/journal', - 'acltype': 'posix', - }, - 'zroot/system/libvirt': { - 'mountpoint': '/var/lib/libvirt', - 'needed_by': { - 'bundle:vmhost', - }, - }, - 'zroot/system/video': { - 'mountpoint': '/video', - 'needed_by': { - 'bundle:voc-tracker-worker', - }, - }, - 'zroot/system/root': { - 'canmount': 'noauto', - 'mountpoint': 'legacy', - }, - 'zroot/user/kunsi': { - 'mountpoint': '/home/kunsi', - }, - }, - 'snapshots': { - 'retain_per_dataset': { - 'zroot/user/kunsi': { - # juuuuuuuust to be sure - 'hourly': 100, - }, - }, - 'snapshot_never': { - 'zroot/movies', - 'zroot/nextcloud', - 'zroot/system/journal', - 'zroot/system/video', - }, - }, - }, - }, - 'os': 'arch', -} From ecbb28d0ff0e7e85b9521d714ca568dd7376b1c7 Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Sun, 12 Jan 2025 10:58:24 +0100 Subject: [PATCH 134/252] .envrc fix indentation --- .envrc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.envrc b/.envrc index 20da331..5fd603a 100644 --- a/.envrc +++ b/.envrc @@ -1,3 +1,3 @@ layout python3 - source_env_if_exists .envrc.local +source_env_if_exists .envrc.local From 767fc06b725cb803c3df1987985fc2368404a149 Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Tue, 14 Jan 2025 19:58:08 +0100 Subject: [PATCH 135/252] carlene: remove element-web --- nodes/carlene.toml | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/nodes/carlene.toml b/nodes/carlene.toml index 4581a4b..9939076 100644 --- a/nodes/carlene.toml +++ b/nodes/carlene.toml @@ -6,7 +6,6 @@ groups = [ bundles = [ "check-mail-received", "dovecot", - "element-web", "forgejo", "matrix-media-repo", "matrix-stickerpicker", @@ -38,16 +37,6 @@ email = "franzi.kunsmann@t-online.de" imap_host = "secureimap.t-online.de" imap_pass = "!bwpass_attr:t-online.de/franzi.kunsmann@t-online.de:imap" -[metadata.element-web] -url = "chat.franzi.business" -version = "v1.11.89" -[metadata.element-web.config] -default_server_config.'m.homeserver'.base_url = "https://matrix.franzi.business" -default_server_config.'m.homeserver'.server_name = "franzi.business" -brand = "franzi.business" -defaultCountryCode = "DE" -jitsi.preferredDomain = "meet.ffmuc.net" - [metadata.forgejo] version = "9.0.3" sha1 = "a04a8d5bee7321610d91da780a24e18f7407403c" From d27a047db2266aaeddd044b42b4f88a480e7720b Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Tue, 14 Jan 2025 19:58:32 +0100 Subject: [PATCH 136/252] remote bundle:matrix-registration --- bundles/matrix-registration/files/config.yaml | 40 ------------ .../files/matrix-registration.service | 14 ---- bundles/matrix-registration/items.py | 65 ------------------- bundles/matrix-registration/metadata.py | 25 ------- 4 files changed, 144 deletions(-) delete mode 100644 bundles/matrix-registration/files/config.yaml delete mode 100644 bundles/matrix-registration/files/matrix-registration.service delete mode 100644 bundles/matrix-registration/items.py delete mode 100644 bundles/matrix-registration/metadata.py diff --git a/bundles/matrix-registration/files/config.yaml b/bundles/matrix-registration/files/config.yaml deleted file mode 100644 index b3ad3a5..0000000 --- a/bundles/matrix-registration/files/config.yaml +++ /dev/null @@ -1,40 +0,0 @@ -server_location: 'http://[::1]:20080' -server_name: '${server_name}' -registration_shared_secret: '${reg_secret}' -admin_api_shared_secret: '${admin_secret}' -base_url: '${base_url}' -client_redirect: '${client_redirect}' -client_logo: 'static/images/element-logo.png' # use '{cwd}' for current working directory -#db: 'sqlite:///opt/matrix-registration/data/db.sqlite3' -db: 'postgresql://${database['user']}:${database['password']}@localhost/${database['database']}' -host: 'localhost' -port: 20100 -rate_limit: ["100 per day", "10 per minute"] -allow_cors: false -ip_logging: false -logging: - disable_existing_loggers: false - version: 1 - root: - level: DEBUG - handlers: [console] - formatters: - brief: - format: '%(name)s - %(levelname)s - %(message)s' - handlers: - console: - class: logging.StreamHandler - level: INFO - formatter: brief - stream: ext://sys.stdout -# password requirements -password: - min_length: 8 -# username requirements -username: - validation_regex: [] #list of regexes that the selected username must match. Example: '[a-zA-Z]\.[a-zA-Z]' - invalidation_regex: #list of regexes that the selected username must NOT match. Example: '(admin|support)' - - '^abuse' - - 'admin' - - 'support' - - 'help' diff --git a/bundles/matrix-registration/files/matrix-registration.service b/bundles/matrix-registration/files/matrix-registration.service deleted file mode 100644 index bf6ace9..0000000 --- a/bundles/matrix-registration/files/matrix-registration.service +++ /dev/null @@ -1,14 +0,0 @@ -[Unit] -Description=matrix-registration -After=network.target - -[Service] -User=matrix-registration -Group=matrix-registration -WorkingDirectory=/opt/matrix-registration/src -ExecStart=/opt/matrix-registration/venv/bin/matrix-registration --config-path /opt/matrix-registration/config.yaml serve -Restart=always -RestartSec=5 - -[Install] -WantedBy=multi-user.target diff --git a/bundles/matrix-registration/items.py b/bundles/matrix-registration/items.py deleted file mode 100644 index 05d8914..0000000 --- a/bundles/matrix-registration/items.py +++ /dev/null @@ -1,65 +0,0 @@ -actions['matrix-registration_create_virtualenv'] = { - 'command': '/usr/bin/python3 -m virtualenv -p python3 /opt/matrix-registration/venv/', - 'unless': 'test -d /opt/matrix-registration/venv/', - 'needs': { - # actually /opt/matrix-registration, but we don't create that - 'directory:/opt/matrix-registration/src', - }, -} - -actions['matrix-registration_install'] = { - 'command': ' && '.join([ - 'cd /opt/matrix-registration/src', - '/opt/matrix-registration/venv/bin/pip install psycopg2-binary', - '/opt/matrix-registration/venv/bin/pip install -e .', - ]), - 'needs': { - 'action:matrix-registration_create_virtualenv', - }, - 'triggered': True, -} - -users['matrix-registration'] = { - 'home': '/opt/matrix-registration', -} - -directories['/opt/matrix-registration/src'] = {} - -git_deploy['/opt/matrix-registration/src'] = { - 'repo': 'https://github.com/zeratax/matrix-registration.git', - 'rev': 'master', - 'triggers': { - 'action:matrix-registration_install', - 'svc_systemd:matrix-registration:restart', - }, -} - -files['/opt/matrix-registration/config.yaml'] = { - 'content_type': 'mako', - 'context': { - 'admin_secret': node.metadata.get('matrix-registration/admin_secret'), - 'base_url': node.metadata.get('matrix-registration/base_path', ''), - 'client_redirect': node.metadata.get('matrix-registration/client_redirect'), - 'database': node.metadata.get('matrix-registration/database'), - 'reg_secret': node.metadata.get('matrix-synapse/registration_shared_secret'), - 'server_name': node.metadata.get('matrix-synapse/server_name'), - }, - 'triggers': { - 'svc_systemd:matrix-registration:restart', - }, -} - -files['/usr/local/lib/systemd/system/matrix-registration.service'] = { - 'triggers': { - 'action:systemd-reload', - 'svc_systemd:matrix-registration:restart', - }, -} - -svc_systemd['matrix-registration'] = { - 'needs': { - 'action:matrix-registration_install', - 'file:/opt/matrix-registration/config.yaml', - 'file:/usr/local/lib/systemd/system/matrix-registration.service', - }, -} diff --git a/bundles/matrix-registration/metadata.py b/bundles/matrix-registration/metadata.py deleted file mode 100644 index f5e4e7c..0000000 --- a/bundles/matrix-registration/metadata.py +++ /dev/null @@ -1,25 +0,0 @@ -defaults = { - 'bash_aliases': { - 'matrix-registration': '/opt/matrix-registration/venv/bin/matrix-registration --config-path /opt/matrix-registration/config.yaml', - }, - 'matrix-registration': { - 'admin_secret': repo.vault.password_for(f'{node.name} matrix-registration admin secret'), - 'database': { - 'user': 'matrix-registration', - 'password': repo.vault.password_for(f'{node.name} postgresql matrix-registration'), - 'database': 'matrix-registration', - }, - }, - 'postgresql': { - 'roles': { - 'matrix-registration': { - 'password': repo.vault.password_for(f'{node.name} postgresql matrix-registration'), - }, - }, - 'databases': { - 'matrix-registration': { - 'owner': 'matrix-registration', - }, - }, - }, -} From 774cdd65b97d6c3eb4b8bcacc9fbf94be574f93e Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Tue, 14 Jan 2025 20:01:06 +0100 Subject: [PATCH 137/252] carlene: remove nodejs --- nodes/carlene.toml | 1 - 1 file changed, 1 deletion(-) diff --git a/nodes/carlene.toml b/nodes/carlene.toml index 9939076..2dbc16c 100644 --- a/nodes/carlene.toml +++ b/nodes/carlene.toml @@ -15,7 +15,6 @@ bundles = [ "miniflux", "netbox", "nextcloud", - "nodejs", "ntfy", "oidentd", "php", From 037ec8e2305c1238d9853fd8d9aa10135a602a30 Mon Sep 17 00:00:00 2001 From: Sophie Schiller Date: Tue, 14 Jan 2025 21:30:22 +0100 Subject: [PATCH 138/252] miniserver: postgres and element update --- nodes/sophie/miniserver.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/nodes/sophie/miniserver.py b/nodes/sophie/miniserver.py index 7be112f..c9d3034 100644 --- a/nodes/sophie/miniserver.py +++ b/nodes/sophie/miniserver.py @@ -61,7 +61,7 @@ nodes["htz-cloud.miniserver"] = { }, "element-web": { "url": "chat.sophies-kitchen.eu", - "version": "v1.11.86", + "version": "v1.11.90", "config": { "default_server_config": { "m.homeserver": { @@ -217,7 +217,7 @@ nodes["htz-cloud.miniserver"] = { "allow_unauthorized_write": True, }, "postgresql": { - "version": "11", + "version": "13", }, "sysctl": { "options": { From d258a02d46398d7f87bf8d9246bda8de45e0f2f3 Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Sun, 26 Jan 2025 09:34:22 +0100 Subject: [PATCH 139/252] update travelynx to 2.9.18 --- nodes/carlene.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nodes/carlene.toml b/nodes/carlene.toml index 2dbc16c..ff16153 100644 --- a/nodes/carlene.toml +++ b/nodes/carlene.toml @@ -250,7 +250,7 @@ disks = [ ] [metadata.travelynx] -version = "2.9.8" +version = "2.9.18" mail_from = "travelynx@franzi.business" domain = "travelynx.franzi.business" From 8a6c0d9e951157a7634c3f57c1d4ff8c65559dce Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Mon, 3 Feb 2025 20:52:38 +0100 Subject: [PATCH 140/252] rottenraptor-server new domain --- bundles/letsencrypt/items.py | 4 ++++ nodes/rottenraptor-server.toml | 6 +++++- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/bundles/letsencrypt/items.py b/bundles/letsencrypt/items.py index 585cf8e..dd0b9c2 100644 --- a/bundles/letsencrypt/items.py +++ b/bundles/letsencrypt/items.py @@ -12,6 +12,10 @@ actions = { 'needs': { 'svc_systemd:nginx', }, + 'after': { + 'svc_systemd:nginx:reload', + 'svc_systemd:nginx:restart', + }, }, } diff --git a/nodes/rottenraptor-server.toml b/nodes/rottenraptor-server.toml index 5e53f81..af8000f 100644 --- a/nodes/rottenraptor-server.toml +++ b/nodes/rottenraptor-server.toml @@ -23,8 +23,12 @@ ips = [ gateway4 = "91.198.192.193" gateway6 = "2001:67c:b54:1::1" +[metadata.nginx.vhosts.'rotten.city'.locations.'/'] +redirect = "https://www.rottenraptor.com/" +mode = 302 + [metadata.nginx.vhosts.immich] -domain = "rr-immich.franzi.business" +domain = "immich.rotten.city" [metadata.smartd] disks = [ From 97f6e8538f25cd33f72e9129700b16e7020c5037 Mon Sep 17 00:00:00 2001 From: Sophie Schiller Date: Thu, 6 Feb 2025 23:37:00 +0100 Subject: [PATCH 141/252] miniserver: element-web update --- nodes/sophie/miniserver.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nodes/sophie/miniserver.py b/nodes/sophie/miniserver.py index c9d3034..5fd1c11 100644 --- a/nodes/sophie/miniserver.py +++ b/nodes/sophie/miniserver.py @@ -61,7 +61,7 @@ nodes["htz-cloud.miniserver"] = { }, "element-web": { "url": "chat.sophies-kitchen.eu", - "version": "v1.11.90", + "version": "v1.11.91", "config": { "default_server_config": { "m.homeserver": { From 0c1a96cb724ac1afa8c7390651001023051e010b Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Tue, 11 Feb 2025 21:16:16 +0100 Subject: [PATCH 142/252] carlene: new ssd --- nodes/carlene.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nodes/carlene.toml b/nodes/carlene.toml index ff16153..51b4f73 100644 --- a/nodes/carlene.toml +++ b/nodes/carlene.toml @@ -245,7 +245,7 @@ dkim = "uO4aNejDvVdw8BKne3KJIqAvCQMJ0416" [metadata.smartd] disks = [ - "/dev/disk/by-id/nvme-SAMSUNG_MZVL22T0HBLB-00B00_S677NF0W508470", + "/dev/disk/by-id/nvme-SAMSUNG_MZVL22T0HBLB-00B00_S677NF0W503350", "/dev/disk/by-id/nvme-SAMSUNG_MZVL22T0HBLB-00B00_S677NX0W114380", ] From 6d2aad20ba3bfbc94f89df265ac2bd2696bda93e Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Tue, 11 Feb 2025 21:20:30 +0100 Subject: [PATCH 143/252] update forgejo to 10.0.1 --- nodes/carlene.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/nodes/carlene.toml b/nodes/carlene.toml index 51b4f73..1936f4c 100644 --- a/nodes/carlene.toml +++ b/nodes/carlene.toml @@ -37,8 +37,8 @@ imap_host = "secureimap.t-online.de" imap_pass = "!bwpass_attr:t-online.de/franzi.kunsmann@t-online.de:imap" [metadata.forgejo] -version = "9.0.3" -sha1 = "a04a8d5bee7321610d91da780a24e18f7407403c" +version = "10.0.1" +sha1 = "4bfe8cbe979ef8896e294ca662f4cf62af01531c" domain = "git.franzi.business" enable_git_hooks = true install_ssh_key = true From 846f34b8556343a31e64f711d51f7f0b1564f14a Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Tue, 11 Feb 2025 21:20:52 +0100 Subject: [PATCH 144/252] update matrix-media-repo to 1.3.8 --- nodes/carlene.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/nodes/carlene.toml b/nodes/carlene.toml index 1936f4c..c361868 100644 --- a/nodes/carlene.toml +++ b/nodes/carlene.toml @@ -58,9 +58,9 @@ gateway6 = "2a0a:51c0:0:225::1" [metadata.matrix-media-repo] admins = ["@kunsi:franzi.business"] datastore_id = "3fff5da324ed784c771d638bb6be5917" -sha1 = "3e2bb7089b0898b86000243a82cc58ae998dc9d9" +sha1 = "453c12cfb9f2c44c509620b63f94f8a9e2d048ef" upload_max_mb = 500 -version = "v1.3.7" +version = "v1.3.8" [metadata.matrix-media-repo.homeservers.'franzi.business'] api = "synapse" domain = "http://[::1]:20080/" From 159701d7b8658f35911abe08725e0c8341fe239e Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Tue, 11 Feb 2025 21:21:27 +0100 Subject: [PATCH 145/252] update netbox to 4.2.3 --- nodes/carlene.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nodes/carlene.toml b/nodes/carlene.toml index c361868..6a8c489 100644 --- a/nodes/carlene.toml +++ b/nodes/carlene.toml @@ -114,7 +114,7 @@ domain = "rss.franzi.business" [metadata.netbox] domain = "netbox.franzi.business" -version = "v4.1.10" +version = "v4.2.3" admins.kunsi = "hostmaster@kunbox.net" [metadata.nextcloud] From 59596c08ae4e9fef085ae7bfd53c3c5ef1f22ad0 Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Tue, 11 Feb 2025 21:23:15 +0100 Subject: [PATCH 146/252] update paperless-ngx to 2.14.7 --- nodes/home/paperless.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nodes/home/paperless.py b/nodes/home/paperless.py index 6297179..7a28c3d 100644 --- a/nodes/home/paperless.py +++ b/nodes/home/paperless.py @@ -48,7 +48,7 @@ nodes['home.paperless'] = { }, 'paperless': { 'domain': 'paperless.home.kunbox.net', - 'version': 'v2.13.5', + 'version': 'v2.14.7', 'timezone': 'Europe/Berlin', }, 'postgresql': { From 18b8c963ab7903bc36a96e09a9c0ae6aaae6b021 Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Fri, 14 Feb 2025 19:32:13 +0100 Subject: [PATCH 147/252] bundles/backup-server: support raid0-ing multiple raidz --- bundles/backup-server/metadata.py | 63 ++++++++++++++++++++++--------- 1 file changed, 45 insertions(+), 18 deletions(-) diff --git a/bundles/backup-server/metadata.py b/bundles/backup-server/metadata.py index 3d78ed6..4be6390 100644 --- a/bundles/backup-server/metadata.py +++ b/bundles/backup-server/metadata.py @@ -1,3 +1,5 @@ +from bundlewrap.exceptions import BundleError + defaults = { 'backup-server': { 'my_ssh_port': 22, @@ -69,25 +71,51 @@ def zfs_pool(metadata): return {} crypt_devices = {} - pool_devices = set() unlock_actions = set() - for number, (device, passphrase) in enumerate(sorted(metadata.get('backup-server/encrypted-devices', {}).items())): - crypt_devices[device] = { - 'dm-name': f'backup{number}', - 'passphrase': passphrase, - } - pool_devices.add(f'/dev/mapper/backup{number}') - unlock_actions.add(f'action:dm-crypt_open_backup{number}') + devices = metadata.get('backup-server/encrypted-devices') - pool_opts = { - 'devices': pool_devices, - } + # TODO remove this once we have migrated all systems + if isinstance(devices, dict): + pool_devices = set() - if len(pool_devices) > 2: - pool_opts['type'] = 'raidz' - elif len(pool_devices) > 1: - pool_opts['type'] = 'mirror' + for number, (device, passphrase) in enumerate(sorted(devices.items())): + crypt_devices[device] = { + 'dm-name': f'backup{number}', + 'passphrase': passphrase, + } + pool_devices.add(f'/dev/mapper/backup{number}') + unlock_actions.add(f'action:dm-crypt_open_backup{number}') + + pool_config = [{ + 'devices': pool_devices, + }] + + if len(pool_devices) > 2: + pool_config[0]['type'] = 'raidz' + elif len(pool_devices) > 1: + pool_config[0]['type'] = 'mirror' + + elif isinstance(devices, list): + pool_config = [] + + for idx, intended_pool in enumerate(devices): + pool_devices = set() + + for number, (device, passphrase) in enumerate(sorted(intended_pool.items())): + crypt_devices[device] = { + 'dm-name': f'backup{idx}-{number}', + 'passphrase': passphrase, + } + pool_devices.add(f'/dev/mapper/backup{idx}-{number}') + unlock_actions.add(f'action:dm-crypt_open_backup{idx}-{number}') + + pool_config.append({ + 'devices': pool_devices, + 'type': 'raidz', + }) + else: + raise BundleError(f'{node.name}: unsupported configuration for backup-server/encrypted-devices') return { 'backup-server': { @@ -100,9 +128,8 @@ def zfs_pool(metadata): 'pools': { 'backups': { 'when_creating': { - 'config': [ - pool_opts, - ], + 'config': pool_config, + **metadata.get('backup-server/zpool_create_options', {}), }, 'needs': unlock_actions, # That's a bit hacky. We do it this way to auto-import From f0031ef847d52500ddb5648f86a426011e04ea64 Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Fri, 14 Feb 2025 19:33:13 +0100 Subject: [PATCH 148/252] rottenraptor-server: new disks --- nodes/rottenraptor-server.toml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/nodes/rottenraptor-server.toml b/nodes/rottenraptor-server.toml index af8000f..1a28b6b 100644 --- a/nodes/rottenraptor-server.toml +++ b/nodes/rottenraptor-server.toml @@ -5,7 +5,7 @@ groups = [ ] bundles = [ "docker-engine", - "docker-immich", +# "docker-immich", "ipmitool", "redis", "smartd", @@ -32,8 +32,8 @@ domain = "immich.rotten.city" [metadata.smartd] disks = [ - "/dev/disk/by-id/ata-WDC_WD30EZRX-00DC0B0_WD-WMC1T0287704", - "/dev/disk/by-id/ata-WDC_WD30EZRX-00DC0B0_WD-WMC1T0387139", + "/dev/disk/by-id/ata-HUH721008ALN600_7SGH125C", + "/dev/disk/by-id/ata-HUH721008ALN600_7SGH726C", "/dev/disk/by-id/ata-WDC_WDS100T1R0A-68A4W0_21133V800321", "/dev/disk/by-id/ata-WDC_WDS100T1R0A-68A4W0_21283J446103", "/dev/disk/by-id/nvme-TOSHIBA-RC100_58UPC29HPW5S", @@ -45,8 +45,8 @@ ashift = 12 [[metadata.zfs.pools.tank.when_creating.config]] type = "mirror" devices = [ - "/dev/disk/by-id/ata-WDC_WD30EZRX-00DC0B0_WD-WMC1T0287704", - "/dev/disk/by-id/ata-WDC_WD30EZRX-00DC0B0_WD-WMC1T0387139", + "/dev/disk/by-id/ata-HUH721008ALN600_7SGH125C", + "/dev/disk/by-id/ata-HUH721008ALN600_7SGH726C", ] [[metadata.zfs.pools.tank.when_creating.config]] From 22263eaf6f6dfddef6e3ebb10d935a2709496ace Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Fri, 14 Feb 2025 19:33:52 +0100 Subject: [PATCH 149/252] add new backup server --- nodes/backup-kunsi.toml | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 nodes/backup-kunsi.toml diff --git a/nodes/backup-kunsi.toml b/nodes/backup-kunsi.toml new file mode 100644 index 0000000..276aa0a --- /dev/null +++ b/nodes/backup-kunsi.toml @@ -0,0 +1,34 @@ +hostname = "2001:67c:b54:1::f" +bundles = ["backup-server", "dm-crypt", "zfs"] +groups = ["debian-bookworm"] + +[metadata] +nameservers = ["2001:4860:4860::8888"] + +[metadata.apt.unattended-upgrades] +# requires manual apply to unlock disks +reboot_enabled = false + +[metadata.interfaces.ens18] +ips = ["2001:67c:b54:1::f/64"] +gateway6 = "2001:67c:b54:1::1" + +[metadata.backups] +# this is the backup server +exclude_from_backups = true + +[metadata.backup-server.zpool_create_options] +ashift = 12 + +[[metadata.backup-server.encrypted-devices]] +"/dev/disk/by-id/scsi-0QEMU_QEMU_HARDDISK_drive-scsi1-part1" = "!bwpass:bw/backup-kunsi/ata-ST18000NM0092-3CX103_ZVV06SLR-part1" +"/dev/disk/by-id/scsi-0QEMU_QEMU_HARDDISK_drive-scsi2-part1" = "!bwpass:bw/backup-kunsi/ata-ST18000NM0092-3CX103_ZVV0686W-part1" +"/dev/disk/by-id/scsi-0QEMU_QEMU_HARDDISK_drive-scsi3-part1" = "!bwpass:bw/backup-kunsi/ata-ST18000NM0092-3CX103_ZVV06JV7-part1" + +[[metadata.backup-server.encrypted-devices]] +"/dev/disk/by-id/scsi-0QEMU_QEMU_HARDDISK_drive-scsi1-part2" = "!bwpass:bw/backup-kunsi/ata-ST18000NM0092-3CX103_ZVV06SLR-part2" +"/dev/disk/by-id/scsi-0QEMU_QEMU_HARDDISK_drive-scsi2-part2" = "!bwpass:bw/backup-kunsi/ata-ST18000NM0092-3CX103_ZVV0686W-part2" +"/dev/disk/by-id/scsi-0QEMU_QEMU_HARDDISK_drive-scsi3-part2" = "!bwpass:bw/backup-kunsi/ata-ST18000NM0092-3CX103_ZVV06JV7-part2" + +[metadata.zfs] +scrub_when = "Wed 08:00 Europe/Berlin" From a7a59fd690fa08bd0c1e4bc36826dd9ae64eddaf Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Fri, 14 Feb 2025 21:25:10 +0100 Subject: [PATCH 150/252] bundles/backups-server: read backup snapshot info from file instead of asking zfs every time --- .../backup-server/files/check_backup_for_node | 23 +++-------- .../files/check_backup_for_node-cron | 39 +++++++++++++++++++ bundles/backup-server/items.py | 3 ++ bundles/backup-server/metadata.py | 10 ++++- 4 files changed, 56 insertions(+), 19 deletions(-) create mode 100644 bundles/backup-server/files/check_backup_for_node-cron diff --git a/bundles/backup-server/files/check_backup_for_node b/bundles/backup-server/files/check_backup_for_node index b7866f8..bf57012 100644 --- a/bundles/backup-server/files/check_backup_for_node +++ b/bundles/backup-server/files/check_backup_for_node @@ -2,7 +2,6 @@ from datetime import datetime from json import load -from subprocess import check_output from sys import argv, exit from time import time @@ -18,29 +17,17 @@ try: with open(f'/etc/backup-server/config.json', 'r') as f: server_settings = load(f) - # get all existing snapshots for NODE - for line in check_output('LC_ALL=C zfs list -H -t snapshot -o name', shell=True).splitlines(): - line = line.decode('UTF-8') + with open(f'/etc/backup-server/backups.json', 'r') as f: + backups = load(f) - if line.startswith('{}/{}@'.format(server_settings['zfs-base'], NODE)): - _, snapname = line.split('@', 1) - - if 'zfs-auto-snap' in snapname: - # migration from auto-snapshots, ignore - continue - - ts, bucket = snapname.split('-', 1) - snaps.add(int(ts)) - - if not snaps: + if NODE not in backups: print('No backups found!') exit(2) - last_snap = sorted(snaps)[-1] - delta = NOW - last_snap + delta = NOW - backups[NODE] print('Last backup was on {} UTC'.format( - datetime.fromtimestamp(last_snap).strftime('%Y-%m-%d %H:%M:%S'), + datetime.fromtimestamp(backups[NODE]).strftime('%Y-%m-%d %H:%M:%S'), )) # One day without backups is still okay. There may be fluctuations diff --git a/bundles/backup-server/files/check_backup_for_node-cron b/bundles/backup-server/files/check_backup_for_node-cron new file mode 100644 index 0000000..b82217d --- /dev/null +++ b/bundles/backup-server/files/check_backup_for_node-cron @@ -0,0 +1,39 @@ +#!/usr/bin/env python3 + +from json import load, dump +from subprocess import check_output +from shutil import move +from os import remove +from collections import defaultdict + +with open('/etc/backup-server/config.json', 'r') as f: + server_settings = load(f) + +snapshots = defaultdict(set) + +for line in check_output('LC_ALL=C zfs list -H -t snapshot -o name', shell=True).splitlines(): + line = line.decode('UTF-8') + + if line.startswith('{}/'.format(server_settings['zfs-base'])): + dataset, snapname = line.split('@', 1) + + dataset = dataset.split('/')[-1] + ts, bucket = snapname.split('-', 1) + + if not ts.isdigit(): + # garbage, ignore + continue + + snapshots[dataset].add(int(ts)) + +backups = {} +for dataset, snaps in snapshots.items(): + backups[dataset] = sorted(snaps)[-1] + +with open('/etc/backup-server/backups.tmp.json', 'w') as f: + dump(backups, f) + +move( + '/etc/backup-server/backups.tmp.json', + '/etc/backup-server/backups.json', +) diff --git a/bundles/backup-server/items.py b/bundles/backup-server/items.py index bd4d12f..e872231 100644 --- a/bundles/backup-server/items.py +++ b/bundles/backup-server/items.py @@ -18,6 +18,9 @@ files = { '/usr/local/share/icinga/plugins/check_backup_for_node': { 'mode': '0755', }, + '/usr/local/share/icinga/plugins/check_backup_for_node-cron': { + 'mode': '0755', + }, } directories['/etc/backup-server/clients'] = { diff --git a/bundles/backup-server/metadata.py b/bundles/backup-server/metadata.py index 4be6390..aace61b 100644 --- a/bundles/backup-server/metadata.py +++ b/bundles/backup-server/metadata.py @@ -10,6 +10,14 @@ defaults = { 'c-*', }, }, + 'systemd-timers': { + 'timers': { + 'check_backup_for_node-cron': { + 'command': '/usr/local/share/icinga/plugins/check_backup_for_node-cron', + 'when': '*-*-* *:00/5:00', # every five minutes + } + }, + }, 'zfs': { # The whole point of doing backups is to keep them for a long # time, which eliminates the need for this check. @@ -183,7 +191,7 @@ def monitoring(metadata): continue services[f'BACKUPS FOR NODE {client}'] = { - 'command_on_monitored_host': 'sudo /usr/local/share/icinga/plugins/check_backup_for_node {} {}'.format( + 'command_on_monitored_host': '/usr/local/share/icinga/plugins/check_backup_for_node {} {}'.format( client, config['one_backup_every_hours'], ), From 83730ccb6d106d35e67103bdf472478e780af4d2 Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Sat, 15 Feb 2025 08:51:07 +0100 Subject: [PATCH 151/252] bundles/backup-server: ignore all non-digit snapshots when rotating --- bundles/backup-server/files/rotate-single-backup-client | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/bundles/backup-server/files/rotate-single-backup-client b/bundles/backup-server/files/rotate-single-backup-client index ee49e26..c76c6b5 100644 --- a/bundles/backup-server/files/rotate-single-backup-client +++ b/bundles/backup-server/files/rotate-single-backup-client @@ -33,12 +33,11 @@ for line in check_output('LC_ALL=C zfs list -H -t snapshot -o name', shell=True) if line.startswith('{}/{}@'.format(server_settings['zfs-base'], NODE)): _, snapname = line.split('@', 1) + ts, bucket = snapname.split('-', 1) - if 'zfs-auto-snap' in snapname: - # migration from auto-snapshots, ignore + if not ts.isdigit(): continue - ts, bucket = snapname.split('-', 1) buckets.setdefault(bucket, set()).add(int(ts)) syslog(f'classified {line} as {bucket} from {ts}') From aae1e8397e06332c8f3358474e1de11ab49005fe Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Sat, 15 Feb 2025 09:19:24 +0100 Subject: [PATCH 152/252] proxmox-backupstorage: new server, new checks --- nodes/htz-hel/proxmox-backupstorage.toml | 28 ------------------- nodes/proxmox-backupstorage.toml | 34 ++++++++++++++++++++++++ 2 files changed, 34 insertions(+), 28 deletions(-) delete mode 100644 nodes/htz-hel/proxmox-backupstorage.toml create mode 100644 nodes/proxmox-backupstorage.toml diff --git a/nodes/htz-hel/proxmox-backupstorage.toml b/nodes/htz-hel/proxmox-backupstorage.toml deleted file mode 100644 index 0c6d7ac..0000000 --- a/nodes/htz-hel/proxmox-backupstorage.toml +++ /dev/null @@ -1,28 +0,0 @@ -hostname = "2a01:4f9:6b:2d99::c0ff:ee" -#dummy = true -bundles = ["sshmon", "smartd"] - -# How to install: -# - Get server at Hetzner (no IPv4) -# - Install latest proxmox compatible debian -# - RAID5 -# - 50G for system -# - leave rest unpartitioned -# - install zfs -# - create additional partitions for remaining disk space -# - create raidz on those partitions -# - enable ipv6 forwarding -# - install proxmox via apt - -# VM config: -# - IPv6 only -# - IP from the /64 hetzner gives us -# - Gateway is the host itself, to work around the MAC filter hetzner uses - -[metadata.smartd] -disks = [ - "/dev/sda", - "/dev/sdb", - "/dev/sdc", - "/dev/sdd", -] diff --git a/nodes/proxmox-backupstorage.toml b/nodes/proxmox-backupstorage.toml new file mode 100644 index 0000000..7d58297 --- /dev/null +++ b/nodes/proxmox-backupstorage.toml @@ -0,0 +1,34 @@ +hostname = "192.168.100.31" +dummy = true + +[metadata.icinga2_api.smartd.services."SMART STATUS CT480BX500SSD1_2314E6C5C695"] +check_command = "sshmon" +"vars.sshmon_command" = "CT480BX500SSD1_2314E6C5C695" + +[metadata.icinga2_api.smartd.services."SMART STATUS CT480BX500SSD1_2314E6C5C6C8"] +check_command = "sshmon" +"vars.sshmon_command" = "CT480BX500SSD1_2314E6C5C6C8" + +[metadata.icinga2_api.smartd.services."SMART STATUS ST18000NM0092-3CX103_ZVV0686W"] +check_command = "sshmon" +"vars.sshmon_command" = "ST18000NM0092-3CX103_ZVV0686W" + +[metadata.icinga2_api.smartd.services."SMART STATUS ST18000NM0092-3CX103_ZVV06JV7"] +check_command = "sshmon" +"vars.sshmon_command" = "ST18000NM0092-3CX103_ZVV06JV7" + +[metadata.icinga2_api.smartd.services."SMART STATUS ST18000NM0092-3CX103_ZVV06SLR"] +check_command = "sshmon" +"vars.sshmon_command" = "ST18000NM0092-3CX103_ZVV06SLR" + +[metadata.icinga2_api.smartd.services."SMART STATUS ST8000NM0045-1RL112_ZA1EYQWR"] +check_command = "sshmon" +"vars.sshmon_command" = "ST8000NM0045-1RL112_ZA1EYQWR" + +[metadata.icinga2_api.smartd.services."SMART STATUS ST8000NM0045-1RL112_ZA1EYZQF"] +check_command = "sshmon" +"vars.sshmon_command" = "ST8000NM0045-1RL112_ZA1EYZQF" + +[metadata.icinga2_api.smartd.services."SMART STATUS ST8000NM0045-1RL112_ZA1EZ0X5"] +check_command = "sshmon" +"vars.sshmon_command" = "ST8000NM0045-1RL112_ZA1EZ0X5" From 463443e1e3d4bcb16b1a3f26b62d296fd0c5afdc Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Sat, 15 Feb 2025 10:32:56 +0100 Subject: [PATCH 153/252] bundles/docker-engine: do not put containers on the host network --- bundles/docker-engine/files/docker-wrapper | 5 ++--- bundles/docker-engine/metadata.py | 13 +++++++++++++ 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/bundles/docker-engine/files/docker-wrapper b/bundles/docker-engine/files/docker-wrapper index c225ceb..20bf38d 100644 --- a/bundles/docker-engine/files/docker-wrapper +++ b/bundles/docker-engine/files/docker-wrapper @@ -18,6 +18,7 @@ PGID="$(id -g "docker-${name}")" if [ "$ACTION" == "start" ] then docker run -d \ + --rm \ --name "${name}" \ --env "PUID=$PUID" \ --env "PGID=$PGID" \ @@ -25,9 +26,8 @@ then % for k, v in sorted(environment.items()): --env "${k}=${v}" \ % endfor - --network host \ % for host_port, container_port in sorted(ports.items()): - --expose "127.0.0.1:${host_port}:${container_port}" \ + --publish "127.0.0.1:${host_port}:${container_port}" \ % endfor % for host_path, container_path in sorted(volumes.items()): --volume "/var/opt/docker-engine/${name}/${host_path}:${container_path}" \ @@ -38,7 +38,6 @@ then elif [ "$ACTION" == "stop" ] then docker stop "${name}" - docker rm "${name}" else echo "Unknown action $ACTION" diff --git a/bundles/docker-engine/metadata.py b/bundles/docker-engine/metadata.py index fa55b5e..39cc92f 100644 --- a/bundles/docker-engine/metadata.py +++ b/bundles/docker-engine/metadata.py @@ -18,6 +18,19 @@ defaults = { '/var/opt/docker-engine', }, }, + 'nftables': { + 'forward': { + 'docker-engine': [ + 'ct state { related, established } accept', + 'iifname docker0 accept', + ], + }, + 'postrouting': { + 'docker-engine': [ + 'iifname docker0 masquerade', + ], + }, + }, 'hosts': { 'entries': { '172.17.0.1': { From 5af3fbe3e06de7ac32f5efdff89699bb8f674b81 Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Sat, 15 Feb 2025 10:33:25 +0100 Subject: [PATCH 154/252] bundles/redis: support 'restrict-to' --- bundles/redis/metadata.py | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/bundles/redis/metadata.py b/bundles/redis/metadata.py index cf15c20..dc0f23b 100644 --- a/bundles/redis/metadata.py +++ b/bundles/redis/metadata.py @@ -1,3 +1,5 @@ +from bundlewrap.metadata import atomic + defaults = { 'apt': { 'packages': { @@ -48,3 +50,16 @@ if node.has_bundle('telegraf'): }, }, } + + +@metadata_reactor.provides( + 'firewall/port_rules', +) +def firewall(metadata): + return { + 'firewall': { + 'port_rules': { + '6379/tcp': atomic(metadata.get('redis/restrict-to', {'*'})), + }, + }, + } From 932ae43621382ae0b0faf691d1e7b7870817911d Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Sat, 15 Feb 2025 11:06:09 +0100 Subject: [PATCH 155/252] bundles/docker-engine: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARGLLLLLLLLLLLLLLLLLLLLLLLLL networking is apparently hard --- bundles/docker-engine/files/docker-wrapper | 4 +++- bundles/docker-engine/items.py | 19 +++++++++++++++++-- 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/bundles/docker-engine/files/docker-wrapper b/bundles/docker-engine/files/docker-wrapper index 20bf38d..adff8e4 100644 --- a/bundles/docker-engine/files/docker-wrapper +++ b/bundles/docker-engine/files/docker-wrapper @@ -17,8 +17,9 @@ PGID="$(id -g "docker-${name}")" if [ "$ACTION" == "start" ] then + docker rm "${name}" || true + docker run -d \ - --rm \ --name "${name}" \ --env "PUID=$PUID" \ --env "PGID=$PGID" \ @@ -26,6 +27,7 @@ then % for k, v in sorted(environment.items()): --env "${k}=${v}" \ % endfor + --network aaarghhh \ % for host_port, container_port in sorted(ports.items()): --publish "127.0.0.1:${host_port}:${container_port}" \ % endfor diff --git a/bundles/docker-engine/items.py b/bundles/docker-engine/items.py index 9e52eca..941c766 100644 --- a/bundles/docker-engine/items.py +++ b/bundles/docker-engine/items.py @@ -28,6 +28,21 @@ files['/usr/local/share/icinga/plugins/check_docker_container'] = { 'mode': '0755', } +actions['docker_create_nondefault_network'] = { + # + # By default, containers inherit the DNS settings as defined in the + # /etc/resolv.conf configuration file. Containers that attach to the + # default bridge network receive a copy of this file. Containers that + # attach to a custom network use Docker's embedded DNS server. The embedded + # DNS server forwards external DNS lookups to the DNS servers configured on + # the host. + 'command': 'docker network create aaarghhh', + 'unless': 'docker network ls | grep -q -F aaarghhh', + 'needs': { + 'svc_systemd:docker', + }, +} + for app, config in node.metadata.get('docker-engine/containers', {}).items(): volumes = config.get('volumes', {}) @@ -54,8 +69,8 @@ for app, config in node.metadata.get('docker-engine/containers', {}).items(): 'docker', }, 'after': { - # provides docker group - 'pkg_apt:docker-ce', + 'action:docker_create_nondefault_network', + 'svc_systemd:docker', }, } From 46381c63df883f9f22f29257922552782be7f56f Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Sat, 15 Feb 2025 11:07:11 +0100 Subject: [PATCH 156/252] rottenraptor-server: get immich working again --- bundles/docker-immich/metadata.py | 27 ++++++++++++++------------- nodes/rottenraptor-server.toml | 2 +- 2 files changed, 15 insertions(+), 14 deletions(-) diff --git a/bundles/docker-immich/metadata.py b/bundles/docker-immich/metadata.py index b41ea36..4c57801 100644 --- a/bundles/docker-immich/metadata.py +++ b/bundles/docker-immich/metadata.py @@ -9,24 +9,29 @@ defaults = { 'image': 'ghcr.io/imagegenius/immich:latest', 'environment': { 'DB_DATABASE_NAME': 'immich', - 'DB_HOSTNAME': 'host.docker.internal', + 'DB_HOSTNAME': 'immich-postgresql', 'DB_PASSWORD': repo.vault.password_for(f'{node.name} postgresql immich'), 'DB_USERNAME': 'immich', - 'REDIS_HOSTNAME': 'host.docker.internal', + 'REDIS_HOSTNAME': 'immich-redis', }, 'volumes': { 'config': '/config', 'libraries': '/libraries', 'photos': '/photos', }, + 'ports': { + '8080': '8080', + }, 'needs': { - 'svc_systemd:docker-postgresql14', + 'svc_systemd:docker-immich-postgresql', + 'svc_systemd:docker-immich-redis', }, 'requires': { - 'docker-postgresql14.service', + 'docker-immich-postgresql.service', + 'docker-immich-redis.service', }, }, - 'postgresql14': { + 'immich-postgresql': { 'image': 'tensorchord/pgvecto-rs:pg14-v0.2.0', 'environment': { 'POSTGRES_PASSWORD': repo.vault.password_for(f'{node.name} postgresql immich'), @@ -37,6 +42,9 @@ defaults = { 'database': '/var/lib/postgresql/data', }, }, + 'immich-redis': { + 'image': 'docker.io/redis:6.2-alpine', + }, }, }, 'nginx': { @@ -46,19 +54,12 @@ defaults = { '/': { 'target': 'http://127.0.0.1:8080/', 'websockets': True, - 'max_body_size': '500m', + 'max_body_size': '5000m', }, - #'/api/socket.io/': { - # 'target': 'http://127.0.0.1:8081/', - # 'websockets': True, - #}, }, }, }, }, - 'redis': { - 'bind': '0.0.0.0', - }, } diff --git a/nodes/rottenraptor-server.toml b/nodes/rottenraptor-server.toml index 1a28b6b..54a5fe1 100644 --- a/nodes/rottenraptor-server.toml +++ b/nodes/rottenraptor-server.toml @@ -5,7 +5,7 @@ groups = [ ] bundles = [ "docker-engine", -# "docker-immich", + "docker-immich", "ipmitool", "redis", "smartd", From 2257e9a863ccbe5ff4dae934b47fac07d6c314f0 Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Sat, 15 Feb 2025 12:55:47 +0100 Subject: [PATCH 157/252] bundles/docker-immich: fix assers --- bundles/docker-immich/metadata.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/bundles/docker-immich/metadata.py b/bundles/docker-immich/metadata.py index 4c57801..5b73f70 100644 --- a/bundles/docker-immich/metadata.py +++ b/bundles/docker-immich/metadata.py @@ -1,6 +1,4 @@ assert node.has_bundle('docker-engine') -assert node.has_bundle('redis') -assert not node.has_bundle('postgresql') # docker container uses that port defaults = { 'docker-engine': { @@ -61,5 +59,3 @@ defaults = { }, }, } - - From 7df5570db8361662ea87e0aa1ba7d27237290abd Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Sat, 15 Feb 2025 12:59:49 +0100 Subject: [PATCH 158/252] bundles/redis: fix default for restrict-to --- bundles/redis/metadata.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bundles/redis/metadata.py b/bundles/redis/metadata.py index dc0f23b..db31a84 100644 --- a/bundles/redis/metadata.py +++ b/bundles/redis/metadata.py @@ -59,7 +59,7 @@ def firewall(metadata): return { 'firewall': { 'port_rules': { - '6379/tcp': atomic(metadata.get('redis/restrict-to', {'*'})), + '6379/tcp': atomic(metadata.get('redis/restrict-to', set())), }, }, } From 63779b6519658f36da05c5f5789a8c23cca573d3 Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Sat, 15 Feb 2025 14:34:21 +0100 Subject: [PATCH 159/252] bundles/docker-engine: fix firewqall rules --- bundles/docker-engine/metadata.py | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/bundles/docker-engine/metadata.py b/bundles/docker-engine/metadata.py index 39cc92f..2b9212f 100644 --- a/bundles/docker-engine/metadata.py +++ b/bundles/docker-engine/metadata.py @@ -22,22 +22,15 @@ defaults = { 'forward': { 'docker-engine': [ 'ct state { related, established } accept', - 'iifname docker0 accept', + 'ip saddr 172.16.0.0/12 accept', ], }, 'postrouting': { 'docker-engine': [ - 'iifname docker0 masquerade', + 'ip saddr 172.16.0.0/12 masquerade', ], }, }, - 'hosts': { - 'entries': { - '172.17.0.1': { - 'host.docker.internal', - }, - }, - }, 'docker-engine': { 'config': { 'iptables': False, From df469cc2e2289d199cfbfb38fd22a17e3aa2f1ea Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Sat, 15 Feb 2025 14:41:49 +0100 Subject: [PATCH 160/252] backup-kunsi: install qemu-guest-agent --- nodes/backup-kunsi.toml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/nodes/backup-kunsi.toml b/nodes/backup-kunsi.toml index 276aa0a..3e17bd7 100644 --- a/nodes/backup-kunsi.toml +++ b/nodes/backup-kunsi.toml @@ -5,6 +5,8 @@ groups = ["debian-bookworm"] [metadata] nameservers = ["2001:4860:4860::8888"] +[metadata.apt.packages.qemu-guest-agent] + [metadata.apt.unattended-upgrades] # requires manual apply to unlock disks reboot_enabled = false From b44c7097657605480cd10d03211a31786950f529 Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Sun, 16 Feb 2025 15:27:18 +0100 Subject: [PATCH 161/252] switch systems to new backup server --- groups/os.py | 2 +- nodes/voc/pretalx.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/groups/os.py b/groups/os.py index d6f1d6b..98dacfa 100644 --- a/groups/os.py +++ b/groups/os.py @@ -34,7 +34,7 @@ groups['linux'] = { }, 'metadata': { 'backup-client': { - 'target': 'htz-hel.backup-kunsi', + 'target': 'backup-kunsi', }, 'firewall': { 'port_rules': { diff --git a/nodes/voc/pretalx.py b/nodes/voc/pretalx.py index 376a5e6..f37a29c 100644 --- a/nodes/voc/pretalx.py +++ b/nodes/voc/pretalx.py @@ -17,7 +17,7 @@ nodes['voc.pretalx'] = { }, 'metadata': { 'backup-client': { - 'target': 'htz-hel.backup-kunsi', + 'target': 'backup-kunsi', }, 'check-mail-received': { 't-online': { From 79680e2119ecc7bc08f94dd123f0d48d32f35b74 Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Sun, 16 Feb 2025 16:09:51 +0100 Subject: [PATCH 162/252] home.r630: exclude from backups --- nodes/home.r630.toml | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/nodes/home.r630.toml b/nodes/home.r630.toml index cdfc4ba..408afb4 100644 --- a/nodes/home.r630.toml +++ b/nodes/home.r630.toml @@ -4,11 +4,7 @@ bundles = ["docker-engine", "nginx", "redis"] [metadata] icinga_options.exclude_from_monitoring = true - -[metadata.docker-engine.config] -# this is a dev machine, it's fine if docker does shenanigans with -# iptables -iptables = true +backups.exclude_from_backups = true [metadata.interfaces.eno3] ips = [ From 45c52c62ca73e0d58281a48b7e5907d1f6fc59b9 Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Sun, 16 Feb 2025 16:14:56 +0100 Subject: [PATCH 163/252] bundles/docker-engine: turns out, filtering by name means getting everything where the name contains the filter ... --- bundles/docker-engine/files/check_docker_container | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/bundles/docker-engine/files/check_docker_container b/bundles/docker-engine/files/check_docker_container index 2d8216a..ea94173 100644 --- a/bundles/docker-engine/files/check_docker_container +++ b/bundles/docker-engine/files/check_docker_container @@ -18,7 +18,13 @@ try: f'name={container_name}' ]) - containers = loads(f"[{','.join([l for l in docker_ps.decode().splitlines() if l])}]") + docker_json = loads(f"[{','.join([l for l in docker_ps.decode().splitlines() if l])}]") + + containers = [ + container + for container in docker_json + if container['Names'] == container_name + ] if not containers: print(f'CRITICAL: container {container_name} not found!') From e0903ffa50823bc7020b62c6534a26cdf8bbaa2c Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Sun, 16 Feb 2025 17:31:35 +0100 Subject: [PATCH 164/252] update mautrix-whatsapp to 0.11.3 --- nodes/carlene.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/nodes/carlene.toml b/nodes/carlene.toml index 6a8c489..d738e4b 100644 --- a/nodes/carlene.toml +++ b/nodes/carlene.toml @@ -102,8 +102,8 @@ provisioning.shared_secret = "!decrypt:encrypt$gAAAAABfVKflEMAi07C_QGP8cy97hF-4g "'@kunsi:franzi.business'" = "admin" [metadata.mautrix-whatsapp] -version = "v0.11.2" -sha1 = "0bd8ebef237473989c4e9658c72595e9f7c09d44" +version = "v0.11.3" +sha1 = "f1daba15750313fe205f6d3af2594f11992f0a35" permissions."'@kunsi:franzi.business'" = "admin" [metadata.mautrix-whatsapp.homeserver] domain = "franzi.business" From f04149b4a7aaab46870f4a9e13e99fa22607ffb2 Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Sun, 16 Feb 2025 18:35:54 +0100 Subject: [PATCH 165/252] bundles/docker-engine: support different user, arbitrary mapped volumes, custom command --- bundles/docker-engine/files/docker-wrapper | 13 +++++++++++-- bundles/docker-engine/items.py | 21 ++++++++++++++------- 2 files changed, 25 insertions(+), 9 deletions(-) diff --git a/bundles/docker-engine/files/docker-wrapper b/bundles/docker-engine/files/docker-wrapper index adff8e4..97c0d37 100644 --- a/bundles/docker-engine/files/docker-wrapper +++ b/bundles/docker-engine/files/docker-wrapper @@ -12,8 +12,8 @@ then exit 1 fi -PUID="$(id -u "docker-${name}")" -PGID="$(id -g "docker-${name}")" +PUID="$(id -u "${user}")" +PGID="$(id -g "${user}")" if [ "$ACTION" == "start" ] then @@ -32,10 +32,19 @@ then --publish "127.0.0.1:${host_port}:${container_port}" \ % endfor % for host_path, container_path in sorted(volumes.items()): +% if host_path.startswith('/'): + --volume "${host_path}:${container_path}" \ +% else: --volume "/var/opt/docker-engine/${name}/${host_path}:${container_path}" \ +% endif % endfor --restart unless-stopped \ +% if command: + "${image}" \ + "${command}" +% else: "${image}" +% endif elif [ "$ACTION" == "stop" ] then diff --git a/bundles/docker-engine/items.py b/bundles/docker-engine/items.py index 941c766..7050197 100644 --- a/bundles/docker-engine/items.py +++ b/bundles/docker-engine/items.py @@ -45,16 +45,19 @@ actions['docker_create_nondefault_network'] = { for app, config in node.metadata.get('docker-engine/containers', {}).items(): volumes = config.get('volumes', {}) + user = config.get('user', f'docker-{app}') files[f'/opt/docker-engine/{app}'] = { 'source': 'docker-wrapper', 'content_type': 'mako', 'context': { + 'command': config.get('command'), 'environment': config.get('environment', {}), 'image': config['image'], 'name': app, 'ports': config.get('ports', {}), 'timezone': node.metadata.get('timezone'), + 'user': user, 'volumes': volumes, }, 'mode': '0755', @@ -63,8 +66,7 @@ for app, config in node.metadata.get('docker-engine/containers', {}).items(): }, } - users[f'docker-{app}'] = { - 'home': f'/var/opt/docker-engine/{app}', + users[user] = { 'groups': { 'docker', }, @@ -73,6 +75,8 @@ for app, config in node.metadata.get('docker-engine/containers', {}).items(): 'svc_systemd:docker', }, } + if user == f'docker-{app}': + users[user]['home'] = f'/var/opt/docker-engine/{app}' files[f'/usr/local/lib/systemd/system/docker-{app}.service'] = { 'source': 'docker-wrapper.service', @@ -95,20 +99,23 @@ for app, config in node.metadata.get('docker-engine/containers', {}).items(): *deps, f'file:/opt/docker-engine/{app}', f'file:/usr/local/lib/systemd/system/docker-{app}.service', - f'user:docker-{app}', + f'user:{user}', 'svc_systemd:docker', *set(config.get('needs', set())), }, } for volume in volumes: - directories[f'/var/opt/docker-engine/{app}/{volume}'] = { - 'owner': f'docker-{app}', - 'group': f'docker-{app}', + if not volume.startswith('/'): + volume = f'/var/opt/docker-engine/{app}/{volume}' + + directories[volume] = { + 'owner': user, + 'group': user, 'needed_by': { f'svc_systemd:docker-{app}', }, # don't do anything if the directory exists, docker images # mangle owners - 'unless': f'test -d /var/opt/docker-engine/{app}/{volume}', + 'unless': f'test -d {volume}', } From d2a70632828ae8724da2a4eeb4a6fff0da567f32 Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Sun, 16 Feb 2025 18:36:35 +0100 Subject: [PATCH 166/252] rottenraptor-server: add docker-goauthentik --- bundles/docker-goauthentik/metadata.py | 89 ++++++++++++++++++++++++++ nodes/rottenraptor-server.toml | 4 ++ 2 files changed, 93 insertions(+) create mode 100644 bundles/docker-goauthentik/metadata.py diff --git a/bundles/docker-goauthentik/metadata.py b/bundles/docker-goauthentik/metadata.py new file mode 100644 index 0000000..8cae899 --- /dev/null +++ b/bundles/docker-goauthentik/metadata.py @@ -0,0 +1,89 @@ +assert node.has_bundle('docker-engine') + +defaults = { + 'docker-engine': { + 'containers': { + 'goauthentik-server': { + 'image': 'ghcr.io/goauthentik/server:latest', + 'command': 'server', + 'environment': { + 'AUTHENTIK_POSTGRESQL__HOST': 'goauthentik-postgresql', + 'AUTHENTIK_POSTGRESQL__NAME': 'goauthentik', + 'AUTHENTIK_POSTGRESQL__PASSWORD': repo.vault.password_for(f'{node.name} postgresql goauthentik'), + 'AUTHENTIK_POSTGRESQL__USER': 'goauthentik', + 'AUTHENTIK_REDIS__HOST': 'goauthentik-redis', + 'AUTHENTIK_SECRET_KEY': repo.vault.password_for(f'{node.name} goauthentik secret key'), + }, + 'volumes': { + 'media': '/media', + 'templates': '/templates', + }, + 'ports': { + '9000': '9000', + '9443': '9443', + }, + 'needs': { + 'svc_systemd:docker-goauthentik-postgresql', + 'svc_systemd:docker-goauthentik-redis', + }, + 'requires': { + 'docker-goauthentik-postgresql.service', + 'docker-goauthentik-redis.service', + }, + }, + 'goauthentik-worker': { + 'image': 'ghcr.io/goauthentik/server:latest', + 'command': 'worker', + 'user': 'docker-goauthentik-server', + 'environment': { + 'AUTHENTIK_POSTGRESQL__HOST': 'goauthentik-postgresql', + 'AUTHENTIK_POSTGRESQL__NAME': 'goauthentik', + 'AUTHENTIK_POSTGRESQL__PASSWORD': repo.vault.password_for(f'{node.name} postgresql goauthentik'), + 'AUTHENTIK_POSTGRESQL__USER': 'goauthentik', + 'AUTHENTIK_REDIS__HOST': 'goauthentik-redis', + 'AUTHENTIK_SECRET_KEY': repo.vault.password_for(f'{node.name} goauthentik secret key'), + }, + 'volumes': { + '/var/opt/docker-engine/goauthentik-server/media': '/media', + '/var/opt/docker-engine/goauthentik-server/certs': '/certs', + '/var/opt/docker-engine/doauthentik-server/templates': '/templates', + }, + 'needs': { + 'svc_systemd:docker-goauthentik-postgresql', + 'svc_systemd:docker-goauthentik-redis', + }, + 'requires': { + 'docker-goauthentik-postgresql.service', + 'docker-goauthentik-redis.service', + }, + }, + 'goauthentik-postgresql': { + 'image': 'docker.io/library/postgres:16-alpine', + 'environment': { + 'POSTGRES_PASSWORD': repo.vault.password_for(f'{node.name} postgresql goauthentik'), + 'POSTGRES_USER': 'goauthentik', + 'POSTGRES_DB': 'goauthentik', + }, + 'volumes': { + 'database': '/var/lib/postgresql/data', + }, + }, + 'goauthentik-redis': { + 'image': 'docker.io/library/redis:alpine', + }, + }, + }, + 'nginx': { + 'vhosts': { + 'goauthentik': { + 'locations': { + '/': { + 'target': 'http://127.0.0.1:9000/', + 'websockets': True, + 'max_body_size': '5000m', + }, + }, + }, + }, + }, +} diff --git a/nodes/rottenraptor-server.toml b/nodes/rottenraptor-server.toml index 54a5fe1..407bb70 100644 --- a/nodes/rottenraptor-server.toml +++ b/nodes/rottenraptor-server.toml @@ -5,6 +5,7 @@ groups = [ ] bundles = [ "docker-engine", + "docker-goauthentik", "docker-immich", "ipmitool", "redis", @@ -27,6 +28,9 @@ gateway6 = "2001:67c:b54:1::1" redirect = "https://www.rottenraptor.com/" mode = 302 +[metadata.nginx.vhosts.goauthentik] +domain = "sso.rotten.city" + [metadata.nginx.vhosts.immich] domain = "immich.rotten.city" From 8db6c73f2564eb468582d043b87630cc9a97d575 Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Mon, 17 Feb 2025 09:54:47 +0100 Subject: [PATCH 167/252] home.nas: back up entire NAS --- nodes/home/nas.py | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/nodes/home/nas.py b/nodes/home/nas.py index a5b904d..831513a 100644 --- a/nodes/home/nas.py +++ b/nodes/home/nas.py @@ -61,14 +61,7 @@ nodes['home.nas'] = { }, 'backups': { 'paths': { - '/storage/nas/Audiobooks', - '/storage/nas/Bilder', - '/storage/nas/Bilder_Archiv', - '/storage/nas/Books', - '/storage/nas/Installer', - '/storage/nas/Musik', - '/storage/nas/Musikvideos', - '/storage/nas/normen', + '/storage/nas/', }, }, 'cron': { From 5bd406ae90b57e3989d0d42e865448c811e5c653 Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Mon, 17 Feb 2025 10:05:02 +0100 Subject: [PATCH 168/252] remove htz-hel.backup-kunsi --- nodes/htz-hel/backup-kunsi.py | 40 ----------------------------------- 1 file changed, 40 deletions(-) delete mode 100644 nodes/htz-hel/backup-kunsi.py diff --git a/nodes/htz-hel/backup-kunsi.py b/nodes/htz-hel/backup-kunsi.py deleted file mode 100644 index 50996fb..0000000 --- a/nodes/htz-hel/backup-kunsi.py +++ /dev/null @@ -1,40 +0,0 @@ -nodes['htz-hel.backup-kunsi'] = { - 'hostname': '2a01:4f9:6b:2d99::1337', - 'bundles': { - 'backup-server', - 'dm-crypt', - 'zfs', - }, - 'groups': { - 'debian-bullseye', - }, - 'metadata': { - 'apt': { - 'unattended-upgrades': { - # requires manual apply after reboot to unlock dm-crypt - # devices - 'reboot_enabled': False, - }, - }, - 'interfaces': { - 'ens18': { - 'ips': { - '2a01:4f9:6b:2d99::1337/64', - }, - 'gateway6': '2a01:4f9:6b:2d99::2', - }, - }, - 'backups': { - # This is the backup target. - 'exclude_from_backups': True, - }, - 'backup-server': { - 'encrypted-devices': { - '/dev/disk/by-id/scsi-0QEMU_QEMU_HARDDISK_drive-scsi1-part1': bwpass.password('bw/backup-kunsi/encryption-passphrase'), - }, - }, - 'zfs': { - 'scrub_when': 'Wed 08:00 Europe/Berlin', - }, - }, -} From 7808d9b0ea5c1d733bdb277ea91dd41eb29eda81 Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Mon, 17 Feb 2025 12:25:20 +0100 Subject: [PATCH 169/252] update travelynx to 2.10.0 --- nodes/carlene.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nodes/carlene.toml b/nodes/carlene.toml index d738e4b..2237fdf 100644 --- a/nodes/carlene.toml +++ b/nodes/carlene.toml @@ -250,7 +250,7 @@ disks = [ ] [metadata.travelynx] -version = "2.9.18" +version = "2.10.0" mail_from = "travelynx@franzi.business" domain = "travelynx.franzi.business" From 77003a01d8cd262cad6ac202982d6eea3e8291a2 Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Fri, 21 Feb 2025 19:24:10 +0100 Subject: [PATCH 170/252] rottenraptor-server: add vhost for dokuwiki --- .../files/extras/rottenraptor-server/dokuwiki | 33 +++++++++++++++++++ nodes/rottenraptor-server.toml | 17 ++++++++++ 2 files changed, 50 insertions(+) create mode 100644 data/nginx/files/extras/rottenraptor-server/dokuwiki diff --git a/data/nginx/files/extras/rottenraptor-server/dokuwiki b/data/nginx/files/extras/rottenraptor-server/dokuwiki new file mode 100644 index 0000000..2e9b682 --- /dev/null +++ b/data/nginx/files/extras/rottenraptor-server/dokuwiki @@ -0,0 +1,33 @@ + location ~ ^/lib.*\.(js|css|gif|png|ico|jpg|jpeg|svg)$ { + expires 365d; # browser caching + } + + location ~ /(install.php) { deny all; } + + location ~ /(\.ht|\.git|\.hg|\.svn|\.vs|data|conf|bin|inc|vendor|README|VERSION|SECURITY.md|COPYING|composer.json|composer.lock) { + #return 404; # https://www.dokuwiki.org/install:nginx?rev=1734102057#nginx_particulars + deny all; # Returns 403 + } + + # Support for X-Accel-Redirect + location ~ ^/data/ { + internal; + } + + location / { + try_files $uri $uri/ @dokuwiki; + + # This means; where $uri is 'path', if 'GET /path' doesnt exist, redirect + # client to 'GET /path/' directory. If neither, goto @dokuwiki rules. + } + + location @dokuwiki { + rewrite ^/_media/(.*) /lib/exe/fetch.php?media=$1 last; + rewrite ^/_detail/(.*) /lib/exe/detail.php?media=$1 last; + rewrite ^/_export/([^/]+)/(.*) /doku.php?do=export_$1&id=$2 last; +# rewrite ^/tag/(.*) /doku.php?id=tag:$1&do=showtag&tag=tag:$1 last; #untested + rewrite ^/(.*) /doku.php?id=$1&$args last; + + # rewrites "doku.php/" out of the URLs if you set the userewrite + # setting to .htaccess in dokuwiki config page + } diff --git a/nodes/rottenraptor-server.toml b/nodes/rottenraptor-server.toml index 407bb70..1af14fb 100644 --- a/nodes/rottenraptor-server.toml +++ b/nodes/rottenraptor-server.toml @@ -8,6 +8,7 @@ bundles = [ "docker-goauthentik", "docker-immich", "ipmitool", + "php", "redis", "smartd", "zfs", @@ -28,12 +29,24 @@ gateway6 = "2001:67c:b54:1::1" redirect = "https://www.rottenraptor.com/" mode = 302 +[metadata.nginx.vhosts.dokuwiki] +domain = "wiki.rotten.city" +php = true +extras = true +webroot_config.owner = "www-data" + [metadata.nginx.vhosts.goauthentik] domain = "sso.rotten.city" [metadata.nginx.vhosts.immich] domain = "immich.rotten.city" +[metadata.php] +version = "8.2" +packages = [ + "xml", +] + [metadata.smartd] disks = [ "/dev/disk/by-id/ata-HUH721008ALN600_7SGH125C", @@ -43,6 +56,10 @@ disks = [ "/dev/disk/by-id/nvme-TOSHIBA-RC100_58UPC29HPW5S", ] +[metadata.vm] +cpu = 4 +ram = 8 + [metadata.zfs.pools.tank.when_creating] ashift = 12 From a7cb759bd2d5cfcadc9ffb1e1df725a1d625ed4e Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Fri, 21 Feb 2025 19:29:35 +0100 Subject: [PATCH 171/252] bundles/docker-goauthentik: fix typo --- bundles/docker-goauthentik/metadata.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bundles/docker-goauthentik/metadata.py b/bundles/docker-goauthentik/metadata.py index 8cae899..9d742fa 100644 --- a/bundles/docker-goauthentik/metadata.py +++ b/bundles/docker-goauthentik/metadata.py @@ -46,7 +46,7 @@ defaults = { 'volumes': { '/var/opt/docker-engine/goauthentik-server/media': '/media', '/var/opt/docker-engine/goauthentik-server/certs': '/certs', - '/var/opt/docker-engine/doauthentik-server/templates': '/templates', + '/var/opt/docker-engine/goauthentik-server/templates': '/templates', }, 'needs': { 'svc_systemd:docker-goauthentik-postgresql', From 349aaac56db74d251bcdaea75d5f6142119979db Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Sun, 23 Feb 2025 11:01:16 +0100 Subject: [PATCH 172/252] data/ssl: bump *.home.kunbox.net --- data/ssl/_.home.kunbox.net.crt.pem | 36 +++++++++---------- .../_.home.kunbox.net.crt_intermediate.pem | 36 +++++++++---------- data/ssl/_.home.kunbox.net.key.pem.vault | 2 +- 3 files changed, 37 insertions(+), 37 deletions(-) diff --git a/data/ssl/_.home.kunbox.net.crt.pem b/data/ssl/_.home.kunbox.net.crt.pem index 06ea249..4fb984a 100644 --- a/data/ssl/_.home.kunbox.net.crt.pem +++ b/data/ssl/_.home.kunbox.net.crt.pem @@ -1,22 +1,22 @@ -----BEGIN CERTIFICATE----- -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 -----END CERTIFICATE----- diff --git a/data/ssl/_.home.kunbox.net.crt_intermediate.pem b/data/ssl/_.home.kunbox.net.crt_intermediate.pem index 4652201..59039ae 100644 --- a/data/ssl/_.home.kunbox.net.crt_intermediate.pem +++ b/data/ssl/_.home.kunbox.net.crt_intermediate.pem @@ -1,27 +1,27 @@ -----BEGIN CERTIFICATE----- -MIIEVzCCAj+gAwIBAgIRALBXPpFzlydw27SHyzpFKzgwDQYJKoZIhvcNAQELBQAw +MIIEVzCCAj+gAwIBAgIRAIOPbGPOsTmMYgZigxXJ/d4wDQYJKoZIhvcNAQELBQAw TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMjQwMzEzMDAwMDAw WhcNMjcwMzEyMjM1OTU5WjAyMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNTGV0J3Mg -RW5jcnlwdDELMAkGA1UEAxMCRTYwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAATZ8Z5G -h/ghcWCoJuuj+rnq2h25EqfUJtlRFLFhfHWWvyILOR/VvtEKRqotPEoJhC6+QJVV -6RlAN2Z17TJOdwRJ+HB7wxjnzvdxEP6sdNgA1O1tHHMWMxCcOrLqbGL0vbijgfgw +RW5jcnlwdDELMAkGA1UEAxMCRTUwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQNCzqK +a2GOtu/cX1jnxkJFVKtj9mZhSAouWXW0gQI3ULc/FnncmOyhKJdyIBwsz9V8UiBO +VHhbhBRrwJCuhezAUUE8Wod/Bk3U/mDR+mwt4X2VEIiiCFQPmRpM5uoKrNijgfgw gfUwDgYDVR0PAQH/BAQDAgGGMB0GA1UdJQQWMBQGCCsGAQUFBwMCBggrBgEFBQcD -ATASBgNVHRMBAf8ECDAGAQH/AgEAMB0GA1UdDgQWBBSTJ0aYA6lRaI6Y1sRCSNsj -v1iU0jAfBgNVHSMEGDAWgBR5tFnme7bl5AFzgAiIyBpY9umbbjAyBggrBgEFBQcB +ATASBgNVHRMBAf8ECDAGAQH/AgEAMB0GA1UdDgQWBBSfK1/PPCFPnQS37SssxMZw +i9LXDTAfBgNVHSMEGDAWgBR5tFnme7bl5AFzgAiIyBpY9umbbjAyBggrBgEFBQcB AQQmMCQwIgYIKwYBBQUHMAKGFmh0dHA6Ly94MS5pLmxlbmNyLm9yZy8wEwYDVR0g BAwwCjAIBgZngQwBAgEwJwYDVR0fBCAwHjAcoBqgGIYWaHR0cDovL3gxLmMubGVu -Y3Iub3JnLzANBgkqhkiG9w0BAQsFAAOCAgEAfYt7SiA1sgWGCIpunk46r4AExIRc -MxkKgUhNlrrv1B21hOaXN/5miE+LOTbrcmU/M9yvC6MVY730GNFoL8IhJ8j8vrOL -pMY22OP6baS1k9YMrtDTlwJHoGby04ThTUeBDksS9RiuHvicZqBedQdIF65pZuhp -eDcGBcLiYasQr/EO5gxxtLyTmgsHSOVSBcFOn9lgv7LECPq9i7mfH3mpxgrRKSxH -pOoZ0KXMcB+hHuvlklHntvcI0mMMQ0mhYj6qtMFStkF1RpCG3IPdIwpVCQqu8GV7 -s8ubknRzs+3C/Bm19RFOoiPpDkwvyNfvmQ14XkyqqKK5oZ8zhD32kFRQkxa8uZSu -h4aTImFxknu39waBxIRXE4jKxlAmQc4QjFZoq1KmQqQg0J/1JF8RlFvJas1VcjLv -YlvUB2t6npO6oQjB3l+PNf0DpQH7iUx3Wz5AjQCi6L25FjyE06q6BZ/QlmtYdl/8 -ZYao4SRqPEs/6cAiF+Qf5zg2UkaWtDphl1LKMuTNLotvsX99HP69V2faNyegodQ0 -LyTApr/vT01YPE46vNsDLgK+4cL6TrzC/a4WcmF5SRJ938zrv/duJHLXQIku5v0+ -EwOy59Hdm0PT/Er/84dDV0CSjdR/2XuZM3kpysSKLgD1cKiDA+IRguODCxfO9cyY -Ig46v9mFmBvyH04= +Y3Iub3JnLzANBgkqhkiG9w0BAQsFAAOCAgEAH3KdNEVCQdqk0LKyuNImTKdRJY1C +2uw2SJajuhqkyGPY8C+zzsufZ+mgnhnq1A2KVQOSykOEnUbx1cy637rBAihx97r+ +bcwbZM6sTDIaEriR/PLk6LKs9Be0uoVxgOKDcpG9svD33J+G9Lcfv1K9luDmSTgG +6XNFIN5vfI5gs/lMPyojEMdIzK9blcl2/1vKxO8WGCcjvsQ1nJ/Pwt8LQZBfOFyV +XP8ubAp/au3dc4EKWG9MO5zcx1qT9+NXRGdVWxGvmBFRAajciMfXME1ZuGmk3/GO +koAM7ZkjZmleyokP1LGzmfJcUd9s7eeu1/9/eg5XlXd/55GtYjAM+C4DG5i7eaNq +cm2F+yxYIPt6cbbtYVNJCGfHWqHEQ4FYStUyFnv8sjyqU8ypgZaNJ9aVcWSICLOI +E1/Qv/7oKsnZCWJ926wU6RqG1OYPGOi1zuABhLw61cuPVDT28nQS/e6z95cJXq0e +K1BcaJ6fJZsmbjRgD5p3mvEf5vdQM7MCEvU0tHbsx2I5mHHJoABHb8KVBgWp/lcX +GWiWaeOyB7RP+OfDtvi2OsapxXiV7vNVs7fMlrRjY1joKaqmmycnBvAq14AEbtyL +sVfOS66B8apkeFX2NY4XPEYV4ZSCe8VHPrdrERk2wILG3T/EGmSIkCYVUMSnjmJd +VQD9F6Na/+zmXCc= -----END CERTIFICATE----- diff --git a/data/ssl/_.home.kunbox.net.key.pem.vault b/data/ssl/_.home.kunbox.net.key.pem.vault index f5fa8b4..e17988a 100644 --- a/data/ssl/_.home.kunbox.net.key.pem.vault +++ b/data/ssl/_.home.kunbox.net.key.pem.vault @@ -1 +1 @@ -encrypt$gAAAAABnSurPS00unDJP1C7wyToyZOzKrEruyT6itqZG1Bbv6IZPVrkdcbgyfPrXY8ViPSRwtdVJsju-X8pvLHZGSHXvxhpNlNrNQTas2_VCMwYIihGnp7VI6ovQXd_iVHON5sXaNpKURRwCsvnYhHQfn4qPGLSN8II2QdpJ4A4nDschZwN2u-8X9omGPOcC6zeivoew4UcpossYuJDskHeJnRnR3roGwrHuPWfEKRgRJ_eTHgij00uyoJZxhWGRV9nS_MnacbGUP6KBXfaZP_23DFJPMMq734qVfcLObhYa8nam9kLHh4TaloET2pK-IVqcb_FOorWiipiGBSNCw9EQr57d8AOLEFAwMmb_1fgPCjpchVZaSKD4OhdjPt1CU3unzR-zPkrjBdL-az0ci984vJnLolr4z8nMW6oR1SyJGyccJ-lmoMf34M3oI3zIlNg2GPdGcZMFa6GhvmLYwDb7r0PHil_GRA== \ No newline at end of file +encrypt$gAAAAABnuvHlF1U1dT-xIICT5GmDxxqm0hQAgshQSA46WrVoo18ypjyxQE1qRzPNdp0xHKPYwpGmAoT7ftX7U3X3sjIvH8W5DUNMEBPZk6Z2yPxsyMDqUbxqJUOkjsSjVf1GZ_n3R5kZfb-THJMjNQMy3tL5RwrSvZjsYeYT-NwBle5rUKZpgE_6sDr5jSr8xpNx87gJr1vqgnZIBPllU47CJQy7LHEsVcCvbKhpVoau02LlPAoApVt_iYYm1fL_E6jFGfnCwGoeiytMc2fl1DPWS8q8oauQ1pNVTWQ2BXnLiXoc8u3hgp93PpT2LubYgIrVXpY8iErNtghuXi_HmqL37btdN5h-p1Div-R_5uva1maXffduwutCd5xWJK__G_bhqiSoEaKEMvo_H47vqbi7Hvwi70ckYek9KD_bIb2W8zBEPl1Q2436Uz54B0muXv6X7OoZlTj51_gZUcT3cp8SDJqAWDpnWg== \ No newline at end of file From 5752ad3f0994e1ea8dd9ca6bee8d773b4c83191a Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Sun, 23 Feb 2025 11:07:59 +0100 Subject: [PATCH 173/252] rottenraptor-server: remove redis this runs in docker now --- nodes/rottenraptor-server.toml | 1 - 1 file changed, 1 deletion(-) diff --git a/nodes/rottenraptor-server.toml b/nodes/rottenraptor-server.toml index 1af14fb..e88891a 100644 --- a/nodes/rottenraptor-server.toml +++ b/nodes/rottenraptor-server.toml @@ -9,7 +9,6 @@ bundles = [ "docker-immich", "ipmitool", "php", - "redis", "smartd", "zfs", ] From a54dceb3c6f7c0a1526bc9bd0c7329e3c96b3c88 Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Sun, 23 Feb 2025 11:37:29 +0100 Subject: [PATCH 174/252] bundles/radvd: better options for changing prefixes --- bundles/radvd/files/radvd.conf | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/bundles/radvd/files/radvd.conf b/bundles/radvd/files/radvd.conf index c66c08f..ee40111 100644 --- a/bundles/radvd/files/radvd.conf +++ b/bundles/radvd/files/radvd.conf @@ -10,11 +10,13 @@ interface ${interface} AdvOnLink on; AdvAutonomous on; AdvRouterAddr on; + AdvPreferredLifetime 600; + AdvValidLifetime 900; }; % if config.get('rdnss'): RDNSS ${' '.join(sorted(config['rdnss']))} { - AdvRDNSSLifetime 900; + AdvRDNSSLifetime 600; }; % endif }; From fab81145caceeda6c0b815d3e21dbb993f46ee9a Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Sun, 23 Feb 2025 11:40:47 +0100 Subject: [PATCH 175/252] update netbox to 4.2.4 --- nodes/carlene.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nodes/carlene.toml b/nodes/carlene.toml index 2237fdf..6509140 100644 --- a/nodes/carlene.toml +++ b/nodes/carlene.toml @@ -114,7 +114,7 @@ domain = "rss.franzi.business" [metadata.netbox] domain = "netbox.franzi.business" -version = "v4.2.3" +version = "v4.2.4" admins.kunsi = "hostmaster@kunbox.net" [metadata.nextcloud] From fed5cbfc5228104d45c2b4f9aa6a1b75470e974b Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Sun, 23 Feb 2025 12:08:14 +0100 Subject: [PATCH 176/252] bundles/php: remove sury repo, use debian php version --- bundles/icinga2/metadata.py | 1 - bundles/nginx/items.py | 2 +- bundles/php/items.py | 2 +- bundles/php/metadata.py | 17 +++++++------ data/apt/files/gpg-keys/php.asc | 42 --------------------------------- nodes/carlene.toml | 1 - nodes/htz-cloud/pirmasens.py | 2 -- nodes/rottenraptor-server.toml | 1 - 8 files changed, 10 insertions(+), 58 deletions(-) delete mode 100644 data/apt/files/gpg-keys/php.asc diff --git a/bundles/icinga2/metadata.py b/bundles/icinga2/metadata.py index 60d28fe..c25ca41 100644 --- a/bundles/icinga2/metadata.py +++ b/bundles/icinga2/metadata.py @@ -54,7 +54,6 @@ defaults = { 'setup-token': repo.vault.password_for(f'{node.name} icingaweb2 setup-token'), }, 'php': { - 'version': '8.2', 'packages': { 'curl', 'gd', diff --git a/bundles/nginx/items.py b/bundles/nginx/items.py index 2928686..304dcd7 100644 --- a/bundles/nginx/items.py +++ b/bundles/nginx/items.py @@ -104,7 +104,7 @@ for vhost, config in node.metadata.get('nginx/vhosts', {}).items(): 'context': { 'create_logs': config.get('create_logs', False), 'create_timing_log': config.get('timing_log', True), - 'php_version': node.metadata.get('php/version', ''), + 'php_version': node.metadata.get('php/__version', ''), 'security_txt': security_txt_enabled, 'vhost': vhost, **config, diff --git a/bundles/php/items.py b/bundles/php/items.py index b115c19..c836efa 100644 --- a/bundles/php/items.py +++ b/bundles/php/items.py @@ -1,4 +1,4 @@ -version = node.metadata.get('php/version') +version = node.metadata.get('php/__version') directories['/var/lib/php/sessions'] = { 'owner': 'www-data', diff --git a/bundles/php/metadata.py b/bundles/php/metadata.py index d14954e..edb8399 100644 --- a/bundles/php/metadata.py +++ b/bundles/php/metadata.py @@ -1,12 +1,11 @@ +OS_PHP_VERSION = { + 12: '8.2', + 13: '8.4', +} + defaults = { - 'apt': { - 'repos': { - 'php': { - 'items': { - 'deb https://packages.sury.org/php/ {os_release} main', - }, - }, - }, + 'php': { + '__version': OS_PHP_VERSION[node.os_version[0]], }, } @@ -15,7 +14,7 @@ defaults = { 'apt/packages', ) def php_packages_with_features(metadata): - version = metadata.get('php/version') + version = metadata.get('php/__version') packages = { f'php{version}': {}, diff --git a/data/apt/files/gpg-keys/php.asc b/data/apt/files/gpg-keys/php.asc deleted file mode 100644 index ba04e3c..0000000 --- a/data/apt/files/gpg-keys/php.asc +++ /dev/null @@ -1,42 +0,0 @@ ------BEGIN PGP ARMORED FILE----- -Comment: Use "gpg --dearmor" for unpacking - -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 -=gNGr ------END PGP ARMORED FILE----- diff --git a/nodes/carlene.toml b/nodes/carlene.toml index 6509140..a455063 100644 --- a/nodes/carlene.toml +++ b/nodes/carlene.toml @@ -176,7 +176,6 @@ ratelimit-exempt-hosts = [ ] [metadata.php] -version = "8.2" packages = [ 'gd', 'imagick', diff --git a/nodes/htz-cloud/pirmasens.py b/nodes/htz-cloud/pirmasens.py index 655f325..908e85e 100644 --- a/nodes/htz-cloud/pirmasens.py +++ b/nodes/htz-cloud/pirmasens.py @@ -52,12 +52,10 @@ nodes['htz-cloud.pirmasens'] = { }, }, 'php': { - 'version': '7.4', 'packages': { 'gd', 'imap', 'intl', - 'json', 'mbstring', 'opcache', 'pgsql', diff --git a/nodes/rottenraptor-server.toml b/nodes/rottenraptor-server.toml index e88891a..96eb5fb 100644 --- a/nodes/rottenraptor-server.toml +++ b/nodes/rottenraptor-server.toml @@ -41,7 +41,6 @@ domain = "sso.rotten.city" domain = "immich.rotten.city" [metadata.php] -version = "8.2" packages = [ "xml", ] From 9edf9111a1283c685a425c0ba7bfa67f269cd49b Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Sun, 23 Feb 2025 13:16:52 +0100 Subject: [PATCH 177/252] bundles/docker-engine: exit "start" action early if container is running this happens on daemon restarts --- bundles/docker-engine/files/docker-wrapper | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/bundles/docker-engine/files/docker-wrapper b/bundles/docker-engine/files/docker-wrapper index 97c0d37..fe2a010 100644 --- a/bundles/docker-engine/files/docker-wrapper +++ b/bundles/docker-engine/files/docker-wrapper @@ -17,7 +17,12 @@ PGID="$(id -g "${user}")" if [ "$ACTION" == "start" ] then - docker rm "${name}" || true + # just exit if the container is actually running already. + set +e + /usr/local/share/icinga/plugins/check_docker_container "${name}" && exit 0 + set -e + + docker rm "${name}" || true docker run -d \ --name "${name}" \ From ff2be8d58d55e299e3fa6208631121c834acd4bd Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Sun, 23 Feb 2025 13:17:54 +0100 Subject: [PATCH 178/252] bundles/docker-immich: add album-auto-share script --- .../files/immich-auto-album-share.py | 80 +++++++++++++++++++ bundles/docker-immich/items.py | 3 + bundles/docker-immich/metadata.py | 28 +++++++ nodes/rottenraptor-server.toml | 3 + 4 files changed, 114 insertions(+) create mode 100644 bundles/docker-immich/files/immich-auto-album-share.py create mode 100644 bundles/docker-immich/items.py diff --git a/bundles/docker-immich/files/immich-auto-album-share.py b/bundles/docker-immich/files/immich-auto-album-share.py new file mode 100644 index 0000000..863f8b2 --- /dev/null +++ b/bundles/docker-immich/files/immich-auto-album-share.py @@ -0,0 +1,80 @@ +#!/usr/bin/env python3 + +from json import loads +from os import environ +from subprocess import check_output +from sys import exit + +import psycopg2 + +PSQL_HOST = environ['DB_HOSTNAME'] +PSQL_USER = environ['DB_USERNAME'] +PSQL_PASS = environ['DB_PASSWORD'] +PSQL_DB = environ['DB_DATABASE_NAME'] + +docker_networks = loads(check_output(['docker', 'network', 'inspect', 'aaarghhh'])) + +container_ip = None +# why the fuck is this a list of networks, even though we have to provide +# a network name to inspect ... +for network in docker_networks: + if network['Name'] != 'aaarghhh': + continue + + for _, container in network['Containers'].items(): + if container['Name'] == PSQL_HOST: + container_ip = container['IPv4Address'].split('/')[0] + +if not container_ip: + print(f'could not find ip address for container {PSQL_HOST=} in json') + print(docker_networks) + exit(1) + +print(f'{PSQL_HOST=} {container_ip=}') + +conn = psycopg2.connect( + dbname=PSQL_DB, + host=container_ip, + password=PSQL_PASS, + user=PSQL_USER, +) + +with conn: + with conn.cursor() as cur: + cur.execute('SELECT "id","ownerId","albumName" FROM albums;') + albums = { + i[0]: { + 'owner': i[1], + 'name': i[2], + } + for i in cur.fetchall() + } + + with conn.cursor() as cur: + cur.execute('SELECT "id","name" FROM users;') + users = { + i[0]: i[1] + for i in cur.fetchall() + } + +for album_id, album in albums.items(): + print(f'----- working on album: {album["name"]}') + with conn: + with conn.cursor() as cur: + cur.execute('SELECT "usersId" FROM albums_shared_users_users WHERE "albumsId" = %s;', (album_id,)) + album_shares = [i[0] for i in cur.fetchall()] + print(f' album is shared with {len(album_shares)} users: {album_shares}') + for user_id, user_name in users.items(): + if user_id == album['owner'] or user_id in album_shares: + continue + + print(f' sharing album with user {user_name} ... ', end='') + with conn.cursor() as cur: + cur.execute( + 'INSERT INTO albums_shared_users_users ("albumsId","usersId","role") VALUES (%s, %s, %s);', + (album_id, user_id, 'viewer'), + ) + print('done') + print() + +conn.close() diff --git a/bundles/docker-immich/items.py b/bundles/docker-immich/items.py new file mode 100644 index 0000000..8c9d54e --- /dev/null +++ b/bundles/docker-immich/items.py @@ -0,0 +1,3 @@ +files['/usr/local/bin/immich-auto-album-share.py'] = { + 'mode': '0755', +} diff --git a/bundles/docker-immich/metadata.py b/bundles/docker-immich/metadata.py index 5b73f70..288b7f1 100644 --- a/bundles/docker-immich/metadata.py +++ b/bundles/docker-immich/metadata.py @@ -1,6 +1,11 @@ assert node.has_bundle('docker-engine') defaults = { + 'apt': { + 'packages': { + 'python3-psycopg2': {}, + }, + }, 'docker-engine': { 'containers': { 'immich': { @@ -45,6 +50,9 @@ defaults = { }, }, }, + 'docker-immich': { + 'enable_auto_album_share': False, + }, 'nginx': { 'vhosts': { 'immich': { @@ -59,3 +67,23 @@ defaults = { }, }, } + + +@metadata_reactor.provides( + 'systemd-timers/timers/immich-auto-album-share', +) +def auto_album_share(metadata): + if not metadata.get('docker-immich/enable_auto_album_share'): + return {} + + return { + 'systemd-timers': { + 'timers': { + 'immich-auto-album-share': { + 'command': '/usr/local/bin/immich-auto-album-share.py', + 'environment': metadata.get('docker-engine/containers/immich/environment'), + 'when': 'minutely', + }, + }, + }, + } diff --git a/nodes/rottenraptor-server.toml b/nodes/rottenraptor-server.toml index 96eb5fb..2ab03f8 100644 --- a/nodes/rottenraptor-server.toml +++ b/nodes/rottenraptor-server.toml @@ -13,6 +13,9 @@ bundles = [ "zfs", ] +[metadata.docker-immich] +enable_auto_album_share = true + [metadata.icinga_options] period = "daytime" From 02320e2488503b201a2774b6fa0bc1b202b43299 Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Sat, 1 Mar 2025 12:56:21 +0100 Subject: [PATCH 179/252] add boilerplate prometheus node --- nodes/htz-cloud.prometheus.toml | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 nodes/htz-cloud.prometheus.toml diff --git a/nodes/htz-cloud.prometheus.toml b/nodes/htz-cloud.prometheus.toml new file mode 100644 index 0000000..6532493 --- /dev/null +++ b/nodes/htz-cloud.prometheus.toml @@ -0,0 +1,7 @@ +hostname = "138.199.210.112" +groups = ["debian-bookworm"] + +[metadata.interfaces.eth0] +ips = ["138.199.210.112/32", "2a01:4f8:1c1e:65e4::1/64"] +gateway4 = "172.31.1.1" +gateway6 = "fe80::1" From a60156f9ff859655702e3aa6d7981fff1ef669b1 Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Sat, 1 Mar 2025 12:56:56 +0100 Subject: [PATCH 180/252] voc.infobeamer-cms: WICMP25 --- nodes/voc/infobeamer-cms.py | 28 +++++++++++++--------------- 1 file changed, 13 insertions(+), 15 deletions(-) diff --git a/nodes/voc/infobeamer-cms.py b/nodes/voc/infobeamer-cms.py index 043c7a5..55949e2 100644 --- a/nodes/voc/infobeamer-cms.py +++ b/nodes/voc/infobeamer-cms.py @@ -25,17 +25,15 @@ nodes['voc.infobeamer-cms'] = { }, 'infobeamer-cms': { 'domain': 'infobeamer.c3voc.de', - 'event_start_date': '2024-12-26', - 'event_duration_days': 5, + 'event_start_date': '2025-02-28', + 'event_duration_days': 3, 'config': { 'ADMIN_USERS': [], - 'NO_LIMIT_USERS': [ - 'github:stblassitude', - ], + 'NO_LIMIT_USERS': [], 'HOSTED_API_KEY': vault.decrypt('encrypt$gAAAAABhxJPH2sIGMAibU2Us1HoCVlNfF0SQQnVl0eiod48Zu8webL_-xk3wDw3yXw1Hkglj-2usl-D3Yd095yTSq0vZMCv2fh-JWwSPdJewQ45x9Ai4vXVD4CNz5vuJBESKS9xQWXTc'), 'INTERRUPT_KEY': vault.human_password_for('infobeamer-cms interrupt key 38c3', words=1), 'SETUP_IDS': [ - 255228, + 258552, ], # 'EXTRA_ASSETS': [{ # 'type': "image", @@ -64,21 +62,21 @@ nodes['voc.infobeamer-cms'] = { or #info-beamer on the cccv rocketchat instance. '''.strip(), }, - 'DEFAULT_SSO_PROVIDER': 'c3hub', + 'DEFAULT_SSO_PROVIDER': 'github', 'DEFAULT_ADMIN_SSO_PROVIDER': 'c3voc', 'oauth2_providers': { - #'github': { - # 'client_id': vault.decrypt('encrypt$gAAAAABiNwHfIu9PYFfJrF7qirn_9vdvvUlEhJnadoNSS5XlCDbI_aMyj21_ZYQxaCkc6_eVX6Cj1jEHZ7Vs6wM-XyQdW0nUOahtqG4uvnYCiM3GFKHW_wQ='), - # 'client_secret': vault.decrypt('encrypt$gAAAAABiNwHtdZC2XQ8IjosL7vsmrxZMwDIM6AD5dUlLo996tJs4qV7KJETHgYYZil2aMzClwhcE6JmxdhARRp7IJQ4rQQibelTNmyYSzj_V4puVpvma7SU0UZkTIG95SdPpoHY--Zba'), - #}, + 'github': { + 'client_id': vault.decrypt('encrypt$gAAAAABiNwHfIu9PYFfJrF7qirn_9vdvvUlEhJnadoNSS5XlCDbI_aMyj21_ZYQxaCkc6_eVX6Cj1jEHZ7Vs6wM-XyQdW0nUOahtqG4uvnYCiM3GFKHW_wQ='), + 'client_secret': vault.decrypt('encrypt$gAAAAABiNwHtdZC2XQ8IjosL7vsmrxZMwDIM6AD5dUlLo996tJs4qV7KJETHgYYZil2aMzClwhcE6JmxdhARRp7IJQ4rQQibelTNmyYSzj_V4puVpvma7SU0UZkTIG95SdPpoHY--Zba'), + }, 'c3voc': { 'client_id': 'uqzN2mYeMq4vxnHL6HNmBC80hsvYcfhzniiczdqV', 'client_secret': vault.decrypt('encrypt$gAAAAABnaZ0z-hQ3yYf8P1g4gyLLvNHcNkiXVtIq7M11qswbzcVM4upfgtxCWBlCgwLN3v7CxwDFQbJnosEq0hbX4c0TEoOausV4upJD0-5zP_1U18gbMGicpZ0TCzYyEhOqvCye7UmFOWzOmplSX1fz43Pf7peDeaPxHjqmxjw0khyExzWw4JPOd1V7LhnesJmPCfGKXn5YHMDicrdYeqFf0FySN1yA5gfLNo7y-S1QMJ6-n6Jct7uuifF9t2OV-zyOj3cKK13B'), }, - 'c3hub': { - 'client_id': '16oHBcVstcOKwt3EuX9E2urpYeVC0Dfo3Gzn2XhS', - 'client_secret': vault.decrypt('encrypt$gAAAAABnaoRKbORUcceyKu3tda3lgMIFC-e0cG0AeMdDYJ--EnTRxp8QcULOTf2oBtKQUk17hgwfsafTFi4eZq1FrjNgq1h5gm83oJYWLQ6pp8Rsp9kjwgtAXf72jIU-AOQxx02SoFMU8r5pdEFEX4FkU_ksbU6s7xgBW8oxq_WO2CXAppTUX61TeB9me2nSLFdJc5-v6RDpQfDvVAm7yNS_PhMvMgVzfEZrFM-EWF_bl0S_q0ejf88o9zaXHIMJpzMruVZOXD0T'), - }, + #'c3hub': { + # 'client_id': '16oHBcVstcOKwt3EuX9E2urpYeVC0Dfo3Gzn2XhS', + # 'client_secret': vault.decrypt('encrypt$gAAAAABnaoRKbORUcceyKu3tda3lgMIFC-e0cG0AeMdDYJ--EnTRxp8QcULOTf2oBtKQUk17hgwfsafTFi4eZq1FrjNgq1h5gm83oJYWLQ6pp8Rsp9kjwgtAXf72jIU-AOQxx02SoFMU8r5pdEFEX4FkU_ksbU6s7xgBW8oxq_WO2CXAppTUX61TeB9me2nSLFdJc5-v6RDpQfDvVAm7yNS_PhMvMgVzfEZrFM-EWF_bl0S_q0ejf88o9zaXHIMJpzMruVZOXD0T'), + #}, }, }, 'rooms': { From d40efd219210b3e5cd4be33f00471d0698dd2f04 Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Sun, 2 Mar 2025 17:44:25 +0100 Subject: [PATCH 181/252] bundles/icinga2: add monitoring for ipmi interfaces --- .../icinga2/files/icinga2/hosts_template.conf | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/bundles/icinga2/files/icinga2/hosts_template.conf b/bundles/icinga2/files/icinga2/hosts_template.conf index 631fc8a..c28d8e4 100644 --- a/bundles/icinga2/files/icinga2/hosts_template.conf +++ b/bundles/icinga2/files/icinga2/hosts_template.conf @@ -23,6 +23,25 @@ object Host "${rnode.name}" { vars.notification.mail = true } +% if rnode._attributes.get('ipmi'): +object Host "IPMI ${rnode.name}" { + import "generic-host" + + address = "${rnode._attributes['ipmi']['hostname']}" + + vars.location = "${rnode.metadata.get('location', 'unknown')}" + vars.os = "ipmi" + + vars.pretty_name = "IPMI ${rnode.metadata.get('icinga_options/pretty_name', rnode.metadata.get('hostname'))}" + vars.show_on_statuspage = false + + vars.period = "${rnode.metadata.get('icinga_options/period', '24x7')}" + + vars.notification.sms = ${str(rnode.metadata.get('icinga_options/vars.notification.sms', True)).lower()} + vars.notification.mail = true +} +% endif + % for depends_on_host in sorted(rnode.metadata.get('icinga_options/also_affected_by', set())): object Dependency "${rnode.name}_depends_on_${depends_on_host}" { parent_host_name = "${depends_on_host}" From 8135e4160f6bb2853781a3c3d000c608c66132a4 Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Sun, 2 Mar 2025 17:44:50 +0100 Subject: [PATCH 182/252] nodes.py: add demagify for ipmi data --- nodes.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/nodes.py b/nodes.py index f47f004..1798613 100644 --- a/nodes.py +++ b/nodes.py @@ -12,6 +12,8 @@ for name, data in nodes.items(): if 'password' in data: data['password'] = vault.decrypt(data['password']) + if 'ipmi' in data: + data['ipmi'].update(libs.demagify.demagify(data['ipmi'], vault)) data['metadata'].update(libs.demagify.demagify(data['metadata'], vault)) for node in Path(join(repo_path, "nodes")).rglob("*.py"): From 7a5ca524b43831659b636f9001ef7b8d26a194a2 Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Sun, 2 Mar 2025 17:49:30 +0100 Subject: [PATCH 183/252] add ipmi information to hosts which have ipmi --- nodes/home.r630-ipmi.toml | 6 ------ nodes/home.r630.toml | 6 ++++++ nodes/proxmox-backupstorage.toml | 6 ++++++ nodes/rottenraptor-server-ipmi.toml | 7 ------- nodes/rottenraptor-server.toml | 6 ++++++ 5 files changed, 18 insertions(+), 13 deletions(-) delete mode 100644 nodes/home.r630-ipmi.toml delete mode 100644 nodes/rottenraptor-server-ipmi.toml diff --git a/nodes/home.r630-ipmi.toml b/nodes/home.r630-ipmi.toml deleted file mode 100644 index f58012b..0000000 --- a/nodes/home.r630-ipmi.toml +++ /dev/null @@ -1,6 +0,0 @@ -dummy = true - -[metadata.interfaces.eth0] -ips = ["172.19.138.23"] -dhcp = true -mac = "50:9a:4c:ad:f9:c4" diff --git a/nodes/home.r630.toml b/nodes/home.r630.toml index 408afb4..ffd4c46 100644 --- a/nodes/home.r630.toml +++ b/nodes/home.r630.toml @@ -2,6 +2,12 @@ hostname = "172.19.138.22" groups = ["debian-bookworm"] bundles = ["docker-engine", "nginx", "redis"] +#[ipmi] +#hostname = "172.19.138.23" +#username = "root" +#password = "calvin" +#interface = "lanplus" + [metadata] icinga_options.exclude_from_monitoring = true backups.exclude_from_backups = true diff --git a/nodes/proxmox-backupstorage.toml b/nodes/proxmox-backupstorage.toml index 7d58297..8a9da36 100644 --- a/nodes/proxmox-backupstorage.toml +++ b/nodes/proxmox-backupstorage.toml @@ -1,6 +1,12 @@ hostname = "192.168.100.31" dummy = true +#[ipmi] +#hostname = "192.168.100.30" +#username = "root" +#password = "!bwpass:192.168.100.30/root" +#interface = "lanplus" + [metadata.icinga2_api.smartd.services."SMART STATUS CT480BX500SSD1_2314E6C5C695"] check_command = "sshmon" "vars.sshmon_command" = "CT480BX500SSD1_2314E6C5C695" diff --git a/nodes/rottenraptor-server-ipmi.toml b/nodes/rottenraptor-server-ipmi.toml deleted file mode 100644 index fdc76b9..0000000 --- a/nodes/rottenraptor-server-ipmi.toml +++ /dev/null @@ -1,7 +0,0 @@ -dummy = true - -[metadata.icinga_options] -period = "daytime" - -[metadata.interfaces.default] -ips = ["192.168.100.27/24"] diff --git a/nodes/rottenraptor-server.toml b/nodes/rottenraptor-server.toml index 2ab03f8..529984a 100644 --- a/nodes/rottenraptor-server.toml +++ b/nodes/rottenraptor-server.toml @@ -13,6 +13,12 @@ bundles = [ "zfs", ] +#[ipmi] +#hostname = "192.168.100.27" +#username = "Administrator" +#password = "!bwpass:bw/rottenraptor-server/ipmi" +#interface = "lanplus" + [metadata.docker-immich] enable_auto_album_share = true From e9e25f8a1ea074788180448201f5ade1ccef1343 Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Sun, 2 Mar 2025 19:01:23 +0100 Subject: [PATCH 184/252] bundles/docker-engine: pull image before starting it --- bundles/docker-engine/files/docker-wrapper | 2 ++ 1 file changed, 2 insertions(+) diff --git a/bundles/docker-engine/files/docker-wrapper b/bundles/docker-engine/files/docker-wrapper index fe2a010..2821d29 100644 --- a/bundles/docker-engine/files/docker-wrapper +++ b/bundles/docker-engine/files/docker-wrapper @@ -24,6 +24,8 @@ then docker rm "${name}" || true + docker pull "${image}" + docker run -d \ --name "${name}" \ --env "PUID=$PUID" \ From c0a436385df7b8e087120323ced5899cc576f8d6 Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Wed, 5 Mar 2025 21:26:35 +0100 Subject: [PATCH 185/252] update travelynx to 2.10.2 --- nodes/carlene.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nodes/carlene.toml b/nodes/carlene.toml index a455063..d936789 100644 --- a/nodes/carlene.toml +++ b/nodes/carlene.toml @@ -249,7 +249,7 @@ disks = [ ] [metadata.travelynx] -version = "2.10.0" +version = "2.10.2" mail_from = "travelynx@franzi.business" domain = "travelynx.franzi.business" From 4c6abb65eefa0484b154988e894cfb88dfb7d38f Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Thu, 6 Mar 2025 20:03:37 +0100 Subject: [PATCH 186/252] groups.py: don't overwrite toml groups --- groups.py | 1 - 1 file changed, 1 deletion(-) diff --git a/groups.py b/groups.py index d99ced7..b5acfd9 100644 --- a/groups.py +++ b/groups.py @@ -3,7 +3,6 @@ from pathlib import Path from bundlewrap.utils import error_context -groups = {} for group in Path(join(repo_path, "groups")).rglob("*.py"): with error_context(filename=str(group)): with open(group, 'r') as f: From a376d980cbb3738856fef79e73aae39fa71a5ba8 Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Thu, 6 Mar 2025 20:32:31 +0100 Subject: [PATCH 187/252] add .bw_debug_history to gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 7a53a34..8c736ec 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,4 @@ __pycache__ *.swp .direnv .envrc.local +.bw_debug_history From 6d5ae359ebdd301229ab743f801cc6bbb772a7e2 Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Sat, 8 Mar 2025 09:11:10 +0100 Subject: [PATCH 188/252] node: correct syntax for ipmi data --- nodes/home.r630.toml | 9 ++++----- nodes/proxmox-backupstorage.toml | 9 ++++----- nodes/rottenraptor-server.toml | 9 ++++----- 3 files changed, 12 insertions(+), 15 deletions(-) diff --git a/nodes/home.r630.toml b/nodes/home.r630.toml index ffd4c46..03e2f56 100644 --- a/nodes/home.r630.toml +++ b/nodes/home.r630.toml @@ -2,11 +2,10 @@ hostname = "172.19.138.22" groups = ["debian-bookworm"] bundles = ["docker-engine", "nginx", "redis"] -#[ipmi] -#hostname = "172.19.138.23" -#username = "root" -#password = "calvin" -#interface = "lanplus" +#ipmi_hostname = "172.19.138.23" +#ipmi_username = "root" +#ipmi_password = "calvin" +#ipmi_interface = "lanplus" [metadata] icinga_options.exclude_from_monitoring = true diff --git a/nodes/proxmox-backupstorage.toml b/nodes/proxmox-backupstorage.toml index 8a9da36..a061f7e 100644 --- a/nodes/proxmox-backupstorage.toml +++ b/nodes/proxmox-backupstorage.toml @@ -1,11 +1,10 @@ hostname = "192.168.100.31" dummy = true -#[ipmi] -#hostname = "192.168.100.30" -#username = "root" -#password = "!bwpass:192.168.100.30/root" -#interface = "lanplus" +#ipmi_hostname = "192.168.100.30" +#ipmi_username = "root" +#ipmi_password = "!bwpass:192.168.100.30/root" +#ipmi_interface = "lanplus" [metadata.icinga2_api.smartd.services."SMART STATUS CT480BX500SSD1_2314E6C5C695"] check_command = "sshmon" diff --git a/nodes/rottenraptor-server.toml b/nodes/rottenraptor-server.toml index 529984a..964839c 100644 --- a/nodes/rottenraptor-server.toml +++ b/nodes/rottenraptor-server.toml @@ -13,11 +13,10 @@ bundles = [ "zfs", ] -#[ipmi] -#hostname = "192.168.100.27" -#username = "Administrator" -#password = "!bwpass:bw/rottenraptor-server/ipmi" -#interface = "lanplus" +#ipmi_hostname = "192.168.100.27" +#ipmi_username = "Administrator" +#ipmi_password = "!bwpass:bw/rottenraptor-server/ipmi" +#ipmi_interface = "lanplus" [metadata.docker-immich] enable_auto_album_share = true From 18207d2ae5303fd34d6b9f6552dc8ee4a51718e1 Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Sat, 8 Mar 2025 09:13:37 +0100 Subject: [PATCH 189/252] bundles/icinga2: fix ipmi check --- bundles/icinga2/files/icinga2/hosts_template.conf | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/bundles/icinga2/files/icinga2/hosts_template.conf b/bundles/icinga2/files/icinga2/hosts_template.conf index c28d8e4..ac56ef2 100644 --- a/bundles/icinga2/files/icinga2/hosts_template.conf +++ b/bundles/icinga2/files/icinga2/hosts_template.conf @@ -23,16 +23,16 @@ object Host "${rnode.name}" { vars.notification.mail = true } -% if rnode._attributes.get('ipmi'): -object Host "IPMI ${rnode.name}" { +% if rnode.ipmi_hostname: +object Host "${rnode.name} IPMI" { import "generic-host" - address = "${rnode._attributes['ipmi']['hostname']}" + address = "${rnode.ipmi_hostname}" vars.location = "${rnode.metadata.get('location', 'unknown')}" vars.os = "ipmi" - vars.pretty_name = "IPMI ${rnode.metadata.get('icinga_options/pretty_name', rnode.metadata.get('hostname'))}" + vars.pretty_name = "${rnode.metadata.get('icinga_options/pretty_name', rnode.metadata.get('hostname'))} IPMI" vars.show_on_statuspage = false vars.period = "${rnode.metadata.get('icinga_options/period', '24x7')}" From 333873383b93ab74c24f7c777b46469e0ecbce2c Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Sat, 8 Mar 2025 09:26:13 +0100 Subject: [PATCH 190/252] scripts/passwords_for: various improvements --- scripts/passwords-for | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/scripts/passwords-for b/scripts/passwords-for index 136ba99..d019e74 100755 --- a/scripts/passwords-for +++ b/scripts/passwords-for @@ -1,5 +1,7 @@ #!/usr/bin/env python3 + from os import environ +from os.path import abspath, dirname from sys import argv from bundlewrap.exceptions import FaultUnavailable @@ -7,13 +9,13 @@ from bundlewrap.metagen import NodeMetadataProxy from bundlewrap.repo import Repository from bundlewrap.utils import Fault -path = environ.get('BW_REPO_PATH', '.') -repo = Repository(path) +repo = Repository( + dirname(dirname(abspath(__file__))) +) def print_faults(dictionary, keypath=[]): for key, value in sorted(dictionary.items()): key = str(key) - if isinstance(value, Fault): try: resolved_fault = value.value @@ -27,12 +29,22 @@ def print_faults(dictionary, keypath=[]): elif isinstance(value, (dict, NodeMetadataProxy)): print_faults(value, keypath=keypath+[key]) + if len(argv) == 1: print('node name missing') exit(1) node = repo.get_node(argv[1]) +if node.username or node.password: + print_faults({ + 'username': node.username, + 'password': node.password, + }) +#if node.ipmi_username or node.ipmi_password: +# print_faults({ +# 'ipmi_username': node.ipmi_username, +# 'ipmi_password': node.ipmi_password, +# }) print_faults({ - 'password': node.password, 'metadata': node.metadata, }) From b5a9a502da053e0dabd93bb37a9b83bf390e3f81 Mon Sep 17 00:00:00 2001 From: Sophie Schiller Date: Wed, 19 Mar 2025 19:24:58 +0100 Subject: [PATCH 191/252] bw/ssl add new home wildcard --- data/ssl/_.home.sophies-kitchen.eu.crt.pem | 39 ++++++++++--------- ...me.sophies-kitchen.eu.crt_intermediate.pem | 36 ++++++++--------- .../_.home.sophies-kitchen.eu.key.pem.vault | 2 +- 3 files changed, 39 insertions(+), 38 deletions(-) diff --git a/data/ssl/_.home.sophies-kitchen.eu.crt.pem b/data/ssl/_.home.sophies-kitchen.eu.crt.pem index c0e1bad..bc6c33e 100644 --- a/data/ssl/_.home.sophies-kitchen.eu.crt.pem +++ b/data/ssl/_.home.sophies-kitchen.eu.crt.pem @@ -1,23 +1,24 @@ -----BEGIN CERTIFICATE----- -MIIDxzCCA02gAwIBAgISA1HOrGT03Yk2QXIKpt4i5P2mMAoGCCqGSM49BAMDMDIx +MIID9jCCA3ygAwIBAgISBaRtAN5dI7hI3l+MeuwXGm48MAoGCCqGSM49BAMDMDIx CzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MQswCQYDVQQDEwJF -NjAeFw0yNDEyMTkwMTE2MTdaFw0yNTAzMTkwMTE2MTZaMCIxIDAeBgNVBAMTF2hv -bWUuc29waGllcy1raXRjaGVuLmV1MHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEKI2X -YK5pxQUcBjOYQwH6OQBEaj2kVhtj1BgRXXrap/U3Zi9M1oKpDk22husbUDS4fACo -IFAsNYbFi15ayAwvkkcWEe4VkgYEdPVJes3XnkL1YOGzUpT9+eC6VbjCxjfdo4IC -NDCCAjAwDgYDVR0PAQH/BAQDAgeAMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEF -BQcDAjAMBgNVHRMBAf8EAjAAMB0GA1UdDgQWBBRQB7GGtPhw9dPLCx28NgPOq+Wa -jjAfBgNVHSMEGDAWgBSTJ0aYA6lRaI6Y1sRCSNsjv1iU0jBVBggrBgEFBQcBAQRJ -MEcwIQYIKwYBBQUHMAGGFWh0dHA6Ly9lNi5vLmxlbmNyLm9yZzAiBggrBgEFBQcw -AoYWaHR0cDovL2U2LmkubGVuY3Iub3JnLzA9BgNVHREENjA0ghkqLmhvbWUuc29w +NTAeFw0yNTAzMTkxNzI1NTVaFw0yNTA2MTcxNzI1NTRaMCIxIDAeBgNVBAMTF2hv +bWUuc29waGllcy1raXRjaGVuLmV1MHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEMpwz +KfaRqcoUak1UJzHRmcy1Zz/9KmlEoja94JwEO7qqARCOJedwJ/MS8Zkz3ZkJvjv5 +iIXe9u6qbn/C8RS+/UqunvnCxTJeWMcXaI2p9M+DE7PlPQiIP1t/SPQ2QsIso4IC +YzCCAl8wDgYDVR0PAQH/BAQDAgeAMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEF +BQcDAjAMBgNVHRMBAf8EAjAAMB0GA1UdDgQWBBSspYDX4yydAiYu+8XZw/Vu7IrW +xDAfBgNVHSMEGDAWgBSfK1/PPCFPnQS37SssxMZwi9LXDTBVBggrBgEFBQcBAQRJ +MEcwIQYIKwYBBQUHMAGGFWh0dHA6Ly9lNS5vLmxlbmNyLm9yZzAiBggrBgEFBQcw +AoYWaHR0cDovL2U1LmkubGVuY3Iub3JnLzA9BgNVHREENjA0ghkqLmhvbWUuc29w aGllcy1raXRjaGVuLmV1ghdob21lLnNvcGhpZXMta2l0Y2hlbi5ldTATBgNVHSAE -DDAKMAgGBmeBDAECATCCAQQGCisGAQQB1nkCBAIEgfUEgfIA8AB3AKLjCuRF772t -m3447Udnd1PXgluElNcrXhssxLlQpEfnAAABk9yyNhIAAAQDAEgwRgIhAOsCeRvZ -GUN1z2lGajkrKcCtffuDhwNRPAIN2we+oXuzAiEA7XeLDROcGGcOYUMin5xKE+qr -XwitlCEyUejC5xKJm1QAdQDM+w9qhXEJZf6Vm1PO6bJ8IumFXA2XjbapflTA/kwN -sAAAAZPcsjYwAAAEAwBGMEQCIFRahCu7PZCNkSF6+oyB3MAWoLQYmjlDXxeI91E0 -QfOkAiBGaToUTmM1n16nkX0hMVhNm7icCFojHkNCUzfSJ0wk8zAKBggqhkjOPQQD -AwNoADBlAjAgbshjfMt0K8pG2NzhVW1m/es3HJEtK4QGAe/BR5lgjLy1bJG/iLr9 -eXPh4xACg5wCMQDx7cF2C2T06e9ogshtJGODQSM9tGHbtt2rpAbUAzWNZgu+F3XL -mwaSjFAL7mBYSMM= +DDAKMAgGBmeBDAECATAtBgNVHR8EJjAkMCKgIKAehhxodHRwOi8vZTUuYy5sZW5j +ci5vcmcvNjEuY3JsMIIBBAYKKwYBBAHWeQIEAgSB9QSB8gDwAHcATnWjJ1yaEMM4 +W2zU3z9S6x3w4I4bjWnAsfpksWKaOd8AAAGVr6ZJYgAABAMASDBGAiEA2TRwcna6 +vp3yZSUfXjd14SFvTZtXucSMJQQERKgwDekCIQCEppv+qukiFo4SjQBMQ50ptVXC +LMJZVy4A6VuMCmj3VQB1AOCSs/wMHcjnaDYf3mG5lk0KUngZinLWcsSwTaVtb1QE +AAABla+mSgEAAAQDAEYwRAIgXjJYEE32AFXfqx43ZOQrgP5cGdK5znOGCSxmjcMg +S/UCIBZNBTNVtJWGYKJQgS+bx7EbDDWobar7shNd1/jK0Kt3MAoGCCqGSM49BAMD +A2gAMGUCMQCoQeeM5wcNWCgtjoWPqduuEP/W0M4UrBydd2tVAAE7dbYb2Batj2Gg +qnaDMK2j/+ACMCNtwr4CWsgMAsK8HlDVM0UBvzEFOy2X+hkGzqOe0kfN+abHP0Sf +L0aZkl5gt8NcKg== -----END CERTIFICATE----- diff --git a/data/ssl/_.home.sophies-kitchen.eu.crt_intermediate.pem b/data/ssl/_.home.sophies-kitchen.eu.crt_intermediate.pem index 4652201..59039ae 100644 --- a/data/ssl/_.home.sophies-kitchen.eu.crt_intermediate.pem +++ b/data/ssl/_.home.sophies-kitchen.eu.crt_intermediate.pem @@ -1,27 +1,27 @@ -----BEGIN CERTIFICATE----- -MIIEVzCCAj+gAwIBAgIRALBXPpFzlydw27SHyzpFKzgwDQYJKoZIhvcNAQELBQAw +MIIEVzCCAj+gAwIBAgIRAIOPbGPOsTmMYgZigxXJ/d4wDQYJKoZIhvcNAQELBQAw TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMjQwMzEzMDAwMDAw WhcNMjcwMzEyMjM1OTU5WjAyMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNTGV0J3Mg -RW5jcnlwdDELMAkGA1UEAxMCRTYwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAATZ8Z5G -h/ghcWCoJuuj+rnq2h25EqfUJtlRFLFhfHWWvyILOR/VvtEKRqotPEoJhC6+QJVV -6RlAN2Z17TJOdwRJ+HB7wxjnzvdxEP6sdNgA1O1tHHMWMxCcOrLqbGL0vbijgfgw +RW5jcnlwdDELMAkGA1UEAxMCRTUwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQNCzqK +a2GOtu/cX1jnxkJFVKtj9mZhSAouWXW0gQI3ULc/FnncmOyhKJdyIBwsz9V8UiBO +VHhbhBRrwJCuhezAUUE8Wod/Bk3U/mDR+mwt4X2VEIiiCFQPmRpM5uoKrNijgfgw gfUwDgYDVR0PAQH/BAQDAgGGMB0GA1UdJQQWMBQGCCsGAQUFBwMCBggrBgEFBQcD -ATASBgNVHRMBAf8ECDAGAQH/AgEAMB0GA1UdDgQWBBSTJ0aYA6lRaI6Y1sRCSNsj -v1iU0jAfBgNVHSMEGDAWgBR5tFnme7bl5AFzgAiIyBpY9umbbjAyBggrBgEFBQcB +ATASBgNVHRMBAf8ECDAGAQH/AgEAMB0GA1UdDgQWBBSfK1/PPCFPnQS37SssxMZw +i9LXDTAfBgNVHSMEGDAWgBR5tFnme7bl5AFzgAiIyBpY9umbbjAyBggrBgEFBQcB AQQmMCQwIgYIKwYBBQUHMAKGFmh0dHA6Ly94MS5pLmxlbmNyLm9yZy8wEwYDVR0g BAwwCjAIBgZngQwBAgEwJwYDVR0fBCAwHjAcoBqgGIYWaHR0cDovL3gxLmMubGVu -Y3Iub3JnLzANBgkqhkiG9w0BAQsFAAOCAgEAfYt7SiA1sgWGCIpunk46r4AExIRc -MxkKgUhNlrrv1B21hOaXN/5miE+LOTbrcmU/M9yvC6MVY730GNFoL8IhJ8j8vrOL -pMY22OP6baS1k9YMrtDTlwJHoGby04ThTUeBDksS9RiuHvicZqBedQdIF65pZuhp -eDcGBcLiYasQr/EO5gxxtLyTmgsHSOVSBcFOn9lgv7LECPq9i7mfH3mpxgrRKSxH -pOoZ0KXMcB+hHuvlklHntvcI0mMMQ0mhYj6qtMFStkF1RpCG3IPdIwpVCQqu8GV7 -s8ubknRzs+3C/Bm19RFOoiPpDkwvyNfvmQ14XkyqqKK5oZ8zhD32kFRQkxa8uZSu -h4aTImFxknu39waBxIRXE4jKxlAmQc4QjFZoq1KmQqQg0J/1JF8RlFvJas1VcjLv -YlvUB2t6npO6oQjB3l+PNf0DpQH7iUx3Wz5AjQCi6L25FjyE06q6BZ/QlmtYdl/8 -ZYao4SRqPEs/6cAiF+Qf5zg2UkaWtDphl1LKMuTNLotvsX99HP69V2faNyegodQ0 -LyTApr/vT01YPE46vNsDLgK+4cL6TrzC/a4WcmF5SRJ938zrv/duJHLXQIku5v0+ -EwOy59Hdm0PT/Er/84dDV0CSjdR/2XuZM3kpysSKLgD1cKiDA+IRguODCxfO9cyY -Ig46v9mFmBvyH04= +Y3Iub3JnLzANBgkqhkiG9w0BAQsFAAOCAgEAH3KdNEVCQdqk0LKyuNImTKdRJY1C +2uw2SJajuhqkyGPY8C+zzsufZ+mgnhnq1A2KVQOSykOEnUbx1cy637rBAihx97r+ +bcwbZM6sTDIaEriR/PLk6LKs9Be0uoVxgOKDcpG9svD33J+G9Lcfv1K9luDmSTgG +6XNFIN5vfI5gs/lMPyojEMdIzK9blcl2/1vKxO8WGCcjvsQ1nJ/Pwt8LQZBfOFyV +XP8ubAp/au3dc4EKWG9MO5zcx1qT9+NXRGdVWxGvmBFRAajciMfXME1ZuGmk3/GO +koAM7ZkjZmleyokP1LGzmfJcUd9s7eeu1/9/eg5XlXd/55GtYjAM+C4DG5i7eaNq +cm2F+yxYIPt6cbbtYVNJCGfHWqHEQ4FYStUyFnv8sjyqU8ypgZaNJ9aVcWSICLOI +E1/Qv/7oKsnZCWJ926wU6RqG1OYPGOi1zuABhLw61cuPVDT28nQS/e6z95cJXq0e +K1BcaJ6fJZsmbjRgD5p3mvEf5vdQM7MCEvU0tHbsx2I5mHHJoABHb8KVBgWp/lcX +GWiWaeOyB7RP+OfDtvi2OsapxXiV7vNVs7fMlrRjY1joKaqmmycnBvAq14AEbtyL +sVfOS66B8apkeFX2NY4XPEYV4ZSCe8VHPrdrERk2wILG3T/EGmSIkCYVUMSnjmJd +VQD9F6Na/+zmXCc= -----END CERTIFICATE----- diff --git a/data/ssl/_.home.sophies-kitchen.eu.key.pem.vault b/data/ssl/_.home.sophies-kitchen.eu.key.pem.vault index 4b79230..8f76986 100644 --- a/data/ssl/_.home.sophies-kitchen.eu.key.pem.vault +++ b/data/ssl/_.home.sophies-kitchen.eu.key.pem.vault @@ -1 +1 @@ -encrypt$gAAAAABnY4Ga6MmpudhHnOVKVh3j6R071y-Bs6es3e3hNHkZP7Tfj6IomEhTSxWb_oG9HYZmhkadw66cmVRQcxp1wGChWWLye-ykadgy0xUCxGW3YmBWp4t--Yesvbjamaa5OlvDFWQVG5Zt4fsY7BloXRdio8XUdPKBkbi2MV0quvpqsFfOqr_ZmIOOkjLlZojfw9HQ7odM9lSAm8cVS5NXimOhA1ks_gK6CzJbzwhpbekCOcx5_sGhdb8XFUxLN-VBtmQ2HGIncou66rE1P3mBg2hDSyqiXapVMkqMjNoVM71V_5lUnAF7Lxce3nG72SnOe2oITnxRNcnaavxDEgd0ffM5revuCd-XWlaUW1iQrgSyQzJyD6Ukv-mM2IRpuoq79JdTZK_LNJkAmJozrGBT0c5ZwGVNLmZEcjQ1dk8jyYslF5s7rK1lmNvcTUaHGpFToXc1p-qFY8NNWj_Iu-MLE8PNrIscDg== \ No newline at end of file +encrypt$gAAAAABn2wvcFmCiy7gpvvwJzRVNJSSxLvlld2ob9O2ivyekdR6y1_k90Q1xZhs7-ombGAIyez1D7lvuNhYQrnff5TqRa9wKbIVyqOOj4lc5qS2jJWyMl9BCr7Fu0mdW0_33Ke5nGpc3mAMjwTLCn8aw-I_I0kALuhKvZ_H31Oy0Mdjw9rau8TmeWGmJDiPMyHlg_C6s2Gvj2VKHVuGeSVg01frjlTveK-ZsJNGvKm7njCqvqGJytFeV6iHzWYyzMTk8-z_xtv-PKH82ME_IdGVv8YcgmCrXWzzA35A3YEaac7uKui1RFzqN6K5sYL1hsxU9rAyidNRd1fp0CRlpyJWgcf_ykoe2u3ManhFOdMmJdx_nrt2znNLaiQqcSHWuws7pGeSZtX72rGa5ZEBF5xeTruhRSQyjMUuBZrqi75QKyYnpmNSpgh0fDHqHUVmSQ5vInd8Tai2BWz3oqKhrkqJMIXlKQn35Jw== \ No newline at end of file From 544c889e82602297bacb6db01c59587428732122 Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Thu, 20 Mar 2025 22:12:30 +0100 Subject: [PATCH 192/252] bump bw version, enable ipmi information --- nodes/home.r630.toml | 8 ++++---- nodes/proxmox-backupstorage.toml | 8 ++++---- nodes/rottenraptor-server.toml | 8 ++++---- requirements.txt | 2 +- 4 files changed, 13 insertions(+), 13 deletions(-) diff --git a/nodes/home.r630.toml b/nodes/home.r630.toml index 03e2f56..f41bb19 100644 --- a/nodes/home.r630.toml +++ b/nodes/home.r630.toml @@ -2,10 +2,10 @@ hostname = "172.19.138.22" groups = ["debian-bookworm"] bundles = ["docker-engine", "nginx", "redis"] -#ipmi_hostname = "172.19.138.23" -#ipmi_username = "root" -#ipmi_password = "calvin" -#ipmi_interface = "lanplus" +ipmi_hostname = "172.19.138.23" +ipmi_username = "root" +ipmi_password = "calvin" +ipmi_interface = "lanplus" [metadata] icinga_options.exclude_from_monitoring = true diff --git a/nodes/proxmox-backupstorage.toml b/nodes/proxmox-backupstorage.toml index a061f7e..eee0256 100644 --- a/nodes/proxmox-backupstorage.toml +++ b/nodes/proxmox-backupstorage.toml @@ -1,10 +1,10 @@ hostname = "192.168.100.31" dummy = true -#ipmi_hostname = "192.168.100.30" -#ipmi_username = "root" -#ipmi_password = "!bwpass:192.168.100.30/root" -#ipmi_interface = "lanplus" +ipmi_hostname = "192.168.100.30" +ipmi_username = "root" +ipmi_password = "!bwpass:192.168.100.30/root" +ipmi_interface = "lanplus" [metadata.icinga2_api.smartd.services."SMART STATUS CT480BX500SSD1_2314E6C5C695"] check_command = "sshmon" diff --git a/nodes/rottenraptor-server.toml b/nodes/rottenraptor-server.toml index 964839c..dadc232 100644 --- a/nodes/rottenraptor-server.toml +++ b/nodes/rottenraptor-server.toml @@ -13,10 +13,10 @@ bundles = [ "zfs", ] -#ipmi_hostname = "192.168.100.27" -#ipmi_username = "Administrator" -#ipmi_password = "!bwpass:bw/rottenraptor-server/ipmi" -#ipmi_interface = "lanplus" +ipmi_hostname = "192.168.100.27" +ipmi_username = "Administrator" +ipmi_password = "!bwpass:bw/rottenraptor-server/ipmi" +ipmi_interface = "lanplus" [metadata.docker-immich] enable_auto_album_share = true diff --git a/requirements.txt b/requirements.txt index 7e81327..6b2227f 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,4 +1,4 @@ -bundlewrap>=4.16.0 +bundlewrap>=4.22.0 PyNaCl bundlewrap-pass semver From 0e2d25281e0d1cd57b6c092ae723b3724fd2946d Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Sat, 22 Mar 2025 19:46:35 +0100 Subject: [PATCH 193/252] voc.pretalx: remove fonts vhost --- data/nginx/files/extras/voc.pretalx/pretalx | 9 --------- 1 file changed, 9 deletions(-) diff --git a/data/nginx/files/extras/voc.pretalx/pretalx b/data/nginx/files/extras/voc.pretalx/pretalx index 1d1c718..8c82109 100644 --- a/data/nginx/files/extras/voc.pretalx/pretalx +++ b/data/nginx/files/extras/voc.pretalx/pretalx @@ -25,12 +25,3 @@ expires 365d; add_header Cache-Control "public"; } - - location /Uluagh8Oichai4Uk/ { - alias /var/www/pretalx/; - access_log off; - expires 365d; - add_header Cache-Control "public"; - autoindex on; - } - From 38ec7af32c68dd67efcc2e753a366460048b4e5d Mon Sep 17 00:00:00 2001 From: Sophie Schiller Date: Thu, 27 Mar 2025 10:09:09 +0100 Subject: [PATCH 194/252] matrix updates --- data/apt/files/gpg-keys/matrix.asc | 75 ++++++++++++------------------ nodes/sophie/miniserver.py | 2 +- 2 files changed, 32 insertions(+), 45 deletions(-) diff --git a/data/apt/files/gpg-keys/matrix.asc b/data/apt/files/gpg-keys/matrix.asc index 78f4114..41274cb 100644 --- a/data/apt/files/gpg-keys/matrix.asc +++ b/data/apt/files/gpg-keys/matrix.asc @@ -24,48 +24,35 @@ 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 -ZW94e89LdsmxP1kNAEo= -=QODj +nMfe+URZO54gAkGN7JLo+BhXuQGNBFy1EV4BDADIlwWsfB4tQIErRVHabD1NU6uB +XHNoXG3z1ackyByCLSZzD5r4HbAcdgeAjYPZdBnxrtAhXjc4J5Z2ITZkq4riFfYV +UsuastrrFXKO8XwA7f8IPhoKVDRbJiRj0S4hEnwwT8yH/bOwJrJEW97OuMeKQ4kW +0fzjg/ifNV4C0gYzo7suOLE4lcOGg+czmyOXrVMMluBqsHihdNgEU84Ht/3pPFJ7 +ofbgagJHycbi/QZdItEAkRWlXPl2k7iOh7nNMNDMGfnAh+SOEqmu/1d/08/N/w9t +FUV32+oHTkATADF5OnnnCuAgLG3WNBIKOyA1Ov+e0SmFk1So1hU+mE6349v0rp3R +LpV2QRDrIAcn6wUHLsEqyQBArvWP+cg5JuPALYR3ZBEgah52tSgnOGnvVWyPPHNo +0bhAFZ9YGToDuE3qPV+ud8qNe4nT7qsZo4NdfFd3JgBHV6CaVwdRMtkut8Xjjmt9 +DiVaHS1hgi+METEMFXdhyXMSwFLH6DDF6Uny9LsAEQEAAYkD8gQYAQoAJgIbAhYh +BKr5roQ6dYS1o+TNK89FpRLeLaBYBQJnxeuFBQkO4xMnAcDA9CAEGQEKAB0WIQRV +hszAy7vvx6JYEa30c91EczZd4QUCXLURXgAKCRD0c91EczZd4U5qC/wLYGzvpT+M +I7SNg1of/1ekeRXzvXc8m8JC/cHAhrBzUaI8z9LJ7xna2DGt27eqeTtu/Shtknn+ +/8VaX9+7wm7UaGHWVmPFkSt1Rs1x5Opxo6kabLc4HxGSc5buNx+awybFEt9VQdSU +D3hiBgTQpu0CSMlcZIk6C6xQHgmurSDj9AQ0xtLPqP1ZO/cOKk0A1tFjVGDdH9gE +uVJPAFF86z39hiGNnYJcikyVXogjwQPs5Od+3PdGQ19heZp8n+2rVkhl+9yZaCHk ++LAxwuQJpe5skvj1NrjD3bSJ47Hu7POSftJXcSmLct2GW7jTMZaCEpKccNfSApvF +RRb3hyRWTRtLQhhaMw3zSwekA8VjKSinTyOxnRPa3rc7/rOqb5b8ZUAIzpTLd7al +7+E0fmOfie93KYh+BV6FuL0KJ0RNHm7zrgaVZbjDoqNIgkHK73+3a9NnSefsgbmC +VxOxNM3lY7Jun1E/f/KE6dTY7VGPP6aTtQrcq49Zj1MwPc0SG7VlZkwJEM9FpRLe +LaBY9+YQAKXMKKOY7D+cJVKjVDbVuhknB+vLLRIN7Yx6GxRxM0Q6wPo42WmstDui +ex6u5MN0UjoA7+bPrC/vGBGOIr56sIMiaHkCqhoQoz7vwKayTJHa8McO/x8oRMr1 +aPtDgvUU78N7cdSv01wMW7zF/anCESEtbpfOzd5SM5V+XuYJoVzm3KtAdKQIxH0X +khOPvDa9Nn2bCsEvkp0pds0c5STKPWBeMSYSYuJzf48lcmoDilruPl2PaXPY1oxN +ciOGVuiCoT/XAdYuw2iynU5eC6h7W6b9EQZ1XPatFhkfGSucWtypObgCe+UGojOP +xZvqujcKnZBzECzawFu45Gp7TjPXnbsLmH5tv4GvJ9R0AeBnnHzTTpkduq7C7lO/ +X8VyxPpisJZII6s8pymSuw0/0CCNodf4wd1ar7ATCixcmJutWCJi8HLzvfoXEe8J +hE/ZjUEkVpWwxYIsM/U4ImWmrus81dMqBDVHowxwXoeJHsHNeUGTa8fKkPFo7i54 +Y/GhsNRDIk9nOHNqucV6xx3+WPs5p8eEcNFLalqjONcugfOB6Sfo/NaR3Jus7p+7 +kmwJ4YNxXYnogj4I24PT1/+BTFrrjYMXgbVs8s0yL68AHDlEo5MxHk3C82+ukeI6 +97uC8U9NZEpwVDk2mNb3ngwHWzp7InGGi3bwozHPj8bGIPuBaAlF +=3XJ/ -----END PGP PUBLIC KEY BLOCK----- diff --git a/nodes/sophie/miniserver.py b/nodes/sophie/miniserver.py index 5fd1c11..b852a35 100644 --- a/nodes/sophie/miniserver.py +++ b/nodes/sophie/miniserver.py @@ -61,7 +61,7 @@ nodes["htz-cloud.miniserver"] = { }, "element-web": { "url": "chat.sophies-kitchen.eu", - "version": "v1.11.91", + "version": "v1.11.96", "config": { "default_server_config": { "m.homeserver": { From a592de005ebcc06056ce4cf68b2321d933af0ae4 Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Sat, 29 Mar 2025 13:37:45 +0100 Subject: [PATCH 195/252] bundles/docker-engine: fix backups and zfs dependencies --- bundles/docker-engine/items.py | 5 +++++ bundles/docker-engine/metadata.py | 21 ++++++++++++--------- 2 files changed, 17 insertions(+), 9 deletions(-) diff --git a/bundles/docker-engine/items.py b/bundles/docker-engine/items.py index 7050197..253daff 100644 --- a/bundles/docker-engine/items.py +++ b/bundles/docker-engine/items.py @@ -46,6 +46,10 @@ actions['docker_create_nondefault_network'] = { for app, config in node.metadata.get('docker-engine/containers', {}).items(): volumes = config.get('volumes', {}) user = config.get('user', f'docker-{app}') + directories[f'/var/opt/docker-engine/{app}'] = { + 'owner': user, + 'group': user, + } files[f'/opt/docker-engine/{app}'] = { 'source': 'docker-wrapper', @@ -97,6 +101,7 @@ for app, config in node.metadata.get('docker-engine/containers', {}).items(): svc_systemd[f'docker-{app}'] = { 'needs': { *deps, + f'directory:/var/opt/docker-engine/{app}', f'file:/opt/docker-engine/{app}', f'file:/usr/local/lib/systemd/system/docker-{app}.service', f'user:{user}', diff --git a/bundles/docker-engine/metadata.py b/bundles/docker-engine/metadata.py index 2b9212f..4600233 100644 --- a/bundles/docker-engine/metadata.py +++ b/bundles/docker-engine/metadata.py @@ -13,11 +13,6 @@ defaults = { }, }, }, - 'backups': { - 'paths': { - '/var/opt/docker-engine', - }, - }, 'nftables': { 'forward': { 'docker-engine': [ @@ -39,9 +34,7 @@ defaults = { }, 'zfs': { 'datasets': { - 'tank/docker-data': { - 'mountpoint': '/var/opt/docker-engine', - }, + 'tank/docker-data': {}, }, }, } @@ -72,6 +65,7 @@ def monitoring(metadata): @metadata_reactor.provides( + 'backups/paths', 'zfs/datasets', ) def zfs(metadata): @@ -79,10 +73,19 @@ def zfs(metadata): for app in metadata.get('docker-engine/containers', {}): datasets[f'tank/docker-data/{app}'] = { - 'mountpoint': f'/var/opt/docker-engine/{app}' + 'mountpoint': f'/var/opt/docker-engine/{app}', + 'needed_by': { + f'directory:/var/opt/docker-engine/{app}', + }, } return { + 'backups': { + 'paths': { + v['mountpoint'] + for v in datasets.values() + }, + }, 'zfs': { 'datasets': datasets, }, From 7cb8876231368337e29a7b51d0b5c369c1aeaea9 Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Sat, 29 Mar 2025 13:38:08 +0100 Subject: [PATCH 196/252] home.nas: add new samba share for watching c3voc streams --- nodes/home/nas.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/nodes/home/nas.py b/nodes/home/nas.py index 831513a..b98fb7d 100644 --- a/nodes/home/nas.py +++ b/nodes/home/nas.py @@ -180,6 +180,10 @@ nodes['home.nas'] = { }, 'samba': { 'shares': { + 'C3VOC': { + 'path': '/storage/nas/C3VOC', + 'force_group': 'nas', + }, 'TV': { 'path': '/storage/nas/TV', 'force_group': 'nas', From d71af7561ae72e2411b913e5569458c271f7d97f Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Sat, 29 Mar 2025 18:07:17 +0100 Subject: [PATCH 197/252] add support for debian trixie --- bundles/apt/files/sources.list-debian-trixie | 3 +++ bundles/apt/items.py | 1 + groups/os.py | 4 ++++ 3 files changed, 8 insertions(+) create mode 100644 bundles/apt/files/sources.list-debian-trixie diff --git a/bundles/apt/files/sources.list-debian-trixie b/bundles/apt/files/sources.list-debian-trixie new file mode 100644 index 0000000..6ac79f3 --- /dev/null +++ b/bundles/apt/files/sources.list-debian-trixie @@ -0,0 +1,3 @@ +deb http://deb.debian.org/debian/ trixie main non-free contrib non-free-firmware +deb http://security.debian.org/debian-security trixie-security main contrib non-free +deb http://deb.debian.org/debian/ trixie-updates main contrib non-free diff --git a/bundles/apt/items.py b/bundles/apt/items.py index 0f3f92d..ea988af 100644 --- a/bundles/apt/items.py +++ b/bundles/apt/items.py @@ -5,6 +5,7 @@ supported_os = { 10: 'buster', 11: 'bullseye', 12: 'bookworm', + 13: 'trixie', 99: 'unstable', }, } diff --git a/groups/os.py b/groups/os.py index 98dacfa..34f49b2 100644 --- a/groups/os.py +++ b/groups/os.py @@ -71,6 +71,10 @@ groups['debian-bookworm'] = { 'os_version': (12,) } +groups['debian-trixie'] = { + 'os_version': (13,) +} + groups['debian-sid'] = { 'os_version': (99,) } From e1d01d7bc6b15506ddc6d3df9c47aa8218c36ef0 Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Sat, 29 Mar 2025 18:08:06 +0100 Subject: [PATCH 198/252] bundles/paperless-ng: fix PAPERLESS_FILENAME_FORMAT --- bundles/paperless-ng/files/paperless.conf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bundles/paperless-ng/files/paperless.conf b/bundles/paperless-ng/files/paperless.conf index 0cbd054..d943063 100644 --- a/bundles/paperless-ng/files/paperless.conf +++ b/bundles/paperless-ng/files/paperless.conf @@ -12,7 +12,7 @@ PAPERLESS_CONSUMPTION_DIR=/mnt/paperless/consume PAPERLESS_DATA_DIR=/mnt/paperless/data PAPERLESS_MEDIA_ROOT=/mnt/paperless/media PAPERLESS_STATICDIR=/opt/paperless/src/paperless-ngx/static -PAPERLESS_FILENAME_FORMAT={created_year}/{created_month}/{correspondent}/{asn}_{title} +PAPERLESS_FILENAME_FORMAT={{ created_year }}/{{ created_month }}/{{ correspondent }}/{{ asn }}_{{ title }} # Security and hosting From 61d60b788242b516a310459a186945ae0a04ea48 Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Sat, 29 Mar 2025 18:08:34 +0100 Subject: [PATCH 199/252] home.paperless: upgrade to debian trixie --- data/proftpd/files/home.paperless.conf | 7 ------- nodes/home/paperless.py | 2 +- 2 files changed, 1 insertion(+), 8 deletions(-) diff --git a/data/proftpd/files/home.paperless.conf b/data/proftpd/files/home.paperless.conf index 4d861ad..49a9c5b 100644 --- a/data/proftpd/files/home.paperless.conf +++ b/data/proftpd/files/home.paperless.conf @@ -10,15 +10,9 @@ ServerType standalone DeferWelcome off DefaultServer on -ShowSymlinks on - -TimeoutNoTransfer 600 -TimeoutStalled 600 -TimeoutIdle 1200 DisplayLogin welcome.msg DisplayChdir .message true -ListOptions "-l" DenyFilter \*.*/ @@ -34,7 +28,6 @@ User proftpd Group nogroup Umask 022 022 -AllowOverwrite on TransferLog /var/log/proftpd/xferlog SystemLog /var/log/proftpd/proftpd.log diff --git a/nodes/home/paperless.py b/nodes/home/paperless.py index 7a28c3d..654a79e 100644 --- a/nodes/home/paperless.py +++ b/nodes/home/paperless.py @@ -9,7 +9,7 @@ nodes['home.paperless'] = { 'proftpd', }, 'groups': { - 'debian-bookworm', + 'debian-trixie', 'webserver', }, 'metadata': { From da7928d0e6e384272a812dea83cecc1e2ca0e971 Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Sat, 29 Mar 2025 18:10:13 +0100 Subject: [PATCH 200/252] bundlespostfix: unit has changed since debian trixie --- bundles/postfix/metadata.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bundles/postfix/metadata.py b/bundles/postfix/metadata.py index 1ccf633..f457b9b 100644 --- a/bundles/postfix/metadata.py +++ b/bundles/postfix/metadata.py @@ -14,7 +14,7 @@ defaults = { 'postfix': { 'services': { 'POSTFIX PROCESS': { - 'command_on_monitored_host': '/usr/local/share/icinga/plugins/check_systemd_unit postfix@-', + 'command_on_monitored_host': '/usr/local/share/icinga/plugins/check_systemd_unit postfix' + ('' if node.os_version >= (13,) else '@-'), }, 'POSTFIX QUEUE': { 'command_on_monitored_host': 'sudo /usr/local/share/icinga/plugins/check_postfix_queue -w 20 -c 40 -d 50', From 3bcf7ad714f86bf8dbc32ba9173f61a8c0cfdfc2 Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Sat, 29 Mar 2025 18:13:07 +0100 Subject: [PATCH 201/252] bunndles/sshmon: fix update checks --- bundles/sshmon/files/check_forgejo_for_new_release | 4 ++-- bundles/sshmon/files/check_github_for_new_release | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/bundles/sshmon/files/check_forgejo_for_new_release b/bundles/sshmon/files/check_forgejo_for_new_release index 3db5bcd..99dcd30 100644 --- a/bundles/sshmon/files/check_forgejo_for_new_release +++ b/bundles/sshmon/files/check_forgejo_for_new_release @@ -38,10 +38,10 @@ try: for i in releases: if i["tag_name"].startswith(tag_prefix): - if ( + if not (i["prerelease"] or i["draft"]) and ( newest_release is None or parse(i["tag_name"]) > parse(newest_release["tag_name"]) - ) and not (i["prerelease"] or i["draft"]): + ): newest_release = i assert newest_release is not None, "Could not determine latest release" diff --git a/bundles/sshmon/files/check_github_for_new_release b/bundles/sshmon/files/check_github_for_new_release index 3a50d94..ec510de 100644 --- a/bundles/sshmon/files/check_github_for_new_release +++ b/bundles/sshmon/files/check_github_for_new_release @@ -37,10 +37,10 @@ try: for i in releases: if i["tag_name"].startswith(tag_prefix): - if ( + if not (i["prerelease"] or i["draft"]) and ( newest_release is None or parse(i["tag_name"]) > parse(newest_release["tag_name"]) - ) and not (i["prerelease"] or i["draft"]): + ): newest_release = i assert newest_release is not None, "Could not determine latest release" From 7b51bb57f86d6a36d781f15c5199d1fbf3b178dc Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Sun, 30 Mar 2025 08:59:41 +0200 Subject: [PATCH 202/252] bundles/docker-immich: only start auto-album-share when postgresql is actually running --- bundles/docker-immich/metadata.py | 3 +++ bundles/systemd-timers/files/template.service | 7 +++++-- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/bundles/docker-immich/metadata.py b/bundles/docker-immich/metadata.py index 288b7f1..3952922 100644 --- a/bundles/docker-immich/metadata.py +++ b/bundles/docker-immich/metadata.py @@ -83,6 +83,9 @@ def auto_album_share(metadata): 'command': '/usr/local/bin/immich-auto-album-share.py', 'environment': metadata.get('docker-engine/containers/immich/environment'), 'when': 'minutely', + 'requisite': { + 'docker-immich-postgresql.service', + }, }, }, }, diff --git a/bundles/systemd-timers/files/template.service b/bundles/systemd-timers/files/template.service index 09c3080..271b756 100644 --- a/bundles/systemd-timers/files/template.service +++ b/bundles/systemd-timers/files/template.service @@ -7,8 +7,11 @@ [Unit] Description=Service for Timer ${timer} After=network.target -% if config.get('requires', ''): -Requires=${config['requires']} +% if config.get('requires', set()): +Requires=${' '.join(sorted(config['requires']))} +% endif +% if config.get('requisite', set()): +Requisite=${' '.join(sorted(config['requisite']))} % endif [Service] From 74ca0ad2bc3795e1e4ce81d48aa81fcb78b3ebe3 Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Sun, 30 Mar 2025 09:01:13 +0200 Subject: [PATCH 203/252] bundles/nextcloud: only run cron if postgresql is running --- bundles/nextcloud/metadata.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/bundles/nextcloud/metadata.py b/bundles/nextcloud/metadata.py index 8081cbe..73c7264 100644 --- a/bundles/nextcloud/metadata.py +++ b/bundles/nextcloud/metadata.py @@ -45,6 +45,9 @@ defaults = { 'pwd': '/var/www/nextcloud', 'user': 'www-data', 'when': '*:00/5', + 'requisite': { + 'postgresql.service', + }, }, }, }, From accd2145769ab996694a10f5b0fd860ab6f95515 Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Sun, 30 Mar 2025 09:08:18 +0200 Subject: [PATCH 204/252] bundles/matrix-synapse: remove sliding sync --- bundles/matrix-synapse/items.py | 29 ----------------------------- bundles/matrix-synapse/metadata.py | 12 ------------ nodes/carlene.toml | 4 ---- 3 files changed, 45 deletions(-) diff --git a/bundles/matrix-synapse/items.py b/bundles/matrix-synapse/items.py index 47a9758..527cc5e 100644 --- a/bundles/matrix-synapse/items.py +++ b/bundles/matrix-synapse/items.py @@ -57,32 +57,3 @@ svc_systemd = { }, }, } - -if node.metadata.get('matrix-synapse/sliding_sync/version', None): - files['/usr/local/bin/matrix-sliding-sync'] = { - 'content_type': 'download', - 'source': 'https://github.com/matrix-org/sliding-sync/releases/download/{}/syncv3_linux_amd64'.format( - node.metadata.get('matrix-synapse/sliding_sync/version'), - ), - 'content_hash': node.metadata.get('matrix-synapse/sliding_sync/sha1', None), - 'mode': '0755', - 'triggers': { - 'svc_systemd:matrix-sliding-sync:restart', - }, - } - - files['/usr/local/lib/systemd/system/matrix-sliding-sync.service'] = { - 'content_type': 'mako', - 'triggers': { - 'action:systemd-reload', - 'svc_systemd:matrix-sliding-sync:restart', - }, - } - - svc_systemd['matrix-sliding-sync'] = { - 'needs': { - 'file:/usr/local/bin/matrix-sliding-sync', - 'file:/usr/local/lib/systemd/system/matrix-sliding-sync.service', - 'postgres_db:synapse', - }, - } diff --git a/bundles/matrix-synapse/metadata.py b/bundles/matrix-synapse/metadata.py index 7af43f0..eac3005 100644 --- a/bundles/matrix-synapse/metadata.py +++ b/bundles/matrix-synapse/metadata.py @@ -88,14 +88,6 @@ def nginx(metadata): if not node.has_bundle('nginx'): raise DoNotRunAgain - wellknown_client_sliding_sync = {} - if metadata.get('matrix-synapse/sliding_sync/version', None): - wellknown_client_sliding_sync = { - 'org.matrix.msc3575.proxy': { - 'url': 'https://{}'.format(metadata.get('matrix-synapse/baseurl')), - }, - } - wellknown = { '/.well-known/matrix/client': { 'content': dumps({ @@ -105,7 +97,6 @@ def nginx(metadata): 'm.identity_server': { 'base_url': metadata.get('matrix-synapse/identity_server', 'https://matrix.org'), }, - **wellknown_client_sliding_sync, **metadata.get('matrix-synapse/additional_client_config', {}), }, sort_keys=True), 'return': 200, @@ -134,9 +125,6 @@ def nginx(metadata): 'target': 'http://[::1]:20080', 'max_body_size': '50M', }, - '/_matrix/client/unstable/org.matrix.msc3575/sync': { - 'target': 'http://127.0.0.1:20070', - }, '/_synapse': { 'target': 'http://[::1]:20080', }, diff --git a/nodes/carlene.toml b/nodes/carlene.toml index d936789..0aae01f 100644 --- a/nodes/carlene.toml +++ b/nodes/carlene.toml @@ -81,10 +81,6 @@ server_name = "franzi.business" trusted_key_servers = ["matrix.org", "161.rocks"] additional_client_config.'im.vector.riot.jitsi'.preferredDomain = "meet.ffmuc.net" wellknown_also_on_vhosts = ["franzi.business"] -[metadata.matrix-synapse.sliding_sync] -version = "v0.99.15" -sha1 = "cecb371ff5f1dd528cfc490484a0967dcc28cd82" -secret = "!decrypt:encrypt$gAAAAABl9yJlbEZafJ2mumtg03rW0-440NIgFcgdWGMo3Axrypugwctacy9Cq7MYtCBGjnDyNvVLI5B2QMJ9ssCD46NCsFRN3-X4u9rDtxPhRZV7rls_LQ_Csc_GsffJfvpmHbn_wsljd3I74h4ouWlYhhEQUIKwb3eErSZ_VTZhu_bC4jTa0FY=" [metadata.mautrix-telegram] version = "v0.15.2" From 149d9af16bafb63f913dfb25a8ed2ace176a34aa Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Sun, 30 Mar 2025 09:08:36 +0200 Subject: [PATCH 205/252] update forgejo to 10.0.3 --- nodes/carlene.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/nodes/carlene.toml b/nodes/carlene.toml index 0aae01f..9df6f57 100644 --- a/nodes/carlene.toml +++ b/nodes/carlene.toml @@ -37,8 +37,8 @@ imap_host = "secureimap.t-online.de" imap_pass = "!bwpass_attr:t-online.de/franzi.kunsmann@t-online.de:imap" [metadata.forgejo] -version = "10.0.1" -sha1 = "4bfe8cbe979ef8896e294ca662f4cf62af01531c" +version = "10.0.3" +sha1 = "d1199c43de9e69f6bb8058c15290e79862913413" domain = "git.franzi.business" enable_git_hooks = true install_ssh_key = true From 0685c1a64f5c1d5ae9212f6f9f33faaf7bfe5b18 Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Sun, 30 Mar 2025 09:09:01 +0200 Subject: [PATCH 206/252] aupdate mautrix-whatsapp to 0.11.4 --- nodes/carlene.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/nodes/carlene.toml b/nodes/carlene.toml index 9df6f57..c0e4a61 100644 --- a/nodes/carlene.toml +++ b/nodes/carlene.toml @@ -98,8 +98,8 @@ provisioning.shared_secret = "!decrypt:encrypt$gAAAAABfVKflEMAi07C_QGP8cy97hF-4g "'@kunsi:franzi.business'" = "admin" [metadata.mautrix-whatsapp] -version = "v0.11.3" -sha1 = "f1daba15750313fe205f6d3af2594f11992f0a35" +version = "v0.11.4" +sha1 = "71a064b82072d2cec3d655c8848af418c1f54c77" permissions."'@kunsi:franzi.business'" = "admin" [metadata.mautrix-whatsapp.homeserver] domain = "franzi.business" From 11a9800906627e6b61e36af18f880388e2ea14a4 Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Sun, 30 Mar 2025 09:09:24 +0200 Subject: [PATCH 207/252] update netbox to 4.2.6 --- nodes/carlene.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nodes/carlene.toml b/nodes/carlene.toml index c0e4a61..0eef421 100644 --- a/nodes/carlene.toml +++ b/nodes/carlene.toml @@ -110,7 +110,7 @@ domain = "rss.franzi.business" [metadata.netbox] domain = "netbox.franzi.business" -version = "v4.2.4" +version = "v4.2.6" admins.kunsi = "hostmaster@kunbox.net" [metadata.nextcloud] From 5e32a562ec41519b58702edcf904a851d9cb2fd3 Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Tue, 1 Apr 2025 17:17:18 +0200 Subject: [PATCH 208/252] bundles/nginx: fix error_log logging to file instead of being disabled --- bundles/nginx/files/nginx.conf | 2 +- nodes/home/nas.py | 1 + nodes/home/paperless.py | 1 + 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/bundles/nginx/files/nginx.conf b/bundles/nginx/files/nginx.conf index 7f7bd77..b020d3c 100644 --- a/bundles/nginx/files/nginx.conf +++ b/bundles/nginx/files/nginx.conf @@ -26,7 +26,7 @@ http { send_timeout 10; access_log off; - error_log off; + error_log /dev/null; client_body_buffer_size 16K; client_header_buffer_size 4k; diff --git a/nodes/home/nas.py b/nodes/home/nas.py index b98fb7d..fbc7bbd 100644 --- a/nodes/home/nas.py +++ b/nodes/home/nas.py @@ -168,6 +168,7 @@ nodes['home.nas'] = { 'nginx': { 'vhosts': { 'jellyfin': { + 'create_logs': True, 'domain': 'jellyfin.home.kunbox.net', 'ssl': '_.home.kunbox.net', }, diff --git a/nodes/home/paperless.py b/nodes/home/paperless.py index 654a79e..caffb73 100644 --- a/nodes/home/paperless.py +++ b/nodes/home/paperless.py @@ -42,6 +42,7 @@ nodes['home.paperless'] = { 'nginx': { 'vhosts': { 'paperless': { + 'create_logs': True, 'ssl': '_.home.kunbox.net', }, }, From 5a4c3284b65a2cf90d721352afcea299e0ba27e5 Mon Sep 17 00:00:00 2001 From: Sophie Schiller Date: Thu, 3 Apr 2025 20:08:25 +0200 Subject: [PATCH 209/252] sophie/vmhost: new disksgit add sophie/vmhost.py git add sophie/vmhost.py --- nodes/sophie/vmhost.py | 56 +++++++++++++++++++++++++++++++++++++++++- 1 file changed, 55 insertions(+), 1 deletion(-) diff --git a/nodes/sophie/vmhost.py b/nodes/sophie/vmhost.py index d6e56f3..3fa02ec 100644 --- a/nodes/sophie/vmhost.py +++ b/nodes/sophie/vmhost.py @@ -3,6 +3,7 @@ nodes['sophie.vmhost'] = { 'bundles': { 'backup-client', 'lm-sensors', + 'nfs-server', 'mosquitto', 'smartd', 'vmhost', @@ -12,6 +13,9 @@ nodes['sophie.vmhost'] = { 'debian-bookworm', }, 'metadata': { + 'groups': { + 'nas': {}, + }, 'interfaces': { 'br1': { 'ips': { @@ -49,11 +53,27 @@ nodes['sophie.vmhost'] = { '172.19.164.0/24', }, }, + 'nfs-server': { + 'shares': { + '/srv/nas': { + '172.19.164.0/24': 'ro,all_squash,anonuid=65534,anongid=65534,no_subtree_check', + }, + }, + }, + 'smartd': { + 'disks': { + '/dev/nvme0', + + # nas disks + '/dev/disk/by-id/ata-ST20000NM007D-3DJ103_ZVT7BHBQ', + '/dev/disk/by-id/ata-ST20000NM007D-3DJ103_ZVT7D6JP', + }, + }, 'systemd-networkd': { 'bridges': { 'br0': { 'match': { - 'eno1', + 'enp1s0', }, }, 'br1': { @@ -63,6 +83,26 @@ nodes['sophie.vmhost'] = { }, }, }, + 'systemd-timers': { + 'timers': { + # Ensure every user is able to read and write to the NAS dataset. + 'nas_permissions': { + 'command': [ + 'chown -R :nas /srv/nas/', + r'find /srv/nas/ -type d -exec chmod 0775 {} \;', + r'find /srv/nas/ -type f -exec chmod 0664 {} \;', + ], + 'when': '*-*-* 02:00:00', + }, + }, + }, + 'users': { + 'sophie': { + 'groups': { + 'nas', + }, + }, + }, 'zfs': { 'pools': { 'storage': { @@ -73,12 +113,26 @@ nodes['sophie.vmhost'] = { }, }] } + }, + 'nas': { + 'when_creating': { + 'config': [{ + 'type': 'mirror', + 'devices': { + '/dev/disk/by-id/ata-ST20000NM007D-3DJ103_ZVT7BHBQ', + '/dev/disk/by-id/ata-ST20000NM007D-3DJ103_ZVT7D6JP', + }, + }] + } } }, "datasets": { "storage/libvirt": { "mountpoint": "/var/lib/libvirt", }, + "nas": { + "mountpoint": "/srv/nas", + }, }, }, }, From 1f120b9923b484a18edd6bc06597bc33959cd515 Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Tue, 1 Apr 2025 19:52:34 +0200 Subject: [PATCH 210/252] bundles/samba: fix timemachine backups dependencies --- bundles/samba/items.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/bundles/samba/items.py b/bundles/samba/items.py index a9567b4..5c60c69 100644 --- a/bundles/samba/items.py +++ b/bundles/samba/items.py @@ -82,4 +82,7 @@ if timemachine_shares: 'owner': f'timemachine-{share_name}', 'group': f'timemachine-{share_name}', 'mode': '0700', + 'needs': { + f'zfs_dataset:tank/timemachine/{share_name}', + }, } From fd1ad352d0d56dae48a1f662fe10a0b5e3565fdf Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Fri, 4 Apr 2025 15:00:05 +0200 Subject: [PATCH 211/252] add revision-dect-vpn --- libs/s2s.py | 2 +- nodes/htz-cloud/wireguard.py | 8 ++++++++ nodes/revision-dect-vpn.toml | 26 ++++++++++++++++++++++++++ 3 files changed, 35 insertions(+), 1 deletion(-) create mode 100644 nodes/revision-dect-vpn.toml diff --git a/libs/s2s.py b/libs/s2s.py index d7c9e9f..fe0fc4e 100644 --- a/libs/s2s.py +++ b/libs/s2s.py @@ -5,7 +5,7 @@ AS_NUMBERS = { 'home': 4290000138, 'htz-cloud': 4290000137, 'ionos': 4290000002, - 'glauca': 4290207960, + 'revision': 4290000078, } WG_AUTOGEN_NODES = [ diff --git a/nodes/htz-cloud/wireguard.py b/nodes/htz-cloud/wireguard.py index d7f97ff..3ceaf2d 100644 --- a/nodes/htz-cloud/wireguard.py +++ b/nodes/htz-cloud/wireguard.py @@ -51,6 +51,7 @@ nodes['htz-cloud.wireguard'] = { '50-wireguard': [ 'udp dport 1194 accept', 'udp dport 51800 accept', + 'udp dport 51804 accept', # wg.c3voc.de 'udp dport 51801 ip saddr 185.106.84.42 accept', @@ -117,6 +118,13 @@ nodes['htz-cloud.wireguard'] = { 'psk': vault.decrypt('encrypt$gAAAAABnc7LZSHWmOOQJpbtnpMn9QuWnbiB-6rShwgqbilVd45GzkUwOfEHBw28P_TVm9XJgFiQPOIo12DdxPCzSxKRtcqzji72QCzTlze4ZYWjL-iHm7TydLcKzXOTCO42LKpkMPUgR'), 'pubkey': vault.decrypt('encrypt$gAAAAABnc7LZpfAeig8yCdcZ-NegshXl-DmkJr0F2OlQR2fqhVnrfKPjgOu-5Cq09KnhdvhomGx_9ZtoFS_3OsVqcFHEasBh27aQN41xZPzEN5-qIPQRnmVoTHpufcU6tC-37Fq-PeAE'), }, + 'revision-dect-vpn': { + 'endpoint': None, + 'exclude_from_monitoring': True, + 'my_port': 51804, + 'my_ip': '172.19.136.66', + 'their_ip': '172.19.136.67', + }, }, }, }, diff --git a/nodes/revision-dect-vpn.toml b/nodes/revision-dect-vpn.toml new file mode 100644 index 0000000..5789358 --- /dev/null +++ b/nodes/revision-dect-vpn.toml @@ -0,0 +1,26 @@ +hostname = "10.1.3.252" +bundles = ["bird", "wireguard"] +groups = ["debian-bookworm"] + +[metadata] +location = "revision" +icinga_options.exclude_from_monitoring = true + +[metadata.bird] +static_routes = [ + "10.1.3.0/24", +] + +[metadata.interfaces.ens18] +ips = ["10.1.3.252/24"] +gateway4 = "10.1.3.1" + +[metadata.nftables.postrouting] +"50-router" = [ + "oifname ens18 masquerade", +] + +[metadata.wireguard.peers."htz-cloud.wireguard"] +my_port = 51804 +my_ip = "172.19.136.67" +their_ip = "172.19.136.66" From e1548ff61ee5fff174e1a4b1dfc6f037b019fcac Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Fri, 4 Apr 2025 17:17:11 +0200 Subject: [PATCH 212/252] bundles/samba: cannot have time machine and 'guest ok' shares on the same machine --- bundles/samba/items.py | 3 +++ nodes/home/nas.py | 18 ------------------ 2 files changed, 3 insertions(+), 18 deletions(-) diff --git a/bundles/samba/items.py b/bundles/samba/items.py index 5c60c69..2f5090e 100644 --- a/bundles/samba/items.py +++ b/bundles/samba/items.py @@ -66,6 +66,9 @@ for user, uconfig in node.metadata.get('users', {}).items(): if timemachine_shares: assert node.has_bundle('avahi-daemon'), f'{node.name}: samba needs avahi-daemon to publish time machine shares' + for share, share_config in node.metadata.get('samba/shares', {}).items(): + assert not share_config.get('guest_ok', True), f'{node.name} samba {share}: cannot have time machine shares and "guest ok" shares on the same machine' + files['/etc/avahi/services/timemachine.service'] = { 'content_type': 'mako', 'context': { diff --git a/nodes/home/nas.py b/nodes/home/nas.py index fbc7bbd..93fb47f 100644 --- a/nodes/home/nas.py +++ b/nodes/home/nas.py @@ -180,24 +180,6 @@ nodes['home.nas'] = { }, }, 'samba': { - 'shares': { - 'C3VOC': { - 'path': '/storage/nas/C3VOC', - 'force_group': 'nas', - }, - 'TV': { - 'path': '/storage/nas/TV', - 'force_group': 'nas', - }, - 'music': { - 'path': '/storage/nas/Musik', - 'force_group': 'nas', - }, - 'music_videos': { - 'path': '/storage/nas/Musikvideos', - 'force_group': 'nas', - }, - }, 'restrict-to': { '172.19.138.0/24', }, From 75e3ae91eab51b03a76fcab5bf7aed2d4b4b541b Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Fri, 4 Apr 2025 17:18:03 +0200 Subject: [PATCH 213/252] home.nas: add timemachine share for verrat --- nodes/home/nas.py | 1 + 1 file changed, 1 insertion(+) diff --git a/nodes/home/nas.py b/nodes/home/nas.py index 93fb47f..13694e6 100644 --- a/nodes/home/nas.py +++ b/nodes/home/nas.py @@ -185,6 +185,7 @@ nodes['home.nas'] = { }, 'timemachine-shares': { 'apfelcomputer', + 'verrat', }, }, 'smartd': { From ad909120747f0a69ff41f27804ab8a6099bf6745 Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Fri, 4 Apr 2025 17:19:37 +0200 Subject: [PATCH 214/252] revision-dect-vpn: does not need to do backups --- nodes/revision-dect-vpn.toml | 1 + 1 file changed, 1 insertion(+) diff --git a/nodes/revision-dect-vpn.toml b/nodes/revision-dect-vpn.toml index 5789358..1340297 100644 --- a/nodes/revision-dect-vpn.toml +++ b/nodes/revision-dect-vpn.toml @@ -4,6 +4,7 @@ groups = ["debian-bookworm"] [metadata] location = "revision" +backups.exclude_from_backups = true icinga_options.exclude_from_monitoring = true [metadata.bird] From d584fd88d781f382bb222381c056b3f70c6a775c Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Fri, 4 Apr 2025 18:12:16 +0200 Subject: [PATCH 215/252] update travelynx to 2.11.13 --- nodes/carlene.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nodes/carlene.toml b/nodes/carlene.toml index 0eef421..fb6d22a 100644 --- a/nodes/carlene.toml +++ b/nodes/carlene.toml @@ -245,7 +245,7 @@ disks = [ ] [metadata.travelynx] -version = "2.10.2" +version = "2.11.13" mail_from = "travelynx@franzi.business" domain = "travelynx.franzi.business" From c905b7dc132f87565440461f06dbcb7db2a6aa5c Mon Sep 17 00:00:00 2001 From: Sophie Schiller Date: Sat, 5 Apr 2025 20:15:50 +0200 Subject: [PATCH 216/252] bw/nfs close ports no longer needed for nfs4 --- bundles/nfs-server/metadata.py | 5 ++++- nodes/sophie/vmhost.py | 6 ++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/bundles/nfs-server/metadata.py b/bundles/nfs-server/metadata.py index 73dc68a..d2f833c 100644 --- a/bundles/nfs-server/metadata.py +++ b/bundles/nfs-server/metadata.py @@ -33,7 +33,10 @@ def firewall(metadata): ips.add(share_target) rules = {} - for port in ('111', '2049', '1110', '4045', '35295'): + ports = ('111', '2049', '1110', '4045', '35295') + if metadata.get('nfs-server/version', 3) == 4: + ports = ('111', '2049') + for port in ports: for proto in ('/tcp', '/udp'): rules[port + proto] = atomic(ips) diff --git a/nodes/sophie/vmhost.py b/nodes/sophie/vmhost.py index 3fa02ec..aca520c 100644 --- a/nodes/sophie/vmhost.py +++ b/nodes/sophie/vmhost.py @@ -13,6 +13,11 @@ nodes['sophie.vmhost'] = { 'debian-bookworm', }, 'metadata': { + 'apt': { + 'packages': { + 'irqbalance': {}, + }, + }, 'groups': { 'nas': {}, }, @@ -54,6 +59,7 @@ nodes['sophie.vmhost'] = { }, }, 'nfs-server': { + 'version': 4, 'shares': { '/srv/nas': { '172.19.164.0/24': 'ro,all_squash,anonuid=65534,anongid=65534,no_subtree_check', From a15740c89972723879463b4be67f6055e390ee13 Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Wed, 16 Apr 2025 09:02:18 +0200 Subject: [PATCH 217/252] bundles/backup-server: improve --- .../files/check_backup_for_node-cron | 15 +++--- bundles/backup-server/metadata.py | 53 ++++++------------- 2 files changed, 22 insertions(+), 46 deletions(-) diff --git a/bundles/backup-server/files/check_backup_for_node-cron b/bundles/backup-server/files/check_backup_for_node-cron index b82217d..ff1a368 100644 --- a/bundles/backup-server/files/check_backup_for_node-cron +++ b/bundles/backup-server/files/check_backup_for_node-cron @@ -15,16 +15,15 @@ for line in check_output('LC_ALL=C zfs list -H -t snapshot -o name', shell=True) line = line.decode('UTF-8') if line.startswith('{}/'.format(server_settings['zfs-base'])): - dataset, snapname = line.split('@', 1) + try: + dataset, snapname = line.split('@', 1) - dataset = dataset.split('/')[-1] - ts, bucket = snapname.split('-', 1) + dataset = dataset.split('/')[-1] + ts, bucket = snapname.split('-', 1) - if not ts.isdigit(): - # garbage, ignore - continue - - snapshots[dataset].add(int(ts)) + snapshots[dataset].add(int(ts)) + except Exception as e: + print(f"Exception while parsing snapshot name {line!r}: {e!r}") backups = {} for dataset, snaps in snapshots.items(): diff --git a/bundles/backup-server/metadata.py b/bundles/backup-server/metadata.py index aace61b..6714288 100644 --- a/bundles/backup-server/metadata.py +++ b/bundles/backup-server/metadata.py @@ -83,47 +83,24 @@ def zfs_pool(metadata): devices = metadata.get('backup-server/encrypted-devices') - # TODO remove this once we have migrated all systems - if isinstance(devices, dict): - pool_devices = set() + pool_devices = set() - for number, (device, passphrase) in enumerate(sorted(devices.items())): - crypt_devices[device] = { - 'dm-name': f'backup{number}', - 'passphrase': passphrase, - } - pool_devices.add(f'/dev/mapper/backup{number}') - unlock_actions.add(f'action:dm-crypt_open_backup{number}') + for device, dconfig in devices.items(): + crypt_devices[dconfig['device']] = { + 'dm-name': f'backup-{device}', + 'passphrase': dconfig['passphrase'], + } + pool_devices.add(f'/dev/mapper/backup-{device}') + unlock_actions.add(f'action:dm-crypt_open_backup-{device}') - pool_config = [{ - 'devices': pool_devices, - }] + pool_config = [{ + 'devices': pool_devices, + }] - if len(pool_devices) > 2: - pool_config[0]['type'] = 'raidz' - elif len(pool_devices) > 1: - pool_config[0]['type'] = 'mirror' - - elif isinstance(devices, list): - pool_config = [] - - for idx, intended_pool in enumerate(devices): - pool_devices = set() - - for number, (device, passphrase) in enumerate(sorted(intended_pool.items())): - crypt_devices[device] = { - 'dm-name': f'backup{idx}-{number}', - 'passphrase': passphrase, - } - pool_devices.add(f'/dev/mapper/backup{idx}-{number}') - unlock_actions.add(f'action:dm-crypt_open_backup{idx}-{number}') - - pool_config.append({ - 'devices': pool_devices, - 'type': 'raidz', - }) - else: - raise BundleError(f'{node.name}: unsupported configuration for backup-server/encrypted-devices') + if len(pool_devices) > 2: + pool_config[0]['type'] = 'raidz' + elif len(pool_devices) > 1: + pool_config[0]['type'] = 'mirror' return { 'backup-server': { From a34f3a8d980b8b69e8a3577a5d27c93e7a7eaf50 Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Wed, 16 Apr 2025 09:03:23 +0200 Subject: [PATCH 218/252] backup-kunsi: new disks --- nodes/backup-kunsi.toml | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/nodes/backup-kunsi.toml b/nodes/backup-kunsi.toml index 3e17bd7..4a47ae4 100644 --- a/nodes/backup-kunsi.toml +++ b/nodes/backup-kunsi.toml @@ -22,15 +22,17 @@ exclude_from_backups = true [metadata.backup-server.zpool_create_options] ashift = 12 -[[metadata.backup-server.encrypted-devices]] -"/dev/disk/by-id/scsi-0QEMU_QEMU_HARDDISK_drive-scsi1-part1" = "!bwpass:bw/backup-kunsi/ata-ST18000NM0092-3CX103_ZVV06SLR-part1" -"/dev/disk/by-id/scsi-0QEMU_QEMU_HARDDISK_drive-scsi2-part1" = "!bwpass:bw/backup-kunsi/ata-ST18000NM0092-3CX103_ZVV0686W-part1" -"/dev/disk/by-id/scsi-0QEMU_QEMU_HARDDISK_drive-scsi3-part1" = "!bwpass:bw/backup-kunsi/ata-ST18000NM0092-3CX103_ZVV06JV7-part1" +[metadata.backup-server.encrypted-devices.WVT0RNKF] +device = "/dev/disk/by-id/scsi-0QEMU_QEMU_HARDDISK_drive-scsi4" +passphrase = "!bwpass:bw/backup-kunsi/ata-ST20000NM007D-3DJ103_WVT0RNKF" -[[metadata.backup-server.encrypted-devices]] -"/dev/disk/by-id/scsi-0QEMU_QEMU_HARDDISK_drive-scsi1-part2" = "!bwpass:bw/backup-kunsi/ata-ST18000NM0092-3CX103_ZVV06SLR-part2" -"/dev/disk/by-id/scsi-0QEMU_QEMU_HARDDISK_drive-scsi2-part2" = "!bwpass:bw/backup-kunsi/ata-ST18000NM0092-3CX103_ZVV0686W-part2" -"/dev/disk/by-id/scsi-0QEMU_QEMU_HARDDISK_drive-scsi3-part2" = "!bwpass:bw/backup-kunsi/ata-ST18000NM0092-3CX103_ZVV06JV7-part2" +[metadata.backup-server.encrypted-devices.WVT0V0NQ] +device = "/dev/disk/by-id/scsi-0QEMU_QEMU_HARDDISK_drive-scsi5" +passphrase = "!bwpass:bw/backup-kunsi/ata-ST20000NM007D-3DJ103_WVT0V0NQ" + +[metadata.backup-server.encrypted-devices.WVT0W64H] +device = "/dev/disk/by-id/scsi-0QEMU_QEMU_HARDDISK_drive-scsi6" +passphrase = "!bwpass:bw/backup-kunsi/ata-ST20000NM007D-3DJ103_WVT0W64H" [metadata.zfs] scrub_when = "Wed 08:00 Europe/Berlin" From af5a75e0656793e7f250c25f64f14f4963278842 Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Wed, 16 Apr 2025 09:03:53 +0200 Subject: [PATCH 219/252] home.nas: change storage layout --- nodes/home/downloadhelper.py | 2 +- nodes/home/nas.py | 99 ++++++++++++++---------------------- 2 files changed, 38 insertions(+), 63 deletions(-) diff --git a/nodes/home/downloadhelper.py b/nodes/home/downloadhelper.py index 4874561..4bd2f10 100644 --- a/nodes/home/downloadhelper.py +++ b/nodes/home/downloadhelper.py @@ -42,7 +42,7 @@ nodes['home.downloadhelper'] = { 'mounts': { 'storage': { 'mountpoint': '/mnt/nas', - 'serverpath': '172.19.138.20:/storage/download', + 'serverpath': '172.19.138.20:/mnt/download', 'mount_options': { 'retry=0', 'rw', diff --git a/nodes/home/nas.py b/nodes/home/nas.py index 13694e6..2f210d6 100644 --- a/nodes/home/nas.py +++ b/nodes/home/nas.py @@ -5,7 +5,6 @@ nodes['home.nas'] = { 'bundles': { 'avahi-daemon', 'backup-client', - 'dm-crypt', 'jellyfin', 'lm-sensors', 'mixcloud-downloader', @@ -69,22 +68,6 @@ nodes['home.nas'] = { 'avahi-aruba-fixup': '17,47 * * * * root /usr/bin/systemctl restart avahi-daemon.service', }, }, - 'dm-crypt': { - 'encrypted-devices': { - '/dev/disk/by-id/ata-Samsung_SSD_870_QVO_8TB_S5SSNJ0X409404K': { - 'dm-name': 'sam-S5SSNJ0X409404K', - 'passphrase': bwpass.password('bw/home.nas/dmcrypt/S5SSNJ0X409404K'), - }, - '/dev/disk/by-id/ata-Samsung_SSD_870_QVO_8TB_S5SSNJ0X409845F': { - 'dm-name': 'sam-S5SSNJ0X409845F', - 'passphrase': bwpass.password('bw/home.nas/dmcrypt/S5SSNJ0X409845F'), - }, - '/dev/disk/by-id/ata-Samsung_SSD_870_QVO_8TB_S5SSNJ0X409870J': { - 'dm-name': 'sam-S5SSNJ0X409870J', - 'passphrase': bwpass.password('bw/home.nas/dmcrypt/S5SSNJ0X409870J'), - }, - }, - }, 'groups': { 'nas': {}, }, @@ -154,7 +137,7 @@ nodes['home.nas'] = { }, 'nfs-server': { 'shares': { - '/storage/download': { + '/mnt/download': { 'home.downloadhelper': 'rw,all_squash,anonuid=65534,anongid=1012,no_subtree_check', }, '/storage/nas': { @@ -192,7 +175,7 @@ nodes['home.nas'] = { 'disks': { '/dev/nvme0', - # old nas disks + # nas/timemachine disks '/dev/disk/by-id/ata-WDC_WD6003FFBX-68MU3N0_V8GE15GR', '/dev/disk/by-id/ata-WDC_WD6003FFBX-68MU3N0_V8HJ406R', '/dev/disk/by-id/ata-WDC_WD6003FFBX-68MU3N0_V8HJBTLR', @@ -200,10 +183,9 @@ nodes['home.nas'] = { '/dev/disk/by-id/ata-WDC_WD6003FFBX-68MU3N0_V8J8ZKRR', '/dev/disk/by-id/ata-WDC_WD6003FFBX-68MU3N0_V9JS5UYL', - # encrypted disks - '/dev/disk/by-id/ata-Samsung_SSD_870_QVO_8TB_S5SSNJ0X409404K', - '/dev/disk/by-id/ata-Samsung_SSD_870_QVO_8TB_S5SSNJ0X409845F', - '/dev/disk/by-id/ata-Samsung_SSD_870_QVO_8TB_S5SSNJ0X409870J', + # ssdpool disks + '/dev/disk/by-id/ata-INTEL_SSDSC2KB960G8_PHYF244001QU960CGN', + '/dev/disk/by-id/ata-INTEL_SSDSC2KB960G8_PHYF244002AS960CGN', }, }, 'systemd-networkd': { @@ -258,6 +240,20 @@ nodes['home.nas'] = { 'zfs_arc_max_gb': 8, }, 'pools': { + 'ssdpool': { + 'when_creating': { + 'config': [ + { + 'type': 'mirror', + 'devices': { + '/dev/disk/by-id/ata-INTEL_SSDSC2KB960G8_PHYF244001QU960CGN', + '/dev/disk/by-id/ata-INTEL_SSDSC2KB960G8_PHYF244002AS960CGN', + }, + }, + ], + 'ashift': 12, + }, + }, 'tank': { 'when_creating': { 'config': [ @@ -276,67 +272,46 @@ nodes['home.nas'] = { 'ashift': 12, }, }, - 'encrypted': { - 'when_creating': { - 'config': [ - { - 'type': 'raidz', - 'devices': { - '/dev/mapper/sam-S5SSNJ0X409404K', - '/dev/mapper/sam-S5SSNJ0X409845F', - '/dev/mapper/sam-S5SSNJ0X409870J', - }, - }, - ], - 'ashift': 12, - }, - 'needs': { - 'action:dm-crypt_open_sam-S5SSNJ0X409404K', - 'action:dm-crypt_open_sam-S5SSNJ0X409845F', - 'action:dm-crypt_open_sam-S5SSNJ0X409870J', - }, - # see comment in bundle:backup-server - 'unless': 'zpool import encrypted', - }, }, 'datasets': { - 'encrypted': { + 'ssdpool': { 'primarycache': 'metadata', }, - 'encrypted/nas': { + 'ssdpool/yate': { + 'mountpoint': '/opt/yate', + }, + 'ssdpool/download': { + 'mountpoint': '/mnt/download', + 'quota': '858993459200', # 800 GB + }, + 'ssdpool/paperless': { + 'mountpoint': '/srv/paperless', + }, + 'tank': { + 'primarycache': 'metadata', + }, + 'tank/nas': { 'acltype': 'off', 'atime': 'off', 'compression': 'off', 'mountpoint': '/storage/nas', }, - 'tank': { - 'primarycache': 'metadata', - }, - 'tank/opt-yate': { - 'mountpoint': '/opt/yate', - }, - 'tank/download': { - 'mountpoint': '/storage/download', - }, - 'tank/paperless': { - 'mountpoint': '/srv/paperless', - }, }, 'snapshots': { 'retain_per_dataset': { - 'encrypted/nas': { + 'tank/nas': { # juuuuuuuust to be sure. 'daily': 14, 'weekly': 6, 'monthly': 12, }, - 'tank/download': { + 'ssdpool/download': { 'hourly': 48, 'daily': 0, 'weekly': 0, 'monthly': 0, }, - 'tank/paperless': { + 'ssdpool/paperless': { 'daily': 14, 'weekly': 6, 'monthly': 24, From 6f902c5c7b6c1e1852e086626b538964d59fac4d Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Wed, 16 Apr 2025 09:04:17 +0200 Subject: [PATCH 220/252] proxmox-backupstorage: more disks --- nodes/proxmox-backupstorage.toml | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/nodes/proxmox-backupstorage.toml b/nodes/proxmox-backupstorage.toml index eee0256..7f10946 100644 --- a/nodes/proxmox-backupstorage.toml +++ b/nodes/proxmox-backupstorage.toml @@ -14,6 +14,18 @@ check_command = "sshmon" check_command = "sshmon" "vars.sshmon_command" = "CT480BX500SSD1_2314E6C5C6C8" +[metadata.icinga2_api.smartd.services."SMART STATUS ST20000NM007D-3DJ103_WVT0RNKF"] +check_command = "sshmon" +"vars.sshmon_command" = "ST20000NM007D-3DJ103_WVT0RNKF" + +[metadata.icinga2_api.smartd.services."SMART STATUS ST20000NM007D-3DJ103_WVT0V0NQ"] +check_command = "sshmon" +"vars.sshmon_command" = "ST20000NM007D-3DJ103_WVT0V0NQ" + +[metadata.icinga2_api.smartd.services."SMART STATUS ST20000NM007D-3DJ103_WVT0W64H"] +check_command = "sshmon" +"vars.sshmon_command" = "ST20000NM007D-3DJ103_WVT0W64H" + [metadata.icinga2_api.smartd.services."SMART STATUS ST18000NM0092-3CX103_ZVV0686W"] check_command = "sshmon" "vars.sshmon_command" = "ST18000NM0092-3CX103_ZVV0686W" From 80a5d3563a70bc8d423b82c48fc3ad48bd5c05db Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Wed, 16 Apr 2025 09:07:18 +0200 Subject: [PATCH 221/252] htz-cloud.wireguard: also announce ip we're routing --- nodes/htz-cloud/wireguard.py | 1 + 1 file changed, 1 insertion(+) diff --git a/nodes/htz-cloud/wireguard.py b/nodes/htz-cloud/wireguard.py index 3ceaf2d..e560667 100644 --- a/nodes/htz-cloud/wireguard.py +++ b/nodes/htz-cloud/wireguard.py @@ -37,6 +37,7 @@ nodes['htz-cloud.wireguard'] = { '172.19.137.0/24', '172.19.136.62/31', '172.19.136.64/31', + '172.19.136.66/31', '192.168.100.0/24', }, }, From 4bc94987a761aaba6cf778ce989c8242696edc59 Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Wed, 16 Apr 2025 09:07:45 +0200 Subject: [PATCH 222/252] carlene: add 42c3 topic timer --- nodes/carlene.toml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/nodes/carlene.toml b/nodes/carlene.toml index fb6d22a..3457ef6 100644 --- a/nodes/carlene.toml +++ b/nodes/carlene.toml @@ -244,6 +244,11 @@ disks = [ "/dev/disk/by-id/nvme-SAMSUNG_MZVL22T0HBLB-00B00_S677NX0W114380", ] +[metadata.systemd-timers.timers.42c3-topic] +command = "/home/kunsi/42c3-topic.sh" +user = "kunsi" +when = "04:00:00 Europe/Berlin" + [metadata.travelynx] version = "2.11.13" mail_from = "travelynx@franzi.business" From 1af04b684657fae6e50e68c468540d9b10f777fe Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Wed, 23 Apr 2025 10:56:17 +0200 Subject: [PATCH 223/252] update forgejo to 11.0.0 --- nodes/carlene.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/nodes/carlene.toml b/nodes/carlene.toml index 3457ef6..ed051fb 100644 --- a/nodes/carlene.toml +++ b/nodes/carlene.toml @@ -37,8 +37,8 @@ imap_host = "secureimap.t-online.de" imap_pass = "!bwpass_attr:t-online.de/franzi.kunsmann@t-online.de:imap" [metadata.forgejo] -version = "10.0.3" -sha1 = "d1199c43de9e69f6bb8058c15290e79862913413" +version = "11.0.0" +sha1 = "3a12529ab21ca04f2b3e6cf7a6c91af18f00ee5d" domain = "git.franzi.business" enable_git_hooks = true install_ssh_key = true From a999071cca1c9c1a8d88dceb812af019979117a5 Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Wed, 23 Apr 2025 10:56:34 +0200 Subject: [PATCH 224/252] update mautrix-whatsapp to 0.12.0 --- nodes/carlene.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/nodes/carlene.toml b/nodes/carlene.toml index ed051fb..f98154c 100644 --- a/nodes/carlene.toml +++ b/nodes/carlene.toml @@ -98,8 +98,8 @@ provisioning.shared_secret = "!decrypt:encrypt$gAAAAABfVKflEMAi07C_QGP8cy97hF-4g "'@kunsi:franzi.business'" = "admin" [metadata.mautrix-whatsapp] -version = "v0.11.4" -sha1 = "71a064b82072d2cec3d655c8848af418c1f54c77" +version = "v0.12.0" +sha1 = "02094da0a164099d4d35e5edb4b87875ad694833" permissions."'@kunsi:franzi.business'" = "admin" [metadata.mautrix-whatsapp.homeserver] domain = "franzi.business" From 19d80513915cfc0810c3bbe60fd6216b5e8485e0 Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Wed, 23 Apr 2025 10:57:03 +0200 Subject: [PATCH 225/252] update netbox to 4.2.8 --- bundles/netbox/items.py | 4 ++-- nodes/carlene.toml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/bundles/netbox/items.py b/bundles/netbox/items.py index f261641..9edbf0b 100644 --- a/bundles/netbox/items.py +++ b/bundles/netbox/items.py @@ -38,8 +38,8 @@ actions['netbox_install'] = { 'triggered': True, 'command': ' && '.join([ 'cd /opt/netbox/src', - '/opt/netbox/venv/bin/pip install --upgrade pip wheel setuptools django-auth-ldap gunicorn', - '/opt/netbox/venv/bin/pip install --upgrade -r requirements.txt', + '/opt/netbox/venv/bin/pip install --upgrade --upgrade-strategy=eager pip wheel setuptools django-auth-ldap gunicorn', + '/opt/netbox/venv/bin/pip install --upgrade --upgrade-strategy=eager -r requirements.txt', ]), 'needs': { 'pkg_apt:build-essential', diff --git a/nodes/carlene.toml b/nodes/carlene.toml index f98154c..9c79e23 100644 --- a/nodes/carlene.toml +++ b/nodes/carlene.toml @@ -110,7 +110,7 @@ domain = "rss.franzi.business" [metadata.netbox] domain = "netbox.franzi.business" -version = "v4.2.6" +version = "v4.2.8" admins.kunsi = "hostmaster@kunbox.net" [metadata.nextcloud] From f72f701a5a92e1b24d8303132599320740f6ead0 Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Wed, 23 Apr 2025 10:57:24 +0200 Subject: [PATCH 226/252] update paperless-ngx to 2.15.3 --- bundles/paperless-ng/files/paperless-webserver.service | 5 ++++- bundles/paperless-ng/metadata.py | 2 +- nodes/home/paperless.py | 2 +- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/bundles/paperless-ng/files/paperless-webserver.service b/bundles/paperless-ng/files/paperless-webserver.service index 5d7f806..7c41aa7 100644 --- a/bundles/paperless-ng/files/paperless-webserver.service +++ b/bundles/paperless-ng/files/paperless-webserver.service @@ -8,8 +8,11 @@ Requires=redis.service User=paperless Group=paperless Environment=PAPERLESS_CONFIGURATION_PATH=/opt/paperless/paperless.conf +Environment=GRANIAN_PORT=22070 +Environment=GRANIAN_WORKERS=4 +Environment=GRANIAN_HOST=::1 WorkingDirectory=/opt/paperless/src/paperless-ngx/src -ExecStart=/opt/paperless/venv/bin/gunicorn -c /opt/paperless/src/paperless-ngx/gunicorn.conf.py -b 127.0.0.1:22070 paperless.asgi:application +ExecStart=/opt/paperless/venv/bin/granian --interface asginl --ws "paperless.asgi:application" Restart=always RestartSec=10 SyslogIdentifier=paperless-webserver diff --git a/bundles/paperless-ng/metadata.py b/bundles/paperless-ng/metadata.py index 6746616..8db5342 100644 --- a/bundles/paperless-ng/metadata.py +++ b/bundles/paperless-ng/metadata.py @@ -99,7 +99,7 @@ def nginx(metadata): 'domain': metadata.get('paperless/domain'), 'locations': { '/': { - 'target': 'http://127.0.0.1:22070', + 'target': 'http://[::1]:22070', 'websockets': True, 'proxy_set_header': { 'X-Forwarded-Host': '$server_name', diff --git a/nodes/home/paperless.py b/nodes/home/paperless.py index caffb73..f7035a5 100644 --- a/nodes/home/paperless.py +++ b/nodes/home/paperless.py @@ -49,7 +49,7 @@ nodes['home.paperless'] = { }, 'paperless': { 'domain': 'paperless.home.kunbox.net', - 'version': 'v2.14.7', + 'version': 'v2.15.3', 'timezone': 'Europe/Berlin', }, 'postgresql': { From 3ec701b2b6dc0bc73174f76207247dcb6e90520c Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Wed, 23 Apr 2025 10:58:10 +0200 Subject: [PATCH 227/252] add rottenraptor vpn --- libs/s2s.py | 1 + nodes/htz-cloud/wireguard.py | 8 ++++++++ nodes/rottenraptor-vpn.toml | 27 +++++++++++++++++++++++++++ 3 files changed, 36 insertions(+) create mode 100644 nodes/rottenraptor-vpn.toml diff --git a/libs/s2s.py b/libs/s2s.py index fe0fc4e..8372ec2 100644 --- a/libs/s2s.py +++ b/libs/s2s.py @@ -6,6 +6,7 @@ AS_NUMBERS = { 'htz-cloud': 4290000137, 'ionos': 4290000002, 'revision': 4290000078, + 'rottenraptor': 4290000030, } WG_AUTOGEN_NODES = [ diff --git a/nodes/htz-cloud/wireguard.py b/nodes/htz-cloud/wireguard.py index e560667..1139390 100644 --- a/nodes/htz-cloud/wireguard.py +++ b/nodes/htz-cloud/wireguard.py @@ -53,6 +53,7 @@ nodes['htz-cloud.wireguard'] = { 'udp dport 1194 accept', 'udp dport 51800 accept', 'udp dport 51804 accept', + 'udp dport 51805 accept', # wg.c3voc.de 'udp dport 51801 ip saddr 185.106.84.42 accept', @@ -126,6 +127,13 @@ nodes['htz-cloud.wireguard'] = { 'my_ip': '172.19.136.66', 'their_ip': '172.19.136.67', }, + 'rottenraptor-vpn': { + 'endpoint': None, + 'exclude_from_monitoring': True, + 'my_port': 51805, + 'my_ip': '172.19.136.68', + 'their_ip': '172.19.136.69', + }, }, }, }, diff --git a/nodes/rottenraptor-vpn.toml b/nodes/rottenraptor-vpn.toml new file mode 100644 index 0000000..342ce1c --- /dev/null +++ b/nodes/rottenraptor-vpn.toml @@ -0,0 +1,27 @@ +hostname = "172.30.17.53" +bundles = ["bird", "wireguard"] +groups = ["debian-bookworm"] + +[metadata] +location = "rottenraptor" +backups.exclude_from_backups = true +icinga_options.exclude_from_monitoring = true + +[metadata.bird] +static_routes = [ + "172.30.17.0/24", +] + +[metadata.interfaces.ens18] +ips = ["172.30.17.53/24"] +gateway4 = "172.30.17.1" + +[metadata.nftables.postrouting] +"50-router" = [ + "oifname ens18 masquerade", +] + +[metadata.wireguard.peers."htz-cloud.wireguard"] +my_port = 51804 +my_ip = "172.19.136.69" +their_ip = "172.19.136.68" From 3d643efe0fb7b455f1ab7dff1a26895a7c7957f1 Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Wed, 23 Apr 2025 11:05:48 +0200 Subject: [PATCH 228/252] bundles/zfs: fix dependencies --- bundles/zfs/items.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/bundles/zfs/items.py b/bundles/zfs/items.py index c63250e..530d27f 100644 --- a/bundles/zfs/items.py +++ b/bundles/zfs/items.py @@ -67,6 +67,7 @@ svc_systemd = { 'file:/etc/systemd/system/zfs-import-scan.service.d/bundlewrap.conf', }, 'after': { + 'bundle:dm-crypt', # might unlock disks 'pkg_apt:', }, 'before': { @@ -83,6 +84,7 @@ svc_systemd = { }, 'zfs-mount.service': { 'after': { + 'bundle:dm-crypt', # might unlock disks 'pkg_apt:', }, }, From f9e87bde9e660bf818c922b8950b5a9da494afa4 Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Thu, 24 Apr 2025 11:12:49 +0200 Subject: [PATCH 229/252] update travelynx to 2.11.23 --- nodes/carlene.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nodes/carlene.toml b/nodes/carlene.toml index 9c79e23..3b53d0f 100644 --- a/nodes/carlene.toml +++ b/nodes/carlene.toml @@ -250,7 +250,7 @@ user = "kunsi" when = "04:00:00 Europe/Berlin" [metadata.travelynx] -version = "2.11.13" +version = "2.11.23" mail_from = "travelynx@franzi.business" domain = "travelynx.franzi.business" From 57c1eb26056694b7ca1b25db256708fae337044f Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Tue, 6 May 2025 18:32:20 +0200 Subject: [PATCH 230/252] bundles/docker-immich: database not existing should not error out the script after all, we have monitoring to ensure the database container runs --- .../files/immich-auto-album-share.py | 32 +++++++++++-------- 1 file changed, 19 insertions(+), 13 deletions(-) diff --git a/bundles/docker-immich/files/immich-auto-album-share.py b/bundles/docker-immich/files/immich-auto-album-share.py index 863f8b2..2cac6c2 100644 --- a/bundles/docker-immich/files/immich-auto-album-share.py +++ b/bundles/docker-immich/files/immich-auto-album-share.py @@ -1,5 +1,6 @@ #!/usr/bin/env python3 +import logging from json import loads from os import environ from subprocess import check_output @@ -12,6 +13,8 @@ PSQL_USER = environ['DB_USERNAME'] PSQL_PASS = environ['DB_PASSWORD'] PSQL_DB = environ['DB_DATABASE_NAME'] +logging.basicConfig(level=logging.INFO) + docker_networks = loads(check_output(['docker', 'network', 'inspect', 'aaarghhh'])) container_ip = None @@ -26,9 +29,9 @@ for network in docker_networks: container_ip = container['IPv4Address'].split('/')[0] if not container_ip: - print(f'could not find ip address for container {PSQL_HOST=} in json') - print(docker_networks) - exit(1) + logging.error(f'could not find ip address for container {PSQL_HOST=} in json') + logging.debug(f'{docker_networks=}') + exit(0) print(f'{PSQL_HOST=} {container_ip=}') @@ -49,6 +52,7 @@ with conn: } for i in cur.fetchall() } + logging.debug(f'{albums=}') with conn.cursor() as cur: cur.execute('SELECT "id","name" FROM users;') @@ -56,25 +60,27 @@ with conn: i[0]: i[1] for i in cur.fetchall() } + logging.debug(f'{users=}') for album_id, album in albums.items(): - print(f'----- working on album: {album["name"]}') + log = logging.getLogger(album["name"]) with conn: with conn.cursor() as cur: cur.execute('SELECT "usersId" FROM albums_shared_users_users WHERE "albumsId" = %s;', (album_id,)) album_shares = [i[0] for i in cur.fetchall()] - print(f' album is shared with {len(album_shares)} users: {album_shares}') + log.info(f'album is shared with {len(album_shares)} users: {album_shares}') for user_id, user_name in users.items(): if user_id == album['owner'] or user_id in album_shares: continue - print(f' sharing album with user {user_name} ... ', end='') - with conn.cursor() as cur: - cur.execute( - 'INSERT INTO albums_shared_users_users ("albumsId","usersId","role") VALUES (%s, %s, %s);', - (album_id, user_id, 'viewer'), - ) - print('done') - print() + log.info(f'sharing album with user {user_name}') + try: + with conn.cursor() as cur: + cur.execute( + 'INSERT INTO albums_shared_users_users ("albumsId","usersId","role") VALUES (%s, %s, %s);', + (album_id, user_id, 'viewer'), + ) + except Exception: + log.exception('failure while creating share') conn.close() From 29799a1d339a3e5d1a01446c79d795cf5ef284f0 Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Tue, 6 May 2025 18:33:49 +0200 Subject: [PATCH 231/252] bundles/docker-immich; do not log all those user ids if we don't need them --- bundles/docker-immich/files/immich-auto-album-share.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/bundles/docker-immich/files/immich-auto-album-share.py b/bundles/docker-immich/files/immich-auto-album-share.py index 2cac6c2..ad9aac7 100644 --- a/bundles/docker-immich/files/immich-auto-album-share.py +++ b/bundles/docker-immich/files/immich-auto-album-share.py @@ -68,7 +68,8 @@ for album_id, album in albums.items(): with conn.cursor() as cur: cur.execute('SELECT "usersId" FROM albums_shared_users_users WHERE "albumsId" = %s;', (album_id,)) album_shares = [i[0] for i in cur.fetchall()] - log.info(f'album is shared with {len(album_shares)} users: {album_shares}') + log.info(f'album is shared with {len(album_shares)} users') + log.debug(f'{album_shares=}') for user_id, user_name in users.items(): if user_id == album['owner'] or user_id in album_shares: continue From 2b0e559f6ce507c1d52840b1abbd5d411f5ab626 Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Tue, 6 May 2025 18:35:31 +0200 Subject: [PATCH 232/252] bundles/docker-immich: remove leftover print statement --- bundles/docker-immich/files/immich-auto-album-share.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bundles/docker-immich/files/immich-auto-album-share.py b/bundles/docker-immich/files/immich-auto-album-share.py index ad9aac7..cafd32c 100644 --- a/bundles/docker-immich/files/immich-auto-album-share.py +++ b/bundles/docker-immich/files/immich-auto-album-share.py @@ -33,7 +33,7 @@ if not container_ip: logging.debug(f'{docker_networks=}') exit(0) -print(f'{PSQL_HOST=} {container_ip=}') +logging.debug(f'{PSQL_HOST=} {container_ip=}') conn = psycopg2.connect( dbname=PSQL_DB, From ae079764395f3b770e52134eaf5610a3693f52e4 Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Tue, 6 May 2025 20:57:41 +0200 Subject: [PATCH 233/252] bundles/nfs-server: add avahi config --- bundles/nfs-server/files/avahi.service | 10 +++++ bundles/nfs-server/files/exports | 2 +- bundles/nfs-server/items.py | 51 +++++++++++++++++--------- nodes/home/nas.py | 2 +- 4 files changed, 45 insertions(+), 20 deletions(-) create mode 100644 bundles/nfs-server/files/avahi.service diff --git a/bundles/nfs-server/files/avahi.service b/bundles/nfs-server/files/avahi.service new file mode 100644 index 0000000..394cdca --- /dev/null +++ b/bundles/nfs-server/files/avahi.service @@ -0,0 +1,10 @@ + + + + NFS ${path} on %h + + _nfs._tcp + 2049 + path=${path} + + diff --git a/bundles/nfs-server/files/exports b/bundles/nfs-server/files/exports index ad2ca4c..ac9c8f8 100644 --- a/bundles/nfs-server/files/exports +++ b/bundles/nfs-server/files/exports @@ -1,4 +1,4 @@ -% for path, shares in sorted(node.metadata['nfs-server']['shares'].items()): +% for path, shares in sorted(node.metadata.get('nfs-server/shares', {}).items()): % for share_target, share_options in sorted(shares.items()): % for ip_list in repo.libs.tools.resolve_identifier(repo, share_target).values(): % for ip in sorted(ip_list): diff --git a/bundles/nfs-server/items.py b/bundles/nfs-server/items.py index dacbc48..ce025cf 100644 --- a/bundles/nfs-server/items.py +++ b/bundles/nfs-server/items.py @@ -1,25 +1,40 @@ -files = { - '/etc/exports': { - 'content_type': 'mako', - 'triggers': { - 'action:nfs_reload_shares', - }, - }, - '/etc/default/nfs-kernel-server': { - 'source': 'etc-default', - 'triggers': { - 'svc_systemd:nfs-server:restart', - }, +from re import sub + +files['/etc/exports'] = { + 'content_type': 'mako', + 'triggers': { + 'action:nfs_reload_shares', }, } -actions = { - 'nfs_reload_shares': { - 'command': 'exportfs -a', - 'triggered': True, +files['/etc/default/nfs-kernel-server'] = { + 'source': 'etc-default', + 'triggers': { + 'svc_systemd:nfs-server:restart', }, } -svc_systemd = { - 'nfs-server': {}, +actions['nfs_reload_shares'] = { + 'command': 'exportfs -a', + 'triggered': True, } + +svc_systemd['nfs-server'] = {} + +if node.has_bundle('avahi-daemon'): + for path, shares in node.metadata.get('nfs-server/shares', {}).items(): + create_avahi_file = False + for share_target, share_options in shares.items(): + if ',insecure,' in f',{share_options},': + create_avahi_file = True + + if create_avahi_file: + share_name_normalized = sub('[^a-z0-9-_]+', '_', path) + + files[f'/etc/avahi/services/nfs{share_name_normalized}.service'] = { + 'source': 'avahi.service', + 'content_type': 'mako', + 'context': { + 'path': path, + }, + } diff --git a/nodes/home/nas.py b/nodes/home/nas.py index 2f210d6..e98955c 100644 --- a/nodes/home/nas.py +++ b/nodes/home/nas.py @@ -141,7 +141,7 @@ nodes['home.nas'] = { 'home.downloadhelper': 'rw,all_squash,anonuid=65534,anongid=1012,no_subtree_check', }, '/storage/nas': { - '172.19.138.0/24': 'ro,all_squash,anonuid=65534,anongid=65534,no_subtree_check', + '172.19.138.0/24': 'ro,all_squash,anonuid=65534,anongid=65534,no_subtree_check,insecure', }, '/srv/paperless': { 'home.paperless': 'rw,all_squash,anonuid=65534,anongid=65534,no_subtree_check', From cc94f10c2da1e8943246e6f3424697113f77d20e Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Tue, 6 May 2025 20:58:33 +0200 Subject: [PATCH 234/252] remove mitel rfp35 --- nodes/home.mitel-rfp35.toml | 4 ---- nodes/home/nas.py | 3 --- 2 files changed, 7 deletions(-) delete mode 100644 nodes/home.mitel-rfp35.toml diff --git a/nodes/home.mitel-rfp35.toml b/nodes/home.mitel-rfp35.toml deleted file mode 100644 index 414658a..0000000 --- a/nodes/home.mitel-rfp35.toml +++ /dev/null @@ -1,4 +0,0 @@ -dummy = true - -[metadata.interfaces.default] -ips = ["172.19.138.41"] diff --git a/nodes/home/nas.py b/nodes/home/nas.py index e98955c..ebfdc2c 100644 --- a/nodes/home/nas.py +++ b/nodes/home/nas.py @@ -79,11 +79,9 @@ nodes['home.nas'] = { }, '5060/tcp': { # yate SIP 'home.snom-wohnzimmer', - 'home.mitel-rfp35', }, '5061/tcp': { # yate SIPS 'home.snom-wohnzimmer', - 'home.mitel-rfp35', }, # yate RTP uses some random UDP port. We cannot firewall # it, because for incoming calls the other side decides @@ -93,7 +91,6 @@ nodes['home.nas'] = { # to deal with randomly changing IPs here. '*/udp': { 'home.snom-wohnzimmer', - 'home.mitel-rfp35', }, }, }, From 2b69953d961e94e27821096eeff606b28a0ed419 Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Sat, 10 May 2025 10:05:50 +0200 Subject: [PATCH 235/252] update travelynx to 2.11.24 --- nodes/carlene.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nodes/carlene.toml b/nodes/carlene.toml index 3b53d0f..d5625d9 100644 --- a/nodes/carlene.toml +++ b/nodes/carlene.toml @@ -250,7 +250,7 @@ user = "kunsi" when = "04:00:00 Europe/Berlin" [metadata.travelynx] -version = "2.11.23" +version = "2.11.24" mail_from = "travelynx@franzi.business" domain = "travelynx.franzi.business" From afb6d21326ea053b04a0a7a0e8d5c91cb19e0a6b Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Sat, 10 May 2025 11:19:45 +0200 Subject: [PATCH 236/252] home.nas: backup /home/kunsi --- nodes/home/nas.py | 1 + 1 file changed, 1 insertion(+) diff --git a/nodes/home/nas.py b/nodes/home/nas.py index ebfdc2c..d4a4211 100644 --- a/nodes/home/nas.py +++ b/nodes/home/nas.py @@ -60,6 +60,7 @@ nodes['home.nas'] = { }, 'backups': { 'paths': { + '/home/kunsi/', '/storage/nas/', }, }, From e47c8ce341125f67f07edcd1473b83571b7fd474 Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Sat, 10 May 2025 11:20:07 +0200 Subject: [PATCH 237/252] bundles/travelynx: disable registration by default --- bundles/travelynx/files/travelynx.conf | 6 ++++++ bundles/travelynx/metadata.py | 9 +++++---- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/bundles/travelynx/files/travelynx.conf b/bundles/travelynx/files/travelynx.conf index 46883cf..f73e85f 100644 --- a/bundles/travelynx/files/travelynx.conf +++ b/bundles/travelynx/files/travelynx.conf @@ -33,6 +33,12 @@ from => '${mail_from}', }, +% if not enable_registration: + registration => { + disabled => 1, + }, +% endif + ref => { issues => 'https://github.com/derf/travelynx/issues', source => 'https://github.com/derf/travelynx', diff --git a/bundles/travelynx/metadata.py b/bundles/travelynx/metadata.py index b7dadd6..630fd27 100644 --- a/bundles/travelynx/metadata.py +++ b/bundles/travelynx/metadata.py @@ -10,11 +10,12 @@ defaults = { 'password': repo.vault.password_for('{} postgresql travelynx'.format(node.name)), 'database': 'travelynx', }, - 'workers': 4, - 'spare_workers': 2, - 'mail_from': 'travelynx@{}'.format(node.hostname), - 'cookie_secret': repo.vault.password_for('{} travelynx cookie_secret'.format(node.name)), 'additional_cookie_secrets': set(), + 'cookie_secret': repo.vault.password_for('{} travelynx cookie_secret'.format(node.name)), + 'enable_registration': False, + 'mail_from': 'travelynx@{}'.format(node.hostname), + 'spare_workers': 2, + 'workers': 4, }, 'postgresql': { 'roles': { From 9c41d73f93ac0a84f3f1687eecfe407461b1293f Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Wed, 14 May 2025 10:00:58 +0100 Subject: [PATCH 238/252] move dns back to zone files --- bundles/powerdns/items.py | 43 ++++++++++++++----- data/powerdns/files/bind-zones/_mail_NULL | 2 + data/powerdns/files/bind-zones/_mail_carlene | 11 +++++ data/powerdns/files/bind-zones/_parked | 3 ++ data/powerdns/files/bind-zones/afra.berlin | 6 +++ .../bind-zones/die-brontosaurier-waren-es.org | 1 + data/powerdns/files/bind-zones/emails.sexy | 1 + .../files/bind-zones/eskalation.jetzt | 3 ++ .../files/bind-zones/felix-kunsmann.de | 3 ++ .../files/bind-zones/flauschehorn.sexy | 8 ++++ .../powerdns/files/bind-zones/franzi.business | 29 +++++++++++++ data/powerdns/files/bind-zones/kunbox.net | 14 +----- data/powerdns/files/bind-zones/kunsi.scot | 1 + .../powerdns/files/bind-zones/kunsitracker.de | 6 +++ data/powerdns/files/bind-zones/kunsmann.eu | 14 ++++++ data/powerdns/files/bind-zones/raptor.events | 1 + .../powerdns/files/bind-zones/trans-agenda.de | 1 + .../powerdns/files/bind-zones/trans-agenda.eu | 1 + data/powerdns/files/bind-zones/warnochwas.de | 6 +++ .../powerdns/files/bind-zones/winkeeinhorn.de | 1 + 20 files changed, 131 insertions(+), 24 deletions(-) create mode 100644 data/powerdns/files/bind-zones/_mail_NULL create mode 100644 data/powerdns/files/bind-zones/_mail_carlene create mode 100644 data/powerdns/files/bind-zones/_parked create mode 100644 data/powerdns/files/bind-zones/afra.berlin create mode 120000 data/powerdns/files/bind-zones/die-brontosaurier-waren-es.org create mode 120000 data/powerdns/files/bind-zones/emails.sexy create mode 100644 data/powerdns/files/bind-zones/eskalation.jetzt create mode 100644 data/powerdns/files/bind-zones/felix-kunsmann.de create mode 100644 data/powerdns/files/bind-zones/flauschehorn.sexy create mode 100644 data/powerdns/files/bind-zones/franzi.business create mode 120000 data/powerdns/files/bind-zones/kunsi.scot create mode 100644 data/powerdns/files/bind-zones/kunsitracker.de create mode 100644 data/powerdns/files/bind-zones/kunsmann.eu create mode 120000 data/powerdns/files/bind-zones/raptor.events create mode 120000 data/powerdns/files/bind-zones/trans-agenda.de create mode 120000 data/powerdns/files/bind-zones/trans-agenda.eu create mode 100644 data/powerdns/files/bind-zones/warnochwas.de create mode 120000 data/powerdns/files/bind-zones/winkeeinhorn.de diff --git a/bundles/powerdns/items.py b/bundles/powerdns/items.py index b6a5e8f..c972f90 100644 --- a/bundles/powerdns/items.py +++ b/bundles/powerdns/items.py @@ -2,13 +2,14 @@ from datetime import datetime from os import listdir from os.path import isfile, join from subprocess import check_output +from textwrap import dedent from bundlewrap.utils.ui import io zone_path = join(repo.path, 'data', 'powerdns', 'files', 'bind-zones') nameservers = set() -for rnode in sorted(repo.nodes_in_group('dns')): +for rnode in repo.nodes_in_group('dns'): nameservers.add(rnode.metadata.get('powerdns/my_hostname', rnode.metadata.get('hostname'))) my_primary_servers = set() @@ -75,25 +76,45 @@ actions = { } if node.metadata.get('powerdns/features/bind', False): + try: + output = check_output(['git', 'log', '-1', '--pretty=%ci']).decode('utf-8').strip() + serial = datetime.strptime(output, '%Y-%m-%d %H:%M:%S %z').strftime('%y%m%d%H%M') + except Exception as e: + io.stderr(f"{node.name} Error while parsing commit time for powerdns zone serial: {e!r}") + serial = datetime.now().strftime('%y%m%d0000') + + HEADER = dedent(f""" + $TTL 60 + @ IN SOA ns-mephisto.kunbox.net. hostmaster.kunbox.net. ( + {serial} + 3600 + 600 + 86400 + 300 + ) + """).strip() + + for ns in sorted(nameservers): + HEADER += f"\n@ IN NS {ns}." + primary_zones = set() for zone in listdir(zone_path): - if not isfile(join(zone_path, zone)) or zone.startswith(".") or zone.startswith("_"): + if ( + not ( + isfile(join(zone_path, zone)) + or islink(join(zone_path, zone)) + ) + or zone.startswith(".") + or zone.startswith("_") + ): continue - try: - output = check_output(['git', 'log', '-1', '--pretty=%ci']).decode('utf-8').strip() - serial = datetime.strptime(output, '%Y-%m-%d %H:%M:%S %z').strftime('%y%m%d%H%M') - except Exception as e: - io.stderr(f"Error while parsing commit time for {zone} serial: {e!r}") - serial = datetime.now().strftime('%y%m%d0000') - primary_zones.add(zone) files[f'/var/lib/powerdns/zones/{zone}'] = { 'content_type': 'mako', 'context': { - 'NAMESERVERS': '\n'.join(sorted({f'@ IN NS {ns}.' for ns in nameservers})), - 'SERIAL': serial, + 'HEADER': HEADER + f"\n$ORIGIN {zone}.", 'metadata_records': node.metadata.get(f'powerdns/bind-zones/{zone}/records', []), }, 'source': f'bind-zones/{zone}', diff --git a/data/powerdns/files/bind-zones/_mail_NULL b/data/powerdns/files/bind-zones/_mail_NULL new file mode 100644 index 0000000..907abc8 --- /dev/null +++ b/data/powerdns/files/bind-zones/_mail_NULL @@ -0,0 +1,2 @@ +@ IN TXT "v=spf1 -all" +_dmarc IN TXT "v=DMARC1; p=reject" diff --git a/data/powerdns/files/bind-zones/_mail_carlene b/data/powerdns/files/bind-zones/_mail_carlene new file mode 100644 index 0000000..7a8e210 --- /dev/null +++ b/data/powerdns/files/bind-zones/_mail_carlene @@ -0,0 +1,11 @@ +@ IN TXT "v=spf1 mx -all" +@ IN MX 10 mail.franzi.business. +_dmarc IN TXT "v=DMARC1; p=quarantine; rua=mailto:dmarc@kunbox.net; ruf=mailto:dmarc@kunbox.net; fo=0:d:s; adkim=s; aspf=s" +_mta-sts IN TXT "v=STSv1;id=20201111;" +_smtp._tls IN TXT "v=TLSRPTv1;rua=mailto:tlsrpt@kunbox.net" + +mta-sts IN CNAME carlene.kunbox.net. + +2019._domainkey IN TXT "v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwkg6UAcu3V98hal1UVf6yB0WT1CKDS0AK83CUlSP8bUwraPxkxK1nkQOUsmjbQs6a3FhdsKprMi32GeUaTVvZg81JIybPk3jNugfNWfSjs2TXPomYu+XD2pmmbR3cZlzC5NGR2nmBFt/P/S2ihPHj35KziiBIwK1TdvOi1M2+upCjK33Icco0ByCm0gJpD2O0cbqcBcUKqd6X440vYhNXH1ygp0e91P0iRnvS9sg6yD0xjD8kD6j/8GfxBY+9bpU3EvDoBgyJSbjw5b6PUVJbKMXzw1NIRNj0SXKs5BakjS8+7u62vR11IPCYRwy+yr0rDT0tNegM7gStIIgoTpOoQIDAQAB" + +uo4anejdvvdw8bkne3kjiqavcqmj0416._domainkey IN TXT "v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAnh5Ym9PO7r+wdOIKfopvHzn3KU3qT6IlCG/gvvbmIqoeFQfRbAe3gQmcG6RcLue55cJQGhI6y2r0lm59ZeoHR40aM+VabAOlplekM7xWmoXb/9vG2OZLIqAyF4I+7GQmTN6B9keBHp9SWtDUkI0B0G9neZ5MkXJP705M0duxritqQlb4YvCZwteHiyckKcg9aE9j+GF2EEawBoVDpoveoB3+wgde3lWEUjjwKFtXNXxuN354o6jgXgPNWtIEdPMLfK/o0CaCjZNlzaLTsTegY/+67hdHFqDmm8zXO9s+Xiyfq7CVq21t7wDhQ2W1agj+up6lH82FMh5rZNxJ6XB0yQIDAQAB" diff --git a/data/powerdns/files/bind-zones/_parked b/data/powerdns/files/bind-zones/_parked new file mode 100644 index 0000000..8331fc4 --- /dev/null +++ b/data/powerdns/files/bind-zones/_parked @@ -0,0 +1,3 @@ +${HEADER} + +<%include file="bind-zones/_mail_NULL" /> diff --git a/data/powerdns/files/bind-zones/afra.berlin b/data/powerdns/files/bind-zones/afra.berlin new file mode 100644 index 0000000..93ffc96 --- /dev/null +++ b/data/powerdns/files/bind-zones/afra.berlin @@ -0,0 +1,6 @@ +${HEADER} + +@ IN AAAA 2a0a:51c0:0:225::2 +@ IN A 193.135.9.29 + +<%include file="bind-zones/_mail_NULL" /> diff --git a/data/powerdns/files/bind-zones/die-brontosaurier-waren-es.org b/data/powerdns/files/bind-zones/die-brontosaurier-waren-es.org new file mode 120000 index 0000000..e0f69f8 --- /dev/null +++ b/data/powerdns/files/bind-zones/die-brontosaurier-waren-es.org @@ -0,0 +1 @@ +_parked \ No newline at end of file diff --git a/data/powerdns/files/bind-zones/emails.sexy b/data/powerdns/files/bind-zones/emails.sexy new file mode 120000 index 0000000..e0f69f8 --- /dev/null +++ b/data/powerdns/files/bind-zones/emails.sexy @@ -0,0 +1 @@ +_parked \ No newline at end of file diff --git a/data/powerdns/files/bind-zones/eskalation.jetzt b/data/powerdns/files/bind-zones/eskalation.jetzt new file mode 100644 index 0000000..8331fc4 --- /dev/null +++ b/data/powerdns/files/bind-zones/eskalation.jetzt @@ -0,0 +1,3 @@ +${HEADER} + +<%include file="bind-zones/_mail_NULL" /> diff --git a/data/powerdns/files/bind-zones/felix-kunsmann.de b/data/powerdns/files/bind-zones/felix-kunsmann.de new file mode 100644 index 0000000..42bac92 --- /dev/null +++ b/data/powerdns/files/bind-zones/felix-kunsmann.de @@ -0,0 +1,3 @@ +${HEADER} + +<%include file="bind-zones/_mail_carlene" /> diff --git a/data/powerdns/files/bind-zones/flauschehorn.sexy b/data/powerdns/files/bind-zones/flauschehorn.sexy new file mode 100644 index 0000000..4779fe4 --- /dev/null +++ b/data/powerdns/files/bind-zones/flauschehorn.sexy @@ -0,0 +1,8 @@ +${HEADER} + +@ IN AAAA 2a03:4000:4d:5e::1 +@ IN A 194.36.145.49 + +<%include file="bind-zones/_mail_carlene" /> + +_acme-challenge IN CNAME 63bc37c61bda3c1f4fa1f270f8890c7f89c24353.acme.ctu.cx. diff --git a/data/powerdns/files/bind-zones/franzi.business b/data/powerdns/files/bind-zones/franzi.business new file mode 100644 index 0000000..ce864a7 --- /dev/null +++ b/data/powerdns/files/bind-zones/franzi.business @@ -0,0 +1,29 @@ +${HEADER} + +@ IN AAAA 2a0a:51c0:0:225::2 +@ IN A 193.135.9.29 + +<%include file="bind-zones/_mail_carlene" /> + +_atproto IN TXT "did=did:plc:d762mg6wvvmpeu66zojntlof" +_token._dnswl IN TXT "gg3mbwjx9bbuo5osvh7oz6bc881wcmc" +_matrix._tcp IN SRV 10 10 443 matrix.franzi.business. + +; carlene +git IN CNAME carlene.kunbox.net. +irc IN CNAME carlene.kunbox.net. +mail IN CNAME carlene.kunbox.net. +matrix IN CNAME carlene.kunbox.net. +matrix-stickers IN CNAME carlene.kunbox.net. +netbox IN CNAME carlene.kunbox.net. +ntfy IN CNAME carlene.kunbox.net. +postfixadmin IN CNAME carlene.kunbox.net. +rss IN CNAME carlene.kunbox.net. +travelynx IN CNAME carlene.kunbox.net. + +; icinga2 +icinga IN CNAME icinga2.kunbox.net. +status IN CNAME icinga2.kunbox.net. + +; pretix +tickets IN CNAME franzi-business.cname.pretix.eu. diff --git a/data/powerdns/files/bind-zones/kunbox.net b/data/powerdns/files/bind-zones/kunbox.net index bb45655..2292b7d 100644 --- a/data/powerdns/files/bind-zones/kunbox.net +++ b/data/powerdns/files/bind-zones/kunbox.net @@ -1,16 +1,4 @@ -$TTL 60 -@ IN SOA ns-mephisto.kunbox.net. hostmaster.kunbox.net. ( - ${SERIAL} - 3600 - 600 - 86400 - 300 - ) - - -${NAMESERVERS} - -$ORIGIN kunbox.net. +${HEADER} ; ends up on carlene.kunbox.net @ IN A 193.135.9.29 diff --git a/data/powerdns/files/bind-zones/kunsi.scot b/data/powerdns/files/bind-zones/kunsi.scot new file mode 120000 index 0000000..e0f69f8 --- /dev/null +++ b/data/powerdns/files/bind-zones/kunsi.scot @@ -0,0 +1 @@ +_parked \ No newline at end of file diff --git a/data/powerdns/files/bind-zones/kunsitracker.de b/data/powerdns/files/bind-zones/kunsitracker.de new file mode 100644 index 0000000..9c641b6 --- /dev/null +++ b/data/powerdns/files/bind-zones/kunsitracker.de @@ -0,0 +1,6 @@ +${HEADER} + +@ IN AAAA 2a0a:51c0:0:225::2 +@ IN A 193.135.9.29 + +<%include file="bind-zones/_mail_carlene" /> diff --git a/data/powerdns/files/bind-zones/kunsmann.eu b/data/powerdns/files/bind-zones/kunsmann.eu new file mode 100644 index 0000000..f5b8acf --- /dev/null +++ b/data/powerdns/files/bind-zones/kunsmann.eu @@ -0,0 +1,14 @@ +${HEADER} + +@ IN AAAA 2a0a:51c0:0:225::2 +@ IN A 193.135.9.29 + +<%include file="bind-zones/_mail_carlene" /> + +@ IN TXT "google-site-verification=Xl-OBZpTL1maD2Qr8QmQ2aKRXZLnCmvddpFdrTT8L34" + +_token._dnswl IN TXT "5mx0rv9ru8s1zz4tf4xlt48osh09czmg" + +git IN CNAME git.franzi.business. +grafana IN CNAME influxdb.htz-cloud.kunbox.net. +influxdb IN CNAME influxdb.htz-cloud.kunbox.net. diff --git a/data/powerdns/files/bind-zones/raptor.events b/data/powerdns/files/bind-zones/raptor.events new file mode 120000 index 0000000..e0f69f8 --- /dev/null +++ b/data/powerdns/files/bind-zones/raptor.events @@ -0,0 +1 @@ +_parked \ No newline at end of file diff --git a/data/powerdns/files/bind-zones/trans-agenda.de b/data/powerdns/files/bind-zones/trans-agenda.de new file mode 120000 index 0000000..e0f69f8 --- /dev/null +++ b/data/powerdns/files/bind-zones/trans-agenda.de @@ -0,0 +1 @@ +_parked \ No newline at end of file diff --git a/data/powerdns/files/bind-zones/trans-agenda.eu b/data/powerdns/files/bind-zones/trans-agenda.eu new file mode 120000 index 0000000..e0f69f8 --- /dev/null +++ b/data/powerdns/files/bind-zones/trans-agenda.eu @@ -0,0 +1 @@ +_parked \ No newline at end of file diff --git a/data/powerdns/files/bind-zones/warnochwas.de b/data/powerdns/files/bind-zones/warnochwas.de new file mode 100644 index 0000000..9c641b6 --- /dev/null +++ b/data/powerdns/files/bind-zones/warnochwas.de @@ -0,0 +1,6 @@ +${HEADER} + +@ IN AAAA 2a0a:51c0:0:225::2 +@ IN A 193.135.9.29 + +<%include file="bind-zones/_mail_carlene" /> diff --git a/data/powerdns/files/bind-zones/winkeeinhorn.de b/data/powerdns/files/bind-zones/winkeeinhorn.de new file mode 120000 index 0000000..e0f69f8 --- /dev/null +++ b/data/powerdns/files/bind-zones/winkeeinhorn.de @@ -0,0 +1 @@ +_parked \ No newline at end of file From 9834188533c2539af4a0b4f12557ce39f3801b13 Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Wed, 14 May 2025 14:16:06 +0100 Subject: [PATCH 239/252] carlene: 42c3 topic less often --- nodes/carlene.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nodes/carlene.toml b/nodes/carlene.toml index d5625d9..5f4aece 100644 --- a/nodes/carlene.toml +++ b/nodes/carlene.toml @@ -247,7 +247,7 @@ disks = [ [metadata.systemd-timers.timers.42c3-topic] command = "/home/kunsi/42c3-topic.sh" user = "kunsi" -when = "04:00:00 Europe/Berlin" +when = "Mon 04:00:00 Europe/Berlin" [metadata.travelynx] version = "2.11.24" From 3bf8066516bdbf728836b715949a2abedf07f75f Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Wed, 14 May 2025 14:19:58 +0100 Subject: [PATCH 240/252] update forgejo to 11.0.1 --- nodes/carlene.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/nodes/carlene.toml b/nodes/carlene.toml index 5f4aece..5c6526c 100644 --- a/nodes/carlene.toml +++ b/nodes/carlene.toml @@ -37,8 +37,8 @@ imap_host = "secureimap.t-online.de" imap_pass = "!bwpass_attr:t-online.de/franzi.kunsmann@t-online.de:imap" [metadata.forgejo] -version = "11.0.0" -sha1 = "3a12529ab21ca04f2b3e6cf7a6c91af18f00ee5d" +version = "11.0.1" +sha1 = "d9d0051275830ca2ed328a633e25d936d0a2386a" domain = "git.franzi.business" enable_git_hooks = true install_ssh_key = true From d1f643b888020f59687bcf48209b4de7bdc92a7c Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Wed, 14 May 2025 14:21:45 +0100 Subject: [PATCH 241/252] update netbox to 4.3.1 --- configs/netbox/home.switch-rack.json | 6 +++--- nodes/carlene.toml | 2 +- scripts/netbox-dump | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/configs/netbox/home.switch-rack.json b/configs/netbox/home.switch-rack.json index 1792a8b..4843e1f 100644 --- a/configs/netbox/home.switch-rack.json +++ b/configs/netbox/home.switch-rack.json @@ -231,7 +231,7 @@ "ips": [ "172.19.138.4/24" ], - "mode": "", + "mode": null, "tagged_vlans": [], "type": "virtual", "untagged_vlan": null @@ -240,7 +240,7 @@ "description": "", "enabled": true, "ips": [], - "mode": "", + "mode": null, "tagged_vlans": [], "type": "10gbase-x-sfpp", "untagged_vlan": null @@ -249,7 +249,7 @@ "description": "", "enabled": true, "ips": [], - "mode": "", + "mode": null, "tagged_vlans": [], "type": "10gbase-x-sfpp", "untagged_vlan": null diff --git a/nodes/carlene.toml b/nodes/carlene.toml index 5c6526c..2fd3402 100644 --- a/nodes/carlene.toml +++ b/nodes/carlene.toml @@ -110,7 +110,7 @@ domain = "rss.franzi.business" [metadata.netbox] domain = "netbox.franzi.business" -version = "v4.2.8" +version = "v4.3.1" admins.kunsi = "hostmaster@kunbox.net" [metadata.nextcloud] diff --git a/scripts/netbox-dump b/scripts/netbox-dump index 8486653..117bae9 100755 --- a/scripts/netbox-dump +++ b/scripts/netbox-dump @@ -34,7 +34,7 @@ QUERY_SITES = """{ }""" QUERY_DEVICES = """{ - device_list(filters: {tag: "bundlewrap", site_id: "SITE_ID"}) { + device_list(filters: {site_id: "SITE_ID", tags: {name: {exact: "bundlewrap"}}}) { name id } From a42ceae7727d85d24a0b2f888188e13de5d6dac0 Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Wed, 14 May 2025 14:41:10 +0100 Subject: [PATCH 242/252] bundles/sysctl: do not install legacy sysctl file --- bundles/apt/items.py | 1 + bundles/sysctl/items.py | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/bundles/apt/items.py b/bundles/apt/items.py index ea988af..12578fa 100644 --- a/bundles/apt/items.py +++ b/bundles/apt/items.py @@ -138,6 +138,7 @@ pkg_apt = { 'tmux': {}, 'tree': {}, 'unzip': {}, + 'util-linux': {}, 'vim': {}, 'wget': {}, 'whois': {}, diff --git a/bundles/sysctl/items.py b/bundles/sysctl/items.py index 99860e1..ee63cf0 100644 --- a/bundles/sysctl/items.py +++ b/bundles/sysctl/items.py @@ -20,7 +20,7 @@ files = { }, } -if node.os == 'debian': +if node.os == 'debian' and node.os_version < (13,): # debian insists on creating that file during almost every # unattended-upgrades run. Make it known to bundlewrap, so # it does not get removed during applies. From eaf78f0f883b84202392e0cc668b67c985e08fef Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Wed, 14 May 2025 14:41:35 +0100 Subject: [PATCH 243/252] update home.hass to debian trixie --- nodes/home.hass.toml | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/nodes/home.hass.toml b/nodes/home.hass.toml index afb204f..c9e60d7 100644 --- a/nodes/home.hass.toml +++ b/nodes/home.hass.toml @@ -2,9 +2,8 @@ hostname = "172.19.138.25" bundles = [ 'homeassistant', 'nginx', - 'pyenv', ] -groups = ["debian-bookworm"] +groups = ["debian-trixie"] [metadata.icinga_options] also_affected_by = ['home.nas'] @@ -24,9 +23,5 @@ ram = 2 domain = 'hass.home.kunbox.net' api_secret = '!decrypt:encrypt$gAAAAABm9lNg_mNhyzb4S6WRtVRDmQFBnPpoCwyqMnilRrAFUXc-EDvv-nYXPbSIbjTf7ZReTPtqr8k3WrGPqiuqhJ60LVv4A5DMqT5c6hTVr4WbhP4DPEIPgfd5aq6U9_-H9WDyQYHKjnunLJEYtEREzmhTq3XsYeQ05DyE7hfnQ-zVoBb0CsAK7GdhihRTdvhXv2N9M04_rigyBP-roRcUgCqwyHuWJc0IPAyn3R4Mr43ZqgR2fn6dNV_YUVKn9c0nWxIwRnYy6Ff_Te9NoGVmXxkiNUX-90bBLKFiCzrRAtizxrTiQb2SRipaWbgOlV6wbMy2KNux' -[metadata.pyenv] -version = 'v2.4.23' -python_versions = ["3.13.1"] - [metadata.nginx.vhosts.homeassistant] ssl = '_.home.kunbox.net' From 87a33f5bc61ffb99df0bf6574f05c8e124bb4a44 Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Wed, 14 May 2025 19:19:26 +0100 Subject: [PATCH 244/252] bundles/mautrix-telegram: enable captions in message --- bundles/mautrix-telegram/files/config.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/bundles/mautrix-telegram/files/config.yaml b/bundles/mautrix-telegram/files/config.yaml index 1fbe165..380d3a2 100644 --- a/bundles/mautrix-telegram/files/config.yaml +++ b/bundles/mautrix-telegram/files/config.yaml @@ -46,6 +46,7 @@ bridge: - username - phone number displayname_max_length: 100 + caption_in_message: true allow_avatar_remove: false max_initial_member_sync: -1 sync_channel_members: true From 67005b5c3398a9a5f4deb0df9fbd0467ace3a0a7 Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Mon, 19 May 2025 18:31:41 +0200 Subject: [PATCH 245/252] bundles/paperless: add CSRF_TRUSTED_ORIGINS --- bundles/paperless-ng/files/paperless.conf | 1 + 1 file changed, 1 insertion(+) diff --git a/bundles/paperless-ng/files/paperless.conf b/bundles/paperless-ng/files/paperless.conf index d943063..84f1b65 100644 --- a/bundles/paperless-ng/files/paperless.conf +++ b/bundles/paperless-ng/files/paperless.conf @@ -17,6 +17,7 @@ PAPERLESS_FILENAME_FORMAT={{ created_year }}/{{ created_month }}/{{ corresponden # Security and hosting PAPERLESS_SECRET_KEY=${repo.vault.random_bytes_as_base64_for(f'{node.name} paperless secret key')} +PAPERLESS_CSRF_TRUSTED_ORIGINS=https://${node.metadata.get('paperless/domain')} PAPERLESS_ALLOWED_HOSTS=${node.metadata.get('paperless/domain')} PAPERLESS_CORS_ALLOWED_HOSTS=http://${node.metadata.get('paperless/domain')},https://${node.metadata.get('paperless/domain')} #PAPERLESS_FORCE_SCRIPT_NAME= From 95e64b7dbdaba9a5b7a76a83032afda9dacd6af6 Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Wed, 21 May 2025 23:29:04 +0200 Subject: [PATCH 246/252] new cert for _.home.kunbox.net --- data/ssl/_.home.kunbox.net.crt.pem | 36 +++++++++---------- .../_.home.kunbox.net.crt_intermediate.pem | 36 +++++++++---------- data/ssl/_.home.kunbox.net.key.pem.vault | 2 +- 3 files changed, 37 insertions(+), 37 deletions(-) diff --git a/data/ssl/_.home.kunbox.net.crt.pem b/data/ssl/_.home.kunbox.net.crt.pem index 4fb984a..27e795b 100644 --- a/data/ssl/_.home.kunbox.net.crt.pem +++ b/data/ssl/_.home.kunbox.net.crt.pem @@ -1,22 +1,22 @@ -----BEGIN CERTIFICATE----- -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 -----END CERTIFICATE----- diff --git a/data/ssl/_.home.kunbox.net.crt_intermediate.pem b/data/ssl/_.home.kunbox.net.crt_intermediate.pem index 59039ae..4652201 100644 --- a/data/ssl/_.home.kunbox.net.crt_intermediate.pem +++ b/data/ssl/_.home.kunbox.net.crt_intermediate.pem @@ -1,27 +1,27 @@ -----BEGIN CERTIFICATE----- -MIIEVzCCAj+gAwIBAgIRAIOPbGPOsTmMYgZigxXJ/d4wDQYJKoZIhvcNAQELBQAw +MIIEVzCCAj+gAwIBAgIRALBXPpFzlydw27SHyzpFKzgwDQYJKoZIhvcNAQELBQAw TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMjQwMzEzMDAwMDAw WhcNMjcwMzEyMjM1OTU5WjAyMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNTGV0J3Mg -RW5jcnlwdDELMAkGA1UEAxMCRTUwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQNCzqK -a2GOtu/cX1jnxkJFVKtj9mZhSAouWXW0gQI3ULc/FnncmOyhKJdyIBwsz9V8UiBO -VHhbhBRrwJCuhezAUUE8Wod/Bk3U/mDR+mwt4X2VEIiiCFQPmRpM5uoKrNijgfgw +RW5jcnlwdDELMAkGA1UEAxMCRTYwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAATZ8Z5G +h/ghcWCoJuuj+rnq2h25EqfUJtlRFLFhfHWWvyILOR/VvtEKRqotPEoJhC6+QJVV +6RlAN2Z17TJOdwRJ+HB7wxjnzvdxEP6sdNgA1O1tHHMWMxCcOrLqbGL0vbijgfgw gfUwDgYDVR0PAQH/BAQDAgGGMB0GA1UdJQQWMBQGCCsGAQUFBwMCBggrBgEFBQcD -ATASBgNVHRMBAf8ECDAGAQH/AgEAMB0GA1UdDgQWBBSfK1/PPCFPnQS37SssxMZw -i9LXDTAfBgNVHSMEGDAWgBR5tFnme7bl5AFzgAiIyBpY9umbbjAyBggrBgEFBQcB +ATASBgNVHRMBAf8ECDAGAQH/AgEAMB0GA1UdDgQWBBSTJ0aYA6lRaI6Y1sRCSNsj +v1iU0jAfBgNVHSMEGDAWgBR5tFnme7bl5AFzgAiIyBpY9umbbjAyBggrBgEFBQcB AQQmMCQwIgYIKwYBBQUHMAKGFmh0dHA6Ly94MS5pLmxlbmNyLm9yZy8wEwYDVR0g BAwwCjAIBgZngQwBAgEwJwYDVR0fBCAwHjAcoBqgGIYWaHR0cDovL3gxLmMubGVu -Y3Iub3JnLzANBgkqhkiG9w0BAQsFAAOCAgEAH3KdNEVCQdqk0LKyuNImTKdRJY1C -2uw2SJajuhqkyGPY8C+zzsufZ+mgnhnq1A2KVQOSykOEnUbx1cy637rBAihx97r+ -bcwbZM6sTDIaEriR/PLk6LKs9Be0uoVxgOKDcpG9svD33J+G9Lcfv1K9luDmSTgG -6XNFIN5vfI5gs/lMPyojEMdIzK9blcl2/1vKxO8WGCcjvsQ1nJ/Pwt8LQZBfOFyV -XP8ubAp/au3dc4EKWG9MO5zcx1qT9+NXRGdVWxGvmBFRAajciMfXME1ZuGmk3/GO -koAM7ZkjZmleyokP1LGzmfJcUd9s7eeu1/9/eg5XlXd/55GtYjAM+C4DG5i7eaNq -cm2F+yxYIPt6cbbtYVNJCGfHWqHEQ4FYStUyFnv8sjyqU8ypgZaNJ9aVcWSICLOI -E1/Qv/7oKsnZCWJ926wU6RqG1OYPGOi1zuABhLw61cuPVDT28nQS/e6z95cJXq0e -K1BcaJ6fJZsmbjRgD5p3mvEf5vdQM7MCEvU0tHbsx2I5mHHJoABHb8KVBgWp/lcX -GWiWaeOyB7RP+OfDtvi2OsapxXiV7vNVs7fMlrRjY1joKaqmmycnBvAq14AEbtyL -sVfOS66B8apkeFX2NY4XPEYV4ZSCe8VHPrdrERk2wILG3T/EGmSIkCYVUMSnjmJd -VQD9F6Na/+zmXCc= +Y3Iub3JnLzANBgkqhkiG9w0BAQsFAAOCAgEAfYt7SiA1sgWGCIpunk46r4AExIRc +MxkKgUhNlrrv1B21hOaXN/5miE+LOTbrcmU/M9yvC6MVY730GNFoL8IhJ8j8vrOL +pMY22OP6baS1k9YMrtDTlwJHoGby04ThTUeBDksS9RiuHvicZqBedQdIF65pZuhp +eDcGBcLiYasQr/EO5gxxtLyTmgsHSOVSBcFOn9lgv7LECPq9i7mfH3mpxgrRKSxH +pOoZ0KXMcB+hHuvlklHntvcI0mMMQ0mhYj6qtMFStkF1RpCG3IPdIwpVCQqu8GV7 +s8ubknRzs+3C/Bm19RFOoiPpDkwvyNfvmQ14XkyqqKK5oZ8zhD32kFRQkxa8uZSu +h4aTImFxknu39waBxIRXE4jKxlAmQc4QjFZoq1KmQqQg0J/1JF8RlFvJas1VcjLv +YlvUB2t6npO6oQjB3l+PNf0DpQH7iUx3Wz5AjQCi6L25FjyE06q6BZ/QlmtYdl/8 +ZYao4SRqPEs/6cAiF+Qf5zg2UkaWtDphl1LKMuTNLotvsX99HP69V2faNyegodQ0 +LyTApr/vT01YPE46vNsDLgK+4cL6TrzC/a4WcmF5SRJ938zrv/duJHLXQIku5v0+ +EwOy59Hdm0PT/Er/84dDV0CSjdR/2XuZM3kpysSKLgD1cKiDA+IRguODCxfO9cyY +Ig46v9mFmBvyH04= -----END CERTIFICATE----- diff --git a/data/ssl/_.home.kunbox.net.key.pem.vault b/data/ssl/_.home.kunbox.net.key.pem.vault index e17988a..dda0d06 100644 --- a/data/ssl/_.home.kunbox.net.key.pem.vault +++ b/data/ssl/_.home.kunbox.net.key.pem.vault @@ -1 +1 @@ -encrypt$gAAAAABnuvHlF1U1dT-xIICT5GmDxxqm0hQAgshQSA46WrVoo18ypjyxQE1qRzPNdp0xHKPYwpGmAoT7ftX7U3X3sjIvH8W5DUNMEBPZk6Z2yPxsyMDqUbxqJUOkjsSjVf1GZ_n3R5kZfb-THJMjNQMy3tL5RwrSvZjsYeYT-NwBle5rUKZpgE_6sDr5jSr8xpNx87gJr1vqgnZIBPllU47CJQy7LHEsVcCvbKhpVoau02LlPAoApVt_iYYm1fL_E6jFGfnCwGoeiytMc2fl1DPWS8q8oauQ1pNVTWQ2BXnLiXoc8u3hgp93PpT2LubYgIrVXpY8iErNtghuXi_HmqL37btdN5h-p1Div-R_5uva1maXffduwutCd5xWJK__G_bhqiSoEaKEMvo_H47vqbi7Hvwi70ckYek9KD_bIb2W8zBEPl1Q2436Uz54B0muXv6X7OoZlTj51_gZUcT3cp8SDJqAWDpnWg== \ No newline at end of file +encrypt$gAAAAABoLkWaAM6hx5Tl_6sPRVNmmcx9OmWYGmrNLIF4J-p7Xhj4O0fQuPcnph0ZFtmlBNWcfGb8G2ysTeEN1-Be2O4JQamvxUyGFT-Jste8GzAH6btiM6ef1E0FO6ovmzUxAiFZCbeXqKXF0opPz2B6rbDKiU-yTEZpid6-D-yz3uGuunhOjL3RpWJ1ArZRiOoX3DKPf5BXn51-71TEhB-lg41sDqnMfl4lo9_9xb5_2MBLsVZ9EYjcxvwgzq7qtdExtmpkWQ7pU6uPSP5w5wc8MFvRbiXNlOrFMLjslcGp7_cbfBMmA56UCVAe2n8HqWRcKHeYo_gNVUi1nDi2GjBmUYygA9yzFcUBqcV5ZUPK-7uwYxh2ZFbBcbwmTtvXYqEEvTLuZbsYwhV5mJR6b7L3MR81g--9D8pSulsKjbrUXXTZ373SWXz_aQoBLg5vOiL4zUo8T0isXIGcGMS8LUn-LvpQyptE-A== \ No newline at end of file From e27ca0abc9bff048541bd94d457e552312c525d5 Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Sun, 25 May 2025 21:48:22 +0200 Subject: [PATCH 247/252] update mautrix-whatsapp to 0.12.1 --- nodes/carlene.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/nodes/carlene.toml b/nodes/carlene.toml index 2fd3402..0c56fe9 100644 --- a/nodes/carlene.toml +++ b/nodes/carlene.toml @@ -98,8 +98,8 @@ provisioning.shared_secret = "!decrypt:encrypt$gAAAAABfVKflEMAi07C_QGP8cy97hF-4g "'@kunsi:franzi.business'" = "admin" [metadata.mautrix-whatsapp] -version = "v0.12.0" -sha1 = "02094da0a164099d4d35e5edb4b87875ad694833" +version = "v0.12.1" +sha1 = "e453f41ab57d703fcac90483f7f0ff36b6127f54" permissions."'@kunsi:franzi.business'" = "admin" [metadata.mautrix-whatsapp.homeserver] domain = "franzi.business" From bfb8ac8b2a5e3ff6f79f22537f1b612cd6d34ec8 Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Sun, 25 May 2025 21:48:42 +0200 Subject: [PATCH 248/252] update travelynx to 2.11.35 --- nodes/carlene.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nodes/carlene.toml b/nodes/carlene.toml index 0c56fe9..2d36766 100644 --- a/nodes/carlene.toml +++ b/nodes/carlene.toml @@ -250,7 +250,7 @@ user = "kunsi" when = "Mon 04:00:00 Europe/Berlin" [metadata.travelynx] -version = "2.11.24" +version = "2.11.35" mail_from = "travelynx@franzi.business" domain = "travelynx.franzi.business" From f78420d4e759f51f7609590afbc9af620fab8c68 Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Sun, 25 May 2025 21:48:59 +0200 Subject: [PATCH 249/252] update paperless to 2.16.2 --- nodes/home/paperless.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nodes/home/paperless.py b/nodes/home/paperless.py index f7035a5..8c1a969 100644 --- a/nodes/home/paperless.py +++ b/nodes/home/paperless.py @@ -49,7 +49,7 @@ nodes['home.paperless'] = { }, 'paperless': { 'domain': 'paperless.home.kunbox.net', - 'version': 'v2.15.3', + 'version': 'v2.16.2', 'timezone': 'Europe/Berlin', }, 'postgresql': { From 749f7b69a770c718e511fe12850bd4c7541f61b5 Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Sun, 25 May 2025 21:49:40 +0200 Subject: [PATCH 250/252] proxmox-backupstorage: the 18TB disks are gone --- nodes/proxmox-backupstorage.toml | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/nodes/proxmox-backupstorage.toml b/nodes/proxmox-backupstorage.toml index 7f10946..3943102 100644 --- a/nodes/proxmox-backupstorage.toml +++ b/nodes/proxmox-backupstorage.toml @@ -26,18 +26,6 @@ check_command = "sshmon" check_command = "sshmon" "vars.sshmon_command" = "ST20000NM007D-3DJ103_WVT0W64H" -[metadata.icinga2_api.smartd.services."SMART STATUS ST18000NM0092-3CX103_ZVV0686W"] -check_command = "sshmon" -"vars.sshmon_command" = "ST18000NM0092-3CX103_ZVV0686W" - -[metadata.icinga2_api.smartd.services."SMART STATUS ST18000NM0092-3CX103_ZVV06JV7"] -check_command = "sshmon" -"vars.sshmon_command" = "ST18000NM0092-3CX103_ZVV06JV7" - -[metadata.icinga2_api.smartd.services."SMART STATUS ST18000NM0092-3CX103_ZVV06SLR"] -check_command = "sshmon" -"vars.sshmon_command" = "ST18000NM0092-3CX103_ZVV06SLR" - [metadata.icinga2_api.smartd.services."SMART STATUS ST8000NM0045-1RL112_ZA1EYQWR"] check_command = "sshmon" "vars.sshmon_command" = "ST8000NM0045-1RL112_ZA1EYQWR" From b73a77f95622050de51ea78e12cc694e869f575a Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Mon, 26 May 2025 17:13:26 +0200 Subject: [PATCH 251/252] rottenraptor-server: needs tailscale --- data/apt/files/gpg-keys/tailscale.asc | 7003 +++++++++++++++++++++++++ nodes/rottenraptor-server.toml | 5 + 2 files changed, 7008 insertions(+) create mode 100644 data/apt/files/gpg-keys/tailscale.asc diff --git a/data/apt/files/gpg-keys/tailscale.asc b/data/apt/files/gpg-keys/tailscale.asc new file mode 100644 index 0000000..8a8d36d --- /dev/null +++ b/data/apt/files/gpg-keys/tailscale.asc @@ -0,0 +1,7003 @@ +-----BEGIN PGP PUBLIC KEY BLOCK----- + +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 +nnQFzClJLhaqX0J8ap8HCmbeIYjNrLOjgMVSEH5IXNQELMWgC757wwVLIiY4Sgng +5p5zLo720yWZ+OzyC40Ing0jv2qdKOnWvh5QKbAs2yWj/iMmOzVPYPE3GamPIfwj +siA3HXp3Dvgrcaarj5hvaLCibw380bsn0q6XCEvfg2zzHUinGD88XotjDzPpXfjS +hPJd5cTwBDLhRQbL0SV44bwsP0/Y9WofqswYFi+Ky2lYFLbZTokCPQQTAQoAJwUC +UsTcRgIbAwUJB4YfgAULCQgHAwUVCgkICwUWAgMBAAIeAQIXgAAKCRAYdvQ24aSl +nA5SD/9LFZPUA8MDvnipQOqsl5VPmScLObTEpcM/UMtIG7kt34nGp97JpGn8bZX4 +4v+MZGy3xc6u68BxVpl/raWs9FqMJ1sgJJ0lKBRJVc94psFAicZwujDbcxthy/bN +6xoFm6DyAjaBjjnCnTe3KskCAaXksCCkEics+sc9Qjp/LaAPSkM8TAArG5g01oC2 +43DQ1lc31rWUozfqSgDSKLNhDOkjuWhUPFU0raBGGbhtI/NjJOfv0uUfna8kDS4l +F0xuKer2tsepOlcjj9xxUczW+naHYF1QXlR3ZinWfz+XNMTrouv0AUdk/71cxaP8 +r8n6B47ANHrCkL2rRewwl0ibVhoTUhu31hNvcO5VMq4HCehVVgCufJ/yxz3yLCug +FCSEDP4bMHnN8Y9oLLB8sAb+lhtAATZnpa6IYYa4/r/1MBAzXTe0fQGjXZVtzhAi +6D5pPucOd4HFkKxggTd84XqcfeKuKVX4Ggq/Ib+XswZ6eE2thAMiUDC7fBj92WZ1 ++3iADVOLdq4v3E4T7b5900G+xnU2bGTXpL26fEuO6MowEjBPAYGOlHn2GP6E7RCi +Tt16IPjIXJiiSolX4KFUqvJi3mXm9Aq7LHFwv8dts5LkZKeq2qqotZIKj7nnnLgJ +HWAcT8ERWpNeWd2sBMctj1LP2nRmw3hbsYQb6eQ3jcBS3SI5JLQZZGVyY2hyaXMg +PG1lQGRlcmNocmlzLmV1PokCVAQTAQgAPgIbAwULCQgHAgYVCgkICwIEFgIDAQIe +AQIXgBYhBGjJ1ZYOvpWmrML8hRh29DbhpKWcBQJkT2kaBQkX+KqjAAoJEBh29Dbh +pKWcrYcQAMbRQ0swmmoOjjPapSX8PbzdTEgylokPMikoYCuah8nCZCmsl2fme0Vp +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 +ZgGABgsJCAcDAgYVCAIJCgsEFgIDAQIeAQIXgAAKCRAfx4ZSEjTx9R14D/9mLZWb +59GyzS7gKSS8V47vfF8TjzB7Okk3ELGg/yg29ODYrOxN+JmSbLojq4/UX5EPIVDt +mugAFHKrlEtsGg42b43ItCZwbh3CtwMvOebp8fyDd4MP/hifrtdM1/1g85I2p3bw +Nu/UDEBHBSOkWLpR8oZYkrKG8w4JhO+cn8L2uB/QZ7J7z9tsQ4XtcAetUxkJ0upJ +ZlbPxAY7Tr5x8PDoxB5pCFeyWT3Hl5Vh4L1fH/RsXqWMe/Vqya1jRRJcXp8qvwxK +thi16IaSkOwHtE+jo4+n5crTXgy/RuYbiWDRfPPaqgmAwJlrjwEbqJ3nXFHJuAFk +W5PTgFXUxwk0uSLJ89fFyPcSWnkFJcqjFfEV9Oyqk1tE1c2C2hMGVbmfS1GopxU9 +ukmboDjz+CdSxePDeQ8hXmcXswHaTyL9u41SNDfcgkKv+bUYoGXGBLdbp+Eg6arN +IWsFI/htf38Ux6sBLpcL11FQMBeSmTFUc5ZBe4hrfnDpwQJ39L2LbYPCSZliufTR +l93XDZfIDGU8QY60bpjLUZfK5LYVVGA3H2HEuILZbkaeFYo95UeiYroJ2hxtWMwE +cP/dsVaCA1hS0EM1iByL5FZiI/4RchyQdBF4ARDPWEWjA6GoHl33L9EYQmlH26oD +PIKYHvJMCwnCPE60v04/uDO/faiVkwgfMZW69IkCQQQTAQIAKwIbIwUJCWYBgAYL +CQgHAwIGFQgCCQoLBBYCAwECHgECF4AFAlHNcYwCGQEACgkQH8eGUhI08fXpRQ// +X27ISR7Shja4h6TJt3vY44qoLe+0rz0NFCKXW8mVe9rmHbimn6VImBpThh94rk4Z +zWmgl7E9Mn/7H1UTkP6FrUEJfqMtAMfh4r7tBSlM1OtCfpaKl8idjVGm/JEJvOVZ +tDemn/Em2b9XWIvI+pdZq23jgV39JZAlzGmRbq+owKOeE/CO+TFK6F6Hwn8K+e8M +toCHQ8kJSsFjdNzokQ2flLFtmsLAoRPVrqZF2WH80BXcQtpZOhkgh6IL+jhpQzk6 +HIvn7Jw+Sc9NrYjYRE6OEFtbBqL2hCwXmS8PLX9B25o+NfeLEsKsftxSMCRUrdK3 +ebOkdxYAReUb+yR2pJRRFwCYhHBkB8kghCH2oS1WUFZysWX3MvyYPKDztQZFo2v6 +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 +G3tTVIQy/V8s1vlqZeElBnFFaP6HEU3VyTrKCSIoUooCnqNfvm39T+p8FXG2U2QZ +c4Iob9EuaOFhxiGyP67MleiNIj+3bNaJAhwEEAEIAAYFAlccqW0ACgkQH8eGUhI0 +8fXo2A/8DHkLsrxgOiglyt+OGtg39F316Cykys5bHRCcPFqgOOciY2UpspiO8djt +/nobS03Rlpu6pUZwsJop8sswTnEXZyNrKurEm91NzuGBbVP9jfC3H4ynV9WOWkYE +nopYIBadsTrpnNeGuekTUsPjAZG4S3DdbOA2CycPxg36Oo7YzwewR50hR9D+bqBT +02WMPe4l+2jHEz8iGyR80PVET08evjhXZcw8b8sG3tLCQN0eXM+oBO+sYGcFiwBm +2+2GOHFTw2al28wj/bTQJyeAMQ1fvdvk8dgOZ/4aEcedpsBI3WYAH9UWJuW1BlNA +/xSQ1feu68DtkG9YFwR0bsLE1uac5bZs8252unpwuqzLGNMOT+1jO2jj+AvbY4Sz +ZWnBqDoM4TOEtASwzom5pp5g/Y+jjFz4UPoGbsUVWrosIzUPfByhCDSML4kZexco +/o4nIkP8i9XRF2co0vSn7uk+EGUKsVinVPxdMNA4uWbUCcA9hmJJsSpsNeb/+wIf +o2wkcwkcW971RnJOOUIjvmz8kDmp/NGY73IyYwEKFikznwKRqIRh3AIy9K5qqt0T +28Ure18wEenGLEw8s7kfDimeYHl5VIgLc8qlEVjgrH4cb1zrvoVTUNud92nJGipE +FNxYW010aZ0b2I5hvWdtgE9orBkdKliFQ05d5xO97IPNMXpIxJ6JAhwEEgEIAAYF +Alccq1sACgkQoI8kPq0xkeIdRw//Wttq/Oebykswa0U3zE3Wqed9gE7tCoZeNwc/ +vV2u8zWRQPby8xnVV9Ttegt427PCdk8q2ScKhmHlCnYSExeRY2yhrYZLM14W+F6i +MtcQz4VQc2ZEqZpNS8f6prF9Ruko5NIjlbMjyVLdzN0/R9vx0sAgQEIYwSAxnsEs +kVLuQbpAkoevM277yZZ41W1k77u48PX38IHRWTkn+63WKFWDnDe3ANRWKqXYSibS +dRQFrv2TO7h4xRyN+UcLkqlTFpTZLvUEOnNeFjQySiRShCnWlg/dRluDbJJbjR+u ++vCW70dyiqhgjgIRrfB7Bu63tqCOKTvHUmXf0BYlaXixUmi6iK7WAoH9otTyYYpY +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 +9UASR9IP+EVCvBzwnKogj0tuItN0ANsQ6hrwjTB0+qSOJHeiNEyir29vF2ff0XBO +BB+azFyUkaCf+SCXpIpYHQ7bn5SFDcdngtHD1xohkOLvsG4lBv6W5b8Z9j/7SRYz +j35cpBv7L16OrG1q7qJ6tRaOXhV6C9U1ivQQAToJEJNN9vbkWjBqFNce09SP/ihz +WaVcaT1YzR5G3e48MXcPgreMqKurrlekC/g9wG1S96WCWmncvX87f8hkHpFSClkS +pQr/aPcOqT2mw+Pmipk3pTEkIMUZPHf4gnYgldgz1JR6TzZJgmZw/Q5oAz6gGd43 +hO46m/HoPuK6HOfnn3M0sE9EzGsejQdZOl5fw9ynG6Av7fAxsOlrVN4DQ0Q2mON6 +SIqCDnRYa2znBWj/joJewFgZHF0MlSszvccct8nnJr9yYM7i57SxW2BjWqoY+S6h +zmSBpdxmquLQUe8+jMgnS8OIJOEWcrEMjKNb3T3v3r81Zu48QbrkhMQ0iC3EXWHs +/MBxgI6ddNm9/VGhxgtp04/U8/nx6nRajizfAoKobbOl1RLQnSpWnYfgCrC2/VyF +pUVO+Yc8UW5Ic3kw+v8wsKkPYFBXtC5BbGV4YW5kZXIgVm90dGVsZXIgPGFsZXhA +YWxleGFuZGVydm90dGVsZXIuZGU+iQI9BBMBCgAnBQJUpcmfAhsDBQkHhh+ABQsJ +CAcDBRUKCQgLBRYCAwEAAh4BAheAAAoJEBoPJ987fXhp+zYQAJZPdxlm/d+dgvk6 +RtxSBMy7yv1ObTa3JqOpVysOUUMzQVKhvexbFJL6dHQgZ05oDU0Nkp1RTFZs7juG +nDbufY1gkY7EiNoqQ8885oc7K8xi3umZlMu+vIlsa9jnv0fBcu1ORoPnVyex9HuP +Zp42g7c5tSbogQ1e24ah7eVAf0viw+b2DDX47zSDom5DfTtI1TpC/1MxKradRHNV +8KLKug2syDWoGHFGnSG+nU3xXw2w1c1dZex7V12F0LQ7jOO2AiOkYElM1Lz8zUVP +L3rp2HUGvwkY0QJXVSB74Z0RfJKSUyXvWx0e3HUHwKrm2pkMPZG5KAsGLV26IGN4 +bDf7BJQZxJMu81KIGfFOSDzghG+d1Tb23uwj8bNwgjH++SKSWdbUU4TG/TxSImwL +JUlZ+NhItvDv6pLU8O0IZobnQOEfCK7Y1u5K8NIXb30W7zrC9CuELdeXN0t6U6Md +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 +5CnxR9FGRCl0dg63tuEWR4dOuTL2a3Clteu0jmQiRxNsy/is2dQSup1Na/NtG5OS +NtiXxdC6smbIx7DvYoltxj4EB8PviQ8qyHN+HIUZ5yh7r0wdV8blQCsaMUwpoDML +olws41rldeWKDJBF3gJYojExyMUTuLRzb8vonEK2kzBsXBOXFv23jK2MjbQiOgm6 +g5ZWXI+yg5Tr7IMDkNWGxTUnCBqwH+dk3UW3XQr58//oKqxWifLIVRlLHZt6cy/2 +hyo6AsB39V272CuAJQYzSn/wd8fc0csAyv4BEAABAQAAAAAAAAAAAAAAAP/Y/+AA +EEpGSUYAAQEAAAEAAQAA/9sAQwAIBgYHBgUIBwcHCQkICgwUDQwLCwwZEhMPFB0a +Hx4dGhwcICQuJyAiLCMcHCg3KSwwMTQ0NB8nOT04MjwuMzQy/9sAQwEJCQkMCwwY +DQ0YMiEcITIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy +MjIyMjIyMjIy/8AAEQgAhwCHAwEiAAIRAQMRAf/EAB8AAAEFAQEBAQEBAAAAAAAA +AAABAgMEBQYHCAkKC//EALUQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNR +YQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZH +SElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Sl +pqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq8fLz9PX2 +9/j5+v/EAB8BAAMBAQEBAQEBAQEAAAAAAAABAgMEBQYHCAkKC//EALURAAIBAgQE +AwQHBQQEAAECdwABAgMRBAUhMQYSQVEHYXETIjKBCBRCkaGxwQkjM1LwFWJy0QoW +JDThJfEXGBkaJicoKSo1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2 +d3h5eoKDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJ +ytLT1NXW19jZ2uLj5OXm5+jp6vLz9PX29/j5+v/aAAwDAQACEQMRAD8A4lTz1p4O +arhgakDYpEFgNTwarhvepFakNE4apAarBqzNU16KxBjj+eb07D60DNxpo413OwUD +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 +=uPzA +-----END PGP PUBLIC KEY BLOCK----- diff --git a/nodes/rottenraptor-server.toml b/nodes/rottenraptor-server.toml index dadc232..8217091 100644 --- a/nodes/rottenraptor-server.toml +++ b/nodes/rottenraptor-server.toml @@ -18,6 +18,11 @@ ipmi_username = "Administrator" ipmi_password = "!bwpass:bw/rottenraptor-server/ipmi" ipmi_interface = "lanplus" +[metadata.apt.repos.tailscale] +items = [ + "deb https://pkgs.tailscale.com/stable/debian {os_release} main", +] + [metadata.docker-immich] enable_auto_album_share = true From f5617317e2b09dbfe6872b1d1841bed4badd133e Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Mon, 26 May 2025 17:13:44 +0200 Subject: [PATCH 252/252] rottenraptor-server: add radio vhost --- data/nginx/files/extras/rottenraptor-server/radio | 13 +++++++++++++ nodes/rottenraptor-server.toml | 4 ++++ 2 files changed, 17 insertions(+) create mode 100644 data/nginx/files/extras/rottenraptor-server/radio diff --git a/data/nginx/files/extras/rottenraptor-server/radio b/data/nginx/files/extras/rottenraptor-server/radio new file mode 100644 index 0000000..4452701 --- /dev/null +++ b/data/nginx/files/extras/rottenraptor-server/radio @@ -0,0 +1,13 @@ + location / { + proxy_pass http://172.30.17.52:8000/; + proxy_http_version 1.0; + proxy_buffering off; + proxy_read_timeout 7d; + + auth_basic "Rotten City Eventradio"; + auth_basic_user_file /etc/nginx/radio-htpasswd; + + location /admin/ { + deny all; + } + } diff --git a/nodes/rottenraptor-server.toml b/nodes/rottenraptor-server.toml index 8217091..c3f3d33 100644 --- a/nodes/rottenraptor-server.toml +++ b/nodes/rottenraptor-server.toml @@ -53,6 +53,10 @@ domain = "sso.rotten.city" [metadata.nginx.vhosts.immich] domain = "immich.rotten.city" +[metadata.nginx.vhosts.radio] +domain = "eventradio.rotten.city" +extras = true + [metadata.php] packages = [ "xml",