ctlogconfig revision bcb83ba673a1e4404886c7eae221a629cc27126e
fed63d1b62cc7e56aad77b70ee5b5cc7f5c6aademinfrin#!/usr/bin/env python
fed63d1b62cc7e56aad77b70ee5b5cc7f5c6aademinfrin#
fed63d1b62cc7e56aad77b70ee5b5cc7f5c6aademinfrin# Licensed to the Apache Software Foundation (ASF) under one or more
fed63d1b62cc7e56aad77b70ee5b5cc7f5c6aademinfrin# contributor license agreements. See the NOTICE file distributed with
fed63d1b62cc7e56aad77b70ee5b5cc7f5c6aademinfrin# this work for additional information regarding copyright ownership.
fed63d1b62cc7e56aad77b70ee5b5cc7f5c6aademinfrin# The ASF licenses this file to You under the Apache License, Version 2.0
fed63d1b62cc7e56aad77b70ee5b5cc7f5c6aademinfrin# (the "License"); you may not use this file except in compliance with
fed63d1b62cc7e56aad77b70ee5b5cc7f5c6aademinfrin# the License. You may obtain a copy of the License at
fed63d1b62cc7e56aad77b70ee5b5cc7f5c6aademinfrin#
fed63d1b62cc7e56aad77b70ee5b5cc7f5c6aademinfrin# http://www.apache.org/licenses/LICENSE-2.0
fed63d1b62cc7e56aad77b70ee5b5cc7f5c6aademinfrin#
fed63d1b62cc7e56aad77b70ee5b5cc7f5c6aademinfrin# Unless required by applicable law or agreed to in writing, software
fed63d1b62cc7e56aad77b70ee5b5cc7f5c6aademinfrin# distributed under the License is distributed on an "AS IS" BASIS,
fed63d1b62cc7e56aad77b70ee5b5cc7f5c6aademinfrin# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
fed63d1b62cc7e56aad77b70ee5b5cc7f5c6aademinfrin# See the License for the specific language governing permissions and
fed63d1b62cc7e56aad77b70ee5b5cc7f5c6aademinfrin# limitations under the License.
fed63d1b62cc7e56aad77b70ee5b5cc7f5c6aademinfrin
fed63d1b62cc7e56aad77b70ee5b5cc7f5c6aademinfrinimport os
fed63d1b62cc7e56aad77b70ee5b5cc7f5c6aademinfrinimport re
fed63d1b62cc7e56aad77b70ee5b5cc7f5c6aademinfrinimport sqlite3
fed63d1b62cc7e56aad77b70ee5b5cc7f5c6aademinfrinimport sys
fed63d1b62cc7e56aad77b70ee5b5cc7f5c6aademinfrin
fed63d1b62cc7e56aad77b70ee5b5cc7f5c6aademinfrin
0e9dae659943679108357054e9aa7657cdc52dc4minfrindef create_tables(db_name):
a7757dd38bb2a1afc93e241b7ea67b3de85ecc8bminfrin cxn = sqlite3.connect(db_name)
a7757dd38bb2a1afc93e241b7ea67b3de85ecc8bminfrin cur = cxn.cursor()
a7757dd38bb2a1afc93e241b7ea67b3de85ecc8bminfrin
fed63d1b62cc7e56aad77b70ee5b5cc7f5c6aademinfrin cur.execute(
0e9dae659943679108357054e9aa7657cdc52dc4minfrin 'CREATE TABLE loginfo('
0e9dae659943679108357054e9aa7657cdc52dc4minfrin + 'id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, '
fed63d1b62cc7e56aad77b70ee5b5cc7f5c6aademinfrin + 'log_id TEXT, '
fed63d1b62cc7e56aad77b70ee5b5cc7f5c6aademinfrin + 'public_key TEXT, ' # path to PEM-encoded file
fed63d1b62cc7e56aad77b70ee5b5cc7f5c6aademinfrin + 'distrusted INTEGER, ' # non-zero if not trusted
fed63d1b62cc7e56aad77b70ee5b5cc7f5c6aademinfrin + 'min_valid_timestamp INTEGER, '
fed63d1b62cc7e56aad77b70ee5b5cc7f5c6aademinfrin + 'max_valid_timestamp INTEGER, '
fed63d1b62cc7e56aad77b70ee5b5cc7f5c6aademinfrin + 'url TEXT)'
fed63d1b62cc7e56aad77b70ee5b5cc7f5c6aademinfrin )
fed63d1b62cc7e56aad77b70ee5b5cc7f5c6aademinfrin cur.close()
a7757dd38bb2a1afc93e241b7ea67b3de85ecc8bminfrin cxn.commit()
fed63d1b62cc7e56aad77b70ee5b5cc7f5c6aademinfrin cxn.close()
a7757dd38bb2a1afc93e241b7ea67b3de85ecc8bminfrin
fed63d1b62cc7e56aad77b70ee5b5cc7f5c6aademinfrin
a7757dd38bb2a1afc93e241b7ea67b3de85ecc8bminfrindef record_id_arg(cur, args, required=False):
a7757dd38bb2a1afc93e241b7ea67b3de85ecc8bminfrin if len(args) < 1 or args[0][0] != '#' or len(args[0]) < 2:
a7757dd38bb2a1afc93e241b7ea67b3de85ecc8bminfrin if required:
a7757dd38bb2a1afc93e241b7ea67b3de85ecc8bminfrin print >> sys.stderr, 'A record id was not provided'
a7757dd38bb2a1afc93e241b7ea67b3de85ecc8bminfrin sys.exit(1)
a7757dd38bb2a1afc93e241b7ea67b3de85ecc8bminfrin return None
a7757dd38bb2a1afc93e241b7ea67b3de85ecc8bminfrin record_id = args.pop(0)[1:]
a7757dd38bb2a1afc93e241b7ea67b3de85ecc8bminfrin stmt = 'SELECT * FROM loginfo WHERE id = ?'
a7757dd38bb2a1afc93e241b7ea67b3de85ecc8bminfrin cur.execute(stmt, [record_id])
a7757dd38bb2a1afc93e241b7ea67b3de85ecc8bminfrin recs = list(cur.fetchall())
a7757dd38bb2a1afc93e241b7ea67b3de85ecc8bminfrin assert len(recs) < 2
a7757dd38bb2a1afc93e241b7ea67b3de85ecc8bminfrin if len(recs) == 0:
fed63d1b62cc7e56aad77b70ee5b5cc7f5c6aademinfrin print >> sys.stderr, 'Record #%s was not found' % record_id
bf1b7f1e251c6f12ac13a46479942f42612def4eminfrin sys.exit(1)
bf1b7f1e251c6f12ac13a46479942f42612def4eminfrin return record_id
bf1b7f1e251c6f12ac13a46479942f42612def4eminfrin
a7757dd38bb2a1afc93e241b7ea67b3de85ecc8bminfrin
bf1b7f1e251c6f12ac13a46479942f42612def4eminfrindef log_id_arg(cur, args, required=True):
fed63d1b62cc7e56aad77b70ee5b5cc7f5c6aademinfrin if len(args) < 1 or len(args[0]) != 64:
fed63d1b62cc7e56aad77b70ee5b5cc7f5c6aademinfrin if not required:
fed63d1b62cc7e56aad77b70ee5b5cc7f5c6aademinfrin return None
fed63d1b62cc7e56aad77b70ee5b5cc7f5c6aademinfrin print >> sys.stderr, 'A log id was not provided'
fed63d1b62cc7e56aad77b70ee5b5cc7f5c6aademinfrin sys.exit(1)
0e9dae659943679108357054e9aa7657cdc52dc4minfrin log_id = args.pop(0).upper()
fed63d1b62cc7e56aad77b70ee5b5cc7f5c6aademinfrin if len(re.compile(r'[A-Z0-9]').findall(log_id)) != len(log_id):
fed63d1b62cc7e56aad77b70ee5b5cc7f5c6aademinfrin print >> sys.stderr, 'The log id is not formatted properly'
fed63d1b62cc7e56aad77b70ee5b5cc7f5c6aademinfrin sys.exit(1)
0e9dae659943679108357054e9aa7657cdc52dc4minfrin return log_id
a7757dd38bb2a1afc93e241b7ea67b3de85ecc8bminfrin
a7757dd38bb2a1afc93e241b7ea67b3de85ecc8bminfrin
0e9dae659943679108357054e9aa7657cdc52dc4minfrindef public_key_arg(args):
a7757dd38bb2a1afc93e241b7ea67b3de85ecc8bminfrin if len(args) < 1:
a7757dd38bb2a1afc93e241b7ea67b3de85ecc8bminfrin print >> sys.stderr, 'A public key file was not provided'
a7757dd38bb2a1afc93e241b7ea67b3de85ecc8bminfrin sys.exit(1)
a7757dd38bb2a1afc93e241b7ea67b3de85ecc8bminfrin pubkey = args.pop(0)
fed63d1b62cc7e56aad77b70ee5b5cc7f5c6aademinfrin if not os.path.exists(pubkey):
a7757dd38bb2a1afc93e241b7ea67b3de85ecc8bminfrin print >> sys.stderr, 'Public key file %s could not be read' % pubkey
a7757dd38bb2a1afc93e241b7ea67b3de85ecc8bminfrin sys.exit(1)
fed63d1b62cc7e56aad77b70ee5b5cc7f5c6aademinfrin return pubkey
fed63d1b62cc7e56aad77b70ee5b5cc7f5c6aademinfrin
fed63d1b62cc7e56aad77b70ee5b5cc7f5c6aademinfrin
fed63d1b62cc7e56aad77b70ee5b5cc7f5c6aademinfrindef time_arg(args):
0e9dae659943679108357054e9aa7657cdc52dc4minfrin if len(args) < 1:
a7757dd38bb2a1afc93e241b7ea67b3de85ecc8bminfrin print >> sys.stderr, 'A timestamp was not provided'
fed63d1b62cc7e56aad77b70ee5b5cc7f5c6aademinfrin sys.exit(1)
a7757dd38bb2a1afc93e241b7ea67b3de85ecc8bminfrin t = args.pop(0)
a7757dd38bb2a1afc93e241b7ea67b3de85ecc8bminfrin if t == '-':
fed63d1b62cc7e56aad77b70ee5b5cc7f5c6aademinfrin return None
a7757dd38bb2a1afc93e241b7ea67b3de85ecc8bminfrin bad_val = False
a7757dd38bb2a1afc93e241b7ea67b3de85ecc8bminfrin val = None
0e9dae659943679108357054e9aa7657cdc52dc4minfrin try:
a7757dd38bb2a1afc93e241b7ea67b3de85ecc8bminfrin val = int(t)
a7757dd38bb2a1afc93e241b7ea67b3de85ecc8bminfrin except ValueError:
a7757dd38bb2a1afc93e241b7ea67b3de85ecc8bminfrin bad_val = True
a7757dd38bb2a1afc93e241b7ea67b3de85ecc8bminfrin
a7757dd38bb2a1afc93e241b7ea67b3de85ecc8bminfrin if bad_val or val < 1:
a7757dd38bb2a1afc93e241b7ea67b3de85ecc8bminfrin print >> sys.stderr, 'The timestamp "%s" is invalid' % t
fed63d1b62cc7e56aad77b70ee5b5cc7f5c6aademinfrin sys.exit(1)
a7757dd38bb2a1afc93e241b7ea67b3de85ecc8bminfrin
fed63d1b62cc7e56aad77b70ee5b5cc7f5c6aademinfrin return val
a7757dd38bb2a1afc93e241b7ea67b3de85ecc8bminfrin
fed63d1b62cc7e56aad77b70ee5b5cc7f5c6aademinfrin
a7757dd38bb2a1afc93e241b7ea67b3de85ecc8bminfrindef configure_public_key(cur, args):
fed63d1b62cc7e56aad77b70ee5b5cc7f5c6aademinfrin record_id = record_id_arg(cur, args, False)
a7757dd38bb2a1afc93e241b7ea67b3de85ecc8bminfrin public_key = public_key_arg(args)
fed63d1b62cc7e56aad77b70ee5b5cc7f5c6aademinfrin if len(args) != 0:
a7757dd38bb2a1afc93e241b7ea67b3de85ecc8bminfrin usage()
fed63d1b62cc7e56aad77b70ee5b5cc7f5c6aademinfrin if not record_id:
fed63d1b62cc7e56aad77b70ee5b5cc7f5c6aademinfrin stmt = 'INSERT INTO loginfo (public_key) VALUES(?)'
fed63d1b62cc7e56aad77b70ee5b5cc7f5c6aademinfrin cur.execute(stmt, [public_key])
a7757dd38bb2a1afc93e241b7ea67b3de85ecc8bminfrin else:
a7757dd38bb2a1afc93e241b7ea67b3de85ecc8bminfrin stmt = 'UPDATE loginfo SET public_key = ? WHERE id = ?'
fed63d1b62cc7e56aad77b70ee5b5cc7f5c6aademinfrin cur.execute(stmt, [public_key, record_id])
fed63d1b62cc7e56aad77b70ee5b5cc7f5c6aademinfrin
fed63d1b62cc7e56aad77b70ee5b5cc7f5c6aademinfrin
fed63d1b62cc7e56aad77b70ee5b5cc7f5c6aademinfrindef configure_url(cur, args):
fed63d1b62cc7e56aad77b70ee5b5cc7f5c6aademinfrin # can't specify more than one of record-id and log-id
fed63d1b62cc7e56aad77b70ee5b5cc7f5c6aademinfrin log_id = None
fed63d1b62cc7e56aad77b70ee5b5cc7f5c6aademinfrin record_id = record_id_arg(cur, args, False)
fed63d1b62cc7e56aad77b70ee5b5cc7f5c6aademinfrin if not record_id:
fed63d1b62cc7e56aad77b70ee5b5cc7f5c6aademinfrin log_id = log_id_arg(cur, args, False)
fed63d1b62cc7e56aad77b70ee5b5cc7f5c6aademinfrin if len(args) != 1:
fed63d1b62cc7e56aad77b70ee5b5cc7f5c6aademinfrin usage()
0e9dae659943679108357054e9aa7657cdc52dc4minfrin url = args.pop(0)
a7757dd38bb2a1afc93e241b7ea67b3de85ecc8bminfrin
a7757dd38bb2a1afc93e241b7ea67b3de85ecc8bminfrin if record_id:
fed63d1b62cc7e56aad77b70ee5b5cc7f5c6aademinfrin stmt = 'UPDATE loginfo SET url = ? WHERE id = ?'
fed63d1b62cc7e56aad77b70ee5b5cc7f5c6aademinfrin args = [url, record_id]
a7757dd38bb2a1afc93e241b7ea67b3de85ecc8bminfrin elif log_id:
a7757dd38bb2a1afc93e241b7ea67b3de85ecc8bminfrin stmt = 'INSERT INTO loginfo (log_id, url) VALUES(?, ?)'
a7757dd38bb2a1afc93e241b7ea67b3de85ecc8bminfrin args = [log_id, url]
a7757dd38bb2a1afc93e241b7ea67b3de85ecc8bminfrin else:
fed63d1b62cc7e56aad77b70ee5b5cc7f5c6aademinfrin stmt = 'INSERT INTO loginfo (url) VALUES(?)'
a7757dd38bb2a1afc93e241b7ea67b3de85ecc8bminfrin args = [url]
fed63d1b62cc7e56aad77b70ee5b5cc7f5c6aademinfrin
fed63d1b62cc7e56aad77b70ee5b5cc7f5c6aademinfrin cur.execute(stmt, args)
a7757dd38bb2a1afc93e241b7ea67b3de85ecc8bminfrin
a7757dd38bb2a1afc93e241b7ea67b3de85ecc8bminfrin
a7757dd38bb2a1afc93e241b7ea67b3de85ecc8bminfrindef forget_log(cur, args):
fed63d1b62cc7e56aad77b70ee5b5cc7f5c6aademinfrin record_id = record_id_arg(cur, args, False)
e9faf4c71a5b4bfb08c43cf90e4adca990cdd67fminfrin log_id = None
e9faf4c71a5b4bfb08c43cf90e4adca990cdd67fminfrin if not record_id:
e9faf4c71a5b4bfb08c43cf90e4adca990cdd67fminfrin log_id = log_id_arg(cur, args, True)
fed63d1b62cc7e56aad77b70ee5b5cc7f5c6aademinfrin if len(args) != 0:
fed63d1b62cc7e56aad77b70ee5b5cc7f5c6aademinfrin usage()
fed63d1b62cc7e56aad77b70ee5b5cc7f5c6aademinfrin if record_id:
fed63d1b62cc7e56aad77b70ee5b5cc7f5c6aademinfrin stmt = 'DELETE FROM loginfo WHERE id = ?'
fed63d1b62cc7e56aad77b70ee5b5cc7f5c6aademinfrin args = [record_id]
a7757dd38bb2a1afc93e241b7ea67b3de85ecc8bminfrin else:
a7757dd38bb2a1afc93e241b7ea67b3de85ecc8bminfrin stmt = 'DELETE FROM loginfo WHERE log_id = ?'
0e9dae659943679108357054e9aa7657cdc52dc4minfrin args = [log_id]
fed63d1b62cc7e56aad77b70ee5b5cc7f5c6aademinfrin cur.execute(stmt, args)
fed63d1b62cc7e56aad77b70ee5b5cc7f5c6aademinfrin
fed63d1b62cc7e56aad77b70ee5b5cc7f5c6aademinfrin
fed63d1b62cc7e56aad77b70ee5b5cc7f5c6aademinfrindef trust_distrust_log(cur, args):
0e9dae659943679108357054e9aa7657cdc52dc4minfrin # could take a record id or a log id
a7757dd38bb2a1afc93e241b7ea67b3de85ecc8bminfrin record_id = record_id_arg(cur, args, False)
fed63d1b62cc7e56aad77b70ee5b5cc7f5c6aademinfrin if record_id:
fed63d1b62cc7e56aad77b70ee5b5cc7f5c6aademinfrin log_id = None
a7757dd38bb2a1afc93e241b7ea67b3de85ecc8bminfrin else:
fed63d1b62cc7e56aad77b70ee5b5cc7f5c6aademinfrin log_id = log_id_arg(cur, args)
fed63d1b62cc7e56aad77b70ee5b5cc7f5c6aademinfrin
fed63d1b62cc7e56aad77b70ee5b5cc7f5c6aademinfrin if len(args) != 1:
fed63d1b62cc7e56aad77b70ee5b5cc7f5c6aademinfrin usage()
0e9dae659943679108357054e9aa7657cdc52dc4minfrin flag = args.pop(0)
a7757dd38bb2a1afc93e241b7ea67b3de85ecc8bminfrin
fed63d1b62cc7e56aad77b70ee5b5cc7f5c6aademinfrin if not record_id:
fed63d1b62cc7e56aad77b70ee5b5cc7f5c6aademinfrin stmt = 'INSERT INTO loginfo (log_id, distrusted) VALUES(?, ?)'
a7757dd38bb2a1afc93e241b7ea67b3de85ecc8bminfrin cur.execute(stmt, [log_id, flag])
fed63d1b62cc7e56aad77b70ee5b5cc7f5c6aademinfrin else:
fed63d1b62cc7e56aad77b70ee5b5cc7f5c6aademinfrin stmt = 'UPDATE loginfo SET distrusted = ? WHERE id = ?'
0e9dae659943679108357054e9aa7657cdc52dc4minfrin cur.execute(stmt, [flag, record_id])
a7757dd38bb2a1afc93e241b7ea67b3de85ecc8bminfrin
fed63d1b62cc7e56aad77b70ee5b5cc7f5c6aademinfrin
fed63d1b62cc7e56aad77b70ee5b5cc7f5c6aademinfrindef trust_log(cur, args):
a7757dd38bb2a1afc93e241b7ea67b3de85ecc8bminfrin trust_distrust_log(cur, args + [0])
fed63d1b62cc7e56aad77b70ee5b5cc7f5c6aademinfrin
fed63d1b62cc7e56aad77b70ee5b5cc7f5c6aademinfrin
fed63d1b62cc7e56aad77b70ee5b5cc7f5c6aademinfrindef distrust_log(cur, args):
fed63d1b62cc7e56aad77b70ee5b5cc7f5c6aademinfrin trust_distrust_log(cur, args + [1])
a7757dd38bb2a1afc93e241b7ea67b3de85ecc8bminfrin
a7757dd38bb2a1afc93e241b7ea67b3de85ecc8bminfrin
a7757dd38bb2a1afc93e241b7ea67b3de85ecc8bminfrindef time_range(cur, args):
a7757dd38bb2a1afc93e241b7ea67b3de85ecc8bminfrin # could take a record id or a log id
a7757dd38bb2a1afc93e241b7ea67b3de85ecc8bminfrin record_id = record_id_arg(cur, args, False)
a7757dd38bb2a1afc93e241b7ea67b3de85ecc8bminfrin if record_id:
fed63d1b62cc7e56aad77b70ee5b5cc7f5c6aademinfrin log_id = None
a7757dd38bb2a1afc93e241b7ea67b3de85ecc8bminfrin else:
a7757dd38bb2a1afc93e241b7ea67b3de85ecc8bminfrin log_id = log_id_arg(cur, args)
fed63d1b62cc7e56aad77b70ee5b5cc7f5c6aademinfrin
fed63d1b62cc7e56aad77b70ee5b5cc7f5c6aademinfrin min_valid_time = time_arg(args)
fed63d1b62cc7e56aad77b70ee5b5cc7f5c6aademinfrin max_valid_time = time_arg(args)
fed63d1b62cc7e56aad77b70ee5b5cc7f5c6aademinfrin if len(args) != 0:
fed63d1b62cc7e56aad77b70ee5b5cc7f5c6aademinfrin usage()
fed63d1b62cc7e56aad77b70ee5b5cc7f5c6aademinfrin if not record_id:
fed63d1b62cc7e56aad77b70ee5b5cc7f5c6aademinfrin stmt = 'INSERT INTO loginfo ' + \
fed63d1b62cc7e56aad77b70ee5b5cc7f5c6aademinfrin '(log_id, min_valid_timestamp, max_valid_timestamp) ' + \
fed63d1b62cc7e56aad77b70ee5b5cc7f5c6aademinfrin 'VALUES(?, ?, ?)'
fed63d1b62cc7e56aad77b70ee5b5cc7f5c6aademinfrin cur.execute(stmt, [log_id, min_valid_time, max_valid_time])
fed63d1b62cc7e56aad77b70ee5b5cc7f5c6aademinfrin else:
0e9dae659943679108357054e9aa7657cdc52dc4minfrin stmt = 'UPDATE loginfo SET min_valid_timestamp = ?, ' + \
a7757dd38bb2a1afc93e241b7ea67b3de85ecc8bminfrin 'max_valid_timestamp = ? WHERE id = ?'
a7757dd38bb2a1afc93e241b7ea67b3de85ecc8bminfrin cur.execute(stmt, [min_valid_time, max_valid_time, record_id])
fed63d1b62cc7e56aad77b70ee5b5cc7f5c6aademinfrin
fed63d1b62cc7e56aad77b70ee5b5cc7f5c6aademinfrin
a7757dd38bb2a1afc93e241b7ea67b3de85ecc8bminfrinclass ConfigEntry:
a7757dd38bb2a1afc93e241b7ea67b3de85ecc8bminfrin
a7757dd38bb2a1afc93e241b7ea67b3de85ecc8bminfrin pass
a7757dd38bb2a1afc93e241b7ea67b3de85ecc8bminfrin
fed63d1b62cc7e56aad77b70ee5b5cc7f5c6aademinfrin
fed63d1b62cc7e56aad77b70ee5b5cc7f5c6aademinfrindef dump_ll(cur):
fed63d1b62cc7e56aad77b70ee5b5cc7f5c6aademinfrin stmt = 'SELECT * FROM loginfo'
fed63d1b62cc7e56aad77b70ee5b5cc7f5c6aademinfrin cur.execute(stmt)
a7757dd38bb2a1afc93e241b7ea67b3de85ecc8bminfrin recs = []
fed63d1b62cc7e56aad77b70ee5b5cc7f5c6aademinfrin for row in cur.fetchall():
a7757dd38bb2a1afc93e241b7ea67b3de85ecc8bminfrin obj = ConfigEntry()
a7757dd38bb2a1afc93e241b7ea67b3de85ecc8bminfrin obj.id = row[0]
a7757dd38bb2a1afc93e241b7ea67b3de85ecc8bminfrin obj.log_id = row[1]
a7757dd38bb2a1afc93e241b7ea67b3de85ecc8bminfrin obj.public_key = row[2]
a7757dd38bb2a1afc93e241b7ea67b3de85ecc8bminfrin obj.distrusted = row[3]
0e9dae659943679108357054e9aa7657cdc52dc4minfrin obj.min_valid_timestamp = row[4]
fed63d1b62cc7e56aad77b70ee5b5cc7f5c6aademinfrin obj.max_valid_timestamp = row[5]
fed63d1b62cc7e56aad77b70ee5b5cc7f5c6aademinfrin obj.url = row[6]
fed63d1b62cc7e56aad77b70ee5b5cc7f5c6aademinfrin recs += [obj]
fed63d1b62cc7e56aad77b70ee5b5cc7f5c6aademinfrin return recs
a7757dd38bb2a1afc93e241b7ea67b3de85ecc8bminfrin
a7757dd38bb2a1afc93e241b7ea67b3de85ecc8bminfrin
a7757dd38bb2a1afc93e241b7ea67b3de85ecc8bminfrindef dump(cur, args):
a7757dd38bb2a1afc93e241b7ea67b3de85ecc8bminfrin if len(args) != 0:
0e9dae659943679108357054e9aa7657cdc52dc4minfrin usage()
a7757dd38bb2a1afc93e241b7ea67b3de85ecc8bminfrin recs = dump_ll(cur)
fed63d1b62cc7e56aad77b70ee5b5cc7f5c6aademinfrin for rec in recs:
fed63d1b62cc7e56aad77b70ee5b5cc7f5c6aademinfrin not_conf = '(not configured)'
a7757dd38bb2a1afc93e241b7ea67b3de85ecc8bminfrin
fed63d1b62cc7e56aad77b70ee5b5cc7f5c6aademinfrin mint = \
fed63d1b62cc7e56aad77b70ee5b5cc7f5c6aademinfrin str(rec.min_valid_timestamp) if rec.min_valid_timestamp else '-INF'
fed63d1b62cc7e56aad77b70ee5b5cc7f5c6aademinfrin maxt = \
a7757dd38bb2a1afc93e241b7ea67b3de85ecc8bminfrin str(rec.max_valid_timestamp) if rec.max_valid_timestamp else '+INF'
a7757dd38bb2a1afc93e241b7ea67b3de85ecc8bminfrin print 'Log entry:'
a7757dd38bb2a1afc93e241b7ea67b3de85ecc8bminfrin print ' Record ' + str(rec.id) + \
fed63d1b62cc7e56aad77b70ee5b5cc7f5c6aademinfrin (' (DISTRUSTED)' if rec.distrusted else '')
fed63d1b62cc7e56aad77b70ee5b5cc7f5c6aademinfrin print ' Log id : ' + (rec.log_id if rec.log_id else not_conf)
0e9dae659943679108357054e9aa7657cdc52dc4minfrin print ' Public key file: ' + \
a7757dd38bb2a1afc93e241b7ea67b3de85ecc8bminfrin (rec.public_key if rec.public_key else not_conf)
fed63d1b62cc7e56aad77b70ee5b5cc7f5c6aademinfrin print ' URL : ' + (rec.url if rec.url else not_conf)
fed63d1b62cc7e56aad77b70ee5b5cc7f5c6aademinfrin print ' Time range : ' + mint + ' to ' + maxt
a7757dd38bb2a1afc93e241b7ea67b3de85ecc8bminfrin print ''
fed63d1b62cc7e56aad77b70ee5b5cc7f5c6aademinfrin
fed63d1b62cc7e56aad77b70ee5b5cc7f5c6aademinfrin
fed63d1b62cc7e56aad77b70ee5b5cc7f5c6aademinfrindef usage():
fed63d1b62cc7e56aad77b70ee5b5cc7f5c6aademinfrin help = """Usage: %s /path/to/log-config-db command args
0e9dae659943679108357054e9aa7657cdc52dc4minfrin
a7757dd38bb2a1afc93e241b7ea67b3de85ecc8bminfrinCommands:
fed63d1b62cc7e56aad77b70ee5b5cc7f5c6aademinfrin display config-db contents:
fed63d1b62cc7e56aad77b70ee5b5cc7f5c6aademinfrin dump
a7757dd38bb2a1afc93e241b7ea67b3de85ecc8bminfrin configure public key:
fed63d1b62cc7e56aad77b70ee5b5cc7f5c6aademinfrin configure-public-key [log-id|record-id] /path/log-pub-key.pem
fed63d1b62cc7e56aad77b70ee5b5cc7f5c6aademinfrin configure URL:
fed63d1b62cc7e56aad77b70ee5b5cc7f5c6aademinfrin configure-url [log-id|record-id] http://www.example.com/path/
fed63d1b62cc7e56aad77b70ee5b5cc7f5c6aademinfrin configure min and/or max valid timestamps:
fed63d1b62cc7e56aad77b70ee5b5cc7f5c6aademinfrin valid-time-range log-id|record-id min-range max-range
fed63d1b62cc7e56aad77b70ee5b5cc7f5c6aademinfrin mark log as trusted (default):
fed63d1b62cc7e56aad77b70ee5b5cc7f5c6aademinfrin trust log-id|record-id
fed63d1b62cc7e56aad77b70ee5b5cc7f5c6aademinfrin mark log as untrusted:
fed63d1b62cc7e56aad77b70ee5b5cc7f5c6aademinfrin distrust log-id|record-id
fed63d1b62cc7e56aad77b70ee5b5cc7f5c6aademinfrin remove log config from config-db:
fed63d1b62cc7e56aad77b70ee5b5cc7f5c6aademinfrin forget log-id|record-id
fed63d1b62cc7e56aad77b70ee5b5cc7f5c6aademinfrin
fed63d1b62cc7e56aad77b70ee5b5cc7f5c6aademinfrinlog-id is a 64-character hex string representation of a log id
fed63d1b62cc7e56aad77b70ee5b5cc7f5c6aademinfrin
fed63d1b62cc7e56aad77b70ee5b5cc7f5c6aademinfrinrecord-id references an existing entry and is in the form:
fed63d1b62cc7e56aad77b70ee5b5cc7f5c6aademinfrin #<record-number>
fed63d1b62cc7e56aad77b70ee5b5cc7f5c6aademinfrin (displayable with the dump command)
fed63d1b62cc7e56aad77b70ee5b5cc7f5c6aademinfrin""" % sys.argv[0]
fed63d1b62cc7e56aad77b70ee5b5cc7f5c6aademinfrin print >> sys.stderr, help
fed63d1b62cc7e56aad77b70ee5b5cc7f5c6aademinfrin sys.exit(1)
0e9dae659943679108357054e9aa7657cdc52dc4minfrin
a7757dd38bb2a1afc93e241b7ea67b3de85ecc8bminfrin
a7757dd38bb2a1afc93e241b7ea67b3de85ecc8bminfrindef main(argv):
fed63d1b62cc7e56aad77b70ee5b5cc7f5c6aademinfrin if len(argv) < 3:
0e9dae659943679108357054e9aa7657cdc52dc4minfrin usage()
0e9dae659943679108357054e9aa7657cdc52dc4minfrin
0e9dae659943679108357054e9aa7657cdc52dc4minfrin db_name = argv[1]
fed63d1b62cc7e56aad77b70ee5b5cc7f5c6aademinfrin cmd = argv[2]
fed63d1b62cc7e56aad77b70ee5b5cc7f5c6aademinfrin args = argv[3:]
a7757dd38bb2a1afc93e241b7ea67b3de85ecc8bminfrin
fed63d1b62cc7e56aad77b70ee5b5cc7f5c6aademinfrin cmds = {'configure-public-key': configure_public_key,
fed63d1b62cc7e56aad77b70ee5b5cc7f5c6aademinfrin 'configure-url': configure_url,
fed63d1b62cc7e56aad77b70ee5b5cc7f5c6aademinfrin 'distrust': distrust_log,
fed63d1b62cc7e56aad77b70ee5b5cc7f5c6aademinfrin 'trust': trust_log,
fed63d1b62cc7e56aad77b70ee5b5cc7f5c6aademinfrin 'forget': forget_log,
fed63d1b62cc7e56aad77b70ee5b5cc7f5c6aademinfrin 'valid-time-range': time_range,
fed63d1b62cc7e56aad77b70ee5b5cc7f5c6aademinfrin 'dump': dump,
fed63d1b62cc7e56aad77b70ee5b5cc7f5c6aademinfrin }
fed63d1b62cc7e56aad77b70ee5b5cc7f5c6aademinfrin
fed63d1b62cc7e56aad77b70ee5b5cc7f5c6aademinfrin cmds_requiring_db = ['dump', 'forget'] # db must already exist
fed63d1b62cc7e56aad77b70ee5b5cc7f5c6aademinfrin
fed63d1b62cc7e56aad77b70ee5b5cc7f5c6aademinfrin if not cmd in cmds:
fed63d1b62cc7e56aad77b70ee5b5cc7f5c6aademinfrin usage()
fed63d1b62cc7e56aad77b70ee5b5cc7f5c6aademinfrin
fed63d1b62cc7e56aad77b70ee5b5cc7f5c6aademinfrin if not os.path.exists(db_name):
fed63d1b62cc7e56aad77b70ee5b5cc7f5c6aademinfrin if not cmd in cmds_requiring_db:
fed63d1b62cc7e56aad77b70ee5b5cc7f5c6aademinfrin create_tables(db_name)
fed63d1b62cc7e56aad77b70ee5b5cc7f5c6aademinfrin else:
fed63d1b62cc7e56aad77b70ee5b5cc7f5c6aademinfrin print >> sys.stderr, 'Database "%s" does not exist' % db_name
fed63d1b62cc7e56aad77b70ee5b5cc7f5c6aademinfrin sys.exit(1)
0e9dae659943679108357054e9aa7657cdc52dc4minfrin
a7757dd38bb2a1afc93e241b7ea67b3de85ecc8bminfrin cxn = sqlite3.connect(db_name)
a7757dd38bb2a1afc93e241b7ea67b3de85ecc8bminfrin cur = cxn.cursor()
fed63d1b62cc7e56aad77b70ee5b5cc7f5c6aademinfrin
0e9dae659943679108357054e9aa7657cdc52dc4minfrin cmds[cmd](cur, args)
0e9dae659943679108357054e9aa7657cdc52dc4minfrin
0e9dae659943679108357054e9aa7657cdc52dc4minfrin cur.close()
fed63d1b62cc7e56aad77b70ee5b5cc7f5c6aademinfrin cxn.commit()
fed63d1b62cc7e56aad77b70ee5b5cc7f5c6aademinfrin cxn.close()
a7757dd38bb2a1afc93e241b7ea67b3de85ecc8bminfrin
fed63d1b62cc7e56aad77b70ee5b5cc7f5c6aademinfrinif __name__ == "__main__":
fed63d1b62cc7e56aad77b70ee5b5cc7f5c6aademinfrin main(sys.argv)
fed63d1b62cc7e56aad77b70ee5b5cc7f5c6aademinfrin