diff options
author | Tzafrir Cohen <tzafrir.cohen@xorcom.com> | 2009-04-20 13:44:35 +0000 |
---|---|---|
committer | Tzafrir Cohen <tzafrir.cohen@xorcom.com> | 2009-04-20 13:44:35 +0000 |
commit | 072842446fd7d7c522706729c358d23c9aeeecd8 (patch) | |
tree | e855926f6053bac057f13362bcec8784eb4719f9 | |
parent | 469e3f161db8d43374994ff4ad8a047669e3a96d (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-x | xpp/dahdi_hardware | 8 | ||||
-rw-r--r-- | xpp/perl_modules/Dahdi/Config/Gen/Xpporder.pm | 141 | ||||
-rw-r--r-- | xpp/perl_modules/Dahdi/Xpp/Mpp.pm | 51 | ||||
-rw-r--r-- | xpp/perl_modules/Dahdi/Xpp/Xbus.pm | 2 | ||||
-rw-r--r-- | xpp/test_parse.c | 2 | ||||
-rwxr-xr-x | xpp/twinstar | 135 | ||||
-rwxr-xr-x | xpp/twinstar_hook | 85 | ||||
-rwxr-xr-x | xpp/twinstar_setup | 161 |
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 |