Connecting Tech Pros Worldwide Help | Site Map

Net::Telnet hangs after initiating reboot command

Newbie
 
Join Date: Feb 2007
Posts: 1
#1: Feb 16 '07
Hi,

I am facing a problem with the Perl Telnet Object. My Telnet Object hangs just after issueing reboot command on the remote host.

Please help me who faced this problem !!!

Thanks in advance

Siju Maliakkal
miller's Avatar
Moderator
 
Join Date: Oct 2006
Location: San Francisco, CA
Posts: 830
#2: Feb 16 '07

re: Net::Telnet hangs after initiating reboot command


Well, of course it will hang, as the telnet session will be dropped immediately after you tell the remote server to reboot. I don't know the best method to solve this, but one alternative would be to setup an alarm.

http://perldoc.perl.org/functions/alarm.html

I would also enclose that particular telnet command in an eval statement to trap the alarm call as well. Then do the appropriate cleanup associated with the fact that the telnet session is defunct. Something like this:

Expand|Select|Wrap|Line Numbers
  1. eval {
  2. alarm 5;
  3. $t->cmd("reboot");
  4. alarm 0;
  5. };
  6. # Proceed with cleanup
  7.  
Newbie
 
Join Date: May 2009
Posts: 1
#3: May 26 '09

re: Net::Telnet hangs after initiating reboot command


Expand|Select|Wrap|Line Numbers
  1. ## I have tested this code on all Unix platforms (AIX, HP, Linux - All, Solaris)
  2. ## This is absolutely flawless
  3. ## Abhishek A. Kulkarni
  4.  
  5. use Net::Telnet;
  6. use Net::Ping;
  7.  
  8. sub Reboot
  9. {
  10.         my ($hostname, $username, $password) = @_;
  11.  
  12.         print "\n Telnet for Reboot\n";
  13.         my $telnetHandle = getTelnetHandle($hostname, $username, $password);
  14.  
  15.         print "\n Rebooting the machine \n";
  16.  
  17.         @output = remoteCommand("which reboot", $hostname, $username, $password);
  18.  
  19.         $command = $output[0];
  20.         chomp($command);
  21.         print "\n$command\n";
  22.  
  23.         $telnetHandle->cmd("$command");
  24.         $telnetHandle->close;
  25.  
  26.         print "\n telnet handle closed \n";
  27.  
  28.         ## Verify if host is pinging for some time even after reboot command
  29.         for($count=1;$count<=300;$count++)
  30.         {
  31.                 if($ping->ping($hostname))
  32.                 {
  33.                         print "\n host is still pinging \n";
  34.                         sleep(1);
  35.                 }
  36.                 else
  37.                 {
  38.                         print "\n Host went DOWN \n";
  39.                         last;
  40.                 }
  41.         }
  42.         ## Verify if host has come up after reboot
  43.         $Reboot = 0;
  44.         for($count=1;$count<=180;$count++)
  45.         {
  46.                 if($ping->ping($hostname))
  47.                 {
  48.                         print "\n Host came UP\n";
  49.                         $Reboot = 1;
  50.                         last;
  51.                 }
  52.                 else
  53.                 {
  54.                         print "#";
  55.                         sleep(5);
  56.                 }
  57.         }
  58.  
  59.         if($Reboot == 0)
  60.         {
  61.                 print "\n Host did not come UP even after waiting for 15 mins \n";
  62.         }
  63.         ## Get telnet handle after reboot and return it to the calling subroutine
  64.         $telnetHandle = getTelnetHandle($hostname,$username,$password);
  65.         return $telnetHandle;
  66. }
  67.  
  68. sub remoteCommand
  69. {
  70.         my ($command, $hostname, $username, $password) = @_;
  71.         my $telnetHandle = getTelnetHandle($hostname, $username, $password);
  72.  
  73.         @output = $telnetHandle->cmd(String => $command,Timeout => 4000,Prompt => ' /[#] $/');
  74.  
  75.         return @output;
  76. }
  77.  
  78. sub getTelnetHandle
  79. {
  80.         my ($hostname, $username, $password) = @_;
  81.         my $prompt = '/#|$ $/';
  82.         my $timeout = 10;
  83.         my $errmode = "return";
  84.         my $port = 23;
  85.  
  86.         $ping = Net::Ping->new();
  87.  
  88.         if ($ping->ping($hostname))
  89.         {
  90.                 print "INFO: Host is reachable\n";
  91.  
  92.                 $telnetHandle = new Net::Telnet (Errmode=>$errmode,Host=>$hostname,Prompt=>$prompt,Port=>$port,Timeout=>$timeout);
  93.  
  94.                 $telnetHandle->open("$hostname");
  95.  
  96.                 print "\n Telnet Handle Created \n";
  97.  
  98.                 $telnetHandle->login(Name=>$username,Password=>$password,Errmode => $errmode,Timeout =>$timeout);
  99.  
  100.                 $STDError = $telnetHandle->errmsg();
  101.  
  102.                 if ($STDError)
  103.                 {
  104.                         print "ERROR : $STDError";
  105.                 }
  106.         }
  107.         else
  108.         {
  109.                 print "ERROR: Host is not reachable";
  110.         }
  111.         return $telnetHandle;
  112. }
numberwhun's Avatar
Site Moderator
 
Join Date: May 2007
Location: New Hampshire
Posts: 2,565
#4: May 27 '09

re: Net::Telnet hangs after initiating reboot command


You need to please keep in mind the age of the question(s) that you are reading. This post is about 2 years old and I doubt the user is even monitoring it.

To that end, I am closing this thread.

Regards,

Jeff
Closed Thread