Files
threshold/.release/linux/postinst
T

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

163 lines
5.4 KiB
Bash
Raw Normal View History

#!/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