Advertisement
s243a

move_builtin.sh (Draft #2 - DiISTRO_SPEC Cap. added)

Mar 18th, 2021
1,646
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Bash 15.13 KB | None | 0 0
  1. #!/bin/bash
  2. #Barry Kauler Dec. 2010, license GPL v3 /usr/share/doc/legal.
  3. #based on a script by technosaurus, Dec. 2010.
  4. #Modified by s243a to work with an alternative root and for better cli support.
  5.  
  6. set -x
  7. CWD="$PWD"
  8. REMOVE_BUILTIN_fixmenus=no
  9. REMOVE_BUILTIN_prompt=no
  10. CHROOT_UPDATES=no
  11. REMOVE_BUILTIN_use_gui=no
  12. CHROOT_DIR="${CHROOT_DIR:-"$(echo "$CWD/puppy_fossapup64_9.5.sfs.extracted")"}"
  13. TARGET_DIR="${TARGET_DIR:-"$(echo "$CWD/fossapup64_9.5_basesfs_corecli")"}"
  14. BUILTIN_ACITON="mv" #Move files
  15. BUILTIN_ACITON_SPECS="cp" #Only copy lines from DISTRO_PKGS_SPECS
  16.  
  17. #D=$CHROOT_DIR/root/.packages/builtin_files
  18. D_rel=/var/packages/builtin_files-sml
  19. D2_rel=/var/packages/builtin_files-sml_corecli
  20. Spec_rel=/var/packages/DISTRO_PKGS_SPECS
  21. Spec2_rel=/var/packages/DISTRO_PKGS_SPECS
  22. distro_spec_file="$CHROOT_DIR$Spec_rel"
  23. distro_spec_file2="$TARGET_DIR$Spec2_rel"
  24.  
  25. [ -z "$D_rel" ] && D_rel=/root/.packages/builtin_files
  26. D="$CHROOT_DIR$D_rel"
  27. D="$(realpath "$D")"
  28. [ ! -d "$D" ] && D=$CHROOT_DIR/var/packages/builtin_files
  29. D2="$TARGET_DIR$D2_rel"
  30. mkdir -p "$D2"
  31. D2="$(realpath "$D2")"
  32. [ ! -d "$D" ] && D2=$TARGET_DIR/var/packages/builtin_files
  33. #/var/packages/builtin_files-sml
  34. set +x
  35. read -p "press enter to continue"
  36. set -x
  37. mkdir -p "$TARGET_DIR"
  38. function mk_parrent_dir(){
  39.   parrent="$(dirname $1)"
  40.   if  [ ${#parrent} -le 1 ]; then
  41.     return 0
  42.   else [ ! -d "$TARGET_DIR$parrent" ];
  43.     if [ ! -z "`which cpio`" ]; then
  44.         ( cd "$CHROOT_DIR"
  45.           echo "./$1" | \
  46.             cpio -pdu "$TARGET_DIR" )
  47.     else
  48.       mkdir -p "$TARGET_DIR/$1"
  49.     fi         
  50.   fi
  51. }
  52. if [ -z "$BUILTIN_ACITON" ]; then
  53.      if [ -z "$TARGET_DIR" ]; then
  54.       ACTION_MESSAGE="removing"
  55.     else
  56.       ACTION_MESSAGE="moving"
  57.     fi
  58. else
  59.   case "$BUILTIN_ACITON" in
  60.   rm) ACTION_MESSAGE="removing"; ;;
  61.   mv) ACTION_MESSAGE="moving"; ;;
  62.   cp) ACTION_MESSAGE="copying"; ;;
  63.   esac
  64. fi
  65. function builtin_action(){
  66.   local a_action
  67.   if [ -z "$BUILTIN_ACITON" ]; then
  68.     if [ -z "$TARGET_DIR" ]; then
  69.       a_action="rm"
  70.     else
  71.       a_action="mv"
  72.     fi
  73.   else
  74.     a_action="$BUILTIN_ACITON"
  75.   fi
  76.       case "$a_action" in
  77.       rm)
  78.         rm $CHROOT_DIR$1
  79.         ;;
  80.       mv)
  81.         mk_parrent_dir "$1"
  82.         mv "$CHROOT_DIR$1" "$TARGET_DIR$1"
  83.         ;;
  84.       cp) #TODO: use cpio instead of cp.
  85.         if [ ! -z "`which cpio`" ]; then
  86.          ( cd "$CHROOT_DIR"
  87.               echo "./$1" | \
  88.                 cpio -pdu "$TARGET_DIR" )    
  89.         else
  90.           cp -a "$CHROOT_DIR$1" "$TARGET_DIR$1"
  91.         fi
  92.         ;;
  93.       esac
  94.  
  95. }
  96. #[ -f $D/$PKG ] && rm $D/$PKG
  97. function d_action(){
  98.   local a_action
  99.   if [ -z "$BUILTIN_ACITON" ]; then
  100.     if [ -z "$TARGET_DIR" ]; then
  101.       a_action="rm"
  102.     else
  103.       a_action="mv"
  104.     fi
  105.   else
  106.     a_action="$BUILTIN_ACITON"
  107.   fi
  108.       case "$a_action" in
  109.       rm)
  110.         rm $D/$1
  111.         ;;
  112.       mv)
  113.         #mk_parrent_dir "$1"
  114.         mv "$D/$1" "$D2/$1"
  115.         ;;
  116.       cp) #TODO: use cpio instead of cp.
  117.         if [ ! -z "`which cpio`" ]; then
  118.          ( cd "$CHROOT_DIR$D"
  119.               echo "./$1" | \
  120.                 cpio -pdu "$TARGET_DIR$D2" )    
  121.         else
  122.           cp -a "$D/$1" "$D2/$1"
  123.         fi
  124.         ;;
  125.       esac
  126.       write_DISTRO_PKGS_SPECS_item $1
  127. }
  128. function write_DISTRO_PKGS_SPECS_hdr(){
  129.   cat "$distro_spec_file" | sed -nr '{p}; /^PKGS_SPECS_TABLE=/ {q};' > "$distro_spec_file2"
  130. }  
  131. function write_DISTRO_PKGS_SPECS_footer(){
  132.   (echo "'"; echo) >> "$distro_spec_file2"
  133. }  
  134. function write_DISTRO_PKGS_SPECS_item(){    
  135.     #Spec_rel=/var/packages/DISTRO_PKGS_SPECS
  136.     #Spec2_rel=/var/packages/DISTRO_PKGS_SPECS
  137.     #distro_spec_file="$CHROOT_DIR$Spec_rel"
  138.     #distro_spec_file2="$TARGET_DIR$Spec2_rel" 
  139.   local a_action
  140.   [ -z "$BUILTIN_ACITON_SPECS" ] &&  BUILTIN_ACITON_SPECS="$BUILTIN_ACITON"
  141.   if [ -z "$BUILTIN_ACITON_SPECS" ]; then
  142.     if [ -z "$TARGET_DIR" ]; then
  143.       a_action="rm"
  144.     else
  145.       a_action="mv"
  146.     fi
  147.   else
  148.     a_action="$BUILTIN_ACITON"
  149.   fi
  150.       cat "$distro_spec_file" | grep -E '^yes\|'$1'\|' | head -n1 >> "$distro_spec_file2"
  151.       case "$a_action" in
  152.       #rm)
  153.       #  rm $D/$1
  154.       #  ;;
  155.       mv)
  156.         case "$mv_spec_action" in
  157.         delete)
  158.           sed -ir "\%^yes|$1|%d" "$distro_spec_file"
  159.           ;;
  160.         *)
  161.           sed -ir "\%^yes|$1|% {s%^yes%no%g}" "$distro_spec_file"
  162.           ;;
  163.         esac
  164.         ;;
  165.       esac    
  166. }
  167. #echo CHROOT_DIR="CHROOT_DIR=$CHROOT_DIR"
  168. #set +x
  169. #read -p "Press Enter to continue"
  170. #set -x
  171.  
  172. [ "`whoami`" != "root" ] && exec sudo -A ${0} ${@} #110505
  173.  
  174. export TEXTDOMAIN=remove_builtin
  175. export OUTPUT_CHARSET=UTF-8
  176. eval_gettext () {
  177.   local myMESSAGE=$(gettext "$1")
  178.   eval echo \"$myMESSAGE\"
  179. }
  180.  
  181. Yes_lbl="$(gettext 'Yes')"
  182. No_lbl="$(gettext 'No')"
  183.  
  184. MSG1="`gettext \"Simple utility to 'delete' packages that are builtin\nto the read-only .sfs file (Squashfs filesystem)\"`"
  185. FIXMENU='no'
  186.  
  187. #D=$CHROOT_DIR/root/.packages/builtin_files
  188. #D="$(realpath "$D")"
  189. #[ ! -d "$D" ] && D=$CHROOT_DIR/var/packages/builtin_files
  190.  
  191. #===========================================================
  192. process_remove_builtin_list() {
  193.     # count
  194.     #set -x
  195.     local pkglist="$1" COUNT=$(wc -l < "$1") COUNTER=0
  196.     mkdir -p /tmp/deb-build/
  197.     #exec 15<> /tmp/deb-build/fd_15
  198.    
  199.    
  200.     # process
  201.     while read -r p; do
  202.         echo "Processing: $p"
  203.         p=${p%%#*}; eval set -- $p; p="$1"
  204.         [ -z $p ] && continue
  205.        
  206.         # commands
  207.         COUNTER=$((COUNTER+1))     
  208.         echo $COUNTER of $COUNT "$@"       
  209.         case $p in
  210.             #%exit) break ;;
  211.             #%dpkg)
  212.             #   echo Switching to dpkg
  213.             #   [ -z "$WITHOUT_DPKG" ] && do_install() { dpkg_install; } ||
  214.             #   do_install() { dpkgchroot_install; } ;;
  215.             #%dpkgchroot)
  216.             #   echo Switching to dpkgchroot
  217.             #   do_install() { dpkgchroot_install; } ;;
  218.             #%bootstrap)
  219.             #   echo Switching to bootstrap
  220.             #   do_install() { bootstrap_install; } ;;
  221.             #%bblinks)
  222.             #   shift # $1-nousr
  223.             #   echo Installing busybox symlinks ...
  224.             #   install_bb_links "$@" ;;
  225.             #%makesfs)
  226.             #    set -x
  227.             #    #unbind_ALL
  228.             #    wait_until_unmounted || exit
  229.             #   shift # $1-output $@-squashfs params
  230.             #   echo Creating $1 ...
  231.             #   make_sfs "$@" ;;
  232.             #%remove)
  233.             #   shift # $1-pkgname, pkgname, ...
  234.             #   remove_pkg "$@" ;;
  235.             #%addbase)
  236.             #   echo Installing base rootfs ...
  237.             #   [ "$BASE_ARCH_PATH" ] && install_from_dir $BASE_ARCH_PATH base-arch core               
  238.             #   install_from_dir $BASE_CODE_PATH base core ;;
  239.             #%addpkg)
  240.             #    set -x
  241.             #   shift # $1-pkgname, pkgname ...
  242.             #   forced=0
  243.             #   PKGSECTION="optional"
  244.             #   while [ "$1" ]; do
  245.             #       case "$1" in
  246.             #       --forced)
  247.             #         forced=1
  248.             #         ;;
  249.             #       --category=*)
  250.             #         PKGSECTION="${1#'--category='}";
  251.             #         ;;
  252.             #       *)
  253.             #         ! [ -d $EXTRAPKG_PATH/$1 ] && shift && continue
  254.             #         echo Installing extra package "$1"  ...
  255.             #         if [ $forced -eq 1 ]; then
  256.             #           install_from_dir $EXTRAPKG_PATH/$1 $1 $PKGSECTION force
  257.             #         else
  258.             #           install_from_dir $EXTRAPKG_PATH/$1 $1 $PKGSECTION
  259.             #         fi
  260.             #         ;;
  261.             #       esac
  262.             #       shift
  263.             #   done
  264.             #   set +x
  265.             #    ;;
  266.             #%importpkg)
  267.             #  shift
  268.             #  set -x
  269.             #  import_from_dir $EXTRAPKG_PATH/$1
  270.             #  set +x
  271.             #    ;;
  272.             #%dummy)
  273.             #    set -x
  274.             #   shift # $1-pkgname, pkgname ...
  275.             #   install_dummy "$@"
  276.             #   set +x
  277.             #   ;;
  278.             #%dpkg_configure)
  279.             #   shift # $@-configure flags
  280.             #   DEBIAN_FRONTEND=noninteractive chroot $CHROOT_DIR /usr/bin/dpkg --configure "$@" ;;
  281.             #%lock)
  282.             #   shift # $1-pkgname, pkgname ...
  283.             #   lock_pkg "$@" ;;
  284.             #%cutdown)
  285.             #    set -x
  286.             #   shift # $@ various cutdown options
  287.             #   cutdown "$@" ;;
  288.             #%import)
  289.             #   shift # $@ dirs to import
  290.             #   import_dir "$@" ;;
  291.             #  
  292.             #### filesystem operations
  293.             #%symlink)
  294.             #   shift # $1 source $2 target
  295.             #   rm -f $CHROOT_DIR/$2
  296.             #   ln -s $1 $CHROOT_DIR/$2
  297.             #   ;;
  298.             #%rm)
  299.             #   shift # $@ files to remove
  300.             #   while [ "$1" ]; do
  301.             #       rm -rf $CHROOT_DIR/$1
  302.             #       shift
  303.             #   done
  304.             #   ;;
  305.             #%mkdir)
  306.             #   shift # $@ dirs to make
  307.             #   while [ "$1" ]; do
  308.             #       mkdir -p $CHROOT_DIR/$1
  309.             #       shift
  310.             #   done
  311.             #   ;;
  312.             #%touch)
  313.             #   shift # $@ files to create
  314.             #   while [ "$1" ]; do
  315.             #       > $CHROOT_DIR/$1
  316.             #       shift
  317.             #   done
  318.             #   ;;
  319.             #%chroot)
  320.             #   shift # $@ commands
  321.             #   chroot $CHROOT_DIR "$@"
  322.             #   ;;
  323.             #
  324.             # anything else - install package
  325.             *)
  326.                 #get_pkg_info $p
  327.                 #[ -z "$PKG" ] && echo Cannot find ${p}. && continue
  328.                 #download_pkg || { echo Download $p failed. && exit 1; }
  329.                 #install_pkg "$2" || { echo Installation of $p failed. && exit 1; }
  330.                 remove_builtin_pkg "$p"        
  331.                 ;;
  332.         esac       
  333.     done < "$pkglist" #< $pkglist
  334.     #exec 15>&-
  335.     #rm /tmp/deb-build/fd_14
  336.     return 0
  337. }
  338.  
  339. function remove_builtin_pkg() {
  340.     PKG="$1"
  341.     local NO_PKG=false
  342.     if [ -z "$PKG" ] ; then
  343.         return 1
  344.     fi
  345.     if [ ! -f $D/$PKG ] ; then
  346.         echo "$PKG does not exist.." >&2
  347.         #return 1 #TODO: we need alternative to "return 1" here
  348.         NO_PKG=true
  349.     else
  350.       echo "$ACTION_MESSAGE $PKG"
  351.       if grep -q '\.desktop$' ${D}/${PKG}; then
  352.         [ "$REMOVE_BUILTIN_fixmenus" = yes ] && FIXMENU='yes' #101222
  353.       fi
  354.       (
  355.         while read file
  356.         do
  357.             #rm "$CHROOT_DIR$file" 1>&2
  358.             builtin_action "$file" 1>&2
  359.             echo "${file%/*}" >&2 #get dir
  360.         done < $D/$PKG
  361.       ) > /tmp/remove_builtin_dirs$$
  362.       #-- remove empty directories
  363.       sort -ur /tmp/remove_builtin_dirs$$ | \
  364.       while read dir
  365.       do
  366.         while [ 1 ] ; do
  367.             rmdir "$dir" 2>/dev/null
  368.             dir=${dir%/*} #dirname $dir
  369.             if [ -z "$dir" ] ; then
  370.                 break
  371.             fi
  372.         done
  373.       done
  374.     #--
  375.   fi
  376.   PKGFILES="$D/$PKG"
  377.  
  378.   if [ "$CHROOT_UPDATES" = yes ] && [ "$NO_PKG" = false ]; then
  379.     if [ "`grep '/usr/share/glib-2.0/schemas' $PKGFILES`" != "" ];then
  380.      [ -e /usr/bin/glib-compile-schemas ] && glib-compile-schemas /usr/share/glib-2.0/schemas
  381.     fi
  382.    
  383.     if [ "`grep '/usr/lib/gio/modules' $PKGFILES`" != "" ];then
  384.      [ -e /usr/bin/gio-querymodules ] && gio-querymodules /usr/lib/gio/modules
  385.     fi
  386.    
  387.     if [ "`grep ''\.desktop$'' $PKGFILES`" != "" ];then
  388.      rm -f "$CHROOT_DIR/usr/share/applications/mimeinfo.cache"
  389.      [ -e /usr/bin/update-desktop-database ] && update-desktop-database /usr/share/applications
  390.     fi
  391.    
  392.     if [ "`grep '/usr/share/mime' $PKGFILES`" != "" ];then
  393.      [ -e /usr/bin/update-mime-database ] && update-mime-database /usr/share/mime
  394.     fi
  395.    
  396.     if [ "`grep '/usr/share/icons/hicolor' $PKGFILES`" != "" ];then
  397.      [ -e /usr/bin/gtk-update-icon-cache ] && gtk-update-icon-cache /usr/share/icons/hicolor
  398.     fi
  399.    
  400.     if [ "`grep '/usr/lib/gdk-pixbuf' $PKGFILES`" != "" ];then
  401.      gdk-pixbuf-query-loaders --update-cache
  402.     fi
  403.    
  404.     if [ "`grep '/usr/lib/gconv' $PKGFILES`" != "" ];then
  405.      iconvconfig
  406.     fi
  407.    
  408.     if [ "`grep '/usr/lib/pango' $PKGFILES`" != "" ];then
  409.      pango-querymodules --update-cache
  410.     fi
  411.  
  412.  
  413.     for gtkver in '1.0' '2.0' '3.0'
  414.     do
  415.      if [ "`grep "/usr/lib/gtk-$gtkver" $PKGFILES | grep "/immodules"`" != "" ];then
  416.       [ -e /usr/bin/gtk-query-immodules-$gtkver ] && gtk-query-immodules-$gtkver --update-cache
  417.      fi
  418.     done
  419.    
  420.     if [ "`grep '/usr/share/fonts' $PKGFILES`" != "" ];then
  421.      fc-cache -f
  422.     fi
  423.    
  424.     KERNVER="$(uname -r)"
  425.    
  426.     if [ "`grep "/lib/modules/$KERNVER" $PKGFILES`" != "" ];then
  427.      depmod -a
  428.     fi
  429.   fi   
  430.    
  431.   #[ -f $D/$PKG ] && rm $D/$PKG
  432.   d_action "$PKG"
  433.   [ "$NO_PKG" = false ] && rm /tmp/remove_builtin_dirs$$
  434.   sed -i "\%|${PKG}|%d" "$CHROOT_DIR/root/.packages/woof-installed-packages"
  435.   line="$(cat "$CHROOT_DIR/root/.packages/DISTRO_PKGS_SPECS" | grep "^yes|${PKG}|")"
  436.   pkgs_str=$(echo $line | cut -d'|' -f3)
  437.   pkgs=(${pkgs_str//,/" "})
  438.   for a_pkg in "${pkgs[@]}"; do
  439.     sed -i "\%|${a_pkg}|%d" "$CHROOT_DIR/root/.packages/woof-installed-packages"
  440.   done
  441.   return 0
  442. }
  443.  
  444. fix_menus() {
  445.     if [ "$FIXMENU" = "yes" ];then #101222
  446.         fixmenus
  447.         if [ "$DISPLAY" ] ; then
  448.             if [ "`pidof jwm`" != "" ] ; then
  449.                 jwm -reload || jwm -restart
  450.                 sleep 1
  451.             fi
  452.         fi
  453.     fi
  454. }
  455.  
  456. #===========================================================
  457. #                   COMMAND LINE
  458. #============================================================
  459.  
  460. case $1 in
  461.   -l|-list|--list)
  462.     ls -1 $D
  463.     exit ;;
  464.   --pkg-list)
  465.     shift
  466.     write_DISTRO_PKGS_SPECS_hdr
  467.     process_remove_builtin_list "$@"
  468.     write_DISTRO_PKGS_SPECS_footer
  469.     exit ;;    
  470. esac
  471.  
  472. if [ "$1" ] ; then
  473.     for i in $@
  474.     do
  475.         remove_builtin_pkg $i
  476.     done
  477.     [ "$REMOVE_BUILTIN_fixmenus" = yes ] && fix_menus
  478.     exit $?
  479. fi
  480.  
  481. #===========================================================
  482. #                    GUI
  483. #============================================================
  484.  
  485.  
  486. if [ REMOVE_BUILTIN_use_gui = yes ]; then
  487.     PKGS=`ls -1 $D`
  488.     DIALOG="dialog --aspect 10"
  489.     MENUOPT="--checklist"
  490.     REP=/tmp/$(basename $0).txt
  491.    
  492.     if [ "$DISPLAY" ] ; then
  493.         DIALOG=Xdialog
  494.     fi
  495.    
  496.     for i in $PKGS ; do
  497.         CHOICES="$CHOICES $i . off"
  498.     done
  499.    
  500.     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
  501.     all of the Puppy files are in a compressed read-only file named 'puppy.sfs'\n
  502.     or 'wary_500.sfs' (or some similar name). So you can't actually delete these\n
  503.     files. However, if you want to remaster the live-CD to create your own custom\n
  504.     Puppy (see Setup menu), you can use this little program to 'pretend' to delete\n
  505.     them -- and they will really be gone in the remastered CD. So, for example if\n
  506.     you remove SeaMonkey, it will be gone in the remastered CD thus reducing the\n
  507.     size of the .iso live-CD file.\n\n
  508.     Technical note: the lists of builtin files is at /root/.packages/builtin_files,\n
  509.     the list of builtin pkgs is in /root/.packages/woof-installed-packages.")" \
  510.     $MENUOPT "$(gettext 'Select packages to remove (be careful):')" 0 0 0 $CHOICES`
  511.     if [ ! "$PKG" ];then
  512.         exit
  513.     fi
  514.    
  515.     PKG=$(echo "$PKG" | sed 's%/% %g')
  516.     /usr/lib/gtkdialog/box_yesno --warning "Remove builtin pkg(s)" \
  517.         "Please confirm that you want to delete the following pkg(s):" "" \
  518.         "<b>$PKG</b>" "" "This can be a dangerous operation if you don't know what you're doing. However some more confirmation dialogs may appear..."
  519.     if [ $? -ne 0 ] ; then
  520.         exit
  521.     fi
  522.    
  523.     #--
  524.     REMOVED_PKGS=''
  525.     #--
  526.    
  527.     for i in $PKG
  528.     do
  529.         DEP_OF=`grep "+${i}" "$CHROOT_DIR/root/.packages/woof-installed-packages" |cut -d "|" -f 2 |tr "\n" " "`
  530.         if [ "$DEP_OF" ] ; then
  531.             DESCR="`grep "|${i}|" "$CHROOT_DIR/root/.packages/woof-installed-packages" |cut -d "|" -f 10`"
  532.             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
  533.     ${DESCR}\n
  534.     $(gettext 'For information only, these are dependencies of') '${i}':\n
  535.     `grep "|${i}|" "$CHROOT_DIR/root/.packages/woof-installed-packages" |cut -d "|" -f 9 | sed -e 's%^+%%' -e 's%,+% %g'`
  536.     \n
  537.     `eval_gettext \"Warning, removing '\\\${i}' _may_ break the following packages:\"`
  538.     $DEP_OF
  539.     \n
  540.     $(gettext 'Continue?')" 0 0
  541.             if ! [ $? -eq 0 ];then
  542.                 continue
  543.             fi
  544.         fi
  545.         remove_builtin_pkg $i || continue
  546.         REMOVED_PKGS="$REMOVED_PKGS $i"
  547.     done
  548. fi
  549.  
  550. [ "$REMOVE_BUILTIN_fixmenus" = yes ] && fix_menus
  551.  
  552. if [ "$REMOVE_BUILTIN_use_gui" = yes ]; then
  553.     if [ "${REMOVED_PKGS}" ] ; then
  554.         /usr/lib/gtkdialog/box_ok "Remove builtin pkg(s)" info  \
  555.             "The following packages were removed:" "" "<b>${REMOVED_PKGS}</b>"
  556.     fi
  557. fi
  558. ### END ###
  559.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement