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