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))
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
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))
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