Implement getattr behaviour
parent
fb28213fb1
commit
9ae51586c8
|
@ -1,59 +1,16 @@
|
||||||
from sshim import *
|
from sshim import *
|
||||||
import paramiko
|
import paramiko
|
||||||
import os
|
import os
|
||||||
import six
|
|
||||||
import codecs
|
|
||||||
import uuid
|
import uuid
|
||||||
import lxd_interface
|
import lxd_interface
|
||||||
import threading
|
import threading
|
||||||
import logging
|
import logging
|
||||||
import time
|
import time
|
||||||
|
import inspect
|
||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
def expect(self, line, echo=True) -> str:
|
|
||||||
"""
|
|
||||||
Expect a line of input from the user. If this has the `match` method, it will call it on the input and return
|
|
||||||
the result, otherwise it will use the equality operator, ==. Notably, if a regular expression is passed in
|
|
||||||
its match method will be called and the matchdata returned. This allows you to use matching groups to pull
|
|
||||||
out interesting data and operate on it.
|
|
||||||
If ``echo`` is set to False, the server will not echo the input back to the client.
|
|
||||||
"""
|
|
||||||
buffer = six.BytesIO()
|
|
||||||
|
|
||||||
try:
|
|
||||||
while True:
|
|
||||||
byte = self.fileobj.read(1)
|
|
||||||
|
|
||||||
if not byte or byte == '\x04':
|
|
||||||
raise EOFError()
|
|
||||||
elif byte == b'\t':
|
|
||||||
pass
|
|
||||||
elif byte == b'\x7f':
|
|
||||||
if buffer.tell() > 0:
|
|
||||||
self.sendall('\b \b')
|
|
||||||
buffer.truncate(buffer.tell() - 1)
|
|
||||||
elif byte == b'\x1b' and self.fileobj.read(1) == b'[':
|
|
||||||
command = self.fileobj.read(1)
|
|
||||||
if hasattr(self.delegate, 'cursor'):
|
|
||||||
self.delegate.cursor(command)
|
|
||||||
elif byte in (b'\r', b'\n'):
|
|
||||||
break
|
|
||||||
else:
|
|
||||||
buffer.write(byte)
|
|
||||||
if echo:
|
|
||||||
self.sendall(byte)
|
|
||||||
|
|
||||||
if echo:
|
|
||||||
self.sendall('\r\n')
|
|
||||||
|
|
||||||
return codecs.decode(buffer.getvalue(), self.encoding)
|
|
||||||
|
|
||||||
except Exception:
|
|
||||||
raise
|
|
||||||
|
|
||||||
|
|
||||||
def check_channel_shell_request(self, channel):
|
def check_channel_shell_request(self, channel):
|
||||||
logger.debug(channel)
|
logger.debug(channel)
|
||||||
Runner(self, channel).start()
|
Runner(self, channel).start()
|
||||||
|
@ -98,16 +55,17 @@ class Runner(threading.Thread):
|
||||||
self.transport = ssh_client.get_transport()
|
self.transport = ssh_client.get_transport()
|
||||||
tmp_channel = ssh_client.invoke_shell()
|
tmp_channel = ssh_client.invoke_shell()
|
||||||
|
|
||||||
logger.debug(tmp_channel)
|
self.channel.other_channel = tmp_channel
|
||||||
logger.debug(self.channel)
|
self.channel.__getattribute__ = Patch.__getattribute__
|
||||||
self.channel.in_buffer = tmp_channel.in_buffer
|
|
||||||
self.channel.in_stderr_buffer = tmp_channel.in_stderr_buffer
|
|
||||||
|
|
||||||
while True:
|
while True:
|
||||||
time.sleep(1000)
|
time.sleep(1000)
|
||||||
|
|
||||||
|
|
||||||
Script.expect = expect
|
class Patch:
|
||||||
|
def __getattribute__(self, item):
|
||||||
|
getattr(self.other_channel, item)
|
||||||
|
|
||||||
|
|
||||||
Handler.check_channel_shell_request = check_channel_shell_request
|
Handler.check_channel_shell_request = check_channel_shell_request
|
||||||
Handler.check_auth_none = check_auth_none
|
Handler.check_auth_none = check_auth_none
|
||||||
|
|
Loading…
Reference in New Issue