469,341 Members | 7,768 Online
Bytes | Developer Community
New Post

Home Posts Topics Members FAQ

Post your question to a community of 469,341 developers. It's quick & easy.

Net::Telnet hangs after initiating reboot command

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
Feb 16 '07 #1
3 3803
miller
1,089 Expert 1GB
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.  
Feb 16 '07 #2
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. }
May 26 '09 #3
numberwhun
3,503 Expert Mod 2GB
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
May 27 '09 #4

This discussion thread is closed

Replies have been disabled for this discussion.

Similar topics

reply views Thread by Pete Johansen | last post: by
1 post views Thread by kriz4321 | last post: by
1 post views Thread by jyohere | last post: by
2 posts views Thread by kriz4321 | last post: by
1 post views Thread by CARIGAR | last post: by
reply views Thread by suresh191 | last post: by
reply views Thread by Purva khokhar | last post: by
1 post views Thread by haryvincent176 | last post: by
1 post views Thread by Marylou17 | last post: by
By using this site, you agree to our Privacy Policy and Terms of Use.