diff options
-rwxr-xr-x | monitor/josef_monitor.py | 59 | ||||
-rwxr-xr-x | monitor/josef_mover.py | 20 | ||||
-rw-r--r-- | monitor/monitor_conf.py | 2 |
3 files changed, 44 insertions, 37 deletions
diff --git a/monitor/josef_monitor.py b/monitor/josef_monitor.py index c52f29c..af5067b 100755 --- a/monitor/josef_monitor.py +++ b/monitor/josef_monitor.py @@ -17,21 +17,29 @@ from josef_reader import monitored_domain from josef_leveldb import db_add_certs, db_open import os.path + +parser = argparse.ArgumentParser(description="") +parser.add_argument('--config', default="monitor_conf.py") +args = parser.parse_args() + # Import from config file -if os.path.isfile("monitor_conf.py"): - from monitor_conf import ctlogs, OUTPUT_DIR, INTERVAL, DEFAULT_CERT_FILE, DB_PATH, MONITORED_DOMAINS, DOMAINS_FILE +if os.path.isfile(args.config): + moduleNames = [args.config[:-2]] + modules = map(__import__, moduleNames) + # print modules + CONFIG = modules[0] + # from monitor_conf import ctlogs, OUTPUT_DIR, INTERVAL, DEFAULT_CERT_FILE, DB_PATH, MONITORED_DOMAINS, DOMAINS_FILE else: print "Config file not found!" sys.exit() -if not os.path.exists(OUTPUT_DIR): - os.makedirs(OUTPUT_DIR) +if not os.path.exists(CONFIG.OUTPUT_DIR): + os.makedirs(CONFIG.OUTPUT_DIR) -if not os.path.exists(DB_PATH): - os.makedirs(DB_PATH) +if not os.path.exists(CONFIG.DB_PATH): + os.makedirs(CONFIG.DB_PATH) -parser = argparse.ArgumentParser(description="") class ctlog: def __init__(self, name, url, key, log_id=None): @@ -39,8 +47,8 @@ class ctlog: self.url = url self.key = key self.log_id = log_id - self.logfile = OUTPUT_DIR + name + ".log" - self.savefile = OUTPUT_DIR + name + "-state-info.json" + self.logfile = CONFIG.OUTPUT_DIR + name + ".log" + self.savefile = CONFIG.OUTPUT_DIR + name + "-state-info.json" self.subtree = [[]] self.sth = None self.entries = 0 @@ -71,7 +79,6 @@ class ctlog: else: self.log("ERROR Failed to build tree from entries.") - def fetch_and_increment_subtree(self, first, last, url, subtree =[[]]): new_leafs = [] if first <= last: @@ -84,14 +91,13 @@ class ctlog: tmp_data["leaf_hash"] = base64.b64encode(entry_hash) tmp_cert_data.append(tmp_data) new_leafs.append(entry_hash) - if DB_PATH: - db_add_certs(DB_PATH, tmp_cert_data) - if DEFAULT_CERT_FILE: - append_file(DEFAULT_CERT_FILE, tmp_cert_data) + if CONFIG.DB_PATH: + db_add_certs(CONFIG.DB_PATH, tmp_cert_data) + if CONFIG.DEFAULT_CERT_FILE: + append_file(CONFIG.DEFAULT_CERT_FILE, tmp_cert_data) subtree = reduce_tree(new_leafs, subtree) return subtree, len(new_leafs) + first - def to_dict(self): d = {} d["entries"] = self.entries @@ -141,7 +147,6 @@ class ctlog: self.log("STH updated. Size: " + str(new_sth["tree_size"]) + ", Time: " + sth_time) self.sth = new_sth - def update_roots(self): try: roots = get_all_roots(self.url) @@ -153,7 +158,7 @@ class ctlog: if new_root_hash != self.root_hash: self.root_hash = new_root_hash - cert_dir = OUTPUT_DIR + self.name + "-roots" + cert_dir = CONFIG.OUTPUT_DIR + self.name + "-roots" if not os.path.exists(cert_dir): os.makedirs(cert_dir) @@ -367,14 +372,12 @@ def get_proof_by_index(baseurl, index, tree_size): def get_all_roots(base_url): result = urlopen(base_url + "ct/v1/get-roots").read() certs = json.loads(result)["certificates"] - # print time.strftime('%H:%M:%S') + " Received " + str(len(certs)) + " root certs from " + base_url return certs - def setup_domain_monitoring(): monitored_domains = [] try: - with open(DOMAINS_FILE) as fp: + with open(CONFIG.DOMAINS_FILE) as fp: for line in fp: tmp = json.loads(line) for domain in tmp: @@ -384,7 +387,7 @@ def setup_domain_monitoring(): except IOError: pass - for md in MONITORED_DOMAINS: + for md in CONFIG.MONITORED_DOMAINS: tmp = monitored_domain(md) if not tmp in monitored_domains: print "New domain (not in file) " + md @@ -392,14 +395,18 @@ def setup_domain_monitoring(): monitored_domains.append(tmp) return monitored_domains + +def load_config(path): + pass + def main(args): - global DB + monitored_domains = setup_domain_monitoring() # Create logs logs = [] try: - for item in ctlogs: + for item in CONFIG.CTLOGS: logs.append(ctlog(item["name"], item["url"], item["key"], item["id"])) print time.strftime('%H:%M:%S') + " Setting up monitor for " + str(len(logs)) + " logs..." @@ -439,7 +446,7 @@ def main(args): domain_dict = [] for md in monitored_domains: domain_dict.append(md.to_dict()) - open(DOMAINS_FILE, 'w').write(json.dumps(domain_dict)) + open(CONFIG.DOMAINS_FILE, 'w').write(json.dumps(domain_dict)) # Something went horribly wrong! except Exception, err: @@ -451,12 +458,12 @@ def main(args): domain_dict = [] for md in monitored_domains: domain_dict.append(md.to_dict()) - open(DOMAINS_FILE, 'w').write(json.dumps(domain_dict)) + open(CONFIG.DOMAINS_FILE, 'w').write(json.dumps(domain_dict)) if __name__ == '__main__': - main(parser.parse_args()) + main(args) diff --git a/monitor/josef_mover.py b/monitor/josef_mover.py index 52b9dd6..1600217 100755 --- a/monitor/josef_mover.py +++ b/monitor/josef_mover.py @@ -11,7 +11,7 @@ from precerttools import cleanprecert from monitor_conf import * from josef_lib import * -def print_reply(rep, entry, precert): +def print_reply(rep, entry): t = datetime.datetime.fromtimestamp(rep['timestamp'] / 1000, UTC()).strftime("%Y-%m-%d %H:%M:%S") log_id = rep["id"] @@ -26,7 +26,7 @@ def print_reply(rep, entry, precert): # print "Log:", l["name"] print "Time:", t - if precert: + if entry[2]: print "Type: Precert" signed_entry = pack_precert(cleanprecert(entry[0][0]), entry[2]) else: @@ -36,7 +36,7 @@ def print_reply(rep, entry, precert): key = base64.b64decode(log["key"]) try: - check_sct_signature(log["url"], signed_entry, rep, precert, key) + check_sct_signature(log["url"], signed_entry, rep, entry[2], key) print "Signature: OK" except: print "Could not verify signature!" @@ -44,13 +44,13 @@ def print_reply(rep, entry, precert): print "" -# source = [ctlogs[0]] -source = ctlogs -# dests = [ctlogs[0]] -dests = ctlogs +source = [ctlogs[0]] +dests = [ctlogs[0]] +# source = ctlogs +# dests = ctlogs first = 0 -last = 0 +last = 1 # print entries for s_log in source: @@ -70,11 +70,11 @@ for s_log in source: for e in entry[0]: submission.append(base64.b64encode(e)) - if precert: + if entry[2]: res = add_prechain(d_log["url"], {"chain" : submission}) else: res = add_chain(d_log["url"], {"chain" : submission}) - print_reply(res, entry, precert) + print_reply(res, entry) # time.sleep(5) except KeyboardInterrupt: sys.exit() diff --git a/monitor/monitor_conf.py b/monitor/monitor_conf.py index db9189c..68a5732 100644 --- a/monitor/monitor_conf.py +++ b/monitor/monitor_conf.py @@ -29,7 +29,7 @@ MONITORED_DOMAINS = [ ] # CT logs and associated keys -ctlogs = [ +CTLOGS = [ # {"name" : "pilot", # "url" : "https://ct.googleapis.com/pilot/", # "key" : "MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEfahLEimAoz2t01p3uMziiLOl/fHTDM0YDOhBRuiBARsV4UvxG2LdNgoIGLrtCzWE0J5APC2em4JlvR8EEEFMoA==", |