summaryrefslogtreecommitdiff
path: root/tools/initlog.py
diff options
context:
space:
mode:
Diffstat (limited to 'tools/initlog.py')
-rwxr-xr-xtools/initlog.py28
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