#!/bin/sh # #set -x # C. Ostheimer and : 05-2006, 10-2006, 12-2006, 05-2007; 12-2007;03-2008 # 080303 - asterisk 1.4.16.2, script 1.21, 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=asterisk14 app_ver=1.4.16.2 script_ver=1.21 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 , 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; ./asterisk14/bin/e3c ./asterisk14/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/asterisk14/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_asterisk14 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 _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 # Newer FW with ctlmgr does not support symlinks to /usr/www [ -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 _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 _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_asterisk14 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 # Newer FW with ctlmgr does not support symlinks to /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 _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 [ -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