summaryrefslogtreecommitdiffstats
path: root/contrib/secbugstats/bin/buglife.py
blob: 8610652e4a45e4e6e4cc421a8db6613e65982f25 (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
#!/usr/bin/python
# Generate a JSON feed of all the security bug lifespans
# The output is used as the data source for charts/buglife

import sys, MySQLdb, cgi
from string import join, capitalize, split
from time import mktime, strftime
from datetime import datetime
from settings import *

if "--debug" in sys.argv: DEBUG = True
else: DEBUG = False

# set up database connection
db = MySQLdb.connect(host=DB_HOST, user=DB_USER, passwd=DB_PASS, db=DB_NAME)
db.autocommit(True)
cur = db.cursor()

# Bugs sample
# bugid	opendate	closedate	severity	summary	updated
# 286382	2005-03-16 09:41:00	0000-00-00 00:00:00	critical	[Windows] Many insecure uses of LoadLibrary (filename without path)	2010-06-01 20:55:22
# 552002	2010-03-12 18:57:00	0000-00-00 00:00:00	critical	Crash in  [@ nsDOMEvent::QueryInterface(nsID const&, void**) ]	2010-06-01 20:38:05

def cleanCat(cat):
    return cat.capitalize()

# return a UNIX timestamp
# if the date passed in is None then return a timestamp for today rounded
# to the top of the current hour
def formatDate(d):
    if d is None:
        d = datetime(int(strftime("%Y")), int(strftime("%m")), int(strftime("%d")),
                     int(strftime("%H")), 0)
    return mktime(d.timetuple())

# bug severities to include
severities = ["critical", "high", "moderate", "low"]

# display JSON
print "{"

for sev in severities:
    print "  '%s': [" % (cleanCat(sev))
    sql = "SELECT * from secbugs_Bugs WHERE severity='%s' order by opendate;" % (sev)
    cur.execute(sql)
    row = cur.fetchone()
    while row is not None:
        # row e.g. (572428L, datetime.datetime(2010, 6, 16, 16, 6), None, 'critical', 'Crash [@ js_CallGCMarker]', datetime.datetime(2010, 6, 22, 9, 28, 59))
        print "    { 'bugid': %s, 'opendate': %s, 'closedate': %s, 'summary': '%s' }," % \
            (str(row[0]), formatDate(row[1]), formatDate(row[2]), cgi.escape(db.escape_string(row[4])))
        row = cur.fetchone()
    print "  ],"

print "}"