diff --git a/appPublic/sshx.py b/appPublic/sshx.py index f5026c3..a323faf 100644 --- a/appPublic/sshx.py +++ b/appPublic/sshx.py @@ -9,6 +9,55 @@ from appPublic.myTE import tmpTml from appPublic.log import debug, exception import asyncio, asyncssh, sys +class SSHServer: + def __init__(self, server, jumpservers=[]): + self.server = server + self.jumpservers = jumpservers + + async def _connect_server(self, server, refconn=None): + f = asyncssh.connect + if refconn: + f = refconn.connect_ssh + host = server['host'] + username = server.get('username', 'root') + port = server.get('port',22) + password= server.get('password', None) + client_keys = server.get('client_keys', []) + passphrase = server.get('passphrase', None) + if client_keys: + conn = await f(host, + username=username, + known_hosts=None, + keepalive_interval=60, + client_keys=client_keys, + passphrase=passphrase, + port=port) + else: + conn = await f(host, + username=username, + known_hosts=None, + keepalive_interval=60, + password=password, + port=port) + return conn + + @asynccontextmanager + async def get_connector(self): + refconn = None + connector = [] + for jj in self.jumpservers: + refconn = await self._connect_server(jj, refconn) + connector.append(refconn) + conn = await self._connect_server(self.server, refconn) + try: + yield conn + except Exception as e: + exception(f'{e=}, {format_exc()}') + conn.close() + connector.reverse() + for c in connector: + c.close() + class SSHNode: def __init__(self, host, username='root',