Parallel zypper downloads are here

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:

  1. 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:~ # 
  1. 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.