Commit d2bd6044 authored by Jim Newsome's avatar Jim Newsome
Browse files

Make hidden service hostname available after preConfig step

parent 14c2ecd7
Loading
Loading
Loading
Loading
Loading
+9 −3
Original line number Diff line number Diff line
@@ -375,7 +375,13 @@ class Node(object):

    @property
    def hs_hostname(self) -> Option[str]:
        """Generated hostname for this hidden service"""
        """Generated hostname for this hidden service.

        Should be available (non-None) if the node is configured as a hidden
        service (`Node.is_hs`), after the Node's builder's `preConfig` has been
        called (which the chutney `Network` does as part of this node's
        `config_phase`).
        """
        return self._builder.get_hs_hostname()

    ######
@@ -493,8 +499,8 @@ class NodeBuilder(ABC):
    def get_hs_hostname(self) -> Option[str]:
        """Return the hidden service hostname, if any.

        Returns `Option(None)` if there is no hidden service for this node,
        or if the hostname isn't available yet.
        Should be available (non-None) if the node is configured as a hidden
        service (`Node.is_hs`), after `preConfig` has been called.
        """
        ...

+23 −9
Original line number Diff line number Diff line
@@ -39,7 +39,7 @@ class LocalArtiNodeBuilder(TorNet.NodeBuilder):
    def _info_log_path(self) -> Path:
        return self._node.dir.joinpath("info.log")

    def _gen_config_str(self, net: TorNet.Network) -> str:
    def _gen_config(self, net: TorNet.Network) -> dict[str, object]:
        if self._node._config.exit:
            raise ChutneyInternalError("Arti exit unimplemented")
        if self._node._config.authority:
@@ -117,15 +117,32 @@ class LocalArtiNodeBuilder(TorNet.NodeBuilder):
        bridges = check_type(config.setdefault("bridges", {}), dict)
        bridges["enabled"] = bool(self._node._config.bridgeclient)

        return tomli_w.dumps(config)
        return config

    @override
    def checkConfig(self, net: TorNet.Network) -> None:
        self._gen_config_str(net)
        # Just check that it doesn't fail to generate.
        self._gen_config(net)

    def _early_config_path(self) -> Path:
        return self._node.dir.joinpath("early_config.toml")

    def _generate_early_config(self, net: TorNet.Network) -> None:
        early_config: dict[str, object] = self._gen_config(net)
        early_config_str: str = tomli_w.dumps(early_config)
        with self._early_config_path().open("w") as f:
            f.write(
                "# Early version of config that doesn't depend on other node configs.\n"
            )
            f.write(
                "# Used e.g. when running arti during configuration to generate keys.\n"
            )
            f.write(early_config_str)

    @override
    def preConfig(self, net: TorNet.Network) -> None:
        pass
        mkdir_p(self._node.dir)
        self._generate_early_config(net)

    @override
    def get_fingerprint(self) -> Option[str]:
@@ -137,10 +154,7 @@ class LocalArtiNodeBuilder(TorNet.NodeBuilder):

    @override
    def config(self, net: TorNet.Network) -> None:
        config_str = self._gen_config_str(net)
        mkdir_p(self._node.dir)
        with self._node.torrc_path.open("w") as f:
            f.write(config_str)
        self._node.torrc_path.write_text(tomli_w.dumps(self._gen_config(net)))

    @override
    def postConfig(self, net: TorNet.Network) -> None:
@@ -178,7 +192,7 @@ class LocalArtiNodeBuilder(TorNet.NodeBuilder):
                # stdout along with the actual output we want.
                # <https://gitlab.torproject.org/tpo/core/arti/-/issues/2024>
                "--log-level=",
                f"--config={str(self._node.torrc_path)}",
                f"--config={str(self._early_config_path())}",
                "hss",
                f"--nickname={_HS_NICKNAME}",
                "onion-address",
+1 −2
Original line number Diff line number Diff line
@@ -234,6 +234,7 @@ class LocalNodeBuilder(TorNet.NodeBuilder):
            self._genRouterKey()
        if self._node._config.hs:
            self._makeHiddenServiceDir()
            self._generate_hs_state()
        if net.family_ids:
            for fid in self._node._config.families:
                shutil.copy(
@@ -285,8 +286,6 @@ class LocalNodeBuilder(TorNet.NodeBuilder):
    @override
    def config(self, net: TorNet.Network) -> None:
        self._createTorrcFile()
        if self._node._config.hs:
            self._generate_hs_state()

    @override
    def postConfig(self, net: TorNet.Network) -> None: