package PBS::Shell::Telnet ; use 5.006 ; use strict ; use warnings ; require Exporter ; use AutoLoader qw(AUTOLOAD) ; our @ISA = qw(Exporter) ; our %EXPORT_TAGS = ('all' => [ qw() ]) ; our @EXPORT_OK = ( @{ $EXPORT_TAGS{'all'} } ) ; our @EXPORT = qw() ; our $VERSION = '0.01' ; use PBS::Output ; use Net::Telnet ; use Time::HiRes qw(gettimeofday tv_interval) ; #------------------------------------------------------------------------------- sub new { my $package = shift ; my %config = @_ ; my $telnet_connection = new Net::Telnet ( Timeout => $config{TIMEOUT} , Prompt => $config{PROMPT} ) ; my $self = bless {TELNET_CONNECTION => $telnet_connection, %config}, __PACKAGE__ ; return($self) ; } #----------------------------------------------------------------------------- sub GetInfo { my $self = shift ; my $user_info = $self->{USER_INFO} || '' ; return(__PACKAGE__ . " $self->{USER_NAME} @ $self->{HOST_NAME}$user_info") ; } #----------------------------------------------------------------------------- sub RunCommand { my $self = shift ; my $command = shift ; my $new_prompt = shift || $self->{PROMPT} ; my $host_info = "$self->{USER_NAME}\@$self->{HOST_NAME}" ; unless(defined $self->{LOGGED_IN}) { my $t0 = [gettimeofday] ; $self->{TELNET_CONNECTION}->open($self->{HOST_NAME}) ; $self->{TELNET_CONNECTION}->login($self->{USER_NAME}, $self->{PASSWORD}) ; $self->{LOGGED_IN}++ ; PrintInfo(sprintf("Telnet: Connected to '$host_info' (%0.2f s).\n", tv_interval ($t0, [gettimeofday]))) ; for my $login_command (@{$self->{LOGIN_COMMANDS}}) { local $PBS::Shell::silent_commands = 1 unless $login_command->[2] ; my ($command, $prompt) = ($login_command->[0], $login_command->[1]) ; $self->RunCommand($command, $prompt) ; } PrintInfo(sprintf("Telnet setup done. (%0.2f s).\n", tv_interval ($t0, [gettimeofday]))) ; } my $colorizer = $self->{COMMAND_COLOR} || \&PrintInfo2 ; $colorizer->("$command (Telnet:$host_info)\n") unless defined $PBS::Shell::silent_commands ; my $error_string = "Error running Telnet command" ; my $catch_error = "|| echo $error_string." ; my @output = $self->{TELNET_CONNECTION}->cmd ( String => $command . $catch_error , Prompt => $new_prompt ); $self->{PROMPT} = $new_prompt ; $self->{TELNET_CONNECTION}->prompt($new_prompt) ; if(@output >= 2 && $output[-2] =~ $error_string) { pop @output ; pop @output ; # remove error message print STDERR @output ; die bless { error => 'Shell command failed!' , command => $command , errno => -1 , errno_string => $error_string }, 'PBS::Shell' ; } else { unless(defined $PBS::Shell::silent_commands_output) { print STDOUT @output ; } } } #------------------------------------------------------------------------------- sub RunPerlSub { my $self = shift ; my $perl_sub = shift ; unless(defined $PBS::Shell::silent_commands) { my $colorizer = $self->{COMMAND_COLOR} || \&PrintInfo2 ; $colorizer->( __PACKAGE__ . " running perl sub locally.\n") ; } $perl_sub->(@_) ; } #------------------------------------------------------------------------------- 1 ; __END__ =head1 NAME PBS::Shell::Telnet - =head1 SYNOPSIS use PBS::; blah blah blah =head1 DESCRIPTION =head2 EXPORT None by default. =head1 AUTHOR Khemir Nadim ibn Hamouda. nadim@khemir.net =head1 SEE ALSO =cut