Jiri Moskovcak 8c03ba1
#! /usr/bin/python
Jiri Moskovcak 8c03ba1
#-*- coding: utf-8 -*-
Jiri Moskovcak 8c03ba1
Jiri Moskovcak 8c03ba1
import os
Jiri Moskovcak 8c03ba1
Jiri Moskovcak 8c03ba1
# abrt_v4 TABLE columns:
Jiri Moskovcak 8c03ba1
UUID         = 0
Jiri Moskovcak 8c03ba1
UID          = 1
Jiri Moskovcak 8c03ba1
INFORMALL    = 2
Jiri Moskovcak 8c03ba1
DUMPDIR_PATH = 3
Jiri Moskovcak 8c03ba1
COUNT        = 4
Jiri Moskovcak 8c03ba1
REPORTED     = 5
Jiri Moskovcak 8c03ba1
TIME         = 6
Jiri Moskovcak 8c03ba1
MESSAGE      = 7
Jiri Moskovcak 8c03ba1
Jiri Moskovcak 8c03ba1
# abrt_v4_reportresult columns:
Jiri Moskovcak 8c03ba1
#UUID     = 0
Jiri Moskovcak 8c03ba1
#UID      = 1
Jiri Moskovcak 8c03ba1
REPORTER = 2
Jiri Moskovcak 8c03ba1
RESULT_MESSAGE  = 3
Jiri Moskovcak 8c03ba1
Jiri Moskovcak 8c03ba1
def get_db_path():
Jiri Moskovcak 8c03ba1
    path = "/var/spool/abrt/abrt-db"
Jiri Moskovcak 8c03ba1
    try:
Jiri Moskovcak 8c03ba1
        with open("/etc/abrt/plugins/SQLite3.conf") as f:
Jiri Moskovcak 8c03ba1
            for line in f:
Jiri Moskovcak 8c03ba1
                line = line.split('=', 1)
Jiri Moskovcak 8c03ba1
                if len(line) == 2 and line[0].strip() == "DBPath":
Jiri Moskovcak 8c03ba1
                    path = line[1].strip()
Jiri Moskovcak 8c03ba1
    except Exception, ex:
Jiri Moskovcak 8c03ba1
        pass
Jiri Moskovcak 8c03ba1
    return path
Jiri Moskovcak 8c03ba1
Jiri Moskovcak 8c03ba1
def get_url_from_text(text):
Jiri Moskovcak 8c03ba1
    url_marks = ["http://", "https://", "ftp://", "ftps://", "file://"]
Jiri Moskovcak 8c03ba1
    lines = text.split('\n')
Jiri Moskovcak 8c03ba1
    url = ""
Jiri Moskovcak 8c03ba1
    for mark in url_marks:
Jiri Moskovcak 8c03ba1
        for line in lines:
Jiri Moskovcak 8c03ba1
            last_mark = line.find(mark)
Jiri Moskovcak 8c03ba1
            if last_mark != -1:
Jiri Moskovcak 8c03ba1
                url_end = line.find(' ',last_mark)
Jiri Moskovcak 8c03ba1
                if url_end == -1:
Jiri Moskovcak 8c03ba1
                    url_end = len(line)
Jiri Moskovcak 8c03ba1
                url = "URL=" + line[last_mark:url_end]
Jiri Moskovcak 8c03ba1
    return url
Jiri Moskovcak 8c03ba1
Jiri Moskovcak 8c03ba1
def format_reported_to(reported_to):
Jiri Moskovcak 8c03ba1
    reporter = reported_to[REPORTER]
Jiri Moskovcak 8c03ba1
    url = get_url_from_text(reported_to[RESULT_MESSAGE])
Jiri Moskovcak 8c03ba1
    if not url:
Jiri Moskovcak 8c03ba1
        url = reported_to[RESULT_MESSAGE]
Jiri Moskovcak 8c03ba1
    return reporter + ": " + url
Jiri Moskovcak 8c03ba1
Jiri Moskovcak 8c03ba1
if __name__ == "__main__":
Jiri Moskovcak 8c03ba1
    try:
Jiri Moskovcak 8c03ba1
        from sqlite3 import dbapi2 as sqlite
Jiri Moskovcak 8c03ba1
        db = sqlite.connect(get_db_path())
Jiri Moskovcak 8c03ba1
        crashes = db.execute("SELECT * FROM abrt_v4")
Jiri Moskovcak 8c03ba1
        # abrt_v4 TABLE columns:
Jiri Moskovcak 8c03ba1
        # UUID | UID | INFORMALL | DUMPDIR_PATH | COUNT | REPORTED | TIME | MESSAGE
Jiri Moskovcak 8c03ba1
        for crash in crashes:
Jiri Moskovcak 8c03ba1
            # abrt_v4_reportresult columns:
Jiri Moskovcak 8c03ba1
            # UUID | UID | REPORTER | MESSAGE
Jiri Moskovcak 8c03ba1
            report_results = db.execute("SELECT * FROM abrt_v4_reportresult WHERE UUID='%s'" % crash[UUID])
Jiri Moskovcak 8c03ba1
Jiri Moskovcak 8c03ba1
            # save count from db to file
Jiri Moskovcak 8c03ba1
            count_file = "%s/count" % crash[DUMPDIR_PATH]
Jiri Moskovcak 8c03ba1
            # don't overwrite
Jiri Moskovcak 8c03ba1
            if not os.path.exists(count_file):
Jiri Moskovcak 8c03ba1
                try:
Jiri Moskovcak 8c03ba1
                    fout = open(count_file, "w")
Jiri Moskovcak 8c03ba1
                    fout.write(str(crash[COUNT]))
Jiri Moskovcak 8c03ba1
                    fout.close()
Jiri Moskovcak 8c03ba1
                except Exception, ex:
Jiri Moskovcak 8c03ba1
                    # silently ignore errors -> probably stalled db, but we can't
Jiri Moskovcak 8c03ba1
                    # do much about it, so it's better to not polute the rpm output
Jiri Moskovcak 8c03ba1
                    pass
Jiri Moskovcak 8c03ba1
Jiri Moskovcak 8c03ba1
            # save uuid from db to file
Jiri Moskovcak 8c03ba1
            uuid_file = "%s/uuid" % crash[DUMPDIR_PATH]
Jiri Moskovcak 8c03ba1
            # don't overwrite
Jiri Moskovcak 8c03ba1
            if not os.path.exists(uuid_file):
Jiri Moskovcak 8c03ba1
                try:
Jiri Moskovcak 8c03ba1
                    fout = open(uuid_file, "w")
Jiri Moskovcak 8c03ba1
                    fout.write(str(crash[UUID]))
Jiri Moskovcak 8c03ba1
                    fout.close()
Jiri Moskovcak 8c03ba1
                except Exception, ex:
Jiri Moskovcak 8c03ba1
                    # silently ignore errors -> probably stalled db, but we can't
Jiri Moskovcak 8c03ba1
                    # do much about it, so it's better to not polute the rpm output
Jiri Moskovcak 8c03ba1
                    pass
Jiri Moskovcak 8c03ba1
Jiri Moskovcak 8c03ba1
            results = report_results.fetchall()
Jiri Moskovcak 8c03ba1
            if results:
Jiri Moskovcak 8c03ba1
                # save report results from db to file
Jiri Moskovcak 8c03ba1
                reported_to_file = "%s/reported_to" % crash[DUMPDIR_PATH]
Jiri Moskovcak 8c03ba1
                if not os.path.exists(reported_to_file):
Jiri Moskovcak 8c03ba1
                    try:
Jiri Moskovcak 8c03ba1
                        fout = open(reported_to_file, "w")
Jiri Moskovcak 8c03ba1
                    except Exception, ex:
Jiri Moskovcak 8c03ba1
                        # silently ignore errors -> probably stalled db, but we can't
Jiri Moskovcak 8c03ba1
                        # do much about it, so it's better to not polute the rpm output
Jiri Moskovcak 8c03ba1
                        continue
Jiri Moskovcak 8c03ba1
Jiri Moskovcak 8c03ba1
                    for report_result in results:
Jiri Moskovcak 8c03ba1
                        # print "\t", format_reported_to(report_result)
Jiri Moskovcak 8c03ba1
                        # I know, it adds a '\n' to the end, but it's not a problem
Jiri Moskovcak 8c03ba1
                        fout.write("%s\n" % format_reported_to(report_result))
Jiri Moskovcak 8c03ba1
                    fout.close()
Jiri Moskovcak 8c03ba1
        db.close()
Jiri Moskovcak 8c03ba1
    except Exception, ex:
Jiri Moskovcak 8c03ba1
        # in case of any unhandled error, just ignore it, the worst, what
Jiri Moskovcak 8c03ba1
        # can happen is that the old reports are marked as unreported
Jiri Moskovcak 8c03ba1
        #print ex
Jiri Moskovcak 8c03ba1
        pass