예제 #1
0
    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)
예제 #2
0
    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)
예제 #3
0
 def _write_packet(self, buf):
     pkt = Buffer()
     pkt.put_str(buf)
     return self.fd.sendall(pkt)