Skip to content
Snippets Groups Projects

more reliable transport in remote

Merged Ali Chaddad requested to merge transport into master
Compare and
1 file
+ 28
4
Preferences
Compare changes
+ 28
4
import paramiko
import os
import stat
import ipaddress
from io import StringIO, BytesIO
from fnmatch import fnmatch
from threading import Lock
@@ -40,18 +41,39 @@ class Remote(paramiko.SSHClient):
if "timeout" not in kwargs:
kwargs["timeout"] = 2.0
self._address = None
self._hostname = None
try:
ipaddress.ip_address(hostname)
self._address = hostname
except ValueError:
self._hostname = hostname
self._transport = None
self._args = (hostname, port) + args
self._kwargs = kwargs
self.port = port
with globallock:
lock = nodelocks.setdefault((hostname, 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)
@property
def hostname(self):
return self.run("hostname").stdout.strip()
if not self._hostname:
self._hostname = self.run("hostname").stdout.strip()
return self._hostname
@property
def transport(self):
if self._transport is None or self._transport.is_active() is False:
self.connect(*self._args, **self._kwargs)
self._transport = self.get_transport()
return self._transport
@property
def sftp(self):
@@ -67,7 +89,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):
"""