#!/bin/bash

TMP=/tmp/tmp$$
WRK=/tmp/wrk$$
LOG=$TMP/proc.log
TITLE="Porteus Module Tools"
VLP=var/log/packages
EXT=xzm
UNPACK=xzm2dir
PACK=dir2xzm
DIALOG=Xdialog

# Check that we have an X session
if [ ! $DISPLAY ]; then
  echo
  echo "You need to have the lxde or kde environment to run this!"
  echo
  exit
fi

# Check if we are root
if [ $EUID -ne 0 ]; then
  $DIALOG --title "$TITLE" --msgbox "Sorry, you need to be root for this!" 0 0 &
  exit
fi

# Create a progress gauge
gauge(){
p=0
while true; do
  p=`grep % $LOG | awk '{print$NF}' | sed 's/%//'`
  echo $p
  if [ "$p" == "100" ]; then
    p="100"
    echo $p
    sleep 2
    break
      else
    echo $p
  fi
done | $DIALOG --title "$TITLE" --gauge "$1" 8 70 $p
}

# Create a progress bar
progress(){

p=0
while true; do
  p=`grep % $LOG | awk '{print$NF}' | sed 's/%//'`
  echo $p
  [ "$p" == "100" ] && break
done | $DIALOG --title "$TITLE" --progress "Processing" 8 70 100 30
}

# Catch output from dialog answer

catch () {
ANSW=`cat $LOG` && rm $LOG
}

# Check which button was clicked from dialog

chkbut(){
[ $? -eq 1 ] && cleanup
}

# Clean the mess
cleanup() {
[ -d $TMP ] && rm -rf $TMP
[ -d $WRK ] && rm -rf $WRK
[ -f $LOG ] && rm -f $LOG
exit
}

# Error report
err() {
echo "A fatal error occured in: $FUNCNAME" > /tmp/rempkg-error.log
$DIALOG --title "$TITLE" --msgbox "An error occured and we cannot continue. \
- Show quoted text -

\n A log was created at /tmp/rempkg-error.log" 0 0
cleanup
}

# Check package for package index
check_package(){
CHK=`ls $VLP`
if [ ! -d $VLP -o -z "$VLP" ]; then
  $DIALOG --title "$TITLE" --msgbox "There doesn't appear to be a package list file. \n We cannot continue. Exiting." 0 0 &
  exit
fi
}

# Choose a package to remove
remove_package(){
nl $TMP/.list1 > $TMP/.list
$DIALOG --title "$TITLE" \
--menubox "Please choose a package to remove from module:" \
0 0 10 `cat $TMP/.list` 2> $LOG
chkbut
catch && PKGNUM=${ANSW}
PKG=`awk 'NR=='$PKGNUM'' $TMP/.list|awk '{print$NF}'`

# Get short package name
FLDS=`echo $PKG | awk -F- '{print NF}'`
if [ $FLDS -gt 3 ]; then
  PKGNAM=${PKG%-*-*-*}
    elif [ $FLDS -eq 3 ]; then
      PKGNAM=${PKG%-*-*}
    else
  PKGNAM=${PKG%-*}
fi

# Delete files
for a in `sed '/FILE LIST/,$ !d' $VLP/$PKG | grep -v FILE`; do
  rm $a > /dev/null 2>&1
done

# Delete folders
for b in `find . -name *$PKGNAM*`; do
  rm -rf $b
done

# Remove links if script file is present
if [ ! -f var/log/scripts/$PKG ]; then
  $DIALOG --title "$TITLE" \
  --wrap --left --msgbox \
  "No /var/log/scripts/$PKG was found. Some symlinks may not be removed!" 0 0
    else
  echo '#!/bin/bash' > $WRK/syms.tmp
  grep "rm -rf" /var/log/scripts/$PKG|sed 's/( //g'|sed 's/ )//g' >> $WRK/syms.tmp
  chmod +x $WRK/syms.tmp
  sh $WRK/syms.tmp
fi

# Remove any empty directories
## BE CAREFUL this may break network boot in 001 module
# 001 needs an empty boot folder for pxe boot
#find ./ -type d -print0 | xargs -0 rmdir --parents

# Remove package list file
[ -e $VLP/$PKG ] && rm $VLP/$PKG

# Remove package from menu
sed -i '/'$PKG'/d' $TMP/.list1
sed -i '/^$/d' $TMP/.list1

# Ask if another to remove
$DIALOG --title "$TITLE" --yesno "Would you like to remove another package from this module?" 0 0

[ $? -eq 0 ] && remove_package
}

# Cleanup from previous runs
rm -rf /tmp/tmp* > /dev/null 2>&1
rm -rf /tmp/wrk* > /dev/null 2>&1
[ -f $LOG ] && rm -f $LOG
mkdir $TMP
mkdir $WRK

# Choose a base module
$DIALOG --title "$TITLE" \
--backtitle "Please choose a base module" \
--fselect /mnt 0 0 2> $LOG
chkbut
catch && BASEMOD=${ANSW}

# Unpack module
$UNPACK $BASEMOD $WRK > $LOG &
gauge "Unpacking module..."

# Make packages menu
pushd $WRK > /dev/null
check_package
ls $VLP  > $TMP/.list1
nl $TMP/.list1 > $TMP/.list

# Ask for package to remove
remove_package

# Make new module on desktop
PKGNEW=`echo $BASEMOD|awk -F/ '{print$NF}'`

popd > /dev/null 2>&1
$PACK $WRK /$HOME/Desktop/$PKGNEW > $LOG 2>&1 &
gauge "Repacking module now..."

$DIALOG --title "TITLE" --msgbox \
"Your stripped module is now on your desktop. \n\n $PKGNEW" 0 0 &
cleanup