mirror of
https://github.com/xcat2/xcat-core.git
synced 2026-07-31 10:09:40 +00:00
036bb24c87
* refactor(packaging): share precise systemd state detection * test(packaging): cover precise systemd state detection * test(packaging): allow explicit Debian init mode * fix(packaging): honor explicit Debian init targets * test(packaging): cover Debian init target detection * fix(packaging): add Debian xcatd init state helper * test(packaging): cover Debian xcatd init state helper * test(packaging): allow delegated SysV registration * fix(packaging): preserve Debian xcatd conffile lifecycle * test(packaging): mirror explicit Debian init mode * test(packaging): cover Debian xcatd conffile lifecycle * fix(packaging): contain init state file umask * test(packaging): cover init state permissions * fix(packaging): contain preinstall context umask * test(packaging): cover preinstall umask containment * fix(packaging): detect all systemd enablement links * test(packaging): cover all systemd enablement links * test(packaging): allow shared purge state path * refactor(packaging): reuse Debian init state path * fix(packaging): detect runtime systemd masks * test(packaging): cover runtime systemd masks * test(packaging): model Debian SysV registration * refactor(packaging): reuse shared init state detection * test(packaging): enforce shared Debian state probes * test(packaging): allow explicit unregistered masks * fix(packaging): preserve Debian SysV registration state * test(packaging): cover Debian SysV registration states * fix(packaging): clean failed Debian state writes * test(packaging): cover failed Debian state writes * fix(packaging): retain unregistered systemd provenance * test(packaging): cover unregistered systemd upgrades * fix(packaging): fail closed on shared state errors * test(packaging): cover shared state detector failures * test(packaging): mirror native xcatd runlevels * fix(packaging): recover rejected SysV layouts * test(packaging): cover rejected SysV layouts * test(packaging): cover SysV rebuild retries * refactor(packaging): reuse systemctl readiness guard * test(packaging): enforce shared systemctl guard
293 lines
8.2 KiB
Bash
293 lines
8.2 KiB
Bash
#!/bin/sh
|
|
# preinst script for xCAT-server
|
|
#
|
|
# see: dh_installdeb(1)
|
|
|
|
set -e
|
|
|
|
xcat_systemd_os_release_status()
|
|
{
|
|
[ -r /etc/os-release ] || return 2
|
|
|
|
os_id=
|
|
os_version=
|
|
while IFS='=' read -r key value; do
|
|
value=${value#\"}
|
|
value=${value%\"}
|
|
value=${value#\'}
|
|
value=${value%\'}
|
|
case "$key" in
|
|
ID) os_id=$value ;;
|
|
VERSION_ID) os_version=$value ;;
|
|
esac
|
|
done < /etc/os-release
|
|
|
|
if [ "$os_id" = "debian" ] && [ -z "$os_version" ]; then
|
|
return 0
|
|
fi
|
|
|
|
os_major=${os_version%%.*}
|
|
case "$os_major" in
|
|
''|*[!0-9]*) return 2 ;;
|
|
esac
|
|
|
|
case "$os_id" in
|
|
rhel|centos|rocky|almalinux|ol|scientific)
|
|
[ "$os_major" -ge 7 ] && return 0
|
|
return 1
|
|
;;
|
|
fedora|ubuntu)
|
|
[ "$os_major" -ge 15 ] && return 0
|
|
return 1
|
|
;;
|
|
debian)
|
|
[ "$os_major" -ge 8 ] && return 0
|
|
return 1
|
|
;;
|
|
sles|sled|opensuse|opensuse-leap|opensuse-tumbleweed)
|
|
[ "$os_major" -ge 12 ] && return 0
|
|
return 1
|
|
;;
|
|
*)
|
|
return 2
|
|
;;
|
|
esac
|
|
|
|
}
|
|
|
|
xcat_target_uses_systemd()
|
|
{
|
|
if [ -d /run/systemd/system ]; then
|
|
return 0
|
|
fi
|
|
|
|
if [ -L /sbin/init ]; then
|
|
init_target=$(readlink /sbin/init 2>/dev/null || true)
|
|
case "$init_target" in
|
|
*systemd*) return 0 ;;
|
|
*) return 1 ;;
|
|
esac
|
|
fi
|
|
|
|
if [ -e /sbin/init ]; then
|
|
return 1
|
|
fi
|
|
|
|
if xcat_systemd_os_release_status; then
|
|
return 0
|
|
else
|
|
os_release_status=$?
|
|
if [ "$os_release_status" -eq 1 ]; then
|
|
return 1
|
|
fi
|
|
fi
|
|
|
|
if [ -x /usr/lib/systemd/systemd ] || [ -x /lib/systemd/systemd ]; then
|
|
return 0
|
|
fi
|
|
|
|
return 1
|
|
}
|
|
|
|
xcatd_init_state=/opt/xcat/share/xcat/scripts/xcatd-init-state
|
|
xcatd_init_compat=/opt/xcat/share/xcat/scripts/xcatd-init-compat
|
|
xcatd_legacy_init=/etc/init.d/xcatd
|
|
xcatd_state_dir=/var/lib/xcat/xcatd-init-state
|
|
xcatd_old_systemd_marker=/var/lib/xcat/xcatd-systemd-mode
|
|
xcatd_context_file=$xcatd_state_dir/context
|
|
|
|
write_xcatd_context()
|
|
(
|
|
context_value=$1
|
|
context_tmp="$xcatd_context_file.tmp.$$"
|
|
umask 077
|
|
if ! printf '%s\n' "$context_value" > "$context_tmp" ||
|
|
! mv -f "$context_tmp" "$xcatd_context_file"; then
|
|
rm -f "$context_tmp"
|
|
return 1
|
|
fi
|
|
)
|
|
|
|
clear_xcatd_pending_state()
|
|
{
|
|
rm -f "$xcatd_state_dir/pending-xcatd" \
|
|
"$xcatd_state_dir/pending-deleted" \
|
|
"$xcatd_state_dir/pending-enabled" \
|
|
"$xcatd_state_dir/pending-xcatd.tmp."*
|
|
}
|
|
|
|
xcatd_legacy_enable_state()
|
|
{
|
|
if [ -x "$xcatd_init_compat" ]; then
|
|
if detected_legacy_state=$(
|
|
"$xcatd_init_compat" debian-legacy-state 2>/dev/null
|
|
); then
|
|
case "$detected_legacy_state" in
|
|
enabled) printf '%s\n' yes ;;
|
|
disabled) printf '%s\n' no ;;
|
|
unregistered) printf '%s\n' unregistered ;;
|
|
*)
|
|
echo "Invalid xcatd legacy state: $detected_legacy_state" >&2
|
|
return 1
|
|
;;
|
|
esac
|
|
return
|
|
else
|
|
detector_status=$?
|
|
if [ "$detector_status" -ne 2 ]; then
|
|
echo "Unable to query xcatd Debian legacy state with $xcatd_init_compat" >&2
|
|
return "$detector_status"
|
|
fi
|
|
fi
|
|
fi
|
|
|
|
# Direct upgrades from a package without the Debian-specific command
|
|
# still need to capture registration before dpkg removes the conffile.
|
|
for rc_link in /etc/rc?.d/S??xcatd; do
|
|
if [ -e "$rc_link" ] || [ -L "$rc_link" ]; then
|
|
printf '%s\n' yes
|
|
return
|
|
fi
|
|
done
|
|
for rc_link in /etc/rc?.d/K??xcatd; do
|
|
if [ -e "$rc_link" ] || [ -L "$rc_link" ]; then
|
|
printf '%s\n' no
|
|
return
|
|
fi
|
|
done
|
|
printf '%s\n' unregistered
|
|
}
|
|
|
|
if xcat_target_uses_systemd; then
|
|
xcatd_uses_systemd=yes
|
|
else
|
|
xcatd_uses_systemd=no
|
|
fi
|
|
|
|
xcatd_transition_context=
|
|
case "$1" in
|
|
upgrade) xcatd_transition_context=upgrade ;;
|
|
install) xcatd_transition_context=fresh ;;
|
|
esac
|
|
|
|
if [ -n "$xcatd_transition_context" ] || [ "$1" = abort-upgrade ]; then
|
|
if [ -L "$xcatd_state_dir" ] || \
|
|
{ [ -e "$xcatd_state_dir" ] && [ ! -d "$xcatd_state_dir" ]; }; then
|
|
echo "Invalid xcatd init state directory: $xcatd_state_dir" >&2
|
|
exit 1
|
|
fi
|
|
mkdir -p "$xcatd_state_dir"
|
|
chmod 700 "$xcatd_state_dir"
|
|
fi
|
|
|
|
if [ -n "$xcatd_transition_context" ] && \
|
|
[ "$xcatd_uses_systemd" = yes ] && [ -x "$xcatd_init_state" ]; then
|
|
"$xcatd_init_state" prepare-systemd "$xcatd_transition_context"
|
|
elif [ -n "$xcatd_transition_context" ] && [ ! -x "$xcatd_init_state" ]; then
|
|
# Before the first package carrying the state helper is unpacked, save
|
|
# only the evidence that dpkg-maintscript-helper could remove.
|
|
recovery_candidate=
|
|
for candidate in \
|
|
"$xcatd_legacy_init" \
|
|
"$xcatd_legacy_init.dpkg-bak" \
|
|
"$xcatd_legacy_init.dpkg-backup" \
|
|
"$xcatd_legacy_init.dpkg-remove"; do
|
|
if [ -e "$candidate" ] || [ -L "$candidate" ]; then
|
|
recovery_candidate=$candidate
|
|
break
|
|
fi
|
|
done
|
|
|
|
known_legacy=no
|
|
if [ -e "$xcatd_state_dir/state" ] || \
|
|
[ -L "$xcatd_state_dir/state" ]; then
|
|
# Durable state from an earlier package is stronger than the
|
|
# legacy dpkg metadata left behind after removal.
|
|
clear_xcatd_pending_state
|
|
elif [ -n "$recovery_candidate" ]; then
|
|
clear_xcatd_pending_state
|
|
pending_tmp="$xcatd_state_dir/pending-xcatd.tmp.$$"
|
|
if ! cp -a "$recovery_candidate" "$pending_tmp" ||
|
|
! mv -f "$pending_tmp" "$xcatd_state_dir/pending-xcatd"; then
|
|
rm -f "$pending_tmp"
|
|
exit 1
|
|
fi
|
|
rm -f "$xcatd_old_systemd_marker"
|
|
known_legacy=yes
|
|
else
|
|
conffile_record=
|
|
if command -v dpkg-query >/dev/null 2>&1; then
|
|
conffile_record=$(
|
|
dpkg-query -W -f='${Conffiles}\n' xcat-server 2>/dev/null |
|
|
sed -n '\|^ /etc/init.d/xcatd |p'
|
|
)
|
|
fi
|
|
if [ -n "$conffile_record" ]; then
|
|
case "$conffile_record" in
|
|
*" obsolete"*)
|
|
# The installed package already removed the conffile.
|
|
# Record package omission rather than an admin deletion.
|
|
clear_xcatd_pending_state
|
|
touch "$xcatd_old_systemd_marker"
|
|
;;
|
|
*)
|
|
# A still-owned conffile that is absent was deleted by
|
|
# the administrator and must stay absent.
|
|
clear_xcatd_pending_state
|
|
rm -f "$xcatd_old_systemd_marker"
|
|
touch "$xcatd_state_dir/pending-deleted"
|
|
known_legacy=yes
|
|
;;
|
|
esac
|
|
else
|
|
# A retry without an installed conffile record must not reuse
|
|
# evidence captured by an earlier, interrupted installation.
|
|
clear_xcatd_pending_state
|
|
fi
|
|
fi
|
|
|
|
if [ "$known_legacy" = yes ]; then
|
|
xcatd_legacy_enable_state > "$xcatd_state_dir/pending-enabled"
|
|
fi
|
|
fi
|
|
|
|
if [ "$xcatd_uses_systemd" = yes ] && \
|
|
command -v dpkg-maintscript-helper >/dev/null 2>&1 && \
|
|
dpkg-maintscript-helper supports rm_conffile; then
|
|
dpkg-maintscript-helper rm_conffile /etc/init.d/xcatd -- "$@"
|
|
fi
|
|
|
|
# summary of how this script can be called:
|
|
# * <new-preinst> `install'
|
|
# * <new-preinst> `install' <old-version>
|
|
# * <new-preinst> `upgrade' <old-version>
|
|
# * <old-preinst> `abort-upgrade' <new-version>
|
|
# for details, see http://www.debian.org/doc/debian-policy/ or
|
|
# the debian-policy package
|
|
|
|
|
|
case "$1" in
|
|
upgrade)
|
|
write_xcatd_context upgrade
|
|
;;
|
|
install)
|
|
write_xcatd_context fresh
|
|
;;
|
|
|
|
abort-upgrade)
|
|
rm -f "$xcatd_context_file" "$xcatd_context_file.tmp."*
|
|
;;
|
|
|
|
*)
|
|
echo "preinst called with unknown argument \`$1'" >&2
|
|
exit 1
|
|
;;
|
|
esac
|
|
|
|
# dh_installdeb will replace this with shell code automatically
|
|
# generated by other debhelper scripts.
|
|
|
|
#DEBHELPER#
|
|
|
|
exit 0
|