#!/bin/bash #Barry Kauler Dec. 2010, license GPL v3 /usr/share/doc/legal. #based on a script by technosaurus, Dec. 2010. #Modified by s243a to work with an alternative root and for better cli support. set -x CWD="$PWD" REMOVE_BUILTIN_fixmenus=no REMOVE_BUILTIN_prompt=no CHROOT_UPDATES=no REMOVE_BUILTIN_use_gui=no CHROOT_DIR="${CHROOT_DIR:-"$(echo "$CWD/puppy_fossapup64_9.5.sfs.extracted")"}" TARGET_DIR="${TARGET_DIR:-"$(echo "$CWD/fossapup64_9.5_basesfs_corecli")"}" BUILTIN_ACITON="mv" #Move files BUILTIN_ACITON_SPECS="cp" #Only copy lines from DISTRO_PKGS_SPECS #D=$CHROOT_DIR/root/.packages/builtin_files D_rel=/var/packages/builtin_files-sml D2_rel=/var/packages/builtin_files-sml_corecli Spec_rel=/var/packages/DISTRO_PKGS_SPECS Spec2_rel=/var/packages/DISTRO_PKGS_SPECS distro_spec_file="$CHROOT_DIR$Spec_rel" distro_spec_file2="$TARGET_DIR$Spec2_rel" [ -z "$D_rel" ] && D_rel=/root/.packages/builtin_files D="$CHROOT_DIR$D_rel" D="$(realpath "$D")" [ ! -d "$D" ] && D=$CHROOT_DIR/var/packages/builtin_files D2="$TARGET_DIR$D2_rel" mkdir -p "$D2" D2="$(realpath "$D2")" [ ! -d "$D" ] && D2=$TARGET_DIR/var/packages/builtin_files #/var/packages/builtin_files-sml set +x read -p "press enter to continue" set -x mkdir -p "$TARGET_DIR" function mk_parrent_dir(){ parrent="$(dirname $1)" if [ ${#parrent} -le 1 ]; then return 0 else [ ! -d "$TARGET_DIR$parrent" ]; if [ ! -z "`which cpio`" ]; then ( cd "$CHROOT_DIR" echo "./$1" | \ cpio -pdu "$TARGET_DIR" ) else mkdir -p "$TARGET_DIR/$1" fi fi } if [ -z "$BUILTIN_ACITON" ]; then if [ -z "$TARGET_DIR" ]; then ACTION_MESSAGE="removing" else ACTION_MESSAGE="moving" fi else case "$BUILTIN_ACITON" in rm) ACTION_MESSAGE="removing"; ;; mv) ACTION_MESSAGE="moving"; ;; cp) ACTION_MESSAGE="copying"; ;; esac fi function builtin_action(){ local a_action if [ -z "$BUILTIN_ACITON" ]; then if [ -z "$TARGET_DIR" ]; then a_action="rm" else a_action="mv" fi else a_action="$BUILTIN_ACITON" fi case "$a_action" in rm) rm $CHROOT_DIR$1 ;; mv) mk_parrent_dir "$1" mv "$CHROOT_DIR$1" "$TARGET_DIR$1" ;; cp) #TODO: use cpio instead of cp. if [ ! -z "`which cpio`" ]; then ( cd "$CHROOT_DIR" echo "./$1" | \ cpio -pdu "$TARGET_DIR" ) else cp -a "$CHROOT_DIR$1" "$TARGET_DIR$1" fi ;; esac } #[ -f $D/$PKG ] && rm $D/$PKG function d_action(){ local a_action if [ -z "$BUILTIN_ACITON" ]; then if [ -z "$TARGET_DIR" ]; then a_action="rm" else a_action="mv" fi else a_action="$BUILTIN_ACITON" fi case "$a_action" in rm) rm $D/$1 ;; mv) #mk_parrent_dir "$1" mv "$D/$1" "$D2/$1" ;; cp) #TODO: use cpio instead of cp. if [ ! -z "`which cpio`" ]; then ( cd "$CHROOT_DIR$D" echo "./$1" | \ cpio -pdu "$TARGET_DIR$D2" ) else cp -a "$D/$1" "$D2/$1" fi ;; esac write_DISTRO_PKGS_SPECS_item $1 } function write_DISTRO_PKGS_SPECS_hdr(){ cat "$distro_spec_file" | sed -nr '{p}; /^PKGS_SPECS_TABLE=/ {q};' > "$distro_spec_file2" } function write_DISTRO_PKGS_SPECS_footer(){ (echo "'"; echo) >> "$distro_spec_file2" } function write_DISTRO_PKGS_SPECS_item(){ #Spec_rel=/var/packages/DISTRO_PKGS_SPECS #Spec2_rel=/var/packages/DISTRO_PKGS_SPECS #distro_spec_file="$CHROOT_DIR$Spec_rel" #distro_spec_file2="$TARGET_DIR$Spec2_rel" local a_action [ -z "$BUILTIN_ACITON_SPECS" ] && BUILTIN_ACITON_SPECS="$BUILTIN_ACITON" if [ -z "$BUILTIN_ACITON_SPECS" ]; then if [ -z "$TARGET_DIR" ]; then a_action="rm" else a_action="mv" fi else a_action="$BUILTIN_ACITON" fi cat "$distro_spec_file" | grep -E '^yes\|'$1'\|' | head -n1 >> "$distro_spec_file2" case "$a_action" in #rm) # rm $D/$1 # ;; mv) case "$mv_spec_action" in delete) sed -ir "\%^yes|$1|%d" "$distro_spec_file" ;; *) sed -ir "\%^yes|$1|% {s%^yes%no%g}" "$distro_spec_file" ;; esac ;; esac } #echo CHROOT_DIR="CHROOT_DIR=$CHROOT_DIR" #set +x #read -p "Press Enter to continue" #set -x [ "`whoami`" != "root" ] && exec sudo -A ${0} ${@} #110505 export TEXTDOMAIN=remove_builtin export OUTPUT_CHARSET=UTF-8 eval_gettext () { local myMESSAGE=$(gettext "$1") eval echo \"$myMESSAGE\" } Yes_lbl="$(gettext 'Yes')" No_lbl="$(gettext 'No')" MSG1="`gettext \"Simple utility to 'delete' packages that are builtin\nto the read-only .sfs file (Squashfs filesystem)\"`" FIXMENU='no' #D=$CHROOT_DIR/root/.packages/builtin_files #D="$(realpath "$D")" #[ ! -d "$D" ] && D=$CHROOT_DIR/var/packages/builtin_files #=========================================================== process_remove_builtin_list() { # count #set -x local pkglist="$1" COUNT=$(wc -l < "$1") COUNTER=0 mkdir -p /tmp/deb-build/ #exec 15<> /tmp/deb-build/fd_15 # process while read -r p; do echo "Processing: $p" p=${p%%#*}; eval set -- $p; p="$1" [ -z $p ] && continue # commands COUNTER=$((COUNTER+1)) echo $COUNTER of $COUNT "$@" case $p in #%exit) break ;; #%dpkg) # echo Switching to dpkg # [ -z "$WITHOUT_DPKG" ] && do_install() { dpkg_install; } || # do_install() { dpkgchroot_install; } ;; #%dpkgchroot) # echo Switching to dpkgchroot # do_install() { dpkgchroot_install; } ;; #%bootstrap) # echo Switching to bootstrap # do_install() { bootstrap_install; } ;; #%bblinks) # shift # $1-nousr # echo Installing busybox symlinks ... # install_bb_links "$@" ;; #%makesfs) # set -x # #unbind_ALL # wait_until_unmounted || exit # shift # $1-output $@-squashfs params # echo Creating $1 ... # make_sfs "$@" ;; #%remove) # shift # $1-pkgname, pkgname, ... # remove_pkg "$@" ;; #%addbase) # echo Installing base rootfs ... # [ "$BASE_ARCH_PATH" ] && install_from_dir $BASE_ARCH_PATH base-arch core # install_from_dir $BASE_CODE_PATH base core ;; #%addpkg) # set -x # shift # $1-pkgname, pkgname ... # forced=0 # PKGSECTION="optional" # while [ "$1" ]; do # case "$1" in # --forced) # forced=1 # ;; # --category=*) # PKGSECTION="${1#'--category='}"; # ;; # *) # ! [ -d $EXTRAPKG_PATH/$1 ] && shift && continue # echo Installing extra package "$1" ... # if [ $forced -eq 1 ]; then # install_from_dir $EXTRAPKG_PATH/$1 $1 $PKGSECTION force # else # install_from_dir $EXTRAPKG_PATH/$1 $1 $PKGSECTION # fi # ;; # esac # shift # done # set +x # ;; #%importpkg) # shift # set -x # import_from_dir $EXTRAPKG_PATH/$1 # set +x # ;; #%dummy) # set -x # shift # $1-pkgname, pkgname ... # install_dummy "$@" # set +x # ;; #%dpkg_configure) # shift # $@-configure flags # DEBIAN_FRONTEND=noninteractive chroot $CHROOT_DIR /usr/bin/dpkg --configure "$@" ;; #%lock) # shift # $1-pkgname, pkgname ... # lock_pkg "$@" ;; #%cutdown) # set -x # shift # $@ various cutdown options # cutdown "$@" ;; #%import) # shift # $@ dirs to import # import_dir "$@" ;; # #### filesystem operations #%symlink) # shift # $1 source $2 target # rm -f $CHROOT_DIR/$2 # ln -s $1 $CHROOT_DIR/$2 # ;; #%rm) # shift # $@ files to remove # while [ "$1" ]; do # rm -rf $CHROOT_DIR/$1 # shift # done # ;; #%mkdir) # shift # $@ dirs to make # while [ "$1" ]; do # mkdir -p $CHROOT_DIR/$1 # shift # done # ;; #%touch) # shift # $@ files to create # while [ "$1" ]; do # > $CHROOT_DIR/$1 # shift # done # ;; #%chroot) # shift # $@ commands # chroot $CHROOT_DIR "$@" # ;; # # anything else - install package *) #get_pkg_info $p #[ -z "$PKG" ] && echo Cannot find ${p}. && continue #download_pkg || { echo Download $p failed. && exit 1; } #install_pkg "$2" || { echo Installation of $p failed. && exit 1; } remove_builtin_pkg "$p" ;; esac done < "$pkglist" #< $pkglist #exec 15>&- #rm /tmp/deb-build/fd_14 return 0 } function remove_builtin_pkg() { PKG="$1" local NO_PKG=false if [ -z "$PKG" ] ; then return 1 fi if [ ! -f $D/$PKG ] ; then echo "$PKG does not exist.." >&2 #return 1 #TODO: we need alternative to "return 1" here NO_PKG=true else echo "$ACTION_MESSAGE $PKG" if grep -q '\.desktop$' ${D}/${PKG}; then [ "$REMOVE_BUILTIN_fixmenus" = yes ] && FIXMENU='yes' #101222 fi ( while read file do #rm "$CHROOT_DIR$file" 1>&2 builtin_action "$file" 1>&2 echo "${file%/*}" >&2 #get dir done < $D/$PKG ) > /tmp/remove_builtin_dirs$$ #-- remove empty directories sort -ur /tmp/remove_builtin_dirs$$ | \ while read dir do while [ 1 ] ; do rmdir "$dir" 2>/dev/null dir=${dir%/*} #dirname $dir if [ -z "$dir" ] ; then break fi done done #-- fi PKGFILES="$D/$PKG" if [ "$CHROOT_UPDATES" = yes ] && [ "$NO_PKG" = false ]; then if [ "`grep '/usr/share/glib-2.0/schemas' $PKGFILES`" != "" ];then [ -e /usr/bin/glib-compile-schemas ] && glib-compile-schemas /usr/share/glib-2.0/schemas fi if [ "`grep '/usr/lib/gio/modules' $PKGFILES`" != "" ];then [ -e /usr/bin/gio-querymodules ] && gio-querymodules /usr/lib/gio/modules fi if [ "`grep ''\.desktop$'' $PKGFILES`" != "" ];then rm -f "$CHROOT_DIR/usr/share/applications/mimeinfo.cache" [ -e /usr/bin/update-desktop-database ] && update-desktop-database /usr/share/applications fi if [ "`grep '/usr/share/mime' $PKGFILES`" != "" ];then [ -e /usr/bin/update-mime-database ] && update-mime-database /usr/share/mime fi if [ "`grep '/usr/share/icons/hicolor' $PKGFILES`" != "" ];then [ -e /usr/bin/gtk-update-icon-cache ] && gtk-update-icon-cache /usr/share/icons/hicolor fi if [ "`grep '/usr/lib/gdk-pixbuf' $PKGFILES`" != "" ];then gdk-pixbuf-query-loaders --update-cache fi if [ "`grep '/usr/lib/gconv' $PKGFILES`" != "" ];then iconvconfig fi if [ "`grep '/usr/lib/pango' $PKGFILES`" != "" ];then pango-querymodules --update-cache fi for gtkver in '1.0' '2.0' '3.0' do if [ "`grep "/usr/lib/gtk-$gtkver" $PKGFILES | grep "/immodules"`" != "" ];then [ -e /usr/bin/gtk-query-immodules-$gtkver ] && gtk-query-immodules-$gtkver --update-cache fi done if [ "`grep '/usr/share/fonts' $PKGFILES`" != "" ];then fc-cache -f fi KERNVER="$(uname -r)" if [ "`grep "/lib/modules/$KERNVER" $PKGFILES`" != "" ];then depmod -a fi fi #[ -f $D/$PKG ] && rm $D/$PKG d_action "$PKG" [ "$NO_PKG" = false ] && rm /tmp/remove_builtin_dirs$$ sed -i "\%|${PKG}|%d" "$CHROOT_DIR/root/.packages/woof-installed-packages" line="$(cat "$CHROOT_DIR/root/.packages/DISTRO_PKGS_SPECS" | grep "^yes|${PKG}|")" pkgs_str=$(echo $line | cut -d'|' -f3) pkgs=(${pkgs_str//,/" "}) for a_pkg in "${pkgs[@]}"; do sed -i "\%|${a_pkg}|%d" "$CHROOT_DIR/root/.packages/woof-installed-packages" done return 0 } fix_menus() { if [ "$FIXMENU" = "yes" ];then #101222 fixmenus if [ "$DISPLAY" ] ; then if [ "`pidof jwm`" != "" ] ; then jwm -reload || jwm -restart sleep 1 fi fi fi } #=========================================================== # COMMAND LINE #============================================================ case $1 in -l|-list|--list) ls -1 $D exit ;; --pkg-list) shift write_DISTRO_PKGS_SPECS_hdr process_remove_builtin_list "$@" write_DISTRO_PKGS_SPECS_footer exit ;; esac if [ "$1" ] ; then for i in $@ do remove_builtin_pkg $i done [ "$REMOVE_BUILTIN_fixmenus" = yes ] && fix_menus exit $? fi #=========================================================== # GUI #============================================================ if [ REMOVE_BUILTIN_use_gui = yes ]; then PKGS=`ls -1 $D` DIALOG="dialog --aspect 10" MENUOPT="--checklist" REP=/tmp/$(basename $0).txt if [ "$DISPLAY" ] ; then DIALOG=Xdialog fi for i in $PKGS ; do CHOICES="$CHOICES $i . off" done PKG=`$DIALOG --stdout --backtitle "${MSG1}" --title "$(gettext 'Remove builtin packages')" --help "$(gettext "In all modes of running Puppy, other than a full hard-drive installation,\n all of the Puppy files are in a compressed read-only file named 'puppy.sfs'\n or 'wary_500.sfs' (or some similar name). So you can't actually delete these\n files. However, if you want to remaster the live-CD to create your own custom\n Puppy (see Setup menu), you can use this little program to 'pretend' to delete\n them -- and they will really be gone in the remastered CD. So, for example if\n you remove SeaMonkey, it will be gone in the remastered CD thus reducing the\n size of the .iso live-CD file.\n\n Technical note: the lists of builtin files is at /root/.packages/builtin_files,\n the list of builtin pkgs is in /root/.packages/woof-installed-packages.")" \ $MENUOPT "$(gettext 'Select packages to remove (be careful):')" 0 0 0 $CHOICES` if [ ! "$PKG" ];then exit fi PKG=$(echo "$PKG" | sed 's%/% %g') /usr/lib/gtkdialog/box_yesno --warning "Remove builtin pkg(s)" \ "Please confirm that you want to delete the following pkg(s):" "" \ "$PKG" "" "This can be a dangerous operation if you don't know what you're doing. However some more confirmation dialogs may appear..." if [ $? -ne 0 ] ; then exit fi #-- REMOVED_PKGS='' #-- for i in $PKG do DEP_OF=`grep "+${i}" "$CHROOT_DIR/root/.packages/woof-installed-packages" |cut -d "|" -f 2 |tr "\n" " "` if [ "$DEP_OF" ] ; then DESCR="`grep "|${i}|" "$CHROOT_DIR/root/.packages/woof-installed-packages" |cut -d "|" -f 10`" Xdialog --left --screen-center --backtitle "$(gettext 'Confirm that you want to delete') '${i}'" --title "$(gettext 'Remove builtin packages')" --ok-label "$Yes_lbl" --cancel-label "$No_lbl" --yesno "$(gettext 'Description of package:')\n ${DESCR}\n $(gettext 'For information only, these are dependencies of') '${i}':\n `grep "|${i}|" "$CHROOT_DIR/root/.packages/woof-installed-packages" |cut -d "|" -f 9 | sed -e 's%^+%%' -e 's%,+% %g'` \n `eval_gettext \"Warning, removing '\\\${i}' _may_ break the following packages:\"` $DEP_OF \n $(gettext 'Continue?')" 0 0 if ! [ $? -eq 0 ];then continue fi fi remove_builtin_pkg $i || continue REMOVED_PKGS="$REMOVED_PKGS $i" done fi [ "$REMOVE_BUILTIN_fixmenus" = yes ] && fix_menus if [ "$REMOVE_BUILTIN_use_gui" = yes ]; then if [ "${REMOVED_PKGS}" ] ; then /usr/lib/gtkdialog/box_ok "Remove builtin pkg(s)" info \ "The following packages were removed:" "" "${REMOVED_PKGS}" fi fi ### END ###