summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/applet/test_report.c4
-rw-r--r--src/daemon/MiddleWare.cpp12
-rw-r--r--src/daemon/abrt-handle-crashdump.c2
-rw-r--r--src/include/report/crash_data.h10
-rw-r--r--src/include/report/run_event.h5
-rw-r--r--src/lib/crash_data.c10
-rw-r--r--src/lib/create_dump_dir.c2
-rw-r--r--src/lib/run_event.c21
-rw-r--r--src/plugins/abrt-action-bugzilla.cpp2
-rw-r--r--src/plugins/abrt-action-kerneloops.c2
-rw-r--r--src/plugins/abrt-action-mailx.c2
-rw-r--r--src/plugins/abrt-action-print.c2
-rw-r--r--src/plugins/abrt-action-rhtsupport.c2
-rw-r--r--src/report-python/__init__.py9
-rw-r--r--src/report-python/common.h9
-rw-r--r--src/report-python/crash_data.c19
-rw-r--r--src/report-python/dump_dir.c1
-rw-r--r--src/report-python/reportmodule.c10
-rw-r--r--src/report-python/run_event.c29
-rwxr-xr-xsrc/report-python/test_full2
-rwxr-xr-xsrc/report-python/test_full217
-rwxr-xr-xsrc/report-python/test_run_event_state14
22 files changed, 119 insertions, 57 deletions
diff --git a/src/applet/test_report.c b/src/applet/test_report.c
index 2b3da020..80cf3c73 100644
--- a/src/applet/test_report.c
+++ b/src/applet/test_report.c
@@ -39,7 +39,7 @@ int main(int argc, char** argv)
add_to_crash_data(crash_data, "analyzer", "wow");
const char *event = "report";
- struct dump_dir *dd = create_dump_dir(crash_data, "/tmp");
+ struct dump_dir *dd = create_dump_dir_from_crash_data(crash_data, "/tmp");
free_crash_data(crash_data);
if (!dd)
return 1;
@@ -50,7 +50,7 @@ int main(int argc, char** argv)
struct run_event_state *run_state = new_run_event_state();
run_state->logging_callback = do_log;
- int r = run_event(run_state, dir_name, event);
+ int r = run_event_on_dir_name(run_state, dir_name, event);
if (r == -1)
printf("No actions are found for event '%s'\n", event);
free_run_event_state(run_state);
diff --git a/src/daemon/MiddleWare.cpp b/src/daemon/MiddleWare.cpp
index 655bda3a..ff2e1a2a 100644
--- a/src/daemon/MiddleWare.cpp
+++ b/src/daemon/MiddleWare.cpp
@@ -79,7 +79,7 @@ static crash_data_t *DebugDumpToCrashReport(const char *dump_dir_name)
v++;
}
- crash_data_t *crash_data = load_crash_data_from_dump_dir(dd);
+ crash_data_t *crash_data = create_crash_data_from_dump_dir(dd);
char *events = list_possible_events(dd, NULL, "");
dd_close(dd);
@@ -154,7 +154,7 @@ static mw_result_t CreateCrashReport(const char *dump_dir_name,
run_state = new_run_event_state();
run_state->logging_callback = do_log_and_update_client;
- res = run_event(run_state, dump_dir_name, force ? "reanalyze" : "analyze");
+ res = run_event_on_dir_name(run_state, dump_dir_name, force ? "reanalyze" : "analyze");
free_run_event_state(run_state);
if (res != 0 && res != -1) /* -1 is "nothing was done", here it is ok */
{
@@ -162,7 +162,7 @@ static mw_result_t CreateCrashReport(const char *dump_dir_name,
goto ret;
}
- /* Do a load_crash_data_from_dump_dir from (possibly updated)
+ /* Do a create_crash_data_from_dump_dir from (possibly updated)
* crash dump dir
*/
*crash_data = DebugDumpToCrashReport(dump_dir_name);
@@ -336,7 +336,7 @@ report_status_t Report(crash_data_t *client_report,
std::string event = events[i];
l_state.last_line = NULL;
- int r = run_event(run_state, dump_dir_name, event.c_str());
+ int r = run_event_on_dir_name(run_state, dump_dir_name, event.c_str());
if (r == -1)
{
l_state.last_line = xasprintf("Error: no processing is specified for event '%s'", event.c_str());
@@ -507,7 +507,7 @@ mw_result_t LoadDebugDump(const char *dump_dir_name, crash_data_t **crash_data)
run_state->post_run_callback = is_crash_a_dup;
run_state->post_run_param = &state;
run_state->logging_callback = do_log;
- int r = run_event(run_state, dump_dir_name, "post-create");
+ int r = run_event_on_dir_name(run_state, dump_dir_name, "post-create");
free_run_event_state(run_state);
//TODO: consider this case:
@@ -590,7 +590,7 @@ static crash_data_t *FillCrashInfo(const char *dump_dir_name)
if (!dd)
return NULL;
- crash_data_t *crash_data = load_crash_data_from_dump_dir(dd);
+ crash_data_t *crash_data = create_crash_data_from_dump_dir(dd);
char *events = list_possible_events(dd, NULL, "");
dd_close(dd);
diff --git a/src/daemon/abrt-handle-crashdump.c b/src/daemon/abrt-handle-crashdump.c
index 2217c67a..de809c17 100644
--- a/src/daemon/abrt-handle-crashdump.c
+++ b/src/daemon/abrt-handle-crashdump.c
@@ -96,7 +96,7 @@ int main(int argc, char **argv)
struct run_event_state *run_state = new_run_event_state();
run_state->logging_callback = do_log;
- int r = run_event(run_state, dump_dir_name ? dump_dir_name : ".", event);
+ int r = run_event_on_dir_name(run_state, dump_dir_name ? dump_dir_name : ".", event);
if (r == -1)
error_msg_and_die("No actions are found for event '%s'", event);
free_run_event_state(run_state);
diff --git a/src/include/report/crash_data.h b/src/include/report/crash_data.h
index 86cdadd0..86543a4f 100644
--- a/src/include/report/crash_data.h
+++ b/src/include/report/crash_data.h
@@ -16,8 +16,8 @@
with this program; if not, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
-#ifndef CRASH_DUMP_H_
-#define CRASH_DUMP_H_
+#ifndef CRASH_DATA_H_
+#define CRASH_DATA_H_
#include <glib.h>
@@ -90,8 +90,10 @@ static inline void free_vector_of_crash_data(vector_of_crash_data_t *vector)
/* Conversions between in-memory and on-disk formats */
-crash_data_t *load_crash_data_from_dump_dir(struct dump_dir *dd);
-struct dump_dir *create_dump_dir(crash_data_t *crash_data, const char *base_dir_name);
+void load_crash_data_from_dump_dir(crash_data_t *crash_data, struct dump_dir *dd);
+crash_data_t *create_crash_data_from_dump_dir(struct dump_dir *dd);
+
+struct dump_dir *create_dump_dir_from_crash_data(crash_data_t *crash_data, const char *base_dir_name);
#ifdef __cplusplus
}
diff --git a/src/include/report/run_event.h b/src/include/report/run_event.h
index c2e34650..b58ea66a 100644
--- a/src/include/report/run_event.h
+++ b/src/include/report/run_event.h
@@ -19,6 +19,8 @@
#ifndef RUN_EVENT_H_
#define RUN_EVENT_H_
+#include "crash_data.h"
+
#ifdef __cplusplus
extern "C" {
#endif
@@ -38,7 +40,8 @@ void free_run_event_state(struct run_event_state *state);
* of post_run_callback. If all actions are successful, returns 0.
* If no actions were run for the event, returns -1.
*/
-int run_event(struct run_event_state *state, const char *dump_dir_name, const char *event);
+int run_event_on_dir_name(struct run_event_state *state, const char *dump_dir_name, const char *event);
+int run_event_on_crash_data(struct run_event_state *state, crash_data_t *data, const char *event);
char *list_possible_events(struct dump_dir *dd, const char *dump_dir_name, const char *pfx);
#ifdef __cplusplus
diff --git a/src/lib/crash_data.c b/src/lib/crash_data.c
index 2cbc043b..a372ab58 100644
--- a/src/lib/crash_data.c
+++ b/src/lib/crash_data.c
@@ -185,11 +185,10 @@ static char* is_text_file(const char *name, ssize_t *sz)
return NULL; /* it's binary */
}
-crash_data_t *load_crash_data_from_dump_dir(struct dump_dir *dd)
+void load_crash_data_from_dump_dir(crash_data_t *crash_data, struct dump_dir *dd)
{
char *short_name;
char *full_name;
- crash_data_t *crash_data = new_crash_data();
dd_init_next_file(dd);
while (dd_get_next_file(dd, &short_name, &full_name))
@@ -208,7 +207,6 @@ crash_data_t *load_crash_data_from_dump_dir(struct dump_dir *dd)
full_name,
CD_FLAG_BIN + CD_FLAG_ISNOTEDITABLE
);
-
free(short_name);
free(full_name);
continue;
@@ -231,6 +229,12 @@ crash_data_t *load_crash_data_from_dump_dir(struct dump_dir *dd)
free(full_name);
free(content);
}
+}
+
+crash_data_t *create_crash_data_from_dump_dir(struct dump_dir *dd)
+{
+ crash_data_t *crash_data = new_crash_data();
+ load_crash_data_from_dump_dir(crash_data, dd);
return crash_data;
}
diff --git a/src/lib/create_dump_dir.c b/src/lib/create_dump_dir.c
index 2125dea4..b0f38e1a 100644
--- a/src/lib/create_dump_dir.c
+++ b/src/lib/create_dump_dir.c
@@ -27,7 +27,7 @@ static struct dump_dir *try_dd_create(const char *base_dir_name, const char *dir
return dd;
}
-struct dump_dir *create_dump_dir(crash_data_t *crash_data, const char *base_dir_name)
+struct dump_dir *create_dump_dir_from_crash_data(crash_data_t *crash_data, const char *base_dir_name)
{
char dir_name[sizeof("abrt-tmp-%lu-%lu") + sizeof(long)*3 * 2];
sprintf(dir_name, "abrt-tmp-%lu-%lu", (long)getpid(), (long)time(NULL));
diff --git a/src/lib/run_event.c b/src/lib/run_event.c
index 28fbfd5e..45ed3cdc 100644
--- a/src/lib/run_event.c
+++ b/src/lib/run_event.c
@@ -28,7 +28,7 @@ void free_run_event_state(struct run_event_state *state)
free(state);
}
-int run_event(struct run_event_state *state,
+int run_event_on_dir_name(struct run_event_state *state,
const char *dump_dir_name,
const char *event
) {
@@ -183,6 +183,25 @@ int run_event(struct run_event_state *state,
return retval;
}
+int run_event_on_crash_data(struct run_event_state *state, crash_data_t *data, const char *event)
+{
+ struct dump_dir *dd = create_dump_dir_from_crash_data(data, NULL);
+ if (!dd)
+ return -1;
+ char *dir_name = xstrdup(dd->dd_dir);
+ dd_close(dd);
+ int r = run_event_on_dir_name(state, dir_name, event);
+ dd = dd_opendir(dir_name, 0);
+ free(dir_name);
+ if (dd)
+ {
+ g_hash_table_remove_all(data);
+ load_crash_data_from_dump_dir(data, dd);
+ dd_delete(dd);
+ }
+ return r;
+}
+
char *list_possible_events(struct dump_dir *dd, const char *dump_dir_name, const char *pfx)
{
FILE *conffile = fopen(CONF_DIR"/abrt_event.conf", "r");
diff --git a/src/plugins/abrt-action-bugzilla.cpp b/src/plugins/abrt-action-bugzilla.cpp
index 9174dbc3..00c3613c 100644
--- a/src/plugins/abrt-action-bugzilla.cpp
+++ b/src/plugins/abrt-action-bugzilla.cpp
@@ -639,7 +639,7 @@ static void report_to_bugzilla(
struct dump_dir *dd = dd_opendir(dump_dir_name, /*flags:*/ 0);
if (!dd)
xfunc_die(); /* dd_opendir already emitted error msg */
- crash_data_t *crash_data = load_crash_data_from_dump_dir(dd);
+ crash_data_t *crash_data = create_crash_data_from_dump_dir(dd);
dd_close(dd);
const char *env;
diff --git a/src/plugins/abrt-action-kerneloops.c b/src/plugins/abrt-action-kerneloops.c
index 9cffab7d..5da54d13 100644
--- a/src/plugins/abrt-action-kerneloops.c
+++ b/src/plugins/abrt-action-kerneloops.c
@@ -90,7 +90,7 @@ static void report_to_kerneloops(
if (!dd)
exit(1); /* error msg is already logged */
- crash_data_t *crash_data = load_crash_data_from_dump_dir(dd);
+ crash_data_t *crash_data = create_crash_data_from_dump_dir(dd);
dd_close(dd);
const char *backtrace = get_crash_item_content_or_NULL(crash_data, FILENAME_BACKTRACE);
diff --git a/src/plugins/abrt-action-mailx.c b/src/plugins/abrt-action-mailx.c
index 6ade162e..00f73d03 100644
--- a/src/plugins/abrt-action-mailx.c
+++ b/src/plugins/abrt-action-mailx.c
@@ -67,7 +67,7 @@ static void create_and_send_email(
if (!dd)
exit(1); /* error msg is already logged by dd_opendir */
- crash_data_t *crash_data = load_crash_data_from_dump_dir(dd);
+ crash_data_t *crash_data = create_crash_data_from_dump_dir(dd);
dd_close(dd);
char* env;
diff --git a/src/plugins/abrt-action-print.c b/src/plugins/abrt-action-print.c
index 3e420768..86a9a1d0 100644
--- a/src/plugins/abrt-action-print.c
+++ b/src/plugins/abrt-action-print.c
@@ -78,7 +78,7 @@ int main(int argc, char **argv)
if (!dd)
return 1; /* error message is already logged */
- crash_data_t *crash_data = load_crash_data_from_dump_dir(dd);
+ crash_data_t *crash_data = create_crash_data_from_dump_dir(dd);
dd_close(dd);
char *dsc = make_description_logger(crash_data);
diff --git a/src/plugins/abrt-action-rhtsupport.c b/src/plugins/abrt-action-rhtsupport.c
index 77b6b1ff..245a3ce0 100644
--- a/src/plugins/abrt-action-rhtsupport.c
+++ b/src/plugins/abrt-action-rhtsupport.c
@@ -34,7 +34,7 @@ static void report_to_rhtsupport(
if (!dd)
exit(1); /* error msg is already logged by dd_opendir */
- crash_data_t *crash_data = load_crash_data_from_dump_dir(dd);
+ crash_data_t *crash_data = create_crash_data_from_dump_dir(dd);
dd_close(dd);
/* Gzipping e.g. 0.5gig coredump takes a while. Let client know what we are doing */
diff --git a/src/report-python/__init__.py b/src/report-python/__init__.py
index 892d7c2a..0b0f5685 100644
--- a/src/report-python/__init__.py
+++ b/src/report-python/__init__.py
@@ -119,11 +119,12 @@ def createAlertSignature(component, hashmarkername, hashvalue, summary, alertSig
return cd
def report(cd, io_unused):
- dd = cd.create_dump_dir()
- dir_name = dd.name
- dd.close()
+ #dd = cd.create_dump_dir()
+ #dir_name = dd.name
+ #dd.close()
#r = os.spawnlp(P_WAIT, "abrt-handle-crashdump", "abrt-handle-crashdump", "-d", dirname, "-e" , "report");
+ ### Silmpler alternative:
state = run_event_state()
#state.logging_callback = logfunc
- r = state.run_event(dir_name, "report")
+ r = state.run_event_on_crash_data(cd, "report")
return r
diff --git a/src/report-python/common.h b/src/report-python/common.h
index f77e5a31..d6d209e9 100644
--- a/src/report-python/common.h
+++ b/src/report-python/common.h
@@ -18,6 +18,10 @@
*/
#include <Python.h>
+#include "dump_dir.h"
+#include "crash_data.h"
+#include "run_event.h"
+
/* exception object */
extern PyObject *ReportError;
@@ -36,3 +40,8 @@ typedef struct {
PyObject_HEAD
struct dump_dir *dd;
} p_dump_dir;
+
+typedef struct {
+ PyObject_HEAD
+ crash_data_t *cd;
+} p_crash_data;
diff --git a/src/report-python/crash_data.c b/src/report-python/crash_data.c
index 8ae597c3..04a721cc 100644
--- a/src/report-python/crash_data.c
+++ b/src/report-python/crash_data.c
@@ -20,15 +20,8 @@
#include <structmember.h>
#include <errno.h>
-#include "crash_data.h"
-#include "dump_dir.h"
#include "common.h"
-typedef struct {
- PyObject_HEAD
- crash_data_t *cd;
-} p_crash_data;
-
static void
p_crash_data_dealloc(PyObject *pself)
{
@@ -92,8 +85,8 @@ static PyObject *p_get_crash_data_item(PyObject *pself, PyObject *args)
return Py_BuildValue("sI", ci->content, ci->flags);
}
-/* struct dump_dir *create_dump_dir(crash_data_t *crash_data, const char *base_dir_name); */
-static PyObject *p_create_dump_dir(PyObject *pself, PyObject *args)
+/* struct dump_dir *create_dump_dir_from_crash_data(crash_data_t *crash_data, const char *base_dir_name); */
+static PyObject *p_create_dump_dir_from_crash_data(PyObject *pself, PyObject *args)
{
p_crash_data *self = (p_crash_data*)pself;
const char *base_dir_name = NULL;
@@ -104,7 +97,7 @@ static PyObject *p_create_dump_dir(PyObject *pself, PyObject *args)
p_dump_dir *new_dd = PyObject_New(p_dump_dir, &p_dump_dir_type);
if (!new_dd)
return NULL;
- struct dump_dir *dd = create_dump_dir(self->cd, base_dir_name);
+ struct dump_dir *dd = create_dump_dir_from_crash_data(self->cd, base_dir_name);
if (!dd)
{
PyObject_Del((PyObject*)new_dd);
@@ -121,9 +114,9 @@ static PyObject *p_create_dump_dir(PyObject *pself, PyObject *args)
static PyMethodDef p_crash_data_methods[] = {
/* method_name, func, flags, doc_string */
- { "add" , p_crash_data_add, METH_VARARGS },
- { "get" , p_get_crash_data_item, METH_VARARGS },
- { "create_dump_dir", p_create_dump_dir, METH_VARARGS },
+ { "add" , p_crash_data_add , METH_VARARGS },
+ { "get" , p_get_crash_data_item , METH_VARARGS },
+ { "create_dump_dir", p_create_dump_dir_from_crash_data, METH_VARARGS },
{ NULL }
};
diff --git a/src/report-python/dump_dir.c b/src/report-python/dump_dir.c
index 04a58d31..249a9478 100644
--- a/src/report-python/dump_dir.c
+++ b/src/report-python/dump_dir.c
@@ -22,7 +22,6 @@
#include <structmember.h>
#include <errno.h>
-#include "dump_dir.h"
#include "common.h"
/*** init/cleanup ***/
diff --git a/src/report-python/reportmodule.c b/src/report-python/reportmodule.c
index 6dda73cf..bd74cff3 100644
--- a/src/report-python/reportmodule.c
+++ b/src/report-python/reportmodule.c
@@ -17,18 +17,16 @@
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
#include <Python.h>
-#include "common.h"
-#include "crash_data.h"
-#include "dump_dir.h"
+#include "common.h"
PyObject *ReportError;
static PyMethodDef module_methods[] = {
/* method_name, func, flags, doc_string */
- { "dd_opendir" , p_dd_opendir, METH_VARARGS, NULL },
- { "dd_create" , p_dd_create, METH_VARARGS, NULL },
- { "delete_dump_dir", p_delete_dump_dir, METH_VARARGS, NULL },
+ { "dd_opendir" , p_dd_opendir , METH_VARARGS },
+ { "dd_create" , p_dd_create , METH_VARARGS },
+ { "delete_dump_dir", p_delete_dump_dir, METH_VARARGS },
{ NULL }
};
diff --git a/src/report-python/run_event.c b/src/report-python/run_event.c
index 0bef3b21..6131df8e 100644
--- a/src/report-python/run_event.c
+++ b/src/report-python/run_event.c
@@ -20,8 +20,9 @@
#include <structmember.h>
#include <errno.h>
-#include "run_event.h"
#include "common.h"
+#include "crash_data.h"
+#include "run_event.h"
typedef struct {
PyObject_HEAD
@@ -71,7 +72,7 @@ static void p_run_event_state_dealloc(PyObject *pself)
/*** methods ***/
-/* First, C-level callback helpers for run_event(): */
+/* First, C-level callback helpers for run_event_on_FOO(): */
static int post_run_callback(const char *dump_dir_name, void *param)
{
PyObject *obj = (PyObject*)param;
@@ -94,8 +95,8 @@ static char *logging_callback(char *log_line, void *param)
return log_line; /* signaling to caller that we didnt consume the string */
}
-/* int run_event(struct run_event_state *state, const char *dump_dir_name, const char *event); */
-static PyObject *p_run_event(PyObject *pself, PyObject *args)
+/* int run_event_on_dir_name(struct run_event_state *state, const char *dump_dir_name, const char *event); */
+static PyObject *p_run_event_on_dir_name(PyObject *pself, PyObject *args)
{
p_run_event_state *self = (p_run_event_state*)pself;
const char *dump_dir_name;
@@ -104,7 +105,22 @@ static PyObject *p_run_event(PyObject *pself, PyObject *args)
{
return NULL;
}
- int r = run_event(self->state, dump_dir_name, event);
+ int r = run_event_on_dir_name(self->state, dump_dir_name, event);
+ PyObject *obj = Py_BuildValue("i", r);
+ return obj;
+}
+
+/* int run_event_on_crash_data(struct run_event_state *state, crash_data_t *data, const char *event); */
+static PyObject *p_run_event_on_crash_data(PyObject *pself, PyObject *args)
+{
+ p_run_event_state *self = (p_run_event_state*)pself;
+ p_crash_data *cd;
+ const char *event;
+ if (!PyArg_ParseTuple(args, "O!s", &p_crash_data_type, &cd, &event))
+ {
+ return NULL;
+ }
+ int r = run_event_on_crash_data(self->state, cd->cd, event);
PyObject *obj = Py_BuildValue("i", r);
return obj;
}
@@ -177,7 +193,8 @@ static int set_logging_callback(PyObject *pself, PyObject *callback, void *unuse
static PyMethodDef p_run_event_state_methods[] = {
/* method_name, func, flags, doc_string */
- { "run_event", p_run_event, METH_VARARGS },
+ { "run_event_on_dir_name" , p_run_event_on_dir_name , METH_VARARGS },
+ { "run_event_on_crash_data", p_run_event_on_crash_data, METH_VARARGS },
{ NULL }
};
diff --git a/src/report-python/test_full b/src/report-python/test_full
index 05020f05..103535dd 100755
--- a/src/report-python/test_full
+++ b/src/report-python/test_full
@@ -12,7 +12,7 @@ def run_event_on_crash_data(cd, event, log_function = None):
if log_function: # maybe if callable(log_function)?
run_state.logging_callback = log_function
print "Running event:", event
- r = run_state.run_event(dir_name, event)
+ r = run_state.run_event_on_dir_name(dir_name, event)
print "Deleting:", dir_name
delete_dump_dir(dir_name)
return r;
diff --git a/src/report-python/test_full2 b/src/report-python/test_full2
new file mode 100755
index 00000000..734946eb
--- /dev/null
+++ b/src/report-python/test_full2
@@ -0,0 +1,17 @@
+#!/usr/bin/python
+
+import sys
+from report import *
+
+def log_function(line):
+ print "LOG:", line
+
+cd = crash_data()
+cd.add("foo", "bar")
+cd.add("analyzer", "baz", CD_FLAG_ISNOTEDITABLE)
+
+st = run_event_state()
+st.logging_callback = log_function
+r = st.run_event_on_crash_data(cd, "post-create")
+
+print "Result:", r
diff --git a/src/report-python/test_run_event_state1 b/src/report-python/test_run_event_state1
index fa5d61a8..b30f8b55 100755
--- a/src/report-python/test_run_event_state1
+++ b/src/report-python/test_run_event_state1
@@ -20,8 +20,8 @@ if not dd:
dd.save_text("analyzer", "foo")
dd.close()
-res.run_event("testdir", "post-create")
+res.run_event_on_dir_name("testdir", "post-create")
dd = dd_opendir("testdir")
-#dd.delete()
+dd.delete()
dd.close()