diff options
-rwxr-xr-x | tools/initlog.py | 28 |
1 files changed, 25 insertions, 3 deletions
diff --git a/tools/initlog.py b/tools/initlog.py index 270ebc5..3e7ed58 100755 --- a/tools/initlog.py +++ b/tools/initlog.py @@ -16,7 +16,7 @@ from time import time from base64 import b64encode from certtools import build_merkle_tree, generate_tree_head_signature, \ write_file -from mergetools import get_sth +from mergetools import get_sth, perm, get_logorder def parse_args(): parser = argparse.ArgumentParser(description="") @@ -33,6 +33,11 @@ def parse_args(): def main(): """ + Initialise a log by creating + - sth file + - must not exist before + - consulting 'logorder' if it exists + - perm database if it doesn't exist """ args, config, localconfig = parse_args() signingnodes = config["signingnodes"] @@ -41,8 +46,10 @@ def main(): "%s/%s-private.pem" % (paths["privatekeys"], localconfig["nodename"])) mergedb = paths["mergedb"] + logorderfile = mergedb + "/logorder" sthfile = mergedb + "/sth" + # Don't do anything if there's already an sth file. sth = get_sth(sthfile) if sth['tree_size'] >= 0: print >>sys.stderr, \ @@ -50,6 +57,7 @@ def main(): print >>sys.stderr, "I refuse to destroy this log." return 1 + # Ensure that we can find our keyfile. try: os.stat(own_key[1]) except OSError, e: @@ -58,20 +66,34 @@ def main(): return 1 raise + # Create a chains database. + chainsdb = perm(localconfig.get("dbbackend", "filedb"), mergedb + "/chains") + + # Create sth file. tree_size = 0 - timestamp = int(time() * 1000) root_hash = build_merkle_tree('')[-1][0] + try: + logorder = get_logorder(logorderfile) + tree_size = len(logorder) + root_hash = build_merkle_tree(logorder[:tree_size])[-1][0] + except IOError, e: + if e.errno == errno.ENOENT: + pass + timestamp = int(time() * 1000) tree_head_signature = \ generate_tree_head_signature(signingnodes, own_key, tree_size, timestamp, root_hash) if tree_head_signature == None: return 1 - sth = {"tree_size": 0, + sth = {"tree_size": tree_size, "timestamp": timestamp, "sha256_root_hash": b64encode(root_hash), "tree_head_signature": b64encode(tree_head_signature)} + print "Creating sth file with tree size", tree_size, \ + "and timestamp", timestamp + write_file(sthfile, sth) return 0 |