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.

hi thanks for sharing this. If Iā€™me getting this well, this is similar to a cron script that allows to automatically update the system? Iā€™m the only user of my system and I usually update it manually every morning :slight_smile: I like the idea of feeling the control of my system.

Stuff happens

Service dup failed

From:	root <root@localhost>
To:	root@localhost
Date:	17.03.25 01:42

1. Preloading fails:

Mar 17 01:40:53 erlangen zypper[33014]: Reading installed packages...
Mar 17 01:40:54 erlangen zypper[33014]: The following 184 packages are going to be upgraded:
Mar 17 01:40:54 erlangen zypper[33014]: The following 2 NEW packages are going to be installed:
Mar 17 01:40:54 erlangen zypper[33014]: The following 2 packages are going to be REMOVED:
Mar 17 01:40:54 erlangen zypper[33014]: 184 packages to upgrade, 2 new, 2 to remove.
Mar 17 01:40:54 erlangen zypper[33014]: Package download size:   518.6 MiB
Mar 17 01:40:54 erlangen zypper[33014]: Package install size change:
Mar 17 01:40:54 erlangen zypper[33014]:               |      1.86 GiB  required by packages that will be installed
Mar 17 01:40:54 erlangen zypper[33014]:      2.1 MiB  |  -   1.85 GiB  released by packages that will be removed
Mar 17 01:41:04 erlangen zypper[33014]: Preloading Packages [.
Mar 17 01:41:50 erlangen zypper[33014]: Preloading: kernel-firmware-realtek-20250313-1.1.noarch.rpm [error]
Mar 17 01:41:50 erlangen zypper[33014]: Preloading: libicu77-ledata-77.1-1.1.noarch.rpm [error]
Mar 17 01:41:50 erlangen zypper[33014]: Preloading: libreoffice-icon-themes-25.2.1.2-1.3.noarch.rpm [error]
Mar 17 01:42:13 erlangen zypper[33014]: Installation has completed with error.

2. Restart works:

Mar 17 01:44:24 erlangen zypper[36081]: Reading installed packages...
Mar 17 01:44:25 erlangen zypper[36081]: The following 184 packages are going to be upgraded:
Mar 17 01:44:25 erlangen zypper[36081]: The following 2 NEW packages are going to be installed:
Mar 17 01:44:25 erlangen zypper[36081]: The following 2 packages are going to be REMOVED:
Mar 17 01:44:25 erlangen zypper[36081]: 184 packages to upgrade, 2 new, 2 to remove.
Mar 17 01:44:25 erlangen zypper[36081]: Package download size:
Mar 17 01:44:25 erlangen zypper[36081]:             |     518.6 MiB  overall package size
Mar 17 01:44:25 erlangen zypper[36081]: Package install size change:
Mar 17 01:44:25 erlangen zypper[36081]:               |      1.86 GiB  required by packages that will be installed
Mar 17 01:44:25 erlangen zypper[36081]:      2.1 MiB  |  -   1.85 GiB  released by packages that will be removed
erlangen:~ #