diff options
author | Denys Vlasenko <dvlasenk@redhat.com> | 2010-12-16 18:28:07 +0100 |
---|---|---|
committer | Denys Vlasenko <dvlasenk@redhat.com> | 2010-12-16 18:28:07 +0100 |
commit | 628fb1fbae2a9e3e8fc3add070bceb5557973029 (patch) | |
tree | 7e46ad228722cf5b6e7f4b54b9100d6cf638a135 /src | |
parent | 93d5d8a317ec9294bbd6dcc6bd8baec0c2b63b1b (diff) | |
download | abrt-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.c | 2 | ||||
-rw-r--r-- | src/include/report/crash_dump.h | 2 | ||||
-rw-r--r-- | src/lib/create_dump_dir.c | 35 | ||||
-rw-r--r-- | src/report-python/common.h | 1 | ||||
-rw-r--r-- | src/report-python/crash_dump.c | 25 | ||||
-rw-r--r-- | src/report-python/dump_dir.c | 79 | ||||
-rw-r--r-- | src/report-python/reportmodule.c | 3 | ||||
-rw-r--r-- | src/report-python/run_event.c | 2 | ||||
-rwxr-xr-x | src/report-python/test_dd_create | 6 | ||||
-rwxr-xr-x | src/report-python/test_full | 27 |
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 |