#!/bin/sh

# script to automatically update batman on OpenWRT based systems
# written by Marek Lindner <lindner_marek@yahoo.de>





#-------------------#
#   CONFIGURATION   #
#-------------------#


HOSTS_TO_UPDATE=""

UPDATE_FILE_URL="http://downloads.open-mesh.net/batman/stable/wrt-freifunk/batmand_0.2-current_mipsel-wr-elf-32-lsb-dynamic.ipk"

PRE_UPDATE_COMMAND=""

POST_UPDATE_COMMAND="/etc/init.d/S66batman restart"

PATH="/bin:/sbin:/usr/bin:/usr/sbin"





#--------------#
#   FUNCTIONS  #
#--------------#


function fatal_error () {

   echo "$1"
   echo "Fataler Error   ->   aborting script"

   exit 1

}



function cleanup() {

   cd $curr_dir
   rm -rf .tmp$$

}





#------------#
#   SCRIPT   #
#------------#


# check for programs
SSH=`which ssh 2> /dev/null`               || SSH="ssh"
SCP=`which scp 2> /dev/null`               || SCP="scp"
WGET=`which wget 2> /dev/null`             || WGET="wget"
BASENAME=`which basename 2> /dev/null`     || BASENAME="basename"

for i in "$SSH" "$SCP" "$WGET" "$BASENAME"
   do
      if [ ! -x "$i" ]
         then
            fatal_error "The program '$i' could not be found but is neccessary for running this script"
      fi
   done


[ "$HOSTS_TO_UPDATE" ] || fatal_error "The option 'HOSTS_TO_UPDATE' contains no data - which hosts should be updated ?"

[ "$UPDATE_FILE_URL" ] || fatal_error "The option 'UPDATE_FILE_URL' contains no data - what is the location of the update file ?"

file_name=`$BASENAME $UPDATE_FILE_URL`

curr_dir=`pwd`

mkdir .tmp$$

cd .tmp$$

$WGET $UPDATE_FILE_URL -O $file_name

if [ $? -ne 0 ]
   then
      cleanup
      fatal_error "Could not download batman update file - $UPDATE_FILE_URL"
fi


for host in $HOSTS_TO_UPDATE
   do
      echo ""
      echo "Updating host $host ... "
      $SCP $file_name $host:/tmp/

      if [ $? -ne 0 ]
         then
            echo "Could not upload batman update - skipping $host ..."
            continue
      fi

     if [ $PRE_UPDATE_COMMAND ]
        then
           $SSH $host PATH=$PATH $PRE_UPDATE_COMMAND

           if [ $? -ne 0 ]
              then
                 echo "Could not execute PRE_UPDATE_COMMAND - skipping $host ..."
                 continue
           fi

     fi

     $SSH $host PATH=$PATH ipkg install /tmp/$file_name

     if [ $? -ne 0 ]
         then
            echo "Could not install batman update - skipping $host ..."
            continue
     fi

     $SSH $host rm /tmp/$file_name

     if [ $? -ne 0 ]
         then
            echo "Could not remove batman update file - skipping $host ..."
            continue
     fi

     if [ "$POST_UPDATE_COMMAND" ]
        then
           $SSH $host PATH=$PATH $POST_UPDATE_COMMAND

           if [ $? -ne 0 ]
              then
                 echo "Could not execute POST_UPDATE_COMMAND - skipping $host ..."
                 continue
           fi

     fi

     echo "Host $host successfully updated."

   done

cleanup

echo "Update finished."
