diff --git a/.envrc b/.envrc index 20ed2d0..c8c8ff6 100644 --- a/.envrc +++ b/.envrc @@ -10,8 +10,8 @@ python3 -m venv .venv source .venv/bin/activate PATH_add .venv/bin PATH_add bin -python3 -m pip install --upgrade pip wheel -python3 -m pip install --upgrade -r requirements.txt +python3 -m pip --require-virtualenv --quiet install --upgrade pip wheel +python3 -m pip --require-virtualenv --quiet install --upgrade -r requirements.txt rm -rf .cache/bw/git_deploy export BW_GIT_DEPLOY_CACHE=.cache/bw/git_deploy diff --git a/bundles/apt/items.py b/bundles/apt/items.py index 05e6a4c..204b626 100644 --- a/bundles/apt/items.py +++ b/bundles/apt/items.py @@ -68,7 +68,7 @@ for host, sources in hosts.items(): files[f'/etc/apt/sources.list.d/{host}.list'] = { 'content': '\n'.join(sorted(set( str(source).format( - release=node.metadata.get('os_release'), + codename=node.metadata.get('os_codename'), version=node.os_version[0], # WIP crystal ) for source in sources @@ -95,7 +95,7 @@ for package, options in node.metadata.get('apt/packages', {}).items(): files[f'/etc/apt/preferences.d/{package}'] = { 'content': '\n'.join([ f"Package: {package}", - f"Pin: release a={node.metadata.get('os_release')}-backports", + f"Pin: release a={node.metadata.get('os_codename')}-backports", f"Pin-Priority: 900", ]), 'needed_by': [ diff --git a/bundles/gitea/items.py b/bundles/gitea/items.py index c5bf653..52f91a9 100644 --- a/bundles/gitea/items.py +++ b/bundles/gitea/items.py @@ -6,7 +6,7 @@ version = version=node.metadata.get('gitea/version') downloads['/usr/local/bin/gitea'] = { 'url': f'https://dl.gitea.io/gitea/{version}/gitea-{version}-linux-amd64', - 'sha256': node.metadata.get('gitea/sha256'), + 'sha256_url': '{url}.sha256', 'triggers': { 'svc_systemd:gitea:restart', }, diff --git a/bundles/gitea/metadata.py b/bundles/gitea/metadata.py index 7eb54f1..1004590 100644 --- a/bundles/gitea/metadata.py +++ b/bundles/gitea/metadata.py @@ -30,8 +30,7 @@ defaults = { 'gitea.service': { 'Unit': { 'Description': 'gitea', - 'After': 'syslog.target', - 'After': 'network.target', + 'After': {'syslog.target', 'network.target'}, 'Requires': 'postgresql.service', }, 'Service': { diff --git a/bundles/icinga2/metadata.py b/bundles/icinga2/metadata.py index 7e58d3f..0dd3c20 100644 --- a/bundles/icinga2/metadata.py +++ b/bundles/icinga2/metadata.py @@ -9,7 +9,7 @@ defaults = { 'monitoring-plugins': {}, }, 'sources': { - 'deb https://packages.icinga.com/debian icinga-{release} main', + 'deb https://packages.icinga.com/debian icinga-{codename} main', }, }, 'icinga2': { diff --git a/bundles/icingaweb2/items.py b/bundles/icingaweb2/items.py index 44a188c..46a22a2 100644 --- a/bundles/icingaweb2/items.py +++ b/bundles/icingaweb2/items.py @@ -4,18 +4,27 @@ directories = { 'owner': 'www-data', 'group': 'icingaweb2', 'mode': '2770', + 'needs': [ + 'pkg_apt:icingaweb2', + ], }, '/etc/icingaweb2/enabledModules': { # 'purge': True, 'owner': 'www-data', 'group': 'icingaweb2', 'mode': '2770', + 'needs': [ + 'pkg_apt:icingaweb2', + ], }, '/etc/icingaweb2/modules': { # 'purge': True, 'owner': 'www-data', 'group': 'icingaweb2', 'mode': '2770', + 'needs': [ + 'pkg_apt:icingaweb2', + ], }, } @@ -25,6 +34,9 @@ files = { 'owner': 'www-data', 'group': 'icingaweb2', 'mode': '0660', + 'needs': [ + 'pkg_apt:icingaweb2', + ], }, } @@ -33,6 +45,9 @@ symlinks = { 'target': '/usr/share/icingaweb2/modules/monitoring', 'owner': 'www-data', 'group': 'icingaweb2', + 'needs': [ + 'pkg_apt:icingaweb2', + ], }, } @@ -48,6 +63,9 @@ for name in [ 'owner': 'www-data', 'group': 'icingaweb2', 'mode': '0660', + 'needs': [ + 'pkg_apt:icingaweb2', + ], } for name in [ @@ -60,4 +78,7 @@ for name in [ 'owner': 'www-data', 'group': 'icingaweb2', 'mode': '0660', + 'needs': [ + 'pkg_apt:icingaweb2', + ], } diff --git a/bundles/icingaweb2/metadata.py b/bundles/icingaweb2/metadata.py index 5e78709..346961d 100644 --- a/bundles/icingaweb2/metadata.py +++ b/bundles/icingaweb2/metadata.py @@ -14,7 +14,7 @@ defaults = { 'icingaweb2-module-monitoring': {}, }, 'sources': { - 'deb https://packages.icinga.com/debian icinga-{release} main', + 'deb https://packages.icinga.com/debian icinga-{codename} main', }, }, 'icingaweb2': { diff --git a/bundles/influxdb2/metadata.py b/bundles/influxdb2/metadata.py index c7ce52c..98dc0d3 100644 --- a/bundles/influxdb2/metadata.py +++ b/bundles/influxdb2/metadata.py @@ -7,7 +7,7 @@ defaults = { 'influxdb2-cli': {}, }, 'sources': { - 'deb https://repos.influxdata.com/debian {release} stable', + 'deb https://repos.influxdata.com/debian {codename} stable', }, }, 'nftables': { diff --git a/bundles/letsencrypt/files/hook.sh b/bundles/letsencrypt/files/hook.sh index f1d00e7..7289a1f 100644 --- a/bundles/letsencrypt/files/hook.sh +++ b/bundles/letsencrypt/files/hook.sh @@ -4,7 +4,7 @@ set -o pipefail deploy_challenge() { echo " - server 10.0.11.3 + server ${server} zone ${zone}. update add $1.${zone}. 60 IN TXT \"$3\" send @@ -13,7 +13,7 @@ deploy_challenge() { clean_challenge() { echo " - server 10.0.11.3 + server ${server} zone ${zone}. update delete $1.${zone}. TXT send diff --git a/bundles/nginx/metadata.py b/bundles/nginx/metadata.py index e4cb0ff..6d5835e 100644 --- a/bundles/nginx/metadata.py +++ b/bundles/nginx/metadata.py @@ -1,5 +1,4 @@ from shlex import quote -from ipaddress import ip_interface defaults = { diff --git a/bundles/nodejs/metadata.py b/bundles/nodejs/metadata.py index 1e4f046..faed20d 100644 --- a/bundles/nodejs/metadata.py +++ b/bundles/nodejs/metadata.py @@ -23,8 +23,8 @@ def sources(metadata): return { 'apt': { 'sources': { - f'deb https://deb.nodesource.com/node_{version}.x {{release}} main', - f'deb-src https://deb.nodesource.com/node_{version}.x {{release}} main', + f'deb https://deb.nodesource.com/node_{version}.x {{codename}} main', + f'deb-src https://deb.nodesource.com/node_{version}.x {{codename}} main', }, }, } diff --git a/bundles/systemd-mount/metadata.py b/bundles/systemd-mount/metadata.py index cfa0224..55667e0 100644 --- a/bundles/systemd-mount/metadata.py +++ b/bundles/systemd-mount/metadata.py @@ -15,16 +15,14 @@ defaults = { def units(metadata): units = {} services = {} - + for mountpoint, conf in metadata.get('systemd-mount').items(): formatted_name = mountpoint[1:].replace('-', '\\x2d').replace('/', '-') + '.mount' - + units[formatted_name] = { 'Unit': { 'Description': f"Mount {conf['source']} -> {mountpoint}", 'DefaultDependencies': 'no', - 'Conflicts': 'umount.target', - 'Before': 'umount.target', }, 'Mount': { 'What': conf['source'], @@ -32,16 +30,11 @@ def units(metadata): 'Type': 'fuse.bindfs', 'Options': f"nonempty", }, - 'Install': { - 'WantedBy': { - 'local-fs.target', - }, - }, } - + if conf.get('user'): units[formatted_name]['Mount']['Options'] += f",force-user={conf.get('user')}" - + services[formatted_name] = {} return { diff --git a/bundles/systemd-swap/items.py b/bundles/systemd-swap/items.py index 8df973e..e159f65 100644 --- a/bundles/systemd-swap/items.py +++ b/bundles/systemd-swap/items.py @@ -1,4 +1,4 @@ -size_mb = node.metadata.get('systemd-swap')//1_000_000 +size = node.metadata.get('systemd-swap') actions = { 'stop_swap': { @@ -15,8 +15,8 @@ actions = { }, }, 'create_swapfile': { - 'command': f'dd if=/dev/zero of=/swapfile bs=1000000 count={size_mb}', - 'unless': f'stat -c %s /swapfile | grep ^{size_mb*1_000_000}$', + 'command': f'fallocate -l {size} /swapfile', + 'unless': f'stat -c %s /swapfile | grep ^{size}$', 'preceded_by': { 'action:stop_swap', 'action:remove_swapfile', diff --git a/bundles/systemd/README.md b/bundles/systemd/README.md index b7e9cdd..f038708 100644 --- a/bundles/systemd/README.md +++ b/bundles/systemd/README.md @@ -3,7 +3,7 @@ ## show unit paths ``` -systemctl --no-pager --property=UnitPath show | tr ' ' '\n' +systemctl --no-pager --property=UnitPath show --value | tr ' ' '\n' ``` ## metadata diff --git a/bundles/systemd/metadata.py b/bundles/systemd/metadata.py index 364dc32..74c41a5 100644 --- a/bundles/systemd/metadata.py +++ b/bundles/systemd/metadata.py @@ -25,19 +25,14 @@ def units(metadata): type = name.split('.')[-1] - if not config.get('Install/WantedBy'): - if type == 'service': - units[name] = { - 'Install': { - 'WantedBy': {'multi-user.target'}, - } - } - elif type == 'timer': - units[name] = { - 'Install': { - 'WantedBy': {'timers.target'}, - } - } + if type == 'service': + units.setdefault(name, {}).setdefault('Install', {}).setdefault('WantedBy', {'multi-user.target'}) + elif type == 'timer': + units.setdefault(name, {}).setdefault('Install', {}).setdefault('WantedBy', {'timers.target'}) + elif type == 'mount': + units.setdefault(name, {}).setdefault('Install', {}).setdefault('WantedBy', {'local-fs.target'}) + units.setdefault(name, {}).setdefault('Unit', {}).setdefault('Conflicts', {'umount.target'}) + units.setdefault(name, {}).setdefault('Unit', {}).setdefault('Before', {'umount.target'}) return { 'systemd': { diff --git a/bundles/telegraf/metadata.py b/bundles/telegraf/metadata.py index 5953efb..3f1802a 100644 --- a/bundles/telegraf/metadata.py +++ b/bundles/telegraf/metadata.py @@ -95,11 +95,11 @@ defaults = { 'apt/sources', ) def apt(metadata): - release = { + codename = { 'buster': 'buster', 'bullseye': 'bullseye', 'bookworm': 'bullseye', - }[metadata.get('os_release')] + }[metadata.get('os_codename')] return { 'apt': { @@ -107,7 +107,7 @@ def apt(metadata): 'telegraf': {}, }, 'sources': { - f"deb https://repos.influxdata.com/debian {release} stable", + f"deb https://repos.influxdata.com/debian {codename} stable", }, }, } diff --git a/bundles/twitch-clip-download/items.py b/bundles/twitch-clip-download/items.py new file mode 100644 index 0000000..197d25b --- /dev/null +++ b/bundles/twitch-clip-download/items.py @@ -0,0 +1,7 @@ +directories = { + '/var/lib/twitch-clips': {}, +} + +pkg_pip = { + 'twitch-dl': {}, +} diff --git a/bundles/twitch-clip-download/metadata.py b/bundles/twitch-clip-download/metadata.py new file mode 100644 index 0000000..d5e75b8 --- /dev/null +++ b/bundles/twitch-clip-download/metadata.py @@ -0,0 +1,28 @@ +defaults = { + 'backup': { + 'paths': { + '/var/lib/twitch-clips', + }, + }, + 'systemd-timers': { + f'twitch-clip-download': { + 'command': '/usr/local/bin/twitch-dl clips cronekorkn_ --download --all', + 'when': 'daily', + 'persistent': True, + 'working_dir': '/var/lib/twitch-clips', + 'after': { + 'network-online.target', + }, + }, + }, + 'zfs': { + 'datasets': { + 'tank/twitch-clips': { + 'mountpoint': '/var/lib/twitch-clips', + 'needed_by': { + 'svc_systemd:twitch-clip-download.timer', + }, + }, + }, + }, +} diff --git a/groups/os/debian-11.py b/groups/os/debian-11.py index caf08aa..81c8de7 100644 --- a/groups/os/debian-11.py +++ b/groups/os/debian-11.py @@ -9,7 +9,7 @@ 'postgresql': { 'version': '13', }, - 'os_release': 'bullseye', + 'os_codename': 'bullseye', }, 'os_version': (11,), } diff --git a/groups/os/debian-12.py b/groups/os/debian-12.py index 0aff049..5c5f88e 100644 --- a/groups/os/debian-12.py +++ b/groups/os/debian-12.py @@ -9,7 +9,7 @@ 'postgresql': { 'version': '14', }, - 'os_release': 'bookworm', + 'os_codename': 'bookworm', }, 'os_version': (12,), } diff --git a/groups/os/debian.py b/groups/os/debian.py index ac8c8f6..0c2d28f 100644 --- a/groups/os/debian.py +++ b/groups/os/debian.py @@ -10,10 +10,10 @@ 'metadata': { 'apt': { 'sources': { - 'deb https://deb.debian.org/debian {release} main contrib non-free', - 'deb https://deb.debian.org/debian {release}-updates main contrib non-free', - 'deb https://deb.debian.org/debian {release}-backports main contrib non-free', - 'deb https://security.debian.org/ {release}-security main contrib non-free', + 'deb https://deb.debian.org/debian {codename} main contrib non-free', + 'deb https://deb.debian.org/debian {codename}-updates main contrib non-free', + 'deb https://deb.debian.org/debian {codename}-backports main contrib non-free', + 'deb https://security.debian.org/ {codename}-security main contrib non-free', }, 'packages': { 'mtr-tiny': {}, diff --git a/nodes/home.server.py b/nodes/home.server.py index 7eb4404..56fca00 100644 --- a/nodes/home.server.py +++ b/nodes/home.server.py @@ -30,6 +30,7 @@ 'steam-chat-logger', 'steam-chat-viewer', 'systemd-swap', + 'twitch-clip-download', 'raspberrymatic-cert', 'tasmota-charge', 'wireguard', @@ -60,8 +61,7 @@ 'download_server': 'netcup.mails', }, 'gitea': { - 'version': '1.17.1', - 'sha256': 'eafd476ee2a303d758448314272add00898d045439ab0d353ff4286c5e63496f', + 'version': '1.19.1', 'domain': 'git.sublimity.de', 'conf': { 'mailer': { @@ -153,6 +153,9 @@ 'max': 70, }, }, + 'twitch-clip-download': { + 'channel_name': 'cronekorkn_', + }, 'vm': { 'cores': 16, 'threads': 32,