#!/bin/sh
#
#set -x
# C. Ostheimer and <dynamic>: 05-2006, 10-2006, 12-2006, 05-2007; 12-2007; 03-2007
# v0.25, 071229 - asterisk 1.6beta4, chan-capi 1.02, chan_sccp 20071213
#put user defined post install commands into file cfg.customize 
#maximal size of tar archive with asterisk config files
#which is written to /var/flash/asterisk
addon=asterisk16
cfg_asterisk16_version=1.6.0beta4
cfg_common_req=2.1
max_conf_size=100000
ast_console_args="vvv"

#server=http://192.168.222.10 #or =ftp://user17:secret@1.2.3.4
server=http://www.spblinux.de/fbox
# cfg.common and cfg.customize are downloaded from $server and
# firmware version specific files are downloaded from $server$svr24 (or $svr26)
# (kernel 2.4/uClibc-0.9.26 or kernel 2.6/uClibc-0.9.28);
# default sub directories are /24[.zlib|.zlib16] and /26.
# svr24=/24
# svr26=/26

##############################################################################
# Copyright (C) cfg_asterisk14,  C. Ostheimer and <dynamic>, licensed under
# GNU General Public License version 2 (GPL v2.0)
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details; spblinux.de/fbox.new/gpl-2.0.txt

# command line option parsing
unset verbose quiet show_usage xprmnt disable downloaded_latest version_status
show_usage=0
[ $# -eq 0 ] && show_usage=1
while [ x$1 != x -a $show_usage -eq 0 ]; do case $1 in
 -z) [ "$svr24" ] || svr24=24.zlib;;
 -Z) [ "$svr24" ] || svr24=24.zlib16;;
 -v) verbose=1;;
 -q) quiet=1;;
 -x) xprmnt=1;;
 -s) echo $2 | grep -q -E "(http|ftp)://.*\..+" || (echo -e "\nParameter error: Wrong \"-s ...\" Option usage!" && show_usage=1)
     server="$2";shift;;
 -h | -\? | --help) show_usage=1;;
 -*) echo "warning: unknown option $1";;
 *) break
esac; shift; done

# Check version of cfg.common required for installation and download latest version if required
f=cfg.common
cfg_common_script=${0%cfg_*}$f
while true;do
 if [ -x $cfg_common_script ];then
  version_status="`$cfg_common_script cmp_version $cfg_common_req`"
  [ $verbose ] && echo $version_status
  if echo $version_status | grep -q "\-> OK";then
   break;
  else
   [ $downloaded_latest ] && echo -e "Fatal error: Cannot locate version v$cfg_common_req of $f file" && exit 1 
  fi 
 fi 
 cfg_common_script=/var/$f
 wget $server/$f -O $cfg_common_script || ( echo -e "Fatal error: Couldn't download $f from $server" && exit 1 )
 chmod +x $cfg_common_script
 downloaded_latest=1
done 

# Source common functions for installation from cfg.common
. $cfg_common_script

_fct cfgctl@${0##*/}:check:app_status

[ "$app_status" = "disabled" -a "$1" != "" ] && case $1 in
 stop|help|enable|remove|usb_remove);;
 *)
  echo "***************************************************************************" 
  echo "${0##*/} is currently in maintenance mode and will not allow"
  echo "any activities unless it is enabled via command line." 
  echo "Run: \"${0##*/} enable\", to activate normal operation mode again."
  echo "***************************************************************************" 
  exit
esac

modext=`_fct modext`
svrsub=`_fct svrsub`
export PATH=$PATH:/sbin:/usr/sbin:/var/$addon/bin

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" \
         "*******************************************************************************\n" \
	 " [INST_DIR=installa_dir] ${0##*/} [-v] [-x] install|usb_install\n" \
         "   install:     installs to ramdisk or to INST_DIR/addons if INST_DIR is given)\n" \
         "   usb_install: installs to /addons of autodetected usb device\n" \
         "   -x:          dynamically maps $addon into a RW root directory,\n" \
	 "                so that installation resides directly in \"/\"\n"\
	 "                (\"chroot /oldroot\" commands in extensions.conf will be removed)\n"\
         "   -v:          enables verbose mode for debugging purposes\n" \
         "   -s [ftp://[id:pw@]my_ftp_server.com|http://my_http_server.com]\n" \
         "\n" \
	 " ${0##*/} [-v] remove\n" \
         "\n" \
         " ${0##*/} [-v] disable | enable\n" \
         "   disable:     Application is put to maintenance mode and will neither start\n" \
	 "                nor install, even after reboot)\n" \
         "   enable:      Application is enabled again and will operate normally)\n" \
         "\n" \
	 " ${0##*/} [-v] start|stop [-h|[c|d|r]]\n" \
         "\n" \
         " ${0##*/} [-v] config2flash|flash2config|clearflash [quiet] [minor]\n" \
	 "   use builtin flash memory to make configuration permanent\n" \
	 "   (not required with usb install)\n" \
         "\n" \
         " not available: ${0##*/} [-v] bluetooth [start [12345 [0000]]|stop]\n" \
         "*******************************************************************************\n" 
#         " ${0##*/} [-v] unionfs [start|stop]\n" \
#         "   (experimental: 'installs' asterisk in / directory)\n"
 exit
}

usage_stop()
{
 echo -e "usage: ${0##*/} start|stop [asterisk|zebedee]\n" \
         "Terminate asterisk and/or zebedee (default: terminate both)"
 exit
}

usage_start()
{
  echo -e "usage:\n" \
       "${0##*/} [-v] start [c|d|r]\n" \
       "(or with root install: [TERM=xterm] asterisk [-cvvv|-d|-rvvv])\n" \
       "  start asterisk\n" \
       "  (c=asterisk console, d=daemon (default), r=attach console to running daemon;\n" \
       "   TERM=xterm asterisk -cvvv enables colored console output)\n" \
       "\n" \
       "${0##*/} [-v] start msn [c|d]\n" \
       "  set external ISDN number (msn, e.g. 1122334) in capi.conf\n" \
       "  and in extensions.conf (sets global variable CAPI_CALLERID)\n" \
       "  and start asterisk (ONLY possible with unmodified configuration)\n" \
       "  (recommended: edit capi.conf, extensions.conf instead of using ${0##*/}\n" \
       "   cd /var; ./asterisk16/bin/e3c ./asterisk16/etc/asterisk/capi.conf\n" \
       "   or with root install simply: e3c /etc/asterisk/capi.conf)\n" \
       "\n" \
       "  In case of usb install the configuration files are stored in\n" \
       "  addons/asterisk16/etc/asterisk/ on the usb storage device.\n" \
       "  Else you have to use config2flash to make your settings permanent\n" \
       "  (run ${0##*/} without arguments to see usage information).\n" \
       "\n" \
       "To get usage information about ip tunnel zebedee type ${0##*/} start -z\n" \
       "\n" \
       "WARNING: check the configuration files (capi.conf, 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"
  exit
}
usage_start_zebedee()
{
  echo -e "usage:\n" \
       "${0##*/} [-v] start [c|d|r] [asterisk] zebedee\n" \
       "  start (asterisk and) encrypted ip tunnel zebedee\n" \
       "  for iax2 connection to a second asterisk with zebedee\n" \
       "  (www.winton.org.uk/zebedee/)\n" \
       "\n" \
       "${0##*/} [-v] start [msn] [c|d] asterisk [ip_asterisk2 [pw_ast2\n" \
       "          [zebedee zbd_ip zbd_port] [remote_user_nr]]]\n" \
       "  configure (asterisk and) zebedee and start (asterisk and) zebedee\n" \
       "  (ONLY possible with unmodified configuration)\n" \
       "  (recommended: edit extensions.conf, iax.conf instead of using ${0##*/})\n" \
       "\n" \
       "${0##*/} [-v] newkey\n" \
       "  For 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" \
       "  (with root install: /etc/zebedee/client_fbox.id)\n"
  exit
}

#echo TEST
#echo "modext $modext, svrsub $svrsub."
#get_inst_realdir_ $INST_DIR
#get_inst_realdir_
#get_missing_file_ chroot
#_fct rdsk@new:ramdev && echo "--$ramdev--"
#echo END_TEST

[ $show_usage -eq 1 ] && usage
cd /var
[ "$modext" = "o" ] && errorexit "in this version of cfg_asterisk16 only kernel 2.6 is supported." 
case $1 in
usb_install | install)
 mount |grep -q "on /var/$addon" && errorexit "$addon is still mounted to /var/$addon.\nInstallation aborted. Run ${0##*/} [remove|usb_remove] first" 
 [ -f /bin/asterisk ] && errorexit "$addon already appears to be installed direclty into root path.\nInstallation aborted. Run ${0##*/} [remove|usb_remove] first"
 unset is_usb
 [ $1 = usb_install ] && is_usb=1
 free
 if [ "$INST_DIR" ]; then
  if [ -d "$INST_DIR" ]; then
   [ $1 = install ] && echo -n "defaulting to "
   echo "usb_install on $INST_DIR(="`get_inst_realdir_ $INST_DIR`") (given by variable INST_DIR)"
   echo "(if this is not correct run: unset INST_DIR)"
   is_usb=1
  else
   echo "warning: INST_DIR(=$INST_DIR) defined, but not a directory"
   echo "         using default install to ramdisk"
   sleep 10
  fi
 else
  echo "installing $addon ($server$svrsub) ..."
 fi
 [ -d $addon ] || mkdir $addon
 if [ "$is_usb" ]; then 
 ############ USB-INSTALL ####################################
  # check for user defined installation directory given in $INST_DIR
  if [ "$INST_DIR" ]; then
   _fct instdir@`get_inst_realdir_ $INST_DIR`:addons/$addon:inst_dir:inst_fs_type
  else
   _fct instdir@/var/media/ftp:addons/$addon:inst_dir:inst_fs_type
  fi
  case $inst_fs_type in
   msdos | vfat | ntfs)
    cp_opts=""
    ;;
   *)
    cp_opts="-pd"
  esac
  ############ USB-INSTALL, EXTRACT TO USB IF NOT EXTRACTED YET #######
  if ! [ -f $inst_dir/addons/$addon/bin/asterisk ]; then
   echo "installing $addon on usb device (${inst_dir##*/})"
   # get $addon specific squashfs-archives from $server$svrsub
   _fct wgetx@$server$svrsub:$inst_dir/addons/$addon:$addon.sqf:${addon}_usb.sqf
   # get common install scripts / tools / modules from $server$svrsub
   file_path=`_fct path_abs@$0`
   if [ $file_path != $inst_dir/addons ];then
    # not called from $inst_dir/addons: install on $inst_dir/addons
    cp $cp_opts $file_path/cfg.common $inst_dir/addons
    cp $cp_opts $file_path/`basename $0` $inst_dir/addons
   fi
   _fct wgetx@$server$svrsub:$inst_dir/addons:chroot:freeramdisk:rd.$modext
   _fct wgetx@$server:$inst_dir/addons:cfg.customize
   [ ko = $modext ] && _fct wgetx@$server$svrsub:$inst_dir/addons:unionfs.$modext
   chmod +x $inst_dir/addons/cfg_$addon $inst_dir/addons/cfg.customize $inst_dir/addons/freeramdisk $inst_dir/addons/chroot
   [ -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
    _fct rdsk@start:$inst_dir/addons
    # get free ramdisk and store device_name_and_path in variable ramdev
    _fct rdsk@new:ramdev:$inst_dir/addons
    echo -n "$addon.sqf -> $ramdev: "
    cat $inst_dir/addons/$addon/${addon}.sqf >$ramdev
    [ $? -eq 0 ] && mount $ramdev $addon.tmp \
       || _fct fallback@$inst_dir/addons/$addon/$addon.sqf:$inst_dir/addons/$addon/${addon}_usb.sqf
   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
#    [ $xprmnt ] && if cat $fr/etc/asterisk/extensions.conf.default |grep -q "chroot /oldroot "; then
#     echo "(root install: removing \"chroot /oldroot \" from extensions.conf;"
#     echo "with backup extensions.conf.nonroot)"
#    fi
    _fct cpnr@$cp_opts:$fr/bin:$to/bin
    _fct cpnr@$cp_opts:$fr/modules:$to/modules
    _fct cpnr@$cp_opts:$fr/usr/lib:$to/usr/lib:libncurses.so.5.6
    [ -f $fr/usr/lib/libgcc_s.so.1 ] && _fct cpnr@$cp_opts:$fr/usr/lib:$to/usr/lib:libgcc_s.so.1
    [ -f $fr/usr/lib/libresolv-0.9.28.so ] && _fct cpnr@$cp_opts:$fr/usr/lib:$to/usr/lib:libresolv-0.9.28.so
    [ -f $fr/usr/lib/libgsm.so.1.0.10 ] && _fct cpnr@$cp_opts:$fr/usr/lib:$to/usr/lib:libgsm.so.1.0.10
    _fct mkdr@$to:usr/lib/asterisk:var/lib/asterisk:var/lib/bluetooth
    _fct mkdr@$to/usr/lib/asterisk:modules:keys
    _fct mkdr@$to/var/lib/asterisk:firmware:sounds:agi-bin:moh:mohmp3
    _fct cprs@$cp_opts:$fr/usr/lib/asterisk/firmware.default:$to/var/lib/asterisk/firmware
    _fct cprs@$cp_opts:$fr/usr/lib/asterisk/modules.default:$to/usr/lib/asterisk/modules
    _fct cprs@$cp_opts:$fr/usr/lib/asterisk/moh.default:$to/var/lib/asterisk/moh
    _fct cprs@$cp_opts:$fr/usr/lib/asterisk/sounds.default:$to/var/lib/asterisk/sounds
    _fct mkdr@$to:log/asterisk:spool/asterisk:etc/asterisk:etc/zebedee:etc/bluetooth
    _fct cpdf@$cp_opts:$fr/etc/asterisk:$to/etc/asterisk
    _fct cpdf@$cp_opts:$fr/etc/zebedee:$to/etc/zebedee
    _fct cpdf@$cp_opts:$fr/etc/bluetooth:$to/etc/bluetooth
    f=$to/etc/asterisk/extensions.conf
#    [ $xprmnt ] && if cat $f |grep -q "chroot /oldroot "; then
#     [ -f $f.nonroot ] || cp $f $f.nonroot
#     replace_word $f "chroot /oldroot " ""
#    fi
    [ "$modext" = "o" ] && _fct cpnL@$fr/lib:$to/lib
    umount /var/$addon.tmp
    _fct rdsk@free:$ramdev:$inst_dir/addons
    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."
   f=$inst_dir/addons/$addon/etc/asterisk/extensions.conf
   [ $xprmnt ] || if [ -f $f.nonroot ]; then
    echo "Error: previous \"root install\" configuration file found:"
    echo
    echo "Either continue to use  \"root install\""
    echo "  ${0##*/} -x usb_install"
    echo "or rename in directory ${f%/*}"
    echo "  extensions.conf to extensions.conf.rootinst and"
    echo "  extensions.conf.nonroot to extensions.conf"
    echo "(warning: extensions.conf might have to be updated manually)"
    exit 1
   fi
  fi 
  ########### CONTINUE USB-INSTALL AFTER REQUIRED FILES CONFIRMED ON USB-PATH ###########
   if [ $xprmnt ];then
    ########### EXPERIMENTAL ROOT INSTALL ###########
    echo "Preparing root install ..."
    for ovrly_dir in etc bin lib;do
     [ -d $inst_dir/addons/$addon/$ovrly_dir ] && \
     _fct ovrly@RO:/$ovrly_dir:$inst_dir/addons/$addon/$ovrly_dir
    done
    if [ -d /usr/lib ]; then
     _fct ovrly@RO:/usr/lib:$inst_dir/addons/$addon/usr/lib
    else
     _fct ovrly@RO:/usr
     # Special handling for 7270, as ctlmgr cannot work with symlinked www
     [ "$svrsub" = "/26-ur8" -a -L /usr/www ] && rm /usr/www && mkdir /usr/www && mount -o bind /var/_RO_/usr/www /usr/www
     mkdir_rcrsv_ /usr/lib
     _fct lnsf@/usr/lib/libncurses.so.5.6:$inst_dir/addons/$addon/usr/lib/libncurses.so.5.6
     [ -f $inst_dir/addons/$addon/usr/lib/libgcc_s.so.1 ] && _fct lnsf@/usr/lib/libgcc_s.so.1:$inst_dir/addons/$addon/usr/lib/libgcc_s.so.1
     [ -f $inst_dir/addons/$addon/usr/lib/libresolv-0.9.28.so ] && _fct lnsf@/usr/lib/libresolv-0.9.28.so:$inst_dir/addons/$addon/usr/lib/libresolv-0.9.28.so
     [ -f $inst_dir/addons/$addon/usr/lib/libgsm.so.1.0.10 ] && _fct lnsf@/usr/lib/libgsm.so.1.0.10:$inst_dir/addons/$addon/usr/lib/libgsm.so.1.0.10
     _fct lnsf@/usr/lib/asterisk:$inst_dir/addons/$addon/usr/lib/asterisk
    fi
    _fct lnsf@/usr/lib/libncurses.so.5:libncurses.so.5.6
    [ -f /usr/lib/libresolv-0.9.28.so ] && _fct lnsf@/usr/lib/libresolv.so.0:libresolv-0.9.28.so
    [ -f /usr/lib/libgsm.so.1.0.10 ] && _fct lnsf@/usr/lib/libgsm.so.1:libgsm.so.1.0.10
    _fct mkdr@/var:tmp:log:run:spool:lib/asterisk
    _fct lnsf@/var/log/asterisk:$inst_dir/addons/$addon/log/asterisk
    _fct lnsf@/var/spool/asterisk:$inst_dir/addons/$addon/spool/asterisk
    _fct lnsf@/var/lib/asterisk/agi-bin:$inst_dir/addons/$addon/var/lib/asterisk/agi-bin
    _fct lnsf@/var/lib/asterisk/firmware:$inst_dir/addons/$addon/var/lib/asterisk/firmware
    _fct lnsf@/var/lib/asterisk/moh:$inst_dir/addons/$addon/var/lib/asterisk/moh
    _fct lnsf@/var/lib/asterisk/mohmp3:$inst_dir/addons/$addon/var/lib/asterisk/mohmp3
    _fct lnsf@/var/lib/asterisk/sounds:$inst_dir/addons/$addon/var/lib/asterisk/sounds
    ########### EXPERIMENTAL ROOT INSTALL FINISH ###########
   else
    file_path=`_fct path_abs@$0`
    if [ $file_path = $inst_dir/addons ]; then
     # called from $inst_dir/addons: create copy in /var
     cp $cp_opts $inst_dir/addons/cfg.common /var
     cp $cp_opts $inst_dir/addons/`basename $0` /var
    fi
   _fct rdsk@start:$inst_dir/addons
   _fct rdsk@new:ramdev:$inst_dir/addons
   cat $inst_dir/addons/$addon/${addon}_usb.sqf >$ramdev
   [ $? -eq 0 ] && mount $ramdev $addon || _fct fallback@$inst_dir/addons/$addon/${addon}_usb.sqf
   _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/asterisk
   _fct lnsf@/var/tmp:../${addon}_usb/etc/asterisk:../${addon}_usb/etc/zebedee:../${addon}_usb/etc/bluetooth
   _fct lnsf@$in:$to/keys:$to/modules
   to=../../${addon}_usb/var/lib/asterisk
   _fct lnsf@$in:$to/agi-bin:$to/firmware:$to/moh:$to/mohmp3:$to/sounds
   cd /var/log
   _fct lnsf@asterisk:../${addon}_usb/log/asterisk
   cd /var/spool
   _fct lnsf@asterisk:../${addon}_usb/spool/asterisk
   cd /var
  fi 
 else 
  ########### RAM-INSTALL #############################################
  _fct wgetx@$server$svrsub:/var:chroot:freeramdisk:rd.$modext
#  [ ko = $modext ] && _fct wgetx@$server$svrsub:/var:unionfs.$modext
  _fct wgetx@$server:/var:cfg.customize
  chmod +x freeramdisk chroot cfg.customize
  _fct rdsk@start
  _fct rdsk@new:ramdev
  echo -n "$addon.sqf -> $ramdev: "
  if [ -f $addon.sqf ]; then
   cat $addon.sqf > $ramdev
  else
   _fct wgetx@$server$svrsub:$ramdev:$addon.sqf
  fi 
  mount $ramdev $addon || _fct fallback@$addon.sqf
  # Remove symlinks which might be left over from last usb_install
  for f in /var/${addon}_usb /var/tmp/asterisk /var/tmp/zebedee; do
   [ -L $f ] && rm $f
  done
  if [ $xprmnt ];then
  ########### EXPERIMENTAL ROOT INSTALL ###########
  #umount /etc /usr/lib /bin;rm -rf /var/_RW_;cfg_asterisk16 remove
   echo "Preparing root install ..."
   for ovrly_dir in etc bin lib;do
     [ -d /var/$addon/$ovrly_dir ] && case $ovrly_dir in
      etc) _fct ovrly@RO:/$ovrly_dir;;
      *) _fct ovrly@RO:/$ovrly_dir:/var/$addon/$ovrly_dir
     esac
   done
   if [ -d /usr/lib ]; then
    _fct ovrly@RO:/usr/lib
    mkdir_rcrsv_ /usr/lib/asterisk
   else
    _fct ovrly@RO:/usr
    # Special handling for 7270, as ctlmgr cannot work with symlinked /usr/www
    # and because it should not hurt, use this patch for all boxes
#    [ "$svrsub" = "/26-ur8" -a -L /usr/www ] && rm /usr/www && mkdir /usr/www && mount -o bind /var/_RO_/usr/www /usr/www
    [ -L /usr/www ] && rm /usr/www && mkdir /usr/www && mount -o bind /var/_RO_/usr/www /usr/www
    mkdir_rcrsv_ /usr/lib/asterisk
   fi
   [ -f /var/$addon/usr/lib/libgcc_s.so.1 ] && _fct lnsf@/usr/lib/libgcc_s.so.1:/var/$addon/usr/lib/libgcc_s.so.1
   [ -f /var/$addon/usr/lib/libresolv.so.0 ] && _fct lnsf@/usr/lib/libresolv.so.0:/var/$addon/usr/lib/libresolv.so.0
   [ -f /var/$addon/usr/lib/gsm.so.1 ] && _fct lnsf@/usr/lib/libgsm.so.1:/var/$addon/usr/lib/libgsm.so.1
   _fct lnsf@/usr/lib/libncurses.so.5.6:/var/$addon/usr/lib/libncurses.so.5.6
   _fct lnsf@/usr/lib/libncurses.so.5:libncurses.so.5.6
   # create symlinks
   ro=/var/$addon
   mkdir_rcrsv_ /usr/lib/asterisk
   _fct mkdr@/usr/lib/asterisk:keys:modules
   echo "Creating default conf files ..."
#   if cat $ro/etc/asterisk/extensions.conf.default |grep -q "chroot /oldroot "; then
#    echo "and removing \"chroot /oldroot \" from extensions.conf;"
#    echo "(with backup extensions.conf.nonroot)"
#   fi
   _fct cpdf@$cp_opts:$ro/etc/asterisk:/etc/asterisk
   _fct cpdf@$cp_opts:$ro/etc/zebedee:/etc/zebedee
   _fct cpdf@$cp_opts:$ro/etc/bluetooth:/etc/bluetooth
   f=/etc/asterisk/extensions.conf
#   if cat $f |grep -q "chroot /oldroot "; then
#    [ -f $f.nonroot ] || cp $f $f.nonroot
#    replace_word $f "chroot /oldroot " ""
#   fi
   echo "creating symlinks in /usr/lib/asterisk/ and /var/lib/asterisk ... "
   _fct lndf@/usr/lib/asterisk/modules:$ro/usr/lib/asterisk/modules.default
   _fct mkdr@/var:run:log/asterisk:spool/asterisk:lib/asterisk/agi-bin:lib/bluetooth;
   _fct mkdr@/var/lib/asterisk:firmware/iax:moh:mohmp3:sounds/de
   _fct lndf@/var/lib/asterisk/firmware/iax:$ro/usr/lib/asterisk/firmware.default/iax
   _fct lndf@/var/lib/asterisk/moh:$ro/usr/lib/asterisk/moh.default
   _fct lndf@/var/lib/asterisk/mohmp3:$ro/usr/lib/asterisk/mohmp3.default
   _fct lndfe@/var/lib/asterisk/sounds:$ro/usr/lib/asterisk/sounds.default:de
   _fct lndf@/var/lib/asterisk/sounds/de:$ro/usr/lib/asterisk/sounds.default/de
   echo "done."
   cd /var
   ########### EXPERIMENTAL ROOT INSTALL FINISH ###########
  else 
   _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:tmp/bluetooth:lib/asterisk/agi-bin
   _fct mkdr@/var/lib/asterisk:firmware:keys:modules:moh: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
   _fct cpdf@$cp_opts:/var/$addon/etc/bluetooth:/var/$addon/var/tmp/bluetooth

   # create symlinks
   ro=/usr/lib/asterisk
   rw=/var/$addon/var/lib/asterisk
   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/moh:/var/$addon:$ro/moh.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 
 fi
 ########### COMMON-INSTALL (RAM and USB) #############################
 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/addons/${0##*/} start)"
  echo
  echo "After a reboot you may reinstall $addon from usb with"
  echo "$inst_dir/addons/${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
   [ "$verbose" ] && 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
 if [ -f /bin/asterisk ];then
  free
  echo "Started removing $addon ..."
  $0 -q stop ask asterisk zebedee || exit
  echo "*************************************************************************"
  echo "Your current $addon installation is stored in \"/\" ( root directories ) and" 
  echo "requires a System Reboot for clean completion of the de-installation."
  _fct cfgctl@`basename $0`:disable
  echo "Reboot your system now via \"reboot\" to complete the de-installation of $addon"
  [ "$is_usb" ] && echo "Your $addon files that were stored on your usb will not be deleted."
  echo "*************************************************************************"
  free
  exit
 fi 
 inst_dir=`get_inst_realdir_`
 [ "$inst_dir" ] && is_usb=1 && echo -e "default set to usb_remove\n(if this is not correct run: rm /var/${addon}_usb )\n"
# 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/$addon/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}
    d=/var/$addon/oldroot$inst_dir
    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
  if [ "$is_usb" ]; then 
   for f in /var/tmp/asterisk /var/tmp/zebedee; do
    [ -L $f ] && rm $f
   done
  fi
#  ramdisk_stop /var/$addon
  _fct rdsk@get_device:ramdev:/var/$addon || unset ramdev
  umount /var/$addon
  [ "$ramdev" ] && _fct rdsk@free:$ramdev
  _fct rdsk@stop
  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)
 unset app_path
 if [ -f /bin/asterisk ];then
  app_path=""
  chroot=""
 else
  app_path="/var/$addon"
  get_missing_file_ -x chroot
  chroot="/var/chroot /var/$addon"
 fi 
 if ! [ -x $app_path/bin/asterisk ]; then
  errorexit "error: executable [$app_path]/bin/asterisk not found. You need to run first\n \"${0##*/} [-x] usb_install | install\""
 fi
 for running in asterisk none; do
   ps |grep -v grep |grep -q " $running" && break 
 done
 unset ast_opt ast_run ast_msn ast2_ip ast2_pw ast2_nr zbd_run zbd_ip zbd_port
 for x in $@ none; do
  case $x in
   start | asterisk | zebedee) y=$x; continue;;
  esac
  case $y in
   start) 
    case $x in
     none)ast_run=1;;
     -h) usage_start;;
     -z) usage_start_zebedee;;
     c|d|r)ast_run=1;;
     [0-9]*[0-9])ast_msn=$x;;
     *)echo "warning: unknown option: $x"
    esac
    case $x in
     c|r)ast_opt="-${x}${ast_console_args#-}";;
    esac
    ;;
   asterisk) 
    ast_run=1
    case $x in
     none|d);;
     c|r)ast_opt="-${x}${ast_console_args#-}";;
     *)
      if [ -z "$ast2_ip" ]; then ast2_ip=$x
      elif [ -z "$ast2_pw" ]; then ast2_pw=$x
      else ast2_nr=$x; fi
    esac
    ;;
   zebedee)
    zbd_run=1
    case $x in
     none);;
     *)
      if [ -z "$zbd_ip" ]; then zbd_ip=$x
      elif [ -z "$zbd_port" ]; then zbd_port=$x
      else ast2_nr=$x; fi
    esac
    ;;
  esac
 done
# echo "ast_opt=$ast_opt ast_run=$ast_run ast_msn=$ast_msn ast2_ip=$ast2_ip ast2_pw=$ast2_pw ast2_nr=$ast2_nr zbd_run=$zbd_run zbd_ip=$zbd_ip zbd_port=$zbd_port"
 if [ "$zbd_run" ]; 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_run
    if [ "$zbd_ip" -o "$zbd_port" ]; then
     echo "cannot set zebedee ip address and port (ignoring; use ${0##*/} stop zebedee)"
     unset zbd_ip zbd_port
    fi
   fi
 fi
 if [ $running = asterisk -a "$ast_run" ]; then # connect to remote asterisk or warning
  case x$ast_opt in
    x)
     echo "asterisk is already running (to open a console use: ${0##*/} start r)"
     unset ast_run
     ;;
    -c*)
     echo "asterisk is already running, connecting to remote asterisk"
     ast_opts="-r${ast_console_args#-}"
  esac
 fi
 [ $running = asterisk ] && if [ "$ast_msn" -o "$ast2_ip" -o "$ast2_pw" -o "$ast2_nr" ]; then
  case x$ast_opt in
    x-r*|x)
     echo "error: asterisk is running, cannot set configuration (use ${0##*/} stop)"
     echo "($@)"
     exit 1
  esac
 fi
   d=$app_path/etc
   if [ "$ast_msn" ]; then
    replace_word $d/asterisk/capi.conf \
                 "1234567" "$ast_msn" "msn on external isdn S0 bus"
    replace_word $d/asterisk/extensions.conf \
                 "CAPI_CALLERID=1234567" "CAPI_CALLERID=$ast_msn" "msn on external isdn S0 bus"
   fi
   [ "$ast2_ip" ] && replace_word $d/asterisk/extensions.conf \
                 "192.168.123.123" "$ast2_ip" "address ip_asterisk2"
   [ "$ast2_pw" ] && replace_word $d/asterisk/iax.conf \
                 "geheim" "$ast2_pw" "password of users asterisk2/asterisk2fbox"
    [ "$zbd_ip" ] && replace_word $d/zebedee/zbd.conf \
                 "11.22.33.44" "$zbd_ip" "address of remote zebedee server"
    [ "$zbd_port" ] && replace_word $d/zebedee/zbd.conf \
                 "14569" "$zbd_port" "port of remote zebedee server"
   if [ "$ast2_nr" ]; then
    replace_word $d/asterisk/iax.conf \
                 "asterisk2" "asterisk$ast2_nr" "nr of remote asterisk server+users"
    replace_word $d/asterisk/extensions.conf \
                 "asterisk2" "asterisk$ast2_nr" "nr of remote asterisk server+users"
   fi
 [ "$TERM" ] || export TERM=xterm
 [ "$ast_args" ] && ast_args="${ast_args}${ast_console_args}"

 if [ "$zbd_run" ]; then
   [ -x $app_path/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
    $chroot zebedee.bin -f /etc/zebedee/zbd.conf
   fi
 fi
 if [ "$ast_run" ]; 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 UNUSED??
   f=/var/${addon}_usb/var/lib/asterisk/astdb
   [ -f $f ] && cp $f /var/lib/$addon
  fi
  $chroot asterisk $ast_opt
  case x$ast_opt in
    x|x-d*)
     echo "asterisk daemon has been started (to open a console use: ${0##*/} start r)"
  esac
 fi
 ;;
stop)
 [ "x$2" = "x-h" ] && usage_stop
 unset app_path
 if [ -f /bin/asterisk ];then
  app_path=""
  chroot=""
 else
  app_path="/var/$addon"
  get_missing_file_ -x chroot
  chroot="/var/chroot /var/$addon"
 fi 
 if ! [ -x $app_path/bin/asterisk ]; then
  errorexit "error: executable [$app_path]/bin/asterisk not found. You need to run \"${0##*/} [-x] usb_install | install\" first"
 fi
 unset do_ask
 [ "x$2" = "xask" ] && do_ask=1 && shift
 f1=asterisk
 f2=zebedee.bin
 f3=sdpd
 f4=hcid
 [ -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 $f3 $f4; 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
       if [ $x = TERM -a $f = asterisk ]; then
        $chroot asterisk -rx "stop now"
       else
        killall -$x $f
       fi
       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/asterisk
   f=/var/lib/${addon}/astdb
   [ -d $d ] || mkdir $d
   [ -f $f ] && cp $f $d
   # save bluetooth pairing information on usb device
   d=/var/${addon}_usb/var/lib/bluetooth
   f="/var/lib/bluetooth/*"
   [ -d $d ] || mkdir $d
   for ff in $f; do [ -d $ff -o -f $ff ] && cp -r $ff $d; done
  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/$addon zebedee.bin -p >/var/tmp/zebedee/client_fbox.key
  /var/chroot /var/$addon 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
 ;;

disable | enable )
 if [ "$1" = "disable" ];then
  _fct cfgctl@`basename $0`:disable
 else
  _fct cfgctl@`basename $0`:enable
 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
   unset D
   if [ -d /var/lib/bluetooth -a -d /var/tmp/bluetooth ]; then
    D=bluetooth
    [ -d /var/tmp/bluetooth/bak ] && rm -r /var/tmp/bluetooth/bak
    mkdir /var/tmp/bluetooth/bak
    cp -r /var/lib/bluetooth /var/tmp/bluetooth/bak/
   fi
   rm -r /var/tmp/asterisk/*~ /var/tmp/zebedee/*~ /var/tmp/bluetooth/*~ 2>/dev/null

   if ! /var/chroot $addon tar cf /oldroot$f -C /var/tmp asterisk zebedee $D; 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
   [ -d /var/tmp/bluetooth/bak/bluetooth ] && rm -r /var/tmp/bluetooth/bak
   rm $f
   echo "success: configuration saved (from /var: tmp/asterisk, tmp/zebedee, tmp/bluetooth, lib/bluetooth)"
  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 "(in /var all files in tmp/asterisk, tmp/zebedee, tmp/bluetooth, lib/bluetooth 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
    [ -d /var/lib/bluetooth ] && rm -r /var/lib/bluetooth
    if ! cat $c |tar x -C /var/tmp; then
     echo "error: creation of $f failed"
     break   
    fi
    if [ -d /var/tmp/bluetooth/bak/bluetooth ]; then
     [ -d /var/lib/bluetooth ] && rm -r /var/lib/bluetooth
     cp -r /var/tmp/bluetooth/bak/bluetooth /var/lib && rm -r /var/tmp/bluetooth/bak
    fi
    echo "success: configuration restored (in /var: tmp/asterisk/*, tmp/zebedee/*, tmp/bluetooth/* lib/bluetooth) "
   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)
 [ "$modext" = "o" ] && errorexit "error: unionfs only available with kernel 2.6" 
 case $2 in
  start)
   [ -f unionfs.$modext ] || wget $server$svrsub/unionfs.$modext
   lsmod |grep -q "^unionfs " || insmod unionfs.$modext && rm unionfs.$modext
   for x in etc usr; do
    [ -d $addon/unionfs/_$x ] || continue
    mount |grep -q "^unionfs on /$x " && continue
    mount -t unionfs -o ro,dirs=/$x:/var/$addon/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
 ;;
bluetooth)
# errorexit "bluetooth not available in this version."
 [ "$modext" = "o" ] && errorexit "error: bluetooth only available with kernel 2.6" 
 case $2 in
  start)
   #enable kernel messages for debugging (takeover_printk=0)
   if [ "" ]; then # disabled because reloading ubik2 breaks isdn
   echo -n "enabling kernel messages (dmesg)... "
   killall telefon
   rmmod isdn_fbox_fon4
   sleep 2
   rmmod ubik2
   modprobe ubik2 takeover_printk=0
   modprobe isdn_fbox
   sleep 2
   telefon a127.0.0.1
   echo "done."
   fi
   # end: enable kernel messages
   if [ "" ]; then # disabled because loading hci_usb without stooping daemons crashes 7270
   [ -d $addon/modules ] || errorexit "error: $addon not installed; run ${0##*/} install"
   for m in bluetooth hci_usb l2cap rfcomm sco; do
    [ -f $addon/modules/$m.$modext ] || errorexit "error: module $m.$modext not found"
    lsmod |grep -q "^$m " || insmod $addon/modules/$m.$modext
   done
   fi
   D=tmp/bluetooth
   [ -d $D ] || mkdir $D
   if [ "$3" ]; then
    echo "$3" |sed "s/[0-9]*/x/" |grep -qv "^x$" && errorexit "error: invalid pin: $3; (only numbers allowed)" 
    [ -f $D/pin ] && cat $D/pin |grep -qv "$3" && echo "warning: overwriting existing asterisk pin"
    pin_own=$3
    if [ "$4" ]; then
     echo "$4" |sed "s/[0-9]*/x/" |grep -qv "^x$" && errorexit "error: invalid pin: $4; (only numbers allowed)" 
     [ -f $D/givepin ] && cat $D/givepin |grep -qv "PIN:$4" && echo "warning: overwriting existing headset pin"
     pin_given=$4
    elif [ -f $D/givepin ] &&  cat $D/givepin |grep -qv "0000"; then
     pin_given=`cat $D/givepin |grep "PIN:" |sed "s/ *echo *PIN:\([^ ]*\) */\1/"`
    fi
   elif [ -f $D/pin ] &&  cat $D/pin |grep -qv "12345"; then
    pin_own=`cat $D/pin`
    if [ -f $D/givepin ] &&  cat $D/givepin |grep -qv "0000"; then
     pin_given=`cat $D/givepin |grep "PIN:" |sed "s/ *echo *PIN:\([^ ]*\) */\1/"`
    fi
   fi
   [ -z "$pin_own" ] && pin=12345 && echo -n "warning: using default asterik pin: 12345; "
   [ -z "$pin_given" ] && pin=0000 && echo -n "using default headset pin: 0000."
   echo
   echo $pin_own >$D/pin
   cat $addon/etc/bluetooth/givepin.default |sed "s/\( *echo *PIN:\).*/\1$pin_given/" >$D/givepin
   chmod +x $D/givepin
   for x in sdpd hcid; do
    ps |grep -v "grep" |grep -q " $x[ /:]" && killall $x
   done  
   ./chroot ./$addon hcid >/dev/null 2>&1
   ./chroot ./$addon sdpd
   echo "to pair your bluetooth devices with asterisk read and edit  /var/tmp/asterisk/cellphone.conf"
   echo "(e.g. use editor e3c: /var/$addon/bin/e3c /var/tmp/asterisk/cellphone.conf)"
  ;;
  stop)
   for x in sdpd hcid; do
    ps |grep -v "grep" |grep -q " $x[ /:]" && killall $x
   done  
  ;;
  *)
  echo "usage: ${0##*/} bluetooth  [start [asterisk_pin [headset_pin]]|stop]"
 esac
 ;;
*)
 usage
esac


