#!/bin/bash
INSTALL_MODE='Step by step installation (classic mode)'
EXPORT_FNs=false #Setting this to true might provide a way of overriding the functions in the ppm gui.
USE_installmodes_sh=false
SKIP_installmodes_sh=false
rm /tmp/petget_proc/pkgs_to_install_s243a
rm /tmp/petget_proc/pkgs_to_install
#touch /root/.packages/skip_space_check
echo changed > /tmp/petget_proc/mode_changed
touch /tmp/petget_proc/force_install
touch /root/.packages/skip_space_check
touch /tmp/petget_proc/manual_pkg_download
rm /tmp/petget_proc/pkgs_to_install
if [ ! -f /tmp/petget_proc/install_pets_quietly -a ! -f /tmp/petget_proc/download_only_pet_quietly \
-a ! -f /tmp/petget_proc/download_pets_quietly ]; then
echo ok
elif [ "$PREVPKG" != "" ]; then
echo changed >> /tmp/petget_proc/mode_changed
fi
rm -f /tmp/petget_proc/*_pet{,s}_quietly
echo "" > /tmp/petget_proc/forced_install
touch /tmp/petget_proc/install_classic
echo 'wizard' > /var/local/petget/ppm_mode
#install_package () is taken from: https://github.com/puppylinux-woof-CE/woof-CE/blob/60d94862a3343bf0a062a0fcd0dd73475d6985ba/woof-code/rootfs-skeleton/usr/local/petget/installmodes.sh#L406
install_package () {
#set -x
[ "$(cat /tmp/petget_proc/pkgs_to_install)" = "" ] && exit 0
cat /tmp/petget_proc/pkgs_to_install | tr ' ' '\n' > /tmp/petget_proc/pkgs_left_to_install
rm -f /tmp/petget_proc/overall_package_status_log
echo 0 > /tmp/petget_proc/petget/install_status_percent
echo "$(gettext "Calculating total required space...")" > /tmp/petget_proc/petget/install_status
[ ! -f /root/.packages/skip_space_check ] && check_total_size
#status_bar_func & #-----------
while IFS="|" read TREE1 REPO zz #TREE1|REPO
do
[ -z "$TREE1" ] && continue
echo "$REPO" > /tmp/petget_proc/petget/current-repo-triad
if [ -f /tmp/petget_proc/install_quietly ];then
if [ "$(grep $TREE1 /root/.packages/user-installed-packages 2>/dev/null)" = "" \
-a -f /tmp/petget_proc/install_pets_quietly ]; then
if [ "$(cat /var/local/petget/nt_category 2>/dev/null)" = "true" ]; then
/usr/local/petget/installpreview.sh
else
rxvt -title "$VTTITLE... $(gettext 'Do NOT close')" \
-fn -misc-fixed-medium-r-semicondensed--13-120-75-75-c-60-*-* -bg black \
-fg grey -geometry 80x5+50+50 -e /usr/local/petget/installpreview.sh
fi
else
if [ "$(cat /var/local/petget/nt_category 2>/dev/null)" = "true" ]; then
/usr/local/petget/installpreview.sh
else
rxvt -title "$VTTITLE... $(gettext 'Do NOT close')" \
-fn -misc-fixed-medium-r-semicondensed--13-120-75-75-c-60-*-* -bg black \
-fg grey -geometry 80x5+50+50 -e /usr/local/petget/installpreview.sh
fi
fi
else
/usr/local/petget/installpreview.sh
if [ $? -eq 100 ] ; then
exit
fi
fi
/usr/local/petget/finduserinstalledpkgs.sh #s243a: is this necessary?
sed -i "/$TREE1/d" /tmp/petget_proc/pkgs_left_to_install
done < /tmp/petget_proc/pkgs_to_install
sync
report_results
clean_up
}
[ "$EXPORT_FNs" = true ] && export -f install_package
do_install() {
# Exit if called spuriously
[ "$TREE1" = "" ] && exit 0
export ENTRY=$TREE1
pkg_info
#pkg_info="$(cat /tmp/petget_proc/pkgs_to_install | cut -d '|' -f1,4)"
#pkgs_to_install set in the pkg_info function
echo "pkgs_to_install=$(cat /tmp/petget_proc/pkgs_to_install)"
mv /tmp/petget_proc/pkgs_to_install /tmp/petget_proc/pkgs_to_install_1_5_10_11
cat /tmp/petget_proc/pkgs_to_install_1_5_10_11 | cut -d '|' -f1,4 > /tmp/petget_proc/pkgs_to_install
echo "pkgs_to_install=$(cat /tmp/petget_proc/pkgs_to_install)"
#-- Make sure that we have atleast one mode flag
if [ ! -f /tmp/petget_proc/install_pets_quietly \
-a ! -f /tmp/petget_proc/download_only_pet_quietly \
-a ! -f /tmp/petget_proc/download_pets_quietly \
-a ! -f /tmp/petget_proc/install_classic ] ; then
touch /tmp/petget_proc/install_classic #/tmp/petget_proc/install_pets_quietly
fi
#if [ "$(grep $TREE1 /root/.packages/user-installed-packages)" != "" ] ; then
# . /usr/lib/gtkdialog/box_yesno "$(gettext 'Package is already installed')" "$(gettext 'This package is already installed! ')" "$(gettext 'If you want to re-install it, first remove it and then install it again. To download only or use the step-by-step classic mode, select No and then change the Auto Install to another option.')" "$(gettext 'To Abort the process now select Yes.')"
# if [ "$EXIT" = "yes" ]; then
# exit 0
# else
# echo $TREE1 > /tmp/petget_proc/forced_install
# fi
#fi
#--
if [ "$(cat /tmp/petget_proc/forced_install 2>/dev/null)" != "" ]; then
touch /tmp/petget_proc/force_install
else
rm -f /tmp/petget_proc/force_install
fi
#cut -d"|" -f1,4 /tmp/petget_proc/pkgs_to_install > /tmp/petget_proc/pkgs_to_install_tmp
#mv -f /tmp/petget_proc/pkgs_to_install_tmp /tmp/petget_proc/pkgs_to_install
#if ! [ -f /tmp/petget_proc/force_install -a -f /tmp/petget_proc/install_pets_quietly ]; then
#/usr/local/petget/installed_size_preview.sh "$NEWPACKAGE" ADD
if [ "$USE_installmodes_sh" != false ]; then
/usr/local/petget/installmodes.sh "$INSTALL_MODE"
elif [ "$SKIP_installmodes_sh" != false ]; then
install_package #This was taken from installmodes.sh
else
cat /tmp/petget_proc/pkgs_to_install | tr ' ' '\n' > /tmp/petget_proc/pkgs_left_to_install
mv /tmp/petget_proc/pkgs_to_install /tmp/petget_proc/pkgs_to_install_1_5
cat /tmp/petget_proc/pkgs_to_install_1_5 | cut -d '|' -f1 > /tmp/petget_proc/pkgs_to_install
echo "pkgs_to_install=$(cat /tmp/petget_proc/pkgs_to_install)"
set +x
export TREE1=${TREE1%%|*}
/usr/local/petget/installpreview.sh
fi
}
echo_pkg_info_fields_helper(){
[ $# -gt 0 ] && TREE1=$1
[ $# -gt 1 ] && TREE1="$TREE1|$2"
local repo_triad
local result
if [ -f /tmp/petget_proc/petget/filterpkgs.results.post ]; then
result="$(grep ^$TREE1 /tmp/petget_proc/petget/filterpkgs.results.post)"
fi
if [ -z $result ]; then
pkg=$(echo $TREE1 | cut -f1 -d '|' )
#repo_triad=$(echo $TREE1 | cut -f2 -d)
n_fields=$(echo "$TREE1" | awk -F "|" '{print NF}' | head -n 1)
if [ $n_fields -gt 1 ]; then
repo_triad=$(echo "$TREE1" | awk -F "|" '{print $NF}' | head -n 1)
elif [ -f /tmp/petget_proc/petget ]; then
repo_triad=$(cat /tmp/petget_proc/petget | head -n 1)
fi
result="$(grep -m1 ^$pkg /var/packages/Packages-$repo_triad | cut -f1,5,10,11)"
fi
echo "$result"
}
echo_pkg_info_fields(){
echo_pkg_info_fields_helper
#TODO maybe look at all repos specified by the ppm or fallback repos.
}
#Taken from: https://github.com/puppylinux-woof-CE/woof-CE/blob/60d94862a3343bf0a062a0fcd0dd73475d6985ba/woof-code/rootfs-skeleton/usr/local/petget/pkg_chooser.sh#L120
# but modified to not depend on filterpkgs.results.post
pkg_info() {
# Exit if called spuriously
[ "$TREE1" = "" ] && exit 0
#NEWPACKAGE="$(grep ^$TREE1 /tmp/petget_proc/petget/filterpkgs.results.post)"
pkg=$(echo $TREE1 | cut -f1 -d '|' )
export ENTRY1=$pkg #used in findnames.sh
/usr/local/petget/findnames.sh #We can remove this if we generage filterpkgs.results.post another way. See: postfilterpkgs.sh and installpreview.sh
# rm -f /tmp/petget_proc/overall_*
#/usr/local/petget/installed_size_preview.sh "$TREE1" ADD
#installpreview.sh
repo_triad=$(echo $TREE1 | cut -f2 -d '|' )
echo "$repo_triad" > /tmp/petget_proc/petget/current-repo-triad
IFS="|" read PKG_NAME PKG_CAT PKG_DESC PKG_REPO < <(echo_pkg_info_fields )
(
echo "Name : $PKG_NAME"
echo "Category: $PKG_CAT"
echo "Desc : $PKG_DESC"
echo "Repo : $repo_triad" #$PKG_REPO
) > /tmp/petget_proc/petget/pgk_info
echo "$PKG_NAME|$PKG_CAT|$PKG_DESC|$repo_triad" >> /tmp/petget_proc/pkgs_to_install
}
#Taken from: https://github.com/puppylinux-woof-CE/woof-CE/blob/60d94862a3343bf0a062a0fcd0dd73475d6985ba/woof-code/rootfs-skeleton/usr/local/petget/installmodes.sh#L12
clean_up () {
if [ "$(ls /tmp/petget_proc/*_pet{,s}_quietly /tmp/petget_proc/install_classic 2>/dev/null |wc -l)" -eq 1 ]; then
for MODE in $(ls /tmp/petget_proc/*_pet{,s}_quietly /tmp/petget_proc/install_classic)
do
mv $MODE $MODE.bak
done
fi
mv /tmp/petget_proc/install_quietly /tmp/petget_proc/install_quietly.bak
echo -n > /tmp/petget_proc/pkgs_to_install
rm -f /tmp/petget_proc/{install,remove}{,_pets}_quietly 2>/dev/null
rm -f /tmp/petget_proc/install_classic 2>/dev/null
rm -f /tmp/petget_proc/download_pets_quietly 2>/dev/null
rm -f /tmp/petget_proc/download_only_pet_quietly 2>/dev/null
rm -f /tmp/petget_proc/pkgs_left_to_install 2>/dev/null
rm -f /tmp/petget_proc/pkgs_to_install_done 2>/dev/null
rm -f /tmp/petget_proc/overall_pkg_size* 2>/dev/null
rm -f /tmp/petget_proc/overall_dependencies 2>/dev/null
rm -f /tmp/petget_proc/mode_changed 2>/dev/null
rm -f /tmp/petget_proc/force*_install 2>/dev/null
rm -f /tmp/petget_proc/pkgs_to_install_done 2>/dev/null
rm -f /tmp/petget_proc/pgks_really_installed 2>/dev/null
rm -f /tmp/petget_proc/pgks_failed_to_install 2>/dev/null
rm -f /tmp/petget_proc/overall_petget_missingpkgs_patterns.txt 2>/dev/null
rm -f /tmp/petget_proc/overall_missing_libs.txt 2>/dev/null
rm -f /tmp/petget_proc/overall_install_report 2>/dev/null
rm -f /tmp/petget_proc/pkgs_to_install_bar 2>/dev/null
rm -f /tmp/petget_proc/manual_pkg_download 2>/dev/null
rm -f /tmp/petget_proc/ppm_reporting 2>/dev/null
rm -f /tmp/petget_proc/pkgs_DL_BAD_LIST 2>/dev/null
rm -rf /tmp/petget_proc/PPM_LOGs/ 2>/dev/null
mv $MODE.bak $MODE
mv /tmp/petget_proc/install_quietly.bak /tmp/petget_proc/install_quietly
}
[ "$EXPORT_FNs" = true ] && export -f clean_up
report_results () {
# Info source files
touch /tmp/petget_proc/ppm_reporting # progress bar flag
/usr/local/petget/finduserinstalledpkgs.sh #make sure...
sync
rm -f /tmp/petget_proc/pgks_really_installed 2>/dev/null
rm -f /tmp/petget_proc/pgks_failed_to_install 2>/dev/null
for LINE in $(cat /tmp/petget_proc/pkgs_to_install_done | cut -f 1 -d '|' | sort | uniq)
do
[ "$(echo $LINE)" = "" ] && continue
if [ -f /tmp/petget_proc/download_pets_quietly -o -f /tmp/petget_proc/download_only_pet_quietly \
-o -f /tmp/petget_proc/manual_pkg_download ];then
if [ -f /root/.packages/download_path ];then
. /root/.packages/download_path
DOWN_PATH="$DL_PATH"
else
DOWN_PATH=$HOME
fi
PREVINST=''
REALLY=$(ls "$DOWN_PATH" | grep $LINE)
[ "$REALLY" -a "$(grep $LINE /tmp/petget_proc/pkgs_DL_BAD_LIST 2>/dev/null | sort | uniq )" != "" ] && \
REALLY='' && PREVINST="$(gettext 'was previously downloaded')"
else
PREVINST=''
REALLY=$(grep $LINE /tmp/petget_proc/petget/installedpkgs.results)
[ "$(grep $LINE /tmp/petget_proc/pgks_failed_to_install_forced 2>/dev/null | sort | uniq )" != "" -o \
"$(grep $LINE /tmp/petget_proc/pkgs_DL_BAD_LIST 2>/dev/null | sort | uniq )" != "" ] \
&& REALLY='' && PREVINST="$(gettext 'was already installed')"
fi
if [ "$REALLY" != "" ]; then
echo $LINE >> /tmp/petget_proc/pgks_really_installed
else
echo $LINE $PREVINST >> /tmp/petget_proc/pgks_failed_to_install
fi
done
rm -f /tmp/petget_proc/pgks_failed_to_install_forced
[ -f /tmp/petget_proc/pgks_really_installed ] && INSTALLED_PGKS="$(/dev/null | tr ' ' '\n' | sort | uniq )
NOT_IN_PATH_LIBS=$(cat /tmp/petget_proc/overall_missing_libs_hidden.txt 2>/dev/null | tr ' ' '\n' | sort | uniq )
cat << EOF > /tmp/petget_proc/overall_install_report
Packages succesfully Installed or Downloaded
$INSTALLED_PGKS
Packages that failed to be Installed or Downloaded, or were aborted be the user
$FAILED_TO_INSTALL
Missing Shared Libraries
$MISSING_LIBS
Existing Libraries that may be in a location other than /lib and /usr/lib
$NOT_IN_PATH_LIBS
EOF
# Info window/dialogue (display and option to save "missing" info)
if [ "$MISSING_LIBS" ];then
MISSINGMSG1="$(gettext 'These libraries are missing:')
${MISSING_LIBS}"
LM='
'"`/usr/lib/gtkdialog/xml_pixmap building_block.svg 32`"'
'
fi
if [ "$NOT_IN_PATH_LIBS" ];then #100830
MISSINGMSG1="${MISSINGMSG1}
$(gettext 'These needed libraries exist but are not in the library search path (it is assumed that a startup script in the package makes these libraries loadable by the application):')
${NOT_IN_PATH_LIBS}"
fi
if [ -s /tmp/petget_proc/petget-installed-pkgs-log ];then
BUTTON_TRIM=""
fi
export REPORT_DIALOG='
'"`/usr/lib/gtkdialog/xml_info fixed package_add.svg 60 " " "$(gettext "Package install/download report")"`"'
'"`/usr/lib/gtkdialog/xml_pixmap dialog-complete.svg 32`"'
'"`/usr/lib/gtkdialog/xml_pixmap dialog-error.svg 32`"'
'${LM}'
'${BUTTON_TRIM}'
'"`/usr/lib/gtkdialog/xml_scalegrip`"'
'
RETPARAMS="`gtkdialog --center -p REPORT_DIALOG`"
eval "$RETPARAMS"
echo 100 > /tmp/petget_proc/petget/install_status_percent
#trim the fat...
if [ "$EXIT" = "BUTTON_TRIM_FAT" ];then
INSTALLEDPKGNAMES="`cat /tmp/petget_proc/petget-installed-pkgs-log | cut -f 2 -d ' ' | tr '\n' ' '`"
#101013 improvement suggested by L18L...
CURRLOCALES="`locale -a | grep _ | cut -d '_' -f 1`"
LISTLOCALES="`echo -e -n "en\n${CURRLOCALES}" | sort -u | tr -s '\n' | tr '\n' ',' | sed -e 's%,$%%'`"
export PPM_TRIM_DIALOG="
/usr/share/pixmaps/puppy/dialog-question.svg
${LISTLOCALES}ENTRY_LOCALE
trueCHECK_DOCDEL
trueCHECK_DEVDEL
"
RETPARAMS="`gtkdialog -p PPM_TRIM_DIALOG`"
eval "$RETPARAMS"
[ "$EXIT" != "OK" ] && exit $EXITVAL
if [ ! -f /tmp/petget_proc/install_quietly ]; then
/usr/lib/gtkdialog/box_splash -text "$(gettext 'Please wait, trimming fat from packages...')" &
X4PID=$!
fi
elPATTERN="`echo -n "$ENTRY_LOCALE" | tr ',' '\n' | sed -e 's%^%/%' -e 's%$%/%' | tr '\n' '|'`"
for PKGNAME in $INSTALLEDPKGNAMES
do
(
cat /root/.packages/${PKGNAME}.files |
while read ONEFILE
do
[ ! -f "$ONEFILE" ] && echo "$ONEFILE" && continue
[ -h "$ONEFILE" ] && echo "$ONEFILE" && continue
#find out if this is an international language file...
if [ "$ENTRY_LOCALE" != "" ];then
if [ "`echo -n "$ONEFILE" | grep --extended-regexp '/locale/|/nls/|/i18n/' | grep -v -E "$elPATTERN"`" != "" ];then
rm -f "$ONEFILE"
continue
fi
fi
#find out if this is a documentation file...
if [ "$CHECK_DOCDEL" = "true" ];then
if [ "`echo -n "$ONEFILE" | grep --extended-regexp '/man/|/doc/|/doc-base/|/docs/|/info/|/gtk-doc/|/faq/|/manual/|/examples/|/help/|/htdocs/'`" != "" ];then
rm -f "$ONEFILE" 2>/dev/null
continue
fi
fi
#find out if this is development file...
if [ "$CHECK_DEVDEL" = "true" ];then
if [ "`echo -n "$ONEFILE" | grep --extended-regexp '/include/|/pkgconfig/|/aclocal|/cvs/|/svn/'`" != "" ];then
rm -f "$ONEFILE" 2>/dev/null
continue
fi
#all .a and .la files... and any stray .m4 files...
if [ "`echo -n "$ONEBASE" | grep --extended-regexp '\.a$|\.la$|\.m4$'`" != "" ];then
rm -f "$ONEFILE"
continue
fi
fi
echo "$ONEFILE"
done
) > /tmp/petget_proc/petget_pkgfiles_temp
mv -f /tmp/petget_proc/petget_pkgfiles_temp /root/.packages/${PKGNAME}.files
done
[ "$X4PID" ] && kill $X4PID
fi
}
[ "$EXPORT_FNs" = true ] && export -f report_results
while read a_lib; do
while read packages_db; do
REPO_TRIAD=$(basename $packages_db)
REPO_TRIAD=${REPO_TRIAD#Packages-} #todo MAYBE MAKE THIS MORE ROBUST
for mode in 1 2; do
case "$mode" in
1)
provides_db="$(echo "$packages_db" | sed 's/^Packages-/^Provides-/')"
a_lib="$(echo "$a_lib" | sed -r 's/^(.*)([.]so)(.*)$/\1\2/')"
matches="$(grep -F $a_lib $provides_db)"
;;
2)
pre_guess=$a_lib
while [ 1 -eq 1 ]; do
guess="$(echo "$pre_guess" | sed 's/[.]so[.]/-/')"
guess="$(echo "$pre_guess" | sed 's/[.]so//')"
matches="$(grep -F $guess $packages_db)"
[ ! -z $matches ] && break 3
last_pre_guess="$pre_guess"
pre_guess="$(echo "$pre_guess" | sed -r 's/(.*)(.so)(.*)[.][^.]*/\1\2\3/')"
[ "$pre_guess" = "$last_pre_guess" ] && break
done
;;
esac
if [ ! -z "$matches" ]; then
#pkgs_to_install_s243a is two fields like at: https://github.com/puppylinux-woof-CE/woof-CE/blob/60d94862a3343bf0a062a0fcd0dd73475d6985ba/woof-code/rootfs-skeleton/usr/local/petget/pkg_chooser.sh#L159
echo "$matches" | cut -d '|' -f1 | \
sed -n -E '/^[[:space:]]*$/! {s%(.*)%\1|'$REPO_TRIAD'%;p}' >> /tmp/petget_proc/pkgs_to_install_s243a
break
fi
done
done < <(find /var/packages -name 'Packages-*')
done < <(cat /tmp/petget_proc/missinglibs.txt | tr [[:space:]] "\n" )
while IFS= read line|| [ -n "$line" ];
do
export TREE1=$line
#echo $TREE1 > /tmp/petget_proc/forced_install
do_install #Expects four fields
done < /tmp/petget_proc/pkgs_to_install_s243a
#export -f do_instal #pkg_info do_install change_mode