mirror of
https://github.com/systemd/systemd-stable.git
synced 2025-01-12 09:17:44 +03:00
Merge pull request #3946 from keszybz/open-journal-root
Make journalctl more flexible
This commit is contained in:
commit
622a0f628c
@ -659,10 +659,12 @@
|
|||||||
<term><option>--root=<replaceable>ROOT</replaceable></option></term>
|
<term><option>--root=<replaceable>ROOT</replaceable></option></term>
|
||||||
|
|
||||||
<listitem><para>Takes a directory path as an argument. If
|
<listitem><para>Takes a directory path as an argument. If
|
||||||
specified, journalctl will operate on catalog file hierarchy
|
specified, journalctl will operate on journal directories and catalog file hierarchy
|
||||||
underneath the specified directory instead of the root
|
underneath the specified directory instead of the root
|
||||||
directory (e.g. <option>--update-catalog</option> will create
|
directory (e.g. <option>--update-catalog</option> will create
|
||||||
<filename><replaceable>ROOT</replaceable>/var/lib/systemd/catalog/database</filename>).
|
<filename><replaceable>ROOT</replaceable>/var/lib/systemd/catalog/database</filename>,
|
||||||
|
and journal files under <filename><replaceable>ROOT</replaceable>/run/journal</filename>
|
||||||
|
or <filename><replaceable>ROOT</replaceable>/var/log/journal</filename> will be displayed).
|
||||||
</para></listitem>
|
</para></listitem>
|
||||||
</varlistentry>
|
</varlistentry>
|
||||||
|
|
||||||
|
@ -129,10 +129,13 @@
|
|||||||
|
|
||||||
<para><function>sd_journal_open_directory()</function> is similar to <function>sd_journal_open()</function> but
|
<para><function>sd_journal_open_directory()</function> is similar to <function>sd_journal_open()</function> but
|
||||||
takes an absolute directory path as argument. All journal files in this directory will be opened and interleaved
|
takes an absolute directory path as argument. All journal files in this directory will be opened and interleaved
|
||||||
automatically. This call also takes a flags argument. The only flags parameter accepted by this call is
|
automatically. This call also takes a flags argument. The flags parameters accepted by this call are
|
||||||
<constant>SD_JOURNAL_OS_ROOT</constant>. If specified, the journal files are searched below the usual
|
<constant>SD_JOURNAL_OS_ROOT</constant>, <constant>SD_JOURNAL_SYSTEM</constant>, and
|
||||||
<filename>/var/log/journal</filename> and <filename>/run/log/journal</filename> relative to the specified path,
|
<constant>SD_JOURNAL_CURRENT_USER</constant>. If <constant>SD_JOURNAL_OS_ROOT</constant> is specified, journal
|
||||||
instead of directly beneath it.</para>
|
files are searched for below the usual <filename>/var/log/journal</filename> and
|
||||||
|
<filename>/run/log/journal</filename> relative to the specified path, instead of directly beneath it.
|
||||||
|
The other two flags limit which files are opened, the same as for <function>sd_journal_open()</function>.
|
||||||
|
</para>
|
||||||
|
|
||||||
<para><function>sd_journal_open_directory_fd()</function> is similar to
|
<para><function>sd_journal_open_directory_fd()</function> is similar to
|
||||||
<function>sd_journal_open_directory()</function>, but takes a file descriptor referencing a directory in the file
|
<function>sd_journal_open_directory()</function>, but takes a file descriptor referencing a directory in the file
|
||||||
|
@ -310,7 +310,7 @@ static void help(void) {
|
|||||||
" -m --merge Show entries from all available journals\n"
|
" -m --merge Show entries from all available journals\n"
|
||||||
" -D --directory=PATH Show journal files from directory\n"
|
" -D --directory=PATH Show journal files from directory\n"
|
||||||
" --file=PATH Show journal file\n"
|
" --file=PATH Show journal file\n"
|
||||||
" --root=ROOT Operate on catalog files below a root directory\n"
|
" --root=ROOT Operate on files below a root directory\n"
|
||||||
#ifdef HAVE_GCRYPT
|
#ifdef HAVE_GCRYPT
|
||||||
" --interval=TIME Time interval for changing the FSS sealing key\n"
|
" --interval=TIME Time interval for changing the FSS sealing key\n"
|
||||||
" --verify-key=KEY Specify FSS verification key\n"
|
" --verify-key=KEY Specify FSS verification key\n"
|
||||||
@ -848,8 +848,8 @@ static int parse_argv(int argc, char *argv[]) {
|
|||||||
if (arg_follow && !arg_no_tail && !arg_since && arg_lines == ARG_LINES_DEFAULT)
|
if (arg_follow && !arg_no_tail && !arg_since && arg_lines == ARG_LINES_DEFAULT)
|
||||||
arg_lines = 10;
|
arg_lines = 10;
|
||||||
|
|
||||||
if (!!arg_directory + !!arg_file + !!arg_machine > 1) {
|
if (!!arg_directory + !!arg_file + !!arg_machine + !!arg_root > 1) {
|
||||||
log_error("Please specify either -D/--directory= or --file= or -M/--machine=, not more than one.");
|
log_error("Please specify at most one of -D/--directory=, --file=, -M/--machine=, --root.");
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1267,7 +1267,7 @@ static int add_boot(sd_journal *j) {
|
|||||||
* We can do this only when we logs are coming from the current machine,
|
* We can do this only when we logs are coming from the current machine,
|
||||||
* so take the slow path if log location is specified. */
|
* so take the slow path if log location is specified. */
|
||||||
if (arg_boot_offset == 0 && sd_id128_is_null(arg_boot_id) &&
|
if (arg_boot_offset == 0 && sd_id128_is_null(arg_boot_id) &&
|
||||||
!arg_directory && !arg_file)
|
!arg_directory && !arg_file && !arg_root)
|
||||||
|
|
||||||
return add_match_this_boot(j, arg_machine);
|
return add_match_this_boot(j, arg_machine);
|
||||||
|
|
||||||
@ -2161,6 +2161,8 @@ int main(int argc, char *argv[]) {
|
|||||||
|
|
||||||
if (arg_directory)
|
if (arg_directory)
|
||||||
r = sd_journal_open_directory(&j, arg_directory, arg_journal_type);
|
r = sd_journal_open_directory(&j, arg_directory, arg_journal_type);
|
||||||
|
else if (arg_root)
|
||||||
|
r = sd_journal_open_directory(&j, arg_root, arg_journal_type | SD_JOURNAL_OS_ROOT);
|
||||||
else if (arg_file_stdin) {
|
else if (arg_file_stdin) {
|
||||||
int ifd = STDIN_FILENO;
|
int ifd = STDIN_FILENO;
|
||||||
r = sd_journal_open_files_fd(&j, &ifd, 1, 0);
|
r = sd_journal_open_files_fd(&j, &ifd, 1, 0);
|
||||||
|
@ -1719,9 +1719,16 @@ static sd_journal *journal_new(int flags, const char *path) {
|
|||||||
j->data_threshold = DEFAULT_DATA_THRESHOLD;
|
j->data_threshold = DEFAULT_DATA_THRESHOLD;
|
||||||
|
|
||||||
if (path) {
|
if (path) {
|
||||||
j->path = strdup(path);
|
char *t;
|
||||||
if (!j->path)
|
|
||||||
|
t = strdup(path);
|
||||||
|
if (!t)
|
||||||
goto fail;
|
goto fail;
|
||||||
|
|
||||||
|
if (flags & SD_JOURNAL_OS_ROOT)
|
||||||
|
j->prefix = t;
|
||||||
|
else
|
||||||
|
j->path = t;
|
||||||
}
|
}
|
||||||
|
|
||||||
j->files = ordered_hashmap_new(&string_hash_ops);
|
j->files = ordered_hashmap_new(&string_hash_ops);
|
||||||
@ -1737,12 +1744,17 @@ fail:
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define OPEN_ALLOWED_FLAGS \
|
||||||
|
(SD_JOURNAL_LOCAL_ONLY | \
|
||||||
|
SD_JOURNAL_RUNTIME_ONLY | \
|
||||||
|
SD_JOURNAL_SYSTEM | SD_JOURNAL_CURRENT_USER)
|
||||||
|
|
||||||
_public_ int sd_journal_open(sd_journal **ret, int flags) {
|
_public_ int sd_journal_open(sd_journal **ret, int flags) {
|
||||||
sd_journal *j;
|
sd_journal *j;
|
||||||
int r;
|
int r;
|
||||||
|
|
||||||
assert_return(ret, -EINVAL);
|
assert_return(ret, -EINVAL);
|
||||||
assert_return((flags & ~(SD_JOURNAL_LOCAL_ONLY|SD_JOURNAL_RUNTIME_ONLY|SD_JOURNAL_SYSTEM|SD_JOURNAL_CURRENT_USER)) == 0, -EINVAL);
|
assert_return((flags & ~OPEN_ALLOWED_FLAGS) == 0, -EINVAL);
|
||||||
|
|
||||||
j = journal_new(flags, NULL);
|
j = journal_new(flags, NULL);
|
||||||
if (!j)
|
if (!j)
|
||||||
@ -1761,6 +1773,9 @@ fail:
|
|||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define OPEN_CONTAINER_ALLOWED_FLAGS \
|
||||||
|
(SD_JOURNAL_LOCAL_ONLY | SD_JOURNAL_SYSTEM)
|
||||||
|
|
||||||
_public_ int sd_journal_open_container(sd_journal **ret, const char *machine, int flags) {
|
_public_ int sd_journal_open_container(sd_journal **ret, const char *machine, int flags) {
|
||||||
_cleanup_free_ char *root = NULL, *class = NULL;
|
_cleanup_free_ char *root = NULL, *class = NULL;
|
||||||
sd_journal *j;
|
sd_journal *j;
|
||||||
@ -1772,7 +1787,7 @@ _public_ int sd_journal_open_container(sd_journal **ret, const char *machine, in
|
|||||||
|
|
||||||
assert_return(machine, -EINVAL);
|
assert_return(machine, -EINVAL);
|
||||||
assert_return(ret, -EINVAL);
|
assert_return(ret, -EINVAL);
|
||||||
assert_return((flags & ~(SD_JOURNAL_LOCAL_ONLY|SD_JOURNAL_SYSTEM)) == 0, -EINVAL);
|
assert_return((flags & ~OPEN_CONTAINER_ALLOWED_FLAGS) == 0, -EINVAL);
|
||||||
assert_return(machine_name_is_valid(machine), -EINVAL);
|
assert_return(machine_name_is_valid(machine), -EINVAL);
|
||||||
|
|
||||||
p = strjoina("/run/systemd/machines/", machine);
|
p = strjoina("/run/systemd/machines/", machine);
|
||||||
@ -1787,13 +1802,10 @@ _public_ int sd_journal_open_container(sd_journal **ret, const char *machine, in
|
|||||||
if (!streq_ptr(class, "container"))
|
if (!streq_ptr(class, "container"))
|
||||||
return -EIO;
|
return -EIO;
|
||||||
|
|
||||||
j = journal_new(flags, NULL);
|
j = journal_new(flags, root);
|
||||||
if (!j)
|
if (!j)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
||||||
j->prefix = root;
|
|
||||||
root = NULL;
|
|
||||||
|
|
||||||
r = add_search_paths(j);
|
r = add_search_paths(j);
|
||||||
if (r < 0)
|
if (r < 0)
|
||||||
goto fail;
|
goto fail;
|
||||||
@ -1806,13 +1818,17 @@ fail:
|
|||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define OPEN_DIRECTORY_ALLOWED_FLAGS \
|
||||||
|
(SD_JOURNAL_OS_ROOT | \
|
||||||
|
SD_JOURNAL_SYSTEM | SD_JOURNAL_CURRENT_USER )
|
||||||
|
|
||||||
_public_ int sd_journal_open_directory(sd_journal **ret, const char *path, int flags) {
|
_public_ int sd_journal_open_directory(sd_journal **ret, const char *path, int flags) {
|
||||||
sd_journal *j;
|
sd_journal *j;
|
||||||
int r;
|
int r;
|
||||||
|
|
||||||
assert_return(ret, -EINVAL);
|
assert_return(ret, -EINVAL);
|
||||||
assert_return(path, -EINVAL);
|
assert_return(path, -EINVAL);
|
||||||
assert_return((flags & ~SD_JOURNAL_OS_ROOT) == 0, -EINVAL);
|
assert_return((flags & ~OPEN_DIRECTORY_ALLOWED_FLAGS) == 0, -EINVAL);
|
||||||
|
|
||||||
j = journal_new(flags, path);
|
j = journal_new(flags, path);
|
||||||
if (!j)
|
if (!j)
|
||||||
@ -1861,6 +1877,10 @@ fail:
|
|||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define OPEN_DIRECTORY_FD_ALLOWED_FLAGS \
|
||||||
|
(SD_JOURNAL_OS_ROOT | \
|
||||||
|
SD_JOURNAL_SYSTEM | SD_JOURNAL_CURRENT_USER )
|
||||||
|
|
||||||
_public_ int sd_journal_open_directory_fd(sd_journal **ret, int fd, int flags) {
|
_public_ int sd_journal_open_directory_fd(sd_journal **ret, int fd, int flags) {
|
||||||
sd_journal *j;
|
sd_journal *j;
|
||||||
struct stat st;
|
struct stat st;
|
||||||
@ -1868,7 +1888,7 @@ _public_ int sd_journal_open_directory_fd(sd_journal **ret, int fd, int flags) {
|
|||||||
|
|
||||||
assert_return(ret, -EINVAL);
|
assert_return(ret, -EINVAL);
|
||||||
assert_return(fd >= 0, -EBADF);
|
assert_return(fd >= 0, -EBADF);
|
||||||
assert_return((flags & ~SD_JOURNAL_OS_ROOT) == 0, -EINVAL);
|
assert_return((flags & ~OPEN_DIRECTORY_FD_ALLOWED_FLAGS) == 0, -EINVAL);
|
||||||
|
|
||||||
if (fstat(fd, &st) < 0)
|
if (fstat(fd, &st) < 0)
|
||||||
return -errno;
|
return -errno;
|
||||||
|
Loading…
Reference in New Issue
Block a user