Revision 0fd74489 ncclient/ssh.py
b/ncclient/ssh.py | ||
---|---|---|
28 | 28 |
def __str__(self): |
29 | 29 |
return 'RECEIVED: %s | UNSENT: %s' % (self._in_buf, self._out_buf) |
30 | 30 |
|
31 |
def __init__(self, in_buf, out_buf):
|
|
31 |
def __init__(self, in_buf=None, out_buf=None):
|
|
32 | 32 |
SessionError.__init__(self) |
33 | 33 |
self._in_buf, self._out_buf = in_buf, out_buf |
34 | 34 |
|
... | ... | |
81 | 81 |
chan = self._channel |
82 | 82 |
chan.setblocking(0) |
83 | 83 |
q = self._q |
84 |
bufin = self._in_buf |
|
85 |
bufout = self._out_buf |
|
86 |
bufsize = SSHSession.BUF_SIZE |
|
87 |
delim = SSHSession.MSG_DELIM |
|
88 |
unsent_data = False |
|
84 | 89 |
|
85 |
while True: |
|
86 |
if chan.closed: |
|
87 |
break |
|
88 |
if chan.recv_ready(): |
|
89 |
data = chan.recv(SSHSession.BUF_SIZE) |
|
90 |
if data: |
|
91 |
self._in_buf.write(data) |
|
92 |
self._parse() |
|
93 |
else: |
|
94 |
break |
|
95 |
if chan.send_ready(): |
|
90 |
try: |
|
91 |
|
|
92 |
while True: |
|
93 |
|
|
94 |
if chan.closed: |
|
95 |
raise SessionCloseError(bufin.getvalue(), bufout.getvalue()) |
|
96 |
|
|
96 | 97 |
if not q.empty(): |
97 |
self._out_buf.write(q.get() + SSHSession.MSG_DELIM) |
|
98 |
self._dump() |
|
98 |
bufout.write(q.get() + delim) |
|
99 |
unsent_data = True |
|
100 |
|
|
101 |
if unsent_data and chan.send_ready(): |
|
102 |
data = bufout.getvalue() |
|
103 |
while data: |
|
104 |
n = chan.send(data) |
|
105 |
if n <= 0: |
|
106 |
raise SessionCloseError(bufin.getvalue(), |
|
107 |
bufout.getvalue()) |
|
108 |
data = data[n:] |
|
109 |
unsent_data = False |
|
110 |
|
|
111 |
if chan.recv_ready(): |
|
112 |
data = chan.recv() |
|
113 |
if data: |
|
114 |
bufin.write(data) |
|
115 |
self._parse() |
|
116 |
else: |
|
117 |
raise SessionCloseError(bufin.getvalue(), |
|
118 |
bufout.getvalue()) |
|
99 | 119 |
|
100 |
logger.debug('** broke out of main loop **')
|
|
101 |
self.dispatch('close', SessionCloseError(self._in_buf, self._out_buf))
|
|
102 |
|
|
120 |
except Exception as e:
|
|
121 |
logger.debug('broke out of main loop: %s' % e)
|
|
122 |
self.dispatch('error', e) |
|
103 | 123 |
|
104 | 124 |
def _close(self): |
105 | 125 |
self._channel.close() |
106 | 126 |
Session._close(self) |
107 | 127 |
|
108 |
def _dump(self): |
|
109 |
for line in self._out_buf: |
|
110 |
while line: |
|
111 |
n = chan.send(line) |
|
112 |
if n <= 0: |
|
113 |
break |
|
114 |
line = self._out_buf[n:] |
|
115 |
|
|
116 | 128 |
def _parse(self): |
117 | 129 |
delim = SSHSession.MSG_DELIM |
118 | 130 |
n = len(delim) - 1 |
Also available in: Unified diff