By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
446,198 Members | 881 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 446,198 IT Pros & Developers. It's quick & easy.

Net::Telnet hangs after initiating reboot command

P: 1
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
Share this Question
Share on Google+
3 Replies


miller
Expert 100+
P: 1,089
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

P: 1
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
Expert Mod 2.5K+
P: 3,503
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.