Compare commits

..

70 commits

Author SHA1 Message Date
Franzi d282d77a99
bundles/docker-ce: sort nftables rules 2023-02-17 05:11:29 +01:00
Franzi cb4d28c994
bundles/woodpecker-agent: fix metadata reactor 2023-02-17 05:11:26 +01:00
Franzi 071250d798
bundles/docker-ce: add nftables rules 2023-02-17 05:11:23 +01:00
Franzi efdff6ef28
ci: fix editorconfig 2023-02-17 05:11:20 +01:00
Franzi d2caadb41b
ci: determinism tests need to run using dummy mode 2023-02-17 05:11:18 +01:00
Franzi 9b44bcf3a8
try running the test pipeline in woodpecker 2023-02-17 05:11:15 +01:00
Franzi 24f9f87734
add bundle:woodpecker-agent 2023-02-17 05:11:12 +01:00
Franzi 019cc69371
add bundle:docker-ce 2023-02-17 05:11:09 +01:00
Franzi eee786fabf
bundles/woodpecker-server: add GODEBUG=netns=go 2023-02-17 05:11:06 +01:00
Franzi c2e93c0abb
bundles/woodpecker: try to get it working 2023-02-17 05:11:03 +01:00
Franzi cc767867cf
add bundle:woodpecker-server 2023-02-17 05:10:57 +01:00
Franzi 6cb56ab2ec
rx300: allow more postgresql connections 2023-02-17 05:03:39 +01:00
Franzi 5c4fc37a37
update mautrix-whatsapp to 0.8.2 2023-02-17 05:03:25 +01:00
Franzi 68d51450fd
update forgejo to 1.18.3-1 2023-02-17 05:03:01 +01:00
Franzi d57844928d
update matrix-media-repo to 1.2.13 2023-02-17 05:02:40 +01:00
Franzi 4975562fbc
update element-web to 1.11.23 2023-02-17 05:02:13 +01:00
Franzi 25e03582b0
entropia-jira- stuff has changed 2023-02-17 05:01:28 +01:00
Franzi b49dc56c33
Jenkinsfile: also check using isort 2023-02-05 17:36:16 +01:00
Franzi 4122a7ccf8
isort the repo 2023-02-05 17:30:58 +01:00
Franzi 429bc2a7c6
bundles/homeassistant: fix .provides() 2023-02-05 17:28:52 +01:00
Franzi 6f9fb78d4e
rx300: update netbox to 3.4.4 2023-02-05 17:25:37 +01:00
Franzi bb1b430d16
rx300: update forgejo to 1.18.3-0 2023-02-05 17:25:18 +01:00
Franzi 1906e7c256
bundles/gitea: derive version number from installed gitea 2023-02-05 17:24:50 +01:00
Franzi 7dcad0d584
update element-web to 1.11.22 2023-02-04 16:30:53 +01:00
Franzi 077b25f67e
bundles/miniflux: repo has changed
... also now everything is unsigned, yeaaaaaaaaaaaah
2023-02-02 19:29:28 +01:00
Franzi 527181bba8
home.router: fix dyndns hostname 2023-01-29 11:15:59 +01:00
Franzi 53e189c644
ssl: bump _.home.kunbox.net 2023-01-29 11:14:31 +01:00
Franzi eeceebfd23
dns: add new primary nameserver 2023-01-29 11:06:58 +01:00
Franzi 7bd8237876
bashrc: add 'ipa' alias 2023-01-29 11:03:38 +01:00
Franzi 55bebda4d4
bundles/powerdns: fix socket path for telegraf 2023-01-29 11:02:49 +01:00
Franzi ef16a2d081
bundles/powerdns: rework zone file generation 2023-01-29 11:01:48 +01:00
Franzi 264ea3e8a7
bundles/systemd-networkd: remove isc-dhcp-client 2023-01-29 10:13:26 +01:00
Franzi 109914c039
bundles/powerdnsadmin: create virtualenv after packages are installed 2023-01-29 10:04:47 +01:00
Franzi 8df4441028
rx300: update netbox to 3.4.3 2023-01-29 09:44:28 +01:00
Franzi 733e4bf0e5
rx300: update mautrix-whatsapp to 0.8.1 2023-01-29 09:44:09 +01:00
Franzi 6cec7e2c9c
rx300: update element-web to 1.11.20 2023-01-29 09:43:49 +01:00
Franzi f6b0c587d0
rename some gitea stuff to forgejo 2023-01-29 09:42:36 +01:00
Franzi a8e2e6b5ad
bundles/gitea: adjust config for 1.18 2023-01-29 09:40:38 +01:00
Franzi 17aee0f6bb
update gitea to forgejo 1.18.2-1 2023-01-29 09:35:29 +01:00
Franzi a3218ac41f
bundles/sshmon: fix hostname in check_forgejo_for_new_release 2023-01-29 09:35:05 +01:00
Franzi 932fd9e994
scripts/letsencrypt-wildcard: remove trailing dot from dns records
we're now using a delegated zone, thus this is wrong there
2023-01-29 09:26:52 +01:00
Franzi 2e6e6b663e
bundles/powerdns: also send out notify to all secondaries 2023-01-29 09:21:59 +01:00
Franzi 74d44535a8
dns: fix cname for acme-challenge 2023-01-29 09:11:02 +01:00
Franzi cb2b01a2b4
dns: fix cname for acme-challenge 2023-01-29 08:56:13 +01:00
Franzi 9684e94e4d
dns: switch everything but kunbox.net to psql 2023-01-29 08:47:50 +01:00
Franzi c93a4d0a99
powerdns: switch to AXFR for secondarie 2023-01-29 08:35:08 +01:00
Franzi 31e614ab3b
bundles/powerdns: allow exposing API to the world 2023-01-29 08:06:27 +01:00
Franzi 60585a3716
bundles/homeassistant: fix typo 2023-01-29 07:04:38 +01:00
Franzi c717e86f70
bundles/homeassistant: fix website_check 2023-01-29 07:03:28 +01:00
Franzi ff8928dd0b
remove openhab, move backups to hass 2023-01-29 06:54:48 +01:00
Franzi ba97cd432f
bundles/icinga2: icingaweb2 apparently ships monitoring module by itself 2023-01-29 06:45:34 +01:00
Franzi f45a759a43
ssl: bump _.franzi.business 2023-01-29 06:42:07 +01:00
Franzi b4b3fec8a7
move franzi.business to psql-managed zone 2023-01-29 06:41:47 +01:00
Franzi 1899dfc278
dns: update to debian bullseye and postgresql 15 2023-01-28 18:10:35 +01:00
Franzi d8aa1e80d0
get rid of molly-guard 2023-01-28 18:10:32 +01:00
Franzi e634c184c0
data/powerdns: convert some zones to psql 2023-01-28 18:10:29 +01:00
Franzi 07dce73bca
bundles/sshmon: get rid of sysstat 2023-01-28 18:10:24 +01:00
Franzi c5ccc31ad9
get rid of molly-guard 2023-01-28 18:10:21 +01:00
Franzi ab76721ddb
bundles/powerdnsadmin: install psycopg2 in venv 2023-01-28 18:10:18 +01:00
Franzi b460085bb0
bundles/powerdns: enable superslave if supported 2023-01-28 18:10:14 +01:00
Franzi ba3bf20db7
new gpg key for influxdb repo 2023-01-28 18:10:12 +01:00
Franzi 5ed4c1e9bd
update netbox to 3.4.2 2023-01-28 18:10:09 +01:00
Franzi 446e0d057e
update travelynx to 1.29.4 2023-01-28 18:10:05 +01:00
Sophie Schiller e393f3cc3c htz-cloud/miniserver element-web update 2023-01-27 20:35:49 +01:00
Sophie Schiller 7ee2d08007 element-web update 2023-01-19 17:53:32 +01:00
Franzi c94aef55a5
bundles/dovecot: enable sieve logging 2022-12-31 16:33:10 +01:00
Franzi 970d97b0a2
nodes/home.wled-wohnzimmer: new mac address 2022-12-30 20:35:05 +01:00
Franzi c04ce63c35
bundles/arch-with-gui: more packages via bundle, less via nodefile 2022-12-29 13:45:06 +01:00
Franzi 070b466abe
bundles/travelynx: update bundle for new version 2022-12-27 13:38:53 +01:00
Franzi 82143e34ad
update travelynx to 1.28.5 2022-12-27 13:38:39 +01:00
104 changed files with 334 additions and 778 deletions

33
Jenkinsfile vendored
View file

@ -1,15 +1,6 @@
pipeline { pipeline {
agent any agent any
stages { stages {
stage('editorconfig-checker') {
steps {
sh """
wget -Oec-linux-amd64.tar.gz https://github.com/editorconfig-checker/editorconfig-checker/releases/latest/download/ec-linux-amd64.tar.gz
tar -xzf ec-linux-amd64.tar.gz && rm ec-linux-amd64.tar.gz
bin/ec-linux-amd64 -no-color -exclude '^bin/'
"""
}
}
stage('install_requirements') { stage('install_requirements') {
steps { steps {
sh """ sh """
@ -18,13 +9,31 @@ pipeline {
virtualenv -p python3 venv virtualenv -p python3 venv
. venv/bin/activate . venv/bin/activate
pip install --upgrade pip pip install --upgrade pip isort
pip install -r requirements.txt pip install -r requirements.txt
""" """
} }
} }
stage('bw test') { stage('tests') {
parallel { parallel {
stage('syntax checking using editorconfig-checker') {
steps {
sh """
wget -Oec-linux-amd64.tar.gz https://github.com/editorconfig-checker/editorconfig-checker/releases/latest/download/ec-linux-amd64.tar.gz
tar -xzf ec-linux-amd64.tar.gz && rm ec-linux-amd64.tar.gz
bin/ec-linux-amd64 -no-color -exclude '^bin/'
"""
}
}
stage('syntax checking using isort') {
steps {
sh """
. venv/bin/activate
isort --check .
"""
}
}
stage('config and metadata determinism') { stage('config and metadata determinism') {
steps { steps {
sh """ sh """
@ -36,7 +45,7 @@ pipeline {
""" """
} }
} }
stage('other tests') { stage('bw test -i') {
steps { steps {
sh """ sh """
. venv/bin/activate . venv/bin/activate

View file

@ -36,7 +36,7 @@ Rule of thumb: keep ports below 10000 free for stuff that reserves ports.
| 20090 | matrix-media-repo | prometheus metrics | | 20090 | matrix-media-repo | prometheus metrics |
| 21000 | pleroma | pleroma | | 21000 | pleroma | pleroma |
| 21010 | grafana | grafana | | 21010 | grafana | grafana |
| 22000 | gitea | gitea | | 22000 | gitea | forgejo |
| 22010 | jenkins-ci | Jenkins CI | | 22010 | jenkins-ci | Jenkins CI |
| 22020 | travelynx | Travelynx Web | | 22020 | travelynx | Travelynx Web |
| 22030 | octoprint | OctoPrint Web Interface | | 22030 | octoprint | OctoPrint Web Interface |
@ -45,7 +45,6 @@ Rule of thumb: keep ports below 10000 free for stuff that reserves ports.
| 22060 | pretalx | gunicorn | | 22060 | pretalx | gunicorn |
| 22070 | paperless-ng | gunicorn | | 22070 | paperless-ng | gunicorn |
| 22080 | netbox | gunicorn | | 22080 | netbox | gunicorn |
| 22090 | openhab | http |
| 22100 | woodpecker-server | http | | 22100 | woodpecker-server | http |
| 22101 | woodpecker-server | gRPC | | 22101 | woodpecker-server | gRPC |
| 22999 | nginx | stub_status | | 22999 | nginx | stub_status |

View file

@ -143,6 +143,9 @@ pkg_apt = {
'cloud-init': { 'cloud-init': {
'installed': False, 'installed': False,
}, },
'molly-guard': {
'installed': False,
},
'netplan.io': { 'netplan.io': {
'installed': False, 'installed': False,
}, },

View file

@ -38,9 +38,14 @@ defaults = {
'rofi': {}, 'rofi': {},
# sound # sound
'calf': {},
'easyeffects': {},
'lsp-plugins': {},
'pavucontrol': {}, 'pavucontrol': {},
'pulseaudio': {}, 'pipewire': {},
'pulseaudio-zeroconf': {}, 'pipewire-jack': {},
'pipewire-pulse': {},
'qpwgraph': {},
# window management # window management
'i3-wm': {}, 'i3-wm': {},
@ -53,6 +58,7 @@ defaults = {
# Xorg # Xorg
'xf86-input-libinput': {}, 'xf86-input-libinput': {},
'xf86-input-wacom': {},
'xorg-server': {}, 'xorg-server': {},
'xorg-setxkbmap': {}, 'xorg-setxkbmap': {},
'xorg-xev': {}, 'xorg-xev': {},
@ -62,20 +68,27 @@ defaults = {
# all them apps # all them apps
'browserpass': {}, 'browserpass': {},
'browserpass-firefox': {}, 'browserpass-firefox': {},
'ffmpeg': {},
'firefox': {}, 'firefox': {},
'gimp': {}, 'gimp': {},
'imagemagick': {},
'inkscape': {}, 'inkscape': {},
'kdenlive': {},
'maim': {}, 'maim': {},
'mosh': {}, 'mosh': {},
'mosquitto': {},
'mpv': {}, 'mpv': {},
'pass': {}, 'pass': {},
'pass-otp': {}, 'pass-otp': {},
'pdftk': {}, 'pdftk': {},
'pwgen': {}, 'pwgen': {},
'qpdfview': {}, 'qpdfview': {},
'samba': {},
'shotcut': {},
'sipcalc': {}, 'sipcalc': {},
'the_silver_searcher': {}, 'the_silver_searcher': {},
'tlp': {}, 'tlp': {},
'virt-manager': {},
'xclip': {}, 'xclip': {},
'xdotool': {}, # needed for maim window selection 'xdotool': {}, # needed for maim window selection
}, },

View file

@ -1,6 +1,7 @@
repo.libs.tools.require_bundle(node, 'zfs') repo.libs.tools.require_bundle(node, 'zfs')
from os.path import join from os.path import join
from bundlewrap.metadata import metadata_to_json from bundlewrap.metadata import metadata_to_json
dataset = node.metadata.get('backup-server/zfs-base') dataset = node.metadata.get('backup-server/zfs-base')

View file

@ -1,4 +1,5 @@
from ipaddress import ip_network from ipaddress import ip_network
from bundlewrap.exceptions import NoSuchNode from bundlewrap.exceptions import NoSuchNode
from bundlewrap.metadata import atomic from bundlewrap.metadata import atomic

View file

@ -12,14 +12,6 @@ defaults = {
'docker-ce-cli': {}, 'docker-ce-cli': {},
}, },
}, },
'nftables': {
'rules': {
'00-docker-ce': {
'inet filter forward ct state { related, established } accept',
'inet filter forward iifname docker0 accept',
},
},
},
} }
@ -27,7 +19,10 @@ defaults = {
'nftables/rules/00-docker-ce', 'nftables/rules/00-docker-ce',
) )
def nftables_nat(metadata): def nftables_nat(metadata):
rules = set() rules = {
'inet filter forward ct state { related, established } accept',
'inet filter forward iifname docker0 accept',
}
for iface in metadata.get('interfaces'): for iface in metadata.get('interfaces'):
rules.add(f'nat postrouting oifname {iface} masquerade') rules.add(f'nat postrouting oifname {iface} masquerade')
@ -35,7 +30,7 @@ def nftables_nat(metadata):
return { return {
'nftables': { 'nftables': {
'rules': { 'rules': {
'00-docker-ce': rules, '00-docker-ce': sorted(rules),
}, },
}, },
} }

View file

@ -46,11 +46,12 @@ plugin {
zlib_save_level = 6 zlib_save_level = 6
zlib_save = gz zlib_save = gz
sieve_plugins = sieve_imapsieve sieve_extprograms
sieve_dir = /var/mail/vmail/sieve/%d/%n/
sieve = /var/mail/vmail/sieve/%d/%n.sieve sieve = /var/mail/vmail/sieve/%d/%n.sieve
sieve_pipe_bin_dir = /var/mail/vmail/sieve/bin sieve_dir = /var/mail/vmail/sieve/%d/%n/
sieve_extensions = +vnd.dovecot.pipe sieve_extensions = +vnd.dovecot.pipe
sieve_pipe_bin_dir = /var/mail/vmail/sieve/bin
sieve_plugins = sieve_imapsieve sieve_extprograms
sieve_user_log = /var/mail/vmail/sieve/%d/%n.log
old_stats_refresh = 30 secs old_stats_refresh = 30 secs
old_stats_track_cmds = yes old_stats_track_cmds = yes

View file

@ -21,7 +21,6 @@ ROOT_URL = https://${domain}/
DISABLE_SSH = false DISABLE_SSH = false
SSH_PORT = 22 SSH_PORT = 22
LFS_START_SERVER = true LFS_START_SERVER = true
LFS_CONTENT_PATH = /var/lib/gitea/data/lfs
LFS_JWT_SECRET = ${lfs_secret_key} LFS_JWT_SECRET = ${lfs_secret_key}
OFFLINE_MODE = true OFFLINE_MODE = true
START_SSH_SERVER = false START_SSH_SERVER = false
@ -67,7 +66,7 @@ EMAIL_DOMAIN_BLOCKLIST = ${','.join(sorted(email_domain_blocklist))}
[mailer] [mailer]
ENABLED = true ENABLED = true
MAILER_TYPE = sendmail PROTOCOL = sendmail
FROM = "${app_name}" <noreply@${domain}> FROM = "${app_name}" <noreply@${domain}>
[session] [session]

View file

@ -40,10 +40,7 @@ files = {
}, },
'/usr/local/bin/gitea': { '/usr/local/bin/gitea': {
'content_type': 'download', 'content_type': 'download',
#'source': 'https://dl.gitea.io/gitea/{version}/gitea-{version}-linux-amd64'.format(version=node.metadata.get('gitea/version')), 'source': node.metadata.get('gitea/url'),
'source': 'https://github.com/go-gitea/gitea/releases/download/v{version}/gitea-{version}-linux-amd64'.format(
version=node.metadata.get('gitea/version'),
),
'content_hash': node.metadata.get('gitea/sha1', None), 'content_hash': node.metadata.get('gitea/sha1', None),
'mode': '0755', 'mode': '0755',
'triggers': { 'triggers': {

View file

@ -6,7 +6,7 @@ defaults = {
}, },
}, },
'gitea': { 'gitea': {
'app_name': 'Gitea', 'app_name': 'Forgejo',
'database': { 'database': {
'username': 'gitea', 'username': 'gitea',
'password': repo.vault.password_for('{} postgresql gitea'.format(node.name)), 'password': repo.vault.password_for('{} postgresql gitea'.format(node.name)),
@ -23,9 +23,14 @@ defaults = {
'icinga2_api': { 'icinga2_api': {
'gitea': { 'gitea': {
'services': { 'services': {
'GITEA PROCESS': { 'FORGEJO PROCESS': {
'command_on_monitored_host': '/usr/local/share/icinga/plugins/check_systemd_unit gitea', 'command_on_monitored_host': '/usr/local/share/icinga/plugins/check_systemd_unit gitea',
}, },
'FORGEJO UPDATE': {
'command_on_monitored_host': '/usr/local/share/icinga/plugins/check_forgejo_for_new_release codeberg.org forgejo/forgejo v$(gitea --version | cut -d" " -f3)',
'vars.notification.mail': True,
'check_interval': '60m',
},
}, },
}, },
}, },
@ -67,7 +72,7 @@ defaults = {
@metadata_reactor.provides( @metadata_reactor.provides(
'nginx/vhosts/gitea', 'nginx/vhosts/forgejo',
) )
def nginx(metadata): def nginx(metadata):
if not node.has_bundle('nginx'): if not node.has_bundle('nginx'):
@ -76,7 +81,7 @@ def nginx(metadata):
return { return {
'nginx': { 'nginx': {
'vhosts': { 'vhosts': {
'gitea': { 'forgejo': {
'domain': metadata.get('gitea/domain'), 'domain': metadata.get('gitea/domain'),
'locations': { 'locations': {
'/': { '/': {
@ -99,16 +104,4 @@ def nginx(metadata):
) )
def icinga_check_for_new_release(metadata): def icinga_check_for_new_release(metadata):
return { return {
'icinga2_api': {
'gitea': {
'services': {
'GITEA UPDATE': {
# this is only temporary. We will switch to forgejo once they have their first stable release.
'command_on_monitored_host': '/usr/local/share/icinga/plugins/check_forgejo_for_new_release codeberg.org forgejo/forgejo v{}'.format(metadata.get('gitea/version')),
'vars.notification.mail': True,
'check_interval': '60m',
},
},
},
},
} }

View file

@ -41,7 +41,7 @@ try:
message = f"WARNING - stable version {stable_version} is lower than running version {running_version}, check if downgrade is necessary." message = f"WARNING - stable version {stable_version} is lower than running version {running_version}, check if downgrade is necessary."
else: else:
status = 2 status = 2
message = f"CRITICAL - update necessary, running verison {running_version} is lower than stable version {stable_version}" message = f"CRITICAL - update necessary, running version {running_version} is lower than stable version {stable_version}"
except Exception as e: except Exception as e:
message = f"{message}: {repr(e)}" message = f"{message}: {repr(e)}"

View file

@ -1,5 +1,3 @@
from bundlewrap.metadata import atomic
defaults = { defaults = {
'apt': { 'apt': {
'packages': { 'packages': {
@ -25,7 +23,7 @@ defaults = {
}, },
} }
@metadata_reactor.provides( @metadata_reactor.provides(
'icinga2_api/homeassistant/services/HOMESSISTANT UPDATE', 'icinga2_api/homeassistant/services',
) )
def icinga_check_for_new_release(metadata): def icinga_check_for_new_release(metadata):
return { return {
@ -54,8 +52,8 @@ def nginx(metadata):
'vhosts': { 'vhosts': {
'homeassistant': { 'homeassistant': {
'domain': metadata.get('homeassistant/domain'), 'domain': metadata.get('homeassistant/domain'),
'website_check_path': '/', 'website_check_path': '/auth/authorize',
'website_check_string': 'Homeassistant', 'website_check_string': 'Home Assistant',
'locations': { 'locations': {
'/': { '/': {
'target': 'http://127.0.0.1:8123', 'target': 'http://127.0.0.1:8123',

View file

@ -1,8 +1,9 @@
#!/usr/bin/env python3 #!/usr/bin/env python3
from requests import get
from sys import argv, exit from sys import argv, exit
from requests import get
meshviewer_url = argv[1] meshviewer_url = argv[1]
node_id = argv[2] node_id = argv[2]
node = None node = None

View file

@ -1,8 +1,9 @@
#!/usr/bin/env python3 #!/usr/bin/env python3
from requests import get
from sys import exit from sys import exit
from requests import get
SIPGATE_USER = '${node.metadata['icinga2']['sipgate_user']}' SIPGATE_USER = '${node.metadata['icinga2']['sipgate_user']}'
SIPGATE_PASS = '${node.metadata['icinga2']['sipgate_pass']}' SIPGATE_PASS = '${node.metadata['icinga2']['sipgate_pass']}'

View file

@ -1,12 +1,10 @@
#!/usr/bin/env python3 #!/usr/bin/env python3
from concurrent.futures import ThreadPoolExecutor, as_completed from concurrent.futures import ThreadPoolExecutor, as_completed
from ipaddress import ip_address, IPv6Address from ipaddress import IPv6Address, ip_address
from subprocess import check_output from subprocess import check_output
from sys import argv, exit from sys import argv, exit
BLOCKLISTS = [ BLOCKLISTS = [
'0spam.fusionzero.com', '0spam.fusionzero.com',
'bl.mailspike.org', 'bl.mailspike.org',

View file

@ -4,10 +4,11 @@ import email.mime.text
import smtplib import smtplib
from argparse import ArgumentParser from argparse import ArgumentParser
from json import dumps from json import dumps
from requests import post
from subprocess import run from subprocess import run
from sys import argv from sys import argv
from requests import post
SIPGATE_USER='${node.metadata['icinga2']['sipgate_user']}' SIPGATE_USER='${node.metadata['icinga2']['sipgate_user']}'
SIPGATE_PASS='${node.metadata['icinga2']['sipgate_pass']}' SIPGATE_PASS='${node.metadata['icinga2']['sipgate_pass']}'

View file

@ -17,7 +17,9 @@ defaults = {
'icinga2': {}, 'icinga2': {},
'icinga2-ido-pgsql': {}, 'icinga2-ido-pgsql': {},
'icingaweb2': {}, 'icingaweb2': {},
'icingaweb2-module-monitoring': {},
# apparently no longer needed
#'icingaweb2-module-monitoring': {},
# neeeded for statusmonitor # neeeded for statusmonitor
'python3-flask': {}, 'python3-flask': {},

View file

@ -1,9 +1,9 @@
#!/usr/bin/env python3 #!/usr/bin/env python3
from os import environ from os import environ
from requests import get, post
from sys import argv, exit from sys import argv, exit
from requests import get, post
SYNAPSE_MAX_ROOMS_TO_GET = 20000 SYNAPSE_MAX_ROOMS_TO_GET = 20000
SYNAPSE_HOST = 'http://[::1]:20080/' SYNAPSE_HOST = 'http://[::1]:20080/'

View file

@ -6,7 +6,7 @@ defaults = {
'repos': { 'repos': {
'miniflux': { 'miniflux': {
'items': { 'items': {
'deb https://apt.miniflux.app/ /', 'deb [trusted=yes] https://repo.miniflux.app/apt/ /',
}, },
}, },
}, },

View file

@ -1,9 +0,0 @@
#!/bin/bash
# Checks wether upgrade-and-reboot is currently running.
if [[ -f "/var/lib/bundlewrap/soft-${node.name}/UNATTENDED" ]]
then
echo "Sorry, can't $MOLLYGUARD_CMD now, upgrade-and-reboot is running"
exit 1
fi

View file

@ -1,29 +0,0 @@
#!/bin/sh
# This script will ask for the bundlewrap node name. This replaces the
# original script, which will ask for the hostname, which sometimes
# is not enough to properly identify the system.
NODE_NAME="${node.name}"
# If this is not a terminal, do nothing
test -t 0 || exit 0
sigh()
{
echo "Sorry, input does not match. Won't $MOLLYGUARD_CMD $NODE_NAME ..." >&2
exit 1
}
trap 'echo;sigh' 1 2 3 9 10 12 15
echo -n "Please enter the bundlewrap node name of this System to $MOLLYGUARD_CMD: "
read NODE_NAME_USER || :
NODE_NAME_USER="$(echo "$NODE_NAME_USER" | tr '[:upper:]' '[:lower:]')"
[ "$NODE_NAME_USER" = "$NODE_NAME" ] || sigh
trap - 1 2 3 9 10 12 15
exit 0

View file

@ -1 +0,0 @@
# currently unused

View file

@ -1,27 +0,0 @@
directories = {
'/etc/molly-guard/messages.d': {
'purge': True,
'after': {
'pkg_apt:molly-guard',
},
},
'/etc/molly-guard/run.d': {
'purge': True,
'after': {
'pkg_apt:molly-guard',
},
},
}
files = {
'/etc/molly-guard/rc': {},
'/etc/molly-guard/run.d/10-check-unattended-upgrades': {
'content_type': 'mako',
'mode': '0755',
},
'/etc/molly-guard/run.d/30-query-hostname': {
'content_type': 'mako',
'mode': '0755',
},
}

View file

@ -1,7 +0,0 @@
defaults = {
'apt': {
'packages': {
'molly-guard': {},
},
},
}

View file

@ -7,7 +7,6 @@ from time import sleep
import paho.mqtt.client as mqtt import paho.mqtt.client as mqtt
BROKER_HOST = argv[1] BROKER_HOST = argv[1]
BROKER_TOPIC = argv[2] BROKER_TOPIC = argv[2]

View file

@ -1,6 +1,5 @@
from bundlewrap.metadata import atomic from bundlewrap.metadata import atomic
defaults = { defaults = {
'apt': { 'apt': {
'packages': { 'packages': {

View file

@ -1,8 +1,9 @@
#!/usr/bin/env python3 #!/usr/bin/env python3
from requests import get
from sys import exit from sys import exit
from requests import get
api_key = '${api_key}' api_key = '${api_key}'
try: try:

View file

@ -1,5 +0,0 @@
#!/bin/bash
find /var/lib/openhab/backups -type f -mtime +3 -delete
/usr/share/openhab/runtime/bin/backup --full

View file

@ -1,62 +0,0 @@
# openHAB service options
#########################
## PORTS
## The ports openHAB will bind its HTTP/HTTPS web server to.
OPENHAB_HTTP_PORT=22090
#OPENHAB_HTTPS_PORT=8443
#########################
## HTTP(S) LISTEN ADDRESS
## The listen address used by the HTTP(S) server.
## 0.0.0.0 (default) allows a connection from any location
## 127.0.0.1 only allows the local machine to connect
OPENHAB_HTTP_ADDRESS=127.0.0.1
#########################
## BACKUP DIRECTORY
## Set the following variable to specify the backup location.
## runtime/bin/backup and runtime/bin/restore will use this path for the zip files.
#OPENHAB_BACKUPS=/var/lib/openhab/backups
#########################
## JAVA OPTIONS
## Additional options for the JAVA_OPTS environment variable.
## These will be appended to the execution of the openHAB Java runtime in front of all other options.
##
## A couple of independent examples:
## EXTRA_JAVA_OPTS="-Dgnu.io.rxtx.SerialPorts=/dev/ttyZWAVE:/dev/ttyUSB0:/dev/ttyS0:/dev/ttyS2:/dev/ttyACM0:/dev/ttyAMA0"
## EXTRA_JAVA_OPTS="-Djna.library.path=/lib/arm-linux-gnueabihf/ -Duser.timezone=Europe/Berlin -Dgnu.io.rxtx.SerialPorts=/dev/ttyZWave"
EXTRA_JAVA_OPTS="${extra_java_opts}"
#########################
## OPENHAB DEFAULTS PATHS
## The following settings override the default apt/rpm locations and should be used with caution.
## openHAB will fail to update itself if you're using different paths.
## Only set these if you are testing and are confident in debugging.
#OPENHAB_HOME=/usr/share/openhab
#OPENHAB_CONF=/etc/openhab
#OPENHAB_RUNTIME=/usr/share/openhab/runtime
#OPENHAB_USERDATA=/var/lib/openhab
#OPENHAB_LOGDIR=/var/log/openhab
#########################
## OPENHAB USER AND GROUP
## The user and group that takes ownership of openHAB. Only available for init.d systems.
## To edit user and group for systemd, see the service file at /usr/lib/systemd/system/openhab.service.
#OPENHAB_USER=openhab
#OPENHAB_GROUP=openhab
#########################
## SYSTEMD START MODE
## The Karaf startmode for the openHAB runtime. Only available for systemctl/systemd systems.
## Defaults to daemon when unset here. Multiple options can be used without quotes.
## debug increases log output. daemon launches the Karaf/openHAB processes.
#OPENHAB_STARTMODE=debug

View file

@ -1,32 +0,0 @@
extra_java_opts = []
for opt, value in sorted(node.metadata.get('openhab/java_opts', {}).items()):
if value is None:
extra_java_opts.append(f'-D{opt}')
else:
extra_java_opts.append(f'-D{opt}={value}')
files = {
'/etc/default/openhab': {
'content_type': 'mako',
'context': {
'extra_java_opts': ' '.join(extra_java_opts),
},
'triggers': {
'svc_systemd:openhab:restart',
},
},
'/etc/backup-pre-hooks.d/40-openhab': {
'source': 'backup-pre-hook',
'mode': '0755',
}
}
svc_systemd = {
'openhab': {
'needs': {
'pkg_apt:openhab',
'pkg_apt:openhab-addons',
},
},
}

View file

@ -1,55 +0,0 @@
defaults = {
'apt': {
'packages': {
'openjdk-17-jre': {},
'openhab': {
'needs': {
'pkg_apt:openjdk-17-jre',
},
},
'openhab-addons': {
'needs': {
'pkg_apt:openhab',
},
},
},
'repos': {
'openhab': {
'items': {
'deb https://openhab.jfrog.io/artifactory/openhab-linuxpkg stable main',
},
},
},
},
'backups': {
'paths': {
'/usr/share/openhab/addons', # not included in openhab backup
'/var/lib/openhab',
},
},
}
@metadata_reactor.provides(
'nginx/vhosts/openhab',
)
def nginx(metadata):
if not node.has_bundle('nginx'):
raise DoNotRunAgain
return {
'nginx': {
'vhosts': {
'openhab': {
'domain': metadata.get('openhab/domain'),
'locations': {
'/': {
'target': 'http://localhost:22090/',
},
},
'website_check_path': '/',
'website_check_string': 'openHAB',
},
},
},
}

View file

@ -4,7 +4,6 @@
from json import loads from json import loads
from subprocess import check_output from subprocess import check_output
queue_counts = {} queue_counts = {}
queue_json = check_output(['sudo', '/usr/sbin/postqueue', '-j']) queue_json = check_output(['sudo', '/usr/sbin/postqueue', '-j'])

View file

@ -1,6 +1,6 @@
% for zone in sorted(zones): % for zone in sorted(zones):
zone "${zone}" { zone "${zone}" {
file "/var/lib/powerdns/zones/${zone}"; file "/var/lib/powerdns/zones/${zone}";
type native; type master;
}; };
% endfor % endfor

View file

@ -20,12 +20,15 @@ setgid=pdns
allow-notify-from=${','.join(sorted(my_primary_servers))} allow-notify-from=${','.join(sorted(my_primary_servers))}
slave=yes slave=yes
# FIXME enable once debian stable has 4.1.9 % if node.os_version[0] > 10:
#superslave=yes superslave=yes
% endif
% else: % else:
api=yes api=yes
api-key=${api_key} api-key=${api_key}
webserver=yes webserver=yes
webserver-address=0.0.0.0
webserver-allow-from=0.0.0.0/0
allow-notify-from= allow-notify-from=

View file

@ -5,26 +5,12 @@ from subprocess import check_output
zone_path = join(repo.path, 'data', 'powerdns', 'files', 'bind-zones') zone_path = join(repo.path, 'data', 'powerdns', 'files', 'bind-zones')
ZONE_HEADER = """ nameservers = set()
; _ ____ _ _ _____ _ _ _ _ ____
; / \\ / ___| | | |_ _| | | | \\ | |/ ___|
; / _ \\| | | |_| | | | | | | | \\| | | _
; / ___ \\ |___| _ | | | | |_| | |\\ | |_| |
; /_/ \\_\\____|_| |_| |_| \\___/|_| \\_|\\____|
;
; --> Diese Datei wird von BundleWrap verwaltet! <--
$TTL 60
@ IN SOA ns-1.kunbox.net. hostmaster.kunbox.net. (
{serial}
3600
600
86400
300
)
"""
for rnode in sorted(repo.nodes_in_group('dns')): for rnode in sorted(repo.nodes_in_group('dns')):
ZONE_HEADER += '@ IN NS {}.\n'.format(rnode.metadata.get('powerdns/my_hostname', rnode.metadata.get('hostname'))) if not rnode.metadata.get('powerdns/is_secondary'):
# hide the primary nameserver from auto-generated nameserver lists
continue
nameservers.add(rnode.metadata.get('powerdns/my_hostname', rnode.metadata.get('hostname')))
directories = { directories = {
'/etc/powerdns/pdns.d': { '/etc/powerdns/pdns.d': {
@ -50,11 +36,11 @@ files = {
'/etc/powerdns/pdns.conf': { '/etc/powerdns/pdns.conf': {
'content_type': 'mako', 'content_type': 'mako',
'context': { 'context': {
'api_key': node.metadata['powerdns']['api_key'], 'api_key': node.metadata.get('powerdns/api_key'),
'my_hostname': node.metadata['powerdns'].get('my_hostname', node.metadata.get('hostname')), 'my_hostname': node.metadata.get('powerdns/my_hostname', node.metadata.get('hostname')),
'is_secondary': node.metadata['powerdns'].get('is_secondary', False), 'is_secondary': node.metadata.get('powerdns/is_secondary', False),
'my_primary_servers': node.metadata['powerdns'].get('my_primary_servers', set()), 'my_primary_servers': node.metadata.get('powerdns/my_primary_servers', set()),
'my_secondary_servers': node.metadata['powerdns'].get('my_secondary_servers', set()), 'my_secondary_servers': node.metadata.get('powerdns/my_secondary_servers', set()),
}, },
'needs': { 'needs': {
'pkg_apt:pdns-server', 'pkg_apt:pdns-server',
@ -78,7 +64,7 @@ svc_systemd = {
actions = { actions = {
'powerdns_reload_zones': { 'powerdns_reload_zones': {
'triggered': True, 'triggered': True,
'command': 'pdns_control rediscover; pdns_control reload', 'command': 'pdns_control rediscover; pdns_control reload; pdns_control notify \*',
'needs': { 'needs': {
'svc_systemd:pdns', 'svc_systemd:pdns',
}, },
@ -102,7 +88,8 @@ if node.metadata.get('powerdns/features/bind', False):
files[f'/var/lib/powerdns/zones/{zone}'] = { files[f'/var/lib/powerdns/zones/{zone}'] = {
'content_type': 'mako', 'content_type': 'mako',
'context': { 'context': {
'header': ZONE_HEADER.format(serial=serial), 'NAMESERVERS': '\n'.join(sorted({f'@ IN NS {ns}.' for ns in nameservers})),
'SERIAL': serial,
'metadata_records': node.metadata.get(f'powerdns/bind-zones/{zone}/records', []), 'metadata_records': node.metadata.get(f'powerdns/bind-zones/{zone}/records', []),
}, },
'source': f'bind-zones/{zone}', 'source': f'bind-zones/{zone}',
@ -142,12 +129,22 @@ if node.metadata.get('powerdns/features/bind', False):
'action:powerdns_reload_zones', 'action:powerdns_reload_zones',
}, },
} }
else:
files['/etc/powerdns/named.conf'] = {
'delete': True,
'needed_by': {
'svc_systemd:pdns',
},
'triggers': {
'action:powerdns_reload_zones',
},
}
if node.metadata.get('powerdns/features/pgsql', False): if node.metadata.get('powerdns/features/pgsql', node.has_bundle('postgresql')):
files['/etc/powerdns/pdns.d/pgsql.conf'] = { files['/etc/powerdns/pdns.d/pgsql.conf'] = {
'content_type': 'mako', 'content_type': 'mako',
'context': { 'context': {
'password': node.metadata['postgresql']['roles']['powerdns']['password'], 'password': node.metadata.get('postgresql/roles/powerdns/password'),
}, },
'needs': { 'needs': {
'pkg_apt:pdns-backend-pgsql', 'pkg_apt:pdns-backend-pgsql',
@ -163,7 +160,7 @@ if node.metadata.get('powerdns/features/pgsql', False):
files['/etc/powerdns/schema.pgsql.sql'] = {} files['/etc/powerdns/schema.pgsql.sql'] = {}
actions['powerdns_load_pgsql_schema'] = { actions['powerdns_load_pgsql_schema'] = {
'command': node.metadata['postgresql']['roles']['powerdns']['password'].format_into('PGPASSWORD={} psql -h 127.0.0.1 -d powerdns -U powerdns -w < /etc/powerdns/schema.pgsql.sql'), 'command': node.metadata.get('postgresql/roles/powerdns/password').format_into('PGPASSWORD={} psql -h 127.0.0.1 -d powerdns -U powerdns -w < /etc/powerdns/schema.pgsql.sql'),
'unless': 'sudo -u postgres psql -d powerdns -c "\dt" | grep domains 2>&1 >/dev/null', 'unless': 'sudo -u postgres psql -d powerdns -c "\dt" | grep domains 2>&1 >/dev/null',
'needs': { 'needs': {
'bundle:postgresql', 'bundle:postgresql',

View file

@ -1,4 +1,4 @@
from ipaddress import ip_address, IPv4Address, IPv6Address from ipaddress import IPv4Address, IPv6Address, ip_address
from bundlewrap.metadata import atomic from bundlewrap.metadata import atomic
@ -43,7 +43,11 @@ if node.has_bundle('telegraf'):
defaults['telegraf'] = { defaults['telegraf'] = {
'input_plugins': { 'input_plugins': {
'builtin': { 'builtin': {
'powerdns': [{}], 'powerdns': [{
'unix_sockets': [
'/var/run/pdns/pdns.controlsocket',
],
}],
}, },
}, },
'additional_groups': { 'additional_groups': {
@ -186,16 +190,16 @@ def hosts_entries_for_all_dns_servers(metadata):
if rnode.name == node.name: if rnode.name == node.name:
continue continue
ip = rnode.metadata.get('external_ipv4') found_ips = repo.libs.tools.resolve_identifier(repo, rnode.name)
for ip in sorted(found_ips['ipv4']):
if not ip.is_private:
entries[str(ip)] = {
rnode.metadata.get('hostname'),
rnode.name,
}
if ip: if rnode.metadata.get('powerdns/my_hostname', None):
entries[ip] = { entries[str(ip)].add(rnode.metadata.get('powerdns/my_hostname'))
rnode.metadata.get('hostname'),
rnode.name,
}
if rnode.metadata.get('powerdns/my_hostname', None):
entries[ip].add(rnode.metadata.get('powerdns/my_hostname'))
return { return {
'hosts': { 'hosts': {
@ -211,8 +215,9 @@ def firewall(metadata):
return { return {
'firewall': { 'firewall': {
'port_rules': { 'port_rules': {
'53': atomic(metadata.get('powerdns/restrict-to', {'*'})), '53': atomic(metadata.get('powerdns/restrict-to/dns', {'*'})),
'53/udp': atomic(metadata.get('powerdns/restrict-to', {'*'})), '53/udp': atomic(metadata.get('powerdns/restrict-to/dns', {'*'})),
'8081': atomic(metadata.get('powerdns/restrict-to/api', set())),
}, },
}, },
} }

View file

@ -36,10 +36,13 @@ actions = {
'needs': { 'needs': {
'directory:/opt/powerdnsadmin', # provided by bundle:users 'directory:/opt/powerdnsadmin', # provided by bundle:users
}, },
'after': {
'pkg_apt:',
},
}, },
'powerdnsadmin_install_deps': { 'powerdnsadmin_install_deps': {
'triggered': True, 'triggered': True,
'command': '/opt/powerdnsadmin/venv/bin/pip install -r /opt/powerdnsadmin/src/requirements.txt', 'command': '/opt/powerdnsadmin/venv/bin/pip install --upgrade psycopg2-binary -r /opt/powerdnsadmin/src/requirements.txt',
'needs': { 'needs': {
'action:powerdnsadmin_create_virtualenv', 'action:powerdnsadmin_create_virtualenv',
'pkg_apt:', 'pkg_apt:',

View file

@ -10,7 +10,6 @@ defaults = {
'libxmlsec1-dev': {}, 'libxmlsec1-dev': {},
'libxslt1-dev': {}, 'libxslt1-dev': {},
'pkg-config': {}, 'pkg-config': {},
'python3-psycopg2': {},
'python3-wheel': {}, 'python3-wheel': {},
}, },
}, },

View file

@ -1,8 +1,9 @@
#!/usr/bin/env python3 #!/usr/bin/env python3
import requests
from sys import argv from sys import argv
import requests
INTERFACE = argv[1] INTERFACE = argv[1]
LOCAL_IP = argv[4] LOCAL_IP = argv[4]

View file

@ -1,9 +1,10 @@
#!/usr/bin/env python3 #!/usr/bin/env python3
import psycopg2
from configparser import ConfigParser from configparser import ConfigParser
from sys import argv, exit from sys import argv, exit
import psycopg2
def main(): def main():
try: try:

View file

@ -1,8 +1,9 @@
#!/usr/bin/env python3 #!/usr/bin/env python3
from requests import get
from sys import argv, stderr from sys import argv, stderr
from requests import get
try: try:
r = get('http://127.0.0.1:11334/stat') r = get('http://127.0.0.1:11334/stat')
r.raise_for_status() r.raise_for_status()

View file

@ -1,7 +1,7 @@
#!/usr/bin/env python #!/usr/bin/env python
from subprocess import check_output
from json import loads from json import loads
from subprocess import check_output
from sys import stderr from sys import stderr
devices = check_output(['smartctl', '--scan']).decode().splitlines() devices = check_output(['smartctl', '--scan']).decode().splitlines()

View file

@ -55,8 +55,9 @@ try:
exit(2) exit(2)
else: else:
print( print(
"Currently installed version {} matches newest release on github".format( "Currently installed version {} matches newest release on {}".format(
current_version current_version,
host,
) )
) )
exit(0) exit(0)

View file

@ -2,8 +2,8 @@
#this is actually a python https requests query, its called check_http_wget cause it got replaced #this is actually a python https requests query, its called check_http_wget cause it got replaced
from sys import exit
from argparse import ArgumentParser from argparse import ArgumentParser
from sys import exit
import requests import requests

View file

@ -5,7 +5,6 @@ from argparse import ArgumentParser
from subprocess import check_output from subprocess import check_output
from tempfile import TemporaryFile from tempfile import TemporaryFile
check_filesystem_types = { check_filesystem_types = {
'ext2', 'ext2',
'ext3', 'ext3',

View file

@ -8,7 +8,10 @@ defaults = {
'monitoring-plugins': {}, 'monitoring-plugins': {},
'python3-requests': {}, 'python3-requests': {},
'python3-setuptools': {}, # needed by check_github_for_new_release 'python3-setuptools': {}, # needed by check_github_for_new_release
'sysstat': {}, # needed by check_cpu_stats 'sysstat': {
# legacy
'installed': False,
},
}, },
}, },
'icinga2_api': { 'icinga2_api': {
@ -37,7 +40,6 @@ defaults = {
'perl-libwww': {}, 'perl-libwww': {},
'monitoring-plugins': {}, 'monitoring-plugins': {},
'python-requests': {}, 'python-requests': {},
'sysstat': {},
}, },
}, },
} }

View file

@ -1,6 +1,9 @@
defaults = { defaults = {
'apt': { 'apt': {
'packages': { 'packages': {
'isc-dhcp-client': {
'installed': False,
},
'resolvconf': { 'resolvconf': {
'installed': False, 'installed': False,
}, },

View file

@ -5,15 +5,13 @@
# 'localhost'. # 'localhost'.
{ {
# Cache directories for schedule and realtime data. Mandatory. The parent base_url => Mojo::URL->new('https://${domain}'),
# directory ('/var/cache/travelynx' in this case) must already exist.
cache => { cache => {
schedule => '/var/cache/travelynx/iris', schedule => '/var/cache/travelynx/iris',
realtime => '/var/cache/travelynx/iris-rt', realtime => '/var/cache/travelynx/iris-rt',
}, },
# Database configuration. host and port are optional
# (defaulting to localhost:5432), the rest is mandatory.
db => { db => {
host => '${database.get('host', 'localhost')}', host => '${database.get('host', 'localhost')}',
port => 5432, port => 5432,
@ -22,8 +20,6 @@
password => '${database['password']}', password => '${database['password']}',
}, },
# See the Mojo::Server::Hypnotoad manual for details on the following
# settings.
hypnotoad => { hypnotoad => {
accepts => 100, accepts => 100,
clients => 10, clients => 10,
@ -34,21 +30,14 @@
}, },
mail => { mail => {
# If you want to disable outgoing mail for development purposes,
# uncomment the following line. Mails will instead be logged as
# Mojolicious "info" messages, causing their content to be printed on
# stdout.
## disabled => 1,
# Otherwise, specify the sender ("From" field) for mail sent by travelynx
# here. E.g. 'Travelynx <mail@example.org>'
from => '${mail_from}', from => '${mail_from}',
}, },
# Secrets used for cookie signing and verification. Must contain at least ref => {
# one random string. If you specify several strings, the first one will issues => 'https://github.com/derf/travelynx/issues',
# be used for signing new cookies, and the remaining ones will still be source => 'https://github.com/derf/travelynx',
# accepted for cookie validation. },
secrets => [ secrets => [
'${cookie_secret}', '${cookie_secret}',
], ],

View file

@ -36,7 +36,7 @@ files = {
}, },
'/opt/travelynx/travelynx.conf': { '/opt/travelynx/travelynx.conf': {
'content_type': 'mako', 'content_type': 'mako',
'context': node.metadata['travelynx'], 'context': node.metadata.get('travelynx'),
'needs': { 'needs': {
'git_deploy:/opt/travelynx', 'git_deploy:/opt/travelynx',
}, },
@ -61,7 +61,7 @@ if isfile(join(repo.path, 'data', 'travelynx', 'files', 'imprint', node.name)):
git_deploy = { git_deploy = {
'/opt/travelynx': { '/opt/travelynx': {
'repo': 'https://github.com/derf/travelynx.git', 'repo': 'https://github.com/derf/travelynx.git',
'rev': node.metadata['travelynx']['version'], 'rev': node.metadata.get('travelynx/version'),
'needs': { 'needs': {
'directory:/opt/travelynx', 'directory:/opt/travelynx',
}, },
@ -84,7 +84,7 @@ actions = {
'triggered': True, 'triggered': True,
}, },
'travelynx_database_migrate': { 'travelynx_database_migrate': {
'command': 'cd /opt/travelynx && perl index.pl database migrate', 'command': 'export PERL5LIB=/opt/travelynx/local/lib/perl5; cd /opt/travelynx && perl index.pl database migrate',
# Because git_deploy does not put .git onto the server, the script # Because git_deploy does not put .git onto the server, the script
# will complain on STDERR about not finding a git repository. # will complain on STDERR about not finding a git repository.
# That's why we need to redirect stderr to /dev/null. # That's why we need to redirect stderr to /dev/null.

View file

@ -36,6 +36,7 @@ export EDITOR=vim
export VISUAL=vim export VISUAL=vim
alias ipb='ip -brief --color=auto' alias ipb='ip -brief --color=auto'
alias ipa='ip -brief --color=always addr show; echo; ip --color=always route show; ip -6 --color=always route show'
alias l='ls -lAh' alias l='ls -lAh'
alias s='sudo -i' alias s='sudo -i'
alias v='vim -p' alias v='vim -p'

View file

@ -1,4 +1,4 @@
from os.path import join, exists from os.path import exists, join
files = { files = {
'/etc/bash.bashrc': { '/etc/bash.bashrc': {

View file

@ -3,7 +3,6 @@ from ipaddress import ip_network
from bundlewrap.exceptions import NoSuchNode from bundlewrap.exceptions import NoSuchNode
from bundlewrap.metadata import atomic from bundlewrap.metadata import atomic
defaults = { defaults = {
'apt': { 'apt': {
'packages': { 'packages': {

View file

@ -1,9 +1,9 @@
#!/usr/bin/env python3 #!/usr/bin/env python3
import re
from subprocess import check_output from subprocess import check_output
from sys import argv, exit from sys import argv, exit
import re
def to_bytes(size): def to_bytes(size):

View file

@ -2,7 +2,6 @@
import re import re
from datetime import datetime from datetime import datetime
from json import loads from json import loads
from subprocess import check_call, check_output from subprocess import check_call, check_output

View file

@ -1,5 +1,4 @@
from json import dumps from json import dumps
#from os.path import join
from bundlewrap.metadata import MetadataJSONEncoder from bundlewrap.metadata import MetadataJSONEncoder

View file

@ -1,52 +1,29 @@
-----BEGIN PGP PUBLIC KEY BLOCK----- -----BEGIN PGP PUBLIC KEY BLOCK-----
Version: GnuPG v1
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 =YwXc
nIK5yiU6GkS3IFaQg2T9/tOBKxm0ZJPfqTXbT4jFSfvYJ3oUqc+AyYxtb8gj1GRk
X283/86/bA3C98u7re1vPtiDRyM8r0+lhEc59Yx/EAOL+X2gZyTgyUoH+LLuOWQK
s1egI8y80R8NZfM1nMiQk2ywMsTFwQjSVimScvzqv5Nt8k8CvHUQ3a6R+6doXGNX
5RnUqn9Qvmh0JY5sNgFsoaGbuk2PJrVaGBRnfnjaDqAlZpDhwkWhcCcguNhRbRHp
N7/a0pQr70bAG9VikzLyGC17EU0sxney/hyNHkr4Uyy2OXHpuJvRjVKy/BwZ3fxA
AYX2oZIOxQB3/OulzO/DppaCVhRtp1bt+Z5f+fpisiVb5DvZcMdeyAoQ4+oOr7v3
EasIs2XYcQ+kOE3Y2kdlHWBeuXzxgWgJZ1OOpwGMjR3Uy6IwhuSWtreJBA4er+Df
vgSPwKBsRLNLbPe3ftjArnC5GfMiGgikVdAUdN4OkEqvUbkRoAVGKTOMLUKm+ZkG
OskJOVYS+JAina0qkYEFF7haycMjf9olhqLmTIC+6X7Ox9R2plaOhQARAQABiQIf
BBgBCgAJBQJWCZsEAhsMAAoJEGhKFM8lguDF8ZIP/1q9Sdz8oMvf9AJXZ7AYxm77
V+kJzJqi62nZLWJnrFXDZJpU+LkYlb3fstsZ1rvBhnrEPSmFxoj72CP0RtcyX7wJ
dA7K1Fl9LpJi5H8300cC7UyG94MUYbrXijbLTbnFTfNr1tGx4a1T/7Yyxx/wZGrT
H/X8cvNybkl33SxDdlQQ9kx3lFOwC41e3TkGsUWxn3TCfvDh8VdA6Py6JeSPFGOb
MEO2/q7oUgvjfV+ivN5ayZi9bWgeqm1sgtmTHHQ4RqwwKrAb5ynXpn1b9QrkevgT
b91uzMA22Prl4DuzKiaMYDcZOQ3vtf0eFBP0GOSSgUKS4bQ3dGgi1JmQ7VuAM4uj
+Ug5TnGoLwclTwLksc7v89C5MMPgm2vVXvCUDzyzQA7bIHFeX+Rziby4nymec4Nr
eeXYNBJWrEp8XR7UNWmEgroXRoN1x9/6esh5pnoUXGAIWuKzSLQM70/wWxS67+v2
aC1GNb+pXXAzYeIIiyLWaZwCSr8sWMvshFT9REk2+lnb6sAeJswQtfTUWI00mVqZ
dvI3Wys2h0IyIejuwetTUvGhr9VgpqiLLfGzGlt/y2sg27wdHzSJbMh0VrVAK26/
BlvEwWDCFT0ZJUMG9Lvre25DD0ycbougLsRYjzmGb/3k3UktS3XTCxyBa/k3TPw3
vqIHrEqk446nGPDqJPS5
=9iF7
-----END PGP PUBLIC KEY BLOCK----- -----END PGP PUBLIC KEY BLOCK-----

View file

@ -1,52 +0,0 @@
-----BEGIN PGP PUBLIC KEY BLOCK-----
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
Yyq3xLVDG/Zs7LmgSAiEITxRFTR4qg7k
=r37a
-----END PGP PUBLIC KEY BLOCK-----

View file

@ -0,0 +1 @@
encrypt$gAAAAABj1jTasX0XOFRWh7F0pxNgMoJIjrblvqOM8ohGVCsvVyMEQDiOmGaJCs9lW-lbeghlzRpiC8P7CNot6OOeNXBYWmxN_HgN3J2p6Q5-XoSJ62NUJWQNRNNENuiN1Yy0g0MREk4gVsNh8-VeoXuKgyLEXJQJI-SYLzl8faZoBnQGTK4FbTAiN6KSB4EbTPwxx-8dYp8kNIj4ipBjkQKNu-mXuVvdnf5fTUwTCQx6rz7yjlp7DOPuSJDASg5bE33dd8gt89grW5vBKeEnQsi7hpJCJF5vNfRay89IKfjf6UqxJHKCmS2tIWQ9Kz4Tv41MnNR0-jvnULq7TWcnqwo_SKb8JRLUA3dH2wLiOUu7aApYSkeSNiul2ILCtBPsjY_eWzqdd3tkpJBErOcFVe2mdjVRSIUOXTM_T3nNWCJgn5TxD4qbHklZoCaM6Ey9P_yQj-sSRGizgcDhGiqY8xJNmwbWz9IH5a_Fs6iRVhAh6VzSa1ZAKxcum87dj-KVA_SjG9hy7Dy28xK0D4NoSpYFOkEz4VHpa1tP0t8QJ2WtQiw-qjHFzokkIINEUKUPIBg6t_5oedJ24YMnyyzBZ2_uQ1HFVFjBx-7Iw73bTPNluVwXkobzEnrYFwDsEXGE6tR0HjbteNxj

View file

@ -0,0 +1 @@
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIL+FCn1sWP74+lVAyaXDpXxCCauh6LC2KEJmIMhDEYvJ kunsi@kunsi-p14s.kunbox.net

View file

@ -1,9 +0,0 @@
${header}
$ORIGIN cybert-media.net.
@ IN A 159.69.11.231
IN AAAA 2a01:4f8:c2c:c410::1
IN TXT "v=spf1 a ~all"
www IN CNAME cybert-media.net.

View file

@ -1,9 +0,0 @@
${header}
$ORIGIN die-brontosaurier-waren-es.org.
; ends up on rx300.kunbox.net
@ IN A 31.47.232.106
IN AAAA 2a00:f820:528::2
IN MX 10 rx300.kunbox.net.
IN TXT "v=spf1 mx ~all"

View file

@ -1,3 +0,0 @@
${header}
$ORIGIN emails.sexy.

View file

@ -1,9 +0,0 @@
${header}
$ORIGIN eskalation.jetzt.
queere IN NS ns1.athena7.eu.
queere IN NS ns2.athena7.eu.
queere IN NS ns3.athena7.eu.
queere IN NS ns4.athena7.eu.

View file

@ -1,5 +0,0 @@
${header}
$ORIGIN felix-kunsmann.de.
@ IN MX 10 rx300.kunbox.net.

View file

@ -1,15 +0,0 @@
${header}
$ORIGIN flauschehorn.sexy.
@ IN A 5.189.140.103
IN AAAA 2a02:c207:3002:8320:feed:f2c1:c0ff:ee
IN MX 10 rx300.kunbox.net.
IN TXT "v=spf1 mx ~all"
_dmarc IN TXT "v=DMARC1; p=quarantine; rua=mailto:hostmaster@kunbox.net; ruf=mailto:postmaster@kunsmann.eu; fo=0:d:s; adkim=r; aspf=r"
uO4aNejDvVdw8BKne3KJIqAvCQMJ0416._domainkey IN TXT ( "v=DKIM1; k=rsa; "
"p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAnh5Ym9PO7r+wdOIKfopvHzn3KU3qT6IlCG/gvvbmIqoeFQfRbAe3gQmcG6RcLue55cJQGhI6y2r0lm59ZeoHR40aM+VabAOlplekM7xWmoXb/9vG2OZLIqAyF4I+7GQmTN6B9keBHp9SWtDUkI0B0G9neZ5MkXJP705M0duxritqQlb4YvCZwteHiyckKcg9aE9j+GF2EEawBoVDp"
"oveoB3+wgde3lWEUjjwKFtXNXxuN354o6jgXgPNWtIEdPMLfK/o0CaCjZNlzaLTsTegY/+67hdHFqDmm8zXO9s+Xiyfq7CVq21t7wDhQ2W1agj+up6lH82FMh5rZNxJ6XB0yQIDAQAB"
) ;

View file

@ -1,43 +0,0 @@
${header}
$ORIGIN franzi.business.
; ends up on rx300.kunbox.net
@ IN A 31.47.232.106
IN AAAA 2a00:f820:528::2
IN MX 10 rx300.kunbox.net.
IN TXT "v=spf1 mx a:sewfile.htz-cloud.kunbox.net ~all"
chat IN CNAME rx300.kunbox.net.
dimension IN CNAME rx300.kunbox.net.
git IN CNAME rx300.kunbox.net.
jenkins IN CNAME rx300.kunbox.net.
matrix IN CNAME rx300.kunbox.net.
mta-sts IN CNAME rx300.kunbox.net.
netbox IN CNAME rx300.kunbox.net.
sewfile IN CNAME sewfile.htz-cloud.kunbox.net.
paste IN CNAME rx300.kunbox.net.
postfixadmin IN CNAME rx300.kunbox.net.
radicale IN CNAME rx300.kunbox.net.
rss IN CNAME rx300.kunbox.net.
status IN CNAME icinga2.ovh.kunbox.net.
tickets IN CNAME franzi-business.cname.pretix.eu.
travelynx IN CNAME rx300.kunbox.net.
wiki IN CNAME rx300.kunbox.net.
woodpecker IN CNAME rx300.kunbox.net.
_matrix._tcp IN SRV 10 10 443 matrix
_dmarc IN TXT "v=DMARC1; p=quarantine; rua=mailto:hostmaster@kunbox.net; ruf=mailto:postmaster@kunsmann.eu; fo=0:d:s; adkim=r; aspf=r"
_mta-sts IN TXT "v=STSv1;id=20201111;"
_smtp._tls IN TXT "v=TLSRPTv1;rua=mailto:hostmaster@kunbox.net"
_token._dnswl IN TXT "gg3mbwjx9bbuo5osvh7oz6bc881wcmc"
2019._domainkey IN TXT ( "v=DKIM1; k=rsa; "
"p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwkg6UAcu3V98hal1UVf6yB0WT1CKDS0AK83CUlSP8bUwraPxkxK1nkQOUsmjbQs6a3FhdsKprMi32GeUaTVvZg81JIybPk3jNugfNWfSjs2TXPomYu+XD2pmmbR3cZlzC5NGR2nmBFt/P/S2ihPHj35KziiBIwK1TdvOi1M2+upCjK33Icco0ByCm0gJpD2O0cbqcBcUKqd6X440"
"vYhNXH1ygp0e91P0iRnvS9sg6yD0xjD8kD6j/8GfxBY+9bpU3EvDoBgyJSbjw5b6PUVJbKMXzw1NIRNj0SXKs5BakjS8+7u62vR11IPCYRwy+yr0rDT0tNegM7gStIIgoTpOoQIDAQAB"
) ;
uO4aNejDvVdw8BKne3KJIqAvCQMJ0416._domainkey IN TXT ( "v=DKIM1; k=rsa; "
"p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAnh5Ym9PO7r+wdOIKfopvHzn3KU3qT6IlCG/gvvbmIqoeFQfRbAe3gQmcG6RcLue55cJQGhI6y2r0lm59ZeoHR40aM+VabAOlplekM7xWmoXb/9vG2OZLIqAyF4I+7GQmTN6B9keBHp9SWtDUkI0B0G9neZ5MkXJP705M0duxritqQlb4YvCZwteHiyckKcg9aE9j+GF2EEawBoVDp"
"oveoB3+wgde3lWEUjjwKFtXNXxuN354o6jgXgPNWtIEdPMLfK/o0CaCjZNlzaLTsTegY/+67hdHFqDmm8zXO9s+Xiyfq7CVq21t7wDhQ2W1agj+up6lH82FMh5rZNxJ6XB0yQIDAQAB"
) ;

View file

@ -1,4 +1,14 @@
${header} $TTL 60
@ IN SOA ns-primary.kunbox.net. hostmaster.kunbox.net. (
${SERIAL}
3600
600
86400
300
)
${NAMESERVERS}
$ORIGIN kunbox.net. $ORIGIN kunbox.net.
@ -10,6 +20,10 @@ $ORIGIN kunbox.net.
IN MX 10 rx300 IN MX 10 rx300
IN TXT "v=spf1 mx ~all" IN TXT "v=spf1 mx ~all"
; delegate acme stuff to psql-managed zone
_acme-challenge IN CNAME _acme-challenge.kunbox.net.le.kunbox.net.
_acme-challenge.home IN CNAME _acme-challenge.home.kunbox.net.le.kunbox.net.
; Mail servers ; Mail servers
mta-sts IN CNAME rx300 mta-sts IN CNAME rx300

View file

@ -1,31 +0,0 @@
${header}
$ORIGIN kunsmann.eu.
; ends up on rx300.kunbox.net
@ IN A 31.47.232.106
IN AAAA 2a00:f820:528::2
IN MX 10 rx300.kunbox.net.
IN TXT "v=spf1 mx ~all"
git IN CNAME rx300.kunbox.net.
grafana IN CNAME influxdb.htz-cloud.kunbox.net.
icinga IN CNAME icinga2.ovh.kunbox.net.
influxdb IN CNAME influxdb.htz-cloud.kunbox.net.
luther-ps IN CNAME luther.htz-cloud.kunbox.net.
mta-sts IN CNAME rx300.kunbox.net.
statusmonitor.icinga IN CNAME icinga2.ovh.kunbox.net.
_dmarc IN TXT "v=DMARC1; p=quarantine; rua=mailto:hostmaster@kunbox.net; ruf=mailto:postmaster@kunsmann.eu; fo=0:d:s; adkim=r; aspf=r"
_mta-sts IN TXT "v=STSv1;id=20201111;"
_smtp._tls IN TXT "v=TLSRPTv1;rua=mailto:hostmaster@kunbox.net"
_token._dnswl IN TXT "5mx0rv9ru8s1zz4tf4xlt48osh09czmg"
2019._domainkey IN TXT ( "v=DKIM1; k=rsa; "
"p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwkg6UAcu3V98hal1UVf6yB0WT1CKDS0AK83CUlSP8bUwraPxkxK1nkQOUsmjbQs6a3FhdsKprMi32GeUaTVvZg81JIybPk3jNugfNWfSjs2TXPomYu+XD2pmmbR3cZlzC5NGR2nmBFt/P/S2ihPHj35KziiBIwK1TdvOi1M2+upCjK33Icco0ByCm0gJpD2O0cbqcBcUKqd6X440"
"vYhNXH1ygp0e91P0iRnvS9sg6yD0xjD8kD6j/8GfxBY+9bpU3EvDoBgyJSbjw5b6PUVJbKMXzw1NIRNj0SXKs5BakjS8+7u62vR11IPCYRwy+yr0rDT0tNegM7gStIIgoTpOoQIDAQAB"
) ;
uO4aNejDvVdw8BKne3KJIqAvCQMJ0416._domainkey IN TXT ( "v=DKIM1; k=rsa; "
"p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAnh5Ym9PO7r+wdOIKfopvHzn3KU3qT6IlCG/gvvbmIqoeFQfRbAe3gQmcG6RcLue55cJQGhI6y2r0lm59ZeoHR40aM+VabAOlplekM7xWmoXb/9vG2OZLIqAyF4I+7GQmTN6B9keBHp9SWtDUkI0B0G9neZ5MkXJP705M0duxritqQlb4YvCZwteHiyckKcg9aE9j+GF2EEawBoVDp"
"oveoB3+wgde3lWEUjjwKFtXNXxuN354o6jgXgPNWtIEdPMLfK/o0CaCjZNlzaLTsTegY/+67hdHFqDmm8zXO9s+Xiyfq7CVq21t7wDhQ2W1agj+up6lH82FMh5rZNxJ6XB0yQIDAQAB"
) ;

View file

@ -1,4 +0,0 @@
${header}
$ORIGIN trans-agenda.de.

View file

@ -1,22 +0,0 @@
${header}
$ORIGIN trans-agenda.eu.
@ IN MX 10 rx300.kunbox.net.
IN TXT "v=spf1 a mx ~all"
mta-sts IN CNAME rx300.kunbox.net.
_dmarc IN TXT "v=DMARC1; p=quarantine; rua=mailto:hostmaster@kunbox.net; ruf=mailto:postmaster@kunsmann.eu; fo=0:d:s; adkim=r; aspf=r"
_mta-sts IN TXT "v=STSv1;id=20201111;"
_smtp._tls IN TXT "v=TLSRPTv1;rua=mailto:hostmaster@kunbox.net"
_token._dnswl IN TXT "5mx0rv9ru8s1zz4tf4xlt48osh09czmg"
2019._domainkey IN TXT ( "v=DKIM1; k=rsa; "
"p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwkg6UAcu3V98hal1UVf6yB0WT1CKDS0AK83CUlSP8bUwraPxkxK1nkQOUsmjbQs6a3FhdsKprMi32GeUaTVvZg81JIybPk3jNugfNWfSjs2TXPomYu+XD2pmmbR3cZlzC5NGR2nmBFt/P/S2ihPHj35KziiBIwK1TdvOi1M2+upCjK33Icco0ByCm0gJpD2O0cbqcBcUKqd6X440"
"vYhNXH1ygp0e91P0iRnvS9sg6yD0xjD8kD6j/8GfxBY+9bpU3EvDoBgyJSbjw5b6PUVJbKMXzw1NIRNj0SXKs5BakjS8+7u62vR11IPCYRwy+yr0rDT0tNegM7gStIIgoTpOoQIDAQAB"
) ;
uO4aNejDvVdw8BKne3KJIqAvCQMJ0416._domainkey IN TXT ( "v=DKIM1; k=rsa; "
"p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAnh5Ym9PO7r+wdOIKfopvHzn3KU3qT6IlCG/gvvbmIqoeFQfRbAe3gQmcG6RcLue55cJQGhI6y2r0lm59ZeoHR40aM+VabAOlplekM7xWmoXb/9vG2OZLIqAyF4I+7GQmTN6B9keBHp9SWtDUkI0B0G9neZ5MkXJP705M0duxritqQlb4YvCZwteHiyckKcg9aE9j+GF2EEawBoVDp"
"oveoB3+wgde3lWEUjjwKFtXNXxuN354o6jgXgPNWtIEdPMLfK/o0CaCjZNlzaLTsTegY/+67hdHFqDmm8zXO9s+Xiyfq7CVq21t7wDhQ2W1agj+up6lH82FMh5rZNxJ6XB0yQIDAQAB"
) ;

View file

@ -1,3 +0,0 @@
${header}
$ORIGIN warnochwas.de.

View file

@ -1,27 +1,27 @@
-----BEGIN CERTIFICATE----- -----BEGIN CERTIFICATE-----
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
ssU+fmyZoeNBV6q8xw== G47QSheqKqJnHOCL0hA=
-----END CERTIFICATE----- -----END CERTIFICATE-----

View file

@ -1 +1 @@
encrypt$gAAAAABjZ10m0BnUbl5777KN6VHf6uAdtcs15-osbqRoQq6epRuWllD-ziy_2N7BrOkRcmfSJaB8zZ1l1bLD6ws3SlI7jvbkahvWnuKinkGiE30SGGjqr6MY_NJGawdox8OJWrsWLFYJJjrePl_mmVtx9G41oBreKizj1YPswzbzsFociJ0zF0xlx99sjjLxRB5PEaI3fwK1eXDmODGZ__dwKxINGSB2zxPb10Vwtnsp3cmaUiKh1TfIghQAm523cAuHPys1-tNXuJpvhPY3tIxB5gHZYiBXMzcS64mD1KqEubsnplxQlK-N_mJ7Q6n0xReG00pqvm5twRI5g7PoHYLH7nZI7KYOSI2XMAS7gP6Uy-H60BQKAHXuX4yutznVRJspv0wa4kfW9vcBfFECBhFeC8tAAkgAc-NvAsDYk6tYSi2k3N2zXsiyHy0NL-JMnUEicQT3YZNnfkoYqjuxwFbQvgtZZun38w== encrypt$gAAAAABj1gankGocRRCdH6WqCUFJ6UtA1f07KpXYh4KcelenJv0ZbQ98f2nwIk29iXWEIsS9FTiRyEG95u_Lmm_p7GbKCMDSIZfZgAC2I3tp_BxZPerhEkwxTT_BjEYHRjMDFrzwoAypTO1Mj_XiT_CYvAZptHI3MZcI9QwPVw-CMJ4KqzG-IztkW8KVnuM7agiBdUt4IYkLyeZ0IoL4nOIWANtdM-y4rILv6N7WIMw6dgsSvLPEQR-PYdNLq866IR0-yFGOfYcQKOvpBqAt6A69E6JxSm3AakaJaS75QYF2lzGVjTfrFoGz60LUjC60KuTsu3dUckGUm7JEq1BSMxvc5b_a6pCazvoAnM0gbtbM_DjL0phLj7VWZEg-_1CHfc2S0-UxbxBjLKJ3NPPs93_En5RWxqxkhvvZgxzWJqQWP2eBprge8Q_EEXkMbxumVVx9Ymdynlw2AgkQhVVJIu_vnsZ4Uc8vIA==

View file

@ -1,27 +1,27 @@
-----BEGIN CERTIFICATE----- -----BEGIN CERTIFICATE-----
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
sc1/2y3z9deYm4qHw/w= cK9weiaIniziAnEjUr4=
-----END CERTIFICATE----- -----END CERTIFICATE-----

View file

@ -1 +1 @@
encrypt$gAAAAABjZ10mtywN2Tx7b0-sZywDVcNo5gQbnzjwlMjQPktMwmRBwGMbQVcwuGhhopu5vd4Ztw8aGO5lf-SQmLWgdpR4aIrPNx1Iu4urF2LMV-BMLSgmF85ADQzlbiBvrzGAnIoVUjwXYyGj1Wst4feWMKBDc_kThinYhSplMZ_yjEbMj0eMGRzjSclkvAm24KWi7l_LQAklRELuQQyopHDo47AxehNI-nvLfO0FfXZJpkdrMV1V8lSqyXwBSW3McJKH8bbmVEX8qq-mNntBNpe3n5V2ninj72aC0D572hfMp-jKC6xccf-CqnmX1qaWGGj1yiFDdBxfOSU-kO6204BVtfspMtkI75YAYE_7aA-GUiHfXaNHvDhf2uMb8ssbJUdvGS_oLx1qnKiyeyJ6RRhl71xxXjNEo0hPYYY1BGj6hjq30R8aGknkQNCjyCD87Sc7qh95KpMmY4d82xI70xeS4mk8hEgCow== encrypt$gAAAAABj1kcBpq8c_Ez3JkYJIB0evClkcblewwzBEbl4rfcd-3Z2xFlQ8OggIxGdlLGWjIN_ZBaENvXcqy4ZYlwpXgqrZJpBao8WyovZiKLK759r8qVRjbIBvHnH90t_JZ3-MydlpD1mUzHUy5oQq5Qn8jLoRTzHE2TM8VyhaBkMVQ9gacHdqNGW6dsvCRzXCQM1CNqs8pyc8nQxdARjv_FGwSeZlCxcYPSLEBeE-Hf-wJyVWnG7oyq9XKUyI8NWLPQNwWUjzMgKwumtDh21goRsSRAtLLFmqE_iU1IyZYwNh4J3SBMZKBl0fATtHXhnW1_k-RA1-l54PFMTR0KgS-uxYtqZ1Az0t1KEfEvyzfHAQLJ8RIwOOVtPNUvhSiMHr3jG0WpxymilOLfjFpnCZ8E_CA6L8hmytXEBfoM4ZHMCWzOIe_9tIKcMS146NOzaPnCXpKFganNuvV_S7zEn33zv-jYEHD4d8A==

View file

@ -12,10 +12,6 @@ groups['dns'] = {
}, },
'metadata': { 'metadata': {
'powerdns': { 'powerdns': {
'features': {
'bind': True,
'pgsql': True,
},
# Overridden in node metadata for primary server # Overridden in node metadata for primary server
'is_secondary': True, 'is_secondary': True,
}, },

View file

@ -71,7 +71,6 @@ groups['debian'] = {
'bundles': { 'bundles': {
'apt', 'apt',
'backup-client', 'backup-client',
'molly-guard',
}, },
'os': 'debian', 'os': 'debian',
'pip_command': 'pip3', 'pip_command': 'pip3',

View file

@ -2,6 +2,7 @@ from bundlewrap.exceptions import BundleError
from bundlewrap.utils.text import bold, green, yellow from bundlewrap.utils.text import bold, green, yellow
from bundlewrap.utils.ui import io from bundlewrap.utils.ui import io
def test_node(repo, node, **kwargs): def test_node(repo, node, **kwargs):
if not node.has_bundle('backup-client'): if not node.has_bundle('backup-client'):
return return

View file

@ -4,6 +4,7 @@ from bundlewrap.exceptions import BundleError
from bundlewrap.utils.text import bold, green from bundlewrap.utils.text import bold, green
from bundlewrap.utils.ui import io from bundlewrap.utils.ui import io
def test_underscore_vs_dash(node, metadata, path=[]): def test_underscore_vs_dash(node, metadata, path=[]):
for k, v in metadata.items(): for k, v in metadata.items():
if not isinstance(k, str): if not isinstance(k, str):

View file

@ -1,4 +1,4 @@
from json import loads, dumps from json import dumps, loads
from bundlewrap.metadata import metadata_to_json from bundlewrap.metadata import metadata_to_json
from bundlewrap.utils import Fault from bundlewrap.utils import Fault

View file

@ -1,5 +1,5 @@
from ipaddress import IPv4Network, ip_network
from os.path import abspath, dirname, join from os.path import abspath, dirname, join
from ipaddress import ip_network, IPv4Network
REPO_PATH = dirname(dirname(abspath(__file__))) REPO_PATH = dirname(dirname(abspath(__file__)))

View file

@ -1,8 +1,11 @@
import base64 import base64
from nacl.public import PrivateKey
from nacl.encoding import Base64Encoder from nacl.encoding import Base64Encoder
from nacl.public import PrivateKey
from bundlewrap.utils import Fault from bundlewrap.utils import Fault
def gen_privkey(repo, identifier): def gen_privkey(repo, identifier):
return repo.vault.random_bytes_as_base64_for(identifier) return repo.vault.random_bytes_as_base64_for(identifier)

View file

@ -1,9 +1,10 @@
from ipaddress import ip_address, ip_network, IPv4Address, IPv4Network from ipaddress import IPv4Address, IPv4Network, ip_address, ip_network
from bundlewrap.exceptions import NoSuchGroup, NoSuchNode, BundleError from bundlewrap.exceptions import BundleError, NoSuchGroup, NoSuchNode
from bundlewrap.utils.text import bold, red from bundlewrap.utils.text import bold, red
from bundlewrap.utils.ui import io from bundlewrap.utils.ui import io
def resolve_identifier(repo, identifier): def resolve_identifier(repo, identifier):
""" """
Try to resolve an identifier (group or node). Return a set of ip Try to resolve an identifier (group or node). Return a set of ip

View file

@ -3,6 +3,7 @@ from os.path import join
from pathlib import Path from pathlib import Path
import bwpass import bwpass
from bundlewrap.metadata import atomic from bundlewrap.metadata import atomic
from bundlewrap.utils import error_context from bundlewrap.utils import error_context

View file

@ -5,13 +5,18 @@ dummy = true
period = "daytime" period = "daytime"
pretty_name = "ticket.gulas.ch" pretty_name = "ticket.gulas.ch"
[metadata.icinga2_api.nginx.services."NGINX VHOST jira CERTIFICATE"] [metadata.icinga2_api.nginx.services."NGINX VHOST ticket-redirect CERTIFICATE"]
check_command = "check_https_cert_at_url" check_command = "check_https_cert_at_url"
"vars.domain" = "ticket.gulas.ch" "vars.domain" = "ticket.gulas.ch"
"vars.notification.mail" = true "vars.notification.mail" = true
[metadata.icinga2_api.nginx.services."NGINX VHOST jira CERTIFICATE"]
check_command = "check_https_cert_at_url"
"vars.domain" = "jira.gulas.ch"
"vars.notification.mail" = true
[metadata.icinga2_api.nginx.services."NGINX VHOST jira CONTENT"] [metadata.icinga2_api.nginx.services."NGINX VHOST jira CONTENT"]
check_command = "check_http_wget" check_command = "check_http_wget"
"vars.http_wget_contains" = "login.jsp" "vars.http_wget_contains" = "login.jsp"
"vars.http_wget_url" = "https://ticket.gulas.ch/secure/Dashboard.jspa" "vars.http_wget_url" = "https://jira.gulas.ch/secure/Dashboard.jspa"
"vars.notification.sms" = true "vars.notification.sms" = true

View file

@ -76,18 +76,12 @@ nodes['fkusei-locutus'] = {
# video drivers # video drivers
'xf86-video-intel': {}, 'xf86-video-intel': {},
# for i3pystatus
'iw': {},
'wireless_tools': {},
# all that other random stuff one needs # all that other random stuff one needs
'apachedirectorystudio': {}, 'apachedirectorystudio': {},
'direnv': {}, 'direnv': {},
'freerdp': {}, 'freerdp': {},
'mosquitto': {},
'sdl_ttf': {}, # for compiling testcard 'sdl_ttf': {}, # for compiling testcard
'thermald': {}, 'thermald': {},
'virt-manager': {},
}, },
}, },
'systemd-boot': { 'systemd-boot': {

View file

@ -3,19 +3,12 @@
nodes['gce.bind01'] = { nodes['gce.bind01'] = {
'hostname': '34.89.208.78', 'hostname': '34.89.208.78',
'bundles': {
'nodejs',
'powerdnsadmin',
},
'groups': { 'groups': {
'debian-buster', 'debian-bullseye',
'dns', 'dns',
'webserver',
}, },
'metadata': { 'metadata': {
'backups': { 'backups': {
# This is the primary DNS server. However, we only use
# replication for DynDNS, currently. No need for backups here.
'exclude_from_backups': True, 'exclude_from_backups': True,
}, },
'interfaces': { 'interfaces': {
@ -30,30 +23,12 @@ nodes['gce.bind01'] = {
'icinga_options': { 'icinga_options': {
'pretty_name': 'ns-1.kunbox.net', 'pretty_name': 'ns-1.kunbox.net',
}, },
'nginx': {
'vhosts': {
'ns-1.kunbox.net': {
'locations': {
'/': {
'target': 'http://127.0.0.1:8000/',
},
},
'website_check_path': '/login',
'website_check_string': 'PowerDNS',
},
},
},
'postgresql': { 'postgresql': {
'version': '11', 'version': '15',
}, },
'powerdns': { 'powerdns': {
'is_secondary': False,
'secondary_nameservers': 'dns',
'my_hostname': 'ns-1.kunbox.net', 'my_hostname': 'ns-1.kunbox.net',
}, },
'powerdnsadmin': {
'version': 'v0.3.0',
},
'vm': { 'vm': {
'cpu': 1, 'cpu': 1,
'ram': 1, 'ram': 1,

View file

@ -5,7 +5,7 @@ nodes['gce.dns02'] = {
'hostname': '35.187.109.249', 'hostname': '35.187.109.249',
'bundles': set(), 'bundles': set(),
'groups': { 'groups': {
'debian-buster', 'debian-bullseye',
'dns', 'dns',
}, },
'metadata': { 'metadata': {
@ -25,7 +25,7 @@ nodes['gce.dns02'] = {
'exclude_from_backups': True, 'exclude_from_backups': True,
}, },
'postgresql': { 'postgresql': {
'version': '11', 'version': '15',
}, },
'powerdns': { 'powerdns': {
'my_hostname': 'ns-2.kunbox.net', 'my_hostname': 'ns-2.kunbox.net',

View file

@ -5,7 +5,7 @@ nodes['gce.dns03'] = {
'hostname': '35.228.143.71', 'hostname': '35.228.143.71',
'bundles': set(), 'bundles': set(),
'groups': { 'groups': {
'debian-buster', 'debian-bullseye',
'dns', 'dns',
}, },
'metadata': { 'metadata': {
@ -25,7 +25,7 @@ nodes['gce.dns03'] = {
'exclude_from_backups': True, 'exclude_from_backups': True,
}, },
'postgresql': { 'postgresql': {
'version': '11', 'version': '15',
}, },
'powerdns': { 'powerdns': {
'my_hostname': 'ns-3.kunbox.net', 'my_hostname': 'ns-3.kunbox.net',

View file

@ -5,9 +5,6 @@ bundles = [
] ]
groups = ["debian-bullseye"] groups = ["debian-bullseye"]
[metadata.backups]
exclude_from_backups = true
[metadata.interfaces.enp1s0] [metadata.interfaces.enp1s0]
ips = ["172.19.138.25/24"] ips = ["172.19.138.25/24"]
gateway4 = "172.19.138.1" gateway4 = "172.19.138.1"

View file

@ -1,21 +0,0 @@
hostname = "172.19.138.21"
bundles = ["nginx", "openhab"]
groups = ["debian-bullseye"]
[metadata.interfaces.enp1s0]
ips = ["172.19.138.21/24"]
gateway4 = "172.19.138.1"
ipv6_accept_ra = true
[metadata.nginx.vhosts.openhab]
ssl = "_.home.kunbox.net"
[metadata.openhab]
domain = "openhab.home.kunbox.net"
[metadata.openhab.java_opts]
"user.timezone" = "Europe/Berlin"
[metadata.vm]
cpu = 2
ram = 2

View file

@ -3,7 +3,7 @@ dummy = true
[metadata.interfaces.default] [metadata.interfaces.default]
ips = ["172.19.138.70"] ips = ["172.19.138.70"]
dhcp = true dhcp = true
mac = "3c:61:05:d0:ba:1a" mac = "3c:61:05:d0:f2:b9"
[metadata.icinga_options] [metadata.icinga_options]
exclude_from_monitoring = true exclude_from_monitoring = true

View file

@ -133,13 +133,13 @@ nodes['home.router'] = {
'interface': 'enp1s0.100', 'interface': 'enp1s0.100',
'dyndns': { 'dyndns': {
'domain': 'franzi-home.kunbox.net', 'domain': 'franzi-home.kunbox.net',
'url': 'https://ns-1.kunbox.net/nic/update?hostname=franzi-home.kunbox.net&myip={ip}', 'url': 'https://ns-primary.kunbox.net/nic/update?hostname=franzi-home.kunbox.net&myip={ip}',
'username': vault.decrypt('encrypt$gAAAAABfr8DLAJhmUIhdxLq83I8MnRRvkRgDZcO8Brvw1KpvplC3K8ZGj0jIIWD3Us33vIP6t0ybd_mgD8slpRUk78Kqd3BMoQ=='), 'username': vault.decrypt('encrypt$gAAAAABfr8DLAJhmUIhdxLq83I8MnRRvkRgDZcO8Brvw1KpvplC3K8ZGj0jIIWD3Us33vIP6t0ybd_mgD8slpRUk78Kqd3BMoQ=='),
'password': vault.decrypt('encrypt$gAAAAABfr8Cq5M1hweeJTQAl0dLhFntdlw-QnkIYUQpY-_ycODVWOpyeAwjwOgWLSdsdXIUvqcoiXPZPV-BE12p5C42NGnj9r7sKYpoGz8xfuGIk6haMa2g='), 'password': vault.decrypt('encrypt$gAAAAABfr8Cq5M1hweeJTQAl0dLhFntdlw-QnkIYUQpY-_ycODVWOpyeAwjwOgWLSdsdXIUvqcoiXPZPV-BE12p5C42NGnj9r7sKYpoGz8xfuGIk6haMa2g='),
}, },
'nftables-rules.d': { 'nftables-rules.d': {
'inet filter forward iif enp1s0.23 oif $INTERFACE accept', 'inet filter forward iifname enp1s0.23 oif $INTERFACE accept',
'inet filter forward iif enp1s0.42 accept', 'inet filter forward iifname enp1s0.42 accept',
}, },
}, },
'unbound': { 'unbound': {

View file

@ -62,7 +62,7 @@ nodes['htz-cloud.miniserver'] = {
}, },
'element-web': { 'element-web': {
'url': 'chat.sophies-kitchen.eu', 'url': 'chat.sophies-kitchen.eu',
'version': 'v1.11.17', 'version': 'v1.11.23',
'config': { 'config': {
'default_server_config': { 'default_server_config': {
'm.homeserver': { 'm.homeserver': {
@ -134,8 +134,8 @@ nodes['htz-cloud.miniserver'] = {
}, },
}, },
'matrix-media-repo': { 'matrix-media-repo': {
'version': 'v1.2.12', 'version': 'v1.2.13',
'sha1': 'c2dfa521c2eea9a0dcde9f1c7803f52ce6d0352e', 'sha1': '0915bdf7c461368859180419d1f66717969cbe32',
'homeservers': { 'homeservers': {
'sophies-kitchen.eu': { 'sophies-kitchen.eu': {
'domain': 'http://[::1]:20080/', 'domain': 'http://[::1]:20080/',

View file

@ -96,25 +96,15 @@ nodes['kunsi-p14s'] = {
'mesa-vdpau': {}, 'mesa-vdpau': {},
'xf86-video-amdgpu': {}, 'xf86-video-amdgpu': {},
# for i3pystatus
'iw': {},
'wireless_tools': {},
# all that other random stuff one needs # all that other random stuff one needs
'abcde': {}, 'abcde': {},
'apachedirectorystudio': {}, 'apachedirectorystudio': {},
'claws-mail': {}, 'claws-mail': {},
'claws-mail-themes': {}, 'claws-mail-themes': {},
'ferdi-bin': {}, 'ferdi-bin': {},
'ffmpeg': {},
'gumbo-parser': {}, # for claws litehtml 'gumbo-parser': {}, # for claws litehtml
'imagemagick': {},
'inkscape': {},
'mosquitto': {},
'perl-musicbrainz-discid': {}, # for abcde 'perl-musicbrainz-discid': {}, # for abcde
'perl-webservice-musicbrainz': {}, # for abcde 'perl-webservice-musicbrainz': {}, # for abcde
'samba': {},
'xf86-input-wacom': {},
}, },
}, },
'sysctl': { 'sysctl': {

43
nodes/ns-primary.toml Normal file
View file

@ -0,0 +1,43 @@
hostname = "82.165.52.168"
bundles = [
"nodejs",
"powerdnsadmin",
]
groups = [
"debian-bullseye",
"dns",
"webserver",
]
[metadata.interfaces.ens192]
ips = [
"82.165.52.168",
"2001:8d8:1801:7d4::1/64",
]
gateway4 = "10.255.255.1"
gateway6 = "fe80::250:56ff:fea8:628f"
[metadata.icinga_options]
pretty_name = "ns-primary.kunbox.net"
[metadata.nginx.vhosts."ns-primary.kunbox.net"]
website_check_path = "/login"
website_check_string = "PowerDNS"
[metadata.nginx.vhosts."ns-primary.kunbox.net".locations."/"]
target = "http://127.0.0.1:8000/"
[metadata.postgresql]
version = "15"
[metadata.powerdns]
is_secondary = false
secondary_nameservers = "dns"
features.bind = true
[metadata.powerdnsadmin]
version = "v0.3.0"
[metadata.vm]
cpu = 2
ram = 2

View file

@ -105,7 +105,7 @@ nodes['rx300'] = {
}, },
'element-web': { 'element-web': {
'url': 'chat.franzi.business', 'url': 'chat.franzi.business',
'version': 'v1.11.17', 'version': 'v1.11.23',
'config': { 'config': {
'default_server_config': { 'default_server_config': {
'm.homeserver': { 'm.homeserver': {
@ -128,8 +128,8 @@ nodes['rx300'] = {
}, },
}, },
'gitea': { 'gitea': {
'version': '1.17.3', 'url': 'https://codeberg.org/attachments/be5952ea-6cfb-4be5-a593-3564c4bd8cc9',
'sha1': 'a78611a3e799150fbae3d45d2bd276d95ccffcd8', 'sha1': '0bcf3d6d6541a46571802d9e9276056ff860841e',
'domain': 'git.franzi.business', 'domain': 'git.franzi.business',
'email_domain_blocklist': { 'email_domain_blocklist': {
'aol.com', 'aol.com',
@ -197,8 +197,8 @@ nodes['rx300'] = {
}, },
}, },
'matrix-media-repo': { 'matrix-media-repo': {
'version': 'v1.2.12', 'version': 'v1.2.13',
'sha1': 'c2dfa521c2eea9a0dcde9f1c7803f52ce6d0352e', 'sha1': '0915bdf7c461368859180419d1f66717969cbe32',
'homeservers': { 'homeservers': {
'franzi.business': { 'franzi.business': {
'domain': 'http://[::1]:20080/', 'domain': 'http://[::1]:20080/',
@ -268,8 +268,8 @@ nodes['rx300'] = {
}, },
}, },
'mautrix-whatsapp': { 'mautrix-whatsapp': {
'version': 'v0.8.0', 'version': 'v0.8.2',
'sha1': '4e561a96c8fae61edd8dee9abdd52b5146fa98b2', 'sha1': '31779131b0524e84f980a7e3b5a818150833470d',
'homeserver': { 'homeserver': {
'domain': 'franzi.business', 'domain': 'franzi.business',
'url': 'https://matrix.franzi.business', 'url': 'https://matrix.franzi.business',
@ -306,7 +306,7 @@ nodes['rx300'] = {
}, },
'netbox': { 'netbox': {
'domain': 'netbox.franzi.business', 'domain': 'netbox.franzi.business',
'version': 'v3.4.1', 'version': 'v3.4.4',
'changelog_retention_days': 360, 'changelog_retention_days': 360,
'admins': { 'admins': {
'kunsi': 'hostmaster@kunbox.net', 'kunsi': 'hostmaster@kunbox.net',
@ -327,7 +327,7 @@ nodes['rx300'] = {
}, },
'vhosts': { 'vhosts': {
'element-web': {'ssl': '_.franzi.business'}, 'element-web': {'ssl': '_.franzi.business'},
'gitea': {'ssl': '_.franzi.business'}, 'forgejo': {'ssl': '_.franzi.business'},
'jenkins-ci': {'ssl': '_.franzi.business'}, 'jenkins-ci': {'ssl': '_.franzi.business'},
'matrix-dimension': {'ssl': '_.franzi.business'}, 'matrix-dimension': {'ssl': '_.franzi.business'},
'matrix-synapse': {'ssl': '_.franzi.business'}, 'matrix-synapse': {'ssl': '_.franzi.business'},
@ -450,6 +450,7 @@ nodes['rx300'] = {
}, },
'postgresql': { 'postgresql': {
'version': '13', 'version': '13',
'max_connections': 500,
}, },
'radicale': { 'radicale': {
'domain': 'radicale.franzi.business', 'domain': 'radicale.franzi.business',
@ -523,7 +524,7 @@ nodes['rx300'] = {
}, },
}, },
'travelynx': { 'travelynx': {
'version': '1.23.12', 'version': '1.29.4',
'mail_from': 'travelynx@franzi.business', 'mail_from': 'travelynx@franzi.business',
'domain': 'travelynx.franzi.business', 'domain': 'travelynx.franzi.business',
}, },

Some files were not shown because too many files have changed in this diff Show more