Add converge-wake.service and systemd-sleep hook for wake-from-sleep sync
Build / build (push) Failing after 12m9s

Creates a oneshot user service (converge-wake.service) that runs
converge --sync after the network is online, and a systemd-sleep hook
(/usr/lib/systemd/system-sleep/converge-wake) that triggers the service
for each logged-in user on resume.

Uses After=network-online.target for proper network timing on
NetworkManager/systemd-networkd setups, with a 5-second ExecStartPre
delay as a safety net for netctl and other environments where
network-online.target may not gate on resume.

Updated PKGBUILD and AGENTS.md accordingly.
This commit is contained in:
2026-05-23 22:38:55 -04:00
parent 6d165a3912
commit f546ee450e
5 changed files with 68 additions and 4 deletions
+3 -1
View File
@@ -20,7 +20,9 @@ test/GitPullSpec.hs # Pull/rebase tests
test/GitSafetySpec.hs # Operation-in-progress detection tests test/GitSafetySpec.hs # Operation-in-progress detection tests
SPEC.md # Human-readable specifications SPEC.md # Human-readable specifications
converge.example.yaml # Example config file converge.example.yaml # Example config file
converge.service # systemd unit file converge.service # systemd user service (daemon mode)
converge-wake.service # systemd user service (wake-from-sleep sync)
src/system-sleep/ # systemd-sleep hook scripts
``` ```
## Architecture ## Architecture
+11 -1
View File
@@ -15,11 +15,15 @@ optdepends=('converge-relay: realtime push notifications via SSE relay server')
backup=('etc/converge/config.example.yaml') backup=('etc/converge/config.example.yaml')
source=( source=(
"converge.service" "converge.service"
"converge-wake.service"
"converge.example.yaml" "converge.example.yaml"
"src/system-sleep/converge-wake"
) )
md5sums=( md5sums=(
'SKIP' 'SKIP'
'SKIP' 'SKIP'
'SKIP'
'SKIP'
) )
build() { build() {
@@ -54,9 +58,15 @@ package() {
install -Dm755 "$srcdir/bin/converge" \ install -Dm755 "$srcdir/bin/converge" \
"$pkgdir/usr/bin/converge" "$pkgdir/usr/bin/converge"
# User systemd service # User systemd services
install -Dm644 converge.service \ install -Dm644 converge.service \
"$pkgdir/usr/lib/systemd/user/converge.service" "$pkgdir/usr/lib/systemd/user/converge.service"
install -Dm644 converge-wake.service \
"$pkgdir/usr/lib/systemd/user/converge-wake.service"
# Sleep hook (runs converge --sync for all logged-in users after resume)
install -Dm755 src/system-sleep/converge-wake \
"$pkgdir/usr/lib/systemd/system-sleep/converge-wake"
# Example config # Example config
install -Dm644 converge.example.yaml \ install -Dm644 converge.example.yaml \
+19
View File
@@ -0,0 +1,19 @@
[Unit]
Description=Converge - sync repos after waking from sleep
Documentation=https://github.com/jbrechtel/converge
After=network-online.target
Wants=network-online.target
[Service]
Type=oneshot
ExecStart=/usr/bin/converge --sync
# Small delay as a safety net for environments (e.g. netctl) where
# network-online.target may not gate properly on resume, giving the
# network stack time to reconnect before converge attempts to pull.
ExecStartPre=/bin/sleep 5
# Allow notify-send to reach the desktop session
Environment=DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/%U/bus
[Install]
WantedBy=default.target
+19
View File
@@ -0,0 +1,19 @@
[Unit]
Description=Converge - sync repos after waking from sleep
Documentation=https://github.com/jbrechtel/converge
After=network-online.target
Wants=network-online.target
[Service]
Type=oneshot
ExecStart=/usr/bin/converge --sync
# Small delay as a safety net for environments (e.g. netctl) where
# network-online.target may not gate properly on resume, giving the
# network stack time to reconnect before converge attempts to pull.
ExecStartPre=/bin/sleep 5
# Allow notify-send to reach the desktop session
Environment=DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/%U/bus
[Install]
WantedBy=default.target
+14
View File
@@ -0,0 +1,14 @@
#!/bin/sh
# Hook for systemd-sleep: run converge --sync for each logged-in user after resume.
# Installed to /usr/lib/systemd/system-sleep/converge-wake.
# Called with $1 = "pre" (before sleep) or "post" (after resume).
if [ "$1" = "post" ]; then
# The converge-wake.service has After=network-online.target, so systemd
# won't run the actual sync until the network stack is restored. This
# hook only needs to request the start.
loginctl list-users --no-legend 2>/dev/null | while read uid name rest; do
[ "$uid" -ge 1000 ] 2>/dev/null || continue
su "$name" -c "XDG_RUNTIME_DIR=/run/user/$uid systemctl --user start converge-wake.service" 2>/dev/null || true
done
fi