| version 1.15, 2006/09/07 03:59:03 |
version 1.20, 2006/09/12 03:20:39 |
|
|
| package Net::Telnet::Trango; |
package Net::Telnet::Trango; |
| # $RedRiver: Trango.pm,v 1.14 2006/09/07 02:49:34 andrew Exp $ |
# $RedRiver: Trango.pm,v 1.19 2006/09/12 02:16:43 andrew Exp $ |
| use strict; |
use strict; |
| use warnings; |
use warnings; |
| use base 'Net::Telnet'; |
use base 'Net::Telnet'; |
|
|
| |
|
| Perl access to the telnet interface on Trango Foxes, SUs and APs. |
Perl access to the telnet interface on Trango Foxes, SUs and APs. |
| |
|
| Another handy feature is that it will parse the output from certain commands that is in the format "[key1] value1 [key2] value2" and put those in a hashref that is returned. This makes using the output from things like sysinfo very easy to do. |
Another handy feature is that it will parse the output from certain |
| |
commands that is in the format "[key1] value1 [key2] value2" and put |
| |
those in a hashref that is returned. This makes using the output from |
| |
things like sysinfo very easy to do. |
| |
|
| =head2 EXPORT |
=head2 EXPORT |
| |
|
|
|
| |
|
| =item login_banner |
=item login_banner |
| |
|
| returns the banner that is displayed when first connected at login. Only set after a successful open() |
returns the banner that is displayed when first connected at login. |
| |
Only set after a successful open() |
| |
|
| This is usually only set internally |
This is usually only set internally |
| |
|
|
|
| |
|
| =head2 COMMANDS |
=head2 COMMANDS |
| |
|
| Most of these are just shortcuts to C<cmd(String =E<gt> METHOD)>, as such they accept the same options as C<cmd()>. Specifically they take a named paramater "args", for example: |
Most of these are just shortcuts to C<cmd(String =E<gt> METHOD)>, |
| |
as such they accept the same options as C<cmd()>. |
| |
Specifically they take a named paramater "args", for example: |
| C<tftpd(args =E<gt> 'on')> would enable tftpd |
C<tftpd(args =E<gt> 'on')> would enable tftpd |
| |
|
| =over |
=over |
|
|
| |
|
| reboots the trango and closes the connection |
reboots the trango and closes the connection |
| |
|
| |
=item remarks |
| |
|
| |
Takes an optional argument, which sets the remarks. |
| |
If there is no argument, returns the current remarks. |
| |
|
| =item sulog |
=item sulog |
| |
|
| returns an array ref of hashes containing each log line. |
returns an array ref of hashes containing each log line. |
|
|
| |
|
| returns the output from the eth list command |
returns the output from the eth list command |
| |
|
| |
=item su_info |
| |
|
| |
You need to pass in args => <suid> and it will return the info for that suid. |
| |
|
| |
=item save_ss |
| |
|
| |
saves the config. Returns 1 on success, undef on failure. |
| |
|
| =cut |
=cut |
| |
|
| |
|
|
|
| sulog => { decode => 'sulog', expect => $success }, |
sulog => { decode => 'sulog', expect => $success }, |
| 'exit' => { no_prompt => 1, cmd_disconnects => 1 }, |
'exit' => { no_prompt => 1, cmd_disconnects => 1 }, |
| reboot => { no_prompt => 1, cmd_disconnects => 1 }, |
reboot => { no_prompt => 1, cmd_disconnects => 1 }, |
| |
remarks => { decode => 'all', expect => $success }, |
| save_sudb => { String => 'save sudb', expect => $success }, |
save_sudb => { String => 'save sudb', expect => $success }, |
| syslog => { expect => $success }, |
syslog => { expect => $success }, |
| 'pipe' => { }, # XXX needs a special decode |
'pipe' => { }, # XXX needs a special decode |
| maclist => { decode => 'maclist' }, |
maclist => { decode => 'maclist' }, |
| maclist_reset => { String => 'maclist reset', expect => 'done' }, |
maclist_reset => { String => 'maclist reset', expect => 'done' }, |
| eth_link => { String => 'eth link', expect => $success }, |
eth_link => { String => 'eth link', expect => $success }, |
| |
su_info => { String => 'su info', decode => 'all', expect => $success }, |
| |
save_ss => { String => 'save ss', expect => $success }, |
| # eth r, w and reset??? |
# eth r, w and reset??? |
| #su password??? |
#su password??? |
| #_bootloader |
#_bootloader |
|
|
| } |
} |
| |
|
| if (exists $COMMANDS{$method}) { |
if (exists $COMMANDS{$method}) { |
| $method = shift if (@_ == 1); |
|
| $COMMANDS{$method}{'String'} ||= $method; |
$COMMANDS{$method}{'String'} ||= $method; |
| |
$COMMANDS{$method}{'args'} .= ' ' . shift if (@_ == 1); |
| return $self->cmd(%{ $COMMANDS{$method} }, @_); |
return $self->cmd(%{ $COMMANDS{$method} }, @_); |
| } |
} |
| |
|
|
|
| |
|
| =item open |
=item open |
| |
|
| Calls Net::Telnet::open() then makes sure you get a password prompt so you are ready to login() and parses the login banner so you can get host_type() and firmware_version() |
Calls Net::Telnet::open() then makes sure you get a password prompt so |
| |
you are ready to login() and parses the login banner so you can get |
| |
host_type() and firmware_version() |
| |
|
| =cut |
=cut |
| |
|
|
|
| |
|
| =item login |
=item login |
| |
|
| Calls open() if not already connected, then sends the password and sets logged_in() if successful |
Calls open() if not already connected, then sends the password and sets |
| |
logged_in() if successful |
| |
|
| =cut |
=cut |
| |
|
|
|
| |
|
| =item parse_login_banner |
=item parse_login_banner |
| |
|
| Takes a login banner (what you get when you first connect to the Trango) or reads what is already in login_banner() then parses it and sets host_type() and firmware_version() as well as login_banner() |
Takes a login banner (what you get when you first connect to the Trango) |
| |
or reads what is already in login_banner() then parses it and sets |
| |
host_type() and firmware_version() as well as login_banner() |
| |
|
| =cut |
=cut |
| |
|
|
|
| |
|
| =item cmd |
=item cmd |
| |
|
| This does most of the work. At the heart, it calls Net::Telnet::cmd() but it also does some special stuff for Trango. |
This does most of the work. At the heart, it calls Net::Telnet::cmd() |
| |
but it also does some special stuff for Trango. |
| |
|
| Normally returns the last lines from from the command |
Normally returns the last lines from from the command |
| |
|
| Also accepts these options: |
Also accepts these options: |
| |
|
| I<decode> |
I<decode> |
| - if this is true, then it will send the output lines to _decode_lines() and then returns the decoded output |
- if this is true, then it will send the output lines to _decode_lines() |
| |
and then returns the decoded output |
| |
|
| I<cmd_disconnects> |
I<cmd_disconnects> |
| - if this is true, it then sets logged_in() to false, then it will close() the connection and then sets is_connected() to false |
- if this is true, it then sets logged_in() to false, then it will |
| |
close() the connection and then sets is_connected() to false |
| |
|
| I<expect> |
I<expect> |
| - if this is set (usually to 'Success.') it will check for that in the last line of output and if it does not, will return undef because the command probably failed |
- if this is set (usually to 'Success.') it will check for that in the |
| |
last line of output and if it does not, will return undef because the |
| |
command probably failed |
| |
|
| I<args> |
I<args> |
| - a string containing the command line options that are passed to the command |
- a string containing the command line options that are passed to the |
| |
command |
| |
|
| =cut |
=cut |
| |
|
|
|
| my %conf; |
my %conf; |
| |
|
| my $key = ''; |
my $key = ''; |
| my $val = ''; |
my $val = undef; |
| my $in_key = 0; |
my $in_key = 0; |
| my $in_val = 0; |
my $in_val = 1; |
| |
|
| foreach my $line (@lines) { |
foreach my $line (@lines) { |
| next if $line =~ /$success$/; |
next if $line =~ /$success$/; |
|
|
| $in_val = 0; |
$in_val = 0; |
| } else { |
} else { |
| $in_key = 0; |
$in_key = 0; |
| $in_val = 0; |
$in_val = 1; |
| } |
} |
| |
|
| if ($key) { |
if ($key) { |
| $key =~ s/^\s+//; |
$key =~ s/^\s+//; |
| $key =~ s/\s+$//; |
$key =~ s/\s+$//; |
| |
|
| $val =~ s/^\s+//; |
if (defined $val) { |
| $val =~ s/\s+$//; |
$val =~ s/^\s+//; |
| |
$val =~ s/\s+$//; |
| |
} |
| |
|
| if ($key eq 'Checksum' && $last_key) { |
if ($key eq 'Checksum' && $last_key) { |
| # Special case for these bastids. |
# Special case for these bastids. |
|
|
| if (%conf) { |
if (%conf) { |
| return \%conf; |
return \%conf; |
| } else { |
} else { |
| return undef; |
return $val; |
| } |
} |
| } |
} |
| |
|
|
|
| |
|
| =head1 SEE ALSO |
=head1 SEE ALSO |
| |
|
| Trango Documentation - http://www.trangobroadband.com/support/product_docs.htm |
Trango Documentation - |
| |
http://www.trangobroadband.com/support/product_docs.htm |
| |
|
| L<Net::Telnet> |
L<Net::Telnet> |
| |
|
| =head1 TODO |
=head1 TODO |
| |
|
| There are still a lot of commands that are not accessed directly. If you call them (as cmd("command + args") or whatever) and it works, please send me examples that work and I will try to get it incorporated into the next version of the script. |
There are still a lot of commands that are not accessed directly. If |
| |
you call them (as cmd("command + args") or whatever) and it works, |
| |
please send me examples that work and I will try to get it incorporated |
| |
into the next version of the script. |
| |
|
| I also want to be able to parse the different types of output from commands like su, sudb all and anything else that would be better available as a perl datastructure. |
I also want to be able to parse the different types of output from |
| |
commands like su, sudb all and anything else that would be better |
| |
available as a perl datastructure. |
| |
|
| =head1 AUTHOR |
=head1 AUTHOR |
| |
|