Skip to content
Snippets Groups Projects

more reliable transport in remote

Merged Ali Chaddad requested to merge transport into master
Compare and
1 file
+ 24
5
Preferences
Compare changes
+ 24
5
import paramiko
import os
import stat
import ipaddress
from io import StringIO, BytesIO
from fnmatch import fnmatch
from threading import Lock
@@ -24,7 +25,7 @@ class RemoteResponse:
class Remote(paramiko.SSHClient):
def __init__(self, hostname, port=22, *args, **kwargs):
def __init__(self, address, port=22, *args, **kwargs):
"""
:param *args: Connection args for paramiko.SSHClient
:param *kwargs: Connection kwargs for paramiko.SSHClient
@@ -40,11 +41,20 @@ class Remote(paramiko.SSHClient):
if "timeout" not in kwargs:
kwargs["timeout"] = 2.0
try:
ipaddress.ip_address(address)
self._address = address
except ValueError:
self._address = None
self.port = port
self._transport = None
self._args = args
self._kwargs = kwargs
with globallock:
lock = nodelocks.setdefault((hostname, port), Lock())
lock = nodelocks.setdefault((address, port), Lock())
with lock:
self.connect(hostname, port, *args, **kwargs)
self.transport = self.get_transport()
if os.environ.get("SSH_AUTH_SOCK"):
session = self.transport.open_session()
paramiko.agent.AgentRequestHandler(session)
@@ -53,6 +63,13 @@ class Remote(paramiko.SSHClient):
def hostname(self):
return self.run("hostname").stdout.strip()
@property
def transport(self):
if self._transport is None or self._transport.is_active() is False:
self.connect(self._address, self.port, *self._args, **self._kwargs)
self._transport = self.get_transport()
return self._transport
@property
def sftp(self):
if self._sftp is None:
@@ -67,7 +84,9 @@ class Remote(paramiko.SSHClient):
@property
def address(self):
return self.transport.getpeername()[0]
if not self._address:
self._address = self.transport.getpeername()[0]
return self._address
def run(self, command, check=True, binary=False):
"""