From 4a481ec4ae2137db1b294c8ff2ce7d2d1ebdc37e Mon Sep 17 00:00:00 2001 From: =?utf8?q?Alvin=20=C5=A0ipraga?= Date: Tue, 6 Apr 2021 15:40:46 +0200 Subject: [PATCH] network: show online state in networkctl status output MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit In case the link online state is invalid, networkctl will print "unknown", which is sufficiently neutral. The same goes for the overall manager online state if there are no managed links, or if RequiredForOnline=no for all managed links. Example output: $ networkctl status ● State: routable Online state: partial Address: 172.22.0.130 on wlan0 ... $ networkctl status wlan0 ● 3: wlan0 Link File: /lib/systemd/network/99-default.link Network File: /etc/systemd/network/50-wlan0.network Type: wlan State: routable (configured) Online state: online ... --- src/network/networkctl.c | 47 +++++++++++++++++++++++++++++++++++----- 1 file changed, 42 insertions(+), 5 deletions(-) diff --git a/src/network/networkctl.c b/src/network/networkctl.c index 7953a52b9d5..f36d725d7d7 100644 --- a/src/network/networkctl.c +++ b/src/network/networkctl.c @@ -225,6 +225,25 @@ static void setup_state_to_color(const char *state, const char **on, const char } } +static void online_state_to_color(const char *state, const char **on, const char **off) { + if (streq_ptr(state, "online")) { + if (on) + *on = ansi_highlight_green(); + if (off) + *off = ansi_normal(); + } else if (streq_ptr(state, "partial")) { + if (on) + *on = ansi_highlight_yellow(); + if (off) + *off = ansi_normal(); + } else { + if (on) + *on = ""; + if (off) + *off = ""; + } +} + typedef struct VxLanInfo { uint32_t vni; uint32_t link; @@ -1514,9 +1533,9 @@ static int link_status_one( _cleanup_strv_free_ char **dns = NULL, **ntp = NULL, **sip = NULL, **search_domains = NULL, **route_domains = NULL; _cleanup_free_ char *t = NULL, *network = NULL, *iaid = NULL, *duid = NULL, - *setup_state = NULL, *operational_state = NULL, *lease_file = NULL, *activation_policy = NULL; + *setup_state = NULL, *operational_state = NULL, *online_state = NULL, *lease_file = NULL, *activation_policy = NULL; const char *driver = NULL, *path = NULL, *vendor = NULL, *model = NULL, *link = NULL, - *on_color_operational, *off_color_operational, *on_color_setup, *off_color_setup; + *on_color_operational, *off_color_operational, *on_color_setup, *off_color_setup, *on_color_online; _cleanup_free_ int *carrier_bound_to = NULL, *carrier_bound_by = NULL; _cleanup_(sd_dhcp_lease_unrefp) sd_dhcp_lease *lease = NULL; _cleanup_(table_unrefp) Table *table = NULL; @@ -1529,6 +1548,9 @@ static int link_status_one( (void) sd_network_link_get_operational_state(info->ifindex, &operational_state); operational_state_to_color(info->name, operational_state, &on_color_operational, &off_color_operational); + (void) sd_network_link_get_online_state(info->ifindex, &online_state); + online_state_to_color(online_state, &on_color_online, NULL); + r = sd_network_link_get_setup_state(info->ifindex, &setup_state); if (r == -ENODATA) /* If there's no info available about this iface, it's unmanaged by networkd */ setup_state = strdup("unmanaged"); @@ -1613,6 +1635,14 @@ static int link_status_one( if (r < 0) return table_log_add_error(r); + r = table_add_many(table, + TABLE_EMPTY, + TABLE_STRING, "Online state:", + TABLE_STRING, online_state ?: "unknown", + TABLE_SET_COLOR, on_color_online); + if (r < 0) + return table_log_add_error(r); + strv_sort(info->alternative_names); r = dump_list(table, "Alternative Names:", info->alternative_names); if (r < 0) @@ -2272,9 +2302,9 @@ static int link_status_one( } static int system_status(sd_netlink *rtnl, sd_hwdb *hwdb) { - _cleanup_free_ char *operational_state = NULL; + _cleanup_free_ char *operational_state = NULL, *online_state = NULL; _cleanup_strv_free_ char **dns = NULL, **ntp = NULL, **search_domains = NULL, **route_domains = NULL; - const char *on_color_operational; + const char *on_color_operational, *on_color_online; _cleanup_(table_unrefp) Table *table = NULL; TableCell *cell; int r; @@ -2284,6 +2314,9 @@ static int system_status(sd_netlink *rtnl, sd_hwdb *hwdb) { (void) sd_network_get_operational_state(&operational_state); operational_state_to_color(NULL, operational_state, &on_color_operational, NULL); + (void) sd_network_get_online_state(&online_state); + online_state_to_color(online_state, &on_color_online, NULL); + table = table_new("dot", "key", "value"); if (!table) return log_oom(); @@ -2305,7 +2338,11 @@ static int system_status(sd_netlink *rtnl, sd_hwdb *hwdb) { TABLE_SET_COLOR, on_color_operational, TABLE_STRING, "State:", TABLE_STRING, strna(operational_state), - TABLE_SET_COLOR, on_color_operational); + TABLE_SET_COLOR, on_color_operational, + TABLE_EMPTY, + TABLE_STRING, "Online state:", + TABLE_STRING, online_state ?: "unknown", + TABLE_SET_COLOR, on_color_online); if (r < 0) return table_log_add_error(r); -- 2.47.3