--- /dev/null
+#!/bin/sh
+
+logfile=/tmp/updater.log
+oldkernel=/boot/uImage-3
+newkernel=boot/uImage-3
+
+if ! grep -q '[[:blank:]]/[[:blank:]]*ubifs' /proc/mounts; then
+ # prefer alternative locations when running from SD
+ test -e /media/PANDORABOOT/uImage && oldkernel=/media/PANDORABOOT/uImage
+ test -e /media/PANDORABOOT/uImage-3 && oldkernel=/media/PANDORABOOT/uImage-3
+ test -e /media/BOOT/uImage && oldkernel=/media/BOOT/uImage
+ test -e /media/BOOT/uImage-3 && oldkernel=/media/BOOT/uImage-3
+fi
+
+if ! test -e $oldkernel; then
+ zenity --error --text "SuperZaxxon Final firmware required, sorry."
+ exit 1
+fi
+
+if ! test -e $newkernel || ! test -d lib || ! test -d ipk; then
+ zenity --error --text "Required files are missing, perhaps this .pnd got corrupted."
+ exit 1
+fi
+
+root_free=`df | grep '/$' | sed -e '2~1d' | awk '{print $4}'`
+if [ "$root_free" -lt 2000 ]; then
+ zenity --error --text "There is not enough space left in root partition.
+This usually means your NAND is almost full.
+
+Delete some files and try again, or just do a full reflash."
+ exit 1
+fi
+
+if [ "`id -u`" != "0" ]; then
+ zenity --error --text "Root permissions required."
+ exit 1
+fi
+
+get_ver()
+{
+ dd if=$1 bs=32 skip=1 count=1 2> /dev/null \
+ | strings | sed -e 's/.*\([0-9]\.[0-9]\.[0-9]*\).*/\1/'
+}
+
+get_vercode()
+{
+ ver1=`echo $1 | awk -F. '{printf $1}'`
+ ver2=`echo $1 | awk -F. '{printf $2}'`
+ ver3=`echo $1 | awk -F. '{printf $3}'`
+ echo $((($ver1 << 16) + ($ver2 << 8) + $ver3))
+}
+
+log()
+{
+ echo -en "\033[0;32m"
+ echo "$@"
+ echo -en "\033[0m"
+
+ echo "$@" >> $logfile
+}
+
+echo > $logfile
+
+kernel_failed_detect=true
+kernel_ask_newer=false
+kernel_do_update=false
+kernel_reboot_needed=false
+
+oldver=`get_ver $oldkernel`
+newver=`get_ver $newkernel`
+oldvcode=`get_vercode $oldver`
+newvcode=`get_vercode $newver`
+
+# echo $oldver $newver $oldvcode $newvcode
+
+if [ -n "$oldver" -a -n "$newver" -a -n "$oldvcode" -a -n "$newvcode" ]; then
+ if [ "$oldvcode" -lt "$(((3 << 16) + (2 << 8) + 21))" ]; then
+ # a version before SZ-Final
+ zenity --error --text "SuperZaxxon Final firmware required, sorry."
+ exit 1
+ fi
+
+ if [ "$oldvcode" -eq "$newvcode" ]; then
+ oldtime=`stat -c %Y $oldkernel`
+ newtime=`stat -c %Y $newkernel`
+ if [ "$oldtime" -gt "$newtime" ]; then
+ kernel_ask_newer=true
+ else
+ kernel_failed_detect=false
+ kernel_do_update=true
+ fi
+ elif [ "$oldvcode" -gt "$newvcode" ]; then
+ kernel_ask_newer=true
+ else
+ kernel_failed_detect=false
+ kernel_do_update=true
+ fi
+fi
+
+if $kernel_ask_newer; then
+ if zenity --question --text "It seems you have newer kernel already installed,
+overwrite it?"; then
+ kernel_do_update=true
+ fi
+elif $kernel_failed_detect; then
+ if zenity --question --text "Could not determine what kernel is installed on your system,
+so have to ask, do you want to overwrite your current kernel?"; then
+ kernel_do_update=true
+ fi
+fi
+
+if $kernel_do_update; then
+ if ! cmp $newkernel $oldkernel > /dev/null; then
+ log "updating kernel at $oldkernel from $oldver to $newver ..."
+ cp -a $newkernel $oldkernel
+ sync
+ kernel_reboot_needed=true
+ fi
+
+ log "updating modules for $newver ..."
+ if [ -n "$oldver" -a -d "/lib/modules/$oldver" ]; then
+ rm -rf /lib/modules/$oldver
+ fi
+ cp -a lib /
+ sync
+ if ! $kernel_reboot_needed; then
+ # we can depmod now
+ depmod -a
+ sync
+ fi
+fi
+
+log "installing packages..."
+opkg install ipk/* | tee -a $logfile
+sync
+
+# since uninstall script of gtk-touchscreen-mode-enable is broken, edit this out manually
+sudo sed -i -e 's/^\(gtk-touchscreen-mode = 1\)/#\1/' /etc/gtk-2.0/gtkrc
+
+log "all done. You can find logfile at $logfile"
+if $kernel_reboot_needed; then
+ zenity --question --text "Reboot required to start the new kernel.
+Reboot now?" && reboot
+else
+ zenity --info --text "Update complete."
+fi