1212import base64
1313import logging
1414import os
15+ import socket
1516from math import ceil
1617from multiprocessing import Pool
1718
18- from retrying import retry
19-
2019from common .utils import run_command
21- from paramiko import HostKeys , RSAKey , SSHException , Transport
20+ from paramiko import HostKeys , RSAKey , Transport
2221
2322
24- @retry (stop_max_attempt_number = 3 )
2523def _get_server_keys (hostname ):
2624
2725 server_keys = []
@@ -36,23 +34,28 @@ def _get_server_keys(hostname):
3634 key_type_list = ["ssh-rsa" ]
3735
3836 for key_type in key_type_list :
37+ transport = None
3938 try :
40- transport = Transport (hostname )
39+ sock = socket .socket ()
40+ sock .settimeout (5 )
41+ sock .connect ((hostname , 22 ))
42+ transport = Transport (sock )
4143 transport ._preferred_keys = [key_type ]
4244 transport .start_client ()
4345 server_keys .append (transport .get_remote_server_key ())
44- except Exception as e :
46+ except Exception :
4547 pass
4648 finally :
47- transport .close ()
49+ if transport :
50+ transport .close ()
4851
4952 if not server_keys :
50- logging .error ("Failed retrieving server key from host '{0}'" . format ( hostname ) )
53+ logging .error ("Failed retrieving server key from host '%s'" , hostname )
5154
5255 return hostname , [(server_key .get_base64 (), server_key .get_name ()) for server_key in server_keys ]
5356
5457
55- def _get_server_key_on_multiple_hosts (hostnames , parallelism = 25 , timeout = 5 ):
58+ def _get_server_key_on_multiple_hosts (hostnames , parallelism = 25 , timeout = 7 ):
5659 if not hostnames :
5760 return {}
5861
@@ -62,11 +65,13 @@ def _get_server_key_on_multiple_hosts(hostnames, parallelism=25, timeout=5):
6265 # The pool timeout is computed by adding 2 times the command timeout for each batch of hosts that is
6366 # processed in sequence. Where the size of a batch is given by the degree of parallelism.
6467 results = r .get (timeout = int (ceil (len (hostnames ) / float (parallelism )) * (2 * timeout )))
68+ return dict (results )
69+ except Exception as e :
70+ logging .error ("Failed when retrieving keys from hosts %s with exception %s" , "," .join (hostnames ), e )
71+ return dict ()
6572 finally :
6673 pool .terminate ()
6774
68- return dict (results )
69-
7075
7176def _add_keys_to_known_hosts (server_keys , host_keys_file ):
7277 try :
0 commit comments