#!/bin/sh
# 
# Barry Allen by gutemine
#
VERSION=5.1.15
#
BAHOME=/media/ba
if [ ! -e $BAHOME ]; then
   mkdir $BAHOME > /dev/null 2>&1
fi
BAIMAGE=/MB_Images
BATMP=/tmp/.batmp
LIBDIR=/lib/modules/`uname -r`
if [ ! -d $LIBDIR ]; then
   LIBDIR=/lib/modules/`ls /lib/modules | tail -n 1`
fi
if [ `mount | grep /proc | wc -l` -lt 1 ]; then
   /bin/mount -t proc proc /proc > /dev/null 2>&1
   /bin/mount -t sysfs sysfs /sys > /dev/null 2>&1
   /sbin/depmod -Ae > /dev/null 2>&1
fi
if [ `uname -r | grep 2.6.12 | wc -l` -lt 1 ]; then
   if [ ! -e /dev/.udev -a -e /etc/init.d/udev ]; then
      /etc/init.d/udev start > /dev/null 2>&1
   fi
fi
BAIMAGEMOUNTS="/media/ba/ba/1 /media/ba/ba/2 /media/ba/ba/3 /media/ba/ba/4 /media/ba/ba/5 /media/ba/ba/6 /media/ba/ba/7 /media/ba/ba/8"
if grep -qs 7020 /proc/bus/dreambox ; then
	BOXTYPE=dm7020
fi
if grep -qs 600PVR /proc/bus/dreambox ; then
	BOXTYPE=dm600pvr
fi
if grep -qs DM500PLUS /proc/bus/dreambox ; then
	BOXTYPE=dm500plus
fi
if grep -qs dm7025 /proc/stb/info/model ; then
   BOXTYPE=dm7025 
fi
if grep -qs dm800 /proc/stb/info/model ; then
   BOXTYPE=dm800
fi
if grep -qs dm8000 /proc/stb/info/model ; then
   BOXTYPE=dm8000
fi
if grep -qs bm750 /etc/hostname ; then
   BOXTYPE=bm750
fi
if grep -qs dm500hd /proc/stb/info/model ; then
   BOXTYPE=dm500hd
fi

# 750 is different
if [ $BOXTYPE = "bm750" -a $# -lt 1 ]; then
   # all drivers
   LOG=/dev/null
   if [ ! -d /dev/dvb/adapter0 ]; then
      mkdir /dev/dvb/adapter0 -p
   fi
   /sbin/insmod $LIBDIR/extra/procmk.ko >> $LOG 2>&1
   /sbin/insmod $LIBDIR/extra/fb.ko >> $LOG 2>&1
   /sbin/insmod $LIBDIR/extra/dvb-core.ko >> $LOG 2>&1
   /sbin/insmod $LIBDIR/extra/dvb-bcm7335.ko >> $LOG 2>&1
   /sbin/insmod $LIBDIR/extra/brcmfb.ko >> $LOG 2>&1
#   for mod in isofs cifs usb-storage sr_mod vfat cdrom ntfs; do
#	modprobe $mod
#   done
#   for mod in sata_svw libata nls_base nls_cp437 nls_iso8859-1; do
#	modprobe $mod
#   done
    /sbin/insmod $LIBDIR/kernel/drivers/ata/libata.ko >> $LOG 2>&1
    /sbin/insmod $LIBDIR/kernel/drivers/ata/sata_svw.ko >> $LOG 2>&1
    /sbin/insmod $LIBDIR/kernel/drivers/usb/storage/usb-storage.ko >> $LOG 2>&1
    /sbin/insmod $LIBDIR/kernel/fs/nls/nls_base.ko >> $LOG 2>&1
    /sbin/insmod $LIBDIR/kernel/fs/nls/nls_cp437.ko >> $LOG 2>&1
    /sbin/insmod $LIBDIR/kernel/fs/nls/nls_iso8859-1.ko >> $LOG 2>&1
    /sbin/insmod $LIBDIR/kernel/fs/fat/fat.ko >> $LOG 2>&1
    /sbin/insmod $LIBDIR/kernel/fs/ntfs/ntfs.ko >> $LOG 2>&1
    /sbin/insmod $LIBDIR/kernel/fs/vfat/vfat.ko >> $LOG 2>&1
    /sbin/insmod $LIBDIR/kernel/fs/isofs/isofs.ko >> $LOG 2>&1
    /sbin/insmod $LIBDIR/kernel/fs/cifs/cifs.ko >> $LOG 2>&1
    /sbin/insmod $LIBDIR/kernel/fs/reiserfs/reiserfs.ko >> $LOG 2>&1
    /sbin/insmod $LIBDIR/kernel/drivers/cdrom/cdrom.ko >> $LOG 2>&1
    /sbin/insmod $LIBDIR/kernel/drivers/scsi/sr_mod.ko >> $LOG 2>&1
#   /sbin/insmod $LIBDIR/extra/brcmfb.ko >> $LOG 2>&1
    sleep 10
fi
# first try new Kernel
if [ `uname -r | grep 2.6.12 | wc -l` -lt 1 ]; then
   DEVICES1=`find /dev/sd??`
   for DEVICE in $DEVICES1;
   do
      if [ ! -e $BAHOME/ba.sh  ]; then
         mount -t ext3 $DEVICE $BAHOME > /dev/null 2>&1 
      fi
      if [ ! -e $BAHOME/ba.sh  ]; then
         umount $BAHOME > /dev/null 2>&1 
      fi 
   done
fi
mount > /dev/null 2>&1

if [ ! -e $BAHOME/ba.sh ]; then
   # second try - classic BA
   DEVICES1=`find /dev | grep -v discs | grep part1`
   for DEVICE in $DEVICES1;
   do
      if [ ! -e $BAHOME/ba.sh  ]; then
         mount -t ext3 $DEVICE $BAHOME > /dev/null 2>&1 
      fi
      if [ ! -e $BAHOME/ba.sh  ]; then
         umount $BAHOME > /dev/null 2>&1 
      fi
   done
fi
# third try - WW
if [ ! -e $BAHOME/ba.sh ]; then
   DEVICES2=`find /dev | grep -v discs | grep part2`
   for DEVICE in $DEVICES2;
   do
      if [ ! -e $BAHOME/ba.sh  ]; then
         mount -t ext3 $DEVICE $BAHOME > /dev/null 2>&1 
      fi
      if [ ! -e $BAHOME/ba.sh  ]; then
         umount $BAHOME > /dev/null 2>&1 
      fi
   done
fi
# last try
if [ ! -e $BAHOME/ba.sh ]; then
if [ $BOXTYPE = "dm8000" ]; then
   mount -t jffs2 /dev/mtdblock/4 $BAHOME > /dev/null 2>&1
   if [ ! -e $BAHOME/ba.sh  ]; then
      umount $BAHOME > /dev/null 2>&1 
   else
      mkdir $BAHOME/ba/0 > /dev/null 2>&1
      mount -t jffs2 /dev/mtdblock/5 $BAHOME/ba/0 > /dev/null 2>&1
      mkdir $BAHOME/ba/0/boot > /dev/null 2>&1
      mount -t jffs2 /dev/mtdblock/6 $BAHOME/ba/0/boot > /dev/null 2>&1
   fi 
fi
fi
if [ `mount | grep $BAHOME | grep /dev/mtdblock/4 | wc -l` -lt 1 -a `uname -r | grep 2.6.12 | wc -l` -gt 0 ]; then
BAROOT=`mount | grep $BAHOME | cut -dp -f 1 | head -n 1`
if [ -e /dev/mtdblock/5 -a ! -f $BAHOME/.banozero -a $BOXTYPE = "dm8000" ]; then
   mkdir $BAHOME/ba/0 > /dev/null 2>&1
   mount -t jffs2 /dev/mtdblock/5 $BAHOME/ba/0 > /dev/null 2>&1
   mkdir $BAHOME/ba/0/boot > /dev/null 2>&1
   mount -t jffs2 /dev/mtdblock/6 $BAHOME/ba/0/boot > /dev/null 2>&1
fi
if [ -e $BAROOT/part5 ]; then
   mkdir $BAHOME/ba/1 > /dev/null 2>&1
   mount -t ext3 $BAROOT/part5 $BAHOME/ba/1 > /dev/null 2>&1
fi
if [ -e $BAROOT/part6 ]; then
   mkdir $BAHOME/ba/2 > /dev/null 2>&1
   mount -t ext3 $BAROOT/part6 $BAHOME/ba/2 > /dev/null 2>&1
fi
if [ -e $BAROOT/part7 ]; then
   mkdir $BAHOME/ba/3 > /dev/null 2>&1
   mount -t ext3 $BAROOT/part7 $BAHOME/ba/3 > /dev/null 2>&1
fi
if [ -e $BAROOT/part8 ]; then
   mkdir $BAHOME/ba/4 > /dev/null 2>&1
   mount -t ext3 $BAROOT/part8 $BAHOME/ba/4 > /dev/null 2>&1
fi
if [ -e $BAROOT/part9 ]; then
   mkdir $BAHOME/ba/5 > /dev/null 2>&1
   mount -t ext3 $BAROOT/part9 $BAHOME/ba/5 > /dev/null 2>&1
fi
if [ -e $BAROOT/part10 ]; then
   mkdir $BAHOME/ba/6 > /dev/null 2>&1
   mount -t ext3 $BAROOT/part10 $BAHOME/ba/6 > /dev/null 2>&1
fi
if [ -e $BAROOT/part11 ]; then
   mkdir $BAHOME/ba/7 > /dev/null 2>&1
   mount -t ext3 $BAROOT/part11 $BAHOME/ba/7 > /dev/null 2>&1
fi
if [ -e $BAROOT/part12 ]; then
   mkdir $BAHOME/ba/8 > /dev/null 2>&1
   mount -t ext3 $BAROOT/part12 $BAHOME/ba/8 > /dev/null 2>&1
fi
else
   if [ ! -f $BAHOME/.banozero -a $BOXTYPE = "dm8000" ]; then
      mkdir $BAHOME/ba/0 > /dev/null 2>&1
      mount -t jffs2 /dev/mtdblock/5 $BAHOME/ba/0 > /dev/null 2>&1
      mkdir $BAHOME/ba/0/boot > /dev/null 2>&1
      mount -t jffs2 /dev/mtdblock/6 $BAHOME/ba/0/boot > /dev/null 2>&1
   fi
fi

/sbin/insmod $BAHOME/bin/fat.ko > /dev/null 2>&1
/sbin/insmod $BAHOME/bin/vfat.ko > /dev/null 2>&1
MODPROBE=/sbin/modprobe
if [ -f $BAHOME/bin/modprobe ]; then
   MODPROBE=$BAHOME/bin/modprobe
fi
$MODPROBE isofs > /dev/null 2>&1
$MODPROBE sr_mod  > /dev/null 2>&1
$MODPROBE cdrom  > /dev/null 2>&1
$MODPROBE cdfs > /dev/null 2>&1

if [ $# -lt 1 -a ! -f /.bainfo -a ! -d /noba ]; then
   if [ ! -f $BAHOME/.banobootmanager ]; then
      $MODPROBE dreambox_keyboard > /dev/null 2>&1
      # for dm800
      $MODPROBE dreambox_rc2 > /dev/null 2>&1
      $MODPROBE fp > /dev/null 2>&1
      $MODPROBE lcd > /dev/null 2>&1
      if [ -f $LIBDIR/extra/head.ko ]; then
         /sbin/insmod $LIBDIR/extra/head.ko > /dev/null 2>&1
      else
         $MODPROBE xilleon > /dev/null 2>&1
         # for dm800
         $MODPROBE bcm7401 > /dev/null 2>&1
         # for dm8000
         $MODPROBE bcm7400 > /dev/null 2>&1
         # for dm500hd
         $MODPROBE bcm7405 > /dev/null 2>&1
         # for bm750
         # done with insmode above
      fi
      if [ -f $BAHOME/.babootcolor ]; then
         cat $BAHOME/.babootcolor > /proc/stb/avs/0/colorformat
      else
         cat /proc/stb/avs/0/colorformat > /proc/stb/avs/0/colorformat
      fi
      if [ -f $BAHOME/.bamask ]; then
         if [ -e /proc/stb/ir/rc/mask0 ]; then
            cat $BAHOME/.bamask > /proc/stb/ir/rc/mask0
         else
            cat $BAHOME/.bamask > /proc/stb/ir/rc/mask
         fi
      fi
      find /dev/fb* > $BAHOME/.balog 2>&1
      lsmod >> $BAHOME/.balog 2>&1
      /usr/bin/showiframe $BAHOME/logos/barryallen.mvi > /dev/null 2>&1
      echo "init is called during boot without parameters"
      echo "therefore starting barryallen bootmanager"
      if [ $BOXTYPE = "bm750" ]; then
         echo 720p > /proc/stb/video/videomode
         LD_LIBRARY_PATH=$BAHOME/bin
         export LD_LIBRARY_PATH
       # echo pal > /proc/stb/video/videomode
      fi
      /usr/sbin/fbset >> $BAHOME/.balog 2>&1
      $BAHOME/bin/barryallen >> $BAHOME/.balog 2>&1
      /usr/sbin/fbset >> $BAHOME/.balog 2>&1
      if [ $BOXTYPE = "bm750" ]; then
         LD_LIBRARY_PATH=/usr/lib
         export LD_LIBRARY_PATH
      fi
      if [ -f $BAHOME/.baresolution ]; then
         cat $BAHOME/.baresolution > /proc/stb/video/videomode
      fi
   fi
   if [ -f $LIBDIR/kernel/fs/autofs4/autofs4.ko ]; then
      /sbin/insmod $LIBDIR/kernel/fs/autofs4/autofs4.ko > /dev/null 2>&1
   fi
   TARGET=0
   if [ -f $BAHOME/.baboot ]; then
      TARGET=`cat $BAHOME/.baboot`
   fi
   if [ $TARGET = "WebIF" ]; then
      exit 0
   fi
   if [ $TARGET = "Flash" ]; then
      /usr/bin/showiframe /boot/bootlogo.mvi > /dev/null 2>&1
   else
      if [ -d $BAHOME/ba/$TARGET ]; then
         DELTA=""
         if [ -f $BAHOME/ba/$TARGET/squashfs ]; then
            mount -o loop $BAHOME/ba/$TARGET/squashfs  $BAHOME/ba/$TARGET/boot/mnt/squashfs 
            mount -t unionfs -o rw,dirs=$BAHOME/ba/$TARGET/delta=rw:$BAHOME/ba/$TARGET/boot/mnt/squashfs=ro none $BAHOME/ba/$TARGET/boot/mnt/root
            mount -o bind $BAHOME/ba/$TARGET/boot $BAHOME/ba/$TARGET/boot/mnt/root/boot
            DELTA="/boot/mnt/root"
         fi
         if [ -f $BAHOME/ba/$TARGET/$DELTA/usr/share/bootlogo.mvi ]; then
            /usr/bin/showiframe $BAHOME/ba/$TARGET/$DELTA/usr/share/bootlogo.mvi
         else
            /usr/bin/showiframe $BAHOME/ba/$TARGET/boot/bootlogo.mvi
         fi
         sleep 1
         /bin/mount -o bind /dev $BAHOME/ba/$TARGET/$DELTA/dev
         /bin/mount -o bind /proc $BAHOME/ba/$TARGET/$DELTA/proc
         /bin/mount -o bind /sys $BAHOME/ba/$TARGET/$DELTA/sys
         rm  $BAHOME/ba/$TARGET/$DELTA/$BAHOME > /dev/null 2>&1
         mkdir  $BAHOME/ba/$TARGET/$DELTA/$BAHOME > /dev/null 2>&1
         if [ ! -f $BAHOME/ba/$TARGET/$DELTA/$BAHOME/ba.sh ]; then
            /bin/mount -o bind $BAHOME $BAHOME/ba/$TARGET/$DELTA/$BAHOME
         fi
         if [ `uname -r | grep 2.6.12 | wc -l` -lt 1 ]; then
            /bin/mount /dev/sda1 $BAHOME/ba/$TARGET/$DELTA/media/hdd
         fi
         if [ -d $BAHOME/ba/$TARGET/$DELTA/usr/lib/enigma2/python/Plugins/Extensions ]; then
            if [ ! -e $BAHOME/ba/$TARGET/$DELTA/usr/lib/enigma2/python/Plugins/Extensions/BarryAllen ]; then
               ln -sfn $BAHOME/BarryAllen $BAHOME/ba/$TARGET/$DELTA/usr/lib/enigma2/python/Plugins/Extensions/BarryAllen 
            fi
         fi
         if [ -f $BAHOME/ba/$TARGET/$DELTA/sbin/bainit ]; then
            exec /usr/sbin/chroot $BAHOME/ba/$TARGET/$DELTA /sbin/bainit
         else
            if [ -f $BAHOME/ba/$TARGET/$DELTA/sbin/init.sysvinit ]; then
               # for enigma2 support
               exec /usr/sbin/chroot $BAHOME/ba/$TARGET/$DELTA /sbin/init.sysvinit
            else
               if [ -f $BAHOME/ba/$TARGET/$DELTA/sbin/init ]; then
                  # for Neutrino and Debian Support
                  exec /usr/sbin/chroot $BAHOME/ba/$TARGET/$DELTA /sbin/init
               fi
            fi
         fi
         exit 0
      fi
   fi
fi

if [ $# -gt 0 ]; then
  case $1 in
     90 | 900 | 901 )
        # check if booted from Flash
        if [ -f /.bainfo ]; then
           echo "Sorry, can ONLY do Filesystemcheck"
           echo "when booted from Flash !"
           exit 1
        fi
        # create mountpoint list 
        find /dev/sd?? > $BATMP
        sed -ie s!"/dev/"!""!g $BATMP
        DEV_DEVICES=`cat $BATMP`
        
        echo "bainit: Filesystemcheck"

        umount $BAHOME/boot > /dev/null 2>&1
        for BAIMAGEMOUNT in $BAIMAGEMOUNTS; do
            umount $BAIMAGEMOUNT > /dev/null 2>&1
        done 
        umount /media/cf > /dev/null 2>&1
        umount /media/usb > /dev/null 2>&1
        umount /media/sd > /dev/null 2>&1
        umount /media/hdd > /dev/null 2>&1
        umount /media/ba > /dev/null 2>&1

        # stops automount
        if [ -f /etc/init.d/autofs ]; then
           echo "Barry Allen stops automount"
           /etc/init.d/autofs stop > /dev/null 2>&1
           sleep 5
           killall -9 automount > /dev/null 2>&1
        fi
        # stops udev        
        if [ -f /etc/init.d/udev ]; then
           echo "Barry Allen stops udev"
           /etc/init.d/udev stop > /dev/null 2>&1
        fi
        # stop swapping on all swap devices
        swapoff -a  > /dev/null 2>&1
        
        umount /media/cf > /dev/null 2>&1
        # unmount all automounted devices
        for DEV_DEVICE in $DEV_DEVICES; do
            umount /media/$DEV_DEVICE > /dev/null 2>&1
            umount /autofs/$DEV_DEVICE > /dev/null 2>&1
        done
        # check if unmounted sucsessfully
        for DEV_DEVICE in $DEV_DEVICES; do
           if [ `mount | grep /dev/$DEV_DEVICE | wc -l` -gt 0 ]; then
              echo "ERROR: umount failed, can NOT do Filesystemcheck, sorry"
              echo "maybe standing in telnet on the device, or swapfile active."
              exit 1
           fi
        done
        for DEV_DEVICE in $DEV_DEVICES; do
	   DEV_RAW=`echo $DEV_DEVICE | cut -d"1" -f 0`
	   if [ `fdisk -l /dev/$DEV_RAW | grep /dev/$DEV_DEVICE | grep FAT | wc -l` -gt 0 ]; then
              if [ ! -e /usr/sbin/fsck.msdos ]; then
                    echo "bainit: dosfstools not found for checking FAT, sorry"
              else
                 # FAT filesystem check
                 case $1 in
                    90 | 901)
                    fsck.msdos -a -V /dev/$DEV_DEVICE
                    ;;
		    900)
                    fsck.msdos -n /dev/$DEV_DEVICE
                    ;;
		    *)
                   ;;
                 esac
              fi
           else
              # EXT3 filesystem check
              case $1 in
                 90)
                 echo "bainit: doing normal Filesystemcheck on /dev/$DEV_DEVICE ..."
                 fsck.ext3 -f -v -p /dev/$DEV_DEVICE
                 ;;
                 900)
                 echo "bainit: doing read only Filesystemcheck on /dev/$DEV_DEVICE ..."
                 fsck.ext3 -f -v -n /dev/$DEV_DEVICE
                 ;;
                 901)
                 echo "bainit: doing forced fix Filesystemcheck on /dev/$DEV_DEVICE ..."
                 fsck.ext3 -f -v -y /dev/$DEV_DEVICE
                 ;;
	         *)
                 ;;
              esac
	   fi
        done
        
        # start automount
        if [ -f /etc/init.d/autofs ]; then
           echo "Barry Allen start automount"
           /etc/init.d/autofs start > /dev/null 2>&1
        fi
        # start udev        
        if [ -f /etc/init.d/udev ]; then
           echo "Barry Allen start udev"
           /etc/init.d/udev start > /dev/null 2>&1
        fi
        mount -a -t ext3 > /dev/null 2>&1
        mount -a -t fat > /dev/null 2>&1
        mount -a -t vfat > /dev/null 2>&1
        mount -a -t auto > /dev/null 2>&1
        DEVICES1=`find /dev/sd??`
        for DEVICE in $DEVICES1;
        do
           if [ ! -e $BAHOME/ba.sh  ]; then
              mount -t ext3 $DEVICE $BAHOME > /dev/null 2>&1 
           fi
           if [ ! -e $BAHOME/ba.sh  ]; then
              umount $BAHOME > /dev/null 2>&1 
           fi 
        done
        swapon -a  > /dev/null 2>&1
        exit 0
     ;;
     100 | 110 | 120 )
        # /media/hdd not mounted and is no symlink
        if [ `mount | grep /media/hdd | grep ext | wc -l` -lt 1 ]; then
          if [ ! -h /media/hdd ]; then
            echo "no Harddisk mounted, sorry"
            exit 1
          fi
        fi
        
        # /media/ba not mounted
        if [ `mount | grep /media/ba | grep ext | wc -l` -lt 1 ]; then
          echo "no Barry Allen device mounted, sorry"
          exit 1
        fi
        touch /media/hdd/dumpdates
        ln -sfn /media/hdd/dumpdates /var/lib/dumpdates
        mkdir /media/hdd/backup > /dev/null 2>&1
        echo "bainit: doing full backup of /media/ba to /media/hdd/backup/barryallen.dmp"
        /media/ba/bin/dump 0uf /media/hdd/backup/barryallen.dmp /media/ba
        exit 0
     ;;
     91 | 910 | 911 | 92 | 920 | 921 | 93 | 930 | 931 | 81 | 82 | 83)
     echo "unsupported with Barry Allen >5.0"
     echo "try bainit 90|900|901 for Filesystemcheck of all devices"
     ;;
     *)
     ;;
esac
fi
# boot Flash 

UNIONFS=0
if [ ! -f /.bainfo ]; then
   if [ -f /lib/modules/`uname -r`/kernel/fs/unionfs.ko ]; then
      /sbin/insmod /lib/modules/`uname -r`/kernel/fs/unionfs.ko >> /dev/null 2>&1
   fi
   if [ `lsmod | grep unionfs | wc -l` -gt 0 ]; then
      UNIONFS=1
   fi
fi
if [ -f /sbin/init.sysvinit ]; then
   # for enigma2 support
   if [ $UNIONFS -eq 1 -a -f /sbin/freeze ]; then
      exec /sbin/freeze $1
   else
      exec /sbin/init.sysvinit $1
   fi
else
   # for Neutrino and Debian Support
   exec /sbin/init $1
fi
exit 0
;;
esac
exit 0

