org.freedesktop.Problems2
org.freedesktop.Problems2 — The Problems Service manages all the crashes.
NewProblem
( | IN Dict<String,Variant> problem_data, |
IN Int32 flags, | |
OUT ObjectPath task) ; |
GetSession
( | OUT ObjectPath session) ; |
GetProblems
( | IN Int32 flags, |
IN Dict<String,Variant> options, | |
OUT Array<ObjectPath> response) ; |
GetProblemData
( | IN ObjectPath problem_object, |
OUT Dict<String,Struct<Int32,UInt64,String>> problem_data) ; |
DeleteProblems
( | IN Array<ObjectPath> problem_objects) ; |
org.freedesktop.Problems2.NewProblem
NewProblem
( | IN Dict<String,Variant> problem_data, |
IN Int32 flags, | |
OUT ObjectPath task) ; |
Creates a new problem and returns it's identifier.
Example 2.1. How to create a new problems in Python
#!/usr/bin/python3 import sys import dbus from functools import partial from dbus.mainloop.glib import DBusGMainLoop from gi.repository import GLib PROBLEMS_BUS="org.freedesktop.problems" PROBLEMS_PATH="/org/freedesktop/Problems2" PROBLEMS_IFACE="org.freedesktop.Problems2" TASK_IFACE="org.freedesktop.Problems2.Task" def on_task_properties_changed(loop, iface, changed_properties, invalidated_properties): if changed_properties['status'] in [2, 3, 4, 5]: loop.quit() DBusGMainLoop(set_as_default=True) bus = dbus.SystemBus() proxy = bus.get_object(PROBLEMS_BUS, PROBLEMS_PATH) problems = dbus.Interface(proxy, dbus_interface=PROBLEMS_IFACE) task_pah = None with open("/etc/services", "r") as services_file: description = {"analyzer" : "libreport", "reason" : "Application has been killed", "backtrace" : "die()", "executable" : "/usr/bin/foo", "services" : dbus.types.UnixFd(services_file)} task_path = problems.NewProblem(description, 0x1) loop = GLib.MainLoop() task_proxy = bus.get_object(PROBLEMS_BUS, task_path) task = dbus.Interface(task_proxy, dbus_interface=TASK_IFACE) task_properties = dbus.Interface(task_proxy, dbus_interface="org.freedesktop.DBus.Properties") task_properties.connect_to_signal("PropertiesChanged", partial(on_task_properties_changed, loop)) task.Start(dict()) GLib.timeout_add(30000, loop.quit) loop.run() status = task_properties.Get(TASK_IFACE, "Status") if status in [0, 1]: print("Timed-out") task.Cancel(0) sys.exit(1) if status < 5: print("Unexpected status: {}".format(status)) sys.exit(1) if status == 5: results, code = task.Finish() if code in [0, 2]: print("New problem: {}".format(results["NewProblem.Entry"])) sys.exit(0) else: print(results["Error.Message"]) sys.exit(1)
Example 2.2. How to create a new problems in Bash
#!/usr/bin/bash dbus-send --system --type=method_call --print-reply \ --dest=org.freedesktop.problems /org/freedesktop/problems2 \ org.freedesktop.Problems2.NewProblem \ dict:string:string:analyzer,libreport,reason,"Application has been killed",backtrace,"die()",executable,"/usr/bin/true"
problem_data
A dictionary describing problem where values are either file descriptors or strings. There are few commonly recognized fields but the dictionary can hold anything you need.
This field should be always present. The field defines a type of problem. If the item is not provided, libreport string is used by default. This element must not be passed as plain String. Some values can passed only by authorized users, check the implementation details to find the real values.
This field should be always present. The field defines a type of problem. If the item is not provided, libreport string is used by default. This element must not be passed as plain String. Some values can passed only by authorized users, check the implementation details to find the real values.
This field should contain a short human readable text describing the problem.
This field is filled automaticaly.
Only a user with root privileges can pass this field. For all other users the field is filled by caller's uid.
This is mandatory field and must contain a valid path to an executable.
A name of package which a problematic application belongs to. If this field is provided, the executable field becomes optional.
Machine readable identifier of a kind of the problem. ABRT uses this field for local duplicates searching.
Machine readable identifier of a kind of the problem. ABRT uses this field for global duplicates searching.
The value can be one of the following types: string (s), binary array (ay) or file handle (h - will be read in non-blocking mode). The task details will contain object path of a temporary Entry under the key "NewProblem.TemporaryEntry". The temporary entry object implements the org.freedesktop.Problems2.Entry interface. The task results will contain object path of the Entry representing the processed problem data under the key "NewProblem.Entry".
flags
the task will be created
the task will be stopped after the temporary directory is created
the task will be automatically started
task
Object path of the task processing the new problem data. The task can finish with one of the following codes:
ABRT_P2_TASK_NEW_PROBLEM_ACCEPTED - a new problem was created
ABRT_P2_TASK_NEW_PROBLEM_FAILED - the processing failed
ABRT_P2_TASK_NEW_PROBLEM_DUPLICATE - the problem data was dropped and a duplicated problem was updated
ABRT_P2_TASK_NEW_PROBLEM_DROPPED - the problem data couldn't be saved
ABRT_P2_TASK_NEW_PROBLEM_INVALID_DATA - the problem data contained abandoned values
org.freedesktop.Problems2.GetSession
GetSession
( | OUT ObjectPath session) ; |
Returns a session object which implements the org.freedesktop.Problems2.Session interface.
session
An object path
org.freedesktop.Problems2.GetProblems
GetProblems
( | IN Int32 flags, |
IN Dict<String,Variant> options, | |
OUT Array<ObjectPath> response) ; |
Returns a list of problem identifiers for problems visible by the caller. If the session is authorized (GetSession), then the method returns all detected problems (system problems and problems of other users).
Example 2.3. How to get the list of problems in Python
#!/usr/bin/python3 import dbus PROBLEMS_BUS="org.freedesktop.problems" PROBLEMS_PATH="/org/freedesktop/Problems2" PROBLEMS_IFACE="org.freedesktop.Problems2" ENTRY_IFACE="org.freedesktop.Problems2.Entry" bus = dbus.SystemBus() proxy = bus.get_object(PROBLEMS_BUS, PROBLEMS_PATH) problems = dbus.Interface(proxy, dbus_interface=PROBLEMS_IFACE) prblms = problems.GetProblems(0x0, {}) for path in prblms: prblm_proxy = bus.get_object(PROBLEMS_BUS, path) props = dbus.Interface(prblm_proxy, "org.freedesktop.DBus.Properties") print("{}: {}".format(props.Get(ENTRY_IFACE, "Executable"), props.Get(ENTRY_IFACE, "Reason")))
Example 2.4. How to get the list of user problems and system problems in Python
#!/usr/bin/python3 import sys import dbus from functools import partial from dbus.mainloop.glib import DBusGMainLoop from gi.repository import GLib PROBLEMS_BUS="org.freedesktop.problems" PROBLEMS_PATH="/org/freedesktop/Problems2" PROBLEMS_IFACE="org.freedesktop.Problems2" ENTRY_IFACE="org.freedesktop.Problems2.Entry" SESSION_IFACE="org.freedesktop.Problems2.Session" def on_session_authorization_signal(mainloop, status): if status == 0: mainloop.quit() if status == 3: print("Authorization failed") sys.exit(1) DBusGMainLoop(set_as_default=True) bus = dbus.SystemBus() proxy = bus.get_object(PROBLEMS_BUS, PROBLEMS_PATH) problems = dbus.Interface(proxy, dbus_interface=PROBLEMS_IFACE) session_path = problems.GetSession() session_proxy = bus.get_object(PROBLEMS_BUS, session_path) session = dbus.Interface(session_proxy, dbus_interface=SESSION_IFACE) mainloop = GLib.MainLoop() session_proxy.connect_to_signal("AuthorizationChanged", partial(on_session_authorization_signal, mainloop)) result = session.Authorize({}) if result < 0: print("Cannot authorize") sys.exit(1) if result > 0: mainloop.run() prblms = problems.GetProblems(0x1, {}) for path in prblms: prblm_proxy = bus.get_object(PROBLEMS_BUS, path) props = dbus.Interface(prblm_proxy, "org.freedesktop.DBus.Properties") print("{}: {}".format(props.Get(ENTRY_IFACE, "Executable"), props.Get(ENTRY_IFACE, "Reason")))
flags
Allows to specify what kind of problems to include in the response
Only problems that can be viewed and modified by the caller
Include problems of other users
Include problems being processed
options
For future needs
response
List of problem objects paths
org.freedesktop.Problems2.GetProblemData
GetProblemData
( | IN ObjectPath problem_object, |
OUT Dict<String,Struct<Int32,UInt64,String>> problem_data) ; |
Gets an equivalent of libreport's ProblemData for the given problem entry ($INCLUDE_DIR/libreport/problem_data.h).
problem_object
Problem Entry path used to get the problem data.
problem_data
The results is a dictionary where the key is problem element name (e.g. package, maps, coredump) and the value is a structure with three members:
libreport flags ($INCLUDE_DIR/libreport/problem_data.h)
real file size in Bytes
a representation of the element depending on the libreport flags
file contents
file path
file path