/usr/lib/python2.7/dist-packages/apport/crashdb_impl/debian.py is in python-apport 2.14.1-0ubuntu3.
This file is owned by root:root, with mode 0o644.
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 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 | '''Debian crash database interface.'''
# Debian adaptation Copyright (C) 2012 Ritesh Raj Sarraf <rrs@debian.org>
#
# 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 smtplib, tempfile
from email.mime.text import MIMEText
import apport
import apport.crashdb
class CrashDatabase(apport.crashdb.CrashDatabase):
'''
Debian crash database
This is a Apport CrashDB implementation for interacting with Debian BTS
'''
def __init__(self, auth_file, options):
'''
Initialize crash database connection.
Debian implementation is pretty basic as most of its bug management
processes revolve around the email interface
'''
apport.crashdb.CrashDatabase.__init__(self, auth_file, options)
self.options = options
if not self.options.get('smtphost'):
self.options['smtphost'] = 'reportbug.debian.org'
if not self.options.get('recipient'):
self.options['recipient'] = 'submit@bugs.debian.org'
def accepts(self, report):
'''
Check if this report can be uploaded to this database.
Checks for the proper settings of apport.
'''
if not self.options.get('sender') and 'UnreportableReason' not in report:
report['UnreportableReason'] = 'Please configure sender settings in /etc/apport/crashdb.conf'
# At this time, we are not ready to take CrashDumps
if 'Stacktrace' in report and not report.has_useful_stacktrace():
report['UnreportableReason'] = 'Incomplete backtrace. Please install the debug symbol packages'
return apport.crashdb.CrashDatabase.accepts(self, report)
def upload(self, report, progress_callback=None):
'''Upload given problem report return a handle for it.
In Debian, we use BTS, which is heavily email oriented
This method crafts the bug into an email report understood by Debian BTS
'''
# first and foremost, let's check if the apport bug filing settings are set correct
assert self.accepts(report)
# Frame the report in the format the BTS understands
try:
(buggyPackage, buggyVersion) = report['Package'].split(' ')
except (KeyError, ValueError):
return False
temp = tempfile.NamedTemporaryFile()
temp.file.write(('Package: ' + buggyPackage + '\n').encode('UTF-8'))
temp.file.write(('Version: ' + buggyVersion + '\n\n\n').encode('UTF-8'))
temp.file.write(('=============================\n\n').encode('UTF-8'))
# Let's remove the CoreDump first
# Even if we have a valid backtrace, we already are reporting it as text
# We don't want to send very large emails to the BTS.
# OTOH, if the backtrace is invalid, has_useful_backtrace() will already
# deny reporting of the bug report.
try:
del report['CoreDump']
except KeyError:
pass
# Now write the apport bug report
report.write(temp)
temp.file.seek(0)
msg = MIMEText(temp.file.read().decode('UTF-8'))
msg['Subject'] = report['Title']
msg['From'] = self.options['sender']
msg['To'] = self.options['recipient']
# Subscribe the submitted to the bug report
msg.add_header('X-Debbugs-CC', self.options['sender'])
msg.add_header('Usertag', 'apport-%s' % report['ProblemType'].lower())
s = smtplib.SMTP(self.options['smtphost'])
s.sendmail(self.options['sender'], self.options['recipient'], msg.as_string().encode('UTF-8'))
s.quit()
def get_comment_url(self, report, handle):
'''
Return an URL that should be opened after report has been uploaded
and upload() returned handle.
Should return None if no URL should be opened (anonymous filing without
user comments); in that case this function should do whichever
interactive steps it wants to perform.
'''
return None
|