def info(self, fmt): m = Buffer() m.put_int(MUX_C_INFO) rid = self.rid self.rid += 1 m.put_int(rid) m.put_str(fmt) if self._write_packet(m) is not None: return (False, 'Can\'t send INFO request') m = self._read_packet() rep_msg = m.get_int() rep_rid = m.get_int() if rep_rid != rid: return (False, 'Got unexpected request id %u, expected %u' % (rep_rid, rid)) if rep_msg != MUX_S_RESULT: rep_reason = m.get_str() if rep_msg == MUX_S_FAILURE: return (False, rep_reason) return (False, 'Expected INFO reply, got %x' % (rep_msg,)) rep_str = m.get_str() return (True, rep_str)
def forward(self, mode, ftype, listen_host, listen_port, connect_host, connect_port): m = Buffer() if mode: n = 'OPEN' m.put_int(MUX_C_OPEN_FWD) else: n = 'CLOSE' m.put_int(MUX_C_CLOSE_FWD) rid = self.rid self.rid += 1 m.put_int(rid) if isinstance(ftype, basestring): assert ftype in _fwd_names, 'Invalid forward type %s' % (ftype,) ftype = _fwd_names[ftype] m.put_int(ftype) m.put_str(listen_host) m.put_int(listen_port) m.put_str(connect_host) m.put_int(connect_port) if self._write_packet(m) is not None: return (False, 'Can\'t send %s-FORWARD request' % (n,)) m = self._read_packet() rep_msg = m.get_int() rep_rid = m.get_int() if rep_rid != rid: return (False, 'Got unexpected request id %u, expected %u' % (rep_rid, rid)) if rep_msg != MUX_S_OK and rep_msg != MUX_S_REMOTE_PORT: rep_reason = m.get_str() if rep_msg == MUX_S_FAILURE: return (False, 'Failure in %s-FORWARD request: %s' % (n, rep_reason,)) elif rep_msg == MUX_S_PERMISSION_DENIED: return (False, 'Permission denied for %s-FORWARD request: %s' % (n, rep_reason,)) return (False, 'Unexpected server reply, got %u' % (rep_msg,)) if ftype == MUX_FWD_REMOTE and listen_port == 0: if rep_msg != MUX_S_REMOTE_PORT: return (False, 'Expected remote port reply, got %u' % (rep_msg,)) rep_port = m.get_int() return (True, rep_port) return (True, None)
def _write_packet(self, buf): pkt = Buffer() pkt.put_str(buf) return self.fd.sendall(pkt)