summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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