/usr/bin/dupdb-admin is in apport-retrace 2.0.1-0ubuntu5.
This file is owned by root:root, with mode 0o755.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 | #!/usr/bin/python
# CLI for maintaining the duplicate database
#
# Copyright (c) 2007 - 2009 Canonical Ltd.
# Author: Martin Pitt <martin.pitt@ubuntu.com>
#
# This program is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License as published by the
# Free Software Foundation; either version 2 of the License, or (at your
# option) any later version. See http://www.gnu.org/copyleft/gpl.html for
# the full text of the license.
import optparse, sys, os.path
from apport.crashdb import get_crashdb
import apport.crashdb_impl.memory
import apport
def command_dump(crashdb, opts, args):
'''Print out all entries.'''
for (sig, (id, version, lastchange)) in crashdb._duplicate_db_dump(True).iteritems():
print '%7i: %s ' % (id, sig.encode('UTF-8', 'replace')),
if version == '':
print '[fixed]'
elif version:
print '[fixed in: %s]' % version,
else:
print '[open]',
print 'last change:', lastchange
def command_changeid(crashdb, opts, args):
'''Change the master ID of a crash.'''
if len(args) != 2:
apport.fatal('changeid needs exactly two arguments (use --help for a short help)')
(oldid, newid) = args
crashdb.duplicate_db_change_master_id(oldid, newid)
def command_removeid(crashdb, opts, args):
'''Remove a crash.'''
if len(args) != 1:
apport.fatal('removeid needs exactly one argument (use --help for a short help)')
crashdb.duplicate_db_remove(args[0])
def command_publish(crashdb, opts, args):
'''Publish crash database to a directory.'''
if len(args) != 1:
apport.fatal('publish needs exactly one argument (use --help for a short help)')
crashdb.duplicate_db_publish(args[0])
#
# main
#
# parse command line options
optparser = optparse.OptionParser('''%prog [options] dump
%prog [options] changeid <old ID> <new ID>
%prog [options] removeid <ID>
%prog [options] publish <path>''')
optparser.add_option('-f', '--database-file',
help='Location of the database file', action='store', metavar='PATH',
type='string', dest='db_file', default='apport_duplicates.db')
options, args = optparser.parse_args()
if not os.path.exists(options.db_file):
apport.fatal('file does not exist: %s', options.db_file)
if args[0] in ():
# these commands require a real DB
crashdb = get_crashdb(None, None, {})
else:
# pure DB operations don't need a real backend, and thus no crashdb.conf
crashdb = apport.crashdb_impl.memory.CrashDatabase(None, {})
crashdb.init_duplicate_db(options.db_file)
try:
command = globals()['command_' + args.pop(0)]
except KeyError:
apport.fatal('unknown command (use --help for a short help)')
command(crashdb, options, args)
|