ParseExistingSa and SaLocals compared PCSCF= and LOCAL= as text against `ip xfrm` output, which prints RFC 5952 form, so an upper-case or uncompressed PCSCF= found no SAs and the restart registered fresh — on KPN into the live-SA refusal; the holds file's pdn key compared the same way. Both sides of each of those compares now go through imsd::util::CanonicalAddr, LOCAL is canonicalised once on the way in, and PCSCF= is accepted in that one spelling only — upper case, leading zeros or an uncompressed run are refused at bring-up with the spelling to use, a dotted-quad tail (the form ip prints for an IPv4-mapped address, which CanonicalIp6 does not read) with the rule alone, a bracketed one by the bring-up script, which routes the value as typed, with the rule (no brackets) — and a comma-separated PCSCF= (a list) with its own message instead of reaching the socket layer: one spelling, instead of a leniency both consumers of the setting would have to share. Tested: crafter-build test, 7 passed; the upper-case PCSCF= refused with the spelling to use, a bracketed one refused by the script, and the spelling they name resuming, in builds of this series on the dev phone (KPN).
50 lines
2.5 KiB
Shell
Executable file
50 lines
2.5 KiB
Shell
Executable file
#!/bin/sh
|
|
# SPDX-License-Identifier: GPL-3.0-only
|
|
# SPDX-FileCopyrightText: Copyright (C) 2026 Catcrafts®
|
|
#
|
|
# Restart imsd onto the upgraded binary once apk is done: the systemd
|
|
# trigger restarts every unit marked needs-restart (enqueue-marked). A
|
|
# changed bus policy is live the moment apk writes it (dbus-broker-launch
|
|
# reloads on its own), so it must not be left facing the old daemon. The
|
|
# restart resumes the registration over its existing SAs, goes on waiting
|
|
# when the network had imsd wait, or — an upper-case, zero-padded or uncompressed PCSCF=,
|
|
# accepted until 0.3.12 — stops at bring-up with the spelling to use; a
|
|
# call in progress ends.
|
|
#
|
|
# Also installed as imsd.post-install: `apk del imsd` removes the files
|
|
# and leaves the daemon running, so a later `apk add` of the package is
|
|
# this upgrade for that daemon, and apk runs post-install for it. A first
|
|
# install finds no unit active and marks nothing. On the binary route
|
|
# (APKBUILD.binary) the unit file ships in imsd-systemd, installed after
|
|
# this package; its imsd-systemd.post-upgrade marks the unit then.
|
|
#
|
|
# A daemon older than 0.3.10 kept its bring-up throttle wait in memory
|
|
# only, so a restart inside it registered fresh at once instead of
|
|
# waiting the schedule out. Before marking, record the running
|
|
# invocation in /run/imsd.handover: the next start (imsd-handover.sh, an
|
|
# ExecStartPre after ims-pdn-up.sh) reads that invocation's last bring-up
|
|
# line once the daemon has stopped and hands what is left of its wait over
|
|
# as imsd's holds file (on another address only the verdict that its
|
|
# registration is gone). Read then, not here: a wait that ends between this
|
|
# script and the restart at the end of the transaction — the old daemon
|
|
# making another attempt — is read as it ended.
|
|
|
|
# A unit whose file an apk del removed is not-found to systemd until a
|
|
# reload and refuses properties ("failed to load properly"); its file is
|
|
# back on disk by the time post-install runs, so reload and mark again.
|
|
mark() {
|
|
systemctl set-property "$1" Markers=+needs-restart 2>/dev/null && return 0
|
|
systemctl daemon-reload && systemctl set-property "$1" Markers=+needs-restart || :
|
|
}
|
|
|
|
record_old_invocation() {
|
|
[ -e /run/imsd.holds ] && return 0 # a 0.3.10 or later daemon keeps its own holds
|
|
inv=$(systemctl show -P InvocationID imsd.service 2>/dev/null)
|
|
[ -n "$inv" ] && echo "$inv" > /run/imsd.handover
|
|
}
|
|
|
|
if [ -d /run/systemd/system ] && systemctl is-active -q imsd.service; then
|
|
record_old_invocation
|
|
mark imsd.service
|
|
fi
|
|
exit 0
|