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