| version 1.1, 2005/11/16 03:28:42 |
version 1.2, 2005/11/16 05:26:37 |
|
|
| #!/usr/bin/perl
|
#!/usr/bin/perl
|
| # $RedRiver$
|
# $RedRiver: update_trango.pl,v 1.1 2005/11/16 03:28:42 andrew Exp $
|
| ########################################################################
|
########################################################################
|
| # update_trango.pl *** Updates trango foxes with a new firmware
|
# update_trango.pl *** Updates trango foxes with a new firmware
|
| #
|
#
|
|
|
| use warnings;
|
use warnings;
|
|
|
|
| use Net::Telnet;
|
use Net::Telnet;
|
| |
use Net::TFTP;
|
| |
use YAML;
|
| |
|
| |
my @Foxes = (
|
| |
'10.100.3.8',
|
| |
# '10.100.3.11',
|
| |
# '10.100.3.12',
|
| |
# '10.100.3.13',
|
| |
);
|
| |
|
| |
my $password = 'password';
|
| |
|
| |
my $new_file = 'fsu53_2p0a2H0003D05101403.s19';
|
| |
my $new_ver = 'FSU 1p06H0003D04111001';
|
| |
my $new_cksum = 'x1D28DCC4';
|
| |
|
| |
my $max_tries = 3;
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
foreach my $fox (@Foxes) {
|
| |
print "getting temp from Fox: $fox\n";
|
| |
## Connect and login.
|
| |
my $host = new Net::Telnet (Timeout => 5,
|
| |
Prompt => '/#> *$/');
|
| |
$host->open($fox);
|
| |
$host->dump_log('dump.log');
|
| |
|
| |
## Login to remote host.
|
| |
$host->waitfor(
|
| |
-match => '/password: ?$/i',
|
| |
-errmode => "return",
|
| |
) or die "problem connecting to host ($fox): ", $host->lastline;
|
| |
$host->print($password);
|
| |
$host->waitfor(
|
| |
-match => $host->prompt,
|
| |
-errmode => "return",
|
| |
) or die "login ($fox) failed: ", $host->lastline;
|
| |
|
| |
|
| |
## Send commands
|
| |
if ( upload($host, $new_file) ) {
|
| |
$host->send('reboot');
|
| |
} else {
|
| |
$host->send('exit');
|
| |
}
|
| |
$host->close;
|
| |
}
|
| |
|
| |
sub upload
|
| |
{
|
| |
my $host = shift;
|
| |
my $file = shift;
|
| |
my $ver = get_ver($host);
|
| |
|
| |
if (
|
| |
$ver->{'Firmware Version'} eq $new_ver &&
|
| |
$ver->{'Checksum'} eq $new_cksum
|
| |
) {
|
| |
print "Already updated!";
|
| |
return 1;
|
| |
}
|
| |
|
| |
my $try = 0;
|
| |
while (1) {
|
| |
$try++;
|
| |
|
| |
enable_tftpd($host) || die "Couldn't enable tftpd";
|
| |
|
| |
# use tftp to push the file up
|
| |
|
| |
# waitfor some sort of output
|
| |
# make sure it says 'Success.' otherwise error
|
| |
|
| |
my $results = check_tftpd($host);
|
| |
# check the 'File Length' against ???
|
| |
|
| |
# 'updateflash mainimage $old_cksum $new_cksum'
|
| |
# OR
|
| |
# 'save mainimage [current firmware checksum] [new firmware checksum]'
|
| |
# waitfor a prompt, look at the end of the output for 'Success.' otherwise
|
| |
# error.
|
| |
# decode_lines to get 'Checksum' to see if it matches $new_cksum
|
| |
|
| |
$ver = get_ver($host);
|
| |
# check versions
|
| |
|
| |
|
| |
if ($try >= $max_tries) {
|
| |
warn "Couldn't update in $max_tries tries!";
|
| |
return undef;
|
| |
}
|
| |
}
|
| |
}
|
| |
|
| |
sub get_ver
|
| |
{
|
| |
my $host = shift;
|
| |
return cmd($host, 'ver');
|
| |
}
|
| |
|
| |
sub enable_tftpd
|
| |
{
|
| |
my $host = shift;
|
| |
|
| |
my $vals = cmd($host, 'tftpd on');
|
| |
|
| |
if ($vals->{'Tftpd'} eq 'listen') {
|
| |
return 1;
|
| |
} else {
|
| |
return undef;
|
| |
}
|
| |
}
|
| |
|
| |
sub check_tftpd
|
| |
{
|
| |
my $host = shift;
|
| |
return cmd($host, 'tftpd');
|
| |
}
|
| |
|
| |
sub cmd
|
| |
{
|
| |
my $host = shift;
|
| |
my $string = shift;
|
| |
|
| |
my @lines = $host->cmd($string);
|
| |
|
| |
my $vals = decode_lines(@lines);
|
| |
return $vals;
|
| |
}
|
| |
|
| |
sub decode_lines
|
| |
{
|
| |
### XXX ver has 2 Checksums. one for FPGA and one for Firmware. DOH!
|
| |
my @lines = @_;
|
| |
|
| |
my %conf;
|
| |
|
| |
my $key = '';
|
| |
my $val = '';
|
| |
my $in_key = 0;
|
| |
my $in_val = 0;
|
| |
|
| |
foreach my $line (@lines) {
|
| |
my @chars = split //, $line;
|
| |
|
| |
foreach my $c (@chars) {
|
| |
next if $c eq "\r";
|
| |
next if $c eq "\n";
|
| |
|
| |
if ($c eq '[') {
|
| |
$in_key = 1;
|
| |
$in_val = 0;
|
| |
if ($key) {
|
| |
$val =~ s/\s+$//;
|
| |
$conf{$key} = $val;
|
| |
$key = '';
|
| |
$val = '';
|
| |
}
|
| |
|
| |
} elsif ($c eq ']') {
|
| |
$in_val = 1;
|
| |
$in_key = 0;
|
| |
$c = shift @chars;
|
| |
|
| |
} elsif ($in_key) {
|
| |
$key .= $c;
|
| |
|
| |
} elsif ($in_val) {
|
| |
$val .= $c;
|
| |
}
|
| |
}
|
| |
}
|
| |
print Dump \%conf;
|
| |
|
| |
if (%conf) {
|
| |
return \%conf;
|
| |
} else {
|
| |
return \@lines;
|
| |
}
|
| |
}
|
|
|
|