1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343
|
#!/bin/sh
LINUX_DIR=${LINUX_DIR:=.}
TOOLS_DIR=${TOOLS_DIR:=../dahdi-tools}
DYNAMIC_LOC="${DYNAMIC_LOC:-no}"
DESTDIR=$PWD/live
LIVE_DAHDI_RSYNC_DIR=${LIVE_DAHDI_RSYNC_DIR:-/tmp/dahdi}
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 tools_rootdir=$DESTDIR"
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
if [ -r "$MODULES_DIR/xpp/xpd_echo.ko" ]; then
MODULES_LOAD="$MODULES_LOAD xpp/xpd_echo"
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 symlink_ast symlink dahdi-channels.conf"
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:$LIVE_DAHDI_RSYNC_DIR"
;;
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
if [ "$LIVE_DAHDI_FREEPBXDB" = 'yes' ]; then
GENCONF_PARAMETERS=$DESTDIR/etc/dahdi/genconf_parameters \
dahdi_genconf freepbxdb
fi
;;
genconf)
genconf
;;
asterisk)
run_asterisk
;;
symlink_ast)
ln -sf "$DESTDIR/etc/asterisk/dahdi-channels.conf" /etc/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 \
XPP_CONFIG="$DESTDIR/etc/dahdi/xpp.conf" \
"$FIRMWARE_DIR/xpp_fxloader" load
;;
help|'')
usage
;;
*)
echo >&2 "$0: Error: incorrect command \"$1\". Aborting"
usage
exit 1
esac
|