#!/bin/sh
#package manager for Puppy Linux.
#(c) copyright 2005,2006,2007 Barry Kauler www.puppyos.com
#v2.13 substantially modified.
#v2.14 LGPL
#2007 Lesser GPL licence v2 (http://www.fsf.org/licensing/licenses/lgpl.html)

#optional passed param is a pkg name preceded by a + to install pkg, - to uninstall pkg.
# pkg name example: xbubble-0.2.4
# for install, petget script will offer download URLs or local.
#New for v2.13, integration with Rox-Filer. If commandline is a .pet with
# absolute path, ex: petget /root/xbubble-0.2.4.pet
# petget script will simply install it.
#also added a url, ex: petget http://somewhere.on.internet/xbubble-0.2.4.pet

#13Sept2007 BK: v2.21 handle true flushing to flash drive. Oct 2007: v3.01 updates.
#v3.98 BK: fix bug tries to install pkg already installed as alien.
#v3.98 BK: dependency checking was wonky.
#v3.98 BK: remove old cp line for pup v1 when /etc was a symlink.
#v3.99 BK: read which repository from /tmp/petget_filterversion set by /usr/local/petget/pkg_chooser.sh
#v3.99 fix for calc enough space to install pkg, from lluamco.

#v2.17.1 trying to fix a bug with xdialog...
LANG=C
export LANG

PUPPYVERSION="`cat /etc/puppyversion`"

#v3.99
xPUPPYVERSION="$PUPPYVERSION"
[ $PUPPYVERSION -eq 398 ] && xPUPPYVERSION=400 #temp fixup.
[ $PUPPYVERSION -eq 399 ] && xPUPPYVERSION=400 #temp fixup.
PUPVERDIGIT1="`echo -n "$xPUPPYVERSION" | cut -b 1`"
PUPREPO=$PUPVERDIGIT1

#v2.17.1 variables created at bootup by /initrd/usr/sbin/init...
. /etc/rc.d/PUPSTATE  #this has PUPMODE and SAVE_LAYER.

#v2.21 boot from flash, bypass tmpfs, install direct to pup_save file...
DIRECTSAVEPATH=""
if [ $PUPMODE -eq 3 -o $PUPMODE -eq 7 -o $PUPMODE -eq 13 ];then
 if [ "`lsmod | grep '^unionfs' `" != "" ];then
  #if snapmergepuppy is running, wait until it has finished...
  while [ "`pidof snapmergepuppy`" != "" ];do
   sleep 1
  done
  DIRECTSAVEPATH="/initrd${SAVE_LAYER}"
 fi
fi



#v2.0.0 main dlg...
DLG1="
 <wtitle>Менеджер пакетов PETget</wtitle>
 <vbox>
  <text><label>Добро пожаловать в менеджер PET-пакетов!</label></text>
  <text><label>PET-пакеты бывают двух видов - 'официальные' и 'неофициальные'. Официальные пакеты взяты из ресурса 'Unleashed' - набора пакетов, использованных при создании Puppy, в котором Вы сейчас работаете. Неофициальные PET-пакеты, в отличие от них, создавались вне этого ресурса. Чтобы обеспечить полную совместимость, рекомендуется просмотреть сначала официальные PET-пакеты в поисках нужного Вам.</label></text>
  <hbox>
   <text><label>Нажмите на эту кнопку, чтобы выбрать и установить официальный PET-пакет, или удалить уже установленный (официальный или неофициальный).:</label></text>
   <vbox>
    <button>
     <input file>/usr/local/lib/X11/mini-icons/pupget.xpm</input>
     <action>EXIT:10</action>
    </button>
   </vbox>
  </hbox>
  <text><label>\" \"</label></text>
  
  <hbox>
   <text><label>Если Вы загрузили PET-пакет, официальный или неофициальный, то Вы можете установить его, нажав на эту кнопку:</label></text>
   <vbox>
    <button>
     <input file>/usr/local/lib/X11/mini-icons/pupget.xpm</input>
     <action>EXIT:13</action>
    </button>
   </vbox>
  </hbox>

  <hbox>
   <text><label>В процессе установки PET-пакета проверяются его зависимости от других пакетов. Однако, Вы можете перепроверить зависимости любого установленного пакета, нажав на эту кнопку. Это запустит проверку системы на наличие всех необходимых для пакета общих библиотек:</label></text>
   <vbox>
    <button>
     <input file>/usr/local/lib/X11/mini-icons/package.xpm</input>
     <action>EXIT:11</action>
    </button>
   </vbox>
  </hbox>

  <frame Дополнительная информация>
   <text><label>Вы можете установить любой уже скачанный PET-пакет (официальный или неофициальный), просто щёлкнув по нему мышью в файловом менеджере ROX. Скачать и щёлкнуть - это так просто!</label></text>
   <hbox>
    <text><label>Хотите узнать больше о PET-пакетах? Нажмите на кнопку для получения информации из Интернета:</label></text>
    <vbox>
     <button>
      <input file>/usr/local/lib/X11/mini-icons/info16.xpm</input>
      <action>/usr/local/bin/defaultbrowser http://www.puppylinux.com/development/package-management.htm &</action>
     </button>
    </vbox>
   </hbox>
  </frame>
  <button cancel></button>
 </vbox>
"



#v2.13 this code very untidy, will do a house clean sometime...
COMMANDPKG=""
DISABLEDX=""
ROXCMD=""
if [ "$1" ];then
 COMMANDPKG="$1"
 #want pet script to be noninteractive.
 #passed param is a pkg name preceded by a + to install pkg, - to uninstall pkg.
 if [ "`echo -n "$COMMANDPKG" | cut -b 1`" = '-' ];then
  RETVAL="`xmessage -center -timeout 1 "testing" 2>&1`"
  if [ ! "`echo "$RETVAL" | grep "Error:"`" = "" ];then
   #this situation only when uninstalling a pkg, so haven't bypassed all xmessages.
   DISABLEDX="yes"
  fi
 fi
 #expanding pet to work with rox...
 #if the commandline has a full path/filename then no need to ask about where
 #to download it from....
 CMD1STCHAR="`echo -n "$COMMANDPKG" | cut -b 1`"
 if [ "$CMD1STCHAR" = "/" ];then
  ROXCMD="$COMMANDPKG"
  #now extract just the pkg name, no path, no extension...
  COMMANDPKG="+`basename "$ROXCMD" .pet`"
 fi
 #also accept a url...
 if [ ! "`echo -n "$COMMANDPKG" | grep --extended-regexp '^ftp:|^http:'`" = "" ];then
  ROXCMD="$COMMANDPKG"
  #now extract just the pkg name, no path, no extension...
  COMMANDPKG="+`basename "$ROXCMD" .pet`"
 fi
fi

#v3.99
if [ "$COMMANDPKG" != "" ];then
 #note, the default for PUPREPO is the current major puppy version digit, see above.
 #this file was created by /usr/local/petget/pkg_chooser.sh, which repository to get pkg from...
 [ -f /tmp/petget_filterversion ] && PUPREPO="`cat /tmp/petget_filterversion`"
fi
modPUPREPO="$PUPREPO"
[ "$PUPREPO" = "$PUPVERDIGIT1" ] && modPUPREPO="" #current livepackages.txt does not have a repo#.

THISVER="`cat /etc/puppyversion`"
DIGIT1="`echo "$THISVER" | cut -b 1`"
DIGIT2="`echo "$THISVER" | cut -b 2`"
DIGIT3="`echo "$THISVER" | cut -b 3`" 
RIGHTVER="${DIGIT1}.${DIGIT2}.${DIGIT3}"

#WKGDIR="`pwd`"
WKGDIR="/root/.packages"
cd /root/.packages



dependcheckfunc() {
 FLAGDEPPKG="no"
 [ "$WKGDIR" = "" ] && WKGDIR='.' #i expect this to be set, precaution.
 echo -n "" > /tmp/missinglibs.txt
 echo -n "" > /tmp/missinglibs0.txt
  #v1.0.4 
  #for openoffice, really need to add /usr/OpenOffice.org1.1.4/program to LD_LIBRARY_PATH,
  #but cannot be bothered for now... nah, do something now...
  if [ ! "`echo -n "$APKGNAME" | grep "openoffice"`" = "" ];then
   #return #bypass dependency check.
   if [ "`echo "$LD_LIBRARY_PATH" | grep "OpenOffice"`" = "" ];then
    [ -d /usr/OpenOffice.org1.1.4 ] && LD_LIBRARY_PATH="/usr/OpenOffice.org1.1.4/program:$LD_LIBRARY_PATH"
    [ -d /opt/openoffice.org2.2 ] && LD_LIBRARY_PATH="/opt/openoffice.org2.2/program:$LD_LIBRARY_PATH"
    export LD_LIBRARY_PATH
    #...need to generalise this code for different versions of openoffice.
   fi
  fi
 #APATTERN="s/.\/$APKGNAME//g"
 #cd $WKGDIR
 #FNDFILES="`find ./$APKGNAME -type f | sed -e "$APATTERN" | tr "\n" " "`"
 FNDFILES="`cat $WKGDIR/$APKGNAME.files`"
 for ONEFILE in $FNDFILES
 do
  ISANEXEC="`file --brief $ONEFILE | grep --extended-regexp "LSB executable|shared object"`"
  if [ ! "$ISANEXEC" = "" ];then
   LDDRESULT="`ldd $ONEFILE`"
   MISSINGLIBS="`echo "$LDDRESULT" | grep "not found" | cut -f 2 | cut -f 1 -d " " | tr "\n" " "`"
   if [ ! "$MISSINGLIBS" = "" ];then
    echo "File $ONEFILE has these missing library files:" >> /tmp/missinglibs.txt
    echo " $MISSINGLIBS" >> /tmp/missinglibs.txt
   fi
  fi
 done
 sync
 #find any dependent packages...
 #second field in comments-field has a comma-delimited list of dependencies...
 cp -f $WKGDIR/packages.txt /tmp/tempzzz
 [ -f $WKGDIR/livepackages${modPUPREPO}.txt ] && cat $WKGDIR/livepackages${modPUPREPO}.txt >> /tmp/tempzzz #v3.99
 [ -f $WKGDIR/alienpackages.txt ] && cat $WKGDIR/alienpackages.txt >> /tmp/tempzzz
 BPATTERN="^\"${APKGNAME}\" "
 #creates list, each line in format "pkgname ...
 DEPENDPKGS="`cat /tmp/tempzzz | grep "$BPATTERN" | head -n 1 | cut -f 6 -d '"' | cut -f 2 -d " " | tr "," "\n" | grep "^\+" |  sed -e 's/^\+//g'`" #'geany
 if [ ! "$DEPENDPKGS" = "" ];then
#  echo "Package $APKGNAME has these missing packages that it is dependent on:" >> /tmp/missinglibs.txt
  for ADEPENDPKG in $DEPENDPKGS
  do
  
   
   namePATTERN1=" \"${ADEPENDPKG} " #name only
   namePATTERN2=" \"${ADEPENDPKG}-" #some alienpackage.txt entries may have incorrect format, no space after pkg name.
   namePATTERN3="^\"${ADEPENDPKG}\" " #dependency has version as well.
   if [  "`cat /tmp/tempzzz | grep '" on "' | grep -E "${namePATTERN1}|${namePATTERN2}|${namePATTERN3}"`" = "" ];then
   
    FLAGDEPPKG="yes"
    echo "Отсутствует необходимый для удовлетворения зависимости пакет: \"$ADEPENDPKG\" " >> /tmp/missinglibs.txt
    #should find the exact missing pkg name, so can get it...
    #but what if it is already in the PKGS2ADD list?
    #if [ "`echo "$PKGS2ADD" | grep "$BPATTERN"`" = "" ];then
    if [ "`echo "$PKGS2ADD" | grep -E "${namePATTERN1}|${namePATTERN2}|${namePATTERN3}"`" = "" ];then #v3.98
     #MPKGLINE="`cat $WKGDIR/livepackages.txt | grep '" off "' | grep "$BPATTERN" | head -n 1`"
     MPKGLINE="`cat $WKGDIR/livepackages${modPUPREPO}.txt | grep '" off "' | grep -E "${namePATTERN1}|${namePATTERN2}|${namePATTERN3}" | head -n 1`" #v3.98 v3.99
     if [ ! "$MPKGLINE" = "" ];then
      echo "$MPKGLINE" >> /tmp/missingpkgs.txt #will become next PKGS2ADD list.
      
     fi
    else
     echo "...однако, он уже стоит в очереди на установку. Всё в порядке." >> /tmp/missinglibs.txt
    fi
   fi
  done
 fi
 TESTONLY=""
} #end dependcheckfunc


installpkgfunc () {
    if [ -f ./$APKGNAME/puninstall.sh ];then
     mv ./$APKGNAME/puninstall.sh ./$APKGNAME.remove
    fi
    if [ -d ./$APKGNAME/root0 ];then #for an old legacy pre-v2.14 pkg
     mv ./$APKGNAME/root0 ./$APKGNAME/root
    fi
    if [ -f ./$APKGNAME/keyword ];then
     #mv ./$APKGNAME/keyword ./$APKGNAME.keyword
     rm -f ./$APKGNAME/keyword
    fi
    #if [ -f ./$APKGNAME.keyword ];then
    # #code here to add menu entries etc...
    # AKEYWORD="`cat ./$APKGNAME.keyword | cut -f 1 -d " "`"
    # #v1.0.5
    # #v2.14 with xdg menus this is now mostly redundant...
    # /usr/sbin/fixmenus /root $AKEYWORD
    #fi
    #v1.0.2 problem, these images must be in .files file so can be uninstalled...
    for ONEIMAGEFILE in `ls -1 ./$APKGNAME/*[0-9].xpm 2>/dev/null`
    do
     BASEONEIMAGE="`basename $ONEIMAGEFILE`"
     echo "/usr/local/lib/X11/pixmaps/$BASEONEIMAGE" >> ./$APKGNAME.files
    done
    for ONEIMAGEFILE in `ls -1 ./$APKGNAME/*[0-9].png 2>/dev/null`
    do
     BASEONEIMAGE="`basename $ONEIMAGEFILE`"
     echo "/usr/local/lib/X11/pixmaps/$BASEONEIMAGE" >> ./$APKGNAME.files
    done
    for ONEIMAGEFILE in `ls -1 ./$APKGNAME/*[^0-9].xpm 2>/dev/null`
    do
     BASEONEIMAGE="`basename $ONEIMAGEFILE`"
     echo "/usr/local/lib/X11/mini-icons/$BASEONEIMAGE" >> ./$APKGNAME.files
    done
    for ONEIMAGEFILE in `ls -1 ./$APKGNAME/*[^0-9].png 2>/dev/null` #v2.16
    do
     BASEONEIMAGE="`basename $ONEIMAGEFILE`"
     echo "/usr/local/lib/X11/mini-icons/$BASEONEIMAGE" >> ./$APKGNAME.files
    done
    sync
    #...images.files is appended to the .files file further down.
    #window and menu icons can also be in the top-level directory of the package...
    mkdir -p ${DIRECTSAVEPATH}/usr/local/lib/X11/pixmaps #v2.21
    mkdir -p ${DIRECTSAVEPATH}/usr/local/lib/X11/mini-icons #v2.21
    mv ./$APKGNAME/*24.xpm ${DIRECTSAVEPATH}/usr/local/lib/X11/pixmaps/ 2>/dev/null
    mv ./$APKGNAME/*32.xpm ${DIRECTSAVEPATH}/usr/local/lib/X11/pixmaps/ 2>/dev/null
    mv ./$APKGNAME/*32.png ${DIRECTSAVEPATH}/usr/local/lib/X11/pixmaps/ 2>/dev/null
    mv ./$APKGNAME/*48.xpm ${DIRECTSAVEPATH}/usr/local/lib/X11/pixmaps/ 2>/dev/null
    mv ./$APKGNAME/*48.png ${DIRECTSAVEPATH}/usr/local/lib/X11/pixmaps/ 2>/dev/null
    mv ./$APKGNAME/*.xpm ${DIRECTSAVEPATH}/usr/local/lib/X11/mini-icons/ 2>/dev/null
    mv ./$APKGNAME/*.png ${DIRECTSAVEPATH}/usr/local/lib/X11/mini-icons/ 2>/dev/null #v2.16
    #now copy files to destination...
     #v1.0.5
     #problem if jwm or fvwm95 not installed by Unleashed. Unleashed createpuppy script
     #installs .jwmrc and .fvwm95rc anyway and processes them, so do not overwrite them
     #if install jwm or fvwm95 pets now...
     cp -f /root/.fvwm95rc /tmp/fvwm95rcBACKUP
     cp -f /root/.jwmrc /tmp/jwmrcBACKUP
     cp -f /root/.icewm/menu /tmp/icemenuBACKUP
     
    
    cp -a --remove-destination ./$APKGNAME/* ${DIRECTSAVEPATH}/ 2> /tmp/petget-cp-errlog
    if [ -s /tmp/petget-cp-errlog ];then
     cat /tmp/petget-cp-errlog | grep 'cannot overwrite non-directory' | cut -f 1 -d "'" | cut -f 2 -d '`' |
     while read ONEDIRSYMLINK
     do
      #adding that extra trailing / does the trick...
      cp -a --remove-destination ./${APKGNAME}${ONEDIRSYMLINK}/* ${DIRECTSAVEPATH}${ONEDIRSYMLINK}/
     done
    fi
    sync
    
    #v2.21 flush unionfs cache...
    if [ "$DIRECTSAVEPATH" != "" ];then
     #but first, clean out any bad whiteout files...
     find $SNAP -mount -type f -name .wh.\* |
     while read ONEWHITEOUT
     do
      ONEWHITEOUTFILE="`basename "$ONEWHITEOUT"`"
      ONEWHITEOUTPATH="`dirname "$ONEWHITEOUT"`"
      if [ "$ONEWHITEOUTFILE" = ".wh.__dir_opaque" ];then
       [ "`grep "$ONEWHITEOUTPATH" /root/.packages/${APKGNAME}.files`" != "" ] && rm -f "$ONEWHITEOUT"
       continue
      fi
      ONEPATTERN="`echo -n "$ONEWHITEOUT" | sed -e 's%/\.wh\.%/%'`"'$'
      [ "`grep "$ONEPATTERN" /root/.packages/${APKGNAME}.files`" != "" ] && rm -f "$ONEWHITEOUT"
     done
     #now re-evaluate all the layers...
     mount -t unionfs -o remount,incgen unionfs /
     #sleep 1
     sync
    fi
    
     #now restore w.m. config files...
     cp -f /tmp/fvwm95rcBACKUP /root/.fvwm95rc
     cp -f /tmp/jwmrcBACKUP /root/.jwmrc
     cp -f /tmp/icemenuBACKUP /root/.icewm/menu
    if [ -f ./$APKGNAME/pinstall.sh ];then
     cd /
     /pinstall.sh #execute post-install script.
     rm -f /pinstall.sh
     cd $WKGDIR #/root/.packages
    fi
    if [ -d ./$APKGNAME ];then
    
     if [ -d /install ];then #slackware pkg installs this.
      #for now, do nothing with this, just delete it...
      #no, let's run the install script...
      if [ -f /install/doinst.sh ];then
       chmod +x /install/doinst.sh
       cd /
       sh /install/doinst.sh
       cd $WKGDIR
      fi
      rm -rf /install
     fi

     #there should be a '$APKGNAME.pet.specs' file created by pup2pet script...
     #this has variables PETMENUDESCR, PETOFFICIALDEPS, PETREGISTER...
     [ -f /${APKGNAME}.pet.specs ] && rm -f /${APKGNAME}.pet.specs #this got installed too.
     PETREGISTER="";PETMENUDESCR="";PETOFFICIALDEPS=""
     if [ -f $WKGDIR/$APKGNAME/${APKGNAME}.pet.specs ];then
. $WKGDIR/$APKGNAME/${APKGNAME}.pet.specs
     else
      PETMENUDESCR=''
      PETOFFICIALDEPS=''
      PETREGISTER='yes'
     fi
     
     yaf-splash -font "8x16" -outline 0 -margin 4 -bg orange -text "Менеджер пакетов PETget. 
Обновляется меню, пожалуйста подождите..." & #9x15B also looks okay.
     MENUPID=$!
     #master help index has to be updated...
     #to speed things up, find the help files in the new pkg only...
     /usr/sbin/indexgen.sh ${WKGDIR}/${APKGNAME}
     #Reconstruct configuration files for JWM, Fvwm95, IceWM...
     /usr/sbin/fixmenus
     kill $MENUPID
     
     #this usually only applies to an alien pkg...
     if [ "$PETREGISTER" = "no" ];then
      gxmessage -encoding UTF-8 "PET-пакет ${APKGNAME}.pet установлен.
Но он не зарегистрирован в PETget, а значит, не может быть удалён."
      exit
     fi

     ADESKTOPFILE="`cat $WKGDIR/${APKGNAME}.files | grep '\.desktop$' | head -n 1`"
     #display a message that pkg installed, with useful info...
     AMSG="Примечание 1: У этого приложения ОТСУТСТВУЕТ своя запись в меню."
     if [ ! "$ADESKTOPFILE" = "" ];then
      ACATEGORY="`cat $ADESKTOPFILE | grep '^Categories='  | cut -f 2 -d '=' | sed -e 's/.*;//g'`"
      APATTERN="[ ,]${ACATEGORY}$"
      TOPMENU="`cat /etc/xdg/menus/hierarchy | grep "${APATTERN}" | cut -f 1 -d ' '`"
      if [ "$TOPMENU" = "" ];then
       APATTERN="[ ,]${ACATEGORY},"
       TOPMENU="`cat /etc/xdg/menus/hierarchy | grep "${APATTERN}" | cut -f 1 -d ' '`"
      fi
      AMENUDESCR="`cat $ADESKTOPFILE | grep '^Name=' | cut -f 2 -d '='`"
      AMSG="В категории '${TOPMENU}' меню создана новая запись 
'${AMENUDESCR}'
ОДНАКО, необходимо перезапустить оконный менеджер, чтобы её увидеть
(см. меню 'Выключение' или 'Окно')

Примечание 1: В /root/.packages/${APKGNAME}.files
             есть список установленных файлов."
     fi

     #dependency check code...
     yaf-splash -font "8x16" -outline 0 -margin 4 -bg orange -text "Менеджер пакетов PETget
проверяет зависимости, пожалуйста подождите..." & #9x15B also looks okay.
     DEPSPID=$!
     dependcheckfunc #function to check dependencies.
     kill $DEPSPID
     rm -rf ./$APKGNAME
     if [ -s /tmp/missinglibs.txt ];then
      if [ ! "$DISABLEDX" = "yes" ];then
       if [ "$FLAGDEPPKG" = "yes" ];then
        WARNLIB="ВНИМАНИЕ: Менеджер пакетов PETget поместил недостающие пакеты в очередь и позже спросит Вас, хотите ли Вы их установить."
       else
        WARNLIB="Менеджер пакетов PETget не знает, к какому пакету относятся данные библиотеки."
       fi
#       gxmessage -name "pet" -bg "#80ff80" -center -title "PETget" "SUCCESS: $APKGNAME is installed!
#
#${AMSG}
#NOTE 2: If installed any library, X server, browser, you must reboot Puppy.
#
#HOWEVER, these dependencies required by this package are missing:
#`cat /tmp/missinglibs.txt`
#
#$WARNLIB"
       xMISSINGLIBS="`cat /tmp/missinglibs.txt | tr '"' "'"`"
       DLG_REG2="
 <wtitle>Менеджер пакетов PETget</wtitle>
 <vbox>
  <pixmap><input file>/usr/local/lib/X11/pixmaps/ok.xpm</input></pixmap>
  <text><label>\"ГОТОВО: ${APKGNAME} установлен!

${AMSG}
Примечание 2: Если вы установили библиотеку, Х-сервер или браузер,
             то следует перезагрузить систему.\"</label></text>
  <pixmap><input file>/usr/local/lib/X11/pixmaps/error.xpm</input></pixmap>
  <text><label>\"ОДНАКО, данные зависимости не удовлетворены:
${xMISSINGLIBS}

${WARNLIB}\"</label></text>
  <text><label>\"  \"</label></text>
  <hbox>
  <button><input file>/usr/local/lib/X11/mini-icons/mini-tick.xpm</input><label>OK</label><action>EXIT:10</action></button>
  </hbox>
 </vbox>"
       echo "$DLG_REG2" | gtkdialog2 --stdin
      fi
     else
      if [ ! "$DISABLEDX" = "yes" ];then
#       gxmessage -name "pet" -bg "#80ff80" -center -title "PETget" "SUCCESS: $APKGNAME is installed!
#
#${AMSG}
#NOTE 2: If installed any library, X server, browser, you must reboot Puppy."
       DLG_REG3="
 <wtitle>Менеджер пакетов PETget</wtitle>
 <vbox>
  <pixmap><input file>/usr/local/lib/X11/pixmaps/ok.xpm</input></pixmap>
  <text><label>\"ГОТОВО: ${APKGNAME} установлен!\"</label></text>
  <text><label>\"
${AMSG}
Примечание 2: Если вы установили библиотеку, Х-сервер или браузер,
             то следует перезагрузить систему.\"</label></text>
  <text><label>\"  \"</label></text>
  <hbox>
   <button><input file>/usr/local/lib/X11/mini-icons/mini-tick.xpm</input><label>OK</label><action>EXIT:10</action></button>
  </hbox>
 </vbox>"
       echo "$DLG_REG3" | gtkdialog2 --stdin

      fi
     fi
    
    else
     if [ ! "$DISABLEDX" = "yes" ];then
      gxmessage -encoding UTF-8 -name "pet" -bg "#ff8080" -center -title "PETget" "ОШИБКА: что-то пошло неправильно. $APKGNAME не установлен"
     fi
     RETSTATUS=1
    fi
    rm -f ./$APKGNAME.tar.gz
} #end installpkgfunc()


#v2.14 install a .pup package (embedded in a pet pkg)...
installpupfunc() {
 #location of .pup: ./$APKGNAME/${APKGNAME}.pup
 #current dir is /root/.packages, which WKGDIR is set to, but use variable.
 #some code based on 'dotpuprox.sh' written by GuestToo
 
 #save window manager config files, as will ignore what dotpup does to them...
 cp -f /root/.icewm/menu /tmp/WMBACKUP-menu
 cp -f /root/.jwmrc /tmp/WMBACKUP-jwmrc
 cp -f /root/.fvwm95rc /tmp/WMBACKUP-fvwm95rc
 #ditto these...
 cp -f $WKGDIR/alienpackages.txt /tmp/BACKUP-alienpackages.txt
 
 if ! unzip -t "$WKGDIR/$APKGNAME/${APKGNAME}.pup"
 then
  gxmessage -encoding UTF-8 -bg red -center -title "Ошибка PETget" "Пакет ${APKGNAME}.pet - это переделанный пакет .pup,
 однако исходный файл ${APKGNAME}.pup, по видимому,
содержал ошибку.
Поэтому PETget прекращает установку..."
  return 1
 fi
 cd "$WKGDIR/$APKGNAME"
 if ! unzip -o "./${APKGNAME}.pup"
 then
  gxmessage -encoding UTF-8 -bg red -center -title "Ошибка PETget" "Пакет ${APKGNAME}.pet - это переделанный пакет .pup,
 однако исходный файл ${APKGNAME}.pup, по видимому,
содержал ошибку.
Поэтому PETget прекращает установку..."

  return 1
 fi
 rm -f ./${APKGNAME}.pup
 chmod a+x dotpup.sh
 #give full path just in case script wants it...
 installwatch -o /tmp/pupinstall.list $WKGDIR/$APKGNAME/dotpup.sh
 cd $WKGDIR
 
 #there should be a '$APKGNAME.pet.specs' file created by pup2pet script...
 if [ -f $WKGDIR/$APKGNAME/${APKGNAME}.pet.specs ];then #precaution.
. $WKGDIR/$APKGNAME/${APKGNAME}.pet.specs
 else
  PETMENUDESCR=''
  PETOFFICIALDEPS=''
  PETREGISTER='yes'
 fi

 yaf-splash -font "8x16" -outline 0 -margin 4 -bg orange -text "Менеджер пакетов PETget 
обновляет базу данных, пожалуйста подождите..." & #9x15B also looks okay.
 MENUPID=$!
 #master help index has to be updated...
 /usr/sbin/indexgen.sh ${WKGDIR}/${APKGNAME}
 #Reconstruct configuration files for JWM, Fvwm95, IceWM...
 /usr/sbin/fixmenus
 kill $MENUPID
     
 #create list of installed files...
 #last sed fixes a bug in .pup install script...
 cat /tmp/pupinstall.list | grep '#success$' | tr -s '\t' | tr '&' ' ' | tr '\t' '&' | grep '^4&open&' | grep --extended-regexp -v '&/dev/tty&|&/dev/null&|&/root/.packages/|&/tmp/|&/root/.icewm/|&/proc/|&/sys/' | cut -f 3 -d '&' | sed -e 's/^\/\//\//g' > /tmp/${APKGNAME}.files
 sync
 if [ ! -s /tmp/${APKGNAME}.files ];then
  #nothing got installed.
  #sometimes the dotpup installer has an option to abort the install.
  return 1
 fi

 #difficult task, separate package name from version part... 
 #not perfect, some start with non-numeric version info...
 ANAMEONLY="`echo -n "$APKGNAME" | sed -e 's/\-[0-9].*$//g'`"
 #...if that fails, do it the old way...
 [ "$ANAMEONLY" = "$APKGNAME" ] && ANAMEONLY="`echo "$APKGNAME" | cut -f 1 -d "-"`"

 #a dotpup or pet package could just be a bugfix or patch and do not want to
 #register it....
 if [ "$PETREGISTER" = "no" ];then #this is in the .specs file.
  #get rid of whatever dotpup registered with petget
  rm -f $WKGDIR/${APKGNAME}.files 2>/dev/null
  rm -f $WKGDIR/${APKGNAME}.keyword 2>/dev/null
  rm -f $WKGDIR/${APKGNAME}.remove 2>/dev/null
  #restore config files maybe modified by dotpup installer...
  cp -f /tmp/WMBACKUP-menu /root/.icewm/menu
  cp -f /tmp/WMBACKUP-jwmrc /root/.jwmrc
  cp -f /tmp/WMBACKUP-fvwm95rc /root/.fvwm95rc
  cp -f /tmp/BACKUP-alienpackages.txt $WKGDIR/alienpackages.txt
  return 0
 fi
 
 #get rid of whatever dotpup registered with petget (except .remove file)...
 #also wipe any earlier version...
 mv -f $WKGDIR/${APKGNAME}.remove /tmp/${APKGNAME}.remove
 rm -f $WKGDIR/${ANAMEONLY}*.files 2>/dev/null
 rm -f $WKGDIR/${ANAMEONLY}*.keyword 2>/dev/null
 rm -f $WKGDIR/${ANAMEONLY}*.remove 2>/dev/null
 mv -f /tmp/${APKGNAME}.remove $WKGDIR/${APKGNAME}.remove

 #the pup2pet script has the option of creating a .desktop file that will
 #override one already in the .pup package...
 if [ -f $WKGDIR/$APKGNAME/${ANAMEONLY}.desktop ];then
  #[ -f /usr/share/applications/${APKGNAME}.desktop ] && rm -f /usr/share/applications/${APKGNAME}.desktop
  #[ -f /usr/local/share/applications/${APKGNAME}.desktop ] && rm -f /usr/local/share/applications/${APKGNAME}.desktop
  rm -f `cat /tmp/${APKGNAME}.files | grep '\.desktop$' | head -n 1`
  cp -af $WKGDIR/$APKGNAME/${ANAMEONLY}.desktop /usr/share/applications/
  cat /tmp/${APKGNAME}.files | grep -v '\.desktop$' > /tmp/tempccc
  sync
  echo "/usr/share/applications/${ANAMEONLY}.desktop" >> /tmp/tempccc
  mv -f /tmp/tempccc /tmp/${APKGNAME}.files
 fi
 
 #restore config files maybe modified by dotpup installer...
 cp -f /tmp/WMBACKUP-menu /root/.icewm/menu
 cp -f /tmp/WMBACKUP-jwmrc /root/.jwmrc
 cp -f /tmp/WMBACKUP-fvwm95rc /root/.fvwm95rc
 cp -f /tmp/BACKUP-alienpackages.txt $WKGDIR/alienpackages.txt
 
 AMSGBAD3=""
 touch $WKGDIR/alienpackages.txt #create if doesn't exist.
 #remove an earlier entry, in case overriding (maybe earlier version)...
 apattern="s/${ANAMEONLY}//g"
 AVERONLY="`echo -n "$APKGNAME" | sed -e "$apattern" | sed -e 's/^\-//'`" #v3.98
 if [ "$AVERONLY" = "" ];then
  AMSGBAD3="
ВНИМАНИЕ: НЕВЕРНОЕ ИМЯ ПАКЕТА $APKGNAME
         Имена пакетов должны содержать число после знака '-'
         для четкого формирования информации о версии.
         Пример: abiword-0.5.6
         Если устанавливаются более поздние версии пакета,
         информация о предшествующих версиях не будет удалена."
 else
  WPATTERN="^\"${ANAMEONLY}\-"
  cat $WKGDIR/alienpackages.txt | grep -v "$WPATTERN" > /tmp/tmpaliens
  sync
  mv -f /tmp/tmpaliens $WKGDIR/alienpackages.txt
 fi
 #create an entry in alienpackages.txt...
 #PET* variables are from the .specs file (see above)...
 #v3.02 space between name and version...
 #echo -e "\"${APKGNAME}\" \"${APKGNAME}: ${PETMENUDESCR}\" on \" ${PETOFFICIALDEPS} \" \\" >> $WKGDIR/alienpackages.txt
 echo -e "\"${APKGNAME}\" \"${ANAMEONLY} ${AVERONLY}: ${PETMENUDESCR}\" on \" ${PETOFFICIALDEPS} \" \\" >> $WKGDIR/alienpackages.txt
 #create list of installed files...
 mv -f /tmp/${APKGNAME}.files $WKGDIR/${APKGNAME}.files
 sync

 #.desktop sanity check...
 AMSGBAD1="";AMSGBAD2=""
 ADESKTOPFILE="`cat $WKGDIR/${APKGNAME}.files | grep '\.desktop$' | head -n 1`"
 if [ ! "$ADESKTOPFILE" = "" ];then
  AEXEC="`cat $ADESKTOPFILE | grep '^Exec=' | cut -f 2 -d '='`"
  FAEXEC="bad"
  [ ! "`which $AEXEC`" = "" ] && [ -x $AEXEC ] && FAEXEC="okay"
  #this is for a really bad dotpup I came across, tries to execute an image file...
  [ ! "`echo -n "$AEXEC" | grep --extended-regexp 'xpm$|png$|jpg$|gif$'`" = "" ] && FAEXEC="bad"
  if [ "$FAEXEC" = "bad" ];then
   AMSGBAD1="
ТРЕВОГА: ИСПРАВИТЬ! $AEXEC
        (упомянутый в ${ADESKTOPFILE})
         - исполняемый файл, запускаемый из меню, но это неверно."
  fi
  AICON="`cat $ADESKTOPFILE | grep '^Icon=' | cut -f 2 -d '='`"
  FAICON="bad"
  #get full path of icon...
  [ ! "`echo -n "$AICON" | cut -b 1`" = "/" ] && AICON="/usr/local/lib/X11/mini-icons/$AICON"
  #icon is bad if it is not 16x16...
  [ ! "`echo -n "$AICON" | grep '\.xpm$'`" = "" ] && TAICON="xpmtoppm"
  [ ! "`echo -n "$AICON" | grep '\.png$'`" = "" ] && TAICON="pngtopnm"
  [ ! "`echo -n "$AICON" | grep '\.gif$'`" = "" ] && TAICON="giftopnm"
  [ ! "`echo -n "$AICON" | grep '\.jpg$'`" = "" ] && TAICON="jpegtopnm"
  if [ "`$TAICON $AICON | pamfile | grep ' 16 by 16 '`" = "" ];then
   AMSGBAD2="
ВНИМАНИЕ: ИСПРАВИТЬ!  $ICON 
         (упомянутая в ${ADESKTOPFILE})
         и используемый в меню картинка - не 16x16, и может неверно отображаться!"
  fi
 fi

 #dependency check code...
 yaf-splash -font "8x16" -outline 0 -margin 4 -bg orange -text "Менеджер пакетов PETget 
проверяет зависимости, пожалуйста подождите..." & #9x15B also looks okay.
 DEPSPID=$!
 dependcheckfunc #function to check dependencies.
 kill $DEPSPID
 AMSG2=""
 if [ -s /tmp/missinglibs.txt ];then
  #if [ "$FLAGDEPPKG" = "yes" ];then
  AMSG2="
ВАЖНО:
`cat /tmp/missinglibs.txt`

Примечание: Зависимые пакеты, показанные без номеров версий - официальные PET:
нажмите на значок 'Установка', чтобы установить их из официальных репозитариев
PET-пакетов Puppy в Интернете. Если у недостающего пакета есть номер версии,
то он - неофициальный, и Вам надо загрузить его (с 'неофициального' сайта),
тогда просто щёлкните на нём мышью для его установки."
 fi

 #display a message that pkg installed, with useful info...
 AMSG="Данное приложения НЕ представлено в меню.
Примечание: Некоторые Pup-пакеты создают свою запись в меню в отдельной категории,
однако такой способ больше не поддерживается, и, если скрипт установки Pup-пакета
пытается создать такую запись, то он игнорируется. Все .pet-пакеты (и переделанные
Pup-пакеты) должны содержать файл .desktop."
 if [ ! "$ADESKTOPFILE" = "" ];then
  ACATEGORY="`cat $ADESKTOPFILE | grep '^Categories='  | cut -f 2 -d '=' | sed -e 's/.*;//g'`"
  APATTERN="[ ,]${ACATEGORY}"
  TOPMENU="`cat /etc/xdg/menus/hierarchy | grep "${APATTERN}" | cut -f 1 -d ' '`"
  AMENUDESCR="`cat $ADESKTOPFILE | grep '^Name=' | cut -f 2 -d '='`"
  AMSG="Создана запись '${AMENUDESCR}' в разделе
меню '${TOPMENU}'
ОДНАКО, необходимо перезапустить оконный менеджер, чтобы её увидеть.
(см. разделы меню 'Выключение' или 'Окно')

Примечание:
Если Вы хотите знать, какие именно файлы были установлены, просмотрите
файл /root/.packages/${APKGNAME}.files в текстовом редакторе."
 fi
# gxmessage -bg green -center -title "PETget package manager" "Package ${APKGNAME}.pet has been successfully installed.
#Note that this is a converted DotPup package, ${APKGNAME}.pup.
#
#${AMSG}
#${AMSG2}
#${AMSGBAD1}${AMSGBAD2}${AMSGBAD3}"
 DLG_REG7="
 <wtitle>Менеджер пакетов PETget</wtitle>
 <vbox>
  <pixmap><input file>/usr/local/lib/X11/pixmaps/ok.xpm</input></pixmap>
  <text><label>\"Пакет ${APKGNAME}.pet успешно установлен.
Но помните, что он был конвертирован из Pup-пакета, ${APKGNAME}.pup.

${AMSG}
${AMSG2}
${AMSGBAD1}${AMSGBAD2}${AMSGBAD3}\"</label></text>
  <text><label>\"  \"</label></text>
  <hbox>
   <button><input file>/usr/local/lib/X11/mini-icons/mini-tick.xpm</input><label>OK</label><action>EXIT:10</action></button>
  </hbox>
 </vbox>"
 echo "$DLG_REG7" | gtkdialog2 --stdin
 
 return 0
} #end installpupfunc

##livepackages.txt is the list of packages that can be installed or removed...
#if [ ! -f $WKGDIR/livepackages.txt ];then
# touch livepackages.txt
#fi
#created further down...

if [ -f $WKGDIR/alienpackages.txt ];then #IF2508
#v1.0.3 users may be installing alien packages, there is risk of alienpackages.txt getting
#wrongly formatted...
#correct format: "qhacc-3.3" "qhacc-3.3: Accounting" on "QT3APPS 3104K" \
#note, grep is looking for " \" but Ash firstly interpretes, then grep, so need ' \\\\'...
OKLINES="`cat $WKGDIR/alienpackages.txt | cut -f 7 -d '"' | grep ' \\\\' | wc -l`"
# ' need this to fix syntax highlighting in Geany.
ALLLINES="`cat $WKGDIR/alienpackages.txt | wc -l`"
if [ ! "$OKLINES" = "$ALLLINES" ];then
 if [ ! "$DISABLEDX" = "yes" ];then
  gxmessage -encoding UTF-8 -font "mono 14" -center -name "pet" -bg "#ff8080" -title "Менеджер пакетов PETget: ОШИБКА" "Ошибка форматирования в $WKGDIR/alienpackages.txt
Возможно, скрипт установки данного пакета добавил в этот файл строку
неверного формата. Просмотрите текст этого файла и определите пакет,
нарушающий систему. Тогда Вы сможете исправить ошибку вручную, а 
потом сообщить создателю пакета, что установка не проходит. 
-- это также может оказаться ошибкой в установщике Pup-пакетов.

Элементы в alienpackages.txt должны быть форматированы так:
\"qhacc-3.3\" \"qhacc-3.3: Accounting\" on \"QT3APPS 3104K\" \\
Запись должна быть в точности такой - без лишних пробелов, без
лишних или недостающих кавычек, \ с пробелом в конце. Без пустых строк.
В конце последней строки должен стоять RETURN.

Подтвердите выход из менеджера PETget..."
 fi
 exit
fi
fi #IF2508

#clicked on a pet pkg, ask if want to install...
if [ ! "$COMMANDPKG" = "" ];then
 if [ "$CMD1STCHAR" = "/" ];then
  #difficult task, separate package name from version part... 
  #not perfect, some start with non-numeric version info...
  zPKGNAME="`basename "$ROXCMD" .pet`"
  NAMEONLY="`echo -n "$zPKGNAME" | sed -e 's/\-[0-9].*$//g'`"
  #...if that fails, do it the old way...
  [ "$NAMEONLY" = "$zPKGNAME" ] && NAMEONLY="`echo "$zPKGNAME" | cut -f 1 -d "-"`"
  QPATTERN="^${NAMEONLY}\\-"
  PRELABEL2=" "
  PRELABEL1="Добро пожаловать! Вы выбрали пакет $zPKGNAME"
  if [ ! "`ls -1 /root/.packages | grep "$QPATTERN"`" = "" ];then
   PRELABEL2="ВНИМАНИЕ: Пакет '${NAMEONLY}' уже установлен!"
  fi
  #v2.14 dlg to confirm install when clicked in rox...
  DLGQ="
 <wtitle>Менеджер пакетов PETget</wtitle>
 <vbox>
  <pixmap><input file>/usr/local/lib/X11/pixmaps/question.xpm</input></pixmap>
  <text><label>\"${PRELABEL1}\"</label></text>
  <text><label>\"${PRELABEL2}\"</label></text>
  <text><label>\" \"</label></text>
  <hbox>
   <button><input file>/usr/local/lib/X11/mini-icons/mini-tick.xpm</input><label>УСТАНОВИТЬ ПАКЕТ</label><action>EXIT:10</action></button>
   <text><label>\" \"</label></text>
   <button><input file>/usr/local/lib/X11/mini-icons/mini-cross.xpm</input><label>ПРЕРВАТЬ УСТАНОВКУ</label><action>EXIT:11</action></button>
  </hbox>
 </vbox>"
  RETVAL="`echo "$DLGQ" | gtkdialog2 --stdin | grep 'EXIT:' | cut -f 2 -d ':'`"
  [ ! "$RETVAL" = "10" ] && exit
 fi
fi

UNLEASHEDPKGS="`cat $WKGDIR/packages.txt`" #this is file from Unleashed.

#v2.14 livepackages.txt gets updated in rc.update, first creation here...
#um, rc.update now creates it, so this not necessary. but precaution...
if [ ! -f $WKGDIR/livepackages${modPUPREPO}.txt ];then #v3.99
 #livepackages.txt has all packages that were not installed by Unleashed...
 #this updates livepackages.txt when packages.txt is updated...
 #code here adds any new "off" packages from packages.txt to livepackages.txt...
 #note, backslash upsets newline char for piping, so escape it (shell and sed both)...
  touch  $WKGDIR/livepackages${modPUPREPO}.txt #v3.99
  cat  $WKGDIR/packages.txt | grep '" off "' >> /root/.packages/livepackages${modPUPREPO}.txt #v3.99
  sync
fi
#v2.14 if a bug and livepackages.txt gets emptied somehow, fix...
if [ ! -s $WKGDIR/livepackages${modPUPREPO}.txt ];then #v3.99
 #livepackages.txt is empty...
 #fill it up...
 cat  $WKGDIR/packages.txt | grep '" off "' >> /root/.packages/livepackages${modPUPREPO}.txt #v3.99
 sync
 #repair, turn on any installed official pkgs...
 for ONEFILE in `ls -1 $WKGDIR/*.files | tr '\n' ' '`
 do
  #turn entry on...
  APKGNAME="`basename $ONEFILE .files`"
  #escapes the '-' and '.' chars in pkg name...
  mAPKGNAME="`echo -n "$APKGNAME" | sed -e 's/\-/\\\-/g' | sed -e 's/\./\\\./g'`"
  #changes off to on...
  mPATTERN="s/\(^\"$mAPKGNAME\" \".*\"\) off \"/\1 on \"/g"
  cat $WKGDIR/livepackages${modPUPREPO}.txt | sed -e "$mPATTERN" > /tmp/newlivepackages.txt #v3.99
  sync
  mv -f /tmp/newlivepackages.txt $WKGDIR/livepackages${modPUPREPO}.txt
 done
fi

if [ "$COMMANDPKG" = "" ];then #v1.0.5

 #v2.0.0
 RETVAL="`echo "$DLG1" | gtkdialog2 --stdin | grep 'EXIT:' | cut -f 2 -d ':'`"
 [ ! "$RETVAL" ] && RETVAL=19
 echo "RETVAL=$RETVAL"

else
 #noninteractive, install or remove a pkg.
 RETVAL=10
 #if have clicked on a .pet from Rox, is it an alien package?...
 if [ "$CMD1STCHAR" = "/" ];then
  #ROXCMD=/full/path/pkgname.pet
  YPATTERN="^\"`basename "$ROXCMD" .pet`\" "
  cat $WKGDIR/packages.txt | grep "$YPATTERN"
  [ $? -ne 0 ] && RETVAL=13 #0=found >0=not found. alien package.
 fi
fi

case $RETVAL in
 10) #continue script.
  PKGUNLEASHED="yes"
  ;;
 11) #check dependencies.
  cp -f ./livepackages${modPUPREPO}.txt /tmp/zippidoodah.txt #v3.99
  if [ -f ./alienpackages.txt ];then
   cat ./alienpackages.txt >> /tmp/zippidoodah.txt
  fi
  PKGSONLIST="`cat /tmp/zippidoodah.txt | grep '" on "'`"
  if [ ! "$PKGSONLIST" = "" ];then
   rm -f /tmp/rettags.txt
   echo '#!/bin/sh' > /tmp/pkgdialog
   echo 'RETTAGS="`Xdialog --title "Менеджер пакетов PETget: проверка зависимостей" --left --stdout  --item-help --icon "/usr/local/lib/X11/pixmaps/pet48x.png" --no-cancel --no-tags --radiolist "Выберите пакет, зависимости которого Вы хотите проверить,\nиными словами, проверить наличие всех необходимых для него библиотек и пакетов..." 460x270+0+0 0 \' >> /tmp/pkgdialog
   echo "$PKGSONLIST" >> /tmp/pkgdialog
   echo ' `"' >> /tmp/pkgdialog
   echo 'if [ ! $? -eq 0 ];then' >> /tmp/pkgdialog
   echo ' exit'  >> /tmp/pkgdialog
   echo 'fi' >> /tmp/pkgdialog
   echo 'echo "$RETTAGS" > /tmp/rettags.txt' >> /tmp/pkgdialog
   sync #` geany fix.
   chmod 755 /tmp/pkgdialog
   /tmp/pkgdialog
   APKGNAME="`cat /tmp/rettags.txt 2> /dev/null`"
   if [ "$APKGNAME" = "" ];then
    exit
   fi
   yaf-splash -font "8x16" -outline 0 -margin 4 -bg orange -text "Менеджер пакетов PETget 
проверяет зависимости. Пожалуйста подождите..." & #9x15B also looks okay.
   DEPSPID=$!
   dependcheckfunc #function.
   kill $DEPSPID
   if [ -s /tmp/missinglibs.txt ];then
    if [ "$FLAGDEPPKG" = "yes" ];then
     WARNLIB="ВАЖНО: Рекомендуется установить недостающие пакеты."
    else
     WARNLIB="Менеджер пакетов PETget не знает, к какому пакету (или пакетам) относятся данные библиотеки."
    fi
    if [ ! "$DISABLEDX" = "yes" ];then
     gxmessage -encoding UTF-8 -font "mono 14" -name "pet" -bg "#ff8080" -center -title "PETget: проверка зависимостей ПОКАЗАЛА" "Для установки пакета $APKGNAME надо удовлетворить следующие зависимости:
`cat /tmp/missinglibs.txt`

$WARNLIB"
    fi
   else
    if [ ! "$DISABLEDX" = "yes" ];then
     gxmessage -encoding UTF-8 -name "pet" -bg "green" -center -title "PETget: проверка звисимостей ПОКАЗАЛА" "Все зависимости удовлетворены"
    fi
   fi
  fi
  exit
  ;;
 12)
  #exec mozilla http://www.puppylinux.org/wikka/DotPup
  exec dotpup
  ;;
 13) #Alien_package
  #ROXCMD is set if clicked on a .pet from Rox. Only comes here though
  #if the .pet is an alien package.
  if [ "$ROXCMD" = "" ];then #nothing on commandline.
   MSG9="PETget: Выберите PET-пакет"
   while [ 1 ];do
    #MU suggested add the 'tail -n 1'...
    ALIENFILE="`Xdialog --backtitle "Примечание: выберите файл с расширением '.pet'" --title "$MSG9" --stdout --no-buttons --fselect "/root/*" 0 0`"
    RETVAL=$?
    ALIENFILE="`echo -n "$ALIENFILE" | tail -n 1`"
    [ ! $RETVAL -eq 0 ] && exit
    [ -f $ALIENFILE ] && [ "`echo -n "$ALIENFILE" | grep -E '\.pet$|\.tar\.gz$'`" != "" ] && break
    MSG9="PETget: ЕЩЁ РАЗ, Выберите файл PET-пакета с расширением .pet"
   done
   sync
  else
   ALIENFILE="$ROXCMD"
  fi
  cp -af "$ALIENFILE" /root/.packages/ #copy, leave original.
  sync
  cd /root/.packages
  APKGNAMEEX="`basename $ALIENFILE`"
  
  #v2.13 test if enough space to expand tarball...
  #EXPFREEK=`df -k | grep ' /$' | tr -s ' ' | cut -f 4 -d ' '`
  EXPFREEB=`stat --filesystem --format=%f /` #no. free blocks. (1k blocks)
  EXPFILEB=`stat --format=%b $APKGNAMEEX` #no. blocks. (512byte blocks)
  #EXPNEEDB=`expr $EXPFILEB \* 2` #bz2 can expand up to x3, need twice temp space. v3.01 changed 5 to 3. v3.92 changed to 2.
  
  #v3.99 fix for differing block sizes, from lluamco...
  BLOCKFSSIZE=`stat --filesystem --format=%s /` #filesystem blocksize
  BLOCKFILESIZE=`stat --format=%B $APKGNAMEEX` # blockfilesize
  EXPNEEDB=$(($(($EXPFILEB*6))/(($BLOCKFSSIZE))*(($BLOCKFILESIZE))))
  
  #note, probably better to do like this: EXPNEEDB=$($(($EXPFREEB*3)))
  if [ $EXPNEEDB -gt $EXPFREEB ];then
   if [ ! "$DISABLEDX" = "yes" ];then
    gxmessage -encoding UTF-8 -center -name "pet" -bg "#ff8080" -title "PETget: ОШИБКА" "Пакет $APKGNAMEEX был загружен в /root/.packages,
но места для его распаковки и установки недостаточно.
Свободного места всего $EXPFREEB блоков, но 
для установки потребуется $EXPNEEDB блоков.

Примечание: Если у Вас подключён pup_save.3fs,
его можно увеличить -- см. меню Утилиты.

Сейчас пакет будет удалён и работа завершена..."
   fi
   echo "ОШИБКА: Недостаточно места на носителе."
   rm -f $APKGNAMEEX
   exit
  fi
  if [ ! "`echo "$APKGNAMEEX" | grep '\.pet$'`" = "" ];then
   pet2tgz $APKGNAMEEX
   APKGNAME="`echo "$APKGNAMEEX" | sed -e 's/\.pet$//g'`"
   APKGNAMEEX="${APKGNAME}.tar.gz"
  fi
  if [ ! "`echo "$APKGNAMEEX" | grep --extended-regexp "\.tgz$|\.tar\.gz$"`" = "" ];then
   #v2.13 '--absolute-names' needed for openoffice tarball to fix extraction error.
   tar --absolute-names -zxf $APKGNAMEEX
   APKGNAME="`echo "$APKGNAMEEX" | sed -e 's/\.tgz$//g' | sed -e 's/\.tar\.gz//g'`"
  fi
  if [ ! "`echo "$APKGNAMEEX" | grep --extended-regexp "\.tbz2$|\.tar\.bz2$"`" = "" ];then
   tar -jxf $APKGNAMEEX
   APKGNAME="`echo "$APKGNAMEEX" | sed -e 's/\.tbz2$//g' | sed -e 's/\.tar\.bz2$//g'`"
  fi
  if [ ! -d ./$APKGNAME ];then
   if [ ! "$DISABLEDX" = "yes" ];then
    gxmessage -encoding UTF-8 -font "mono 14" -center -name "pet" -bg "#ff8080" -title "PETget: при распаковке пакета ОШИБКА" "Недостаточно места для распаковки $APKGNAMEEX.
Либо файл повреждён, либо он не распаковался в собственную директорию
по имени $APKGNAME/ (это действие по умолчанию).
Вам следует перейти в директорию /root/.packages/ и очистить её.

Выходим из программы..."
   fi
   exit
  fi
  #v2.14 tgz2pet will embed a slackware-style binary tarball inside a directory
  #named APKGNAME, as the tarball expands direct to /...
  if [ -f $WKGDIR/$APKGNAME/${APKGNAME}.tar.gz ];then #tgz2pet also renames .tgz
   cd $WKGDIR/$APKGNAME/
   tar --absolute-names -zxf ./${APKGNAME}.tar.gz
   sync
   rm -f  ./${APKGNAME}.tar.gz
   cd $WKGDIR
  fi
  #v2.14 pup2pet converts .pup to .pet by embedding inside tarball...
  if [ -f $WKGDIR/$APKGNAME/${APKGNAME}.pup ];then #pup2pet created this.
   rm -f $WKGDIR/$APKGNAME.tar.gz
   installpupfunc #function call.
   rm -rf $WKGDIR/$APKGNAME
   exit
  fi

  #difficult task, separate package name from version part... 
  #not perfect, some start with non-numeric version info...
  ANAMEONLY="`echo -n "$APKGNAME" | sed -e 's/\-[0-9].*$//g'`"
  #...if that fails, do it the old way...
  [ "$ANAMEONLY" = "$APKGNAME" ] && ANAMEONLY="`echo "$APKGNAME" | cut -f 1 -d "-"`"

  #v3.02
  apattern="s/${ANAMEONLY}//g"
  AVERONLY="`echo -n "$APKGNAME" | sed -e "$apattern" | sed -e 's/^\-//'`" #v3.98

  APATTERN="s/.\/$APKGNAME//g"
  #need to find regular files and links separately...
  find ./$APKGNAME -type f -mount -mindepth 2 | sed -e "$APATTERN" | sed -e 's/\/root0\//\/root\//g' > ./$APKGNAME.files
  sync
  find ./$APKGNAME -type l -mount -mindepth 2 | sed -e "$APATTERN" | sed -e 's/\/root0\//\/root\//g' >> ./$APKGNAME.files
  sync

   #go ahead and install it...
#   gxmessage -borderless -font "DejaVu Sans 14" -center -bg "orange" -title "PETget" -buttons "" " PETget package manager
# Processing, please wait..." &
   installpkgfunc #function call.

   touch $WKGDIR/alienpackages.txt #create if doesn't exist.
   #remove an earlier entry, in case overriding (maybe earlier version)...
   WPATTERN="^\"${ANAMEONLY}\-"
   cat $WKGDIR/alienpackages.txt | grep -v "$WPATTERN" > /tmp/tmpaliens
   sync
   mv -f /tmp/tmpaliens $WKGDIR/alienpackages.txt
   #create an entry in alienpackages.txt...
   #PET* variables are from the .specs file (see above)...
   #v3.02 split name and version...
   echo -e "\"${APKGNAME}\" \"${ANAMEONLY} ${AVERONLY}: ${PETMENUDESCR}\" on \" ${PETOFFICIALDEPS} \" \\" >> $WKGDIR/alienpackages.txt

  exit
  # " Geany needs this!
  ;;
 *)
  exit
  ;;
esac

if [ ! "$DISABLEDX" = "yes" ];then
 yaf-splash -font "8x16" -outline 0 -margin 4 -bg orange -text "Менеджер пакетов PETget
работает. Пожалуйста подождите..." &
 PLEASEMSG=$!
fi




sort -u $WKGDIR/livepackages${modPUPREPO}.txt > /tmp/livepackages.txt #v3.99
sync
PACKAGESFND="`cat /tmp/livepackages.txt`"

cp -f $WKGDIR/livepackages${modPUPREPO}.txt /tmp/zippidoodah.txt #v3.99
sync
if [ -f $WKGDIR/alienpackages.txt ];then
 #v1.0.3 problem, could have gimp-2.0.6 off in livepackages.txt but on in alienpackages.txt
 #we don't want both lines, we only want the last line...
 ALIENONPKGS="`cat $WKGDIR/alienpackages.txt | grep '" on "' | cut -f 2 -d '"'`" # ' grrr, Geany again!
 for ONEONALIEN in $ALIENONPKGS
 do
  FPATTERN="^\"${ONEONALIEN}\" "
  cat /tmp/zippidoodah.txt | grep -v "$FPATTERN" > /tmp/templive.txt
  sync
  mv -f /tmp/templive.txt /tmp/zippidoodah.txt
 done
 sync
 cat $WKGDIR/alienpackages.txt >> /tmp/zippidoodah.txt
fi
sync

#this is the list of all pet/alien pkgs. 'on' if installed, 'off' if not...
ALLPKGSFND="`cat /tmp/zippidoodah.txt`"

[ ! "$DISABLEDX" = "yes" ] && kill $PLEASEMSG #killall xmessage

if [ "$COMMANDPKG" = "" ];then #IF2508 v1.0.5 
rm -f /tmp/rettags.txt
echo '#!/bin/sh' > /tmp/pkgdialog
echo 'RETTAGS="`Xdialog --title "Менеджер пакетов PETget" --left --stdout --separator " "  --item-help --icon "/usr/local/lib/X11/pixmaps/pet48.png" --ok-label "ДА" --cancel-label "НЕТ" --buildlist "Добавьте или удалите пакеты из Puppy. Для всех пакетов, которые Вы захотите добавить,\nВы сможете выбрать либо загрузку из Интернет, либо копирование из локальных директорий.\nВ левом столбце приведены официальные пакеты, которые можно установить. В правом столбце\nприведены уже установленные пакеты (официальные и неофициальные).\nНаведите курсор на любой пакет для получения информации о нём." 780x540+0+0 0 \' >> /tmp/pkgdialog
echo "$ALLPKGSFND" >> /tmp/pkgdialog
echo ' `"' >> /tmp/pkgdialog
echo 'if [ ! $? -eq 0 ];then' >> /tmp/pkgdialog
echo ' exit'  >> /tmp/pkgdialog
echo 'fi' >> /tmp/pkgdialog
echo 'echo "$RETTAGS" > /tmp/rettags.txt' >> /tmp/pkgdialog

# ` #fix highlighting for Geany.
sync
chmod 755 /tmp/pkgdialog
/tmp/pkgdialog
else #v1.0.5
 #noninteractive mode. COMMANDPKG has name of pkg to be added or removed.
 ALLONNAMES="`echo -n "$ALLPKGSFND" | grep '" on "' | cut -f 2 -d '"'`" #' geany fix.
 if [ "`echo -n "$COMMANDPKG" | cut -b 1`" = '+' ];then
  ADDONENAME="`echo "$COMMANDPKG" | cut -b 2-99`"
  ALLONNAMES="$ALLONNAMES
$ADDONENAME" #v3.99 bugfix.
 fi
 if [ "`echo "$COMMANDPKG" | cut -b 1`" = '-' ];then
  REMONENAME="`echo "$COMMANDPKG" | cut -b 2-99`"
  ronPATTERN='^'"$REMONENAME"'$' #v3.99 bugfix.
  ALLONNAMES="`echo -n "$ALLONNAMES" | grep -v "$ronPATTERN"`"
 fi
 echo -n "$ALLONNAMES" | tr "\n" " " > /tmp/rettags.txt
fi #IF2508

if [ ! -f /tmp/rettags.txt ];then
 exit
fi

yaf-splash -font "8x16" -outline 0 -margin 4 -bg orange -text "Менеджер пакетов PETget
работает. Пожалуйста подождите..." &
TAGSPID=$!

#/tmp/rettags.txt has all the tags (package names) chosen to be in Puppy.
#status field to "on", otherwise "off"...
#PACKAGESFND is the updated contender for livepackages.txt.
RETTAGS=" `cat /tmp/rettags.txt` "
#v2.14 only update livepackages.txt after a pkg actually installed or
#removed. but need to update now for determining what to install/remove...
echo -n "" > /tmp/plannedlivepackages.txt
echo "$PACKAGESFND" | sed -e 's/\\/\\\\/g' |
while read HEAD1ST
do
 APKGNAME="`echo "$HEAD1ST" | cut -f 2 -d '"'`" #' geany fix.
 EPATTERN=" ${APKGNAME} "
 if [ "`echo -n "$RETTAGS" | grep "${EPATTERN}"`" = "" ];then
  #make sure it is off...
  echo "$HEAD1ST" | sed -e 's/\" on \"/\" off \"/g' >> /tmp/plannedlivepackages.txt
 else
  #make sure it is on...
  echo "$HEAD1ST" | sed -e 's/\" off \"/\" on \"/g' >> /tmp/plannedlivepackages.txt
 fi
done
sync

echo
#now to find out which packages are to be installed or uninstalled...
#WARNING: packages.txt must not have a ">" character in it!
PKGSCHGD="`echo "$PACKAGESFND" | diff -B - /tmp/plannedlivepackages.txt | grep -v "\-\-\-" | grep '>' | cut -b 3-256`"
PKGS2ADD="`echo "$PKGSCHGD" | grep '" on "'`"
PKGS2REM="`echo "$PKGSCHGD" | grep '" off "'`"
rm -f /tmp/plannedlivepackages.txt

#v3.98
#it is possible that a pkg got individually installed before and is in alienpackage.txt...
RETTAGS=" `cat /tmp/rettags.txt` "
if [ -f $WKGDIR/alienpackages.txt -a "$PKGS2ADD" != "" ];then
 echo "$PKGS2ADD" > /tmp/pkgs2add.txt
 cat $WKGDIR/alienpackages.txt | sed -e 's/\\/\\\\/g' |
 while read HEAD1ST
 do
  APKGNAME="`echo "$HEAD1ST" | cut -f 2 -d '"'`"  # ' Geany needs this.
  EPATTERN=" ${APKGNAME} "
  BPATTERN="^\"${APKGNAME}\" "
  if [ "`echo -n "$RETTAGS" | grep "${EPATTERN}"`" != "" ];then
   #pkg already installed...
   PKGS2ADD="`cat /tmp/pkgs2add.txt | grep -v "$BPATTERN"`"
  fi
  #also check name-only as versions may be different...
  #TODO
  echo "$PKGS2ADD" > /tmp/pkgs2add.txt #as currently in separate process.
 done
 sync
 PKGS2ADD="`cat /tmp/pkgs2add.txt`"
fi


#also handle alien package removal...
RETTAGS=" `cat /tmp/rettags.txt` "
if [ -f $WKGDIR/alienpackages.txt ];then
 echo "$PKGS2REM" > /tmp/pkgs2rem.txt
 cat $WKGDIR/alienpackages.txt | sed -e 's/\\/\\\\/g' |
 while read HEAD1ST
 do
  APKGNAME="`echo "$HEAD1ST" | cut -f 2 -d '"'`"  # ' Geany needs this.
  EPATTERN=" ${APKGNAME} "
  BPATTERN="^\"${APKGNAME}\" "
  if [ "`echo -n "$RETTAGS" | grep "${EPATTERN}"`" = "" ];then
   if [ "$PKGS2REM" = "" ];then
    PKGS2REM="`cat $WKGDIR/alienpackages.txt | grep "$BPATTERN"`"
   else
    PKGS2REM="$PKGS2REM
`cat $WKGDIR/alienpackages.txt | grep "$BPATTERN"`"
   fi

  fi
  echo "$PKGS2REM" > /tmp/pkgs2rem.txt #as currently in separate process.
 done
 sync
 PKGS2REM="`cat /tmp/pkgs2rem.txt`"
fi

#how to uninstall?
#how to install?
#the working directory is /root/.packages/, i think will expand a package here first, extract a filelist,
#then move it to destination...

kill $TAGSPID

###########################PKGS2REM###################
if [ ! "$PKGS2REM" = "" ];then
 #v1.0.3 hiccup, see patch above, it is possible we can get duplicate entries here, if a pkg
 #is listed in both alienpackages.txt and livepackages.txt. use sort...
 PKGREMNAMES="`echo "$PKGS2REM" | cut -f 1 -d " " | sort -u | tr "\n" " "`"
 if [ ! "$DISABLEDX" = "yes" ];then
# gxmessage -center -name "pet" -bg "orange" -buttons "REMOVE:10,ABORT:11" "You have chosen to remove these packages from Puppy:
#$PKGREMNAMES
#
#Click REMOVE button to remove them...
#Click ABORT to exit from PETget package manager..."
#  if [ $? -ne 10 ];then

  xPKGREMNAMES="`echo -n "$PKGREMNAMES" | tr '"' "'"`"
  DLG_REM1="
 <wtitle>PETget package manager</wtitle>
 <vbox>
  <pixmap><input file>/usr/local/lib/X11/pixmaps/question.xpm</input></pixmap>
  <text><label>Вы собираетесь удалить данные пакеты из системы:</label></text>
  <text><label>$xPKGREMNAMES</label></text>
  <text><label>\"  \"</label></text>
  <hbox>
   <button><input file>/usr/local/lib/X11/mini-icons/mini.checkmark.xpm</input><label>УДАЛИТЬ</label><action>EXIT:10</action></button>
   <text><label>\" \"</label></text>
   <button><input file>/usr/local/lib/X11/mini-icons/mini-cross.xpm</input><label>Отменить удаление</label><action>EXIT:11</action></button>
  </hbox>
 </vbox>
"
  RETVAL="`echo "$DLG_REM1" | gtkdialog2 --stdin | grep 'EXIT:' | cut -f 2 -d ':'`"
  if [ ! "$RETVAL" = "10" ];then
#  restorefunc
  exit
 fi
#  gxmessage -borderless -font "DejaVu Sans 14" -center -bg "orange" -title "PETget" -buttons "" " PETget package manager
# 
# Processing, please wait..." &
#  yaf-splash -font "8x16" -outline 0 -margin 4 -bg orange -text "PETget package manager
#Processing, please wait..." &
#  MSGPID=$!
 fi

# #v1.0.6 if remove a w.m., leave its menu config file behind...
#     cp -f /root/.fvwm95rc /tmp/fvwm95rcBACKUP
#     cp -f /root/.jwmrc /tmp/jwmrcBACKUP
#     cp -f /root/.icewm/menu /tmp/icemenuBACKUP

 echo "$PKGS2REM" | sed -e 's/\\/\\\\/g' |
 while read HEAD1ST #WHILE-103A
 do
  yaf-splash -font "8x16" -outline 0 -margin 4 -bg orange -text "Менеджер пакетов PETget
работает. Пожалуйста подождите..." &
  MSGPID=$!
  APKGNAME="`echo "$HEAD1ST" | cut -f 2 -d '"'`"   # ' Geany needs this.
  QAPKGNAMEQ="^\"${APKGNAME}\""
  #$APKGNAME.files has the file list for the package...
  if [ -f $WKGDIR/$APKGNAME.files ];then #103B

   #v2.14 dunno why, this causes the do-loop to exit after first loop
   # (if there are multiple pkgs to remove)...
   ##remove any entries in the master help index...
   #/usr/sbin/indexgen.sh remove $WKGDIR/$APKGNAME.files

   #v1.0.6 do not remove w.m. menu config files...
   cat $WKGDIR/$APKGNAME.files | grep -v "\\.icewm/menu" | grep -v "\\.jwmrc" | grep -v "\\.fvwm95rc" > /tmp/removefileslist.txt
   sync
   cp -f /tmp/removefileslist.txt $WKGDIR/$APKGNAME.files
   FDESK=""
   for ONEFILE in `cat ./$APKGNAME.files`
   do
    #v2.14 if there is a .desktop file, then need to regenerate the menu...
    [ ! "`echo -n "$ONEFILE" | grep '\.desktop$'`" = "" ] && FDESK="$ONEFILE"
    #.files file may be malformed. check entry is a genuine file...
    #v2.11 some symlinks may not get removed. '-e' will not work if symlink
    #is pointing to a non-existent file. So, check for symlink...
    REMFILE=""
    [ -h $ONEFILE ] && REMFILE="yes"
    [ -e $ONEFILE ] && REMFILE="yes"
    if [ "$REMFILE" = "yes" ];then
     if [ ! -d $ONEFILE ];then
      #v2.0.0
      if [ -e /initrd/pup_ro2$ONEFILE ];then
       #the problem is, deleting the file on the top layer places a ".wh" whiteout file,
       #that hides the original file. what we want is to remove the installed file, and
       #restore the original pristine file...
       cp -af /initrd/pup_ro2$ONEFILE $ONEFILE
      else
       rm -f $ONEFILE
      fi
      #v2.0.0 also, delete empty dirs...
      DELDIR="`dirname $ONEFILE`"
      [ "`ls -1 $DELDIR`" = "" ] && rmdir $DELDIR
     fi
    fi
   done
   #v2.11 go through again and remove any empty dirs...
   #note, it is done above, but is incomplete. this should catch the rest...
   for ONEFILE in `cat ./$APKGNAME.files`
   do
    DELDIR="`dirname $ONEFILE`"
    [ -d $DELDIR ] && [ "`ls -1 $DELDIR`" = "" ] && rmdir $DELDIR
    #check one level up... but do not delete top dir, like /opt...
    DELLEVELS=`echo -n "$DELDIR" | sed -e 's/[^/]//g' | wc -c | sed -e 's/ //g'`
    if [ $DELLEVELS -gt 2 ];then
     DELDIR="`dirname $DELDIR`"
     [ -d $DELDIR ] && [ "`ls -1 $DELDIR`" = "" ] && rmdir $DELDIR
    fi
   done
   if [ -f ./$APKGNAME.remove ];then
    ./$APKGNAME.remove
   fi
   
   [ ! "$FDESK" = "" ] && /usr/sbin/fixmenus #v2.14
   rm -f ./$APKGNAME.*
   
   #v2.14 turn it off if an entry in livepackages.txt...
   #escapes the '-' and '.' chars in pkg name...
   mAPKGNAME="`echo -n "$APKGNAME" | sed -e 's/\-/\\\-/g' | sed -e 's/\./\\\./g'`"
   #changes on to off...
   mPATTERN="s/\(^\"$mAPKGNAME\" \".*\"\) on \"/\1 off \"/g"
   cat ./livepackages${modPUPREPO}.txt | sed -e "$mPATTERN" > /tmp/newlivepackages.txt #v3.99
   sync
   mv -f /tmp/newlivepackages.txt ./livepackages${modPUPREPO}.txt #v3.99

   #v2.14 delete entry if in alienpackages.txt...
   cat $WKGDIR/alienpackages.txt | grep -v "$QAPKGNAMEQ" > /tmp/alienpackages.txt
   sync
   mv -f /tmp/alienpackages.txt $WKGDIR/alienpackages.txt

   if [ ! "$DISABLEDX" = "yes" ];then
    kill $MSGPID
#    gxmessage -name "pet" -bg "#80ff80" -center -title "PETget" "SUCCESS: $APKGNAME is removed!
#
#Note: After exiting from PETget, it is recommended that you reboot
#      Puppy to fully remove all traces of the uninstalled package."
    DLG_REM2="
 <wtitle>Менеджер пакетов PETget</wtitle>
 <vbox>
  <pixmap><input file>/usr/local/lib/X11/pixmaps/ok.xpm</input></pixmap>
  <text><label>\"ГОТОВО: Пакет ${APKGNAME} удалён!

Примечание: После выхода из PETget рекомендуется
         перезагрузить компьютер для полного удаления следов
         пакетов.\"</label></text>
  <text><label>\"  \"</label></text>
  <hbox>
   <button><input file>/usr/local/lib/X11/mini-icons/mini-tick.xpm</input><label>OK</label><action>EXIT:10</action></button>
  </hbox>
 </vbox>"
     echo "$DLG_REM2" | gtkdialog2 --stdin
   fi
   sync
  fi #103B
  #kill $MSGPID 2>/dev/null
 done #WHILE-103A


fi

##################PKGS2ADD########################
while [ ! "$PKGS2ADD" = "" ];do #WHILE-PKGS2ADD
 echo -n "" > /tmp/missingpkgs.txt
 PKGADDNAMES="`echo "$PKGS2ADD" | cut -f 1 -d " " | tr "\n" " "`"
 STARTMSG=""
 BKCOLOR="orange"
 while [ 1 ];do
  #check if invoked from rox...
  if [ ! "$ROXCMD" = "" ];then
   RPATTERN="\"`basename "$ROXCMD" .pet`\""
   if [ ! "`echo -n "$PKGADDNAMES" | grep "$RPATTERN"`" = "" ];then
    if [ "`echo -n "$ROXCMD" | grep --extended-regexp '^ftp|^http'`" = "" ];then
     cp -f "$ROXCMD" /root/.packages/
     PETFILE="`basename "$ROXCMD"`"
     
     PKGSRC="." #tells code further down that pkg already in .packages.
    else
     PKGSRC="`dirname $ROXCMD`" #url
    fi 
    RETVAL=99
    break
   fi 
  fi

#  RETVAL=$?
  xPKGADDNAMES="`echo -n "$PKGADDNAMES" | tr '"' "'"`"
  DLG_INST1="
 <wtitle>Менеджер пакетов PETget</wtitle>
 <vbox>
  <pixmap><input file>/usr/local/lib/X11/pixmaps/pet48.png</input></pixmap>
  <text><label>\"${STARTMSG}Вы выбрали установку следующих пакетов:
$xPKGADDNAMES

Пожалуйста, подключитесь к Интернет, а затем нажмите на кнопку, чтобы выбрать сайт загрузки.
Если Вы собираетесь нажать на кнопку 'Локально', то пакеты должны быть загружены заранее.\"</label></text>
  <text><label>\"  \"</label></text>
  <hbox>
	<button><label>puppyrus.org</label><action>EXIT:13</action></button>
   <button><label>ibiblio.org</label><action>EXIT:10</action></button>
   <button><label>nluug.nl</label><action>EXIT:11</action></button>
   <button><label>gatech.edu</label><action>EXIT:12</action></button>
   <button><label>Локально</label><action>EXIT:19</action></button>
   <button><label>ВЫЙТИ</label><action>EXIT:20</action></button>
  </hbox>
 </vbox>"
  RETVAL=`echo "$DLG_INST1" | gtkdialog2 --stdin | grep 'EXIT:' | cut -f 2 -d ':'`

  WWWSITE=""
  [ $RETVAL -eq 10 ] && WWWSITE="ibiblio.org"
  [ $RETVAL -eq 11 ] && WWWSITE="ftp.nluug.nl"
  [ $RETVAL -eq 12 ] && WWWSITE="cc.gatech.edu"
  [ $RETVAL -eq 13 ] && WWWSITE="puppyrus.org"
  if [ ! "$WWWSITE" = "" ];then
    ping -c 1 -q $WWWSITE
    if [ ! $? -eq 0 ];then
     #v1.0.5 GuestToo has suggested another test...
     if wget -t 2 -T 20 --waitretry=20 --spider -S $WWWSITE -o /dev/stdout | grep '200 OK'
     then
      echo "$WWWSITE работает"
     else
      BKCOLOR="#FF8080"
      STARTMSG="ОШИБКА: $WWWSITE НЕ ДОСТУПЕН!
...Вы уверены, что соединились с Интернет?
...может, сайт не работает? Попробуйте другой.

"
      continue
     fi
    fi
  fi
  break
 done
 case $RETVAL in
 10)
  #PKGSRC="ftp://ibiblio.org/pub/Linux/distributions/puppylinux/puppy-${RIGHTVER}/packages"
  #PKGSRC="ftp://ibiblio.org/pub/Linux/distributions/puppylinux/pet_packages"
  #v2.10...
  PKGSRC="http://distro.ibiblio.org/pub/linux/distributions/puppylinux/pet_packages-${PUPREPO}"
  #...left off 'pet_packages' directory as will test below.
  ;;
 11)
  #PKGSRC="http://ftp.nluug.nl/ftp/pub/os/Linux/distr/puppylinux/puppy-${RIGHTVER}/packages"
  PKGSRC="http://ftp.nluug.nl/ftp/pub/os/Linux/distr/puppylinux/pet_packages-${PUPREPO}"
  #...left off 'pet_packages' directory as will test below.
  ;;
 12)
  PKGSRC="ftp://ftp.oss.cc.gatech.edu/pub/linux/distributions/puppylinux/pet_packages-${PUPREPO}"
  ;;
 13)
 	PKGSRC="http://puppyrus.org/pub/pet"
 	;;
 19) #Local
  LOCALDIR="/root"
  if [ -s /var/log/petlocaldir ];then
   OLDLOCALDIR="`cat /var/log/petlocaldir`"
   [ -d $OLDLOCALDIR ] && LOCALDIR="$OLDLOCALDIR"
  fi
  LOCALDIR="`Xdialog --backtitle "Note: Files not displayed, only directories" --title "PupGet: Choose local directory" --stdout --no-buttons --dselect "$LOCALDIR" 0 0`"
  if [ ! $? -eq 0 ];then
#   restorefunc
   exit
  fi
  sync
  [ ! "$LOCALDIR" = "" ] && echo "$LOCALDIR" > /var/log/petlocaldir
  KEEPGOING="no"
  for ONEFILE in `echo "$PKGS2ADD" | cut -f 2 -d '"' | tr "\n" " "`
  do
   PETFND="no"
   if [ -f ${LOCALDIR}/${ONEFILE}.pet ];then
    cp -af ${LOCALDIR}/${ONEFILE}.pet /root/.packages/
    PETFND="yes"
   fi
   #legacy .tar.gz support...
   if [ -f ${LOCALDIR}/${ONEFILE}.tar.gz ];then
    cp -af ${LOCALDIR}/${ONEFILE}.tar.gz /root/.packages/
    PETFND="yes"
   fi
   if [ "$PETFND" = "no" ];then
    gxmessage -encoding UTF-8 -font "mono 14" -center -name "pet" -bg "#ff8080" -title "PETget: Ошибка локального пакета" "
ОШИБКА: файла ${ONEFILE}.pet нет в директории $LOCALDIR"
   else
    KEEPGOING="yes" #want to keep going even if only found one pkg.
   fi
   sync
   [ -f /root/.packages/${ONEFILE}.pet ] && pet2tgz /root/.packages/${ONEFILE}.pet
  done
  #keep going even if found one pkg...
  if [ "$KEEPGOING" = "no" ];then
#   restorefunc
   exit
  fi
  PKGSRC="."
  ;;
 99)
  echo
  ;;
 *)
#  restorefunc
  exit
  ;;
 esac
  
# gxmessage -borderless -font "DejaVu Sans 14" -center -bg "orange" -title "PETget" -buttons "" "Processing, please wait...
#Note: If wget has connected to the remote site then become \"stuck\",
#      just wait, as wget will keep retrying until download is successful." &
# MSGPID=$!
 echo "$PKGS2ADD" | sed -e 's/\\/\\\\/g' |
 while read HEAD1ST #WHILE-912
 do
  RETSTATUS=0
  APKGNAME="`echo "$HEAD1ST" | cut -f 2 -d '"'`" #' geany fix.
  QAPKGNAMEQ="^\"${APKGNAME}\""
  if [ ! "$PKGSRC" = "." ];then
   rm -f ./${APKGNAME}.tar.gz #precaution.
   rm -f ./${APKGNAME}.pet #precaution.
   #rxvt -name pet -bg orange -geometry 80x10 -e wget $PKGSRC/${APKGNAME}.pet
   
   yaf-splash -font "8x16" -outline 0 -margin 4 -bg orange -placement bottom -text "PETget
Идёт загрузка, подождите, пожалуйста...
Примечание: если wget соединился с удалённым сайтом, который \"повис\",
просто подождите, так как wget будет автоматически продолжать попытки до тех пор, пока загрузка не удастся." & #9x15B also looks okay.
   MSGPID=$!
   #v3.99 added PUPREPO... (puppy version major digit)
   
   if [ ! "`wget -t 2 -T 20 --waitretry=20 --spider -o /dev/stdout $PKGSRC/${APKGNAME}.pet`" = "" ];then
    		gxmessage -encoding UTF-8 -center -name "pet" -bg "#ff8080" -title "$PKGSRC/${APKGNAME}.pet"
    		rxvt -name pet -bg orange -geometry 80x10 -e wget $PKGSRC/${APKGNAME}.pet
   #
   else
   		if [ ! "`wget -t 2 -T 20 --waitretry=20 --spider -o /dev/stdout $PKGSRC/pet_packages-${PUPREPO}/${APKGNAME}.pet | grep '200 OK'`" = "" ];then
    	rxvt -name pet -bg orange -geometry 80x10 -e wget $PKGSRC/pet_packages-${PUPREPO}/${APKGNAME}.pet
   		else
    #fallback to downloading an old pupget package...
    		if [ ! "`wget -t 2 -T 20 --waitretry=20 --spider -o /dev/stdout $PKGSRC/pupget_packages-1/${APKGNAME}.tar.gz`" = "" ];then
     		rxvt -name pet -bg orange -geometry 80x10 -e wget $PKGSRC/pupget_packages-1/${APKGNAME}.tar.gz
			fi
    		
    	fi
   
   fi
   kill $MSGPID
  fi
  sync
  if [ -f ./${APKGNAME}.pet ];then
   pet2tgz ${WKGDIR}/${APKGNAME}.pet
   [ $? -ne 0 ] && RETSTATUS=1
  fi 
  if [ -f ./${APKGNAME}.tar.gz ];then
   if [ $RETSTATUS -eq 0 ];then
    #v2.13 test if enough space to expand tarball...
    #EXPFREEK=`df -k | grep ' /$' | tr -s ' ' | cut -f 4 -d ' '`
    EXPFREEB=`stat --filesystem --format=%f /` #no. free blocks.
    EXPFILEB=`stat --format=%b ${APKGNAME}.tar.gz` #no. blocks.
    #EXPNEEDB=`expr $EXPFILEB \* 2` #.gz can expand about x2, need twice temp space. v3.92 changed 3 to 2.
    #EXPSLACK=`expr $EXPFILEB \/ 10`
    #EXPNEEDB=`expr $EXPNEEDB + $EXPSLACK`

    #v3.99 fix for differing block sizes, from lluamco...
    BLOCKFSSIZE=`stat --filesystem --format=%s /` #filesystem blocksize
    BLOCKFILESIZE=`stat --format=%B ${APKGNAME}.tar.gz` # blockfilesize
    EXPNEEDB=$(($(($EXPFILEB*6))/(($BLOCKFSSIZE))*(($BLOCKFILESIZE))))

    if [ $EXPNEEDB -gt $EXPFREEB ];then
     if [ ! "$DISABLEDX" = "yes" ];then
      gxmessage -encoding UTF-8 -center -name "pet" -bg "#ff8080" -title "PETget: ОШИБКА" "Пакет $APKGNAME был загружен в /root/.packages,
о места для его распаковки и установки недостаточно.
Свободного места всего $EXPFREEB блоков, но 
для установки потребуется $EXPNEEDB блоков.

Примечание: Если у Вас подключён pup_save.3fs,
его можно увеличить -- см. меню Утилиты.

Сейчас пакет будет удалён и работа завершена..."
     fi
     echo "ОШИБКА: Недостаточно места на носителе."
     rm -f ./${APKGNAME}.tar.gz
#     restorefunc #restore the previous database files.
     continue #next pet to install.
    fi
  
    if [ "`gzip --test --verbose ${APKGNAME}.tar.gz 2>&1 | grep "OK"`" = "" ];then
     RETSTATUS=1
    else
     #v2.13 '--absolute-names' needed for openoffice tarball to fix extraction error.
     tar --absolute-names -zxf ./$APKGNAME.tar.gz
     if [ $? -eq 0 ];then
      #v2.14 tgz2pet will embed a slackware-style binary tarball inside a directory
      #named APKGNAME, as the tarball expands direct to /...
      if [ -f $WKGDIR/$APKGNAME/${APKGNAME}.tar.gz ];then #tgz2pet also renames .tgz
       cd $WKGDIR/$APKGNAME/
       tar --absolute-names -zxf ./${APKGNAME}.tar.gz
       cd $WKGDIR
       sync
      fi
      #v2.14 pup2pet converts .pup to .pet by embedding inside tarball...
      if [ -f $WKGDIR/$APKGNAME/${APKGNAME}.pup ];then #pup2pet created this.
       installpupfunc
       #[ $? -ne 0 ] && RETSTATUS=1
       rm -rf $WKGDIR/$APKGNAME
       continue #install next pkg.
      fi
      APATTERN="s/.\/$APKGNAME//g"
      #a problem, if pkg has a symbolic link to an absolute path to a file, that is not yet
      #installed, it won't be included in the .files file...
      #so, instead of "-xtype f" will have two finds...
      #finds regular files only...
      find ./$APKGNAME -type f -mount -mindepth 2 | sed -e "$APATTERN" | sed -e 's/\/root0\//\/root\//g' > ./$APKGNAME.files
      sync
      #finds symbolic links only...
      find ./$APKGNAME -type l -mount -mindepth 2 | sed -e "$APATTERN" | sed -e 's/\/root0\//\/root\//g' >> ./$APKGNAME.files
      #this does actual install...
#      yaf-splash -font "8x16" -outline 0 -margin 4 -bg orange -text "PETget package manager
#Installing pkg, please wait..." & #9x15B also looks okay.
#      MSGPID=$!
      installpkgfunc #function call.
#      kill $MSGPID #killall xmessage
      #v2.14 turn it on...
      #escapes the '-' and '.' chars in pkg name...
      mAPKGNAME="`echo -n "$APKGNAME" | sed -e 's/\-/\\\-/g' | sed -e 's/\./\\\./g'`"
      #changes off to on...
      mPATTERN="s/\(^\"$mAPKGNAME\" \".*\"\) off \"/\1 on \"/g"
      cat ./livepackages${modPUPREPO}.txt | sed -e "$mPATTERN" > /tmp/newlivepackages.txt #v3.99
      sync
      mv -f /tmp/newlivepackages.txt ./livepackages${modPUPREPO}.txt #v3.99
     else
      RETSTATUS=1
     fi
    fi
   fi
  else
   RETSTATUS=1
  fi
  if [ $RETSTATUS -eq 1 ];then
    gxmessage -encoding UTF-8 -font "mono 14" -name "pet" -bg "#ff8080" -center -title "PETget" "ОШИБКА: $APKGNAME.pet не был загружен"
    rm -f ./${APKGNAME}.tar.gz 2> /dev/null
    rm -f ./${APKGNAME}.pet 2> /dev/null
    
    rm ${WKGDIR}/${APKGNAME}.* 2> /dev/null
#  else
#   backupfunc #save the database files in /tmp.
  fi
 done #WHILE-912
 sync
 #kill $MSGPID
 if [ -s /tmp/missingpkgs.txt ];then
  #installpkgfunc() called dependcheckfunc() which write full details of missing dependencies to this file.
  PKGS2ADD="`cat /tmp/missingpkgs.txt`"
  
  
  
  continue
 fi
 break
done #WHILE-PKGS2ADD


##END##
