[svn-commits] tzafrir: tools/trunk r6417 - in /tools/trunk/xpp: ./ perl_modules/Dahdi/Confi...

SVN commits to the Digium repositories svn-commits at lists.digium.com
Mon Apr 20 08:44:41 CDT 2009


Author: tzafrir
Date: Mon Apr 20 08:44:35 2009
New Revision: 6417

URL: http://svn.digium.com/svn-view/dahdi?view=rev&rev=6417
Log:
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


Added:
    tools/trunk/xpp/perl_modules/Dahdi/Config/Gen/Xpporder.pm   (with props)
Modified:
    tools/trunk/xpp/dahdi_hardware
    tools/trunk/xpp/perl_modules/Dahdi/Xpp/Mpp.pm
    tools/trunk/xpp/perl_modules/Dahdi/Xpp/Xbus.pm
    tools/trunk/xpp/test_parse.c
    tools/trunk/xpp/twinstar
    tools/trunk/xpp/twinstar_hook
    tools/trunk/xpp/twinstar_setup

Modified: tools/trunk/xpp/dahdi_hardware
URL: http://svn.digium.com/svn-view/dahdi/tools/trunk/xpp/dahdi_hardware?view=diff&rev=6417&r1=6416&r2=6417
==============================================================================
--- tools/trunk/xpp/dahdi_hardware (original)
+++ tools/trunk/xpp/dahdi_hardware Mon Apr 20 08:44:35 2009
@@ -37,6 +37,7 @@
 	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 @@
 		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 @@
 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 @@
 	}
 	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;

Added: tools/trunk/xpp/perl_modules/Dahdi/Config/Gen/Xpporder.pm
URL: http://svn.digium.com/svn-view/dahdi/tools/trunk/xpp/perl_modules/Dahdi/Config/Gen/Xpporder.pm?view=auto&rev=6417
==============================================================================
--- tools/trunk/xpp/perl_modules/Dahdi/Config/Gen/Xpporder.pm (added)
+++ tools/trunk/xpp/perl_modules/Dahdi/Config/Gen/Xpporder.pm Mon Apr 20 08:44:35 2009
@@ -1,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>.

Propchange: tools/trunk/xpp/perl_modules/Dahdi/Config/Gen/Xpporder.pm
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: tools/trunk/xpp/perl_modules/Dahdi/Config/Gen/Xpporder.pm
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision

Propchange: tools/trunk/xpp/perl_modules/Dahdi/Config/Gen/Xpporder.pm
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: tools/trunk/xpp/perl_modules/Dahdi/Xpp/Mpp.pm
URL: http://svn.digium.com/svn-view/dahdi/tools/trunk/xpp/perl_modules/Dahdi/Xpp/Mpp.pm?view=diff&rev=6417&r1=6416&r2=6417
==============================================================================
--- tools/trunk/xpp/perl_modules/Dahdi/Xpp/Mpp.pm (original)
+++ tools/trunk/xpp/perl_modules/Dahdi/Xpp/Mpp.pm Mon Apr 20 08:44:35 2009
@@ -102,15 +102,10 @@
 	}
 }
 
-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 @@
 	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 @@
 	}
 	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 @@
 	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 @@
 			$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 @@
 	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 = @_;

Modified: tools/trunk/xpp/perl_modules/Dahdi/Xpp/Xbus.pm
URL: http://svn.digium.com/svn-view/dahdi/tools/trunk/xpp/perl_modules/Dahdi/Xpp/Xbus.pm?view=diff&rev=6417&r1=6416&r2=6417
==============================================================================
--- tools/trunk/xpp/perl_modules/Dahdi/Xpp/Xbus.pm (original)
+++ tools/trunk/xpp/perl_modules/Dahdi/Xpp/Xbus.pm Mon Apr 20 08:44:35 2009
@@ -88,6 +88,8 @@
 		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;

Modified: tools/trunk/xpp/test_parse.c
URL: http://svn.digium.com/svn-view/dahdi/tools/trunk/xpp/test_parse.c?view=diff&rev=6417&r1=6416&r2=6417
==============================================================================
--- tools/trunk/xpp/test_parse.c (original)
+++ tools/trunk/xpp/test_parse.c Mon Apr 20 08:44:35 2009
@@ -1,6 +1,6 @@
 /*
  * Written by Oron Peled <oron at actcom.co.il>
- * Copyright (C) 2006, Xorcom
+ * Copyright (C) 2006, 2007, 2008, 2009 Xorcom
  *
  * All rights reserved.
  *

Modified: tools/trunk/xpp/twinstar
URL: http://svn.digium.com/svn-view/dahdi/tools/trunk/xpp/twinstar?view=diff&rev=6417&r1=6416&r2=6417
==============================================================================
--- tools/trunk/xpp/twinstar (original)
+++ tools/trunk/xpp/twinstar Mon Apr 20 08:44:35 2009
@@ -17,8 +17,7 @@
 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 @@
 	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;
 		}
-		close F || die "Failed running '$astribank_tool': $!";
+		if(!defined $mppinfo->{TWINSTAR_PORT}) {
+			printf STDERR "%s: no TWINSTAR_PORT information\n", $dev->hardware_name;
+			next;
+		}
+		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_jump() {
-	my @usb_devs = grep { /usb:/ } tws_devs();
-	my %ports;
-
+sub tws_showports(@) {
+	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;
+		}
+		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_showports() {
-	my @usb_devs = grep { /usb:/ } tws_devs();
+sub tws_watchdog($@) {
+	my $on = shift;
+	die "tws_watchdog() on/off?" unless defined $on;
+	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_setwatchdog($on);
 	}
 }
 
-sub tws_watchdog($) {
-	my $on = shift;
-	die "tws_watchdog() on/off?" unless defined $on;
-	my @usb_devs = grep { /usb:/ } tws_devs();
+sub tws_jump(@) {
+	my @usb_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 $?;
+		my $mppinfo = $dev->mppinfo;
+		if(!defined $mppinfo) {
+			printf STDERR "%s: no MPP information\n", $dev->hardware_name;
+			next;
+		}
+		$mppinfo->mpp_jump;
 	}
 }
 
+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__

Modified: tools/trunk/xpp/twinstar_hook
URL: http://svn.digium.com/svn-view/dahdi/tools/trunk/xpp/twinstar_hook?view=diff&rev=6417&r1=6416&r2=6417
==============================================================================
--- tools/trunk/xpp/twinstar_hook (original)
+++ tools/trunk/xpp/twinstar_hook Mon Apr 20 08:44:35 2009
@@ -1,4 +1,37 @@
 #! /bin/sh
+#
+# Written by Oron Peled <oron at 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 @@
 ## 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 @@
 		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
+		dahdi_cfg -v -c "$SYSTEMCONF" 2>&1 | $LOGGER
+		sleep 1	# Just for visual effect
 		asterisk -rx 'module load chan_dahdi.so' 2>&1 | $LOGGER
-		sleep 1	# Just for visual effect
-		"$xpp_blink" bzzt xpd "$XBUS_NUM"
-		ports=`"$twinstar" ports`
+		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 @@
 	;;
 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'
 	;;
 *)

Modified: tools/trunk/xpp/twinstar_setup
URL: http://svn.digium.com/svn-view/dahdi/tools/trunk/xpp/twinstar_setup?view=diff&rev=6417&r1=6416&r2=6417
==============================================================================
--- tools/trunk/xpp/twinstar_setup (original)
+++ tools/trunk/xpp/twinstar_setup Mon Apr 20 08:44:35 2009
@@ -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) {
+	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);
+		$mppinfo = $dev->mppinfo;
+		if(! defined $mppinfo) {
+			warn "SKIP $hwname -- is not TwinStar ready\n";
+			next;
+		}
+		if(! defined $mppinfo->{MPP_TALK}) {
+			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;
-		Dahdi::Xpp::Mpp->mpp_addinfo($dev);
-		my $mppinfo = $dev->mppinfo;
-		if(! defined $mppinfo) {
-			warn "SKIP $xbusstr -- is not Twinstar capable\n";
-			next;
-		}
-		if(! defined $mppinfo->{MPP_TALK}) {
-			warn "SKIP $xbusstr -- USB firmware is not loaded\n";
+		if(bad_xpds($xbus)) {
+			warn "SKIP $xbusstr -- Not registered with DAHDI\n";
 			next;
 		}
 		my $port = $mppinfo->{TWINSTAR_PORT};
@@ -55,12 +96,11 @@
 			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 @@
 				"(others to $first_port)\n";
 		}
 	}
-	return @twinstar_out;
+	return @twinstar_good;
 }
 
-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;
+my @twinstar_good = twinstar_checks;
+if(!@twinstar_good) {
+	print STDERR "Abort. No Twinstar capable Astribanks found\n";
+	exit 1;
 }
-
-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;
-}
-
-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 @@
 
 =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:
 
-Its location may be overriden via the environment variable F<DAHDI_TWINSTAR_SETUP>.
+=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.
+
+=back




More information about the svn-commits mailing list