Control-CLI-AvayaData
view release on metacpan or search on metacpan
lib/Control/CLI/AvayaData.pm view on Meta::CPAN
my %args = parseMethodArgs($pkgsub, \@_, \@validArgs, 1);
if (@_ && !%args) { # Legacy syntax
($args{username}, $args{password}, $args{read_attempts}, $args{wake_console},
$args{prompt_credentials}, $args{data_with_error}, $args{timeout}, $args{errmode}) = @_;
}
# In which case we need to setup the poll structure for them here (the main poll structure remains unchanged)
$self->{POLL}{$pollsub} = { # Populate structure with method arguments/storage
# Set method argument keys
username => defined $args{username} ? $args{username} : $self->{USERNAME},
password => defined $args{password} ? $args{password} : $self->{PASSWORD},
read_attempts => defined $args{read_attempts} ? $args{read_attempts} : $LoginReadAttempts,
data_with_error => defined $args{data_with_error} ? $args{data_with_error} : $self->{data_with_error},
wake_console => defined $args{wake_console} ? $args{wake_console} : $self->{$Package}{wake_console},
prompt_credentials => defined $args{prompt_credentials} ? $args{prompt_credentials} : $self->{prompt_credentials},
# Declare method storage keys which will be used
stage => 0,
login_attempted => undef,
password_sent => undef,
login_error => '',
family_type => undef,
cpu_slot => undef,
detectionFromPrompt => undef,
# Declare keys to be set if method called from another polled method
errmode => $args{errmode},
};
# Cache poll structure keys which this method will use
$self->poll_struct_cache($pollsub, $args{timeout});
}
my $login = $self->{POLL}{$pollsub};
local $self->{errmode} = $login->{errmode} if defined $login->{errmode};
return $self->poll_return($self->error("$pkgsub: No connection to login to")) if $self->eof;
my $usernamePrompt = $self->username_prompt;
my $passwordPrompt = $self->password_prompt;
if ($login->{stage} < 1) { # Initial loginstage & setup - do only once
$login->{stage}++; # Ensure we don't come back here in non-blocking mode
if ($self->{LOGINSTAGE}) {
$login->{family_type} = $self->{$Package}{ATTRIB}{'family_type'}; # Might be already set from previous login attempt
}
else { # Flush all attributes, as we assume we are connecting to a new device
$self->{$Package}{ATTRIB} = undef;
$self->{$Package}{ATTRIBFLAG} = undef;
}
# Handle resuming previous login attempt
if ($self->{LOGINSTAGE} eq 'username' && $login->{username}) { # Resume login from where it was left
$self->print(line => $login->{username}, errmode => 'return')
or return $self->poll_return($self->error("$pkgsub: Unable to send username // ".$self->errmsg));
$self->{LOGINSTAGE} = '';
$login->{login_attempted} = 1;
}
elsif ($self->{LOGINSTAGE} eq 'password' && $login->{password}) { # Resume login from where it was left
$self->print(line => $login->{password}, errmode => 'return')
or return $self->poll_return($self->error("$pkgsub: Unable to send password // ".$self->errmsg));
$self->{LOGINSTAGE} = '';
$login->{login_attempted} = 1;
}
elsif ($self->console && $login->{wake_console}) {
$self->debugMsg(8,"\nlogin() Sending wake_console sequence >$login->{wake_console}<\n");
$self->put(string => $login->{wake_console}, errmode => 'return') # Bring connection into life
or return $self->poll_return($self->error("$pkgsub: Unable to send bring alive character sequence // ".$self->errmsg));
}
}
if ($login->{stage} < 2) { # Main login loop
my ($pattern, $patdepth, $deepest);
my ($promptType, $capturedPrompt, $switchName, $cliType, $configContext);
LOGINLOOP: while (1) {
# Wait until we have read in all available data
my $ok = $self->poll_readwait($pkgsub, 1, $login->{read_attempts}, $ReadwaitTimer, $login->{login_error}.'Failed reading login prompt', $login->{data_with_error});
return $self->poll_return($ok) unless $ok; # Come out if error (if errmode='return'), or if nothing to read in non-blocking mode
$self->debugMsg(8,"\nlogin() Connection input to process:\n>", \$self->{POLL}{read_buffer}, "<\n");
$self->{POLL}{output_buffer} .= $self->{POLL}{read_buffer}; # This buffer preserves all the output, in case it is requested
$self->{POLL}{local_buffer} = $self->{POLL}{read_buffer} =~ /\n/ ? '' : stripLastLine(\$self->{POLL}{local_buffer}); # Flush or keep lastline
$self->{POLL}{local_buffer} .= $self->{POLL}{read_buffer}; # If read was single line, this buffer appends it to lastline from previous read
# Try and match CLI prompts; this is the only exit point of the loop
if ($login->{family_type}) { # A family type was already detected from banner
if ($login->{family_type} eq $Prm{pers}) {
foreach my $type ('cli', 'nncli') {
$promptType = "$login->{family_type}_$type";
if ($self->{POLL}{local_buffer} =~ /($InitPrompt{$promptType})/) {
($capturedPrompt, $switchName, $login->{cpu_slot}, $configContext) = ($1, $2, $3, $4);
$cliType = $type;
last;
}
}
}
else {
if ($self->{POLL}{local_buffer} =~ /($InitPrompt{$login->{family_type}})/) {
($capturedPrompt, $switchName, $configContext) = ($1, $2, $4);
$promptType = $login->{family_type};
}
}
}
else { # A family type has not been detected yet; try and detect from received prompt
foreach my $key (@InitPromptOrder) {
if ($self->{POLL}{local_buffer} =~ /($InitPrompt{$key})/) {
($capturedPrompt, $switchName, $login->{cpu_slot}, $configContext) = ($1, $2, $3, $4);
$promptType = $key;
($login->{family_type} = $key) =~ s/_(\w+)$//;
$cliType = $1;
$login->{detectionFromPrompt} = 1;
last;
}
}
}
if ($capturedPrompt) { # We have a prompt, we can exit loop
$self->debugMsg(8,"\nlogin() Got CLI prompt for family type $login->{family_type} !\n");
$self->_setDevicePrompts($promptType, $switchName);
$capturedPrompt =~ s/^\x0d//; # Remove initial carriage return if there
$capturedPrompt =~ s/\x0d$//; # Remove trailing carriage return if there (possible if we match on not the last prompt, as we do /m matching above
($self->{LASTPROMPT} = $capturedPrompt) =~ s/$LastPromptClense//o;
$self->{$Package}{CONFIGCONTEXT} = $configContext;
$self->{$Package}{PROMPTTYPE} = $promptType;
$self->debugMsg(4,"login() Prompt type = $self->{$Package}{PROMPTTYPE}\n");
$self->_setAttrib('cpu_slot', $login->{cpu_slot}) if $login->{family_type} eq $Prm{pers};
if ($login->{detectionFromPrompt}) {
if ($login->{family_type} eq $Prm{bstk} || (defined $cliType && $cliType eq 'nncli')) {
$self->_setAttrib('is_nncli', 1);
( run in 2.085 seconds using v1.01-cache-2.11-cpan-39bf76dae61 )