Пример #1
0
    def _ngrok_disconnect(self):
        self._logger.info("Closing any open ngrok tunnels")

        pyngrok_config = PyngrokConfig()
        pyngrok_config.auth_token = self._settings.get(["token"])
        pyngrok_config.region = self._settings.get(["region"])

        try:
            for tunnel in ngrok.get_tunnels():
                self._logger.info("Closing tunnel %s" % tunnel.public_url)
                ngrok.disconnect(tunnel.public_url,
                                 pyngrok_config=pyngrok_config)
        except PyngrokNgrokError:
            pass

        self._event_bus.fire(Events.PLUGIN_NGROK_CLOSED,
                             dict(tunnel=self._tunnel_url))
        self._tunnel_url = ""
        self._plugin_manager.send_plugin_message(self._identifier,
                                                 dict(tunnel=self._tunnel_url))
Пример #2
0
    def _ngrok_connect(self):
        if self._retry_connect_timer:
            self._retry_connect_timer = None

        if self._ngrok_started:
            self._ngrok_disconnect()

        if not self._settings.get(["token"]):
            self._logger.warning("Ngrok auth token is not configured")
            self._plugin_manager.send_plugin_message(
                self._identifier,
                dict(
                    error=
                    "The auth token is not configured. An auth token is required to create a secure tunnel."
                ))

            self._restart_ngrok = True
            self._attempting_connect_on_start = False

            return

        if not (self._settings.get(["auth_name"])
                and self._settings.get(["auth_pass"])):
            self._logger.warning("Basic Auth is not configured")
            self._plugin_manager.send_plugin_message(
                self._identifier,
                dict(
                    error=
                    "The username and password are not configured. Authentication is required to create a secure tunnel."
                ))
            self._attempting_connect_on_start = False

            return

        pyngrok_config = PyngrokConfig()
        pyngrok_config.log_event_callback = self.on_ngrok_log_event
        pyngrok_config.auth_token = self._settings.get(["token"])
        pyngrok_config.region = self._settings.get(["region"])

        if self._restart_ngrok:
            self._logger.info("Setting ngrok auth token & region...")
            if self._ngrok_started:
                ngrok.kill()  # Make sure no previous token is used

            # Resettimg the _restart_ngrok flag is postponed until we know the restart was succesful
            # because otherwise the token and region may not "take".

        self._logger.info("Opening ngrok tunnel...")
        options = dict(bind_tls=True,
                       inspect=False,
                       auth="%s:%s" % (self._settings.get(
                           ["auth_name"]), self._settings.get(["auth_pass"])))

        if self._settings.get(["subdomain"]):
            options["subdomain"] = self._settings.get(["subdomain"])
        if self._settings.get(["hostname"]):
            options["hostname"] = self._settings.get(["hostname"])

        try:
            if self._legacy_ngrok:
                tunnel = ngrok.connect(
                    port=self._settings.get_int(["port"]),
                    options=options,
                    pyngrok_config=pyngrok_config)  # type:str
            else:
                tunnel = ngrok.connect(addr=self._settings.get_int(["port"]),
                                       pyngrok_config=pyngrok_config,
                                       **options)  # type:NgrokTunnel
            self._ngrok_started = True
        except PyngrokNgrokError:
            self._logger.error("Could not connect with the provided API key")
            self._attempting_connect_on_start = False
            return

        self._attempting_connect_on_start = False
        if tunnel:
            if self._legacy_ngrok:
                tunnel_url = tunnel
            else:
                tunnel_url = tunnel.public_url
            self._tunnel_url = tunnel_url.partition("://")[2]
            self._logger.info("ngrok tunnel: %s" % self._tunnel_url)
            self._plugin_manager.send_plugin_message(
                self._identifier, dict(tunnel=self._tunnel_url))

            self._event_bus.fire(Events.PLUGIN_NGROK_CONNECTED,
                                 dict(tunnel=self._tunnel_url))

            self._restart_ngrok = False