123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331 |
- #!/bin/sh
- LINUX_DIR=${LINUX_DIR:=.}
- TOOLS_DIR=${TOOLS_DIR:=../dahdi-tools}
- DYNAMIC_LOC="${DYNAMIC_LOC:-no}"
- DESTDIR=$PWD/live
- KVERS=${KVERS:-`uname -r`}
- XPP_SYNC=${XPP_SYNC:-auto}
- AST_SCRIPT=${AST_SCRIPT:-/etc/init.d/asterisk}
- # Use this file to pass options to modules:
- PERLLIBDIR=`perl -V:sitelib | cut -d "'" -f 2`
- EXTRA_MODS="crc_ccitt"
- # Manual list of modules. They will be loaded by insmod.
- # If reside in a subdir, add it explicitly.
- MODULES_LOAD="${MODULES_LOAD:-dahdi dahdi_echocan_mg2}"
- # this one *is* resolved recusively.
- # the only reason to set a different value is if you use hpec / oslec,
- # as Zaptel depends on them.
- REMOVE_MODULES="${REMOVE_MODULES:-dahdi}" # "dahdi oslec"?
- if [ -r $DESTDIR/live.conf ]; then . $DESTDIR/live.conf; fi
- MODULES_DIR="$DESTDIR/lib/modules/$KVERS/dahdi"
- if [ ! -d "$LINUX_DIR" ]; then
- echo >&2 "$0:dahdi-linux dir '$LINUX_DIR' does not exits. Aborting".
- exit 1
- fi
- set -e
- LINUX_DIR_FULL=`(cd $LINUX_DIR; pwd)`
- set_tools_dir() {
- if [ ! -d "$TOOLS_DIR" ]; then
- echo >&2 "$0:dahdi-tools dir '$TOOLS_DIR' does not exits. Aborting".
- exit 1
- fi
- TOOLS_DIR_FULL=`(cd $TOOLS_DIR; pwd)`
- }
- # Give priority to our installed binaries:
- PATH=$DESTDIR/sbin:$DESTDIR/usr/sbin:$PATH
- export PATH
- # TODO: If you already use PERL5DIR, please fix this part:
- PERL5LIB="$DESTDIR/$PERLLIBDIR"
- export PERL5LIB
- # used in xpp_fxloader:
- FIRMWARE_DIR="$DESTDIR/usr/share/dahdi"
- export FIRMWARE_DIR
- ASTRIBANK_TOOL="$DESTDIR/usr/sbin/astribank_tool"
- export ASTRIBANK_TOOL
- ASTRIBANK_HEXLOAD="$DESTDIR/usr/sbin/astribank_hexload"
- export ASTRIBANK_HEXLOAD
- # make sure Astribank initialization scripts are from our tree.
- xpp_ARGS="$xpp_ARGS initdir=$FIRMWARE_DIR"
- #dahdi_ARGS="$dahdi_ARGS initdir=$FIRMWARE_DIR"
- if [ "$DYNAMIC_LOC" = 'yes' ]; then
- MODULES_LOAD="$MODULES_LOAD dahdi_dynamic dahdi_dynamic_loc"
- fi
- # the same as xpp/utils/dahdi_drivers .
- # With the remote mode, I can't rely on files in the source directory.
- dahdi_drivers() {
- perl -MDahdi::Hardware -e '
- my @drivers = Dahdi::Hardware->drivers;
- print join(" ", @drivers);
- '
- }
- # Add modules for existing hardware on the system for the list of
- # modules to load.
- #
- # As module loading is manual with insmod, some manual fixes are needed.
- set_modules_to_load() {
- for mod in `dahdi_drivers`; do
- case "$mod" in
- xpp_usb)
- MODULES_LOAD="$MODULES_LOAD xpp/xpp xpp/xpd_fxs"
- MODULES_LOAD="$MODULES_LOAD xpp/xpd_fxo xpp/xpd_pri"
- if [ -r "$MODULES_DIR/xpp/xpd_bri.ko" ]; then
- MODULES_LOAD="$MODULES_LOAD xpp/xpd_bri"
- fi
- MODULES_LOAD="$MODULES_LOAD xpp/xpp_usb"
- ;;
- wctdm24xxp | wcte12xp)
- # FIXME: better automation of the voicebus
- # dependency:
- MODULES_LOAD="$MODULES_LOAD voicebus/dahdi_voicebus $mod/$mod"
- EXTRA_MODS="$EXTRA_MODS firmware_class"
- ;;
- wct4xxp | wcte12xp | wctc4xp | wcb4xxp)
- MODULES_LOAD="$MODULES_LOAD $mod/$mod"
- ;;
- wanpipe)
- : # requires different handling
- ;;
- *)
- MODULES_LOAD="$MODULES_LOAD $mod"
- ;;
- esac
- done
- }
- # Initialize the Xorcom Astribank (xpp/) using perl utiliites:
- # intended to replace all the the three functions below if user has
- # installed the dahdi-perl utilities.
- xpp_startup() {
- # do nothing if there are no astribank devices:
- if ! grep -q connected /proc/xpp/xbuses 2>/dev/null; then return 0; fi
- echo "Waiting for Astribank devices to initialize:"
- "$FIRMWARE_DIR/waitfor_xpds" # Asusmes a recent dahdi-tools
-
- # overriding locales for the above two, as perl can be noisy
- # when locales are missing.
- # No register all the devices if they didn't auto-register:
- LC_ALL=C dahdi_registration on
- # this one could actually be run after dahdi_cfg:
- LC_ALL=C xpp_sync "$XPP_SYNC"
- }
- # recursively unload a module and its dependencies, if possible.
- # where's modprobe -r when you need it?
- # inputs: module to unload.
- # returns: the result from
- unload_module() {
- module="$1"
- line=`lsmod 2>/dev/null | grep "^$1 " || :`
- if [ "$line" = '' ]; then return; fi # module was not loaded
- set -- $line
- # $1: the original module, $2: size, $3: refcount, $4: deps list
- mods=`echo $4 | tr , ' '`
- ec_modules=""
- # xpp_usb keeps the xpds below busy if an xpp hardware is
- # connected. Hence must be removed before them:
- case "$module" in xpd_*) mods="xpp_usb $mods";; esac
- for mod in $mods; do
- case "$mod" in
- dahdi_echocan_*)
- ec_modules="$mod $ec_modules"
- ;;
- *)
- # run in a subshell, so it won't step over our vars:
- (unload_module $mod)
- ;;
- esac
- done
- # Now that all the other dependencies are unloaded, we can unload the
- # dahdi_echocan modules. The drivers that register spans may keep
- # references on the echocan modules before they are unloaded.
- for mod in $ec_modules; do
- (unload_module $mod)
- done
- rmmod $module
- }
- load_dynamic() {
- if [ "$DYNAMIC_LOC" != yes ]; then return; fi
- local conf_file="$DESTDIR/etc/dahdi/dynamic.conf"
- if [ ! -r "$conf_file" ]; then
- cat <<EOF >"$conf_file"
- dynamic=loc,1:0,5,0
- dynamic=loc,1:1,5,0
- EOF
- fi
-
- dahdi_cfg -c "$conf_file"
- }
- unload_dynamic() {
- if [ "$DYNAMIC_LOC" != yes ]; then return; fi
- local conf_file="$DESTDIR/etc/dahdi/dynamic.conf"
- if [ ! -r "$conf_file" ]; then return; fi
- dahdi_cfg -c "$conf_file" -s || :
- }
- genconf() {
- GENCONF_PARAMETERS=$DESTDIR/etc/dahdi/genconf_parameters \
- DAHDI_CONF_FILE=$DESTDIR/etc/dahdi/system.conf \
- DAHDI_MODS_FILE=$DESTDIR/etc/dahdi/modules \
- CHAN_DAHDI_CHANNELS_FILE=$DESTDIR/etc/asterisk/dahdi-channels.conf \
- dahdi_genconf
- if [ "$DYNAMIC_LOC" = yes ]; then
- cat "$DESTDIR/etc/dahdi/dynamic.conf" >>"$DESTDIR/etc/dahdi/system.conf"
- fi
- dahdi_cfg -c $DESTDIR/etc/dahdi/system.conf
- # TODO: fxotune, hpec
- }
- run_asterisk() {
- $AST_SCRIPT start
- }
- usage() {
- me=`basename $0`
- echo "$me: Run DAHDI in a test environment"
- echo 'Version: $Id$'
- echo ''
- echo "Usage: equivalent of:"
- echo "$me configure ./configure"
- echo "$me install make install"
- echo "$me config make config"
- echo "$me unload /etc/init.d/dahdi stop"
- echo "$me load /etc/init.d/dahdi start"
- echo "$me reload /etc/init.d/dahdi restart"
- echo "$me xpp-firm (Reset and load xpp firmware)"
- echo "$me genconf dahdi_genconf; dahdi_cfg"
- echo "$me asterisk /etc/init.d/asterisk start"
- echo "$me rsync TARGET (copy filea to /tmp/live in host TARGET)"
- echo "$me exec COMMAND (Run COMMAND in 'live' environment)"
- echo ""
- echo "dahdi-linux: $LINUX_DIR"
- echo "dahdi-tools: $TOOLS_DIR"
- }
- case "$1" in
- configure)
- shift
- set_tools_dir
- cd "$TOOLS_DIR"; ./configure --with-dahdi="$LINUX_DIR_FULL" "$@"
- ;;
- install)
- shift
- set_tools_dir
- cd "$LINUX_DIR"; make install DESTDIR=$DESTDIR "$@"
- cd "$TOOLS_DIR_FULL"; make install DESTDIR=$DESTDIR DYNFS=yes "$@"
- ;;
- config)
- shift
- set_tools_dir
- cd "$TOOLS_DIR"; make config DESTDIR=$DESTDIR "$@"
- mkdir -p $DESTDIR/etc/asterisk
- cat >"$FIRMWARE_DIR/live-init.conf" <<EOF
- PATH="$PATH" # FIXME: add to existing \$PATH?
- export PATH
- dahdiconfdir="${DESTDIR}/etc/dahdi"
- export dahdiconfdir
- EOF
- ln -s ../../../etc/dahdi/xpp.conf "$DESTDIR/usr/share/dahdi/"
- ;;
- rsync)
- if [ $# -ne 2 ]; then
- echo >&2 "$0: Error: rsync requires a target parameter".
- exit 1
- fi
- # copy the script itself and the installed directory to the
- # target host:
- rsync -ai "$0" $DESTDIR "$2:/tmp/"
- ;;
- unload)
- # OK for Asterisk not to be running. TODO: a better test?
- $AST_SCRIPT stop || :
- unload_dynamic
- for mod in $REMOVE_MODULES; do
- unload_module $mod
- done
- ;;
- load)
- # TODO: Find a way to use modprobe.
- # Or implement a way to pass arguments to modules here (yuck)
- set_modules_to_load
- for mod in $EXTRA_MODS; do
- modprobe $mod || : # FIXME: Make this optional?
- done
- for module in $MODULES_LOAD; do
- eval module_args="\$`basename ${module}`_ARGS"
- insmod $MODULES_DIR/$module.ko $module_args
- done
- xpp_startup
- load_dynamic
- genconf
- # or find a way to reuse init.d start sequence.
- # TODO: A local copy of Asterisk, configured with dahdi_gnconf.
- # doable, but trickier.
- run_asterisk
- ;;
- genconf)
- genconf
- ;;
- asterisk)
- run_asterisk
- ;;
- reload)
- $0 unload
- $0 load
- ;;
- exec)
- if [ $# -lt 2 ]; then
- # No command given: start a subshell in the environemnt
- # of the "live" system:
- echo >&2 "$0: Error: exec requires a command to run"
- exit 1
- fi
- # Command given: run it:
- shift
- "$@"
- ;;
- xpp-firm)
- # Still broken. Needs to be run several times.
- # set XPP_HOTPLUG_DISABLED=yes in /etc/dahdi/init.conf
- XPP_FIRMWARE_DIR=$FIRMWARE_DIR \
- "$FIRMWARE_DIR/xpp_fxloader" reset
- sleep 5
- XPP_FIRMWARE_DIR=$FIRMWARE_DIR \
- "$FIRMWARE_DIR/xpp_fxloader" load
- ;;
- help|'')
- usage
- ;;
- *)
- echo >&2 "$0: Error: incorrect command \"$1\". Aborting"
- usage
- exit 1
- esac
|