chiark / gitweb /
journal: add ability to filter by current user
authorZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Wed, 5 Jun 2013 02:31:05 +0000 (22:31 -0400)
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Mon, 10 Jun 2013 14:10:06 +0000 (10:10 -0400)
This is the just the library part.

SD_JOURNAL_CURRENT_USER flags is added to sd_j_open(), to open
files from current user.

SD_JOURNAL_SYSTEM_ONLY is renamed to SD_JOURNAL_SYSTEM,
and changed to mean to (also) open system files. This way various
flags can be combined, which gives them nicer semantics, especially
if other ones are added later.

Backwards compatibility is kept, because SD_JOURNAL_SYSTEM_ONLY
is equivalent to SD_JOURNAL_SYSTEM if used alone, and before there
we no other flags.

Makefile-man.am
man/sd_journal_open.xml
src/journal/journal-gatewayd.c
src/journal/sd-journal.c
src/python-systemd/_reader.c
src/shared/logs-show.c
src/systemd/sd-journal.h

index 58881586cf973273e8178114ab6ffb971ff3fd53..a31427e9b9a5bde85aa9a2696900bf6cbfb143ee 100644 (file)
@@ -107,6 +107,7 @@ MANPAGES_ALIAS += \
        man/SD_ID128_MAKE.3 \
        man/SD_INFO.3 \
        man/SD_JOURNAL_APPEND.3 \
+       man/SD_JOURNAL_CURRENT_USER.3 \
        man/SD_JOURNAL_FOREACH.3 \
        man/SD_JOURNAL_FOREACH_BACKWARDS.3 \
        man/SD_JOURNAL_FOREACH_DATA.3 \
@@ -116,6 +117,7 @@ MANPAGES_ALIAS += \
        man/SD_JOURNAL_NOP.3 \
        man/SD_JOURNAL_RUNTIME_ONLY.3 \
        man/SD_JOURNAL_SUPPRESS_LOCATION.3 \
+       man/SD_JOURNAL_SYSTEM.3 \
        man/SD_JOURNAL_SYSTEM_ONLY.3 \
        man/SD_LISTEN_FDS_START.3 \
        man/SD_NOTICE.3 \
@@ -205,6 +207,7 @@ man/SD_ID128_FORMAT_VAL.3: man/sd-id128.3
 man/SD_ID128_MAKE.3: man/sd-id128.3
 man/SD_INFO.3: man/sd-daemon.3
 man/SD_JOURNAL_APPEND.3: man/sd_journal_get_fd.3
+man/SD_JOURNAL_CURRENT_USER.3: man/sd_journal_open.3
 man/SD_JOURNAL_FOREACH.3: man/sd_journal_next.3
 man/SD_JOURNAL_FOREACH_BACKWARDS.3: man/sd_journal_next.3
 man/SD_JOURNAL_FOREACH_DATA.3: man/sd_journal_get_data.3
@@ -214,6 +217,7 @@ man/SD_JOURNAL_LOCAL_ONLY.3: man/sd_journal_open.3
 man/SD_JOURNAL_NOP.3: man/sd_journal_get_fd.3
 man/SD_JOURNAL_RUNTIME_ONLY.3: man/sd_journal_open.3
 man/SD_JOURNAL_SUPPRESS_LOCATION.3: man/sd_journal_print.3
+man/SD_JOURNAL_SYSTEM.3: man/sd_journal_open.3
 man/SD_JOURNAL_SYSTEM_ONLY.3: man/sd_journal_open.3
 man/SD_LISTEN_FDS_START.3: man/sd_listen_fds.3
 man/SD_NOTICE.3: man/sd-daemon.3
@@ -325,6 +329,9 @@ man/SD_INFO.html: man/sd-daemon.html
 man/SD_JOURNAL_APPEND.html: man/sd_journal_get_fd.html
        $(html-alias)
 
+man/SD_JOURNAL_CURRENT_USER.html: man/sd_journal_open.html
+       $(html-alias)
+
 man/SD_JOURNAL_FOREACH.html: man/sd_journal_next.html
        $(html-alias)
 
@@ -352,6 +359,9 @@ man/SD_JOURNAL_RUNTIME_ONLY.html: man/sd_journal_open.html
 man/SD_JOURNAL_SUPPRESS_LOCATION.html: man/sd_journal_print.html
        $(html-alias)
 
+man/SD_JOURNAL_SYSTEM.html: man/sd_journal_open.html
+       $(html-alias)
+
 man/SD_JOURNAL_SYSTEM_ONLY.html: man/sd_journal_open.html
        $(html-alias)
 
index 76b857b9916e7a0faf194d4a47f067a02701d2b8..dd2f32d81ad2586d826681b09b3df28c59407c9d 100644 (file)
@@ -49,7 +49,8 @@
                 <refname>sd_journal</refname>
                 <refname>SD_JOURNAL_LOCAL_ONLY</refname>
                 <refname>SD_JOURNAL_RUNTIME_ONLY</refname>
-                <refname>SD_JOURNAL_SYSTEM_ONLY</refname>
+                <refname>SD_JOURNAL_SYSTEM</refname>
+                <refname>SD_JOURNAL_CURRENT_USER</refname>
                 <refpurpose>Open the system journal for reading</refpurpose>
         </refnamediv>
 
                 be opened. <literal>SD_JOURNAL_RUNTIME_ONLY</literal>
                 makes sure only volatile journal files will be opened,
                 excluding those which are stored on persistent
-                storage. <literal>SD_JOURNAL_SYSTEM_ONLY</literal>
-                will ensure that only journal files of system services
-                and the kernel (in opposition to user session processes) will
-                be opened.</para>
+                storage. <literal>SD_JOURNAL_SYSTEM</literal>
+                will cause journal files of system services and the
+                kernel (in opposition to user session processes) to
+                be opened. <literal>SD_JOURNAL_CURRENT_USER</literal>
+                will cause journal files of the current user to be
+                opened. If neither <literal>SD_JOURNAL_SYSTEM</literal>
+                nor <literal>SD_JOURNAL_CURRENT_USER</literal> are
+                specified, all journal file types will be opened.</para>
 
                 <para><function>sd_journal_open_directory()</function>
                 is similar to <function>sd_journal_open()</function>
                 file.</para>
         </refsect1>
 
+        <refsect1>
+                <title>History</title>
+
+                <para><function>sd_journal_open()</function>,
+                <function>sd_journal_close()</function>,
+                <literal>SD_JOURNAL_LOCAL_ONLY</literal>,
+                <literal>SD_JOURNAL_RUNTIME_ONLY</literal>,
+                <literal>SD_JOURNAL_SYSTEM_ONLY</literal> were added
+                in systemd-38.</para>
+
+                <para><function>sd_journal_open_directory()</function>
+                was added in systemd-187.</para>
+
+                <para><literal>SD_JOURNAL_SYSTEM</literal> and
+                <literal>SD_JOURNAL_CURRENT_USER</literal> were added
+                in systemd-205.
+                <literal>SD_JOURNAL_SYSTEM_ONLY</literal>
+                was deprecated.</para>
+        </refsect1>
+
         <refsect1>
                 <title>See Also</title>
 
index 745f45f932c1b78ffa2ccc6c79e8de282307058d..86338c66f33e1493062f82aefb3c2981d4b5391d 100644 (file)
@@ -109,7 +109,7 @@ static int open_journal(RequestMeta *m) {
         if (m->journal)
                 return 0;
 
-        return sd_journal_open(&m->journal, SD_JOURNAL_LOCAL_ONLY|SD_JOURNAL_SYSTEM_ONLY);
+        return sd_journal_open(&m->journal, SD_JOURNAL_LOCAL_ONLY|SD_JOURNAL_SYSTEM);
 }
 
 static int respond_oom_internal(struct MHD_Connection *connection) {
index 2bad243ea115dc08919af662f49cc47b45488911..46511df6be0dfc145ed98cd264b263c64a48d66c 100644 (file)
@@ -1249,6 +1249,42 @@ static void check_network(sd_journal *j, int fd) {
                 F_TYPE_CMP(sfs.f_type, SMB_SUPER_MAGIC);
 }
 
+static bool file_has_type_prefix(const char *prefix, const char *filename) {
+        const char *full, *tilded, *atted;
+
+        full = strappend(prefix, ".journal");
+        tilded = strappenda(full, "~");
+        atted = strappenda(prefix, "@");
+
+        return streq(filename, full) ||
+               streq(filename, tilded) ||
+               startswith(filename, atted);
+}
+
+static bool file_type_wanted(int flags, const char *filename) {
+        if (!endswith(filename, ".journal") && !endswith(filename, ".journal~"))
+                return false;
+
+        /* no flags set → every type is OK */
+        if (!(flags & (SD_JOURNAL_SYSTEM | SD_JOURNAL_CURRENT_USER)))
+                return true;
+
+        if (flags & SD_JOURNAL_SYSTEM && file_has_type_prefix("system", filename))
+                return true;
+
+        if (flags & SD_JOURNAL_CURRENT_USER) {
+                char prefix[5 + DECIMAL_STR_MAX(uid_t) + 1];
+
+                assert_se(snprintf(prefix, sizeof(prefix), "user-%lu", (unsigned long) getuid())
+                          < (int) sizeof(prefix));
+
+                if (file_has_type_prefix(prefix, filename))
+                        return true;
+        }
+
+        return false;
+}
+
 static int add_file(sd_journal *j, const char *prefix, const char *filename) {
         _cleanup_free_ char *path = NULL;
         int r;
@@ -1258,11 +1294,7 @@ static int add_file(sd_journal *j, const char *prefix, const char *filename) {
         assert(prefix);
         assert(filename);
 
-        if ((j->flags & SD_JOURNAL_SYSTEM_ONLY) &&
-            !(streq(filename, "system.journal") ||
-              streq(filename, "system.journal~") ||
-              (startswith(filename, "system@") &&
-               (endswith(filename, ".journal") || endswith(filename, ".journal~")))))
+        if (!file_type_wanted(j->flags, filename))
                 return 0;
 
         path = strjoin(prefix, "/", filename, NULL);
@@ -1619,7 +1651,8 @@ _public_ int sd_journal_open(sd_journal **ret, int flags) {
 
         if (flags & ~(SD_JOURNAL_LOCAL_ONLY|
                       SD_JOURNAL_RUNTIME_ONLY|
-                      SD_JOURNAL_SYSTEM_ONLY))
+                      SD_JOURNAL_SYSTEM|
+                      SD_JOURNAL_CURRENT_USER))
                 return -EINVAL;
 
         j = journal_new(flags, NULL);
index c4c4fdfe1d19ddc29a2c4b3ab8c027997739ee42..2c699630c27d13ec997a0f31abc777b3f64b3ac0 100644 (file)
@@ -1097,6 +1097,7 @@ init_reader(void)
         PyModule_AddIntConstant(m, "INVALIDATE", SD_JOURNAL_INVALIDATE) ||
         PyModule_AddIntConstant(m, "LOCAL_ONLY", SD_JOURNAL_LOCAL_ONLY) ||
         PyModule_AddIntConstant(m, "RUNTIME_ONLY", SD_JOURNAL_RUNTIME_ONLY) ||
+        PyModule_AddIntConstant(m, "SYSTEM", SD_JOURNAL_SYSTEM) ||
         PyModule_AddIntConstant(m, "SYSTEM_ONLY", SD_JOURNAL_SYSTEM_ONLY) ||
         PyModule_AddStringConstant(m, "__version__", PACKAGE_VERSION)) {
 #if PY_MAJOR_VERSION >= 3
index 7947df3a89e90354c04aad2bbed399977f0b1709..013a281eacdf8627cd5c2cee45ea95c96d294a0e 100644 (file)
@@ -1010,7 +1010,7 @@ int show_journal_by_unit(
 
         _cleanup_journal_close_ sd_journal*j = NULL;
         int r;
-        int jflags = SD_JOURNAL_LOCAL_ONLY | system * SD_JOURNAL_SYSTEM_ONLY;
+        int jflags = SD_JOURNAL_LOCAL_ONLY | system * SD_JOURNAL_SYSTEM;
 
         assert(mode >= 0);
         assert(mode < _OUTPUT_MODE_MAX);
index 5375d49963bf63f7416c5f994e32a5c3193406fe..cf105cde72682503bfb05d85ff8457c7a87f7dc4 100644 (file)
@@ -86,7 +86,9 @@ typedef struct sd_journal sd_journal;
 enum {
         SD_JOURNAL_LOCAL_ONLY = 1,
         SD_JOURNAL_RUNTIME_ONLY = 2,
-        SD_JOURNAL_SYSTEM_ONLY = 4
+        SD_JOURNAL_SYSTEM = 4,
+        SD_JOURNAL_SYSTEM_ONLY = SD_JOURNAL_SYSTEM, /* deprecated */
+        SD_JOURNAL_CURRENT_USER = 8,
 };
 
 /* Wakeup event types */