#!/bin/sh #set -x # C. Ostheimer 05-2006, 10-2006, 12-2006, 05-2007; major contributions by dynamic # v0.24, 070426 - asterisk 1.4.5, chan-capi 1.01, chan_sccp 20060408 addon=asterisk14 #put used defined post install commands into file cfg.customize #maximal size of tar archive with asterisk config files #which is written to /var/flash/asterisk max_conf_size=100000 ast_default_args="vvv" #server=http://192.168.222.10 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 # command line option parsing unset verbose quiet show_usage [ $# -eq 0 ] && show_usage=1 while [ x$1 != x ]; do case $1 in -z) [ "$svr24" ] || svr24=24.zlib;; -Z) [ "$svr24" ] || svr24=24.zlib16;; -v) verbose=1;; -q) quiet=1;; -h | -\? | --help) show_usage=1;; -*) echo "warning: unknown option $1";; *) break esac; shift; done # Source common functions for installation, (download if missing) f=cfg.common if [ -f ${0%cfg_*}$f ]; then . ${0%cfg_*}$f else wget $server/$f -O /var/$f || errorexit " Couldn't download $f from $server" . /var/$f fi 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" \ " [INST_DIR=installation_directory] ${0##*/} [-v] install\n" \ " (installs to ramdisk or to INST_DIR/addons if INST_DIR is given)\n" \ " ${0##*/} [-v] usb_install | newkey | remove\n" \ " (usb_install: installs to /addons of autodetected usb device or to INST_DIR)\n" \ " ${0##*/} [-v] start|stop [-h|asterisk|zebedee]\n" \ " ${0##*/} [-v] config2flash|flash2config|clearflash [quiet] [minor]\n" \ " not available: ${0##*/} [-v] bluetooth [start [12345 [0000]]|stop]\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: 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/$addon/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 } #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" ] && usage cd /var [ "$modext" = "o" ] && errorexit "in this version of cfg_asterisk14 only kernel 2.6 is supported." 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 ${0##*/} [remove|usb_remove] first" fi 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 _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.2 [ -f $fr/usr/lib/libgcc_s.so.1 ] && _fct cpnr@$cp_opts:$fr/usr/lib:$to/usr/lib:libgcc_s.so.1 _fct mkdr@$to:usr/lib/asterisk:var/lib/asterisk _fct mkdr@$to/usr/lib/asterisk:firmware:modules:sounds:agi-bin:moh:mohmp3:keys _fct cprs@$cp_opts:$fr/usr/lib/asterisk/firmware.default:$to/usr/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/usr/lib/asterisk/moh _fct cprs@$cp_opts:$fr/usr/lib/asterisk/sounds.default:$to/usr/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 [ "$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." fi ########### CONTINUE USB-INSTALL AFTER REQUIRED FILES CONFIRMED ON USB-PATH ########### 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 _fct lnsf@$in:$to/agi-bin:$to/firmware:$to/keys:$to/modules:$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 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 _fct mntif@-t:proc:proc:/var/$addon/proc _fct mntif@-o:bind:/:/var/$addon/oldroot _fct mntif@-o:bind:/var:/var/$addon/oldroot/var # 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 # 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 ########### 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 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) get_missing_file_ -x chroot 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/$addon/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 asterisk server+users" replace_word $d/asterisk/extensions.conf \ "asterisk2" "asterisk$newuser" "nr of remote asterisk 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/$addon 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/asterisk/astdb [ -f $f ] && cp $f /var/lib/$addon fi if [ "$ast_args" ]; then /var/chroot /var/$addon asterisk -$ast_args else /var/chroot /var/$addon 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 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 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/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 ;; 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 [ -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 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