Signed-off-by: Jakub Filak <[email protected]>
---
src/cli/cli.c | 160 +++++++++++++++++++++++++--------------------------------
1 file changed, 70 insertions(+), 90 deletions(-)
diff --git a/src/cli/cli.c b/src/cli/cli.c
index 244dce0..eca8bda 100644
--- a/src/cli/cli.c
+++ b/src/cli/cli.c
@@ -22,8 +22,48 @@
#include <syslog.h>
#include "internal_libreport.h"
#include "cli-report.h"
+#include "run_event_list.h"
-static char *do_log(char *log_line, void *param)
+static enum elp_signal_ret cli_event_done(struct event_list_process *process)
+{
+ const char *const event_name = elp_get_current_event(process);
+ const enum elp_event_run_status status =
elp_get_last_event_status(process);
+
+ switch(status)
+ {
+ case ELP_ERS_SUCCESSFUL:
+ VERB1 log("Successfull event '%s'", event_name);
+ return ELPSR_CONTINUE;
+
+ case ELP_ERS_FAILED:
+ error_msg("Event '%s' failed", event_name);
+ return ELPSR_FINISH;
+
+ case ELP_ERS_NOT_FOUND:
+ error_msg("No actions are found for event '%s'", event_name);
+ return ELPSR_FINISH;
+
+ case ELP_ERS_NONE:
+ /* fall throug */
+ default:
+ error_msg_and_die("unexpected event return status '%d'", status);
+ break;
+ }
+
+ return ELPSR_FINISH;
+}
+
+enum elp_signal_ret cli_configuration_issue(const struct event_list_process
*process)
+{
+ const struct elp_configuration_issue *last =
elp_get_last_configuration_issue(process);
+ log("Found configuration flaws for event '%s'", last->event_name);
+ for(const GList *i = last->issues; i; i = g_list_next(i))
+ log("* %s", (char *)i->data);
+
+ return last->usability == EUS_UNUSABLE ? ELPSR_NEXT_EVENT : ELPSR_CONTINUE;
+}
+
+static char* cli_logging_callback(char *log_line, void *param)
{
log("%s", log_line);
return log_line;
@@ -48,7 +88,7 @@ int main(int argc, char** argv)
#endif
GList *D_list = NULL;
- const char *event_name = NULL;
+ GList *events_list = NULL;
const char *pfx = "";
/* Can't keep these strings/structs static: _() doesn't support that */
@@ -62,31 +102,23 @@ int main(int argc, char** argv)
enum {
OPT_list_events = 1 << 0,
OPT_run_event = 1 << 1,
- OPT_analyze = 1 << 2,
- OPT_collect = 1 << 3,
- OPT_report = 1 << 4,
- OPT_version = 1 << 5,
- OPT_delete = 1 << 6,
- OPTMASK_op =
OPT_list_events|OPT_run_event|OPT_analyze|OPT_collect|OPT_report|OPT_version,
- OPTMASK_need_arg = OPT_run_event|OPT_analyze|OPT_collect|OPT_report,
- OPT_y = 1 << 7,
- OPT_o = 1 << 8,
- OPT_v = 1 << 9,
- OPT_s = 1 << 10,
- OPT_p = 1 << 11,
+ OPT_version = 1 << 2,
+ OPT_delete = 1 << 3,
+ OPTMASK_op = OPT_list_events|OPT_run_event|OPT_version,
+ OPTMASK_need_arg = OPT_run_event,
+ OPT_y = 1 << 4,
+ OPT_v = 1 << 5,
+ OPT_s = 1 << 6,
+ OPT_p = 1 << 7,
};
/* Keep enum above and order of options below in sync! */
struct options program_options[] = {
/* short_name long_name value parameter_name help */
OPT_OPTSTRING('L', NULL , &pfx, "PREFIX", _("List
possible events [which start with PREFIX]")),
- OPT_STRING( 'e', NULL , &event_name, "EVENT", _("Run EVENT on
DUMP_DIR")),
- OPT_BOOL( 'a', "analyze", NULL, _("Run analyze
event(s) on DUMP_DIR")),
- OPT_BOOL( 'c', "collect", NULL, _("Run collect
event(s) on DUMP_DIR")),
- OPT_BOOL( 'r', "report" , NULL, _("Analyze,
collect and report problem data in DUMP_DIR")),
+ OPT_LIST( 'e', "event" , &events_list, "EVENT", _("Run only
this event")),
OPT_BOOL( 'V', "version", NULL, _("Display
version and exit")),
- OPT_BOOL( 'd', "delete" , NULL, _("Remove
DUMP_DIR after reporting")),
+ OPT_BOOL( 'd', "delete" , NULL, _("Remove
DUMP_DIR")),
OPT_BOOL( 'y', "always" , NULL,
_("Noninteractive: don't ask questions, assume 'yes'")),
- OPT_BOOL( 'o', "report-only" , NULL, _("With -r: do
not run analyzers, run only reporters")),
OPT__VERBOSE(&g_verbose),
OPT_BOOL( 's', NULL , NULL, _("Log to
syslog")),
OPT_BOOL( 'p', NULL , NULL, _("Add program
names to log")),
@@ -124,8 +156,6 @@ int main(int argc, char** argv)
}
char *dump_dir_name = argv[0];
- bool always = (opts & OPT_y);
- bool report_only = (opts & OPT_o);
if (!D_list)
{
@@ -154,76 +184,26 @@ int main(int argc, char** argv)
}
case OPT_run_event: /* -e EVENT: run event */
{
- struct run_event_state *run_state = new_run_event_state();
- run_state->logging_callback = do_log;
- int r = run_event_on_dir_name(run_state, dump_dir_name,
event_name);
- if (r == 0 && run_state->children_count == 0)
- error_msg_and_die("No actions are found for event '%s'",
event_name);
- free_run_event_state(run_state);
- break;
- }
- case OPT_analyze:
- {
- /* Load problem_data from dump dir */
- struct dump_dir *dd = dd_opendir(dump_dir_name, DD_OPEN_READONLY);
- if (!dd)
- return 1;
- char *analyze_events_as_lines = list_possible_events(dd, NULL,
"analyze");
- dd_close(dd);
-
- if (analyze_events_as_lines && *analyze_events_as_lines)
- {
- GList *list_analyze_events =
str_to_glist(analyze_events_as_lines, '\n');
- char *event = select_event_option(list_analyze_events);
- list_free_with_free(list_analyze_events);
- exitcode = run_analyze_event(dump_dir_name, event);
- free(event);
- }
- free(analyze_events_as_lines);
- break;
- }
- case OPT_collect:
- {
- exitcode = collect(dump_dir_name, always);
+ struct elp_signals_impl impl;
+ event_list_process_impl_init(&impl);
+ impl.event_done=cli_event_done;
- /* Be consistent and return 1 when opening dd failed */
- if (exitcode == -1)
- return 1;
+ struct run_event_impl *run_impl = new_text_run_event_impl();
- break;
- }
- case OPT_report:
- {
- struct dump_dir *dd = dd_opendir(dump_dir_name, DD_OPEN_READONLY);
- if (!dd)
- return 1;
- int readonly = !dd->locked;
- dd_close(dd);
- if (readonly)
- {
- log("'%s' is not writable", dump_dir_name);
- /* D_list can't be NULL here */
- struct dump_dir *dd_copy = steal_directory((char
*)D_list->data, dump_dir_name);
- if (dd_copy)
- {
- delete_dump_dir_possibly_using_abrtd(dump_dir_name);
- dump_dir_name = xstrdup(dd_copy->dd_dirname);
- dd_close(dd_copy);
- }
- }
-
- exitcode = report(dump_dir_name,
- (always ? CLI_REPORT_BATCH : 0) |
- (report_only ? CLI_REPORT_ONLY : 0));
- if (exitcode == -1)
- error_msg_and_die("Crash '%s' not found", dump_dir_name);
-
- if (opts & OPT_delete)
- {
- int r = delete_dump_dir_possibly_using_abrtd(dump_dir_name);
- if (exitcode == 0)
- exitcode = r;
- }
+ struct event_list_process *process =
new_event_list_process(events_list,
+ &impl,
+
run_impl,
+ NULL,
+
dump_dir_name,
+ NULL);
+
+ elp_set_logging_callback(process, cli_logging_callback, NULL);
+
+ while(elp_next_step(process))
+ ;
+
+ free_event_list_process(process);
+ free_text_run_event_impl(run_impl);
break;
}
--
1.7.10.2