Skip to content

Commit f61bb2f

Browse files
demartinofralukeseawalker
authored andcommitted
Add timeout to ssh connection when retrieving ssh keys
Signed-off-by: Francesco De Martino <[email protected]>
1 parent e7dcdfb commit f61bb2f

File tree

1 file changed

+16
-11
lines changed

1 file changed

+16
-11
lines changed

src/common/ssh_keyscan.py

Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -12,16 +12,14 @@
1212
import base64
1313
import logging
1414
import os
15+
import socket
1516
from math import ceil
1617
from multiprocessing import Pool
1718

18-
from retrying import retry
19-
2019
from 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)
2523
def _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

7176
def _add_keys_to_known_hosts(server_keys, host_keys_file):
7277
try:

0 commit comments

Comments
 (0)