summaryrefslogtreecommitdiffstats
path: root/scripts/abrt-bz-downloader
blob: d7f5a719055acf44ef3b7914b7900817d86e0717 (plain)
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
#!/usr/bin/python
# -*- mode:python -*-
# ABRT Bugzilla Backtrace Downloader
# Downloads all backtraces reported by ABRT from Bugzilla.
#
# Please do not run this script unless it's neccessary to do so.
# It forces Bugzilla to send data related to thousands of bug reports.

from bugzilla import RHBugzilla
from optparse import OptionParser
import sys
import os.path

parser = OptionParser(version="%prog 1.0")
parser.add_option("-u", "--user", dest="user",
                  help="Bugzilla user name (REQUIRED)", metavar="USERNAME")
parser.add_option("-p", "--password", dest="password",
                  help="Bugzilla password (REQUIRED)", metavar="PASSWORD")
parser.add_option("-b", "--bugzilla", dest="bugzilla",
                  help="Bugzilla URL (defaults to Red Hat Bugzilla)", metavar="URL")
parser.add_option("-f", "--fields",
                  action="store_true", dest="fields", default=False,
                  help="Print possible bug fields and exit.")

(options, args) = parser.parse_args()

if not options.user or len(options.user) == 0:
  parser.error("User name is required.\nTry {0} --help".format(sys.argv[0]))

if not options.password or len(options.password) == 0:
  parser.error("Password is required.\nTry {0} --help".format(sys.argv[0]))

if not options.bugzilla or len(options.bugzilla) == 0:
  options.bugzilla = "https://bugzilla.redhat.com/xmlrpc.cgi"

bz = RHBugzilla()
bz.connect(options.bugzilla)
bz.login(options.user, options.password)

if options.fields:
  print bz.bugfields
  exit(0)

buginfos = bz.query({'status_whiteboard_type':'allwordssubstr','status_whiteboard':'abrt_hash'})

print "{0} bugs found.".format(len(buginfos))

for buginfo in buginfos:
  # Skip bugs with already downloaded backtraces.
  filename = "{0}.bt".format(buginfo.bug_id)
  if os.path.isfile(filename):
    print "Skipping {0} (already exists).".format(filename)
    continue

  # Skip bugs with broken or Python backtraces
  broken_backtrace_bugs = [ 517116, # binary file :)
                            518516, # not a backtrace, GDB fail
                            524259, # multiple backtraces in single file
                            524427, # multiple backtraces in single file
                            528529, # just [New Thread xx] lines
                            #528915, 10000 frames, out of memory, to be fixed
                            #529422, 10000 frames, out of memory, to be fixed
                            #530239, 10000 frames, out of memory, to be fixed
                            532264, # no header
                            533475, # no backtrace
                            #537819, 50000 frames, out of memory, to be fixed
                            #539699, to be fixed, parser bug
                            539992] # completely broken backtrace
  if buginfo.bug_id in broken_backtrace_bugs:
    continue

  # Get backtrace from bug and store it as a file.
  bug = bz.getbug(buginfo.bug_id)
  for attachment in bug.attachments:
    if attachment['filename'] == 'backtrace':
      data = bz.openattachment(attachment['id'])
      f = open(filename, 'w')
      f.write(data.read())
      f.close()
      print "Attachment {0} downloaded.".format(filename)

bz.logout()