diff --git a/xCAT-server/share/xcat/scripts/xcatd-init-compat b/xCAT-server/share/xcat/scripts/xcatd-init-compat index b9568c393..d1ec398f4 100755 --- a/xCAT-server/share/xcat/scripts/xcatd-init-compat +++ b/xCAT-server/share/xcat/scripts/xcatd-init-compat @@ -17,6 +17,7 @@ esac legacy_init="$compat_root/etc/init.d/xcatd" legacy_template="$compat_root$xcat_root/share/xcat/scripts/xcatd" +managed_marker="$compat_root/var/lib/xcat/xcatd-init-compat-managed" systemd_os_release_status() { @@ -260,16 +261,52 @@ unregister_all_init() return "$unregister_status" } +legacy_init_is_managed() +{ + [ -f "$managed_marker" ] && + [ -f "$legacy_init" ] && [ ! -L "$legacy_init" ] && + [ -r "$legacy_template" ] && cmp -s "$legacy_template" "$legacy_init" +} + +mark_legacy_init_managed() +{ + marker_dir=${managed_marker%/*} + marker_tmp="$managed_marker.tmp.$$" + mkdir -p -m 0755 "$marker_dir" || return 1 + umask 077 + : > "$marker_tmp" || return 1 + if ! mv -f "$marker_tmp" "$managed_marker"; then + rm -f "$marker_tmp" + return 1 + fi +} + +remove_legacy_init() +{ + rm -f "$legacy_init" || return 1 + rm -f "$managed_marker" +} + +remove_managed_legacy_init() +{ + if legacy_init_is_managed; then + rm -f "$legacy_init" || return 1 + fi + rm -f "$managed_marker" +} + configure_legacy_init() { replace_existing=0 detection_mode=compat + track_managed=0 for configure_option in "$@"; do case "$configure_option" in --replace) replace_existing=1 ;; --explicit-target) detection_mode=explicit ;; + --track-managed) track_managed=1 ;; *) - echo "Usage: $0 configure [--replace] [--explicit-target]" >&2 + echo "Usage: $0 configure [--replace] [--explicit-target] [--track-managed]" >&2 exit 2 ;; esac @@ -277,6 +314,7 @@ configure_legacy_init() if uses_systemd "$detection_mode"; then rm -f "$legacy_init" || return 1 + rm -f "$managed_marker" || return 1 return fi @@ -288,6 +326,9 @@ configure_legacy_init() if [ -e "$legacy_init" ] || [ -L "$legacy_init" ]; then if [ "$replace_existing" -ne 1 ]; then + if [ -f "$managed_marker" ] && ! legacy_init_is_managed; then + rm -f "$managed_marker" || return 1 + fi return fi rm -f "$legacy_init" || return 1 @@ -301,6 +342,11 @@ configure_legacy_init() mkdir -p "$compat_root/etc/init.d" || return 1 cp "$legacy_template" "$legacy_init" || return 1 chmod 755 "$legacy_init" || return 1 + if [ "$track_managed" -eq 1 ]; then + mark_legacy_init_managed || return 1 + else + rm -f "$managed_marker" || return 1 + fi } case "${1:-}" in @@ -346,10 +392,13 @@ case "${1:-}" in configure_legacy_init "$@" ;; remove) - rm -f "$legacy_init" + remove_legacy_init + ;; + remove-managed) + remove_managed_legacy_init ;; *) - echo "Usage: $0 {uses-systemd [--explicit-target]|legacy-state|systemd-state|register-legacy {enabled|disabled}|unregister-legacy|disable-systemd|unregister-all|configure [--replace] [--explicit-target]|remove}" >&2 + echo "Usage: $0 {uses-systemd [--explicit-target]|legacy-state|systemd-state|register-legacy {enabled|disabled}|unregister-legacy|disable-systemd|unregister-all|configure [--replace] [--explicit-target] [--track-managed]|remove|remove-managed}" >&2 exit 2 ;; esac diff --git a/xCAT-server/xCAT-server.spec b/xCAT-server/xCAT-server.spec index f3082e376..1ff870f15 100644 --- a/xCAT-server/xCAT-server.spec +++ b/xCAT-server/xCAT-server.spec @@ -364,17 +364,6 @@ chmod 644 $RPM_BUILD_ROOT/%{prefix}/lib/shfunctions %ifos linux cp etc/init.d/xcatd $RPM_BUILD_ROOT/%{prefix}/share/xcat/scripts/xcatd chmod 755 $RPM_BUILD_ROOT/%{prefix}/share/xcat/scripts/xcatd -# Keep ownership continuity only on legacy RPM targets where the script is -# materialized at runtime. Modern RPM versions can create /etc/init.d from a -# ghost entry alone, which breaks later chkconfig/initscripts transactions. -%if 0%{?rhel} && 0%{?rhel} < 7 -mkdir -p $RPM_BUILD_ROOT/etc/init.d -touch $RPM_BUILD_ROOT/etc/init.d/xcatd -%endif -%if 0%{?suse_version} && 0%{?suse_version} < 1200 -mkdir -p $RPM_BUILD_ROOT/etc/init.d -touch $RPM_BUILD_ROOT/etc/init.d/xcatd -%endif mkdir -p $RPM_BUILD_ROOT/usr/lib/systemd/system cp etc/init.d/xcatd.service $RPM_BUILD_ROOT/usr/lib/systemd/system %else @@ -448,12 +437,8 @@ rm -rf $RPM_BUILD_ROOT %if %fsm %else %ifos linux -%if 0%{?rhel} && 0%{?rhel} < 7 -%ghost %attr(0755,root,root) /etc/init.d/xcatd -%endif -%if 0%{?suse_version} && 0%{?suse_version} < 1200 -%ghost %attr(0755,root,root) /etc/init.d/xcatd -%endif +# The compatibility helper owns runtime cleanup. Listing this path as %ghost +# would let RPM unlink preserved administrator content after %preun. /usr/lib/systemd/system/xcatd.service %else /etc/init.d/xcatd @@ -532,7 +517,7 @@ if [ "$1" = "1" ]; then #Only if installing for the first time.. systemctl enable xcatd.service fi else - "$xcatd_init_compat" configure --explicit-target || exit 1 + "$xcatd_init_compat" configure --explicit-target --track-managed || exit 1 legacy_xcatd_state=$("$xcatd_init_compat" legacy-state) case "$legacy_xcatd_state" in enabled|disabled) @@ -575,7 +560,7 @@ if [ "$1" -gt "1" ]; then #only on upgrade... # This path was previously a regular RPM payload file, so upgrades replaced # it with the current package version rather than retaining an older copy. - "$xcatd_init_compat" configure --replace --explicit-target || exit 1 + "$xcatd_init_compat" configure --replace --explicit-target --track-managed || exit 1 case "$legacy_xcatd_state" in enabled|disabled) @@ -629,7 +614,7 @@ if [ -x "$xcatd_init_compat" ] && ! XCATROOT="$RPM_INSTALL_PREFIX0" "$xcatd_init_compat" uses-systemd --explicit-target && [ ! -e /etc/init.d/xcatd ] && [ ! -L /etc/init.d/xcatd ]; then XCATROOT="$RPM_INSTALL_PREFIX0" \ - "$xcatd_init_compat" configure --explicit-target || exit 1 + "$xcatd_init_compat" configure --explicit-target --track-managed || exit 1 fi %endif @@ -652,8 +637,10 @@ if [ $1 == 0 ]; then #This means only on -e fi fi - "$xcatd_init_compat" unregister-all - "$xcatd_init_compat" remove + # Preserve RPM's existing recoverable erase policy if local service state + # cannot be cleaned completely; no package payload remains afterward. + "$xcatd_init_compat" unregister-all || true + "$xcatd_init_compat" remove-managed || true rm -f /usr/sbin/xcatd #remove the symbolic fi