Linux packages: migrate /etc/boundary.d to /etc/threshold.d without clobbering, reuse the boundary service user, carry over service enablement with a boundary.service alias, provide a boundary command. Docker: accept /boundary/config.hcl, boundary command, /boundary symlink. CLI: deprecation notice when invoked as boundary (stderr only). Dev mode: also create *.threshold.dev aliases. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
164 lines
5.4 KiB
Bash
Executable File
164 lines
5.4 KiB
Bash
Executable File
#!/bin/sh
|
|
# Threshold package post-install script (deb "postinst" / rpm "%post").
|
|
#
|
|
# Completes an in-place upgrade from a HashiCorp Boundary install. Safe to run
|
|
# repeatedly; never deletes user configuration or data:
|
|
#
|
|
# 1. If the legacy "boundary" user exists and there is no "threshold" user,
|
|
# run the service as "boundary" through a systemd drop-in, so existing
|
|
# data/log directory ownership keeps working.
|
|
# 2. Provide a "boundary" command: /usr/bin/boundary -> threshold, only if
|
|
# /usr/bin/boundary does not exist.
|
|
# 3. If the legacy boundary.service is enabled/active: stop it, carry its
|
|
# enablement over to threshold.service, and start threshold.service if the
|
|
# old service was running (rolling back to boundary.service if that fails).
|
|
# 4. Make "systemctl <verb> boundary" address threshold.service by adding a
|
|
# boundary.service alias symlink, unless something already exists there.
|
|
#
|
|
# THRESHOLD_PKG_ROOT exists only so the logic can be exercised by
|
|
# .release/linux/test/test-package-scripts.sh without root; it is empty in
|
|
# normal use.
|
|
|
|
set -eu
|
|
|
|
ROOT="${THRESHOLD_PKG_ROOT:-}"
|
|
NEW_USER="threshold"
|
|
LEGACY_USER="boundary"
|
|
UNIT="threshold.service"
|
|
LEGACY_UNIT="boundary.service"
|
|
SYSTEMD_ETC="$ROOT/etc/systemd/system"
|
|
DROPIN_DIR="$SYSTEMD_ETC/threshold.service.d"
|
|
DROPIN="$DROPIN_DIR/10-legacy-boundary-user.conf"
|
|
DROPIN_MARK="# Managed by the Threshold package (legacy boundary user reuse)"
|
|
|
|
say() {
|
|
echo "threshold postinst: $*" >&2
|
|
}
|
|
|
|
user_exists() {
|
|
id -u "$1" >/dev/null 2>&1
|
|
}
|
|
|
|
have_systemd() {
|
|
command -v systemctl >/dev/null 2>&1 && [ -d "$ROOT/run/systemd/system" ]
|
|
}
|
|
|
|
# Print the Id= systemd resolves a unit name to (follows aliases).
|
|
unit_id() {
|
|
systemctl show -p Id "$1" 2>/dev/null | sed -n 's/^Id=//p'
|
|
}
|
|
|
|
unit_load_state() {
|
|
systemctl show -p LoadState "$1" 2>/dev/null | sed -n 's/^LoadState=//p'
|
|
}
|
|
|
|
# Where the packaged threshold.service lives (merged-usr or not).
|
|
packaged_unit_path() {
|
|
for _p in "$ROOT/usr/lib/systemd/system/$UNIT" "$ROOT/lib/systemd/system/$UNIT"; do
|
|
if [ -f "$_p" ]; then
|
|
echo "${_p#"$ROOT"}"
|
|
return 0
|
|
fi
|
|
done
|
|
return 1
|
|
}
|
|
|
|
# --- 1. legacy service user -------------------------------------------------
|
|
if user_exists "$LEGACY_USER" && ! user_exists "$NEW_USER"; then
|
|
_group=$(id -gn "$LEGACY_USER" 2>/dev/null || echo "$LEGACY_USER")
|
|
_content="$DROPIN_MARK
|
|
[Service]
|
|
User=$LEGACY_USER
|
|
Group=$_group"
|
|
if [ -e "$DROPIN" ] && ! grep -qF "$DROPIN_MARK" "$DROPIN"; then
|
|
say "leaving existing $DROPIN untouched (not managed by this package)"
|
|
else
|
|
mkdir -p "$DROPIN_DIR"
|
|
_tmp="$DROPIN.tmp.$$"
|
|
printf '%s\n' "$_content" >"$_tmp"
|
|
mv -f "$_tmp" "$DROPIN"
|
|
say "service will run as existing user '$LEGACY_USER' ($DROPIN)"
|
|
fi
|
|
fi
|
|
|
|
# --- 2. "boundary" command ----------------------------------------------------
|
|
_bin="$ROOT/usr/bin/boundary"
|
|
if [ ! -e "$_bin" ] && [ ! -L "$_bin" ]; then
|
|
if [ -e "$ROOT/usr/bin/threshold" ]; then
|
|
ln -s threshold "$_bin"
|
|
fi
|
|
elif [ ! -L "$_bin" ]; then
|
|
say "/usr/bin/boundary is still the HashiCorp Boundary binary (old package installed); leaving it"
|
|
say "after removing the old package run: ln -s threshold /usr/bin/boundary"
|
|
fi
|
|
|
|
# --- 3 + 4. legacy systemd service ----------------------------------------------
|
|
if have_systemd; then
|
|
_alias="$SYSTEMD_ETC/$LEGACY_UNIT"
|
|
|
|
if [ -L "$_alias" ]; then
|
|
# Already aliased (previous run): nothing to migrate.
|
|
:
|
|
elif [ -e "$_alias" ]; then
|
|
say "$_alias is a custom unit; not touching the legacy service."
|
|
say "move it away and re-run the package configuration to migrate."
|
|
else
|
|
_id=$(unit_id "$LEGACY_UNIT")
|
|
_load=$(unit_load_state "$LEGACY_UNIT")
|
|
_legacy_present=0
|
|
_was_enabled=0
|
|
_was_active=0
|
|
if [ "$_id" = "$LEGACY_UNIT" ] && [ "$_load" = "loaded" ]; then
|
|
_legacy_present=1
|
|
if systemctl is-enabled --quiet "$LEGACY_UNIT" 2>/dev/null; then
|
|
_was_enabled=1
|
|
fi
|
|
if systemctl is-active --quiet "$LEGACY_UNIT" 2>/dev/null; then
|
|
_was_active=1
|
|
fi
|
|
fi
|
|
|
|
# Only act on upgrades: a legacy unit or legacy config is present.
|
|
if [ "$_legacy_present" = 1 ] || [ -d "$ROOT/etc/boundary.d" ]; then
|
|
if [ "$_was_active" = 1 ]; then
|
|
say "stopping $LEGACY_UNIT"
|
|
systemctl stop "$LEGACY_UNIT" || say "could not stop $LEGACY_UNIT"
|
|
fi
|
|
if [ "$_was_enabled" = 1 ]; then
|
|
systemctl disable "$LEGACY_UNIT" >/dev/null 2>&1 || say "could not disable $LEGACY_UNIT"
|
|
fi
|
|
|
|
# Alias symlink so `systemctl restart boundary` reaches threshold.service.
|
|
if _unit_path=$(packaged_unit_path); then
|
|
mkdir -p "$SYSTEMD_ETC"
|
|
ln -s "$_unit_path" "$_alias"
|
|
fi
|
|
systemctl daemon-reload || true
|
|
|
|
if [ "$_was_enabled" = 1 ]; then
|
|
systemctl enable "$UNIT" >/dev/null 2>&1 || say "could not enable $UNIT"
|
|
fi
|
|
if [ "$_was_active" = 1 ]; then
|
|
if systemctl start "$UNIT"; then
|
|
say "$LEGACY_UNIT migrated to $UNIT (config: /etc/threshold.d)"
|
|
else
|
|
say "FAILED to start $UNIT; rolling back to $LEGACY_UNIT"
|
|
systemctl disable "$UNIT" >/dev/null 2>&1 || true
|
|
rm -f "$_alias"
|
|
systemctl daemon-reload || true
|
|
if [ "$_was_enabled" = 1 ]; then
|
|
systemctl enable "$LEGACY_UNIT" >/dev/null 2>&1 || true
|
|
fi
|
|
systemctl start "$LEGACY_UNIT" || say "could not restart $LEGACY_UNIT"
|
|
fi
|
|
elif [ "$_was_enabled" = 1 ]; then
|
|
say "$LEGACY_UNIT enablement carried over to $UNIT (not started: it was stopped)"
|
|
fi
|
|
fi
|
|
fi
|
|
# Pick up a new/changed user drop-in even when no migration was needed.
|
|
systemctl daemon-reload || true
|
|
fi
|
|
|
|
exit 0
|