#!/bin/sh
#(c) Copyright Barry Kauler 2009, puppylinux.com
#2009 Lesser GPL licence v2 (http://www.fsf.org/licensing/licenses/lgpl.html).
#Note: Puppy Package Manager is started from /usr/local/petget/pkg_chooser.sh for the GUI.
#'petget' is for commandline execution, especially from ROX-Filer.
#If passed param is a pkg name preceded by a + to install pkg, - to uninstall pkg.
# example: +xbubble-0.2.4
#For integration with Rox-Filer, commandline is a .pet|.deb|.tgz|.tar,gz with absolute path, install.
# ex: petget /root/xbubble-0.2.4.pet
#For integration with browser, ex: petget http://somewhere.on.internet/xbubble-0.2.4.pet
#Note, petget also get called from /etc/rc.d/rc.update to remove packages. ex:
# petget -xbubble-0.2.4
# ...when X not running, removal will not put up any DLG windows, will remove without question.
#w482 restart jwm immediately to update menu.
#v424 fix .pet in path with space chars.
# 6sep10 shinobar: can be no DB_version
#100616 add support for .txz slackware pkgs.
#101116 call download_file to download pkg, instead of direct run of wget.

#[ ! $1 ] && exit 

# 118n by L18L
# 20aug10 shinobar: i18n_head
# 3jan10 shinobar: launch the PPM if without parameter, fix APPDIR
APPDIR=$(dirname $0)
for D in $APPDIR /usr/local/petget; do
  [ -s "$D/pkg_chooser.sh" ] && APPDIR="$D" && break
done
[ ! $1 ] && exec "$APPDIR/pkg_chooser.sh"

source "$APPDIR/i18n_head"
export T_titledown="`gettext \"Package Manager: download\"`"
#

#export LANG=C
. /etc/DISTRO_SPECS #has DISTRO_BINARY_COMPAT, DISTRO_COMPAT_VERSION

PASSEDPARAM="$1"

if [ "`echo -n "$PASSEDPARAM" | grep '^\\-'`" != "" ];then
 #remove a package...
 PKGNAME="`echo -n "$PASSEDPARAM" | cut -c 2-99`"
 TREE2="$PKGNAME"
 export TREE2
 $APPDIR/removepreview.sh
 exit
fi

#want to install a pkg...
LANG=C
COMPAT_EXT=""
case $DISTRO_BINARY_COMPAT in
 slackware)
  COMPAT_EXT=".tgz"
 ;;
 debian|ubuntu)
  COMPAT_EXT=".deb"
 ;;
 arch)
  COMPAT_EXT=".tar.gz"
 ;;
esac

#what type is it...
PASSEDBASE="`basename "$PASSEDPARAM"`"
case $PASSEDBASE in
 *.pet)
  EXT=".pet"
 ;;
 *.deb)
  EXT=".deb"
 ;;
 *.tgz)
  EXT=".tgz"
 ;;
 *.txz)
  EXT=".txz"
 ;;
 *.tar.gz)
  EXT=".tar.gz"
 ;;
 *)
  EXT=""
 ;;
esac

#download if required...
PKGNAME=""
if [ "`echo -n "$PASSEDPARAM" | grep -E '^ftp|^http'`" != "" ];then
 cd /root
 #101116 use download_file utility...
 #rxvt -title "Puppy Package Manager: download" -bg orange -geometry 80x10 -e wget "$PASSEDPARAM"
 #download_file "$PASSEDPARAM"
 #LANG=$LANG_USER $RXVT -title "Puppy ${T_titledown}" -bg orange -geometry 80x10 -e wget "$PASSEDPARAM"
 LANG=$LANG_USER download_file "$PASSEDPARAM"
 PKGPATH="`dirname "$PASSEDPARAM"`" #really a url.
 FULLPKGNAME="`basename "$PASSEDPARAM"`"
 PKGMAIN="`basename "$PASSEDPARAM" ${EXT}`"
 if [ ! -f "$FULLPKGNAME" ];then
  #xmessage -bg red "Sorry, failed to download $FULLPKGNAME"
  LANG=$LANG_USER
  mysplash "`eval_gettext \"Sorry, failed to download \\\${FULLPKGNAME}\"`"
  exit
 fi
else
 #get rid of any leading '+'...
 PASSEDPARAM="`echo -n "$PASSEDPARAM" | sed -e 's%^+%%'`"
 FIRSTCHAR="`echo -n "$PASSEDPARAM" | cut -c 1`"
 if [ "$FIRSTCHAR" = "/" -o "$FIRSTCHAR" = "." ];then
  PKGPATH="`dirname "$PASSEDPARAM"`"
  FULLPKGNAME="`basename "$PASSEDPARAM"`"
  PKGMAIN="`basename "$PASSEDPARAM" ${EXT}`"
 else
  PKGPATH="`pwd`"
  if [ "$EXT" = "" ];then
   PKGMAIN="$PASSEDPARAM"
   FULLPKGNAME="${PKGMAIN}.pet"
   EXT=".pet"
  else
   FULLPKGNAME="`basename "$PASSEDPARAM"`"
   PKGMAIN="`basename "$PASSEDPARAM" ${EXT}`"
  fi
 fi
 cp -f "${PKGPATH}/${FULLPKGNAME}" /root/ 2>/dev/null #v424 fix if spaces in path.
fi
originPKGPATH="$PKGPATH" #w482
PKGPATH=/root

#split PKGMAIN, ex: FULLPKGNAME=xvidtune-1.0.1-i486-1.tgz has PKGNAME=xvidtune-1.0.1
 case $EXT in
  .deb)
   #deb ex: xsltproc_1.1.24-1ubuntu2_i386.deb  xserver-common_1.5.2-2ubuntu3_all.deb
   DB_nameonly="`echo -n "$PKGMAIN" | cut -f 1 -d '_'`"
   DB_pkgrelease="`echo -n "$PKGMAIN" | rev | cut -f 2 -d '_' | cut -f 1 -d '-' | rev`"
   prPATTERN="s%\\-${DB_pkgrelease}.*%%"
   PKGNAME="`echo -n "$PKGMAIN" | sed -e "$prPATTERN"`"
   DB_version="`echo "$PKGNAME" | cut -f 2 -d '_'`"
  ;;
  .pet)
   PKGNAME="$PKGMAIN"
   DB_version="`echo -n "$PKGNAME" | grep -o '\\-[0-9].*' | sed -e 's%^\-%%'`"
   xDB_version="`echo -n "$DB_version" | sed -e 's%\\-%\\\\-%g' -e 's%\\.%\\\\.%g'`"
   xPATTERN="s%${xDB_version}%%"
   # 6sep10 shinobar: can be no DB_version
   [ "$xDB_version" != "" ] && DB_nameonly="`echo -n "$PKGNAME" | sed -e "$xPATTERN" `"
   DB_nameonly="`echo -n "$DB_nameonly" | sed -e 's%\\-$%%'`"
   DB_pkgrelease=""
  ;;
  .tgz|.txz)
   #slack ex: xvidtune-1.0.1-i486-1.tgz  printproto-1.0.4-noarch-1.tgz
   PKGNAME="`echo -n "$PKGMAIN" | sed -e 's%\\-i[3456]86.*%%' -e 's%\\-noarch.*%%'`"
   DB_version="`echo -n "$PKGNAME" | grep -o '\\-[0-9].*' | sed -e 's%^\\-%%'`"
   xDB_version="`echo -n "$DB_version" | sed -e 's%\\-%\\\\-%g' -e 's%\\.%\\\\.%g'`"
   xPATTERN="s%${xDB_version}%%"
   DB_nameonly="`echo -n "$PKGNAME" | sed -e "$xPATTERN" -e 's%\-$%%'`"
   DB_pkgrelease="`echo -n "$PKGMAIN" | sed -e 's%.*\\-i[3456]86%%' -e 's%.*\\-noarch%%' -e 's%^\\-%%'`"
  ;;
  .tar.gz)
   #arch ex: xproto-7.0.14-1-i686.pkg.tar.gz  trapproto-3.4.3-1.pkg.tar.gz
   PKGNAME="`echo -n "$PKGMAIN" | sed -e 's%\\-i[3456]86.*%%' -e 's%\\.pkg$%%' | rev | cut -f 2-9 -d '-' | rev`"
   DB_version="`echo -n "$PKGNAME" | grep -o '\\-[0-9].*' | sed -e 's%^\\-%%'`"
   xDB_version="`echo -n "$DB_version" | sed -e 's%\\-%\\\\-%g' -e 's%\\.%\\\\.%g'`"
   xPATTERN="s%${xDB_version}%%"
   DB_nameonly="`echo -n "$PKGNAME" | sed -e "$xPATTERN" -e 's%\\-$%%'`"
   DB_pkgrelease="`echo -n "$PKGMAIN" | sed -e 's%\\-i[3456]86.*%%' -e 's%\\.pkg$%%' | rev | cut -f 1 -d '-' | rev`"
  ;;
 esac

cd "$PKGPATH" #well, this is /root

#confirm want to install...
LANG=$LANG_USER
export INSTALL_DIALOG="<window title=\"Puppy ${T_title}\" icon-name=\"gtk-about\">
  <vbox>
  <pixmap><input file>/usr/local/lib/X11/pixmaps/question.xpm</input></pixmap>
   <text><label>`gettext \"Click 'OK' button to confirm that you wish to install this package:\"`</label></text>
   <text use-markup=\"true\"><label>\"<b>${FULLPKGNAME}</b>\"</label></text>
   <hbox>
    <button ok></button>
    <button cancel></button>
   </hbox>
  </vbox>
 </window>" 
RETPARAMS="`gtkdialog3 --program=INSTALL_DIALOG`"
eval "$RETPARAMS"
[ "$EXIT" != "OK" ] && exit

LANG=C
#find entry in databases...
#pkgname|nameonly|version|pkgrelease|category|size|path|fullfilename|dependencies|description|
#optionally on the end: compileddistro|compiledrelease|repo| (fields 11,12,13)
pPATTERN='^'"$PKGNAME"'|'
if [ "$EXT" = ".pet" ];then
 DB_ENTRY="`cat /root/.packages/Packages-puppy-* | grep "$pPATTERN" | sort -r | head -n 1`"
else
 DB_ENTRY="`cat /root/.packages/Packages-${DISTRO_BINARY_COMPAT}-* | grep "$pPATTERN" | head -n 1`"
fi

#w482 doesn't matter if incomplete, installpkg.sh will read .desktop file for description and category...
#also, if .pet pkg has pet.specs, that will get written to /root/.packages/user-packages-installed
if [ "$DB_ENTRY" = "" ];then
 DB_ENTRY="${PKGNAME}|${DB_nameonly}|${DB_version}|${DB_pkgrelease}||||${FULLPKGNAME}|||"
fi

#w482 hack, if pkg was originally at /root then don't delete it...
[ "$originPKGPATH" = "$PKGPATH" ] && cp -f ${PKGPATH}/${FULLPKGNAME} ${PKGPATH}/${FULLPKGNAME}-TEMPBACKUP

#install pkg...
rm -f /tmp/petget_missing_dbentries-Packages-* 2>/dev/null
rm -f /tmp/petget-installed-pkgs-log 2>/dev/null
echo "$DB_ENTRY" > /tmp/petget_missing_dbentries-Packages-alien
LANG=$LANG_USER
$APPDIR/installpkg.sh $PKGPATH/$FULLPKGNAME
RETVAL=$?

#installpkg.sh has already done this...
rm -f $PKGPATH/$FULLPKGNAME 2>/dev/null
rm -f $PKGPATH/${PKGNAME}.tar.gz 2>/dev/null

#w482 hack, if pkg was originally at /root then don't delete it...
[ "$originPKGPATH" = "$PKGPATH" ] && mv -f ${PKGPATH}/${FULLPKGNAME}-TEMPBACKUP ${PKGPATH}/${FULLPKGNAME}

#announce result...
#LANG=$LANG_USER
if [ $RETVAL -ne 0 -o ! -s /tmp/petget-installed-pkgs-log ];then
 T_installfailed="`eval_gettext \"Error, package \\\${FULLPKGNAME} failed to install.\"`"
 export FAIL_DIALOG="<window title=\"Puppy ${T_title}\" icon-name=\"gtk-about\">
  <vbox>
  <pixmap><input file>/usr/local/lib/X11/pixmaps/error.xpm</input></pixmap>
   <text use-markup=\"true\"><label>\"<b>${T_installfailed}</b>\"</label></text>
   <hbox>
    <button ok></button>
   </hbox>
  </vbox>
 </window>" 
 gtkdialog3 --program=FAIL_DIALOG
 exit
fi

INSTALLEDMSG="`cat /tmp/petget-installed-pkgs-log`"
MENUMSG=""
INSTALLEDCAT="`echo -n "$INSTALLEDMSG" | rev | cut -f 1 -d ' ' | rev`"
if [ "$INSTALLEDCAT" = "none" ];then
 MENUMSG="<text><label>`gettext \"...note, this package does not have a menu entry.\"`</label></text>"
else
 MENUMSG="<text><label>`eval_gettext \"...look in '\\\${INSTALLEDCAT}' in the menu (bottom-left of screen) to run the application.\"`</label></text>"
fi

#installpkg.sh will have logged to /tmp/petget-installed-pkgs-log
export INSTALL_DIALOG="<window title=\"Puppy ${T_title}\" icon-name=\"gtk-about\">
 <vbox>
 <pixmap><input file>/usr/local/lib/X11/pixmaps/ok.xpm</input></pixmap>
  <text><label>`gettext \"The following package has been successfully installed:\"`</label></text>
  <text use-markup=\"true\"><label>\"<b>${INSTALLEDMSG}</b>\"</label></text>
  ${MENUMSG}
  <hbox>
   <button ok></button>
  </hbox>
 </vbox>
</window>
"
gtkdialog3 --program=INSTALL_DIALOG

RESTARTMSG="`gettext \"Please wait, updating help page and menu...\"`"
[ "`pidof jwm`" != "" ] && RESTARTMSG="`gettext \"Please wait, updating help page and menu (the screen will flicker!)...\"`" #w482
[ "$INSTALLEDCAT" = "none" ] && RESTARTMSG="`gettext \"Please wait, updating help page...\"`"
mysplash "${RESTARTMSG}"
#X3PID=$!
X3PID=$X1PID

LANG=C
#w0910 update image cache...
if [ -f /root/.packages/${PKGNAME}.files ];then
 if [ "`grep 'usr/share/icons/hicolor' /root/.packages/${PKGNAME}.files`" != "" ];then
  gtk-update-icon-cache -f /usr/share/icons/hicolor/
 fi
fi

#master help index has to be updated...
/usr/sbin/indexgen.sh
#Reconstruct configuration files for JWM, Fvwm95, IceWM...
if [ "$INSTALLEDCAT" != "none" ];then
 LANG=$LANG_USER /usr/sbin/fixmenus	# 20aug10 shinobar
 [ "`pidof jwm`" != "" ] && jwm -restart #w482
fi

kill $X3PID

###END###
