cleanup: add CLEANUP_AUTOMARK_LISTS for live-install package cleanup

CLEANUP_AUTO_PACKAGES worked only with LIVE_PACKAGES, but apps for the Live image (Telegram, LibreOffice, etc.) are specified via LIVE_LISTS. These packages remained in the installed system even when the user unchecked them in the installer. Add CLEANUP_AUTOMARK_PACKAGES and CLEANUP_AUTOMARK_LISTS variables. generate.mk converts lists into package names at build time. 89-cleanup-live-preinstall marks real packages as auto-installed. 90-cleanup-live-install-pkgs handles virtual packages separately (apt-mark cannot resolve them) by comparing resolved real names of automark and user-selected packages in postinstall. Based on a841e60e by Vitaly Lipatov. https://bugs.etersoft.ru/18827
parent 448343f3
......@@ -20,6 +20,8 @@ use/ximper/cleanup:
@$(call add,CLEANUP_BASE_PACKAGES,branding-etersoft-ximper-alterator)
@$(call add,CLEANUP_BASE_PACKAGES,'alterator*' rpm-macros-alterator)
@$(call add,CLEANUP_BASE_PACKAGES,'guile*' libvhttpd autologin-sh-functions)
@$(call add,CLEANUP_AUTOMARK_PACKAGES,$$(LIVE_PACKAGES))
@$(call add,CLEANUP_AUTOMARK_LISTS,$$(LIVE_LISTS))
use/ximper/cleanup/x11: \
use/ximper/cleanup
......
......@@ -14,5 +14,16 @@ CLEANUP_BASE_PACKAGES.
Для удаления пакетов только из livecd используйте переменную
CLEANUP_LIVE_PACKAGES.
Для пакетов, которые следует пометить как auto-installed при
установке с livecd (будут удалены через autoremove, если не нужны
пользователю), используйте переменную CLEANUP_AUTOMARK_PACKAGES.
Это безопаснее чем CLEANUP_BASE_PACKAGES: пакет не удалится,
если он требуется выбранным пользователем группам.
Для указания списков пакетов (из pkg.in/lists/), которые должны быть
помечены как auto-installed, используйте CLEANUP_AUTOMARK_LISTS.
Пакеты из этих списков будут автоматически преобразованы в имена
и добавлены к CLEANUP_AUTOMARK_PACKAGES при сборке образа.
CAUTION: также удаляет rpm, apt и базу по пакетам из livecd,
если в него не был добавлен инсталятор!
......@@ -5,6 +5,8 @@ use/cleanup:
@$(call xport,CLEANUP_PACKAGES)
@$(call xport,CLEANUP_BASE_PACKAGES)
@$(call xport,CLEANUP_LIVE_PACKAGES)
@$(call xport,CLEANUP_AUTOMARK_PACKAGES)
@$(call xport,CLEANUP_AUTOMARK_LISTS)
use/cleanup/live-no-cleanupdb:
@$(call set,LIVE_NO_CLEANUPDB,yes)
......
# Convert CLEANUP_AUTOMARK_LISTS to packages and append to distcfg.mk
ifneq (,$(BUILDDIR))
include $(BUILDDIR)/distcfg.mk
# Use source pkg.in/lists/ directly (pkg.in is processed after features.in)
LIST_FILES := $(CLEANUP_AUTOMARK_LISTS:%=$(MKIMAGE_PROFILES)/pkg.in/lists/%)
all: debug
@if [ -n "$(LIST_FILES)" ]; then \
pkgs="$$(for f in $(LIST_FILES); do \
[ -f "$$f" ] && cat "$$f" && echo; \
done \
| grep -v '^[[:space:]]*[#]' \
| tr -s '[:space:]' '\n' \
| grep -v '^$$' \
| sort -u \
| xargs)"; \
if [ -n "$$pkgs" ]; then \
echo "CLEANUP_AUTOMARK_PACKAGES += $$pkgs" >> $(BUILDDIR)/distcfg.mk; \
fi; \
fi
debug:
@if [ -n "$(DEBUG)" ]; then \
echo "** CLEANUP_AUTOMARK_LISTS: $(CLEANUP_AUTOMARK_LISTS)"; \
echo "** LIST_FILES: $(LIST_FILES)"; \
fi
endif
#!/bin/sh -efu
### create a preinstall hook to mark live-only packages as auto-installed
[ -n "$GLOBAL_CLEANUP_AUTOMARK_PACKAGES" ] || exit 0
[ -x /usr/sbin/install2 ] || [ -x /usr/libexec/install2/install2 ] || exit 0
if [ -n "$GLOBAL_VERBOSE" ]; then
echo "** GLOBAL_CLEANUP_AUTOMARK_PACKAGES: $GLOBAL_CLEANUP_AUTOMARK_PACKAGES"
fi >&2
HOOKDIR="/usr/lib/alterator/hooks/pkg-preinstall.d"
mkdir -p "$HOOKDIR"
SCRIPT="$HOOKDIR/01-mark-live-packages-auto"
cat > "$SCRIPT" << EOF
#!/bin/sh -efu
# Mark live-only packages as auto-installed before pkg-install runs.
# Only real packages will be marked; virtual packages are ignored by apt-mark
# and handled separately in postinstall.
apt-mark auto $GLOBAL_CLEANUP_AUTOMARK_PACKAGES ||:
EOF
chmod +x "$SCRIPT"
#!/bin/sh -efu
### create a postinstall script to drop temporarily needed packages
### create a postinstall script to handle cleanup
if [ -n "$GLOBAL_VERBOSE" ]; then
echo "** GLOBAL_CLEANUP_PACKAGES: $GLOBAL_CLEANUP_PACKAGES"
echo "** GLOBAL_CLEANUP_BASE_PACKAGES: $GLOBAL_CLEANUP_BASE_PACKAGES"
echo "** GLOBAL_CLEANUP_AUTOMARK_PACKAGES: $GLOBAL_CLEANUP_AUTOMARK_PACKAGES"
fi >&2
[ -n "$GLOBAL_CLEANUP_PACKAGES" ] ||
[ -n "$GLOBAL_CLEANUP_BASE_PACKAGES" ] || exit 0
[ -n "$GLOBAL_CLEANUP_BASE_PACKAGES" ] ||
[ -n "$GLOBAL_CLEANUP_AUTOMARK_PACKAGES" ] || exit 0
[ -x /usr/sbin/install2 ] || [ -x /usr/libexec/install2/install2 ] || exit 0
......@@ -15,19 +17,107 @@ CLEANUP_PACKAGES="$GLOBAL_CLEANUP_PACKAGES $GLOBAL_CLEANUP_BASE_PACKAGES"
SCRIPT="/usr/share/install2/postinstall.d/01-remove-pkgs"
cat > "$SCRIPT" << EOF
cat > "$SCRIPT" << 'OUTER_EOF'
#!/bin/sh -efu
. install2-init-functions
# don't override the script start message on the same line
echo "removing $CLEANUP_PACKAGES"
pkg_list_file="/var/lib/installer-alterator-pkg/pkg-list"
lists_dir="/var/lib/install3/lists"
# Get packages from user-selected groups
get_selected_packages() {
local selected_groups=""
if [ -r "$pkg_list_file" ]; then
selected_groups="$(cat "$pkg_list_file" | tr ';' ' ')"
fi
local pkgs=""
for group in $selected_groups; do
local list_file="$lists_dir/$group"
if [ -f "$list_file" ]; then
local group_pkgs="$(cat "$list_file" | grep -v '^[[:space:]]*#' | grep -v '^[[:space:]]*$' | xargs)"
pkgs="$pkgs $group_pkgs"
fi
done
echo "$pkgs"
}
# Resolve package to real name(s). If virtual - resolve via whatprovides,
# if real - return as is. Returns empty if package not found.
resolve_to_real() {
local pkg="$1"
# If it's a real installed package, return it
if exec_chroot rpmquery "$pkg" >/dev/null 2>&1; then
echo "$pkg"
return
fi
# If it's a virtual package, resolve to real provider(s)
exec_chroot rpmquery --whatprovides "$pkg" --qf '%{NAME}\n' 2>/dev/null | sort -u | xargs
}
OUTER_EOF
# Add the main logic with variable substitution
cat >> "$SCRIPT" << EOF
# All packages from CLEANUP_AUTOMARK (real ones already marked auto, virtual ones - not)
all_automark_packages="$GLOBAL_CLEANUP_AUTOMARK_PACKAGES"
# Get user-selected packages (may contain virtual names)
selected_packages="\$(get_selected_packages)"
echo "User selected packages: \$selected_packages"
# Resolve selected packages to real names for comparison
selected_resolved=""
for pkg in \$selected_packages; do
resolved="\$(resolve_to_real "\$pkg")"
if [ -n "\$resolved" ]; then
selected_resolved="\$selected_resolved \$resolved"
fi
done
echo "User selected packages (resolved to real): \$selected_resolved"
# remove temporary packages from the installed system
list="\$(exec_chroot rpmquery -a --qf='%{NAME}\\n' $CLEANUP_PACKAGES)"
# Find virtual packages whose REAL providers were NOT selected by user.
# WORKAROUND: apt-mark doesn't handle virtual packages, so we resolve them
# manually here. Remove this when apt-mark supports virtual packages.
virtual_to_remove=""
for pkg in \$all_automark_packages; do
# Skip real packages - already handled by 89-preinstall and alterator
if exec_chroot rpmquery "\$pkg" >/dev/null 2>&1; then
continue
fi
# Only virtual packages reach here - resolve to real provider(s)
resolved="\$(exec_chroot rpmquery --whatprovides "\$pkg" --qf '%{NAME}\\n' 2>/dev/null | sort -u | xargs)"
[ -n "\$resolved" ] || continue
# Check each resolved real package
for real_pkg in \$resolved; do
# Skip if real package was selected by user (after resolution)
if echo " \$selected_resolved " | grep -qF " \$real_pkg "; then
continue
fi
virtual_to_remove="\$virtual_to_remove \$real_pkg"
done
done
# Remove duplicates
virtual_to_remove="\$(echo \$virtual_to_remove | tr ' ' '\\n' | sort -u | xargs)"
# Mark unselected virtual packages as auto and let autoremove handle them
if [ -n "\$virtual_to_remove" ]; then
echo "Marking unselected packages as auto: \$virtual_to_remove"
exec_chroot apt-mark auto \$virtual_to_remove ||:
fi
# Remove temporary packages
echo "removing $CLEANUP_PACKAGES"
list="\$(exec_chroot rpmquery -a --qf='%{NAME}\\n' $CLEANUP_PACKAGES 2>/dev/null | xargs)"
if [ -n "\$list" ]; then
exec_chroot apt-get remove -f -y -- \$list
exec_chroot apt-get autoremove -y
exec_chroot apt-get remove -f -y -- \$list ||:
fi
# Final cleanup - remove orphaned auto packages
exec_chroot apt-get autoremove -y
EOF
chmod +x "$SCRIPT"
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment