Everything fits loosly into a single post. The bigger part is creating the systemd units and configuring. Scripting is minimal. Currently I use the following on all hosts I am maintaining:
erlangen:~ # systemctl cat dup
# /etc/systemd/system/dup.service
[Unit]
Description=zypper dist-upgrade
[Service]
Type=oneshot
Environment=ZYPP_PCK_PRELOAD=1
ExecStartPre=/usr/local/bin/check-opensuse
ExecStart=/usr/bin/zypper --non-interactive dist-upgrade
# /etc/systemd/system/service.d/toplevel-override.conf
[Unit]
OnFailure=failure-notification@%n
erlangen:~ # systemctl cat dup.timer
# /etc/systemd/system/dup.timer
[Unit]
Description=zypper dist-upgrade
[Timer]
OnCalendar=daily
Persistent=true
[Install]
WantedBy=timers.target
erlangen:~ #
erlangen:~ # cat /usr/local/bin/check-opensuse
#!/bin/bash
for i in {1..20} ; do
curl -I -s cdn.opensuse.org | grep "200 OK" > /dev/null && exit
sleep 1
echo sleep $i
done
exit 1
erlangen:~ #
Prerequisites for smooth operation exist:
- Use of repo priorities
erlangen:~ # zypper repos --alias --refresh --show-enabled-only --sort-by-priority --uri
# | Alias | Enabled | GPG Check | Refresh | Priority | URI
---+----------------------+---------+-----------+---------+----------+----------------------------------------------------------------------------------
7 | Packman | Yes | (r ) Yes | Yes | 90 | https://ftp.fau.de/packman/suse/openSUSE_Tumbleweed/
31 | non-oss | Yes | (r ) Yes | Yes | 99 | https://cdn.opensuse.org/tumbleweed/repo/non-oss/
34 | oss | Yes | (r ) Yes | Yes | 99 | https://cdn.opensuse.org/tumbleweed/repo/oss/
44 | update | Yes | (r ) Yes | Yes | 99 | https://cdn.opensuse.org/update/tumbleweed/
1 | Application_Geo | Yes | (r ) Yes | Yes | 100 | https://cdn.opensuse.org/repositories/Application:/Geo/openSUSE_Tumbleweed/
10 | brave-browser | Yes | (r ) Yes | Yes | 100 | https://brave-browser-rpm-release.s3.brave.com/x86_64
26 | home_kukuk_qmapshack | Yes | (r ) Yes | Yes | 100 | https://cdn.opensuse.org/repositories/home:/kukuk:/qmapshack/openSUSE_Tumbleweed/
28 | jalbum | Yes | ( ) No | Yes | 100 | https://jalbum.net/download/software/yumrepo/
30 | myrepo | Yes | ( ) No | Yes | 100 | dir:/root/myrepo
45 | utilities | Yes | (r ) Yes | Yes | 100 | https://cdn.opensuse.org/repositories/utilities/openSUSE_Factory/
erlangen:~ #
- Configure zypper for non-interactive operation:
erlangen:~ # grep -v ^\# /etc/zypp/zypp.conf|grep -v ^\$
[main]
solver.onlyRequires = true
solver.allowVendorChange = true
solver.dupAllowVendorChange = true
solver.cleandepsOnRemove = true
erlangen:~ #
Given the above, upgrading is stable for months and even years. Infamous Host Erlangen uses the same btrfs since 2019:
zypper pauses these actions until done. dup.services
may fail, but it will run again and eventually succeeds.
https://wiki.archlinux.org/title/Systemd#Notifying_about_failed_services
erlangen:~ # systemctl cat failure-notification@
# /etc/systemd/system/failure-notification@.service
[Unit]
Description=Send a notification about a failed systemd unit
After=network.target
[Service]
Type=simple
ExecStart=/usr/local/bin/failure-notification.sh %i
# /etc/systemd/system/failure-notification@.service.d/toplevel-override.conf
erlangen:~ #
Local mail works out of the box:
erlangen:~ # cat /usr/local/bin/failure-notification.sh
#!/bin/bash
mail -Ssendwait -s "Service $1 failed" </dev/null root
erlangen:~ #
Remote mail requires the configuration of a relay host.