return -1;
}
+
+PyDoc_STRVAR(module__doc__,
+ "Class to reads the systemd journal similar to journalctl.");
+
+
#if PY_MAJOR_VERSION >= 3
static PyTypeObject MonotonicType;
};
#endif
+
static void Reader_dealloc(Reader* self)
{
sd_journal_close(self->j);
return set_error(r, path, "Invalid flags or path");
}
+
PyDoc_STRVAR(Reader_fileno__doc__,
"fileno() -> int\n\n"
"Get a file descriptor to poll for changes in the journal.\n"
return long_FromLong(r);
}
+
PyDoc_STRVAR(Reader_reliable_fd__doc__,
"reliable_fd() -> bool\n\n"
"Returns True iff the journal can be polled reliably.\n"
return PyBool_FromLong(r);
}
+
PyDoc_STRVAR(Reader_close__doc__,
"close() -> None\n\n"
"Free resources allocated by this Reader object.\n"
Py_RETURN_NONE;
}
+
PyDoc_STRVAR(Reader___enter____doc__,
"__enter__() -> self\n\n"
"Part of the context manager protocol.\n"
Py_RETURN_NONE;
}
+
PyDoc_STRVAR(Reader_get_next__doc__,
"get_next([skip]) -> dict\n\n"
"Return dictionary of the next log entry. Optional skip value will\n"
int64_t skip = 1LL;
int r;
- if (!PyArg_ParseTuple(args, "|L", &skip))
+ if (!PyArg_ParseTuple(args, "|L:_Reader.get_next", &skip))
return NULL;
if (skip == 0LL) {
return NULL;
}
+
PyDoc_STRVAR(Reader_get_previous__doc__,
"get_previous([skip]) -> dict\n\n"
"Return dictionary of the previous log entry. Optional skip value\n"
static PyObject* Reader_get_previous(Reader *self, PyObject *args)
{
int64_t skip = 1LL;
- if (!PyArg_ParseTuple(args, "|L", &skip))
+ if (!PyArg_ParseTuple(args, "|L:_Reader.get_previous", &skip))
return NULL;
return PyObject_CallMethod((PyObject *)self, (char*) "get_next",
(char*) "L", -skip);
}
+
PyDoc_STRVAR(Reader_add_match__doc__,
"add_match(match) -> None\n\n"
"Add a match to filter journal log entries. All matches of different\n"
{
char *match;
int match_len, r;
- if (!PyArg_ParseTuple(args, "s#", &match, &match_len))
+ if (!PyArg_ParseTuple(args, "s#:_Reader.add_match", &match, &match_len))
return NULL;
r = sd_journal_add_match(self->j, match, match_len);
Py_RETURN_NONE;
}
+
PyDoc_STRVAR(Reader_add_disjunction__doc__,
"add_disjunction() -> None\n\n"
"Inserts a logical OR between matches added before and afterwards.");
Py_RETURN_NONE;
}
+
PyDoc_STRVAR(Reader_flush_matches__doc__,
"flush_matches() -> None\n\n"
"Clear all current match filters.");
Py_RETURN_NONE;
}
+
PyDoc_STRVAR(Reader_seek_head__doc__,
"seek_head() -> None\n\n"
"Jump to the beginning of the journal.\n"
Py_RETURN_NONE;
}
+
PyDoc_STRVAR(Reader_seek_tail__doc__,
"seek_tail() -> None\n\n"
"Jump to the end of the journal.\n"
Py_RETURN_NONE;
}
+
PyDoc_STRVAR(Reader_seek_realtime__doc__,
"seek_realtime(realtime) -> None\n\n"
"Seek to nearest matching journal entry to `realtime`. Argument\n"
uint64_t timestamp;
int r;
- if (!PyArg_ParseTuple(args, "d", &timedouble))
+ if (!PyArg_ParseTuple(args, "d:_Reader.seek_realtime", &timedouble))
return NULL;
timestamp = (uint64_t) (timedouble * 1.0E6);
Py_RETURN_NONE;
}
+
PyDoc_STRVAR(Reader_seek_monotonic__doc__,
"seek_monotonic(monotonic[, bootid]) -> None\n\n"
"Seek to nearest matching journal entry to `monotonic`. Argument\n"
sd_id128_t id;
int r;
- if (!PyArg_ParseTuple(args, "d|z", &timedouble, &bootid))
+ if (!PyArg_ParseTuple(args, "d|z:_Reader.seek_monotonic", &timedouble, &bootid))
return NULL;
timestamp = (uint64_t) (timedouble * 1.0E6);
Py_RETURN_NONE;
}
+
PyDoc_STRVAR(Reader_wait__doc__,
"wait([timeout]) -> state change (integer)\n\n"
"Wait for a change in the journal. Argument `timeout` specifies\n"
int r;
int64_t timeout = 0LL;
- if (!PyArg_ParseTuple(args, "|L", &timeout))
+ if (!PyArg_ParseTuple(args, "|L:_Reader.wait", &timeout))
return NULL;
Py_BEGIN_ALLOW_THREADS
return long_FromLong(r);
}
+
PyDoc_STRVAR(Reader_seek_cursor__doc__,
"seek_cursor(cursor) -> None\n\n"
"Seek to journal entry by given unique reference `cursor`.");
const char *cursor;
int r;
- if (!PyArg_ParseTuple(args, "s", &cursor))
+ if (!PyArg_ParseTuple(args, "s:_Reader.seek_cursor", &cursor))
return NULL;
Py_BEGIN_ALLOW_THREADS
Py_RETURN_NONE;
}
+
static PyObject* Reader_iter(PyObject *self)
{
Py_INCREF(self);
}
}
+
PyDoc_STRVAR(Reader_query_unique__doc__,
"query_unique(field) -> a set of values\n\n"
"Return a set of unique values appearing in journal for the\n"
size_t uniq_len;
PyObject *value_set, *key, *value;
- if (!PyArg_ParseTuple(args, "s", &query))
+ if (!PyArg_ParseTuple(args, "s:_Reader.query_unique", &query))
return NULL;
Py_BEGIN_ALLOW_THREADS
return value_set;
}
+
+PyDoc_STRVAR(Reader_get_catalog__doc__,
+ "get_catalog() -> str\n\n"
+ "Retrieve a message catalog entry for the current journal entry.\n"
+ "Wraps man:sd_journal_get_catalog(3).");
+static PyObject* Reader_get_catalog(Reader *self, PyObject *args)
+{
+ int r;
+ char _cleanup_free_ *msg = NULL;
+
+ assert(self);
+ assert(!args);
+
+ Py_BEGIN_ALLOW_THREADS
+ r = sd_journal_get_catalog(self->j, &msg);
+ Py_END_ALLOW_THREADS
+ if (set_error(r, NULL, NULL))
+ return NULL;
+
+ return unicode_FromString(msg);
+}
+
+
+PyDoc_STRVAR(get_catalog__doc__,
+ "get_catalog(id128) -> str\n\n"
+ "Retrieve a message catalog entry for the given id.\n"
+ "Wraps man:sd_journal_get_catalog_for_message_id(3).");
+static PyObject* get_catalog(PyObject *self, PyObject *args)
+{
+ int r;
+ char *id_ = NULL;
+ sd_id128_t id;
+ char _cleanup_free_ *msg = NULL;
+
+ assert(!self);
+ assert(args);
+
+ if (!PyArg_ParseTuple(args, "z:get_catalog", &id_))
+ return NULL;
+
+ r = sd_id128_from_string(id_, &id);
+ if (set_error(r, NULL, "Invalid id128"))
+ return NULL;
+
+ Py_BEGIN_ALLOW_THREADS
+ r = sd_journal_get_catalog_for_message_id(id, &msg);
+ Py_END_ALLOW_THREADS
+ if (set_error(r, NULL, NULL))
+ return NULL;
+
+ return unicode_FromString(msg);
+}
+
+
PyDoc_STRVAR(data_threshold__doc__,
"Threshold for field size truncation in bytes.\n\n"
"Fields longer than this will be truncated to the threshold size.\n"
return set_error(r, NULL, NULL);
}
+
PyDoc_STRVAR(closed__doc__,
"True iff journal is closed");
static PyObject* Reader_get_closed(Reader *self, void *closure)
return PyBool_FromLong(self->j == NULL);
}
+
static PyGetSetDef Reader_getsetters[] = {
{(char*) "data_threshold",
(getter) Reader_get_data_threshold,
{"wait", (PyCFunction) Reader_wait, METH_VARARGS, Reader_wait__doc__},
{"seek_cursor", (PyCFunction) Reader_seek_cursor, METH_VARARGS, Reader_seek_cursor__doc__},
{"query_unique", (PyCFunction) Reader_query_unique, METH_VARARGS, Reader_query_unique__doc__},
+ {"get_catalog", (PyCFunction) Reader_get_catalog, METH_NOARGS, Reader_get_catalog__doc__},
{NULL} /* Sentinel */
};
PyType_GenericNew, /* tp_new */
};
-#define SUMMARY \
- "Module that reads the systemd journal similar to journalctl."
+static PyMethodDef methods[] = {
+ { "get_catalog", get_catalog, METH_VARARGS, get_catalog__doc__},
+ { NULL, NULL, 0, NULL } /* Sentinel */
+};
#if PY_MAJOR_VERSION >= 3
-static PyModuleDef _reader_module = {
+static PyModuleDef module = {
PyModuleDef_HEAD_INIT,
"_reader",
- SUMMARY,
+ module__doc__,
-1,
- NULL, NULL, NULL, NULL, NULL
+ methods,
+ NULL, NULL, NULL, NULL
};
#endif
#endif
#if PY_MAJOR_VERSION >= 3
- m = PyModule_Create(&_reader_module);
+ m = PyModule_Create(&module);
if (m == NULL)
return NULL;
initialized = true;
}
#else
- m = Py_InitModule3("_reader", NULL, SUMMARY);
+ m = Py_InitModule3("_reader", methods, module__doc__);
if (m == NULL)
return;
#endif