#! /usr/bin/perl -w # # Written by Oron Peled # Copyright (C) 2007, Xorcom # This program is free software; you can redistribute and/or # modify it under the same terms as Perl itself. # # $Id$ # use strict; use File::Basename; use Getopt::Std; BEGIN { my $dir = dirname($0); unshift(@INC, "$dir", "$dir/perl_modules"); } use Dahdi; use Dahdi::Hardware; use Dahdi::Span; use Dahdi::Xpp; use Dahdi::Xpp::Xbus; my $astribank_tool = '/usr/sbin/astribank_tool'; sub usage { die "Usage: $0 {status|jump|enable-wd|disable-wd|ports}\n"; } our ($opt_v, $opt_x); getopts('vx') || usage; @ARGV == 1 or usage; # Find USB bus toplevel my $usb_top; $usb_top = '/dev/bus/usb'; $usb_top = '/proc/bus/usb' unless -d $usb_top; die "No USB toplevel found\n" unless -d $usb_top; sub tws_devs() { my @devs; foreach my $dev (Dahdi::Hardware->device_list) { next unless $dev->is_astribank; next unless $dev->product =~ /116./; push(@devs, $dev->hardware_name); } return @devs; } sub tws_usb_devfile($) { my $name = shift || die; # Remove prefix if($name !~ s/usb://) { die "$name is not a USB name\n"; } return "$usb_top/$name"; } sub tws_show() { my @usb_devs = grep { /usb:/ } tws_devs(); 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() { chomp; next unless /twinstar/i; printf "\t%s\n", $_; } close F || die "Failed running '$astribank_tool': $!"; } } 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() { chomp; next unless /twinstar/i; next unless /connected\s+to/i; if(/USB-(\d+)/i) { $port = $1; } } close F || die "Failed running '$astribank_tool': $!"; return $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; 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}); } } sub tws_showports() { my @usb_devs = grep { /usb:/ } tws_devs(); foreach my $dev (@usb_devs) { my $port = tws_portnum($dev); print "$port\n"; } } 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 $?; } } if($ARGV[0] eq 'status') { tws_show(); } elsif($ARGV[0] eq 'jump') { tws_jump(); } elsif($ARGV[0] eq 'disable-wd') { tws_watchdog(0); } elsif($ARGV[0] eq 'enable-wd') { tws_watchdog(1); } elsif($ARGV[0] eq 'ports') { tws_showports(); } __END__