Source code for problem.tools

import os
import logging

import problem

def problemify(probdir, proxy):
    by_analyzer = dict(zip(problem.PROBLEM_TYPES.values(), 
        problem.PROBLEM_TYPES.keys()))

    analyzer = proxy.get_item(probdir, 'analyzer')
    reason = proxy.get_item(probdir, 'reason')

    if analyzer not in by_analyzer:
        return problem.Unknown(reason)

    class_name = by_analyzer[analyzer].lower().capitalize()

    prob = getattr(problem, class_name)(reason)
    prob._probdir = probdir
    prob._persisted = True
    prob._proxy = proxy
    return prob

[docs]class ProblemWatcher(object): ''' New problem signal handler attached to DBus signal ''' def __init__(self, bus, auth): import gobject self.callbacks = [] self.auth = auth self.bus = bus # local context required!? # http://rmarko.fedorapeople.org/random/high_five.jpg evt_match = self.bus.add_signal_receiver( self._new_problem_handler, signal_name='Crash', path='/org/freedesktop/problems') self.loop = gobject.MainLoop() def _new_problem_handler(self, comp, ddir, uid): logging.debug('New problem notification received') if int(uid) != os.getuid() and not self.auth: logging.debug('Auth disabled, ignoring crash with' ' uid: {0}'.format(uid)) return prob = problemify(ddir, problem.proxies.get_proxy()) for cb in self.callbacks: cb(prob)
[docs] def add_callback(self, fun): ''' Add callback to be called when new problem occurs. Each callback function receives Problem instance ''' self.callbacks.append(fun)
[docs] def run(self): ''' Start event listener loop ''' self.loop.run()
[docs] def quit(self): ''' Stop event listener loop ''' self.loop.quit()