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