stalwart: one primitive for probing the admin listener
stalwart_wait_http hardcoded the /healthz/ prefix and returned a yes/no, so the admin-console check could not use it and grew its own copy of the docker exec curl line. Extract stalwart_http_code <path> [max-time] and build both on it: the wait loop keeps its probe-name signature and its 3s timeout, the console check keeps its 5s and gets the status code back rather than a verdict, since 404 and no-reply-at-all need saying apart. Probe commands are byte-identical to before; no behaviour change. The upgrade verifier keeps its own copy on purpose — verifiers here are self-contained (see nextcloud's, which inlines the occ idiom rather than calling the install hook's wrapper) and should not drag a lifecycle file they have no other use for into an upgrade run. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
parent
27fea7aa17
commit
213c689cc1
@ -133,14 +133,31 @@ stalwart_install_post_setup()
|
|||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# Status code for one path on the admin listener, empty if the container did
|
||||||
|
# not answer at all. Empty and a code are different answers — "no reply" is a
|
||||||
|
# container/exec problem, while a code means the server replied and said no.
|
||||||
|
#
|
||||||
|
# curl runs INSIDE the container so this works whatever the port mapping does:
|
||||||
|
# private mode unbinds ports from the host, and a probe aimed at the host would
|
||||||
|
# then fail for reasons that have nothing to do with the server's health.
|
||||||
|
stalwart_http_code()
|
||||||
|
{
|
||||||
|
local path="$1" max_time="${2:-5}"
|
||||||
|
runFileOp docker exec stalwart-service curl -fsS -o /dev/null -w '%{http_code}' \
|
||||||
|
--max-time "$max_time" "http://localhost:8080${path}" 2>/dev/null | tr -d '\r'
|
||||||
|
}
|
||||||
|
|
||||||
# Wait for the admin HTTP listener. Used twice: once for the bootstrap listener
|
# Wait for the admin HTTP listener. Used twice: once for the bootstrap listener
|
||||||
# before we configure anything, once for the real one after the restart.
|
# before we configure anything, once for the real one after the restart.
|
||||||
|
#
|
||||||
|
# Takes a healthz probe NAME (live/ready), not a path — the two callers are both
|
||||||
|
# waiting on a health probe, and only a 200 ends the wait. Anything that needs a
|
||||||
|
# different path, or the code rather than a yes/no, wants stalwart_http_code.
|
||||||
stalwart_wait_http()
|
stalwart_wait_http()
|
||||||
{
|
{
|
||||||
local probe="$1" tries="${2:-40}" i code
|
local probe="$1" tries="${2:-40}" i code
|
||||||
for ((i = 0; i < tries; i++)); do
|
for ((i = 0; i < tries; i++)); do
|
||||||
code=$(runFileOp docker exec stalwart-service curl -fsS -o /dev/null -w '%{http_code}' \
|
code=$(stalwart_http_code "/healthz/$probe" 3)
|
||||||
--max-time 3 "http://localhost:8080/healthz/$probe" 2>/dev/null | tr -d '\r')
|
|
||||||
[[ "$code" == "200" ]] && return 0
|
[[ "$code" == "200" ]] && return 0
|
||||||
sleep 2
|
sleep 2
|
||||||
done
|
done
|
||||||
@ -386,8 +403,7 @@ stalwart_install_post_start()
|
|||||||
# turns "the panel is broken" into a one-line, fixable cause.
|
# turns "the panel is broken" into a one-line, fixable cause.
|
||||||
isNotice "Checking the admin console (WebUI) responds…"
|
isNotice "Checking the admin console (WebUI) responds…"
|
||||||
local admin_code
|
local admin_code
|
||||||
admin_code=$(runFileOp docker exec stalwart-service curl -fsS -o /dev/null -w '%{http_code}' \
|
admin_code=$(stalwart_http_code /admin)
|
||||||
--max-time 5 http://localhost:8080/admin 2>/dev/null | tr -d '\r')
|
|
||||||
if [[ "$admin_code" == "404" ]]; then
|
if [[ "$admin_code" == "404" ]]; then
|
||||||
isError "The admin console is missing (/admin returns 404)."
|
isError "The admin console is missing (/admin returns 404)."
|
||||||
isNotice " Stalwart does not bundle the WebUI — it downloads it from"
|
isNotice " Stalwart does not bundle the WebUI — it downloads it from"
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user