1
0
mirror of https://github.com/systemd/systemd.git synced 2024-12-23 21:35:11 +03:00

cgls: show delegation boundaries by underlining the cgroup in the output

This should help visualize where one manager's territory begins and
another's starts. Do this by underlining (since it's a "cut" point an
underline made most sense to me). Since underlining is not visible on
the console let's also show an ellipses for all lines that are
delegation boundaries.

Unfortunately this all is not as useful as it appears. The
"trusted.delegate" xattr is only visible to roo, which means
"systemd-cgls" has be called as root to show the boundaries.
Unfortunately cgroupfs doesn't support unprivileged xattrs on cgroups.
This commit is contained in:
Lennart Poettering 2019-11-20 17:43:09 +01:00
parent 3288ea8f32
commit 74d8ccd451

View File

@ -17,12 +17,14 @@
#include "locale-util.h" #include "locale-util.h"
#include "macro.h" #include "macro.h"
#include "output-mode.h" #include "output-mode.h"
#include "parse-util.h"
#include "path-util.h" #include "path-util.h"
#include "process-util.h" #include "process-util.h"
#include "sort-util.h" #include "sort-util.h"
#include "string-util.h" #include "string-util.h"
#include "terminal-util.h" #include "terminal-util.h"
#include "unit-name.h" #include "unit-name.h"
#include "xattr-util.h"
static void show_pid_array( static void show_pid_array(
pid_t pids[], pid_t pids[],
@ -117,6 +119,44 @@ static int show_cgroup_one_by_path(
return 0; return 0;
} }
static int show_cgroup_name(
const char *path,
const char *prefix,
const char *glyph) {
_cleanup_free_ char *b = NULL;
bool delegate = false;
int r;
r = getxattr_malloc(path, "trusted.delegate", &b, false);
if (r < 0) {
if (r != -ENODATA)
log_debug_errno(r, "Failed to read trusted.delegate extended attribute: %m");
} else {
r = parse_boolean(b);
if (r < 0)
log_debug_errno(r, "Failed to parse trusted.delegate extended attribute boolean value: %m");
else
delegate = r > 0;
b = mfree(b);
}
b = strdup(basename(path));
if (!b)
return -ENOMEM;
printf("%s%s%s%s%s %s%s%s\n",
prefix, glyph,
delegate ? ansi_underline() : "",
cg_unescape(b),
delegate ? ansi_normal() : "",
delegate ? ansi_highlight() : "",
delegate ? special_glyph(SPECIAL_GLYPH_ELLIPSIS) : "",
delegate ? ansi_normal() : "");
return 0;
}
int show_cgroup_by_path( int show_cgroup_by_path(
const char *path, const char *path,
const char *prefix, const char *prefix,
@ -125,8 +165,8 @@ int show_cgroup_by_path(
_cleanup_free_ char *fn = NULL, *p1 = NULL, *last = NULL, *p2 = NULL; _cleanup_free_ char *fn = NULL, *p1 = NULL, *last = NULL, *p2 = NULL;
_cleanup_closedir_ DIR *d = NULL; _cleanup_closedir_ DIR *d = NULL;
char *gn = NULL;
bool shown_pids = false; bool shown_pids = false;
char *gn = NULL;
int r; int r;
assert(path); assert(path);
@ -161,7 +201,9 @@ int show_cgroup_by_path(
} }
if (last) { if (last) {
printf("%s%s%s\n", prefix, special_glyph(SPECIAL_GLYPH_TREE_BRANCH), cg_unescape(basename(last))); r = show_cgroup_name(last, prefix, special_glyph(SPECIAL_GLYPH_TREE_BRANCH));
if (r < 0)
return r;
if (!p1) { if (!p1) {
p1 = strjoin(prefix, special_glyph(SPECIAL_GLYPH_TREE_VERTICAL)); p1 = strjoin(prefix, special_glyph(SPECIAL_GLYPH_TREE_VERTICAL));
@ -183,7 +225,9 @@ int show_cgroup_by_path(
show_cgroup_one_by_path(path, prefix, n_columns, !!last, flags); show_cgroup_one_by_path(path, prefix, n_columns, !!last, flags);
if (last) { if (last) {
printf("%s%s%s\n", prefix, special_glyph(SPECIAL_GLYPH_TREE_RIGHT), cg_unescape(basename(last))); r = show_cgroup_name(last, prefix, special_glyph(SPECIAL_GLYPH_TREE_RIGHT));
if (r < 0)
return r;
if (!p2) { if (!p2) {
p2 = strjoin(prefix, " "); p2 = strjoin(prefix, " ");