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