#!/bin/sh
#set -x
# C. Ostheimer 05-2006, 10-2006; usb support contributions by dynamic
# v0.21, 061221
addon=asterisk
#server=http://192.168.222.10
#server=http://www.spblinux.de/fbox/lzma
server_24=http://www.spblinux.de/fbox.new/24/1
server_26=http://www.spblinux.de/fbox.new/26/1
#maximal size of tar archive with asterisk config files
#which is written to /var/flash/asterisk
max_conf_size=100000
ast_default_args="vvv"

# needs to be set by start option
verbose=true


if uname -r |grep -q "^2.6"; then
 [ "$server_26" ] && server=$server_26 && modext=ko
else
 [ "$server_24" ] && server=$server_24 && modext=o
fi

if [ x$1 = x-q ]; then quiet=1; shift; fi

export PATH=$PATH:/sbin:/usr/sbin:/var/$addon/bin
errorexit()
{
 echo -e "$@"
 exit 1
}
ramdisk_start()
# finds a free (=not mounted) ramdisk, frees it and returns it in $ramdev
{
 if uname -r |grep -q "^2.6"; then m_ext=ko; else m_ext=o; fi
 for f in rd.$m_ext freeramdisk; do
  case $f in
   *.$m_ext) lsmod |grep -q "^${f%%.*} " && continue
  esac
  [ -f $f ] || wget $server/$f || errorexit "failed to download $f"
  case $f in
   *.$m_ext) insmod $f || errorexit "failed to use module $f";;
   *) chmod +x $f;;
  esac
 done
 for i in 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 none; do
  mount |sed "s@^\([^ ]\+\).*@\1@" |grep -q "^/[dv][ea][vr]/r[da][/m]$i" && continue
  break
 done
 [ $i = none ] && errorexit "error: no free ramdisk found"
 [ -b ram$i ] || mknod ram$i b 1 $i
 ramdev=/var/ram$i
 ./freeramdisk $ramdev
}
ramdisk_stop()
# ramdisk_stop mount_dir (unmounts and frees the ramdisk mounted at mount_dir)
{
 unset ramdev
 echo "$1" |grep -q "\.\." && errorexit "error: path with '..' not allowed ($1)"
 # make absolute path
 if [ "${1#/}" = "$1" ]; then d=$PWD/${1#./}; else d=$1; fi
 for dev in `mount |grep " on $d " |sed "s@^\([^ ]\+\).*@\1@"`; do
  case ${dev%[0-9]} in
   /dev/rd/ | /dev/rd/1 | /dev/ram | /dev/ram1 | /var/ram | /var/ram1)
   umount $d || errorexit "failed to unmount $d (on $dev)"
   ramdev=$dev
   f=freeramdisk
   [ -f $f ] || wget $server/$f || errorexit "failed to download $f"
   chmod +x $f
   ./freeramdisk $ramdev && [ "${ramdev%/*}" = "/var" ] && rm $ramdev
  esac
 done
 # unload ramdisk module if all ramdisks are unmounted
 if ! mount |sed "s@^\([^ ]\+\).*@\1@" |grep -q "^/[dv][ea][vr]/r[da][/m][0-9]\+"; then
  lsmod |grep -q "^rd " && rmmod rd
  if uname -r |grep -q "^2.6"; then m_ext=ko; else m_ext=o; fi
  for f in rd.$m_ext freeramdisk; do
   [ -f $f ] && rm $f
  done
 fi
}

replace_word()
# replace_word file_with_path old_word new_word [description]
{
   f_tmp=/var/tmp/`basename "$1"`_$PPID
   cp $1 $f_tmp 
   if cat $f_tmp |sed "s/$2/$3/" >$1; then
    rm $f_tmp
   else
    echo "error: failed to write $3 ($4) into $1\n"
   fi
   unset f_tmp
}

usage()
{
 echo -e "usage:\n" \
	 " ${0##*/} install | usb_install | newkey | remove\n" \
	 " ${0##*/} start|stop [-h|asterisk|zebedee]\n" \
         " ${0##*/} config2flash|flash2config|clearflash [quiet] [minor]\n" \
         " ${0##*/} unionfs [start|stop]\n" \
         "              (experimental: 'installs' asterisk in / directory)\n"
 exit
}

usage_stop()
{
 echo -e "usage: cfg_asterisk start|stop [asterisk|zebedee]\n" \
         "Terminate asterisk and/or zebedee (default: kill both)"
 exit
}

usage_start()
{
  unset ast_start zbd_start # do not start programs if usage is shown
  OLDPWD_tmp=`pwd`
  cd /var/tmp/asterisk
  echo -e "usage:\n" \
       "${0##*/} start msn  [c|d|r [ip_asterisk2 [[pw_ast2] [zebedee zbd_ip zbd_port] [remote_user_nr]]]] \n" \
       "c=asterisk console (default), d=daemon, r=attach console to daemon\n" \
       "(msn is your external ISDN number, e.g. 1231239)\n" \
       "(ip_asterisk2 is the ip adress of a second asterisk, e.g. 192.168.0.2)\n" \
       "When zebedee is used, ip_asterisk2 has to be set to: localhost:4570 !\n" \
       "NOTE: msn (and ip) or only set at first start; else edit capi.conf + extensions.conf.\n" \
       "WARNING: check /var/tmp/asterisk/*.conf: \n("`ls`")\n" \
       "(e.g. edit with /var/$addon/bin/e3c /var/tmp/asterisk/extensions.conf)\n" \
       "do NOT continue if you do not have a knowledge about asterisk pbx.\n" \
       "(to stop asterisk at the console (*CLI>) type stop now;\n" \
       "to get colored output with linux: type export TERM=xterm)\n"
  if cmp /var/tmp/zebedee/client_fbox.key /var/asterisk/etc/zebedee/client_fbox.key.default >/dev/null 2>/dev/null; then
  echo -e "\nIf you will use tunneling with zebedee you should create your own key\n" \
       "by running ${0##*/} newkey; then you have to add the content of\n" \
       "/var/tmp/zebedee/client_fbox.id to your zebedee server id file.\n"
  fi
  cd "$OLDPWD_tmp"
  unset OLDPWD_tmp
  exit
}

# Download and source common functions for installation
if ! [ $1 = start ];then
 if [ "${0%%/*}" = "" ];then
  # $0 is starting with "/" ( absolute path )
  file_path=${0%/*}
 else
  if [ "${0%%/*}" = "." ];then
   # $0 is starting with "./" ( relative path to $PWD)
   file_path=$PWD/${0#./*}
   file_path=${file_path%/*}
  else
   # $0 is neither starting with "./" nor with "/" ( relative path to $PWD )
   file_path=$PWD/${0%/*}
  fi 
 fi 
 if [ -f $file_path/cfg.common ];then 
  . $file_path/cfg.common
 else
  wget $server/cfg.common -O /var/cfg.common || errorexit " Couldn't download cfg.common from $server"
  . /var/cfg.common
 fi
fi 

cd /var
case $1 in
usb_install | install)
 if mount |grep -q "on /var/$addon"; then
  errorexit "$addon is still mounted to /var/$addon. Installation aborted. Run cfg_asterisk [remove|usb_remove] first" 
 fi
 free
 echo "installing $addon ..."
 [ -d $addon ] || mkdir $addon
 if [ $1 = usb_install ]; then 
 ############ USB-INSTALL ####################################
  _fct instdir@/var/media/ftp:addons/$addon:inst_dir:inst_fs_type
  if [ $inst_fs_type = ext2 -o $inst_fs_type = ext -o $inst_fs_type = ext ];then
   cp_opts="-pP"
  else
   cp_opts=""
  fi 
  ############ USB-INSTALL, EXTRACT TO USB IF NOT EXTRACTED YET #######
  if ! [ -f $inst_dir/addons/$addon/bin/$addon ]; then
   echo "installing $addon on usb device (${inst_dir##*/})"
   # get $addon specific squashfs-archives from $server
   _fct wgetx@$server:$inst_dir/addons/$addon:$addon.sqf:${addon}_usb.sqf
   # get common install scripts / tools / modules from $server
   if ! [ $file_path = $inst_dir/addons ];then
    cp $cp_opts $file_path/cfg.common $inst_dir/addons
	cp $cp_opts $file_path/`basename $0` $inst_dir/addons
   else
    cp $cp_opts /var/cfg.common $inst_dir/addons
   fi
   _fct wgetx@$server:$inst_dir/addons:cfg.customize:chroot:freeramdisk:rd.$modext
   [ ko = $modext ] && _fct wgetx@$server:$inst_dir/addons:unionfs.$modext
   chmod +x $inst_dir/addons/cfg_asterisk $inst_dir/addons/cfg.customize $inst_dir/addons/freeramdisk $inst_dir/addons/chroot
   # freeramdisk required to be in /var by "ramdisk_start" function. create symbolic link
   _fct lnsf@/var:$inst_dir/addons/freeramdisk
   [ -d $addon.tmp ] || mkdir $addon.tmp
   mount |grep -q "on /var/$addon.tmp" && umount $addon.tmp
   if mount |grep -q "on /var/$addon.tmp"; then
    errorexit "error: /var/$addon.tmp already mounted; failed to unmount /var/$addon.tmp"
   else
    ramdisk_start
    echo -n "$addon.sqf -> $ramdev: "
    cat $inst_dir/addons/$addon/${addon}.sqf >$ramdev
    [ $? -eq 0 ] && mount $ramdev $addon.tmp
   fi
   if mount |grep -q "on /var/$addon.tmp"; then
    echo "Start extracting files ... please wait!"
    fr=/var/$addon.tmp
    to=$inst_dir/addons/$addon
    _fct cpnr@$cp_opts:$fr/bin:$to/bin
    _fct cpnr@$cp_opts:$fr/usr/lib:$to/usr_lib:libncurses.so.5.2
    _fct mkdr@$to:usr_lib_ast
    _fct mkdr@$to/usr_lib_ast:firmware:modules:sounds:agi-bin:mohmp3:keys
    _fct cprs@$cp_opts:$fr/usr/lib/asterisk/firmware.default:$to/usr_lib_ast/firmware
    _fct cprs@$cp_opts:$fr/usr/lib/asterisk/modules.default:$to/usr_lib_ast/modules
    _fct cprs@$cp_opts:$fr/usr/lib/asterisk/sounds.default:$to/usr_lib_ast/sounds
    _fct mkdr@$to:log_ast:spool_ast:etc/asterisk:etc/zebedee
    _fct cpdf@$cp_opts:$fr/etc/asterisk:$to/etc/asterisk
    _fct cpdf@$cp_opts:$fr/etc/zebedee:$to/etc/zebedee
    [ "$server" = "$server_24" ] && _fct cpnL@$fr/lib:$to/lib
    ramdisk_stop /var/$addon.tmp
    rm -r $addon.tmp
    echo "$addon has been successfully installed to usb device ${inst_dir##*/}"
   else
    errorexit "error: failed to download and mount $addon (on /var/$addon.tmp)"
   fi
  else  
   ############ USB-INSTALL, NO NEED TO EXTRACT FILES. ALREADY ON USB #####
   echo "$addon already on USB-Device ... skipping extract phase."
  fi 
  ########### CONTINUE USB-INSTALL AFTER REQUIRED FILES CONFIRMED ON USB-PATH ###########
  ramdisk_start
  cat $inst_dir/addons/$addon/${addon}_usb.sqf >$ramdev
  [ $? -eq 0 ] && mount $ramdev $addon
  _fct mntif@-t:proc:proc:/var/$addon/proc
  _fct mntif@-o:bind:/:/var/$addon/oldroot
  _fct mntif@-o:bind:/var:/var/$addon/oldroot/var
  _fct mntif@-o:bind:$inst_dir:/var/$addon/oldroot$inst_dir
  _fct lnsf@${addon}_usb:$inst_dir/addons/$addon
  _fct mkdr@/var:tmp:log:run:spool:lib/asterisk
  in=/var/lib/asterisk 
  to=../../${addon}_usb/usr_lib_ast
  _fct lnsf@/var/tmp:../${addon}_usb/etc/asterisk:../${addon}_usb/etc/zebedee
  _fct lnsf@$in:$to/agi-bin:$to/firmware:$to/keys:$to/modules:$to/mohmp3:$to/sounds
  cd /var/log
  _fct lnsf@$addon:../${addon}_usb/log_ast
  cd /var/spool
  _fct lnsf@$addon:../${addon}_usb/spool_ast
  # link all files required at start-up time into /var
  to=$inst_dir/addons
  _fct lnsf@/var:$to/cfg_asterisk:$to/cfg.common:$to/chroot:$to/freeramdisk:$to/rd.$modext:$to/unionfs.$modext
  cd /var
 else 
  ########### RAM-INSTALL #############################################
  _fct wgetx@$server:/var:chroot:freeramdisk:rd.$modext
  [ ko = $modext ] && _fct wgetx@$server:/var:unionfs.$modext
  chmod +x freeramdisk chroot
  ramdisk_start
  echo -n "$addon.sqf -> $ramdev: "
  if [ -f $addon.sqf ]; then
   cat $addon.sqf > $ramdev
  else
   _fct wgetx@$server:$ramdev:$addon.sqf
  fi 
  mount $ramdev $addon
  _fct mntif@-t:proc:proc:/var/$addon/proc
  _fct mntif@-o:bind:/:/var/$addon/oldroot
  _fct mntif@-o:bind:/var:/var/$addon/oldroot/var
  # Create required directory structures
  _fct mkdr@/var:run:log/asterisk:spool/asterisk:tmp/asterisk:tmp/zebedee:lib/asterisk/agi-bin
  _fct mkdr@/var/lib/asterisk:firmware:keys:modules:mohmp3:sounds
  # Copy default conf files if not existing on target dir strcuture 
  _fct cpdf@$cp_opts:/var/$addon/etc/asterisk:/var/$addon/var/tmp/asterisk
  _fct cpdf@$cp_opts:/var/$addon/etc/zebedee:/var/$addon/var/tmp/zebedee

  # create symlinks
  ro=/usr/lib/$addon
  rw=/var/$addon/var/lib/$addon
  echo -n "creating symlinks in $rw ... "
  _fct lndf2@$rw/modules:/var/$addon:$ro/modules.default
  _fct lndf2@$rw/sounds:/var/$addon:$ro/sounds.default
  _fct lndf2@$rw/mohmp3:/var/$addon:$ro/mohmp3.default
  _fct lndf2@$rw/keys:/var/$addon:$ro/keys.default
  _fct lndf2@$rw/firmware:/var/$addon:$ro/firmware.default
  echo "done."
 fi
 free
 echo "to use $addon type ./cfg_$addon start"
 if ! [ "$is_usb" ]; then
  [ "$0" != "./cfg_$addon" ] && echo "(or $0 start)"
 else
  echo "(or $inst_dir/$addon/${0##*/} start)"
  echo
  echo "After a reboot you may reinstall $addon from usb with"
  echo "$inst_dir/addons/$addon/${0##*/} usb_install"
 fi
 # check for existence of "cfg.customize" to perform user specific cfg_xyz customizations
 for d in /var $inst_dir/addons;do
  if [ -f $d/cfg.customize -a -x $d/cfg.customize ];then
   echo "Found addons customization script cfg.customize in $d. Will check & run customizations for $addon now."
   $d/cfg.customize allow `basename $0`
   break
  fi
 done  
 ;;
usb_remove | remove)
 [ $1 = usb_remove ] && is_usb=1
 mount |grep -q "on /var/$addon/oldroot/var/media/ftp/" && is_usb=1 && echo "default set to usb_remove"
 if ! mount |grep -q "on /var/$addon"; then
  [ "$quiet" ] || echo "addon $addon is not installed (has already been removed?)"
 else
  free
  echo "removing $addon ..."
  $0 -q stop ask asterisk zebedee || exit
  if mount |grep -q "^unionfs on .*/var/asterisk/unionfs"; then
   $0 -q unionfs stop || exit
  fi
  if [ "$is_usb" ]; then 
   d=`mount |grep /var/asterisk/oldroot/var/media/ftp |sed "s/^.* on \([^ ]*\).*/\1/"`
   instdir=${d#/var/asterisk/oldroot}
    if mount |grep -q "on $d"; then umount $d || errorexit "error: failed to unmount $d"; fi
  fi
  for d in /var/$addon/proc /var/$addon/oldroot/var /var/$addon/oldroot; do
   if mount |grep -q "on $d"; then umount $d || errorexit "error: failed to unmount $d"; fi
  done
  sleep 1
  ramdisk_stop /var/$addon
  if ! mount |grep -q "on /var/$addon"; then
   f=$addon.sqf
   [ -f $f ] && rm $f
#   [ -d $addon ] && rmdir $addon # labor firmware 4883 busybox comes without rmdir
   if [ -d $addon ]; then for x in $addon/*; do [ -r $x ]; break; rm -r $addon; done; fi
   if [ "$is_usb" ]; then
     [ -L  ${addon_usb} ] && rm ${addon}_usb
     for d in lib/asterisk spool/asterisk log/asterisk; do
      rm -r $d
     done
   elif [ -z "$quiet" ]; then
    echo "do you want to delete the changed contents of asterisk"
    echo "in /var/lib/asterisk and in /var/spool/asterisk, /var/log/asterisk"
    echo "in $rw_dir (Y/n)?"
    read key
    if [ "n" = "$key" ]; then
     echo "contents have not been deleted"
    else
     cd /var
     for d in lib/asterisk spool/asterisk log/asterisk; do
      rm -r $d
     done
    fi
   fi
   echo -n "done - (addon $addon has been removed"
   if [ "$is_usb" ]; then echo " from ram, not from usb)"; else echo ")"; fi
  fi
  free
 fi
 ;;
start)
 if ! [ -x /var/$addon/bin/asterisk -a -x /var/chroot ]; then
  errorexit "error: executable /var/$addon/bin/asterisk (or /var/chroot ) not found (try to run ${0##*/} install)"
 fi
 for running in asterisk none; do
   ps |grep -v grep |grep -q " $running" && break 
 done
 unset ast_start ast_args zbd_start default_config do_config
 # zebedee gets started if "zebedee" is one of the arguments (and not running)
 for x in $@; do
  [ "zebedee" = "$x" ] && zbd_start=1 && break
 done
 if [ "$zbd_start" ]; then # do not start a second instance of zebedee
   if ps |grep -v grep |grep -q " zebedee.bin"; then
    echo "warning: zebedee.bin is already running (no automatic restart)"
    unset zbd_start
   fi
 fi
 d=/var/asterisk/etc/asterisk
 for f in extensions.conf iax.conf sip.conf capi.conf none; do
   cmp $d/$f.default $d/$f >/dev/null 2>/dev/null && continue
   break
 done
 [ $f = none ] && default_config=1 # not yet configured
 if [ "x$2" = "x-h" ]; then
   usage_start
 elif [ $running = asterisk ]; then # connect to remote asterisk or warning
  if [ -z "$2" -o "$2" = "r" -a -z "$3" ]; then # no args or "r"
   ast_start=1
   ast_args="-rvvv"
  elif [ "$2" != "zebedee" -o "$3" ]; then # args given, but asterisk already running
                                     # (except arg "zebedee" -> start zebedee)
   echo -e "WARNING: asterisk is already running, if you want to use ${0##*/}"
   echo -e "to change config files do first stop asterisk with ${0##*/} stop [zebedee]\n"
   usage_start
  fi
 # asterisk is NOT running, then ... : 
 elif [ -z "$2" -o "$2" = "zebedee" -a -z "$3" ]; then # no args (except "zebedee")
  if [ "$default_config" ]; then  # no args, not yet configured
   usage_start
  else # no args but already configured: start asterisk/zebedee as daemon
   ast_start=1
   if ! [ "$zbd_start" ]; then # try to guess if zebedee is used
    cat $d/iax.conf |grep "register" |grep -q "localhost:4570" && zbd_start=1
   fi
  fi
 elif [ "$2" = "d" -o "$2" = "c" ]; then # only "d" "c" as arg (and "zebedee")
  if [ -z "$3" -o "$3" = "zebedee" -a -z "$4" ]; then
   if [ "$default_config" ]; then
    echo -e "WARNING: cannot start asterisk, because asterisk is not configured (msn...)\n"
    usage_start
   else
    ast_start=1
    ast_args="$2"
   fi
  else
   do_config=1
  fi
 else
  do_config=1
 fi 
 if [ "$do_config" ]; then
  unset is_configured
  while [ 1 ]; do
   d=/var/$addon/var/etc
   [ "$2" ] && replace_word $d/asterisk/capi.conf \
                 "1234567" "$2" "msn on external isdn S0 bus"
   [ "$3" -a "$3" != "d" ] && ast_args="$3"
   [ "$4" ] && replace_word $d/asterisk/extensions.conf \
                 "192.168.123.123" "$4" "address ip_asterisk2"
   [ "$5" -a "$5" != "zebedee" ] && replace_word $d/asterisk/iax.conf \
                 "geheim" "$5" "password of users asterisk2/asterisk2fbox"
   [ "$6" -a "$5" != "zebedee" -a "$6" != "zebedee" ] && newuser=$6
   [ "$6" -a "$6" = "zebedee" ] && shift
   if [ "$5" -a "$5" = "zebedee" ]; then
    [ "$6" ] && replace_word $d/zebedee/zbd.conf \
                 "11.22.33.44" "$6" "address of remote zebedee server"
    [ "$7" ] && replace_word $d/zebedee/zbd.conf \
                 "14569" "$7" "port of remote zebedee server"
    [ "$8" ] && newuser=$8
   fi
   if [ "$newuser" ]; then
    replace_word $d/asterisk/iax.conf \
                 "asterisk2" "asterisk$newuser" "nr of remote asteris server+users"
    replace_word $d/asterisk/extensions.conf \
                 "asterisk2" "asterisk$newuser" "nr of remote asteris server+users"
   fi
   is_configured=1
   ast_start=1
   break
  done
  if ! [ "$is_configured" ]; then
   echo -n "Error: invalid configuration arguments\n"
   usage_start
  fi
 fi
 [ "$TERM" ] || export TERM=xterm
 [ "$ast_args" ] && ast_args="${ast_args}${ast_default_args}"

 if [ "$zbd_start" ]; then
   [ -x /var/$addon/bin/zebedee.bin ] || errorexit "error: zebedee not found."
   if ps |grep -v grep |grep -q " zebedee.bin"; then
    echo "warning: zebedee.bin is already running (no automatic restart)"
   else
    /var/chroot /var/asterisk zebedee.bin -f /etc/zebedee/zbd.conf
   fi
 fi
 if [ "$ast_start" ]; then # (check, that asterisk is not running, already done) 
  if [ -d /var/${addon}_usb ] && ! [ -f /var/lib/$addon/astdb ]; then
   # restore astdb from usb device
   f=/var/${addon}_usb/var_lib_ast/astdb
   [ -f $f ] && cp $f /var/lib/$addon
  fi
  if [ "$ast_args" ]; then
   /var/chroot /var/asterisk asterisk -$ast_args
  else
   /var/chroot /var/asterisk asterisk -$ast_default_args &
  fi
 fi
 ;;
stop)
 [ "x$2" = "x-h" ] && usage_stop
 unset do_ask
 [ "x$2" = "xask" ] && do_ask=1 && shift
 f1=asterisk
 f2=zebedee.bin
 [ -z "$3" -a "$2" = "asterisk" ] && unset f2
 [ -z "$3" -a "$2" = "zebedee" ] && unset f1
  for x in TERM KILL result; do
   unset is_running
   for f in $f1 $f2; do
    [ "$f" ] || continue 
    if ps |grep -v grep |grep -v ${0##*/} |grep -q "$f "; then
     case $x in
      result)
       errorexit "error: cannot terminate process $f"
       ;;
      *)
       is_running=1
       key=y
       if [ "$do_ask" ]; then
        echo "$addon is running; do you want to terminate process $f (Y/n)"
	read key
	[ "n" = "$key" ] && errorexit "script terminated by user"
	echo "(to reset a terminal use command: stty sane)"
       fi
       killall -$x $f
       sleep 2
     esac
    fi
   done
   [ "$is_running" ] || break
  done
  if [ -d /var/${addon}_usb ]; then
   # save astdb on usb device
   d=/var/${addon}_usb/var_lib_ast
   f=/var/lib/${addon}/astdb
   [ -d $d ] || mkdir $d
   [ -f $f ] && cp $f $d
  fi
  [ "$quiet" ] || echo "run ${0##*/} remove to free memory by removing addon $addon from the system"
 ;;
newkey)
 if [ -x /var/$addon/bin/zebedee.bin -a -x /var/chroot ]; then
  /var/chroot /var/asterisk zebedee.bin -p >/var/tmp/zebedee/client_fbox.key
  /var/chroot /var/asterisk zebedee.bin -P -f /var/etc/zebedee/client_fbox.key \
     |sed "s/(none)/(fbox)/">/var/tmp/zebedee/client_fbox.id
  echo "add the new public key (/var/tmp/zebedee/client_fbox.id)"
  cat /var/tmp/zebedee/client_fbox.id
  echo "to your zebedee server id file and restart zebedee server"
 else
  echo "error: executable /var/$addon/bin/zebedee.bin (or /var/chroot ) not found (try to run ${0##*/} install)"
 fi
 ;;
config2flash | flash2config | clearflash)
 cd /var
 c=/var/flash/asterisk
 minor=101
 unset use_flash is_quiet
 if [ "$2" = "quiet" ]; then
  is_quiet=1
  [ "$3" ] && minor=$3
 fi
 [ "$3" = "quiet" ] && is_quiet=1 && minor=$2
 while [ 1 ]; do
  [ -c /var/flash/ar7.cfg ] || ( echo "error: /var/flash/ar7.cfg not found"; break )
  if ls -l /var/flash/ar7.cfg |grep -q "240, "; then
   major=240
  elif ls -l /var/flash/ar7.cfg |grep -q "250, "; then
   major=250
  elif ls -l /var/flash/ar7.cfg |grep -q "254, "; then
   major=254
  else
   echo "error: /var/flash/ar7.cfg has not expected major 240 (or 250 or 254)"
   break
  fi
  if [ "$minor" != "101" ]; then
   if [ $minor -ge 1 -a $minor -le 254 ]; then
    echo "using user defined minor $minor for flash config device /var/flash/asterisk"
   else
    echo "error: $minor is not a minor number 1 ... 254; NOT using flash config device"
    break
   fi
  fi
  use_flash=0
  if [ -c $c ]; then
   if ls -l /var/flash/ |grep "$major, *$minor" |grep -qv " asterisk$"; then
    ls -l /var/flash/ |grep "$major, *$minor"
    echo "error: another flash device exists with minor given for asterisk!"
    break
   fi
  else
   mknod $c c $major $minor
  fi
  if [ "$1" =  "config2flash" ]; then
   while [ 1 ]; do
    if checkempty $c 2>/dev/null; then
     break
    fi
    cat $c |tar t |grep -q "asterisk/extensions.conf" && break
    echo "error: /var/flash/asterisk is not empty and does not contain asterisk config data."
    break 2
   done
   f=/var/tmp/asteriskcfg.tar
   if ! /var/chroot asterisk tar cf /oldroot$f -C /var/tmp asterisk zebedee; then
    echo "error: creation of $f failed"
    break   
   fi
   cursize=`ls -l $f |sed "s/^.*root *\([0-9]*\) .*/\1/"`
   if [ $cursize -gt $max_conf_size ]; then
    echo "error: bigger than $max_conf_size bytes, not stored in flash ($f)"
    break   
   fi
   if [ -z "$is_quiet" ]; then
    key=n
    echo "do you really want to write to flash memory ($cursize bytes)? (y/N +enter)"
    echo "(if there is not enough free flash your fritzbox might stop working)"
    read key
    [ "$key" = "y" -o "$key" = "Y" ] || break
   fi
   if ! cat $f >/var/flash/asterisk; then
    echo "error: copying $f to $c failed"
    break   
   fi
   rm $f
   echo "success: configuration saved (/var/tmp/asterisk/* and /var/tmp/zebedee/*)"
  else # flash2config or clearflash
   while [ 1 ]; do
    if checkempty $c 2>/dev/null; then
     echo "error: flash device ($c) is empty"
     break 2
    fi
    cat $c |tar t |grep -q "asterisk/extensions.conf" && break
    echo "error: $c is not empty and does not contain asterisk config data."
    break 2
   done
   if [ -z "$is_quiet" ]; then
    key=n
    if [ "$1" = "flash2config" ]; then
     echo "do you really want to restore your asterisk configuration from flash? (y/N +enter)"
     echo "(all files in /var/tmp/asterisk and /var/tmp/zebedee get overwritten)"
    else # clearflash
     echo "do you really want to REMOVE your asterisk configuration from flash? (y/N +enter)"
    fi
    read key
    [ "$key" = "y" -o "$key" = "Y" ] || break
   fi
   if [ "$1" = "flash2config" ]; then
    if ! cat $c |tar x -C /var/tmp; then
     echo "error: creation of $f failed"
     break   
    fi
    echo "success: configuration restored (/var/tmp/asterisk/* and /var/tmp/zebedee/*) "
   else # clearflash
    > $c
    if ! checkempty $c 2>/dev/null; then
     echo "error: removing all content from $f failed"
     break   
    fi
    rm $c
    echo "success: configuration removed from flash ($c) "
   fi
  fi
  break
 done 
 ;;
unionfs)
 [ "$server" = "$server_24" ] && errorexit "error: unionfs only available with kernel 2.6" 
 case $2 in
  start)
   [ -f unionfs.ko ] || wget $server/unionfs.ko
   lsmod |grep -q "^unionfs " || insmod unionfs.ko
   for x in etc usr; do
    [ -d asterisk/unionfs/_$x ] || continue
    mount |grep -q "^unionfs on /$x " && continue
    mount -t unionfs -o ro,dirs=/$x:/var/asterisk/unionfs/_$x=ro unionfs /$x
   done
  ;;
  stop)
   for x in etc usr; do
    mount |grep -q "^unionfs on /$x " && umount /$x
   done  
  ;;
  *)
  echo "usage: ${0##*/} unionfs  [start|stop]"
 esac
 ;;
*)
 usage
esac

