First, I should point out that it looks like you might not be using use strict; in your code. If that is the case, I'd recommend adding that as well as use warnings; to your code.
Here's how I'd approach the modification:
- Declare the $t variable as a hash outside of the foreach loop
- For each key in your main hash, you'll be creating that key in the %t hash
- Inside the foreach loop, do the following:
- Check to see if the key (connection object) exists. If not, create it with unique logs.
- Issue a command to the connection object. If there's an error, close the connection and reopen it.
- Issue the commands that you need to do
Below is my untested modification of your code to do the above suggestions. You'll need to modify the test command to be something that makes sense for your situation.
my $continue = 1;
my %t; # Hash to hold telnet connection objects
# start of data collection loop that starts every X minutes
while ($continue) {
#New ForEach Loop to iterate through Router Hash Table
foreach $router (sort (keys (%MSC_Routers))) {
my $ip = $MSC_Routers{$router};
print ("$router has IP: of $ip\n\n");
#Print out which one I am connecting to
print ("\t\t I am telnetting to: $ip \n\n");
sleep 3;
$mode = "return";
if (!exists $t{$router}) {
my $input_log = $router."_input_log";
my $dump_log = $router."_dump_log";
#Open Telnet Session
$t{$router} = new Net::Telnet (Timeout => 10,
input_log => "$input_log",
dump_log => "$dump_log",
prompt => '/#$/',
Errmode => $mode
);
}
my $test_cmd = "ls";
if (!$t{$router}->put($test_cmd)) { # test if connection is op
+en
$t{$router}->close;
$t{$router}->open("$ip");
}
# Issue desired commands here
} # end foreach $router loop
} # end of while loop