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()