Advertisement
s243a

/usr/local/petget/installpkg.sh

Feb 20th, 2020
776
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Bash 32.18 KB | None | 0 0
  1. #!/bin/sh
  2. #(c) Copyright Barry Kauler 2009, puppylinux.com
  3. #2009 Lesser GPL licence v2 (http://www.fsf.org/licensing/licenses/lgpl.html).
  4. #called from /usr/local/petget/downloadpkgs.sh and petget.
  5. #passed param is the path and name of the downloaded package.
  6. #/tmp/petget_proc/petget_missing_dbentries-Packages-* has database entries for the set of pkgs being downloaded.
  7. #w456 warning: petget may write to /tmp/petget_proc/petget_missing_dbentries-Packages-alien with missing fields.
  8. #w478, w482 fix for pkg menu categories.
  9. #w482 detect zero-byte pet.specs, fix typo.
  10. #100110 add support for T2 .tar.bz2 binary packages.
  11. #100426 aufs can now write direct to save layer.
  12. #100616 add support for .txz slackware pkgs.
  13. # 20aug10 shinobar: excute pinstall.sh under original LANG environment
  14. #  6sep10 shinobar: warning to install on /mnt/home # 16sep10 remove test code
  15. # 17sep10 shinobar; fix typo was double '|' at reading DESCRIPTION
  16. # 22sep10 shinobar clean up probable old files for precaution
  17. # 22sep10 shinobar: bugfix was not working clean out whiteout files
  18. #110503 change ownership of some files if non-root.
  19. #110523 support for rpm pkgs.
  20. #110705 fix rpm install.
  21. #110817 rcrsn51: fix find syntax, looking for icons. 110821 improve.
  22. #111013 shinobar: aufs direct-write to layer not working, bypass for now.
  23. #111013 revert above. it works for me, except if file already on top -- that is another problem, needs to be addressed.
  24. #111207 improve search for menu icon.
  25. #111229 /usr/local/petget/removepreview.sh when uninstalling a pkg, may have copied a file from sfs-layer to top, check.
  26. #120107 rerwin: need quotes around some paths in case of space chars. remove '--unlink-first' from tar (was introduced 120102, don't think necessary).
  27. #120126 noryb009: fix typo.
  28. #120219 was not properly internationalized (there was no TEXTDOMAIN).
  29. #120523 may need to run gio-query-modules and/or glib-compile-schemas. (refer also rc.update and 3builddistro)
  30. #120628 fix Categories= assignment in .desktop files. see also 2createpackages in woof.
  31. #120818 Categories management improved. pkg db now has category[;subcategory] (see 0setup), xdg enhanced (see /etc/xdg and /usr/share/desktop-directories), and generic icons for all subcategories (see /usr/local/lib/X11/mini-icons).
  32. #120901 .desktop files, get rid of param on end of Exec, ex: Exec=gimp-2.8 %U
  33. #120907 post-install hacks.
  34. #120926 apply translation for .desktop file if langpack installed.
  35. #121015 01micko: alternative code to delete %-param off end of Exec line in .desktop file.
  36. #121109 fixing Categories field in .desktop may fail, as DB_category field may not match that in .desktop file, so leave out that $tPATTERN match in $PUPHIERARCHY.
  37. #121109 menu category was not reported correctly in post-install window.
  38. #121119 change in layout of /etc/xdg/menus/hierarchy caused regex pattern bug.
  39. #121119 if only one .desktop file, first check if a match in /usr/local/petget/categories.dat.
  40. #121120 bugfix of 121119.
  41. #121206 default icon needs .xpm extension. note puppy uses older xdg-utilities, Icon field needs image ext.
  42. #130112 some deb's have a post-install script (ex: some python debs).
  43. #130126 'categories.dat' format changed.
  44. #130219 grep, ignore case.
  45. #130305 rerwin: ensure tmp directory has all permissions after package expansion.
  46. #130314 install arch linux pkgs. run arch linux pkg post-install script.
  47. #131122 support xz compressed pets (see dir2pet, pet2tgz), changed file test
  48.  
  49. [ "$(cat /var/local/petget/nt_category 2>/dev/null)" != "true" ] && \
  50.  [ -f /tmp/petget_proc/install_quietly ] && set -x
  51.  #; mkdir -p /tmp/petget_proc/PPM_LOGs ; NAME=$(basename "$0"); exec 1>> /tmp/petget_proc/PPM_LOGs/"$NAME".log 2>&1
  52. #set -x
  53. export TEXTDOMAIN=petget___installpkg.sh
  54. export OUTPUT_CHARSET=UTF-8
  55.  
  56. APPDIR=$(dirname $0)
  57. [ -f "$APPDIR/i18n_head" ] && source "$APPDIR/i18n_head"
  58. LANG_USER=$LANG
  59. export LANG=C
  60. . /etc/rc.d/PUPSTATE  #this has PUPMODE and SAVE_LAYER.
  61. . /etc/DISTRO_SPECS #has DISTRO_BINARY_COMPAT, DISTRO_COMPAT_VERSION
  62.  
  63. . /etc/xdg/menus/hierarchy #w478 has PUPHIERARCHY variable.
  64.  
  65. [ "$PUPMODE" = "2" ] && [ ! -d /audit ] && mkdir -p /audit
  66.  
  67. DLPKG="$1"
  68. DLPKG_BASE="`basename "$DLPKG"`" #ex: scite-1.77-i686-2as.tgz
  69. DLPKG_PATH="`dirname "$DLPKG"`"  #ex: /root
  70. DL_SAVE_FLAG=$(cat /var/local/petget/nd_category 2>/dev/null)
  71.  
  72. clean_and_die () {
  73.   rm -f /root/.packages/${DLPKG_NAME}.files
  74.   exit 1
  75. }
  76.  
  77. # 6sep10 shinobar: installing files under /mnt is danger
  78. install_path_check() {
  79.   FILELIST="/root/.packages/${DLPKG_NAME}.files"
  80.   [ -s "$FILELIST" ] || return 0 #120126 noryb009: typo
  81.   grep -qE '^\/mnt|^\/media' "$FILELIST" || return 0
  82.   MNTDIRS=$(cat "$FILELIST" | grep -E '^\/mnt\/.*\/$|^\/media\/.*\/$' | cut -d '/' -f 1-3  | tail -n 1)
  83.   LANG=$LANG_USER
  84.   MSG1=$(gettext "This package will install files under")
  85.   MSG2=$(gettext "It can be dangerous to install files under '/mnt' or '/media' because it depends on the profile of installation.")
  86.   MSG3=""
  87.   if grep -q '^/mnt/home' "$FILELIST"; then
  88.     if [ $PUPMODE -eq 5 ]; then
  89.       MSG3=$(gettext "You are running Puppy without 'pupsave', and '/mnt/home' does not exist. In this case, you can use the RAM for this space, but strongly recommended to shutdown now to create 'pupsave' BEFORE installing these packages.")
  90.       MSG3="$MSG3\\n$(gettext "NOTE: You can install this package for a tentative use, then do NOT make 'pupsave' with this package installed.")"
  91.     fi
  92.     DIRECTSAVEPATH=""
  93.   fi
  94.   # dialog
  95.   export DIALOG="<window title=\"$T_title\" icon-name=\"gtk-dialog-warning\">
  96.  <vbox>
  97.  <text use-markup=\"true\"><label>\"$MSG1: <b>$MNTDIRS</b>\"</label></text>
  98.  <text><input>echo -en \"$MSG2 $MSG3\"</input></text>
  99.  <text><label>$(gettext "Click 'Cancel' not to install(recommended). Or click 'Install' if you like to proceed.")</label></text>
  100.   <hbox>
  101.   <button cancel></button>
  102.   <button><input file stock=\"gtk-apply\"></input><label>$(gettext 'Install')</label><action type=\"exit\">INSTALL</action></button>
  103.   </hbox>
  104.   </vbox>
  105.   </window>"
  106.  RETPARAMS=`gtkdialog -p DIALOG` || echo "$DIALOG" >&2
  107.  eval "$RETPARAMS"
  108.  LANG=C
  109.  [ "$EXIT" = "INSTALL" ]  && return 0
  110.  rm -f "$FILELIST"
  111.  exit 1
  112. }
  113.  
  114. # 22sep10 shinobar clean up probable old files for precaution
  115. rm -f /pet.specs /pinstall.sh /puninstall.sh /install/doinst.sh
  116.  
  117. #get the pkg name ex: scite-1.77 ...
  118. dbPATTERN='|'"$DLPKG_BASE"'|'
  119. DLPKG_NAME="`cat /tmp/petget_proc/petget_missing_dbentries-Packages-* | grep "$dbPATTERN" | head -n 1 | cut -f 1 -d '|'`"
  120.  
  121. #131222 do not allow duplicate installs...
  122. PTN1='^'"$DLPKG_NAME"'|'
  123. if [ "`grep "$PTN1" /root/.packages/user-installed-packages`" != "" ];then
  124. if [ ! $DISPLAY ];then
  125.  [ -f /tmp/petget_proc/install_quietly ] && DISPTIME1="--timeout 3" || DISPTIME1=''
  126.  LANG=$LANG_USER
  127.  dialog ${DISPTIME1} --msgbox "$(gettext 'This package is already installed. Cannot install it twice:') ${DLPKG_NAME}" 0 0
  128. else
  129.  LANG=$LANG_USER
  130.  /usr/lib/gtkdialog/box_ok "$(gettext 'Puppy package manager')" error "$(gettext 'This package is already installed. Cannot install it twice:')" "<i>${DLPKG_NAME}</i>" &
  131.  XPID=$!
  132.  sleep 3
  133.  pkill -P $XPID
  134.  echo ${DLPKG_NAME} >> /tmp/petget_proc/pgks_failed_to_install_forced
  135. fi
  136. exit 1
  137. fi
  138.  
  139. DIRECTSAVEPATH=""
  140. read -r TFS TMAX TUSED TMPK TPERCENT TMNTPT <<<$(df -k | grep -w '^tmpfs') #free space in /tmp
  141. SIZEB=`stat -c %s "${DLPKG_PATH}"/${DLPKG_BASE}`
  142. SIZEK=$(( $SIZEB / 1024 ))
  143. EXPK=$(( $SIZEK * 5)) #estimated worst-case expanded size.
  144. if [ "$PUPMODE" = "2" ]; then # from BK's quirky6.1
  145.     #131220  131229 detect if not enough room in /tmp...
  146.     DIRECTSAVEPATH="/tmp/petget_proc/petget/directsavepath"
  147.     NEEDK=$EXPK
  148.     if [ $EXPK -ge $TMPK ];then
  149.       DIRECTSAVEPATH="/audit/directsavepath"
  150.       NEEDK=$(( $NEEDK * 2 ))
  151.     fi
  152.     if [ "$DIRECTSAVEPATH" ];then
  153.      rm -rf $DIRECTSAVEPATH
  154.      mkdir -p $DIRECTSAVEPATH
  155.     fi
  156.     # check enough space to install pkg...
  157.     #as the pkg gets expanded to an intermediate dir, maybe in main f.s...
  158.     PARTK=`df -k / | grep '/$' | tr -s ' ' | cut -f 4 -d ' '` #free space in partition.
  159.     if [ $NEEDK -gt $PARTK ];then
  160.      LANG=$LANG_USER
  161.      if [ "$DISPLAY" ];then
  162.       /usr/lib/gtkdialog/box_ok "$(gettext 'Puppy package manager')" error "$(gettext 'Not enough free space in the partition to install this package'):" "<i>${DLPKG_BASE}</i>"
  163.      else
  164.       echo -e "$(gettext 'Not enough free space in the partition to install this package'):\n${DLPKG_BASE}"
  165.      fi
  166.      [ "$DLPKG_PATH" != "" ] && rm -f "${DLPKG_PATH}"/${DLPKG_BASE}
  167.      exit 1
  168.     fi
  169.  
  170. #boot from flash: bypass tmpfs top layer, install direct to pup_save file... #170623 reverse this!
  171. elif [ $PUPMODE -eq 13 ];then
  172.     # SFR: let user chose...
  173.     if [ -f /var/local/petget/install_mode ] ; then
  174.      IM="`cat /var/local/petget/install_mode`"
  175.      [ "$IM" = "false" ] && IMODE="tmpfs" || IMODE="savefile"
  176.     else
  177.      IMODE="tmpfs"
  178.      if [ -n "$TMPK" ];then
  179.       if [ $TMPK -lt $EXPK ] ;then # EXPK is 5x package size
  180.        YMSG1=$(gettext "There is not enough temporary space to install the package: ")
  181.        YMSG2=$(gettext "Recommendation: Press 'No' to abort the installation and create some swap space. ('swap file' or 'swap partition'). You can press 'Yes' but corruption could occur in the installation.")
  182.        if [ "$DISPLAY" ];then
  183.         YTTLE=$(gettext "Puppy Package Manager")
  184.         /usr/lib/gtkdialog/box_yesno "$YTTLE" "${YMSG1}<i>${DLPKG_BASE}</i>" "$YMSG2"
  185.         yret=$?
  186.         case $yret in
  187.          1|255)exit 0;;
  188.          0)IMODE=savefile;;
  189.         esac
  190.        else
  191.         echo "$YMSG1 ${DLPKG_BASE}"
  192.         echo "$(gettext 'Recommendation: Abort this installation and create some swap space. Continue only if you know what you are doing.')"
  193.         echo "Abort? [y/N]"
  194.         read ABRT
  195.         case $ABRT in
  196.          y|Y)exit 0;;
  197.          n|N)IMODE=savefile;echo 'installing';;
  198.          *)exit 0;;
  199.         esac
  200.        fi
  201.       fi
  202.      fi
  203.     fi
  204.     if [ "$IMODE" != "tmpfs" ]; then
  205.      FLAGNODIRECT=1
  206.      #100426 aufs can now write direct to save layer...
  207.      #note: fsnotify now preferred not inotify, udba=notify uses whichever is enabled in module...
  208.      busybox mount -t aufs -o remount,udba=notify unionfs / #remount aufs with best evaluation mode.
  209.      FLAGNODIRECT=$?
  210.      [ $FLAGNODIRECT -ne 0 ] && logger -s -t "installpkg.sh" "Failed to remount aufs / with udba=notify"
  211.      if [ $FLAGNODIRECT -eq 0 ];then
  212.       #note that /sbin/pup_event_frontend_d will not run snapmergepuppy if installpkg.sh or downloadpkgs.sh are running.
  213.       while [ "`pidof snapmergepuppy`" != "" ];do
  214.        sleep 1
  215.       done
  216.       DIRECTSAVEPATH="/initrd${SAVE_LAYER}" #SAVE_LAYER is in /etc/rc.d/PUPSTATE.
  217.      fi
  218.     fi
  219. fi
  220.  
  221. if [ $DISPLAY -a ! -f /tmp/petget_proc/install_quietly ];then #131222
  222.  LANG=$LANG_USER
  223.  . /usr/lib/gtkdialog/box_splash -close never -fontsize large -text "$(gettext 'Please wait, processing...')" &
  224.  YAFPID1=$!
  225.  trap 'pupkill $YAFPID1' EXIT #140318
  226. fi
  227.  
  228. cd "$DLPKG_PATH"
  229.  
  230. case $DLPKG_BASE in
  231.  *.pet)
  232.   DLPKG_MAIN="`basename $DLPKG_BASE .pet`"
  233.   pet2tgz $DLPKG_BASE || exit 1
  234.   tarball=$(echo ${DLPKG_MAIN}.tar.[gx]z)
  235.   PETFILES="$(tar --list -f $tarball)" || exit 1
  236.   #check for renamed pets. Will produce an empty ${DLPKG_NAME}.files file
  237.   PETFOLDER=$(echo "${PETFILES}" | cut -f 2 -d '/' | head -n 1)
  238.   [ "$PETFOLDER" = "" ] && PETFOLDER=$(echo "${PETFILES}" | cut -f 1 -d '/' | head -n 1)
  239.   if [ "${DLPKG_MAIN}" != "${PETFOLDER}" ]; then
  240.    pupkill $YAFPID1
  241.    LANG=$LANG_USER
  242.    if [ "$DISPLAY" ]; then
  243.     . /usr/lib/gtkdialog/box_ok "$(gettext 'Puppy Package Manager')" error "<b>${DLPKG_MAIN}.pet</b> $(gettext 'is named') <b>${PETFOLDER}</b> $(gettext 'inside the pet file. Will not install it!')"
  244.    else
  245.     . dialog --msgbox "$DLPKG_MAIN.pet $(gettext 'is named') $PETFOLDER $(gettext 'inside the pet file. Will not install it!')" 0 0
  246.    fi
  247.    exit 1
  248.   fi
  249.   if [ "`echo "$PETFILES" | grep -m1 '^\\./'`" != "" ];then
  250.    #ttuuxx has created some pets with './' prefix...
  251.    pPATTERN="s%^\\./${DLPKG_NAME}%%"
  252.    echo "$PETFILES" | sed -e "$pPATTERN" -e "s#^\.\/#\/#g" -e "s#^#\/#g" -e "s#^\/\/#\/#g" -e 's#^\/$##g' -e 's#^\/\.$##g' > /root/.packages/${DLPKG_NAME}.files
  253.    install_path_check
  254.    tar -x --strip=2 --directory=${DIRECTSAVEPATH}/ -f ${tarball} #120102. 120107 remove --unlink-first
  255.   else
  256.    #new2dir and tgz2pet creates them this way...
  257.    pPATTERN="s%^${DLPKG_NAME}%%"
  258.    echo "$PETFILES" | sed -e "$pPATTERN" -e "s#^\.\/#\/#g" -e "s#^#\/#g" -e "s#^\/\/#\/#g" -e 's#^\/$##g' -e 's#^\/\.$##g' > /root/.packages/${DLPKG_NAME}.files
  259.    install_path_check
  260.    tar -x --strip=1 --directory=${DIRECTSAVEPATH}/ -f ${tarball} #120102. 120107. 131122
  261.   fi
  262.   rm -f "${tarball}"
  263.   [ $? -ne 0 ] && clean_and_die
  264.  ;;
  265.  *.deb)
  266.   DLPKG_MAIN="`basename $DLPKG_BASE .deb`"
  267.   PFILES="`dpkg-deb --contents $DLPKG_BASE | tr -s ' ' | cut -f 6 -d ' '`"
  268.   [ $? -ne 0 ] && exit 1
  269.   echo "$PFILES" | sed -e "s#^\.\/#\/#g" -e "s#^#\/#g" -e "s#^\/\/#\/#g" -e 's#^\/$##g' -e 's#^\/\.$##g' > /root/.packages/${DLPKG_NAME}.files
  270.   install_path_check
  271.   dpkg-deb -x $DLPKG_BASE ${DIRECTSAVEPATH}/
  272.   [ $? -ne 0 ] && clean_and_die
  273.   [ -d /DEBIAN ] && rm -rf /DEBIAN #130112 precaution.
  274.   dpkg-deb -e $DLPKG_BASE /DEBIAN #130112 extracts deb control files to dir /DEBIAN. may have a post-install script, see below.
  275.  ;;
  276.  *.t*z|*.tzst|*.tar.*z|*.tar.bz2|*.tar.zst) #slackware, arch, etc..
  277.   DLPKG_MAIN="`basename $DLPKG_BASE`" #remove directory - filename only
  278.   DLPKG_MAIN=${DLPKG_MAIN%*.tar.*}    #remove .tar.xx extension
  279.   DLPKG_MAIN=${DLPKG_MAIN%.t[gx]z}    #remove .t[gx]z extension
  280.   DLPKG_MAIN=${DLPKG_MAIN%.tzst}    #remove .tzst extension
  281.   if [ "$DLPKG_BASE" = *.zst ]; then
  282.     PFILES="`tar --list --force-local -I zstd -a -f $DLPKG_BASE`" || exit 1
  283.   else  
  284.     PFILES="`tar --list --force-local  -a -f $DLPKG_BASE`" || exit 1
  285.   fi
  286.   echo "$PFILES" | sed -e "s#^\.\/#\/#g" -e "s#^#\/#g" -e "s#^\/\/#\/#g" -e 's#^\/$##g' -e 's#^\/\.$##g' > /root/.packages/${DLPKG_NAME}.files
  287.   install_path_check
  288.   if [ "$DLPKG_BASE" = *.zst ]; then
  289.     tar -x --force-local -I zstd --directory=${DIRECTSAVEPATH}/ -f $DLPKG_BASE #120102. 120107
  290.   else
  291.     tar -x --force-local --directory=${DIRECTSAVEPATH}/ -f $DLPKG_BASE #120102. 120107
  292.   fi
  293.   [ $? -ne 0 ] && clean_and_die
  294.  ;;
  295.  *.rpm) #110523
  296.   DLPKG_MAIN="`basename $DLPKG_BASE .rpm`"
  297.   busybox rpm -qp $DLPKG_BASE > /dev/null 2>&1
  298.   [ $? -ne 0 ] && exit 1
  299.   PFILES="`busybox rpm -qpl $DLPKG_BASE`"
  300.   [ $? -ne 0 ] && exit 1
  301.   echo "$PFILES" | sed -e "s#^\.\/#\/#g" -e "s#^#\/#g" -e "s#^\/\/#\/#g" -e 's#^\/$##g' -e 's#^\/\.$##g' > /root/.packages/${DLPKG_NAME}.files
  302.   install_path_check
  303.   #110705 rpm -i does not work for mageia pkgs...
  304.   exploderpm -i $DLPKG_BASE
  305.   [ $? -ne 0 ] && clean_and_die
  306.  ;;
  307. esac
  308.  
  309. if [ "$PUPMODE" = "2" ]; then #from BK's quirky6.1
  310.     mkdir /audit/${DLPKG_NAME}DEPOSED
  311.     echo -n '' > /tmp/petget_proc/petget/FLAGFND
  312.     find ${DIRECTSAVEPATH}/ -mindepth 1 | sed -e "s%${DIRECTSAVEPATH}%%" |
  313.     while read AFILESPEC
  314.     do
  315.       if [ -f "$AFILESPEC" ];then
  316.        ADIR="$(dirname "$AFILESPEC")"
  317.        mkdir -p /audit/${DLPKG_NAME}DEPOSED/${ADIR}
  318.        cp -a -f "$AFILESPEC" /audit/${DLPKG_NAME}DEPOSED/${ADIR}/
  319.        echo -n '1' > /tmp/petget_proc/petget/FLAGFND
  320.       fi
  321.     done
  322.     sync
  323.     if [ -s /tmp/petget_proc/petget/FLAGFND ];then
  324.       [ -f /audit/${DLPKG_NAME}DEPOSED.sfs ] && rm -f /audit/${DLPKG_NAME}DEPOSED.sfs #precaution, should not happen, as not allowing duplicate installs of same pkg.
  325.       mksquashfs /audit/${DLPKG_NAME}DEPOSED /audit/${DLPKG_NAME}DEPOSED.sfs
  326.     fi
  327.     sync
  328.     rm -rf /audit/${DLPKG_NAME}DEPOSED
  329.     #now write temp-location to final destination...
  330.     cp -a -f --remove-destination ${DIRECTSAVEPATH}/* /  2> /tmp/petget_proc/petget/install-cp-errlog
  331.     sync
  332.  
  333.     rm -rf ${DIRECTSAVEPATH} #131229 131230
  334.     [ "$DL_SAVE_FLAG" != "true" ] && rm -f $DLPKG_BASE 2>/dev/null
  335.     rm -f $DLPKG_MAIN.tar.gz 2>/dev/null
  336.     #pkgname.files may need to be fixed...
  337.     FIXEDFILES="`cat /root/.packages/${DLPKG_NAME}.files | grep -v '^\\./$'| grep -v '^/$' | sed -e 's%^\\.%%' -e 's%^%/%' -e 's%^//%/%'`"
  338.     echo "$FIXEDFILES" | sed -e "s#^\.\/#\/#g" -e "s#^#\/#g" -e "s#^\/\/#\/#g" -e 's#^\/$##g' -e 's#^\/\.$##g' | sort > /root/.packages/${DLPKG_NAME}.files
  339.     DIRECTSAVEPATH=/ # set it to the new cocation
  340.  
  341. else #-- anything other than PUPMODE 2 (full install) --
  342.  
  343.     [ "$DL_SAVE_FLAG" != "true" ] &&  rm -f $DLPKG_BASE 2>/dev/null
  344.     rm -f $DLPKG_MAIN.tar.${EXT} 2>/dev/null #131122
  345.  
  346.     #pkgname.files may need to be fixed...
  347.     FIXEDFILES="`cat /root/.packages/${DLPKG_NAME}.files | grep -v '^\\./$'| grep -v '^/$' | sed -e 's%^\\.%%' -e 's%^%/%' -e 's%^//%/%'`"
  348.     echo "$FIXEDFILES" | sed -e "s#^\.\/#\/#g" -e "s#^#\/#g" -e "s#^\/\/#\/#g" -e 's#^\/$##g' -e 's#^\/\.$##g' | sort > /root/.packages/${DLPKG_NAME}.files
  349.  
  350.     #flush unionfs cache, so files in pup_save layer will appear "on top"...
  351.     if [ "$DIRECTSAVEPATH" != "" ];then
  352.      #but first, clean out any bad whiteout files...
  353.      # 22sep10 shinobar: bugfix was not working clean out whiteout files
  354.      find /initrd/pup_rw -mount -type f -name .wh.\*  -printf '/%P\n'|
  355.      while read ONEWHITEOUT
  356.      do
  357.       ONEWHITEOUTFILE="`basename "$ONEWHITEOUT"`"
  358.       ONEWHITEOUTPATH="`dirname "$ONEWHITEOUT"`"
  359.       ONEPATTERN="`echo -n "$ONEWHITEOUT" | sed -e 's%/\\.wh\\.%/%'`"'/*'   ;#echo "$ONEPATTERN" >&2
  360.       [ "`grep -x "$ONEPATTERN" /root/.packages/${DLPKG_NAME}.files`" != "" ] && rm -f "/initrd/pup_rw/$ONEWHITEOUT"
  361.      done
  362.      #111229 /usr/local/petget/removepreview.sh when uninstalling a pkg, may have copied a file from sfs-layer to top, check...
  363.      cat /root/.packages/${DLPKG_NAME}.files |
  364.      while read ONESPEC
  365.      do
  366.       [ "$ONESPEC" = "" ] && continue #precaution.
  367.       if [ ! -d "$ONESPEC" ];then
  368.        [ -e "/initrd/pup_rw${ONESPEC}" ] && rm -f "/initrd/pup_rw${ONESPEC}"
  369.       fi
  370.      done
  371.      #now re-evaluate all the layers...
  372.      busybox mount -t aufs -o remount,udba=reval unionfs / #remount with faster evaluation mode.
  373.      [ $? -ne 0 ] && logger -s -t "installpkg.sh" "Failed to remount aufs / with udba=reval"
  374.  
  375.      sync
  376.     fi
  377.  
  378. fi
  379.  
  380. #some .pet pkgs have images at '/'...
  381. mv /{*.xpm,*.png} /usr/share/pixmaps/ 2>/dev/null
  382.  
  383. ls -dl /tmp | grep -q '^drwxrwxrwt' || chmod 1777 /tmp #130305 rerwin.
  384.  
  385. #post-install script?...
  386. #          puppy         slackware       debian/ubuntu/etc
  387. for i in pinstall.sh install/doinst.sh DEBIAN/postinst
  388. do
  389.     [ ! -e "$DIRECTSAVEPATH/$i" ] && continue
  390.     cd $DIRECTSAVEPATH/
  391.     LANG=$LANG_USER sh ${i}
  392.     sync
  393.     rm -f ${i}
  394. done
  395. rm -rf $DIRECTSAVEPATH/install
  396. rm -rf $DIRECTSAVEPATH/DEBIAN
  397.  
  398. #130314 run arch linux pkg post-install script...
  399. if [ -f $DIRECTSAVEPATH/.INSTALL ];then #arch post-install script.
  400.  if [ -f /usr/local/petget/ArchRunDotInstalls ];then #precaution. see 3builddistro, script created by noryb009.
  401.   #this code is taken from below...
  402.   dlPATTERN='|'"`echo -n "$DLPKG_BASE" | sed -e 's%\\-%\\\\-%'`"'|'
  403.   archVER="`cat /tmp/petget_proc/petget_missing_dbentries-Packages-* | grep "$dlPATTERN" | head -n 1 | cut -f 3 -d '|'`"
  404.   if [ "$archVER" ];then #precaution.
  405.    cd $DIRECTSAVEPATH/
  406.    mv -f .INSTALL .INSTALL1-${archVER}
  407.    cp -a /usr/local/petget/ArchRunDotInstalls ArchRunDotInstalls
  408.    LANG=$LANG_USER ./ArchRunDotInstalls
  409.    rm -f ArchRunDotInstalls
  410.    rm -f .INSTALL*
  411.   fi
  412.  fi
  413. fi
  414.  
  415. #v424 .pet pkgs may have a post-uninstall script...
  416. if [ -f $DIRECTSAVEPATH/puninstall.sh ];then
  417.  mv -f $DIRECTSAVEPATH/puninstall.sh /root/.packages/${DLPKG_NAME}.remove
  418. fi
  419.  
  420. #w465 <pkgname>.pet.specs is in older pet pkgs, just dump it...
  421. #maybe a '$APKGNAME.pet.specs' file created by dir2pet script...
  422. rm -f $DIRECTSAVEPATH/*.pet.specs 2>/dev/null
  423. #...note, this has a setting to prevent .files and entry in user-installed-packages, so install not registered.
  424.  
  425. #add entry to /root/.packages/user-installed-packages...
  426. #w465 a pet pkg may have /pet.specs which has a db entry...
  427. if [ -f $DIRECTSAVEPATH/pet.specs -a -s $DIRECTSAVEPATH/pet.specs ];then #w482 ignore zero-byte file.
  428.  DB_ENTRY="`cat $DIRECTSAVEPATH/pet.specs | head -n 1`"
  429.  rm -f $DIRECTSAVEPATH/pet.specs
  430. else
  431.  [ -f $DIRECTSAVEPATH/pet.specs ] && rm -f $DIRECTSAVEPATH/pet.specs #w482 remove zero-byte file.
  432.  dlPATTERN='|'"`echo -n "$DLPKG_BASE" | sed -e 's%\\-%\\\\-%'`"'|'
  433.  DB_ENTRY="`cat /tmp/petget_proc/petget_missing_dbentries-Packages-* | grep "$dlPATTERN" | head -n 1`"
  434. fi
  435. ##+++2011-12-27 KRG check if $DLPKG_BASE matches DB_ENTRY 1 so uninstallation works :Ooops:
  436. db_pkg_name=`echo "$DB_ENTRY" |cut -f 1 -d '|'`
  437. if [ "$db_pkg_name" != "$DLPKG_NAME" ];then
  438.  DB_ENTRY=`echo "$DB_ENTRY" |sed "s#$db_pkg_name#$DLPKG_NAME#"`
  439. fi
  440. ##+++2011-12-27 KRG
  441.  
  442. #see if a .desktop file was installed, fix category... 120628 improve...
  443. #120818 overhauled. Pkg db now has category[;subcategory] (see 0setup), xdg enhanced (see /etc/xdg and /usr/share/desktop-directories), and generic icons for all subcategories (see /usr/local/lib/X11/mini-icons).
  444. #note, similar code also in Woof 2createpackages.
  445. ONEDOT=""
  446. CATEGORY="`echo -n "$DB_ENTRY" | cut -f 5 -d '|'`" #exs: Document, Document;edit
  447. [ "$CATEGORY" = "" ] && CATEGORY='BuildingBlock' #paranoid precaution.
  448. #xCATEGORY and DEFICON will be the fallbacks if Categories entry in .desktop is invalid...
  449. xCATEGORY="`echo -n "$CATEGORY" | sed -e 's%^%X-%' -e 's%;%-%'`" #ex: X-Document-edit (refer /etc/xdg/menu/*.menu)
  450. DEFICON="`echo -n "$CATEGORY" | sed -e 's%;%-%'`"'.svg' #ex: Document-edit (refer /usr/share/pixmaps/puppy -- these are in jwm search path)
  451. case $CATEGORY in
  452.  Calculate)     CATEGORY='Business'             ; xCATEGORY='X-Business'            ; DEFICON='Business.svg'            ;; #Calculate is old name, now Business.
  453.  Develop)       CATEGORY='Utility;development'  ; xCATEGORY='X-Utility-development' ; DEFICON='Utility-development.svg' ;; #maybe an old pkg has this.
  454.  Help)          CATEGORY='Utility;help'         ; xCATEGORY='X-Utility-help'        ; DEFICON='Help.svg'                ;; #maybe an old pkg has this.
  455.  BuildingBlock) CATEGORY='Utility'              ; xCATEGORY='Utility'               ; DEFICON='BuildingBlock.svg'       ;; #unlikely to have a .desktop file.
  456. esac
  457. topCATEGORY="`echo -n "$CATEGORY" | cut -f 1 -d ';'`"
  458. tPATTERN="^${topCATEGORY} "
  459. cPATTERN="s%^Categories=.*%Categories=${xCATEGORY}%"
  460. iPATTERN="s%^Icon=.*%Icon=${DEFICON}%"
  461.  
  462. #121119 if only one .desktop file, first check if a match in /usr/local/petget/categories.dat...
  463. CATDONE='no'
  464. if [ -f /usr/local/petget/categories.dat ];then #precaution, but it will be there.
  465.  NUMDESKFILE="$(grep 'share/applications/.*\.desktop$' /root/.packages/${DLPKG_NAME}.files | wc -l)"
  466.  if [ "$NUMDESKFILE" = "1" ];then
  467.   #to lookup categories.dat, we need to know the generic name of the package, which may be different from pkg name...
  468.   #db entry format: pkgname|nameonly|version|pkgrelease|category|size|path|fullfilename|dependencies|description|compileddistro|compiledrelease|repo|
  469.   DBNAMEONLY="$(echo -n "$DB_ENTRY" | cut -f 2 -d '|')"
  470.   DBPATH="$(echo -n "$DB_ENTRY" | cut -f 7 -d '|')"
  471.   DBCOMPILEDDISTRO="$(echo -n "$DB_ENTRY" | cut -f 11 -d '|')"
  472.   case $DBCOMPILEDDISTRO in
  473.    debian|devuan|ubuntu|raspbian) xNAMEONLY=${DBPATH##*/} ;;
  474.    *) xNAMEONLY="$DBNAMEONLY" ;;
  475.   esac
  476.   xnPTN=" ${xNAMEONLY} "
  477.   #130126 categories.dat format changed slightly... 130219 ignore case...
  478.   CATVARIABLE="$(grep -i "$xnPTN" /usr/local/petget/categories.dat | grep '^PKGCAT' | head -n 1 | cut -f 1 -d '=' | cut -f 2,3 -d '_' | tr '_' '-')" #ex: PKGCAT_Graphic_camera=" gphoto2 gtkam "
  479.   if [ "$CATVARIABLE" ];then #ex: Graphic-camera
  480.    xCATEGORY="X-${CATVARIABLE}"
  481.    cPATTERN="s%^Categories=.*%Categories=${xCATEGORY}%" #121120
  482.    CATFOUND="yes"
  483.    CATDONE='yes'
  484.   fi
  485.  fi
  486. fi
  487.  
  488. for ONEDOT in `grep 'share/applications/.*\.desktop$' /root/.packages/${DLPKG_NAME}.files | tr '\n' ' '` #121119 exclude other strange .desktop files.
  489. do
  490.  #https://specifications.freedesktop.org/desktop-entry-spec/latest/ar01s07.html
  491.  sed -i 's| %u|| ; s| %U|| ; s| %f|| ; s| %F||' $ONEDOT
  492.  
  493.  #w478 find if category is already valid (see also 2createpackages)..
  494.  if [ "$CATDONE" = "no" ];then #121119
  495.   CATFOUND="no"
  496.   for ONEORIGCAT in `cat $ONEDOT | grep '^Categories=' | head -n 1 | cut -f 2 -d '=' | tr ';' ' ' | rev` #search in reverse order.
  497.   do
  498.    ONEORIGCAT="`echo -n "$ONEORIGCAT" | rev`" #restore rev of one word.
  499.    oocPATTERN=' '"$ONEORIGCAT"' '
  500.    [ "`echo "$PUPHIERARCHY" | tr -s ' ' | grep "$tPATTERN" | cut -f 3 -d ' ' | tr ',' ' ' | sed -e 's%^% %' -e 's%$% %' | grep "$oocPATTERN"`" != "" ] && CATFOUND="yes"
  501.    #got a problem with sylpheed, "Categories=GTK;Network;Email;News;" this displays in both Network and Internet menus...
  502.    if [ "$CATFOUND" = "yes" ];then
  503.     cPATTERN="s%^Categories=.*%Categories=${ONEORIGCAT}%"
  504.     break
  505.    fi
  506.   done
  507.   #121109 above may fail, as DB_category field may not match that in .desktop file, so leave out that $tPATTERN match in $PUPHIERARCHY...
  508.   if [ "$CATFOUND" = "no" ];then
  509.    for ONEORIGCAT in `cat $ONEDOT | grep '^Categories=' | head -n 1 | cut -f 2 -d '=' | tr ';' ' ' | rev` #search in reverse order.
  510.    do
  511.     ONEORIGCAT="`echo -n "$ONEORIGCAT" | rev`" #restore rev of one word.
  512.     oocPATTERN=' '"$ONEORIGCAT"' '
  513.     [ "`echo "$PUPHIERARCHY" | tr -s ' ' | cut -f 3 -d ' ' | tr ',' ' ' | sed -e 's%^% %' -e 's%$% %' | grep "$oocPATTERN"`" != "" ] && CATFOUND="yes"
  514.     #got a problem with sylpheed, "Categories=GTK;Network;Email;News;" this displays in both Network and Internet menus...
  515.     if [ "$CATFOUND" = "yes" ];then
  516.      cPATTERN="s%^Categories=.*%Categories=${ONEORIGCAT}%"
  517.      break
  518.     fi
  519.    done
  520.   fi
  521.  fi
  522.  sed -i -e "$cPATTERN" $ONEDOT #fix Categories= entry.
  523.  
  524.  #w019 does the icon exist?...*.t*z|*.tzst|*.tar.*z|*.tar.bz2|*.tar.zst)
  525.  ICON="`grep '^Icon=' $ONEDOT | cut -f 2 -d '='`"
  526.  if [ "$ICON" != "" ];then
  527.   [ -e "$ICON" ] && continue #it may have a hardcoded path.
  528.   ICONBASE="${ICON##*/}" #basename "$ICON"
  529.   #110706 fix icon entry in .desktop... 110821 improve...
  530.   #first search where jwm looks for icons... 111207...
  531.   FNDICON="`find /usr/share/pixmaps -maxdepth 2 -name $ICONBASE -o -name $ICONBASE.png -o -name $ICONBASE.xpm -o -name $ICONBASE.jpg -o -name $ICONBASE.jpeg -o -name $ICONBASE.gif -o -name $ICONBASE.svg | grep -i -E 'png$|xpm$|jpg$|jpeg$|gif$|svg$' | head -n 1`"
  532.   if [ "$FNDICON" ];then
  533.    ICONNAMEONLY="${FNDICON##*/}" #basename $FNDICON
  534.    iPTN="s%^Icon=.*%Icon=${ICONNAMEONLY}%"
  535.    sed -i -e "$iPTN" $ONEDOT
  536.    continue
  537.   else
  538.    #look elsewhere... 111207...
  539.    FNDICON="`find /usr/share/icons /usr/local/share/pixmaps -name $ICONBASE -o -name $ICONBASE.png -o -name $ICONBASE.xpm -o -name $ICONBASE.jpg -o -name $ICONBASE.jpeg -o -name $ICONBASE.gif -o -name $ICONBASE.svg | grep -i -E 'png$|xpm$|jpg$|jpeg$|gif$|svg$' | head -n 1`"
  540.    #111207 look further afield, ex parole pkg has /usr/share/parole/pixmaps/parole.png...
  541.    [ ! "$FNDICON" ] && [ -d /usr/share/$ICONBASE ] && FNDICON="`find /usr/share/${ICONBASE} -name $ICONBASE -o -name $ICONBASE.png -o -name $ICONBASE.xpm -o -name $ICONBASE.jpg -o -name $ICONBASE.jpeg -o -name $ICONBASE.gif -o -name $ICONBASE.svg | grep -i -E 'png$|xpm$|jpg$|jpeg$|gif$|svg$' | head -n 1`"
  542.    #111207 getting desperate...
  543.    [ ! "$FNDICON" ] && FNDICON="`find /usr/share -name $ICONBASE -o -name $ICONBASE.png -o -name $ICONBASE.xpm -o -name $ICONBASE.jpg -o -name $ICONBASE.jpeg -o -name $ICONBASE.gif -o -name $ICONBASE.svg | grep -i -E 'png$|xpm$|jpg$|jpeg$|gif$|svg$' | head -n 1`"
  544.    if [ "$FNDICON" ];then
  545.     ICONNAMEONLY="${FNDICON##*/}" #basename "$FNDICON"
  546.     ln -snf "$FNDICON" /usr/share/pixmaps/${ICONNAMEONLY}
  547.     iPTN="s%^Icon=.*%Icon=${ICONNAMEONLY}%"
  548.     sed -i -e "$iPTN" $ONEDOT
  549.     continue
  550.    fi
  551.   fi
  552.   #substitute a default icon...
  553.   sed -i -e "$iPATTERN" $ONEDOT #note, ONEDOT is name of .desktop file.
  554.  fi
  555.  
  556. done
  557.  
  558. #due to images at / in .pet and post-install script, .files may have some invalid entries...
  559. INSTFILES="`cat /root/.packages/${DLPKG_NAME}.files`"
  560. echo "$INSTFILES" |
  561. while read ONEFILE
  562. do
  563.  if [ ! -e "$ONEFILE" ];then
  564.   ofPATTERN='^'"$ONEFILE"'$'
  565.   grep -v "$ofPATTERN" /root/.packages/${DLPKG_NAME}.files > /tmp/petget_proc/petget_instfiles
  566.   mv -f /tmp/petget_proc/petget_instfiles /root/.packages/${DLPKG_NAME}.files
  567.  fi
  568. done
  569.  
  570. #w482 DB_ENTRY may be missing DB_category and DB_description fields...
  571. #pkgname|nameonly|version|pkgrelease|category|size|path|fullfilename|dependencies|description|
  572. #optionally on the end: compileddistro|compiledrelease|repo| (fields 11,12,13)
  573. DESKTOPFILE="`grep '\.desktop$' /root/.packages/${DLPKG_NAME}.files | head -n 1`"
  574. if [ "$DESKTOPFILE" != "" ];then
  575.  DB_category="`echo -n "$DB_ENTRY" | cut -f 5 -d '|'`"
  576.  DB_description="`echo -n "$DB_ENTRY" | cut -f 10 -d '|'`"
  577.  CATEGORY="$DB_category"
  578.  DESCRIPTION="$DB_description"
  579.  zCATEGORY="`cat $DESKTOPFILE | grep '^Categories=' | sed -e 's%;$%%' | cut -f 2 -d '=' | rev | cut -f 1 -d ';' | rev`" #121109
  580.  if [ "$zCATEGORY" != "" ];then #121109
  581.   #v424 but want the top-level menu category...
  582.   catPATTERN="[ ,]${zCATEGORY},|[ ,]${zCATEGORY} |[ ,]${zCATEGORY}"'$' #121119 fix bug in pattern.
  583.   CATEGORY="`echo "$PUPHIERARCHY" | cut -f 1 -d '#' | grep -E "$catPATTERN" | grep ':' | cut -f 1 -d ' ' | head -n 1`" #121119 /etc/xdg/menus/hierarchy
  584.  fi
  585.  if [ "$DB_description" = "" ];then
  586.   DESCRIPTION="`cat $DESKTOPFILE | grep '^Comment=' | cut -f 2 -d '='`"
  587.   [ "$DESCRIPTION" = "" ] && DESCRIPTION="`cat $DESKTOPFILE | grep '^Name=' | cut -f 2 -d '='`" # shinobar
  588.  fi
  589.  if [ "$DB_category" = "" -o "$DB_description" = "" ];then
  590.   newDB_ENTRY="`echo -n "$DB_ENTRY" | cut -f 1-4 -d '|'`"
  591.   newDB_ENTRY="$newDB_ENTRY"'|'"$CATEGORY"'|'
  592.   newDB_ENTRY="$newDB_ENTRY""`echo -n "$DB_ENTRY" | cut -f 6-9 -d '|'`"
  593.   newDB_ENTRY="$newDB_ENTRY"'|'"$DESCRIPTION"'|'
  594.   newDB_ENTRY="$newDB_ENTRY""`echo -n "$DB_ENTRY" | cut -f 11-14 -d '|'`"
  595.   DB_ENTRY="$newDB_ENTRY"
  596.  fi
  597. fi
  598.  
  599. #If there is an already installed package, just update the package files list and its database entry
  600. xpkgname="$(echo "$DB_ENTRY" | cut -f 2 -d '|')"
  601. installed_pkg="$(cat /root/.packages/user-installed-packages | grep "|$xpkgname|")"
  602.  
  603. if [ "$xpkgname" != "" ] && [ "$installed_pkg" != "" ]; then
  604.   #There is an already installed package. Just update the package file list
  605.   installed_files="$(echo "$installed_pkg" | cut -f 1 -d '|')"
  606.   if [ "$installed_files" != "" ]; then
  607.    #Check if the old package file list exists
  608.     if [ -e /root/.packages/${installed_files}.files ]; then
  609.    
  610.     while IFS= read -r xline
  611.     do
  612.      #Check if the file was a part of the newly installed package
  613.      if [ "$(cat /root/.packages/${DLPKG_NAME}.files | grep "$xline")" == "" ]; then
  614.       #Not a part of newly installed package. Do action
  615.  
  616.        #Delete the file which is not a part of upgrade
  617.        if [ -e "$xline" ] && [ ! -d "$xline" ]; then
  618.        
  619.         if [ -d "/initrd/pup_rw$xline" ] && [ ! -L "/initrd/pup_rw$xline" ]; then
  620.          rm -f "/initrd/pup_rw$xline"
  621.         fi
  622.        
  623.         [ -e "/initrd${SAVE_LAYER}${xline}" ] && rm -f "/initrd${SAVE_LAYER}${xline}"
  624.        
  625.         [ -e "$xline" ] && rm -f "$xline"
  626.        
  627.        fi
  628.  
  629.      fi
  630.     done < /root/.packages/${installed_files}.files
  631.    
  632.     rm -f /root/.packages/${installed_files}.files
  633.    
  634.     cat /root/.packages/user-installed-packages | grep -v "$installed_pkg" > /root/.packages/user-installed-packages.tmp
  635.     echo "$DB_ENTRY" >> /root/.packages/user-installed-packages.tmp
  636.     cp -f /root/.packages/user-installed-packages.tmp /root/.packages/user-installed-packages
  637.     rm -f  /root/.packages/user-installed-packages.tmp
  638.    
  639.     else
  640.      echo "$DB_ENTRY" >> /root/.packages/user-installed-packages
  641.     fi
  642.   else
  643.     echo "$DB_ENTRY" >> /root/.packages/user-installed-packages
  644.   fi
  645. else
  646.  echo "$DB_ENTRY" >> /root/.packages/user-installed-packages
  647. fi
  648.  
  649. #120907 post-install hacks...
  650. /usr/local/petget/hacks-postinstall.sh $DLPKG_MAIN
  651.  
  652. #announcement of successful install...
  653. #announcement is done after all downloads, in downloadpkgs.sh...
  654. CATEGORY="`echo -n "$CATEGORY" | cut -f 1 -d ';'`"
  655. [ "$CATEGORY" = "" ] && CATEGORY="none"
  656. [ "$CATEGORY" = "BuildingBlock" ] && CATEGORY="none"
  657. echo "PACKAGE: $DLPKG_NAME CATEGORY: $CATEGORY" >> /tmp/petget_proc/petget-installed-pkgs-log
  658.  
  659. #110503 change ownership of some files if non-root...
  660. #hmmm, i think this will only work if running this script as root...
  661. # (the entry script pkg_chooser.sh has sudo to switch to root)
  662. read HOMEUSER < /etc/plogin
  663. if [ "$HOMEUSER" != "root" ];then
  664.  grep -E '^/var|^/root|^/etc' /root/.packages/${DLPKG_NAME}.files |
  665.  while read FILELINE
  666.  do
  667.   busybox chown ${HOMEUSER}:users "${FILELINE}"
  668.  done
  669. fi
  670.  
  671. PKGFILES=/root/.packages/${DLPKG_NAME}.files
  672. # update system cache
  673. /usr/local/petget/z_update_system_cache.sh "$PKGFILES"
  674.  
  675. rm -f $HOME/nohup.out
  676.  
  677. ###END###
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement