[tor-commits] [chutney/master] Add basic arti support to chutney

nickm at torproject.org nickm at torproject.org
Fri Feb 12 19:05:27 UTC 2021


commit 723705f96e3e6e148474e5f5a7771a445a55bc77
Author: Nick Mathewson <nickm at torproject.org>
Date:   Thu Feb 11 13:42:57 2021 -0500

    Add basic arti support to chutney
    
    Each chutney network now generates an arti.toml file in its nodes
    directory that can be used to connect to that network using arti.
---
 lib/chutney/TorNet.py | 49 ++++++++++++++++++++++++++++++++++++++++++++-----
 1 file changed, 44 insertions(+), 5 deletions(-)

diff --git a/lib/chutney/TorNet.py b/lib/chutney/TorNet.py
index c80bfda..043904a 100644
--- a/lib/chutney/TorNet.py
+++ b/lib/chutney/TorNet.py
@@ -598,12 +598,13 @@ class LocalNodeBuilder(NodeBuilder):
     # ipv6_addr -- secondary IP address (usually IPv6) to listen on
     # orport, dirport -- used on authorities, relays, and bridges. The orport
     #                    is used for both IPv4 and IPv6, if present
-    # fingerprint -- used only if authority
+    # fingerprint, fingerprint_ed -- used only if authority
     # dirserver_flags -- used only if authority
     # nick -- nickname of this router
 
     # Environment members set
     # fingerprint -- hex router key fingerprint
+    # fingerprint_ed -- base64 router key ed25519 fingerprint
     # nodenum -- int -- set by chutney -- which unique node index is this?
 
     def __init__(self, env):
@@ -782,12 +783,17 @@ class LocalNodeBuilder(NodeBuilder):
             sys.exit(1)
         self._env['fingerprint'] = fingerprint
 
+        ed_fn = os.path.join(datadir, "fingerprint-ed25519")
+        if os.path.exists(ed_fn):
+            s = open(ed_fn).read().strip().split()[1]
+            self._env['fingerprint_ed25519'] = s
+
     def _getAltAuthLines(self, hasbridgeauth=False):
         """Return a combination of AlternateDirAuthority,
         and AlternateBridgeAuthority lines for
         this Node, appropriately.  Non-authorities return ""."""
         if not self._env['authority']:
-            return ""
+            return ("","")
 
         datadir = self._env['dir']
         certfile = Path(datadir, 'keys', "authority_certificate")
@@ -805,6 +811,7 @@ class LocalNodeBuilder(NodeBuilder):
             # the 'bridge' flag set.
             options = ("AlternateBridgeAuthority",)
             self._env['dirserver_flags'] += " bridge"
+            arti = False
         else:
             # Directory authorities return AlternateDirAuthority with
             # the 'v3ident' flag set.
@@ -815,6 +822,7 @@ class LocalNodeBuilder(NodeBuilder):
             else:
                 options = ("DirAuthority",)
             self._env['dirserver_flags'] += " v3ident=%s" % v3id
+            arti = True
 
         authlines = ""
         for authopt in options:
@@ -829,7 +837,32 @@ class LocalNodeBuilder(NodeBuilder):
             authlines += " %s %s:%s %s\n" % (
                 self._env['dirserver_flags'], self._env['ip'],
                 self._env['dirport'], self._env['fingerprint'])
-        return authlines
+
+        # generate arti configuartion if supported
+        arti_lines = ""
+        if arti:
+            addrs = '"%s:%s"' % (self._env['ip'], self._env['orport'])
+            if self._env['ipv6_addr'] is not None:
+                addrs += ', "%s:%s"' % (self._env['ipv6_addr'],
+                                        self._env['orport'])
+            elts = { "fp": self._env['fingerprint'].replace(" ", ""),
+                     "ed_fp": self._env['fingerprint_ed25519'],
+                     "orports": addrs,
+                     "nick": self._env['nick'],
+                     "v3id": v3id }
+            arti_lines = """
+[[network.fallback_cache]]
+rsa_identity = "{fp}"
+ed_identity = "{ed_fp}"
+orports = [ {orports} ]
+
+[[network.authority]]
+name = "{nick}"
+v3ident = "{v3id}"
+
+""".format(**elts)
+
+        return (authlines, arti_lines)
 
     def _getBridgeLines(self):
         """Return potential Bridge line for this Node. Non-bridge
@@ -2297,6 +2330,7 @@ class Network(object):
         network = self
         altauthlines = []
         bridgelines = []
+        artilines = []
         all_builders = [ n.getBuilder() for n in self._nodes ]
         builders = [ b for b in all_builders
                      if b._env['config_phase'] == phase ]
@@ -2307,8 +2341,10 @@ class Network(object):
 
         for b in all_builders:
             b.preConfig(network)
-            altauthlines.append(b._getAltAuthLines(
-                self._dfltEnv['hasbridgeauth']))
+            tor_auth_line, arti_auth = b._getAltAuthLines(
+                self._dfltEnv['hasbridgeauth'])
+            altauthlines.append(tor_auth_line)
+            artilines.append(arti_auth)
             bridgelines.append(b._getBridgeLines())
 
         self._dfltEnv['authorities'] = "".join(altauthlines)
@@ -2317,6 +2353,9 @@ class Network(object):
         for b in builders:
             b.config(network)
 
+        with open(os.path.join(get_absolute_nodes_path(),"arti.toml"), 'w') as f:
+            f.write("".join(artilines))
+
         for b in builders:
             b.postConfig(network)
 





More information about the tor-commits mailing list