[tor-commits] [chutney/master] Add a chutney "wait_until_bootstrap" command
teor at torproject.org
teor at torproject.org
Wed Mar 13 03:16:56 UTC 2019
commit d4e4ee53e40ba10bdc459b3df660404c1b677d9a
Author: Nick Mathewson <nickm at torproject.org>
Date: Wed Feb 27 16:50:52 2019 -0500
Add a chutney "wait_until_bootstrap" command
It waits for up to 20 seconds, checking whether the logged
bootstrapped status for every node is 100%. If it is, great: it
succeeds. If not, it dumps the bootstrap statuses and exits.
---
lib/chutney/TorNet.py | 56 +++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 56 insertions(+)
diff --git a/lib/chutney/TorNet.py b/lib/chutney/TorNet.py
index cc86960..c94a4a3 100644
--- a/lib/chutney/TorNet.py
+++ b/lib/chutney/TorNet.py
@@ -787,6 +787,38 @@ class LocalNodeController(NodeController):
self._env['poll_launch_time_default']
return False
+ def getLogfile(self, info=False):
+ """Return the expected path to the logfile for this instance."""
+ datadir = self._env['dir']
+ if info:
+ logname = "info.log"
+ else:
+ logname = "notice.log"
+ return os.path.join(datadir, logname)
+
+ def getLastBootstrapStatus(self):
+ """Look through the logs and return the last bootstrapp message
+ received as a 3-tuple of percentage complete, keyword
+ (optional), and message.
+ """
+ logfname = self.getLogfile()
+ if not os.path.exists(logfname):
+ return (-200, "no_logfile", "There is no logfile yet.")
+ percent,keyword,message=-100,"no_message","No bootstrap messages yet."
+ with open(logfname, 'r') as f:
+ for line in f:
+ m = re.search(r'Bootstrapped (\d+)% (\([^\)]*\))?: (.*)', line)
+ if m:
+ percent, keyword, message = m.groups()
+ percent = int(percent)
+ return (percent, keyword, message)
+
+ def isBootstrapped(self):
+ """Return true iff the logfile says that this instance is
+ bootstrapped."""
+ pct, _, _ = self.getLastBootstrapStatus()
+ return pct == 100
+
# XXX: document these options
DEFAULTS = {
'authority': False,
@@ -1117,6 +1149,30 @@ class Network(object):
print("Sending SIGHUP to nodes")
return all([n.getController().hup() for n in self._nodes])
+ def wait_for_bootstrap(self):
+ print("Waiting for nodes to bootstrap...")
+ limit = 20 #bootstrap time
+ delay = 0.5
+ controllers = [n.getController() for n in self._nodes]
+ elapsed = 0.0
+ while elapsed < limit:
+ all_bootstrapped = True
+ for c in controllers:
+ if not c.isBootstrapped():
+ all_bootstrapped = False
+ break
+ if all_bootstrapped:
+ print("Everything bootstrapped after %s sec"%elapsed)
+ return True
+ time.sleep(delay)
+ elapsed += delay
+
+ print("Bootstrap failed. Node status:")
+ for c in controllers:
+ print(c.getLastBootstrapStatus())
+
+ return False
+
def stop(self):
controllers = [n.getController() for n in self._nodes]
for sig, desc in [(signal.SIGINT, "SIGINT"),
More information about the tor-commits
mailing list