summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorDenys Vlasenko <dvlasenk@redhat.com>2010-12-16 18:28:07 +0100
committerDenys Vlasenko <dvlasenk@redhat.com>2010-12-16 18:28:07 +0100
commit628fb1fbae2a9e3e8fc3add070bceb5557973029 (patch)
tree7e46ad228722cf5b6e7f4b54b9100d6cf638a135 /src
parent93d5d8a317ec9294bbd6dcc6bd8baec0c2b63b1b (diff)
downloadabrt-628fb1fbae2a9e3e8fc3add070bceb5557973029.tar.gz
abrt-628fb1fbae2a9e3e8fc3add070bceb5557973029.tar.xz
abrt-628fb1fbae2a9e3e8fc3add070bceb5557973029.zip
create_dump_dir: add base_dir_name parameter.
This makes python wrappers more usable. src/report-python/test_full demonstrates how pyhton programs can run reporting now. Signed-off-by: Denys Vlasenko <dvlasenk@redhat.com>
Diffstat (limited to 'src')
-rw-r--r--src/applet/test_report.c2
-rw-r--r--src/include/report/crash_dump.h2
-rw-r--r--src/lib/create_dump_dir.c35
-rw-r--r--src/report-python/common.h1
-rw-r--r--src/report-python/crash_dump.c25
-rw-r--r--src/report-python/dump_dir.c79
-rw-r--r--src/report-python/reportmodule.c3
-rw-r--r--src/report-python/run_event.c2
-rwxr-xr-xsrc/report-python/test_dd_create6
-rwxr-xr-xsrc/report-python/test_full27
10 files changed, 147 insertions, 35 deletions
diff --git a/src/applet/test_report.c b/src/applet/test_report.c
index 6361aadc..e7aac40c 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);
+ struct dump_dir *dd = create_dump_dir(crash_data, "/tmp");
free_crash_data(crash_data);
if (!dd)
return 1;
diff --git a/src/include/report/crash_dump.h b/src/include/report/crash_dump.h
index aabfa022..86cdadd0 100644
--- a/src/include/report/crash_dump.h
+++ b/src/include/report/crash_dump.h
@@ -91,7 +91,7 @@ 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);
+struct dump_dir *create_dump_dir(crash_data_t *crash_data, const char *base_dir_name);
#ifdef __cplusplus
}
diff --git a/src/lib/create_dump_dir.c b/src/lib/create_dump_dir.c
index 8735de27..2125dea4 100644
--- a/src/lib/create_dump_dir.c
+++ b/src/lib/create_dump_dir.c
@@ -19,11 +19,42 @@
#include "abrtlib.h"
-struct dump_dir *create_dump_dir(crash_data_t *crash_data)
+static struct dump_dir *try_dd_create(const char *base_dir_name, const char *dir_name)
{
- char *path = xasprintf(LOCALSTATEDIR"/run/abrt/tmp-%lu-%lu", (long)getpid(), (long)time(NULL));
+ char *path = concat_path_file(base_dir_name, dir_name);
struct dump_dir *dd = dd_create(path, getuid());
free(path);
+ return dd;
+}
+
+struct dump_dir *create_dump_dir(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));
+
+ struct dump_dir *dd;
+ if (base_dir_name)
+ dd = try_dd_create(base_dir_name, dir_name);
+ else
+ {
+ /* Try /var/run/abrt */
+ dd = try_dd_create(LOCALSTATEDIR"/run/abrt", dir_name);
+ /* Try $HOME/tmp */
+ if (!dd)
+ {
+ char *home = getenv("HOME");
+ if (home && home[0])
+ {
+ home = concat_path_file(home, "tmp");
+ /*mkdir(home, 0777); - do we want this? */
+ dd = try_dd_create(home, dir_name);
+ free(home);
+ }
+ }
+ /* Try /tmp */
+ if (!dd)
+ dd = try_dd_create("/tmp", dir_name);
+ }
if (!dd)
return NULL;
diff --git a/src/report-python/common.h b/src/report-python/common.h
index 99c311cd..f77e5a31 100644
--- a/src/report-python/common.h
+++ b/src/report-python/common.h
@@ -29,6 +29,7 @@ extern PyTypeObject p_run_event_state_type;
/* module-level functions */
PyObject *p_dd_opendir(PyObject *module, PyObject *args);
PyObject *p_dd_create(PyObject *module, PyObject *args);
+PyObject *p_delete_dump_dir(PyObject *pself, PyObject *args);
/* python objects' struct defs */
typedef struct {
diff --git a/src/report-python/crash_dump.c b/src/report-python/crash_dump.c
index 63f390b2..e6ab966c 100644
--- a/src/report-python/crash_dump.c
+++ b/src/report-python/crash_dump.c
@@ -92,14 +92,19 @@ 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); */
+/* 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)
{
p_crash_data *self = (p_crash_data*)pself;
+ const char *base_dir_name = NULL;
+ if (!PyArg_ParseTuple(args, "|s", &base_dir_name))
+ {
+ return NULL;
+ }
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);
+ struct dump_dir *dd = create_dump_dir(self->cd, base_dir_name);
if (!dd)
{
PyObject_Del((PyObject*)new_dd);
@@ -115,9 +120,10 @@ static PyObject *p_create_dump_dir(PyObject *pself, PyObject *args)
//};
static PyMethodDef p_crash_data_methods[] = {
- { "add" , p_crash_data_add, METH_VARARGS, "Adds item to the crash data" },
- { "get" , p_get_crash_data_item, METH_VARARGS, "Gets the value of item indexed by the key" },
- { "create_dump_dir", p_create_dump_dir, METH_NOARGS, "Saves the crash_data to"LOCALSTATEDIR"/run/abrt/tmp-<pid>-<time>" },
+ /* 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 },
{ NULL }
};
@@ -125,11 +131,10 @@ PyTypeObject p_crash_data_type = {
PyObject_HEAD_INIT(NULL)
.tp_name = "report.crash_data",
.tp_basicsize = sizeof(p_crash_data),
- .tp_dealloc = p_crash_data_dealloc,
.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
- .tp_doc = "crash_data objects",
- .tp_methods = p_crash_data_methods,
- //.tp_members = p_crash_data_members,
- //.tp_init = p_crash_data_init,
.tp_new = p_crash_data_new,
+ .tp_dealloc = p_crash_data_dealloc,
+ //.tp_init = p_crash_data_init,
+ //.tp_members = p_crash_data_members,
+ .tp_methods = p_crash_data_methods,
};
diff --git a/src/report-python/dump_dir.c b/src/report-python/dump_dir.c
index b207757d..04a58d31 100644
--- a/src/report-python/dump_dir.c
+++ b/src/report-python/dump_dir.c
@@ -1,8 +1,8 @@
/*
On-disk storage of crash dumps
- Copyright (C) 2009 Zdenek Prikryl (zprikryl@redhat.com)
- Copyright (C) 2009 RedHat inc.
+ Copyright (C) 2010 Abrt team
+ Copyright (C) 2010 RedHat inc.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@@ -25,14 +25,7 @@
#include "dump_dir.h"
#include "common.h"
-static void
-p_dump_dir_dealloc(PyObject *pself)
-{
- p_dump_dir *self = (p_dump_dir*)pself;
- dd_close(self->dd);
- self->dd = NULL;
- self->ob_type->tp_free(pself);
-}
+/*** init/cleanup ***/
static PyObject *
p_dump_dir_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
@@ -43,6 +36,15 @@ p_dump_dir_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
return (PyObject *)self;
}
+static void
+p_dump_dir_dealloc(PyObject *pself)
+{
+ p_dump_dir *self = (p_dump_dir*)pself;
+ dd_close(self->dd);
+ self->dd = NULL;
+ self->ob_type->tp_free(pself);
+}
+
//static int
//p_dump_dir_init(PyObject *pself, PyObject *args, PyObject *kwds)
//{
@@ -50,6 +52,8 @@ p_dump_dir_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
//}
+/*** methods ***/
+
/* void dd_close(struct dump_dir *dd); */
static PyObject *p_dd_close(PyObject *pself, PyObject *args)
{
@@ -98,7 +102,7 @@ static PyObject *p_dd_exist(PyObject *pself, PyObject *args)
/* char* dd_load_text_ext(const struct dump_dir *dd, const char *name, unsigned flags); */
/* char* dd_load_text(const struct dump_dir *dd, const char *name); */
-static PyObject *p_dd_load_text_ext(PyObject *pself, PyObject *args)
+static PyObject *p_dd_load_text(PyObject *pself, PyObject *args)
{
p_dump_dir *self = (p_dump_dir*)pself;
if (!self->dd)
@@ -157,22 +161,49 @@ static PyObject *p_dd_save_binary(PyObject *pself, PyObject *args)
Py_RETURN_NONE;
}
+
+/*** attribute getters/setters ***/
+
+static PyObject *get_name(PyObject *pself, void *unused)
+{
+ p_dump_dir *self = (p_dump_dir*)pself;
+ if (self->dd)
+ return Py_BuildValue("s", self->dd->dd_dir);
+ Py_RETURN_NONE;
+}
+
+//static PyObject *set_name(PyObject *pself, void *unused)
+//{
+// PyErr_SetString(ReportError, "dump dir name is not settable");
+// Py_RETURN_NONE;
+//}
+
+
+/*** type object ***/
+
static PyMethodDef p_dump_dir_methods[] = {
+ /* method_name, func, flags, doc_string */
{ "close" , p_dd_close, METH_NOARGS, NULL },
{ "delete" , p_dd_delete, METH_NOARGS, NULL },
{ "exist" , p_dd_exist, METH_VARARGS, NULL },
- { "load_text" , p_dd_load_text_ext, METH_VARARGS, NULL },
+ { "load_text" , p_dd_load_text, METH_VARARGS, NULL },
{ "save_text" , p_dd_save_text, METH_VARARGS, NULL },
{ "save_binary", p_dd_save_binary, METH_VARARGS, NULL },
{ NULL }
};
+static PyGetSetDef p_dump_dir_getset[] = {
+ /* attr_name, getter_func, setter_func, doc_string, void_param */
+ { "name", get_name, NULL /*set_name*/ },
+ { NULL }
+};
+
+/* Support for "dd = dd_opendir(...); if [not] dd: ..." */
static int p_dd_is_non_null(PyObject *pself)
{
p_dump_dir *self = (p_dump_dir*)pself;
return self->dd != NULL;
}
-
static PyNumberMethods p_dump_dir_number_methods = {
.nb_nonzero = p_dd_is_non_null,
};
@@ -181,17 +212,20 @@ PyTypeObject p_dump_dir_type = {
PyObject_HEAD_INIT(NULL)
.tp_name = "report.dump_dir",
.tp_basicsize = sizeof(p_dump_dir),
- .tp_dealloc = p_dump_dir_dealloc,
+ /* Py_TPFLAGS_BASETYPE means "can be subtyped": */
.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
- .tp_doc = "dump_dir objects",
- .tp_methods = p_dump_dir_methods,
- //.tp_members = p_dump_dir_members,
- //.tp_init = p_dump_dir_init,
.tp_new = p_dump_dir_new,
+ .tp_dealloc = p_dump_dir_dealloc,
+ //.tp_init = p_dump_dir_init,
+ //.tp_members = p_dump_dir_members,
+ .tp_methods = p_dump_dir_methods,
.tp_as_number = &p_dump_dir_number_methods,
+ .tp_getset = p_dump_dir_getset,
};
+/*** module-level functions ***/
+
/* struct dump_dir *dd_opendir(const char *dir, int flags); */
PyObject *p_dd_opendir(PyObject *module, PyObject *args)
{
@@ -221,4 +255,11 @@ PyObject *p_dd_create(PyObject *module, PyObject *args)
}
/* void delete_dump_dir(const char *dd_dir); */
-//static PyObject *p_delete_dump_dir(PyObject *pself, PyObject *args);
+PyObject *p_delete_dump_dir(PyObject *pself, PyObject *args)
+{
+ const char *dir;
+ if (!PyArg_ParseTuple(args, "s", &dir))
+ return NULL;
+ delete_dump_dir(dir);
+ Py_RETURN_NONE;
+}
diff --git a/src/report-python/reportmodule.c b/src/report-python/reportmodule.c
index db9f52d9..13184cc0 100644
--- a/src/report-python/reportmodule.c
+++ b/src/report-python/reportmodule.c
@@ -22,9 +22,10 @@
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 },
+ { "delete_dump_dir", p_delete_dump_dir, METH_VARARGS, NULL },
{ NULL }
};
diff --git a/src/report-python/run_event.c b/src/report-python/run_event.c
index 8923fd7c..0bef3b21 100644
--- a/src/report-python/run_event.c
+++ b/src/report-python/run_event.c
@@ -31,7 +31,7 @@ typedef struct {
} p_run_event_state;
-/*** initialization/freeing code ***/
+/*** init/cleanup ***/
static int post_run_callback(const char *dump_dir_name, void *param);
static char *logging_callback(char *log_line, void *param);
diff --git a/src/report-python/test_dd_create b/src/report-python/test_dd_create
index 71ab8de5..2ac97924 100755
--- a/src/report-python/test_dd_create
+++ b/src/report-python/test_dd_create
@@ -10,6 +10,7 @@ if dd:
else:
print "dd is zero"
+print "name:", dd.name
print "closing"
dd.close()
@@ -17,3 +18,8 @@ if dd:
print "dd is nonzero"
else:
print "dd is zero"
+
+# Should fail here
+dd.name = "qwe"
+
+print "Done"
diff --git a/src/report-python/test_full b/src/report-python/test_full
new file mode 100755
index 00000000..a9f32034
--- /dev/null
+++ b/src/report-python/test_full
@@ -0,0 +1,27 @@
+#!/usr/bin/python
+
+import sys
+from report import *
+
+def run_event_on_crash_data(cd, event, log_function = None):
+ dd = cd.create_dump_dir("/tmp")
+ dir_name = dd.name
+ print "Created dump_dir:", dir_name
+ dd.close()
+ run_state = run_event_state()
+ 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)
+ print "Deleting:", dir_name
+ delete_dump_dir(dir_name)
+ return r;
+
+def log_function(line):
+ print "LOG:", line
+
+cd = crash_data()
+cd.add("foo", "bar")
+cd.add("analyzer", "baz")
+r = run_event_on_crash_data(cd, "post-create", log_function)
+print "Result:", r