summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTzafrir Cohen <tzafrir.cohen@xorcom.com>2009-04-20 13:44:35 +0000
committerTzafrir Cohen <tzafrir.cohen@xorcom.com>2009-04-20 13:44:35 +0000
commit072842446fd7d7c522706729c358d23c9aeeecd8 (patch)
treee855926f6053bac057f13362bcec8784eb4719f9
parent469e3f161db8d43374994ff4ad8a047669e3a96d (diff)
xpp: twinstar-related perl improvements
* New generator Dahdi::Config::Gen::Xpporder can generate and xpp_order config for an existing setup. * Add more TwinStar related logic to Dahdi::Xpp::Mpp. Simplifies the twinstar utility accordingly. * twinstar_hook: for the multiple Astribanks case. * twinstar_setup: More logic tests. Now delegates configuration generation to dahdi_genconf (with new Xpporder generator). * dahdi_hardware: Show number of channels with -v git-svn-id: http://svn.asterisk.org/svn/dahdi/tools/trunk@6417 a0bf4364-ded3-4de4-8d8a-66a801d63aff
-rwxr-xr-xxpp/dahdi_hardware8
-rw-r--r--xpp/perl_modules/Dahdi/Config/Gen/Xpporder.pm141
-rw-r--r--xpp/perl_modules/Dahdi/Xpp/Mpp.pm51
-rw-r--r--xpp/perl_modules/Dahdi/Xpp/Xbus.pm2
-rw-r--r--xpp/test_parse.c2
-rwxr-xr-xxpp/twinstar135
-rwxr-xr-xxpp/twinstar_hook85
-rwxr-xr-xxpp/twinstar_setup161
8 files changed, 413 insertions, 172 deletions
diff --git a/xpp/dahdi_hardware b/xpp/dahdi_hardware
index 2528fb7..867e897 100755
--- a/xpp/dahdi_hardware
+++ b/xpp/dahdi_hardware
@@ -37,6 +37,7 @@ sub show_xbus($) {
printf " LABEL=%-20s CONNECTOR=%-20s\n", $label, $connector;
foreach my $xpd (@xpds) {
my $reg = $xpd->dahdi_registration;
+ my $channels = '(' . $xpd->channels . ')';
my $span;
my $spanstr;
if($reg && @spans) {
@@ -48,7 +49,7 @@ sub show_xbus($) {
my $master = '';
#$master = "XPP-SYNC" if $xpd->is_sync_master;
$master .= " DAHDI-SYNC" if defined($span) && $span->is_dahdi_sync_master;
- printf "\t%-10s: %-8s %s %s\n", $xpd->fqn, $xpd->type, $spanstr, $master;
+ printf "\t%-10s: %-8s %-5s %s %s\n", $xpd->fqn, $xpd->type, $channels, $spanstr, $master;
}
}
@@ -75,7 +76,6 @@ sub show_disconnected(%) {
Dahdi::Xpp::xbuses if ($opts{'v'});
my @devices = Dahdi::Hardware->device_list;
-Dahdi::Xpp::Mpp->set_astribank_tool('./astribank_tool');
foreach my $dev (@devices) {
my $driver = $dev->driver || "";
my $xbus;
@@ -106,9 +106,9 @@ foreach my $dev (@devices) {
}
my $description = $dev->description || "";
printf $format, $dev->hardware_name, $driver, $dev->vendor, $dev->product, $description;
- if($opts{'v'} && defined $mppinfo) {
+ if($opts{'v'} && defined $mppinfo && exists $mppinfo->{MPP_TALK}) {
printf " MPP: TWINSTAR_PORT=$tws_port\n" if defined $tws_port;
- printf " MPP: TWINSTAR_WATCHDOG=$tws_watchdog\n";
+ printf " MPP: TWINSTAR_WATCHDOG=$tws_watchdog\n" if defined $tws_watchdog;
for(my $i = 0; $i < 2; $i++) {
printf " MPP: TWINSTAR_POWER[%d]=%d\n",
$i, $tws_power->[$i] if defined $tws_power;
diff --git a/xpp/perl_modules/Dahdi/Config/Gen/Xpporder.pm b/xpp/perl_modules/Dahdi/Config/Gen/Xpporder.pm
new file mode 100644
index 0000000..2b5166a
--- /dev/null
+++ b/xpp/perl_modules/Dahdi/Config/Gen/Xpporder.pm
@@ -0,0 +1,141 @@
+package Dahdi::Config::Gen::Xpporder;
+use strict;
+
+use Dahdi::Config::Gen qw(is_true);
+
+sub new($$$) {
+ my $pack = shift || die;
+ my $gconfig = shift || die;
+ my $genopts = shift || die;
+ my $file = $ENV{XPPORDER_CONF} || "/etc/dahdi/xpp_order";
+ my $self = {
+ FILE => $file,
+ GCONFIG => $gconfig,
+ GENOPTS => $genopts,
+ };
+ bless $self, $pack;
+ return $self;
+}
+
+#
+# Returns list of xbuses sorted by the span numbers assigned
+# to their XPD's. Also checks that each XBUS span numbers are sequential.
+sub get_sorted_xbuses(@) {
+ my @spans = @_; # Verify our spans
+ my @xbuses = Dahdi::Xpp::xbuses;
+ my %xbus_of_span;
+ my %xbus_beginning;
+ my %seen_spans;
+ my @sorted_xbuses;
+ foreach my $xbus (@xbuses) {
+ my $last_spanno;
+ foreach my $xpd ($xbus->xpds) {
+ my $spanno = $xpd->spanno;
+ if(!$spanno) {
+ printf STDERR "%s: Is not registered. Skipping.\n", $xpd->fqn;
+ next;
+ }
+ $seen_spans{$spanno}++;
+ if($xbus_of_span{$spanno}) {
+ printf STDERR "%s: Span %d already seen on %s\n",
+ $xpd->fqn, $spanno, $xbus_of_span{$spanno}->name;
+ die;
+ }
+ $xbus_of_span{$spanno} = $xbus;
+ # Check XPD's sequential numbering
+ if(defined $last_spanno) {
+ if($last_spanno + 1 != $spanno) {
+ printf STDERR "%s: Bad span numbers (%d, %d)\n",
+ $xpd->fqn, $last_spanno, $spanno;
+ die;
+ }
+ } else {
+ $xbus_beginning{$xbus} = $spanno;
+ }
+ $last_spanno = $spanno;
+ }
+ }
+ foreach my $span (@spans) {
+ my $spanno = $span->num;
+ if(!defined($seen_spans{$spanno})) {
+ warn "Span $span does not belong to any XPD!\n";
+ }
+ }
+ @sorted_xbuses = sort { $xbus_beginning{$a} <=> $xbus_beginning{$b} } @xbuses;
+ return @sorted_xbuses;
+}
+
+sub generate($$$) {
+ my $self = shift || die;
+ my $file = $self->{FILE};
+ my $gconfig = $self->{GCONFIG};
+ my $genopts = $self->{GENOPTS};
+ my @spans = @_; # Verify it's all our spans
+ my @xbuses = get_sorted_xbuses(@spans);
+ warn "Empty configuration -- no xbuses\n" unless @xbuses;
+ rename "$file", "$file.bak"
+ or $! == 2 # ENOENT (No dependency on Errno.pm)
+ or die "Failed to backup old config: $!\n";
+ #$gconfig->dump;
+ print "Generating $file\n" if $genopts->{verbose};
+ open(F, ">$file") || die "$0: Failed to open $file: $!\n";
+ my $old = select F;
+ printf "# Autogenerated by $0 on %s\n", scalar(localtime);
+ print "# If you edit this file and execute $0 again,\n";
+ print "# your manual changes will be LOST.\n";
+ print <<'HEAD';
+#
+# This is an optional configuration file for ordering
+# Dahdi registration.
+#
+# It is read from /etc/dahdi/xpp_order. This location
+# may be overriden via the environment variable XPPORDER_CONF
+#
+# Lines may contain:
+# - The Astribank label (verbatim)
+# - The Astribank connector string (prefixed with @)
+# Ordering number of each listed Astribank is determined
+# by its position in this file.
+# Astribanks not listed in this file, get an ordering
+# number of 999 (last).
+#
+# Astribanks with same ordering number are sorted by their
+# connectors (to preserve legacy behaviour).
+#
+# Examples:
+#usb:TWS-08
+#@usb-0000:06:02.2-2
+HEAD
+ foreach my $xbus (@xbuses) {
+ my $label = $xbus->label;
+ my $connector = $xbus->connector;
+ my $name = $xbus->name;
+ printf "%s\t# %s (%s)\n", $label, $connector, $name;
+ }
+ close F;
+ select $old;
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+Xpporder - Generate Astribank ordering information for dahdi_registration.
+
+=head1 SYNOPSIS
+
+ use Dahdi::Config::Gen::Xpporder;
+
+ my $cfg = new Dahdi::Config::Gen::Xpporder(\%global_config, \%genopts);
+ $cfg->generate;
+
+=head1 DESCRIPTION
+
+Generate the F</etc/dahdi/xpp_order>.
+This is the configuration for dahdi_registration(1).
+The order is determined according to current Dahdi registration
+order.
+
+Its location may be overriden via the environment variable F<XPPORDER_CONF>.
diff --git a/xpp/perl_modules/Dahdi/Xpp/Mpp.pm b/xpp/perl_modules/Dahdi/Xpp/Mpp.pm
index 6e23260..a19e0fe 100644
--- a/xpp/perl_modules/Dahdi/Xpp/Mpp.pm
+++ b/xpp/perl_modules/Dahdi/Xpp/Mpp.pm
@@ -102,15 +102,10 @@ sub showinfo($$) {
}
}
-sub new($$$) {
- my $pack = shift || die;
+sub astribank_tool_cmd($) {
my $dev = shift || die;
- my $product = $dev->product;
my $usb_top;
- return undef unless $dev->is_astribank;
- return undef unless $dev->bus_type eq 'USB';
- return undef unless $product =~ /116./;
# Find USB bus toplevel
$usb_top = '/dev/bus/usb';
$usb_top = '/proc/bus/usb' unless -d $usb_top;
@@ -118,6 +113,17 @@ sub new($$$) {
my $name = $dev->priv_device_name();
die "$0: Unkown private device name" unless defined $name;
my $path = "$usb_top/$name";
+ return ($astribank_tool, '-D', "$path");
+}
+
+sub new($$$) {
+ my $pack = shift || die;
+ my $dev = shift || die;
+ my $product = $dev->product;
+
+ return undef unless $dev->is_astribank;
+ return undef unless $dev->bus_type eq 'USB';
+ return undef unless $product =~ /116./;
my $mppinfo = {
DEV => $dev,
HAS_MPP => 1,
@@ -130,11 +136,13 @@ sub new($$$) {
}
return $mppinfo unless $product =~ /116[12]/;
$mppinfo->{'MPP_TALK'} = 1;
+ my @cmd = astribank_tool_cmd($dev);
+ my $name = $dev->priv_device_name();
my $dbg_file = "$name";
$dbg_file =~ s/\W/_/g;
#$dbg_file = "/tmp/twinstar-debug-$dbg_file";
$dbg_file = "/dev/null";
- unless(open(F, "$astribank_tool -D '$path' 2> '$dbg_file' |")) {
+ unless(open(F, "@cmd 2> '$dbg_file' |")) {
warn "Failed running '$astribank_tool': $!";
return undef;
}
@@ -142,6 +150,7 @@ sub new($$$) {
local $_;
while(<F>) {
chomp;
+ #printf STDERR "'%s'\n", $_;
if(s/^INFO:\s*//) {
$mppinfo->{'PROTOCOL'} = $1 if /^protocol\s+version:\s*(\d+)/i;
} elsif(s/^EEPROM:\s*//) {
@@ -149,6 +158,9 @@ sub new($$$) {
$mppinfo->{'EEPROM_LABEL'} = $1 if /^label\s*:\s*([\w._'-]+)/i;
} elsif(s/^Extrainfo:\s+:\s*(.+?)$//) {
$mppinfo->{'EEPROM_EXTRAINFO'} = $1;
+ } elsif(s/^Capabilities:\s*TwinStar\s*:\s*(.+?)$//) {
+ my $cap = $1;
+ $mppinfo->{'TWINSTAR_CAPABLE'} = ($cap =~ /yes/i) ? 1 : 0;
} elsif(s/^TwinStar:\s*//) {
$mppinfo->{'TWINSTAR_PORT'} = $1 if /^connected\s+to\s*:\s*usb-(\d+)/i;
if(s/^USB-(\d+)\s*POWER\s*:\s*//) {
@@ -172,6 +184,31 @@ sub new($$$) {
return $mppinfo;
}
+sub mpp_setwatchdog($$) {
+ my $mppinfo = shift || die;
+ my $on = shift;
+ die "$0: Bad value '$on'" unless defined($on) && $on =~ /^[0-1]$/;
+ my $dev = $mppinfo->dev || die;
+ return undef unless defined $mppinfo->mpp_talk;
+ my $old = $mppinfo->tws_watchdog;
+ my @cmd = astribank_tool_cmd($dev);
+ print STDERR "DEBUG($on): '@cmd'\n";
+ system(@cmd, '-w', $on);
+ die "Running $astribank_tool failed: $?" if $?;
+}
+
+sub mpp_jump($) {
+ my $mppinfo = shift || die;
+ my $dev = $mppinfo->dev || die;
+ return undef unless defined $mppinfo->mpp_talk;
+ my $port = $mppinfo->twinstar_port;
+ $port = ($port == 1) ? 0 : 1;
+ die "Unknown TwinStar port" unless defined $port;
+ my @cmd = astribank_tool_cmd($dev);
+ system(@cmd, '-p', $port);
+ die "Running $astribank_tool failed: $?" if $?;
+}
+
sub mpp_addinfo($@) {
my $pack = shift || die;
my @devlist = @_;
diff --git a/xpp/perl_modules/Dahdi/Xpp/Xbus.pm b/xpp/perl_modules/Dahdi/Xpp/Xbus.pm
index b57148c..4bc1844 100644
--- a/xpp/perl_modules/Dahdi/Xpp/Xbus.pm
+++ b/xpp/perl_modules/Dahdi/Xpp/Xbus.pm
@@ -88,6 +88,8 @@ sub read_attrs() {
if($attr eq 'STATUS') {
# Some values are in all caps as well
$val = uc($val);
+ } elsif($attr eq 'CONNECTOR') {
+ $val =~ s/^/@/; # Add prefix
} elsif($attr eq 'LABEL') {
# Fix badly burned labels.
$val =~ s/[[:^print:]]/_/g;
diff --git a/xpp/test_parse.c b/xpp/test_parse.c
index afe3ef4..4ae1038 100644
--- a/xpp/test_parse.c
+++ b/xpp/test_parse.c
@@ -1,6 +1,6 @@
/*
* Written by Oron Peled <oron@actcom.co.il>
- * Copyright (C) 2006, Xorcom
+ * Copyright (C) 2006, 2007, 2008, 2009 Xorcom
*
* All rights reserved.
*
diff --git a/xpp/twinstar b/xpp/twinstar
index cbcd97f..b5e43ff 100755
--- a/xpp/twinstar
+++ b/xpp/twinstar
@@ -17,8 +17,7 @@ use Dahdi::Hardware;
use Dahdi::Span;
use Dahdi::Xpp;
use Dahdi::Xpp::Xbus;
-
-my $astribank_tool = '/usr/sbin/astribank_tool';
+use Dahdi::Xpp::Mpp;
sub usage {
die "Usage: $0 {status|jump|enable-wd|disable-wd|ports}\n";
@@ -54,96 +53,108 @@ sub tws_usb_devfile($) {
return "$usb_top/$name";
}
-sub tws_show() {
- my @usb_devs = grep { /usb:/ } tws_devs();
+sub tws_show(@) {
+ my @usb_devs = @_;
+ my $format = "%-15s %-10s %-15s %-10s %-10s\n";
+ printf $format, 'DEVICE', 'PORT', 'WATCHDOG', 'POWER0', 'POWER1';
foreach my $dev (@usb_devs) {
- my $path = tws_usb_devfile($dev);
- print "$path:\n";
- open(F, "$astribank_tool -D '$path' 2>&1 |") or
- die "Failed running '$astribank_tool': $!";
- while(<F>) {
- chomp;
- next unless /twinstar/i;
- printf "\t%s\n", $_;
+ my $mppinfo = $dev->mppinfo;
+ if(!defined $mppinfo) {
+ printf STDERR "%s: no MPP information\n", $dev->hardware_name;
+ next;
+ }
+ if(!defined $mppinfo->{TWINSTAR_PORT}) {
+ printf STDERR "%s: no TWINSTAR_PORT information\n", $dev->hardware_name;
+ next;
}
- close F || die "Failed running '$astribank_tool': $!";
+ my $power = $mppinfo->twinstar_power;
+ printf $format,
+ $dev->hardware_name,
+ $mppinfo->twinstar_port,
+ ($mppinfo->twinstar_watchdog) ? "on" : "off",
+ ($power->[0]) ? "yes" : "no",
+ ($power->[1]) ? "yes" : "no";
}
}
sub tws_portnum($) {
my $dev = shift || die "Missing dev";
- my $path = tws_usb_devfile($dev);
- my $port;
- open(F, "$astribank_tool -D '$path' 2>&1 |") or
- die "Failed running '$astribank_tool': $!";
- while(<F>) {
- chomp;
- next unless /twinstar/i;
- next unless /connected\s+to/i;
- if(/USB-(\d+)/i) {
- $port = $1;
- }
+ my $mppinfo = $dev->mppinfo;
+ if(!defined $mppinfo) {
+ printf STDERR "%s: no MPP information\n", $dev->hardware_name;
+ return undef;
}
- close F || die "Failed running '$astribank_tool': $!";
- return $port;
+ return $mppinfo->twinstar_port;
}
-sub tws_jumpdev($$) {
- my $dev = shift || die;
- my $port = shift;
- my $path = tws_usb_devfile($dev);
- print "$path -> $port\n";
- system($astribank_tool, "-D", $path, "-p", $port);
+sub tws_showports(@) {
+ my @usb_devs = @_;
+ foreach my $dev (@usb_devs) {
+ my $mppinfo = $dev->mppinfo;
+ if(!defined $mppinfo) {
+ printf STDERR "%s: no MPP information\n", $dev->hardware_name;
+ next;
+ }
+ if(!defined $mppinfo->{TWINSTAR_PORT}) {
+ printf STDERR "%s: no TWINSTAR_PORT information\n", $dev->hardware_name;
+ next;
+ }
+ printf "%s\n", $mppinfo->{TWINSTAR_PORT};
+ }
}
-sub tws_jump() {
- my @usb_devs = grep { /usb:/ } tws_devs();
- my %ports;
+sub tws_watchdog($@) {
+ my $on = shift;
+ die "tws_watchdog() on/off?" unless defined $on;
+ my @usb_devs = @_;
foreach my $dev (@usb_devs) {
- my $path = tws_usb_devfile($dev);
- my $port = tws_portnum($dev);
- # The "other" port
- $port = ($port == 1) ? 0 : 1;
- $ports{$dev} = $port;
- }
- foreach my $usbdev (sort keys %ports) {
- tws_jumpdev($usbdev, $ports{$usbdev});
+ my $mppinfo = $dev->mppinfo;
+ if(!defined $mppinfo) {
+ printf STDERR "%s: no MPP information\n", $dev->hardware_name;
+ next;
+ }
+ $mppinfo->mpp_setwatchdog($on);
}
}
-sub tws_showports() {
- my @usb_devs = grep { /usb:/ } tws_devs();
+sub tws_jump(@) {
+ my @usb_devs = @_;
+
foreach my $dev (@usb_devs) {
- my $port = tws_portnum($dev);
- print "$port\n";
+ my $mppinfo = $dev->mppinfo;
+ if(!defined $mppinfo) {
+ printf STDERR "%s: no MPP information\n", $dev->hardware_name;
+ next;
+ }
+ $mppinfo->mpp_jump;
}
}
-sub tws_watchdog($) {
- my $on = shift;
- die "tws_watchdog() on/off?" unless defined $on;
- my @usb_devs = grep { /usb:/ } tws_devs();
-
- foreach my $dev (@usb_devs) {
- my $path = tws_usb_devfile($dev);
- print "$path:\n";
- system($astribank_tool, "-D", $path, "-w", $on);
- die "Running $astribank_tool failed: $?" if $?;
+sub dev_list() {
+ my @devs;
+ foreach my $dev (Dahdi::Hardware->device_list) {
+ next unless $dev->is_astribank;
+ next unless $dev->product =~ /116./;
+ Dahdi::Xpp::Mpp->mpp_addinfo($dev);
+ push(@devs, $dev);
}
+ return @devs;
}
+my @usb_devices = dev_list();
+
if($ARGV[0] eq 'status') {
- tws_show();
+ tws_show(@usb_devices);
} elsif($ARGV[0] eq 'jump') {
- tws_jump();
+ tws_jump(@usb_devices);
} elsif($ARGV[0] eq 'disable-wd') {
- tws_watchdog(0);
+ tws_watchdog(0, @usb_devices);
} elsif($ARGV[0] eq 'enable-wd') {
- tws_watchdog(1);
+ tws_watchdog(1, @usb_devices);
} elsif($ARGV[0] eq 'ports') {
- tws_showports();
+ tws_showports(@usb_devices);
}
__END__
diff --git a/xpp/twinstar_hook b/xpp/twinstar_hook
index d014500..7b2101f 100755
--- a/xpp/twinstar_hook
+++ b/xpp/twinstar_hook
@@ -1,4 +1,37 @@
#! /bin/sh
+#
+# Written by Oron Peled <oron@actcom.co.il>
+# Copyright (C) 2009, Xorcom
+#
+# All rights reserved.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# 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.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+
+#
+# This is an experimental script to activate an Astribank TwinStar
+# during failover.
+#
+# The script assume that there is an /etc/dahdi/xpp_order file
+# specifying the Astribanks' labels according to the required
+# registration order.
+#
+# This file can be easily generated by running:
+# dahdi_genconf xpporder
+# after the system is configured and working.
+#
me=`basename $0`
dir=`dirname $0`
@@ -11,29 +44,35 @@ 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
-TWS_SETUP="/etc/dahdi/twinstar_setup.conf"
-if [ ! -r "$TWS_SETUP" ]; then
- echo "Skip($ACTION): No '$TWS_SETUP'" | $LOGGER
+# 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="/tmp/xortel/dahdi/system.conf"
-dahdi_registration="/usr/sbin/dahdi_registration"
-dahdi_cfg="/usr/sbin/dahdi_cfg"
-xpp_blink="/usr/sbin/xpp_blink"
-twinstar="/usr/sbin/twinstar"
+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): '$*'" | $LOGGER
+echo "starting($ACTION): setup from $XPPORDER_CONF" | $LOGGER
STAMP="${TWS_PREFIX}${XBUS_NAME}"
-TWS_TOTAL=`sed -e 's/#.*//' -e '/^[ ]*$/d' "$TWS_SETUP" | wc -l`
+TWS_TOTAL=`sed -e 's/#.*//' -e '/^[ ]*$/d' -e 'y/\t/ /' "$XPPORDER_CONF" | wc -l`
case "$ACTION" in
online)
@@ -42,25 +81,25 @@ online)
exit 1
fi
LABEL=`cat $LABELFILE`
- TWS_LINE=`awk "/^$LABEL/" $TWS_SETUP`
+ TWS_LINE=`awk "/^$LABEL/" $XPPORDER_CONF`
if [ "$TWS_LINE" = "" ]; then
- echo "online($XBUS_NAME): '$LABEL' is not in '$TWS_SETUP'" | $LOGGER
+ 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
- "$twinstar" enable-wd
+ twinstar enable-wd
if [ "$HOW_MANY" -eq "$TWS_TOTAL" ]; then
echo "online: GOT ALL $TWS_TOTAL" | $LOGGER
- "$dahdi_registration" on
- "$dahdi_registration" 2>&1 | $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
- asterisk -rx 'module load chan_dahdi.so' 2>&1 | $LOGGER
+ dahdi_cfg -v -c "$SYSTEMCONF" 2>&1 | $LOGGER
sleep 1 # Just for visual effect
- "$xpp_blink" bzzt xpd "$XBUS_NUM"
- ports=`"$twinstar" ports`
+ 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/zaptel/primary-pbx-is-ready.wav || :
elif [ "$ports" = 1 ]; then
@@ -71,16 +110,16 @@ online)
;;
offline)
LABEL=`cat $STAMP`
- TWS_LINE=`awk "/^$LABEL/" $TWS_SETUP`
+ TWS_LINE=`awk "/^$LABEL/" $XPPORDER_CONF`
rm -f "$STAMP"
if [ "$TWS_LINE" = "" ]; then
- echo "offline($XBUS_NAME): $LABEL is not in $TWS_SETUP" | $LOGGER
+ echo "offline($XBUS_NAME): $LABEL is not in $XPPORDER_CONF" | $LOGGER
exit 1
fi
echo "offline($XBUS_NAME): $LABEL" | $LOGGER
- "$twinstar" disable-wd
+ twinstar disable-wd
# If we want to disconnect everybody
- "$twinstar" jump
+ twinstar jump
asterisk -rx 'module unload chan_dahdi.so'
;;
*)
diff --git a/xpp/twinstar_setup b/xpp/twinstar_setup
index da76dca..0e53bdf 100755
--- a/xpp/twinstar_setup
+++ b/xpp/twinstar_setup
@@ -9,39 +9,80 @@
#
use strict;
use File::Basename;
-BEGIN { my $dir = dirname($0); unshift(@INC, "$dir", "$dir/perl_modules"); }
+BEGIN {
+ my $dir = dirname($0); unshift(@INC, "$dir", "$dir/perl_modules");
+ $ENV{PATH} = "$dir:$ENV{PATH}";
+}
use Dahdi::Config::Gen qw(is_true);
use Dahdi::Hardware;
use Dahdi::Xpp::Mpp;
use Dahdi::Xpp::Xbus;
-my $tws_file = $ENV{DAHDI_TWINSTAR_SETUP} || "/etc/dahdi/twinstar_setup.conf";
my $xpporder_file = $ENV{XPPORDER_CONF} || "/etc/dahdi/xpp_order";
+my @devices = Dahdi::Hardware->device_list;
my @xbuses = Dahdi::Xpp::xbuses;
my $format = "%-20s %-10s # %s\n";
-sub prep_lines() {
- my @twinstar_out;
+sub bad_xpds($) {
+ my $xbus = shift || die;
+ my $bad_xpds = 0;
+
+ foreach my $xpd ($xbus->xpds) {
+ if(! $xpd->spanno) {
+ my $fqn = $xpd->fqn;
+ warn "\t$fqn -- Not registered with DAHDI\n";
+ $bad_xpds++;
+ }
+ }
+ return $bad_xpds;
+}
+
+sub twinstar_checks() {
+ my @twinstar_good;
my $first_port;
if(! -d "/sys/bus/astribanks") {
die "CANNOT generate TwinStar setup -- xpp drivers are not loaded\n";
}
- foreach my $xbus (@xbuses) {
- my $dev = $xbus->transport;
- my $connector = $xbus->connector;
- my $label = $xbus->label;
- my $xbusstr = sprintf "%s (%s) [%s]", $xbus->name, $connector, $label;
+ foreach my $dev (@devices) {
+ my $hwname = $dev->hardware_name;
+ my $xbus;
+ my $loaded;
+ my $tws_port;
+ my $tws_power;
+ my $tws_watchdog;
+ my $mppinfo;
+ if(! $dev->is_astribank) {
+ warn "SKIP $hwname -- Only Astribanks can be used for TwinStar\n";
+ next;
+ }
Dahdi::Xpp::Mpp->mpp_addinfo($dev);
- my $mppinfo = $dev->mppinfo;
+ $mppinfo = $dev->mppinfo;
if(! defined $mppinfo) {
- warn "SKIP $xbusstr -- is not Twinstar capable\n";
+ warn "SKIP $hwname -- is not TwinStar ready\n";
next;
}
if(! defined $mppinfo->{MPP_TALK}) {
- warn "SKIP $xbusstr -- USB firmware is not loaded\n";
+ warn "SKIP $hwname -- USB firmware is not loaded\n";
+ next;
+ }
+ if(! $mppinfo->{TWINSTAR_CAPABLE}) {
+ warn "SKIP $hwname -- is not TwinStar capable\n";
+ next;
+ }
+ $xbus = $dev->xbus;
+ if(! defined $xbus) {
+ warn "SKIP $hwname -- No XBUS for this device (FPGA firmware? Initialization?)\n";
+ next;
+ }
+ my $dev = $xbus->transport;
+ my $connector = $xbus->connector;
+ my $label = $xbus->label;
+ my $xbusstr = sprintf "%s (%s) [%s]", $xbus->name, $connector, $label;
+ if(bad_xpds($xbus)) {
+ warn "SKIP $xbusstr -- Not registered with DAHDI\n";
next;
}
my $port = $mppinfo->{TWINSTAR_PORT};
@@ -55,12 +96,11 @@ sub prep_lines() {
next;
}
if(!$power->[0] || !$power->[1]) {
- warn "Only one cable: $xbusstr\n";
+ warn "WARNING: Only one cable: $xbusstr\n";
}
$first_port = $port unless defined $first_port;
- my $line = sprintf $format,
- $label, $port, $connector;
- push(@twinstar_out, $line);
+ printf "GOOD: %-15s port=%d %s\n", $label, $port, $connector;
+ push(@twinstar_good, $xbus);
if($first_port != $port) {
die
"$0: ",
@@ -69,64 +109,17 @@ sub prep_lines() {
"(others to $first_port)\n";
}
}
- return @twinstar_out;
-}
-
-sub gen_twinstar_setup($) {
- my $file = shift || die;
- my @twinstar_out = prep_lines;
- if(!@twinstar_out) {
- print STDERR "No Twinstar capable Astribanks found\n";
- return;
- }
- rename "$file", "$file.bak"
- or $! == 2 # ENOENT (No dependency on Errno.pm)
- or die "Failed to backup old config: $!\n";
- print "Generating $file\n";
- open(F, ">$file") || die "$0: Failed to open $file: $!\n";
- my $old = select F;
- printf "# Autogenerated by %s on %s -- Next run will overwrite contents.\n",
- $0, scalar(localtime);
- print <<"HEAD";
-#
-# This file is parsed by twinstar_hook
-#
-HEAD
- printf $format, "# LABEL", "PORT", "CONNECTOR";
- foreach (@twinstar_out) {
- print;
- }
- close F;
- select $old;
+ return @twinstar_good;
}
-sub gen_xpporder($) {
- my $file = shift || die;
-
- rename "$file", "$file.bak"
- or $! == 2 # ENOENT (No dependency on Errno.pm)
- or die "Failed to backup old config: $!\n";
- print "Generating $file\n";
- open(F, ">$file") || die "$0: Failed to open $file: $!\n";
- my $old = select F;
- printf "# Autogenerated by %s on %s -- Next run will overwrite contents.\n",
- $0, scalar(localtime);
- print <<"HEAD";
-#
-# This file is parsed by Dahdi::Xpp
-#
-HEAD
- foreach my $xbus (@xbuses) {
- my $label = $xbus->label;
- printf "%s\t# @%s (%s)\n",
- $label, $xbus->connector, $xbus->name;
- }
- close F;
- select $old;
+my @twinstar_good = twinstar_checks;
+if(!@twinstar_good) {
+ print STDERR "Abort. No Twinstar capable Astribanks found\n";
+ exit 1;
}
-
-gen_twinstar_setup($tws_file);
-gen_xpporder($xpporder_file);
+print "Generating Configuration\n";
+system("dahdi_genconf -v xpporder");
+die "Failed: $?\n" if $?;
1;
@@ -134,11 +127,29 @@ __END__
=head1 NAME
-twinstar - Generate configuration for dahdi drivers.
+twinstar_setup - Prepares a server for Astribank TwinStar operation.
=head1 DESCRIPTION
-Generate the F</etc/dahdi/twinstar_setup.conf>.
-This is the configuration for twinstar_hook(8).
+This script prepares a server for Astribank TwinStar operation.
+The stages are:
+
+=over
+
+=item Preliminary checks
+
+Check that we have only TwinStar capable Astribanks, that the drivers are already loaded.
+
+=item Configuration Generation
+
+Indirectly generate the F</etc/dahdi/xpp_order> file that describes the current configuration.
+This is done by running C<dahdi_genconf xpporder>
+
+This configuration file is used by twinstar_hook(8) to know when all Astribanks has reconnected
+to the backup server.
+
+=item Deployment to Backup Server
+
+Not implemented yet. Should be done manualy.
-Its location may be overriden via the environment variable F<DAHDI_TWINSTAR_SETUP>.
+=back