if [ -f "/media/cryptofs/apps/usr/bin/lsdiff" ] ; then
  LSDIFF=/media/cryptofs/apps/usr/bin/lsdiff
else
  LSDIFF=/var/usr/bin/lsdiff
fi

if [ -f "/media/cryptofs/apps/usr/bin/patch" ] ; then
  PATCH_EXEC=/media/cryptofs/apps/usr/bin/patch
else
  PATCH_EXEC=/var/usr/bin/patch
fi

if [ -f "/media/cryptofs/apps/usr/bin/file" ] ; then
  FILE_UTIL=/media/cryptofs/apps/usr/bin/file
else
  FILE_UTIL=/var/usr/bin/file
fi

FILE_LIST=`$LSDIFF --strip=1 $APP_DIR/$PATCH_NAME`
IPKG_INFO_DIR=/usr/lib/ipkg/info
PATCH_CONTROL_DIR=/var/usr/lib/.webosinternals.patches
PATCH_PACKAGES_LIST=/media/internal/.webosinternals.patches.packages
PATCH_LOG=/media/internal/webos-patches.log
VERSION=aupt-1

do_failure() {
  echo "*** FAILED ***" >> $PATCH_LOG
  exit 1
}

failed_remove() {
  echo "" >> $PATCH_LOG
  echo "----------------------------------" >> $PATCH_LOG
  echo "Removal FAILED!" >> $PATCH_LOG
  echo "----------------------------------" >> $PATCH_LOG
  $PATCH_EXEC -s -R -p1 -d / --dry-run < ${APP_DIR}/$PATCH_NAME | tee -a $PATCH_LOG 1>&2
  echo "ls -R ${APP_DIR}" >> $PATCH_LOG
  ls -R ${APP_DIR} 2>&1 >> $PATCH_LOG
  do_failure
}

remove_images() {
  if [ -d $APP_DIR/additional_files ]
  then
    for i in `find $APP_DIR/additional_files -type f`
    do
      file=${i#$APP_DIR/additional_files}
      echo "Removing file $file" | tee -a $PATCH_LOG
      if [ -e $file.webosinternals.orig ]
      then
        mv $file.webosinternals.orig $file
      fi

      if [ ! -s $file ]
      then
        rm $file
      fi
    done

    if [ -e $PATCH_CONTROL_DIR/installed_theme ] && [ "`cat $PATCH_CONTROL_DIR/installed_theme`" = "`basename $APP_DIR`" ]
    then
      echo "Remove installed theme `basename $APP_DIR`" | tee -a $PATCH_LOG
      rm $PATCH_CONTROL_DIR/installed_theme
    fi
  fi
}

# MAIN
if [ ! -e $PATCH_LOG ]
then
  touch $PATCH_LOG
  echo "******* Patch Log Created by prerm $(date) ************" >> $PATCH_LOG
fi

echo "" >> $PATCH_LOG
echo "------------------------------------------------------" >> $PATCH_LOG
echo "PATCH REMOVAL $(date)" >> $PATCH_LOG
echo "------------------------------------------------------" >> $PATCH_LOG
echo $APP_DIR/$PATCH_NAME >> $PATCH_LOG

if [ "$IPKG_OFFLINE_ROOT" = "" ]
then
  echo "ERROR: IPKG_OFFLINE_ROOT must be supplied to the prerm" | tee -a $PATCH_LOG 1>&2
  do_failure
fi

if [ "$APP_DIR" = "" ] || [ "$PATCH_NAME" = "" ]
then
  echo "ERROR: APP_DIR and PATCH_NAME both must be set in prerm" | tee -a $PATCH_LOG 1>&2
  do_failure
fi

if [ ! -e $PATCH_EXEC ]
then
  echo "ERROR: Cannot find $PATCH_EXEC" | tee -a $PATCH_LOG 1>&2
  do_failure
fi

if [ ! -e $LSDIFF ]
then
  echo "ERROR: Cannot find $LSDIFF" | tee -a $PATCH_LOG 1>&2
  do_failure
fi

echo "" >> $PATCH_LOG
echo "----------------------------------" >> $PATCH_LOG
echo "Dry run patch attempt..." >> $PATCH_LOG
echo "----------------------------------" >> $PATCH_LOG
$PATCH_EXEC -R -p1 -d / --dry-run < ${APP_DIR}/$PATCH_NAME 2>&1 >> $PATCH_LOG

if [ $? -ne 0 ]
then
  echo "" >> $PATCH_LOG
  echo "----------------------------------" >> $PATCH_LOG
  echo "dry run failed, checking if applying entire patch would succeed" >> $PATCH_LOG
  echo "----------------------------------" >> $PATCH_LOG
  $PATCH_EXEC -p1 -d / --dry-run < ${APP_DIR}/$PATCH_NAME 2>&1 >> $PATCH_LOG

  if [ $? -ne 0 ]
  then
    echo "" >> $PATCH_LOG
    echo "----------------------------------" >> $PATCH_LOG
    echo "Applying entire patch would not succeed, checking md5sums" >> $PATCH_LOG
    echo "----------------------------------" >> $PATCH_LOG

    for i in $FILE_LIST
    do
      file=/$i
      file_md5sum=""
      orig_palm_md5sum=""
      palm_md5sum=""

      if [ -e $file ]
      then
        file_md5sum=`md5sum $file | awk '{print $1}'`
      fi

      if [ -e $APP_DIR/md5sums ]
      then
        orig_palm_md5sum=`grep -h $file $APP_DIR/md5sums | awk '{print $1}'`
        echo "Palm md5sum when installed: $orig_palm_md5sum"
      fi
  
      if [ -e $APP_DIR/package_list ]
      then
        for j in `cat $APP_DIR/package_list`
        do
          if [ "$palm_md5sum" = "" ]
          then
            echo "Getting md5sum from Palm package: $j" >> $PATCH_LOG
            palm_md5sum=`grep -h $file $IPKG_INFO_DIR/$j.md5sums | awk '{print $1}'`
            echo "  md5sum: $palm_md5sum" >> $PATCH_LOG
          fi
        done
      fi

      if [ "$palm_md5sum" = "" ] && \
         [ "`grep $file $IPKG_OFFLINE_ROOT/usr/lib/ipkg/info/*.list`" = "" ]
      then
        echo "Check for md5sum in $IPKG_INFO_DIR"
        palm_md5sum=`grep -h $file $IPKG_INFO_DIR/*md5sums | awk '{print $1}'`
        echo "  md5sum: $palm_md5sum" >> $PATCH_LOG
      fi

      if [ "$palm_md5sum" = "$file_md5sum" ]
      then
        echo "  Existing file matches Palm md5sum: $file" >> $PATCH_LOG
        echo "  Remove backup" >> $PATCH_LOG
        rm -f $file.webosinternals.orig
      elif [ "$palm_md5sum" != "$palm_orig_md5sum" ]
      then
        orig_md5sum=`md5sum $file.webosinternals.orig | awk '{print $1}'`
        echo "  md5sum of Palm file has changed since installation, assuming OTA" >> $PATCH_LOG
        if [ "$palm_md5sum" != "$orig_md5sum" ]
        then
          echo "  Remove backup" >> $PATCH_LOG
          rm -f $file.webosinternals.orig
        fi
      else
        if [ "$palm_md5sum" = "" ]
        then
          echo "  Found created file: $file" >> $PATCH_LOG
          created_files="$created_files $file"
        else
          echo "  Found modified file: $file" >> $PATCH_LOG
          found_modified=yes
        fi
      fi
    done

    [ "$found_modified" = "" ] || failed_remove

    echo "All of the files in the patch are already stock (most likely due to OTA update)" | tee -a $PATCH_LOG
  else
    echo "Interestingly, the patch seems to already be unapplied" | tee -a $PATCH_LOG
  fi
else
  echo "" | tee -a $PATCH_LOG
  echo "----------------------------------" | tee -a $PATCH_LOG
  echo "Actually removing the patch!" | tee -a $PATCH_LOG
  echo "----------------------------------" | tee -a $PATCH_LOG
  remove_images
  $PATCH_EXEC -R -p1 -d / --no-backup-if-mismatch < ${APP_DIR}/$PATCH_NAME 2>&1 | tee -a $PATCH_LOG
fi

for i in $created_files
do
  echo "Removing created file $i" >> $PATCH_LOG
  rm -f $i
done

echo "" >> $PATCH_LOG
echo "----------------------------------" >> $PATCH_LOG
echo "Cleaning up backups..." >> $PATCH_LOG
echo "----------------------------------" >> $PATCH_LOG
for i in $FILE_LIST
do
  file=/$i
  palm_md5sum=""
  orig_md5sum=""
  file_md5sum=""

  if [ -e $file ]
  then
    file_md5sum=`md5sum $file | awk '{print $1}'`
  fi

  if [ -e $file.webosinternals.orig ]
  then
    orig_md5sum=`md5sum $file.webosinternals.orig | awk '{print $1}'`
  fi

  if [ -e $APP_DIR/package_list ]
  then
    for j in `cat $APP_DIR/package_list`
    do
      if [ "$palm_md5sum" = "" ]
      then
        palm_md5sum=`grep -h $file $IPKG_INFO_DIR/$j.md5sums | awk '{print $1}'`
      fi
    done
  fi

  echo "file: $file" >> $PATCH_LOG
  echo "file md5sum:      $file_md5sum" >> $PATCH_LOG
  echo "orig md5sum:      $orig_md5sum" >> $PATCH_LOG
  echo "palm md5sum:      $palm_md5sum" >> $PATCH_LOG
  if [ ! -e $file ] && [ ! -s $file.webosinternals.orig ] || [ "$orig_md5sum" = "" ] || \
     [ "$orig_md5sum" = "$file_md5sum" ] || [ "$palm_md5sum" = "$file_md5sum" ] || \
     [ "`grep -h $file $IPKG_INFO_DIR/*md5sums | awk '{print $1}'`" = "$file_md5sum" ]
  then
    echo "Remove backup" >> $PATCH_LOG
    tmpvar=`echo $file | tr '/' '.'`
    rm -f $file.webosinternals.orig
    sed -i -e /\^'$tmpvar $VERSION'\$/d $PATCH_CONTROL_DIR/backups
  fi
done

rm -f $PATCH_CONTROL_DIR/$PATCH_NAME
sed -i -e /\^'`basename $APP_DIR` $VERSION'\$/d $PATCH_PACKAGES_LIST

rm -rf ${APP_DIR}
echo "SUCCESS" | tee -a $PATCH_LOG

exit 0
