Skip to content

Commit 9330788

Browse files
committed
Add timeout option
1 parent 40f1209 commit 9330788

File tree

2 files changed

+23
-9
lines changed

2 files changed

+23
-9
lines changed

stormshield/sns/cli.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,7 @@ def main():
8484
group.add_argument("-i", "--ip", help="Remote UTM ip", default=None)
8585
group.add_argument("-P", "--port", help="Remote port", default=443, type=int)
8686
group.add_argument("--proxy", help="Proxy URL (scheme://user:password@host:port)", default=None)
87+
group.add_argument("-t", "--timeout", help="Connection timeout in seconds", default=-1, type=int)
8788

8889
group = parser.add_argument_group("Authentication parameters")
8990
group.add_argument("-u", "--user", help="User name", default="admin")
@@ -120,6 +121,7 @@ def main():
120121
password = args.password
121122
port = args.port
122123
proxy = args.proxy
124+
timeout = args.timeout
123125
user = args.user
124126
sslverifypeer = args.sslverifypeer
125127
sslverifyhost = args.sslverifyhost
@@ -195,11 +197,14 @@ def logcommand(self, message, *args, **kwargs):
195197
if password is None and usercert is None:
196198
password = getpass.getpass()
197199

200+
if timeout == -1:
201+
timeout = None
202+
198203
try:
199204
client = SSLClient(
200205
host=host, ip=ip, port=port, user=user, password=password,
201206
sslverifypeer=sslverifypeer, sslverifyhost=sslverifyhost,
202-
credentials=credentials, proxy=proxy,
207+
credentials=credentials, proxy=proxy, timeout=timeout,
203208
usercert=usercert, cabundle=cabundle, autoconnect=False)
204209
except Exception as exception:
205210
logging.error(str(exception))

stormshield/sns/sslclient/__init__.py

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -268,7 +268,7 @@ class SSLClient:
268268

269269
def __init__(self, user='admin', password=None, host=None, ip=None, port=443, cabundle=None,
270270
sslverifypeer=True, sslverifyhost=True, credentials=None,
271-
usercert=None, autoconnect=True, proxy=None):
271+
usercert=None, autoconnect=True, proxy=None, timeout=None):
272272
""":class:`SSLclient <SSLClient>` constructor.
273273
274274
:param user: Optional user name.
@@ -283,6 +283,7 @@ def __init__(self, user='admin', password=None, host=None, ip=None, port=443, ca
283283
:param usercert: Optional user certificate.
284284
:param autoconnect: Connect to the appliance at initialization
285285
:param proxy: https proxy url (socks5://user:pass@host:port http://user:password@host/)
286+
:param timeout: connection and read timeout in seconds
286287
"""
287288

288289
self.user = user
@@ -303,6 +304,7 @@ def __init__(self, user='admin', password=None, host=None, ip=None, port=443, ca
303304
self.dl_crc = ""
304305
self.autoconnect = autoconnect
305306
self.proxy = proxy
307+
self.conn_options = {}
306308

307309
if host is None:
308310
raise MissingHost("Host parameter must be provided")
@@ -355,6 +357,9 @@ def __init__(self, user='admin', password=None, host=None, ip=None, port=443, ca
355357
if self.proxy:
356358
self.session.proxies = { "https": self.proxy}
357359

360+
if timeout is not None:
361+
self.conn_options = { "timeout": timeout }
362+
358363
self.logger = logging.getLogger()
359364

360365
if self.autoconnect:
@@ -376,7 +381,7 @@ def connect(self):
376381
# user cert authentication
377382
request = self.session.get(
378383
self.baseurl + '/auth/admin.html?sslcert=1&app={}'.format(self.app),
379-
headers=self.headers)
384+
headers=self.headers, **self.conn_options)
380385
else:
381386
# password authentication
382387
request = self.session.post(
@@ -385,7 +390,8 @@ def connect(self):
385390
'uid':base64.b64encode(self.user.encode('utf-8')),
386391
'pswd':base64.b64encode(self.password.encode('utf-8')),
387392
'app':self.app},
388-
headers=self.headers)
393+
headers=self.headers,
394+
**self.conn_options)
389395

390396
self.logger.log(logging.DEBUG, request.text)
391397

@@ -405,7 +411,8 @@ def connect(self):
405411
request = self.session.post(
406412
self.baseurl + '/api/auth/login',
407413
data=data,
408-
headers=self.headers)
414+
headers=self.headers,
415+
**self.conn_options)
409416

410417
self.logger.log(logging.DEBUG, request.text)
411418

@@ -435,7 +442,7 @@ def disconnect(self):
435442

436443
request = self.session.get(
437444
self.baseurl + '/api/auth/logout?sessionid=' + self.sessionid,
438-
headers=self.headers)
445+
headers=self.headers, **self.conn_options)
439446

440447
if request.status_code == requests.codes.OK:
441448
self.logger.log(logging.INFO, 'Disconnected from %s', self.host)
@@ -473,7 +480,7 @@ def send_command(self, command):
473480
request = self.session.get(
474481
self.baseurl + '/api/command?sessionid=' + self.sessionid +
475482
'&cmd=' + requests.compat.quote(command.encode('utf-8')), # manually done since we need %20 encoding
476-
headers=self.headers)
483+
headers=self.headers, **self.conn_options)
477484

478485
self.logger.log(logging.DEBUG, request.text)
479486

@@ -524,7 +531,8 @@ def download(self, filename):
524531
request = self.session.get(
525532
self.baseurl + '/api/download/tmp.file?sessionid=' + self.sessionid,
526533
headers=self.headers,
527-
stream=True)
534+
stream=True,
535+
**self.conn_options)
528536

529537
if request.status_code == requests.codes.OK:
530538
size = 0
@@ -569,7 +577,8 @@ def upload(self, filename):
569577
request = self.session.post(
570578
self.baseurl + '/api/upload?sessionid=' + self.sessionid,
571579
headers=headers,
572-
data=data)
580+
data=data,
581+
**self.conn_options)
573582

574583
uploadh.close()
575584

0 commit comments

Comments
 (0)