Skip to content
Snippets Groups Projects
run-introducer.py 1.63 KiB
Newer Older
  • Learn to ignore specific revisions
  • #
    # Create a Tahoe-LAFS introducer node and run it as a daemon.  Exit with
    # success when it is accepting introducer client connections.
    #
    
    
    from sys import argv
    from os import environ, makedirs, rename
    from shutil import which
    from subprocess import check_output
    from socket import socket
    from time import sleep
    
    log = print
    
    def main():
        pemFile, introducerPort, introducerFURL = argv[1:]
    
        run(["tahoe", "--version"])
        run([
            "tahoe", "create-introducer",
            "--port", "tcp:" + introducerPort,
            "--location", "tcp:introducer:" + introducerPort,
            "/tmp/introducer",
        ])
        rename(pemFile, "/tmp/introducer/private/node.pem")
        with open("/tmp/introducer/private/introducer.furl", "w") as f:
            f.write(introducerFURL)
        run([
            "daemonize",
            "-o", "/tmp/stdout",
            "-e", "/tmp/stderr",
            which("tahoe"), "run", "/tmp/introducer",
        ])
    
        retry(
            "waiting for open introducer port",
    
            lambda: checkOpen(int(introducerPort)),
    
        )
    
    
    def checkOpen(portNumber):
        s = socket()
        try:
            s.connect(("127.0.0.1", portNumber))
        except:
            return False
        else:
            return True
        finally:
            s.close()
    
    
    def retry(description, f):
        for i in range(60):
            log("trying to {}...".format(description))
            if f():
                log("{} succeeded".format(description))
                return
            sleep(1.0)
        raise ValueError("failed to {} after many tries".format(description))
    
    
    def run(argv):
        log("Running {}".format(argv))
        log("{}: {}".format(argv, check_output(argv)))
    
    
    if __name__ == '__main__':
        main()