abrt-python man page

abrt-python — abrt-python Documentation

High-level API for querying, creating and manipulating problems handled by ABRT in Python.

It works on top of low-level DBus or socket API provided by ABRT. Socket API serves only as a fallback option for systems without new DBus problem API as it can only handle the creation of new problems.

This project lives in the abrt repository and is distributed under GPLv2 license.

Contents:

Usage Examples

Creating new problem

import problem

prob = problem.Runtime(
        reason='egg_error_message: assertion "error" failed',
    )

prob.add_current_process_data()
prob.add_current_environment()
prob.save()

Creating problem for different executable

import problem

prob = problem.Selinux(reason='Front fell off')

prob.executable = '/usr/bin/time'

prob.save()

Adding custom data

import problem

prob = problem.Runtime(
        reason='Error getting devices:'
        'GDBus.Error:org.freedesktop.DBus.Error.UnknownMethod: '
        'No such interface `org.gnome.SettingsDaemon.Power` on object at path '
        '/org/gnome/SettingsDaemon/Power'
    )

prob.add_current_process_data()
prob.custom_data = 'any'
prob['dict_access_example'] = 'works'

print(prob)
print('')

for key, value in prob.items():
    print('{0}={1}'.format(key, value))

print('Identifier:', prob.save())

Querying problems

import problem

for prob in problem.list():
    print(prob)
    print(repr(prob.time))
    if hasattr(prob, 'pid'):
        print(prob.pid)

Querying all problems

The list method used with auth=True parameter will try to authenticate via polkit to gain access to all problems on the system.

If there is no authentication agent running or authentication is unsuccessful, the list of problems which belong to current user is returned (same as returned by the list method).

import problem

for prob in problem.list(auth=True):
    print(prob)
    if hasattr(prob, 'username'):
        print('Problem belongs to {0}'.format(prob.username))

Editing existing problems

import problem

for prob in problem.list():
    if prob.type == problem.JAVA:
        prob.delete()

    if prob.type == problem.CCPP:
        if 'password' in prob.backtrace:
            del prob.backtrace
            prob.save()

    if prob.type == problem.KERNELOOPS:
        prob.backtrace = prob.backtrace.replace(' ?', '')
        prob.save()

Watching for new problems

import problem
import logging

logging.basicConfig(level=logging.DEBUG)

def monitor(prob):
    print(prob)
    prob.delete()

pwatch = problem.get_problem_watcher()
pwatch.add_callback(monitor)

try:
    pwatch.run()
except KeyboardInterrupt:
    pwatch.quit()

Watching for new problems in a thread

from __future__ import print_function

import sys
import time
import problem
import threading

class ProblemWatchThread(threading.Thread):
    def __init__(self):
        super(ProblemWatchThread, self).__init__()
        self.pwatch = problem.get_problem_watcher()
        self.pwatch.add_callback(self.handle)
        self.probcount = 0

    def handle(self, prob):
        self.probcount += 1
        print('{0}: {1}'.format(self.probcount, prob))
        # prob.delete()

    def run(self):
        self.pwatch.run()

    def stop(self):
        self.pwatch.quit()

pwt = ProblemWatchThread()
pwt.start()

i = 0
print('Waiting for new problem to appear')
spinner = ['\\', '|', '/', '-']

try:
    while True:
        time.sleep(0.1)
        print('{0}\r'.format(spinner[i]), end='')
        i += 1
        i = i % len(spinner)
        sys.stdout.flush()
except KeyboardInterrupt:
    pwt.stop()

pwt.stop()

Getting bug numbers of problems reported to bugzilla

import problem

bugs = set()

for prob in problem.list():
    if not hasattr(prob, 'reported_to'):
        continue

    for line in prob.reported_to.splitlines():
        if line.startswith('Bugzilla:'):
            bug_num = int(line.split('=')[-1])
            bugs.add(bug_num)

print(bugs)

Stable API Documentation

class problem.Problem(typ, reason, analyzer=None)

Base class for the other problem types.

No need to use this class directly, use one of the specific problem classes.

add_current_environment()
Add environment of current process to this problem object
add_current_process_data()
Add pid, gid and executable of current process to this problem object
chown()
Assures ownership of a problem for the caller
delete()
Delete this problem
prefetch_data()
Prefetch possible data fields of this problem
save()
Create this problem or update modified data

Create or update the project if some of its fields were modified.

Return None in case of modification, identifier if new problem was created.
problem.list(auth=False)
Return the list of the problems

Use auth=True if authentication should be attempted.

If authentication via polkit fails, function behaves as if auth=False was specified (only users problems are returned).
problem.get(identifier, auth=False)
Return problem object matching identifier

Return None in case the problem does not exist. Use auth=True if authentication should be attempted.
problem.get_problem_watcher(auth=False)
Return ProblemWatcher object which can be used to attach callbacks called when new problem is created

Use auth=True if authentication should be attempted for new problem that doesn't belong to current user. If not set such a problem is ignored.

Specific problem types

class problem.Ccpp(reason)
C, C++ problem
class problem.Java(reason)
Java problem
class problem.Kerneloops(reason)
Kerneloops problem
class problem.Python(reason)
Python problem
class problem.Python3(reason)
Python3 problem
class problem.Runtime(reason)
Runtime problem
class problem.Selinux(reason)
Selinux problem
class problem.Unknown(reason)
Unknown problem
class problem.Xorg(reason)
Xorg problem

ProblemWatcher

class problem.watch.ProblemWatcher(auth)

New problem signal handler attached to DBus signal

Use auth=True if authentication should be attempted for new problem that doesn't belong to current user. If not set such a problem is ignored.

add_callback(fun)
Add callback to be called when new problem occurs.

Each callback function receives Problem instance
quit()
Stop event listener loop
run()
Start event listener loop

Problem Object Properties

Currently, there is no strict specification of problem properties and you are free to add your own data as you see fit (log files, process data) provided you are planning to use them for reporting.

Mandatory properties required prior saving:

PropertyMeaningExample
executableExecutable path of the component which caused the problem. Used by the server to determine component and package data.'/usr/bin/time'

Following properties are added by the server when new problem is created:

PropertyMeaningExample
componentComponent which caused this problem.'time'
hostnameHostname of the affected machine.'fiasco'
os_releaseOperating system release string.'Fedora release 17 (Beefy Miracle)'
uidUser ID1000
username'jeff'
architectureMachine architecture string'x86_64'
kernelKernel version string'3.6.6-1.fc17.x86_64'
packagePackage string'time-1.7-40.fc17.x86_64'
timeTime of the occurence (unixtime)datetime.datetime(2012, 12, 2, 16, 18, 41)
countNumber of times this problem occured1

Parsed package data is also available:

PropertyMeaningExample
pkg_namePackage name'time'
pkg_epochPackage epoch0
pkg_versionPackage version'1.7'
pkg_releasePackage release'40.fc17'
pkg_archPackage architecture'x86_64'

Other common properties (presence differs based on problem type):

PropertyMeaningExampleApplicable
abrt_versionABRT version string'2.0.18.84.g211c'Crashes caught by ABRT
cgroupcgroup (control group) information for crashed process'9:perf_event:/\n8:blkio:/\n...'C/C++
core_backtraceMachine readable backtrace with no private dataC/C++, Python, Ruby, Kerneloops
backtraceOriginal backtrace or backtrace produced by retracing processC/C++ (after retracing), Python, Ruby, Xorg, Kerneloops
dso_listList of dynamic libraries loaded at the time of crashC/C++, Python
mapsCopy of /proc/<pid>/maps file of the problem executableC/C++
cmdlineCopy of /proc/<pid>/cmdline file'/usr/bin/gtk-builder-convert'C/C++, Python, Ruby, Kerneloops
coredumpCoredump of the crashing processC/C++
environRuntime environment of the processC/C++, Python
open_fdsList of file descriptors open at the time of crashC/C++
pidProcess ID'42'C/C++, Python, Ruby
proc_pid_statusCopy of /proc/<pid>/status fileC/C++
limitsCopy of /proc/<pid>/limits fileC/C++
var_log_messagesPart of the /var/log/messages file which contains crash informationC/C++
suspend_statsCopy of /sys/kernel/debug/suspend_statsKerneloops
reported_toIf the problem was already reported, this item contains URLs of the services where it was reportedReported problems
event_logABRT event logReported problems
dmesgCopy of dmesgKerneloops
·
genindex
·
modindex
·
search

Author

Richard Marko

Referenced By

abrt-python3(5) is an alias of abrt-python(5).

Sep 10, 2016 0.1 abrt-python