示例#1
0
 def __assert_server_reachable(self):
     if not is_port_bound(self.host, self.port):
         if self.remote and not self.remote.is_port_bound(self._host, self._port):
             self.disconnect()
             raise DuctServerUnreachable(
                 "Remote '{}' cannot connect to '{}:{}'. Please check your settings before trying again.".format(
                     self.remote.name, self._host, self._port))
         elif not self.remote:
             self.disconnect()
             raise DuctServerUnreachable(
                 "Cannot connect to '{}:{}' on your current connection. Please check your connection before trying again.".format(
                     self.host, self.port))
示例#2
0
    def port_forward(self, remote_host, remote_port=None, local_port=None):
        '''
        Establishes a local port forwarding from local port `local` to remote
        port `remote`. If `local` is `None`, automatically find an available local
        port, and forward it. This method returns the used local port.

        If the remote port is already forwarded, a new connection is not created.
        '''

        # Hostname and port extraction
        remote_host, remote_port, local_port = self.__extract_host_and_ports(remote_host, remote_port, local_port)
        assert remote_host is not None, "Remote host must be specified."
        assert remote_port is not None, "Remote port must be specified."

        # Actual port forwarding
        registered_port = self.__port_forwarding_register.lookup_port(remote_host, remote_port)
        if registered_port is not None:
            if local_port is not None and registered_port != local_port:
                self.port_forward_stop(registered_port)
            else:
                return registered_port

        if local_port is None:
            local_port = get_free_local_port()
        else:
            assert is_local_port_free(local_port), "Specified local port is in use, and cannot be used."

        if not self.is_port_bound(remote_host, remote_port):
            raise DuctServerUnreachable("Server specified for port forwarding ({}:{}) in unreachable.".format(remote_host, remote_port))
        connection = self.connect()._port_forward_start(local_port, remote_host, remote_port)
        self.__port_forwarding_register.register(remote_host, remote_port, local_port, connection)

        return local_port
示例#3
0
    def __assert_server_reachable(self):
        if self.host is not None or self.port is not None:
            if self.host is None:
                raise ValueError("Port specified but no host provided.")
            if self.port is None:
                raise ValueError("Host specified but no port specified.")
        else:
            return

        if not is_port_bound(self.host, self.port):
            if self.remote and not self.remote.is_port_bound(self._host, self._port):
                self.disconnect()
                raise DuctServerUnreachable(
                    "Remote '{}' cannot connect to '{}:{}'. Please check your settings before trying again.".format(
                        self.remote.name, self._host, self._port))
            elif not self.remote:
                self.disconnect()
                raise DuctServerUnreachable(
                    "Cannot connect to '{}:{}' on your current connection. Please check your connection before trying again.".format(
                        self.host, self.port))
示例#4
0
    def port_forward(self, remote_host, remote_port=None, local_port=None):
        """
        Initiate a port forward connection.

        This method establishes a local port forwarding from a local port `local`
        to remote port `remote`. If `local` is `None`, an available local port is
        automatically chosen. If the remote port is already forwarded, a new
        connection is not established.

        Args:
            remote_host (str): The hostname of the remote host in form:
                'hostname(:port)'.
            remote_port (int, None): The remote port of the service.
            local_port (int, None): The port to use locally (automatically
                determined if not specified).

        Returns:
            int: The local port which is port forwarded to the remote service.
        """

        # Hostname and port extraction
        remote_host, remote_port, local_port = self._extract_host_and_ports(
            remote_host, remote_port, local_port)
        assert remote_host is not None, "Remote host must be specified."
        assert remote_port is not None, "Remote port must be specified."

        # Actual port forwarding
        registered_port = self.__port_forwarding_register.lookup_port(
            remote_host, remote_port)
        if registered_port is not None:
            if local_port is not None and registered_port != local_port:
                self.port_forward_stop(registered_port)
            else:
                return registered_port

        if local_port is None:
            local_port = get_free_local_port()
        else:
            assert is_local_port_free(
                local_port
            ), "Specified local port is in use, and cannot be used."

        if not self.is_port_bound(remote_host, remote_port):
            raise DuctServerUnreachable(
                "Server specified for port forwarding ({}:{}) is unreachable via '{}' ({})."
                .format(remote_host, remote_port, self.name,
                        self.__class__.__name__))
        connection = self._port_forward_start(local_port, remote_host,
                                              remote_port)
        self.__port_forwarding_register.register(remote_host, remote_port,
                                                 local_port, connection)

        return local_port