Can't use Net::Appliance::Session inside a thread
Posted on 2008-01-22 12:41:21-08 by miky
Hello, I'm not sure it's a Net::Appliance::Session related problem but I just wanted to have your opinion. So far I'm using Net::Telnet and Net::Telnet::Cisco and threads, everything is working fine. When I use Net::Appliance::Session launched by a thread it segfaults. I wrote this little script that reflects my problem and which is more simple that the script I use.
#!/usr/bin/perl use Net::Appliance::Session; use threads; use threads::shared; $ip='10.1.1.1'; $host='ROUTER1'; $pf='MyPTF'; $device='cisco_router'; $connexion='ssh'; $login='miky'; $pass='mypass'; $enable=''; my $num_threads : shared = 0; my $max_thread = 1; while ($num_threads >= $max_thread) { print "$num_threads thread(s) actifs: nombre de threads maximal autorise atteint\n"; sleep 2; } $num_threads++; my $thr = threads->new('net_ssh_cisco', $ip, $host, $pf, $device, $login, $pass, $enable); $thr->detach(); sleep 2; sub net_ssh_cisco { my ($ip, $host, $pf, $device, $login, $pass, $enable) = @_; my $session; eval { $session = Net::Appliance::Session->new( Host => $ip, Transport => 'SSH' ); }; if ($@) { print "$@\n"; print "$host injoignable\n"; $num_threads--; return; } print "Connexion effective\n"; eval { $session->connect(Name=>$login, Password=>$pass); }; # <<< Problem is here if ($@) { print "$@\n"; # <<< Debug message print "$host probleme de password\n"; # <<< Debug message return; } print "Logged on "; print "$host\n"; $session->close; $num_threads--; }
When I execute the script
$ ./debugthread.pl Connexion effective Failed to get first prompt at ./debugthread.pl line 58 ROUTER1 probleme de password Segmentation fault
It seems that this message comes from Net/Appliance/Session/Transport/SSH.pm
my $match; (undef, $match) = $self->waitfor($self->pb->fetch('userpass_prompt')) or $self->error('Failed to get first prompt');
When I don't use threads it works, with threads it doesn't. Do you have an idea of what happens or could you point out a direction that could help ? Thanx
Posted on 2008-01-31 22:33:06-08 by oliver in response to 6909
Hi Miky,
I don't have a lot of experience with threads, but I did run your sample program (thanks for that!) and made a little investigation.
My best guess is that this is a problem with the Net::Telnet module. My reason for reaching this conclusion is that the error message returned, "Failed to get first prompt", is returned *immediately* after the connect() method is called. There should be a 10 second timeout on this, waiting for the prompt. The timeout actually happens within the waitfor() method of Net::Telnet, so I think it's this which is not thread safe. For some reason it does not wait 10 seconds but instead returns immediately with a failure. Perhaps it is some problem with signal handling?
Unfortunately, the loop which has the "broken" timeout in Net::Telnet is generated code, so it's hard to debug, and also because I am not an experienced threads programmer I wouldn't know where to start anyway.
For now, I think we are going to have to say that Net::Appliance::Session is not thread safe, because of this problem. I'm very sorry about that.
regards, oliver.
Posted on 2008-02-01 00:37:14-08 by onishin in response to 6985
I have same pb for mode Telnet . My solution is run another process perl for just one connexions. 1 Have 1 script ( Main ) run Many another for processe Net:Telnet Main:
foreach my $id (@routeur) { exec child.pl $id ; }
(This article is based on a thread on the CPAN::Forum.)
Published on 2008-01-22