summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTzafrir Cohen <tzafrir.cohen@xorcom.com>2009-10-04 13:53:01 +0000
committerTzafrir Cohen <tzafrir.cohen@xorcom.com>2009-10-04 13:53:01 +0000
commit55b5a9cc5ea6f7f634a3b6b667c39b7c5cb02a8f (patch)
treecc9d34e3b8d8f4b00750c9ed8f144b0345e57158
parent6815e5932f1a6aa0d7301f728351fd9b85f2a854 (diff)
Add XPP_HOTPLUG_DAHDI mode: cfg initiated mostly from hotplug
If XPP_HOTPLUG_DAHDI=yes is set in /etc/dahdi/init.conf (which is not the default), the normal run of the 'start' operation of the dahdi init script will only be responsible for loading modules. The rest will be done (if there are indeed Astribanks on the system) by a second call to the init script once all of them have connected. The astribank_hook has also been mostly rewritten. Most of the functionality of twinstar_hook moved to it. The current twinstar_hook is a simple example script. XPP_HOTPLUG_DAHDI mode assumes that all Astribanks on the system are listed in /etc/dahdi/xpp_order (which can be generated using, e.g. 'dahdi_genconf xpporder') git-svn-id: http://svn.asterisk.org/svn/dahdi/tools/trunk@7335 a0bf4364-ded3-4de4-8d8a-66a801d63aff
-rwxr-xr-xdahdi.init27
-rw-r--r--init.conf.sample1
-rwxr-xr-xxpp/astribank_hook75
-rwxr-xr-xxpp/twinstar_hook71
4 files changed, 108 insertions, 66 deletions
diff --git a/dahdi.init b/dahdi.init
index a0882a8..a5ed780 100755
--- a/dahdi.init
+++ b/dahdi.init
@@ -86,11 +86,34 @@ unload_module() {
rmmod $module
}
+# In (xpp) hotplug mode, if we're called from udev, skip loading
+# modules:
+hotplug_skip_modprobe() {
+ if [ "$XPP_HOTPLUG_DAHDI" = yes -a "$CALLED_FROM_ATRIBANK_HOOK" = '' ]
+ then
+ return 1
+ fi
+ return 0
+}
+
+# In (xpp) hotplug mode: quit after we loaded modules.
+# Make sure that this is only called if there is an Astribank on the
+# system, which will call the rest of the script from the
+# astribank_hook.
+hotplug_exit_after_load() {
+ if [ "$XPP_HOTPLUG_DAHDI" = yes -a "$CALLED_FROM_ATRIBANK_HOOK" != '' ]
+ then
+ exit 0
+ fi
+}
+
# Initialize the Xorcom Astribank (xpp/) using perl utiliites:
xpp_startup() {
# do nothing if there are no astribank devices:
if ! /usr/share/dahdi/waitfor_xpds; then return 0; fi
+ hotplug_exit_after_load
+
# 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:
@@ -184,7 +207,9 @@ RETVAL=0
# See how we were called.
case "$1" in
start)
- load_modules
+ if ! hotplug_skip_modprobe; then
+ load_modules
+ fi
TMOUT=$DAHDI_DEV_TIMEOUT # max secs to wait
diff --git a/init.conf.sample b/init.conf.sample
index 78ca86e..9fb6393 100644
--- a/init.conf.sample
+++ b/init.conf.sample
@@ -11,3 +11,4 @@
# Override settings for xpp_fxloader
#XPP_FIRMWARE_DIR=/usr/share/dahdi
#XPP_HOTPLUG_DISABLED=yes
+#XPP_HOTPLUG_DAHDI=yes
diff --git a/xpp/astribank_hook b/xpp/astribank_hook
index 9510f7b..8c5bea8 100755
--- a/xpp/astribank_hook
+++ b/xpp/astribank_hook
@@ -11,11 +11,69 @@ LOGGER="logger -i -t '$me'"
## If you wish to trace this script:
#exec 2> "/tmp/${me}_$XBUS_NAME" 1>&2
+# Our directory in the beginning, so we can use local lab setup
PATH="$dir:/usr/sbin:/sbin:/usr/bin:/bin"
set -e
-echo "starting($ACTION): '$*'" | $LOGGER
+[ -r /etc/dahdi/init.conf ] && . /etc/dahdi/init.conf
+
+# For lab testing
+liveconf="$dir/liveconf/dahdi"
+
+if [ -d "$liveconf" ]; then
+ dahdi_conf="$liveconf"
+else
+ dahdi_conf="/etc/dahdi"
+fi
+
+export XPPORDER_CONF="$dahdi_conf/xpp_order"
+if [ ! -r "$XPPORDER_CONF" ]; then
+ echo "Skip($ACTION): No '$XPPORDER_CONF'" | $LOGGER
+ exit 0
+fi
+export DAHDI_CFG_CMD="dahdi_cfg -c $dahdi_conf/system.conf"
+export CALLED_FROM_ATRIBANK_HOOK=yes
+
+clean_lines() {
+ sed -e 's/#.*//' -e 'y/\t/ /' -e 's/^ *//' -e 's/ *$//' "$XPPORDER_CONF"
+}
+
+matched_devices() {
+ ready=`grep -H READY /sys/bus/astribanks/devices/*/xbus_state | sed 's,/xbus_state.*,,'`
+ for dev in $ready
+ do
+ label=`cat "$dev/label"`
+ connector=`cat "$dev/connector"`
+ xbus=`echo "$dev" | sed 's,.*/,,'`
+ lineno=`clean_lines | egrep -n "^${label}$|^@${connector}$" | cut -d: -f1`
+ if [ "$lineno" != "" ]; then
+ #echo "$xbus: $XPPORDER_CONF:$lineno -- Match ${label} @${connector}" | $LOGGER
+ echo -e "${xbus}\t${label}"
+ else
+ echo "${xbus}: ${label} @${connector} not found in $XPPORDER_CONF: Ignore($ACTION)" | $LOGGER
+ fi
+ done
+}
+
+NUM_WANTED=`clean_lines | sed '/^$/d' | wc -l`
+NUM_GOOD=`matched_devices | wc -l`
+
+start_dahdi() {
+ script=/etc/init.d/dahdi
+ if [ "$XPP_HOTPLUG_DAHDI" = yes ]; then
+ echo "Starting $script."
+ "$script" start | logger -i -t "$script"
+ status=$?
+ echo "Status($script): $status"
+ else
+ echo "$0: Skip($script): No XPP_HOTPLUG_DAHDI=yes in /etc/dahdi/init.conf"
+ exit 0
+ fi
+ if [ -x "$dir/twinstar_hook" ]; then
+ "$dir/twinstar_hook"
+ fi
+}
case "$ACTION" in
add)
@@ -23,13 +81,20 @@ add)
remove)
;;
online)
- if [ -x "$dir/twinstar_hook" ]; then
- "$dir/twinstar_hook"
+ echo "$ACTION($XBUS_NAME): $NUM_GOOD/$NUM_WANTED from $XPPORDER_CONF" | $LOGGER
+ if [ "$NUM_GOOD" -eq "$NUM_WANTED" ]; then
+ echo "START-DAHDI: Total $NUM_GOOD online." | $LOGGER
+ # Fork services
+ start_dahdi < /dev/null 2>&1 | $LOGGER &
fi
;;
offline)
- if [ -x "$dir/twinstar_hook" ]; then
- "$dir/twinstar_hook"
+ echo "$ACTION($XBUS_NAME): $NUM_GOOD/$NUM_WANTED from $XPPORDER_CONF" | $LOGGER
+ if [ "$NUM_GOOD" -eq 0 ]; then
+ echo "All Astribanks offline" | $LOGGER
+ if [ -x "$dir/twinstar_hook" ]; then
+ "$dir/twinstar_hook"
+ fi
fi
;;
*)
diff --git a/xpp/twinstar_hook b/xpp/twinstar_hook
index e463218..6818c85 100755
--- a/xpp/twinstar_hook
+++ b/xpp/twinstar_hook
@@ -49,74 +49,25 @@ PATH="$dir:/usr/sbin:/sbin:/usr/bin:/bin"
set -e
-# For lab testing
-liveconf="$dir/liveconf/dahdi"
-
-if [ -d "$liveconf" ]; then
- dahdi_conf="$liveconf"
-else
- dahdi_conf="/etc/dahdi"
-fi
-
-export XPPORDER_CONF="$dahdi_conf/xpp_order"
-if [ ! -r "$XPPORDER_CONF" ]; then
- echo "Skip($ACTION): No '$XPPORDER_CONF'" | $LOGGER
- exit 0
-fi
-SYSTEMCONF="$dahdi_conf/system.conf"
-
-TWS_DIR="/var/tmp"
-TWS_PREFIX="$TWS_DIR/twinstar-"
-LABELFILE="/sys/$DEVPATH/label"
export XBUS_SORT='SORT_LABEL'
-echo "starting($ACTION): setup from $XPPORDER_CONF" | $LOGGER
-STAMP="${TWS_PREFIX}${XBUS_NAME}"
-TWS_TOTAL=`sed -e 's/#.*//' -e '/^[ ]*$/d' -e 'y/\t/ /' "$XPPORDER_CONF" | wc -l`
-
case "$ACTION" in
online)
- if [ ! -f "$LABELFILE" ]; then
- echo "Missing labelfile '$LABELFILE'" | $LOGGER
- exit 1
- fi
- LABEL=`cat $LABELFILE`
- TWS_LINE=`awk "/^$LABEL/" $XPPORDER_CONF`
- if [ "$TWS_LINE" = "" ]; then
- echo "online($XBUS_NAME): '$LABEL' is not in '$XPPORDER_CONF'" | $LOGGER
- exit 1
- fi
- echo "$LABEL" > "$STAMP"
- HOW_MANY=`ls ${TWS_PREFIX}* | wc -l`
- echo "online($XBUS_NAME): $LABEL (${HOW_MANY}/${TWS_TOTAL})" | $LOGGER
+ echo "$ACTION($XBUS_NAME): " | $LOGGER
twinstar enable-wd
- if [ "$HOW_MANY" -eq "$TWS_TOTAL" ]; then
- echo "online: GOT ALL $TWS_TOTAL" | $LOGGER
- dahdi_registration on
- dahdi_registration 2>&1 | tr '\t' ' ' | $LOGGER
- echo "Using '$SYSTEMCONF'" 2>&1 | $LOGGER
- dahdi_cfg -v -c "$SYSTEMCONF" 2>&1 | $LOGGER
- sleep 1 # Just for visual effect
- asterisk -rx 'module load chan_dahdi.so' 2>&1 | $LOGGER
- xpp_blink bzzt xpd "$XBUS_NUM"
- ports=`twinstar ports`
- if [ "$ports" = 0 ]; then
- play /usr/share/dahdi/primary-pbx-is-ready.wav || :
- elif [ "$ports" = 1 ]; then
- play /usr/share/dahdi/backup-pbx-is-ready.wav || :
- fi
- echo "online: READY" | $LOGGER
+ sleep 1 # Just for visual effect
+ asterisk -rx 'module load chan_dahdi.so' 2>&1 | $LOGGER
+ xpp_blink bzzt xpd "$XBUS_NUM"
+ ports=`twinstar ports`
+ if [ "$ports" = 0 ]; then
+ play /usr/share/dahdi/primary-pbx-is-ready.wav || :
+ elif [ "$ports" = 1 ]; then
+ play /usr/share/dahdi/backup-pbx-is-ready.wav || :
fi
+ echo "online: READY" | $LOGGER
;;
offline)
- LABEL=`cat $STAMP`
- TWS_LINE=`awk "/^$LABEL/" $XPPORDER_CONF`
- rm -f "$STAMP"
- if [ "$TWS_LINE" = "" ]; then
- echo "offline($XBUS_NAME): $LABEL is not in $XPPORDER_CONF" | $LOGGER
- exit 1
- fi
- echo "offline($XBUS_NAME): $LABEL" | $LOGGER
+ echo "$ACTION($XBUS_NAME): " | $LOGGER
twinstar disable-wd
# If we want to disconnect everybody
twinstar jump