From 1cf434cb395b6b06297281427a47aeebe224b436 Mon Sep 17 00:00:00 2001
From: Jakub Filak <jfilak@redhat.com>
Date: Tue, 12 Nov 2013 16:39:08 +0100
Subject: [ABRT PATCH 71/76] run the autoreporting event from
abrt-action-notify
If AutoreportingEnabled option from abrt.conf holds "yes", then
abrt-action-notify runs AutoreportingEvent from abrt.conf.
Related to #750
Signed-off-by: Jakub Filak <jfilak@redhat.com>
---
doc/abrt-action-notify.txt | 30 +++++++++++++-
src/plugins/abrt-action-notify | 92 +++++++++++++++++++++++++++++++++++++++++-
2 files changed, 119 insertions(+), 3 deletions(-)
diff --git a/doc/abrt-action-notify.txt b/doc/abrt-action-notify.txt
index c5bd7b0..56a456c 100644
--- a/doc/abrt-action-notify.txt
+++ b/doc/abrt-action-notify.txt
@@ -7,7 +7,7 @@ abrt-action-notify - Announces a new occurrence of problem via all accessible ch
SYNOPSIS
--------
-'abrt-action-notify' [-h] [-d PROBLEM_DIR]
+'abrt-action-notify' [-h] -d PROBLEM_DIR [-v] [-a] [-e AUTOREPORTING_EVENT]
DESCRIPTION
-----------
@@ -27,12 +27,40 @@ EVENT=notify package!=
OPTIONS
-------
+-v, --verbose::
+ Be verbose
+
-d, --problem-dir PROBLEM_DIR::
Problem directory [Default: current directory]
-h, --help::
Show help message
+-a, --autoreporting::
+ Force to run autoreporting event
+
+-e, --autoreporting-event AUTOREPORTING_EVENT::
+ Overwrite autoreporting event name
+
+ENVIRONMENT
+----------
+ABRT_VERBOSE::
+ ABRT verbosity level
+
+FILES
+-----
+/etc/abrt/abrt.conf
+
+AutoreportingEnabled::
+ If enabled, abrt-action-notify runs AutoreportingEvent
+
+AutoreportingEvent::
+ Name of event to be run if autoreporting is enabled
+
+SEE ALSO
+--------
+abrt.conf(5)
+
AUTHORS
-------
* ABRT team
diff --git a/src/plugins/abrt-action-notify b/src/plugins/abrt-action-notify
index 722d7f6..aa12105 100644
--- a/src/plugins/abrt-action-notify
+++ b/src/plugins/abrt-action-notify
@@ -20,9 +20,15 @@ from argparse import ArgumentParser
import dbus
import dbus.lowlevel
+import problem
+
import report
from reportclient import (RETURN_OK,
- RETURN_FAILURE)
+ RETURN_FAILURE,
+ RETURN_CANCEL_BY_USER,
+ RETURN_STOP_EVENT_RUN,
+ log1,
+ set_verbosity)
CD_DUMPDIR = "Directory"
FILENAME_PACKAGE = "package"
@@ -30,6 +36,39 @@ FILENAME_UID = "uid"
FILENAME_UUID = "uuid"
FILENAME_DUPHASH = "duphash"
+
+def run_autoreport(problem_data, event_name):
+ """Runs autoreporting event
+
+ Requires CD_DUMPDIR key in problem_data.
+
+ Keyword arguments:
+ problem_data -- problem data of notified problems
+
+ Returns None as it raises an exception on error
+
+ Raises:
+ KeyError -- if any of required elements is missing
+ RuntimeError -- if event run fails
+ """
+
+ dir_name = problem_data.get(CD_DUMPDIR)
+ if dir_name is None:
+ raise KeyError(CD_DUMPDIR)
+
+ log1("Running autoreporting event: '{0}'".format(event_name))
+
+ res = report.run_event_state()
+ ret = res.run_event_on_dir_name(dir_name[0], event_name)
+
+ if res.children_count == 0 and ret == 0:
+ raise RuntimeError("No processing is specified for event '{0}'"
+ .format(event_name))
+
+ if not ret in [RETURN_OK, RETURN_CANCEL_BY_USER, RETURN_STOP_EVENT_RUN]:
+ raise RuntimeError("Event '{0}' exited with {1}"
+ .format(event_name, ret))
+
def emit_crash_dbus_signal(problem_data):
"""Emits a Crash signal on D-Bus Problem bus
@@ -132,15 +171,43 @@ def build_notification_problem_data(problem_dir):
if __name__ == "__main__":
CMDARGS = ArgumentParser(
description=("Announce a new or duplicated problem via"
- " all accessible channels"))
+ " all accessible channels"),
+ epilog=("Reads the default configuration from 'abrt.conf' file"))
CMDARGS.add_argument("-d", "--problem-dir",
type=str, required=True,
help="An absolute path to a new or duplicated problem directory")
+ CMDARGS.add_argument("-v", "--verbose",
+ action="count", dest="verbose", default=0,
+ help="Be verbose")
+ CMDARGS.add_argument("-a", "--autoreporting",
+ action="store_true", dest="autoreporting", default=False,
+ help="Force to run autoreporting event")
+ CMDARGS.add_argument("-e", "--autoreporting-event",
+ type=str, dest="autoreporting_event",
+ help="Overwrite autoreporting event name")
OPTIONS = CMDARGS.parse_args()
DIR_PATH = OPTIONS.problem_dir
+ verbose = 0
+ ABRT_VERBOSE = os.getenv("ABRT_VERBOSE")
+ if ABRT_VERBOSE:
+ try:
+ verbose = int(ABRT_VERBOSE)
+ except:
+ pass
+
+ verbose += OPTIONS.verbose
+ set_verbosity(verbose)
+ os.environ["ABRT_VERBOSE"] = str(verbose)
+
+ try:
+ conf = problem.load_conf_file("abrt.conf")
+ except OSError as ex:
+ sys.stderr.write("{0}".format(str(ex)))
+ sys.exit(RETURN_FAILURE)
+
try:
PD = build_notification_problem_data(DIR_PATH)
except ValueError as ex:
@@ -160,5 +227,26 @@ if __name__ == "__main__":
.format(ex.message))
sys.exit(RETURN_FAILURE)
+ if OPTIONS.autoreporting or conf.get("AutoreportingEnabled", "no") == "yes":
+ event_name = OPTIONS.autoreporting_event
+ if not event_name:
+ if "AutoreportingEvent" in conf:
+ event_name = conf["AutoreportingEvent"]
+ else:
+ sys.stderr.write("Autoreporting event is not configured")
+ sys.stderr.exit(RETURN_FAILURE)
+
+ try:
+ run_autoreport(PD, event_name)
+ except RuntimeError as ex:
+ sys.stderr.write("Cannot notify '{0}': {1}\n".
+ format(DIR_PATH, ex.message))
+ sys.exit(RETURN_FAILURE)
+ except KeyError as ex:
+ # this is a bug in build_notification_problem_data()
+ sys.stderr.write("BUG: problem data misses required element '{0}'"
+ .format(ex.message))
+ sys.exit(RETURN_FAILURE)
+
sys.exit(RETURN_OK)
--
1.8.3.1