#!@BASH@
# -*- mode: sh; sh-basic-offset: 3; indent-tabs-mode: nil; -*-
# vim: set filetype=sh sw=3 sts=3 expandtab autoindent:

####################################################
## Functions

##
## returns the next available file name given a file
## in the form @CFGDIR@/backup.d/10.sys
## sets variable $next_filename
##
get_next_filename() {
   next_filename=$1
   dir=`dirname $next_filename`
   file=`basename $next_filename`
   number=${file:0:2}
   suffix=${file:3}
   while [ -f $next_filename ]; do
     let "number += 1"
     next_filename="$dir/$number.$suffix"
   done
}

##
## installs packages (passed in as $@) if not present
##
require_packages() {
   for pkg in "$@"; do
      installed=`dpkg -s $pkg | grep 'ok installed'`
      if [ -z "$installed" ]; then
         booleanBox "install $pkg?" "This backup action requires package $pkg. Do you want to install it now?"
         if [ $? = 0 ]; then
            apt-get install $pkg
            echo "hit return to continue...."
            read
         fi
      fi
   done
}

##
## menu for the wizards
##
donew() {
   # (re-)initialize vservers support
   init_vservers
   # menu
   listBegin "new action menu" "select an action to create"
   listItem return "return to main menu"
   for data in $HELPERS; do
      data=${data//_/ }
      helper_function=${data%%:*}
      helper_info=${data##*:}
      listItem $helper_function "$helper_info"
   done
   listDisplay menu

   [ $? = 1 ] && return
   result="$REPLY"
   [ "$result" = "return" -o "$result" = "" ] && return
   run_wizard=${result}_wizard
   $run_wizard
   result=$?
   # 0 is ok, 1 is cancel, anything else is bad.
   if [ $result != 1 -a $result != 0 ]; then
      echo "An error occurred ($result), bailing out. Hit return to continue."
      read
   fi
}

do_rm_action() {
   booleanBox "remove action" "Are you sure you want to remove action file $1?"
   if [ $? = 0 ]; then
     rm $1;
   fi
}

do_run() {
   backupninja --run $1
   echo "Hit return to continue..."
   read
}

do_xedit() {
   if [ -z "$EDITOR" -o ! -x "`which $EDITOR`" ]; then
      if [ -h /etc/alternatives/editor -a -x "`readlink /etc/alternatives/editor`" ]; then
    EDITOR="`readlink /etc/alternatives/editor`"
      elif [ -x "`which nano`" ]; then
    EDITOR="`which nano`"
      elif [ -x "`which vim`" ]; then
    EDITOR="`which vim`"
      elif [ -x "`which vi`" ]; then
    EDITOR="`which vi`"
      else
    echo "No suitable editor found."
    echo "Please define $EDITOR or configure /etc/alternatives/editor."
    exit
      fi
   fi
   $EDITOR $1
}

do_run_test() {
   backupninja --test --run $1
   echo "Hit return to continue..."
   read
}

do_disable() {
   mv $1 $1.disabled
}

do_enable() {
   mv $1 ${1%.*}
}

do_rename() {
   dir=`dirname $1`
   filename=`basename $1`
   inputBox "rename action" "enter a new filename" $filename
   mv $dir/$filename $dir/$REPLY
}

doaction() {
   action=$1
   base=`basename $action`
   if [ "${base##*.}" == "disabled" ]; then
      enable="enable";
   else
      enable="disable";
   fi
   while true; do
      menuBox "action menu" "$action $first" \
         main "return to main menu" \
         view "view configuration" \
         xedit "launch external editor" \
         $enable "$enable action" \
         name "change the filename" \
         run "run this action now" \
         test "do a test run" \
         kill "remove this action"
      [ $? = 1 ] && return;
      result="$REPLY"
      case "$result" in
         "view") dialog --textbox $action 0 0;;
         "xedit") do_xedit $action;;
         "disable") do_disable $action; return;;
         "enable") do_enable $action; return;;
         "name") do_rename $action; return;;
         "run") do_run $action;;
         "test") do_run_test $action;;
         "kill") do_rm_action $action; return;;
         "main") return;;
      esac
   done
}

#####################################################
## begin program

if [ ! -x "`which dialog`" ]; then
   echo "ninjahelper is a menu based wizard for backupninja."
   echo "It requires 'dialog' in order to run. Do you want to install dialog now?"
   while true; do
      echo -n "(yes/no): "
      read install
      if [ "$install" == "yes" ]; then
         apt-get install dialog
            break
         elif [ "$install" == "no" ]; then
            exit
         else
            echo "You must answer 'yes' or 'no'"
      fi
   done
fi

# bootstrap
conffile="@CFGDIR@/backupninja.conf"
if [ ! -r "$conffile" ]; then
   echo "Configuration file $conffile not found."
   exit 1
fi

# find $libdirectory
libdirectory=`grep '^libdirectory' $conffile | @AWK@ '{print $3}'`
if [ -z "$libdirectory" ]; then
   if [ -d "@libdir@" ]; then
      libdirectory="@libdir@"
   else
      echo "Could not find entry 'libdirectory' in $conffile."
      exit 1
   fi
else
   if [ ! -d "$libdirectory" ]; then
      echo "Lib directory $libdirectory not found."
      exit 1
   fi
fi

# include shared functions
. $libdirectory/easydialog
. $libdirectory/tools
. $libdirectory/vserver

# am I running as root?
if [ "$UID" != "0" ]; then
   msgBox "warning" "`basename $0` must be run by root!"
   exit 1
fi

# get global config options (second param is the default)
setfile $conffile
getconf configdirectory @CFGDIR@/backup.d
if [ ! -d $configdirectory ]; then
   msgBox "warning" "The backupninja configuration directory $configdirectory does not exist. Ninjahelper cannot run without it!"
   exit 1
fi
getconf scriptdirectory @datadir@

# load all the helpers
HELPERS=""
for file in `find $scriptdirectory -follow -name '*.helper'`; do
   . $file
   if [ $? != 0 ]; then
      echo "An error occurred while loading $file. Hit return to continue."
      read
   fi
done

setApplicationTitle "ninjahelper"
setDimension 75 19

#####################################################
## main event loop

while true; do

menulist=
action=
let "i = 1"
for file in `find ${configdirectory} -follow -mindepth 1 -maxdepth 1 -type f ! -name '.*.swp' | sort -n`; do
   menulist="$menulist $i $file"
   actions[$i]=$file
   let "i += 1"
done

menuBox "main menu" "Select a backup action for more options, or create a new action:" $menulist \
  new "create a new backup action" \
  quit "leave ninjahelper"

[ $? = 1 -o $? = 255 ] && exit 0;

choice="$REPLY"
if [ "$choice" == "new" ]; then
   donew;
elif [ "$choice" == "quit" ]; then
   exit 0;
else
   action=${actions[$choice]};
   if [ -f "$action" ]; then
      doaction $action
   else
      msgBox "error" "error: cannot find the file '$action'"
   fi
fi

done