[systemd-devel] [PATCH] systemctl: show hint about --full when lines don't fit
Daniel J Walsh
dwalsh at redhat.com
Mon Aug 5 08:43:44 PDT 2013
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
On 08/03/2013 07:45 PM, Zbigniew Jędrzejewski-Szmek wrote:
> Looks like:
>
> $ systemctl status avahi-daemon avahi-daemon.service - Avahi mDNS/DNS-SD
> Stack Loaded: loaded (/usr/lib/systemd/system/avahi-daemon.service;
> enabled) Active: active (running) since Tue 2013-07-30 08:15:45 EDT; 4 days
> ago Main PID: 679 (avahi-daemon) Status: "Server startup complete. Host
> name is spora.local. Local service cookie is 4134796673." CGroup:
> /system/avahi-daemon.service ├─679 avahi-daemon: running [spora.local]
> └─758 avahi-daemon: chroot helper
>
> Aug 03 11:00:55 spora avahi-daemon[679]: Registering new address record for
> 10.0.66.2 on ...v4. Aug 03 12:35:27 spora avahi-daemon[679]: Interface
> bnep0.IPv4 no longer relevant for mDNS. -- some lines were ellipsized, use
> -l to show in full
>
> The hint is only printed once, at the end, if the status for more than one
> unit is printed. --- Would something like that be useful for setroubleshoot
> output?
>
> Zbyszek
>
> src/journal/journal-gatewayd.c | 2 +- src/journal/journalctl.c | 3
> ++- src/shared/logs-show.c | 37 ++++++++++++++++++++++------------
> src/shared/logs-show.h | 6 ++++-- src/systemctl/systemctl.c |
> 45 ++++++++++++++++++++++++++++++------------ 5 files changed, 63
> insertions(+), 30 deletions(-)
>
> diff --git a/src/journal/journal-gatewayd.c
> b/src/journal/journal-gatewayd.c index 10224a1..06a236d 100644 ---
> a/src/journal/journal-gatewayd.c +++ b/src/journal/journal-gatewayd.c @@
> -248,7 +248,7 @@ static ssize_t request_reader_entries( } }
>
> - r = output_journal(m->tmp, m->journal, m->mode, 0,
> OUTPUT_FULL_WIDTH); + r = output_journal(m->tmp, m->journal,
> m->mode, 0, OUTPUT_FULL_WIDTH, NULL); if (r < 0) { log_error("Failed to
> serialize item: %s", strerror(-r)); return
> MHD_CONTENT_READER_END_WITH_ERROR; diff --git a/src/journal/journalctl.c
> b/src/journal/journalctl.c index dde2ed7..ee84691 100644 ---
> a/src/journal/journalctl.c +++ b/src/journal/journalctl.c @@ -1305,6
> +1305,7 @@ int main(int argc, char *argv[]) { sd_id128_t previous_boot_id;
> bool previous_boot_id_valid = false, first_line = true; int n_shown = 0; +
> bool ellipsized = false;
>
> setlocale(LC_ALL, ""); log_parse_environment(); @@ -1625,7 +1626,7 @@ int
> main(int argc, char *argv[]) { on_tty() * OUTPUT_COLOR | arg_catalog *
> OUTPUT_CATALOG;
>
> - r = output_journal(stdout, j, arg_output, 0,
> flags); + r = output_journal(stdout, j, arg_output,
> 0, flags, &ellipsized); need_seek = true; if (r == -EADDRNOTAVAIL) break;
> diff --git a/src/shared/logs-show.c b/src/shared/logs-show.c index
> bd7363a..51cd7d5 100644 --- a/src/shared/logs-show.c +++
> b/src/shared/logs-show.c @@ -101,10 +101,11 @@ static bool
> shall_print(const char *p, size_t l, OutputFlags flags) { return true; }
>
> -static void print_multiline(FILE *f, unsigned prefix, unsigned n_columns,
> OutputMode flags, int priority, const char* message, size_t message_len) {
> +static bool print_multiline(FILE *f, unsigned prefix, unsigned n_columns,
> OutputMode flags, int priority, const char* message, size_t message_len) {
> const char *color_on = "", *color_off = ""; const char *pos, *end; bool
> continuation = false; + bool ellipsized = false;
>
> if (flags & OUTPUT_COLOR) { if (priority <= LOG_ERR) { @@ -130,17 +131,22
> @@ static void print_multiline(FILE *f, unsigned prefix, unsigned
> n_columns, Output else if (prefix < n_columns && n_columns - prefix >= 3)
> { _cleanup_free_ char *e;
>
> + ellipsized = true; e = ellipsize_mem(pos, len,
> n_columns - prefix, 90);
>
> if (!e) fprintf(f, "%s%.*s%s\n", color_on, len, pos, color_off); else
> fprintf(f, "%s%s%s\n", color_on, e, color_off); - } else +
> } else { + ellipsized = true; fputs("...\n", f); +
> }
>
> continuation = true; } + + return ellipsized; }
>
> static int output_short( @@ -157,6 +163,7 @@ static int output_short(
> _cleanup_free_ char *hostname = NULL, *identifier = NULL, *comm = NULL,
> *pid = NULL, *fake_pid = NULL, *message = NULL, *realtime = NULL,
> *monotonic = NULL, *priority = NULL; size_t hostname_len = 0,
> identifier_len = 0, comm_len = 0, pid_len = 0, fake_pid_len = 0,
> message_len = 0, realtime_len = 0, monotonic_len = 0, priority_len = 0; int
> p = LOG_INFO; + bool ellipsized = false;
>
> assert(f); assert(j); @@ -314,13 +321,14 @@ static int output_short(
> fprintf(f, ": [%s blob data]\n", format_bytes(bytes, sizeof(bytes),
> message_len)); } else { fputs(": ", f); - print_multiline(f,
> n + 2, n_columns, flags, p, message, message_len); +
> ellipsized |= + print_multiline(f, n + 2, n_columns,
> flags, p, message, message_len); }
>
> if (flags & OUTPUT_CATALOG) print_catalog(f, j);
>
> - return 0; + return ellipsized; }
>
> static int output_verbose( @@ -817,7 +825,8 @@ int output_journal(
> sd_journal *j, OutputMode mode, unsigned n_columns, -
> OutputFlags flags) { + OutputFlags flags, +
> bool *ellipsized) {
>
> int ret; assert(mode >= 0); @@ -828,6 +837,10 @@ int output_journal(
>
> ret = output_funcs[mode](f, j, mode, n_columns, flags); fflush(stdout); + +
> if (ellipsized && ret > 0) + *ellipsized = true; + return
> ret; }
>
> @@ -837,7 +850,8 @@ static int show_journal(FILE *f, unsigned n_columns,
> usec_t not_before, unsigned how_many, - OutputFlags
> flags) { + OutputFlags flags, +
> bool *ellipsized) {
>
> int r; unsigned line = 0; @@ -888,7 +902,7 @@ static int show_journal(FILE
> *f,
>
> line ++;
>
> - r = output_journal(f, j, mode, n_columns, flags);
> + r = output_journal(f, j, mode, n_columns, flags,
> ellipsized); if (r < 0) goto finish; } @@ -1037,7 +1051,8 @@ int
> show_journal_by_unit( unsigned how_many, uid_t uid, OutputFlags flags, -
> bool system) { + bool system, + bool
> *ellipsized) {
>
> _cleanup_journal_close_ sd_journal*j = NULL; int r; @@ -1072,11 +1087,7 @@
> int show_journal_by_unit( log_debug("Journal filter: %s", filter); }
>
> - r = show_journal(f, j, mode, n_columns, not_before, how_many,
> flags); - if (r < 0) - return r; - - return
> 0; + return show_journal(f, j, mode, n_columns, not_before,
> how_many, flags, ellipsized); }
>
> static const char *const output_mode_table[_OUTPUT_MODE_MAX] = { diff --git
> a/src/shared/logs-show.h b/src/shared/logs-show.h index c9a9ad3..11b3b59
> 100644 --- a/src/shared/logs-show.h +++ b/src/shared/logs-show.h @@ -35,7
> +35,8 @@ int output_journal( sd_journal *j, OutputMode mode, unsigned
> n_columns, - OutputFlags flags); +
> OutputFlags flags, + bool *ellipsized);
>
> int add_match_this_boot(sd_journal *j);
>
> @@ -57,7 +58,8 @@ int show_journal_by_unit( unsigned how_many, uid_t uid,
> OutputFlags flags, - bool system); + bool
> system, + bool *ellipsized);
>
> void json_escape( FILE *f, diff --git a/src/systemctl/systemctl.c
> b/src/systemctl/systemctl.c index 5a4d80c..e859c07 100644 ---
> a/src/systemctl/systemctl.c +++ b/src/systemctl/systemctl.c @@ -2527,7
> +2527,8 @@ typedef struct UnitStatusInfo { LIST_HEAD(ExecStatusInfo,
> exec); } UnitStatusInfo;
>
> -static void print_status_info(UnitStatusInfo *i) { +static void
> print_status_info(UnitStatusInfo *i, + bool
> *ellipsized) { ExecStatusInfo *p; const char *on, *off, *ss; usec_t
> timestamp; @@ -2803,7 +2804,8 @@ static void
> print_status_info(UnitStatusInfo *i) { arg_lines, getuid(), flags, -
> arg_scope == UNIT_FILE_SYSTEM); +
> arg_scope == UNIT_FILE_SYSTEM, +
> ellipsized); }
>
> if (i->need_daemon_reload) @@ -3369,7 +3371,12 @@ static int
> print_property(const char *name, DBusMessageIter *iter) { return 0; }
>
> -static int show_one(const char *verb, DBusConnection *bus, const char
> *path, bool show_properties, bool *new_line) { +static int show_one(const
> char *verb, + DBusConnection *bus, +
> const char *path, + bool show_properties, +
> bool *new_line, + bool *ellipsized) { _cleanup_free_
> DBusMessage *reply = NULL; const char *interface = ""; int r; @@ -3439,7
> +3446,7 @@ static int show_one(const char *verb, DBusConnection *bus, const
> char *path, boo if (streq(verb, "help")) show_unit_help(&info); else -
> print_status_info(&info); + print_status_info(&info,
> ellipsized); }
>
> strv_free(info.documentation); @@ -3470,7 +3477,11 @@ static int
> show_one(const char *verb, DBusConnection *bus, const char *path, boo
> return r; }
>
> -static int show_one_by_pid(const char *verb, DBusConnection *bus, uint32_t
> pid, bool *new_line) { +static int show_one_by_pid(const char *verb, +
> DBusConnection *bus, + uint32_t pid, +
> bool *new_line, + bool *ellipsized) {
> _cleanup_dbus_message_unref_ DBusMessage *reply = NULL; const char *path =
> NULL; _cleanup_dbus_error_free_ DBusError error; @@ -3498,11 +3509,15 @@
> static int show_one_by_pid(const char *verb, DBusConnection *bus, uint32_t
> pid, return -EIO; }
>
> - r = show_one(verb, bus, path, false, new_line); + r =
> show_one(verb, bus, path, false, new_line, ellipsized); return r; }
>
> -static int show_all(const char* verb, DBusConnection *bus, bool
> show_properties, bool *new_line) { +static int show_all(const char* verb, +
> DBusConnection *bus, + bool show_properties, +
> bool *new_line, + bool *ellipsized) {
> _cleanup_dbus_message_unref_ DBusMessage *reply = NULL; _cleanup_free_
> struct unit_info *unit_infos = NULL; unsigned c = 0; @@ -3527,7 +3542,7 @@
> static int show_all(const char* verb, DBusConnection *bus, bool
> show_properties,
>
> printf("%s -> '%s'\n", u->id, p);
>
> - r = show_one(verb, bus, p, show_properties, new_line); +
> r = show_one(verb, bus, p, show_properties, new_line, ellipsized); if (r !=
> 0) return r; } @@ -3539,6 +3554,7 @@ static int show(DBusConnection *bus,
> char **args) { int r, ret = 0; bool show_properties, show_status, new_line
> = false; char **name; + bool ellipsized = false;
>
> assert(bus); assert(args); @@ -3552,10 +3568,10 @@ static int
> show(DBusConnection *bus, char **args) { /* If no argument is specified
> inspect the manager itself */
>
> if (show_properties && strv_length(args) <= 1) - return
> show_one(args[0], bus, "/org/freedesktop/systemd1", show_properties,
> &new_line); + return show_one(args[0], bus,
> "/org/freedesktop/systemd1", show_properties, &new_line, &ellipsized);
>
> if (show_status && strv_length(args) <= 1) - return
> show_all(args[0], bus, false, &new_line); + return
> show_all(args[0], bus, false, &new_line, &ellipsized);
>
> STRV_FOREACH(name, args+1) { uint32_t id; @@ -3572,7 +3588,7 @@ static int
> show(DBusConnection *bus, char **args) { if (!p) return log_oom();
>
> - r = show_one(args[0], bus, p, show_properties,
> &new_line); + r = show_one(args[0], bus, p,
> show_properties, &new_line, &ellipsized); if (r != 0) ret = r;
>
> @@ -3583,18 +3599,21 @@ static int show(DBusConnection *bus, char **args)
> { if (asprintf(&p, "/org/freedesktop/systemd1/job/%u", id) < 0) return
> log_oom();
>
> - r = show_one(args[0], bus, p, show_properties,
> &new_line); + r = show_one(args[0], bus, p,
> show_properties, &new_line, &ellipsized); if (r != 0) ret = r;
>
> } else { /* Interpret as PID */ - r =
> show_one_by_pid(args[0], bus, id, &new_line); + r =
> show_one_by_pid(args[0], bus, id, &new_line, &ellipsized); if (r != 0) ret
> = r; } }
>
> + if (ellipsized && !arg_quiet) + printf("-- some
> lines were ellipsized, use -l to show in full\n"); + return ret; }
>
>
Well
systemctl status -o verbose httpd
Is closer to what I want, but I really just want the entire message printed
out. Not all of the other data that was collected. IE Multi line messages to
expand on the screen. I guess is systemctl status -l httpd, did this it would
be perfect.
Currently -l gives me
==================================================================================
systemctl status -l httpd
httpd.service - The Apache HTTP Server
Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled)
Active: active (running) since Mon 2013-08-05 11:12:26 EDT; 29min ago
Main PID: 896 (httpd)
Status: "Total requests: 5; Current requests/sec: 0; Current traffic: 0
B/sec"
CGroup: /system.slice/httpd.service
├─896 /usr/sbin/httpd -DFOREGROUND
├─897 /usr/libexec/nss_pcache 196611 off /etc/httpd/alias
├─898 /usr/sbin/httpd -DFOREGROUND
├─899 /usr/sbin/httpd -DFOREGROUND
├─900 /usr/sbin/httpd -DFOREGROUND
├─901 /usr/sbin/httpd -DFOREGROUND
└─902 /usr/sbin/httpd -DFOREGROUND
Aug 05 11:12:26 redsox.boston.devel.redhat.com systemd[1]: Started The Apache
HTTP Server.
Aug 05 11:36:42 redsox.boston.devel.redhat.com python[1245]: SELinux is
preventing /usr/sbin/httpd from read access on the file /var/www/html/index.html.
***** Plugin
restorecon (
===================================================================================
systemctl status -l httpd
httpd.service - The Apache HTTP Server
Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled)
Active: active (running) since Mon 2013-08-05 11:12:26 EDT; 29min ago
Main PID: 896 (httpd)
Status: "Total requests: 5; Current requests/sec: 0; Current traffic: 0
B/sec"
CGroup: /system.slice/httpd.service
├─896 /usr/sbin/httpd -DFOREGROUND
├─897 /usr/libexec/nss_pcache 196611 off /etc/httpd/alias
├─898 /usr/sbin/httpd -DFOREGROUND
├─899 /usr/sbin/httpd -DFOREGROUND
├─900 /usr/sbin/httpd -DFOREGROUND
├─901 /usr/sbin/httpd -DFOREGROUND
└─902 /usr/sbin/httpd -DFOREGROUND
Aug 05 11:12:26 redsox.boston.devel.redhat.com systemd[1]: Started The Apache
HTTP Server.
Aug 05 11:36:42 redsox.boston.devel.redhat.com python[1245]: SELinux is
preventing /usr/sbin/httpd from read access on the file /var/www/html/index.html.
***** Plugin
restorecon ((92.2 confidence) suggests ************************
If you want to fix the label.
/var/www/html/index.html default label should be httpd_sys_content_t
.
Then you can run restorecon.
Do
# /sbin/restorecon -v /var/www/html/index.html
***** Plugin catchall_boolean (7.83 confidence) suggests
******************
If you want to allow httpd to read user content
Then you must tell SELinux about this by enabling the
'httpd_read_user_content' boolean.
You can read 'user_selinux' man page for more details.
Do
setsebool -P httpd_read_user_content 1
***** Plugin catchall (1.41 confidence) suggests
**************************
If you believe that httpd should be allowed read access on the
index.html file by default.
Then you should report this as a bug.
You can generate a local policy module to allow this access.
Do
allow this access for now by executing:
# grep httpd /var/log/audit/audit.log | audit2allow -M mypol
# semodule -i mypol.pp
=========================================================================================================
I want it to give me
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.14 (GNU/Linux)
Comment: Using GnuPG with Thunderbird - http://www.enigmail.net/
iEYEARECAAYFAlH/yDAACgkQrlYvE4MpobMxhACfam3W+ysGkeQjaAHivl9vczYS
WgMAn2Pwg/XyOO4lwETk0pjK6FmAAfqN
=B/j4
-----END PGP SIGNATURE-----
More information about the systemd-devel
mailing list