nmcli: add overview option to skip default values in output

Add a new 'overview' command line option to make the output more
compact and display only properties that have non-default
values. Currently the option has only effect for the "connection show
$CON" sub-command.

 $ nmcli -o connection show wifi-home
 connection.id:                          wifi-home
 connection.uuid:                        8308c425-f2a7-4021-9afc-37bde7253c6d
 connection.type:                        802-11-wireless
 connection.timestamp:                   1519264421
 connection.permissions:                 user:me
 802-11-wireless.ssid:                   home
 802-11-wireless.mode:                   infrastructure
 802-11-wireless-security.key-mgmt:      wpa-psk
 802-11-wireless-security.auth-alg:      open
 ipv4.method:                            auto
 ipv6.method:                            auto

https://bugzilla.redhat.com/show_bug.cgi?id=1434527
This commit is contained in:
Beniamino Galvani 2018-02-27 16:28:28 +01:00
parent 50414353e1
commit 9a19bbcb2f
3 changed files with 24 additions and 6 deletions

View file

@ -184,6 +184,7 @@ usage (void)
g_printerr (_("Usage: nmcli [OPTIONS] OBJECT { COMMAND | help }\n"
"\n"
"OPTIONS\n"
" -o[verview] overview mode (hide default values)\n"
" -t[erse] terse output\n"
" -p[retty] pretty output\n"
" -m[ode] tabular|multiline output mode\n"
@ -295,9 +296,10 @@ process_command_line (NmCli *nmc, int argc, char **argv)
break;
if (argc == 1 && nmc->complete) {
nmc_complete_strings (argv[0], "--terse", "--pretty", "--mode", "--colors", "--escape",
"--fields", "--nocheck", "--get-values",
"--wait", "--version", "--help", NULL);
nmc_complete_strings (argv[0], "--terse", "--pretty", "--mode", "--overview",
"--colors", "--escape",
"--fields", "--nocheck", "--get-values",
"--wait", "--version", "--help", NULL);
}
if (argv[0][1] == '-' && argv[0][2] == '\0') {
@ -306,7 +308,9 @@ process_command_line (NmCli *nmc, int argc, char **argv)
break;
}
if (matches_arg (nmc, &argc, &argv, "-terse", NULL)) {
if (matches_arg (nmc, &argc, &argv, "-overview", NULL)) {
nmc->nmc_config_mutable.overview = TRUE;
} else if (matches_arg (nmc, &argc, &argv, "-terse", NULL)) {
if (nmc->nmc_config.print_output == NMC_PRINT_TERSE) {
g_string_printf (nmc->return_text, _("Error: Option '--terse' is specified the second time."));
nmc->return_value = NMC_RESULT_ERROR_USER_INPUT;
@ -415,6 +419,10 @@ process_command_line (NmCli *nmc, int argc, char **argv)
next_arg (nmc, &argc, &argv, NULL);
}
/* Ignore --overview when fields are set explicitly */
if (nmc->required_fields)
nmc->nmc_config_mutable.overview = FALSE;
/* Now run the requested command */
nmc_do_cmd (nmc, nmcli_cmds, *argv, argc, argv);

View file

@ -116,6 +116,7 @@ typedef struct _NmcConfig {
bool escape_values; /* Whether to escape ':' and '\' in terse tabular mode */
bool in_editor; /* Whether running the editor - nmcli con edit' */
bool show_secrets; /* Whether to display secrets (both input and output): option '--show-secrets' */
bool overview; /* Overview mode (hide default values) */
} NmcConfig;
typedef struct _NmcOutputData {

View file

@ -1004,6 +1004,7 @@ typedef struct {
const PrintDataCol *col;
const char *title;
bool title_to_free:1;
bool skip:1;
int width;
} PrintDataHeaderCell;
@ -1102,6 +1103,7 @@ _print_fill (const NmcConfig *nmc_config,
header_cell->col_idx = col_idx;
header_cell->col = col;
header_cell->skip = FALSE;
header_cell->title = nm_meta_abstract_info_get_name (info, TRUE);
if ( nmc_config->multiline_output
@ -1136,10 +1138,11 @@ _print_fill (const NmcConfig *nmc_config,
for (i_col = 0; i_col < header_row->len; i_col++) {
char *to_free = NULL;
PrintDataCell *cell = &cells_line[i_col];
const PrintDataHeaderCell *header_cell;
PrintDataHeaderCell *header_cell;
const NMMetaAbstractInfo *info;
NMMetaAccessorGetOutFlags text_out_flags, color_out_flags;
gconstpointer value;
gboolean is_default;
header_cell = &g_array_index (header_row, PrintDataHeaderCell, i_col);
info = header_cell->col->selection_item->info;
@ -1154,8 +1157,11 @@ _print_fill (const NmcConfig *nmc_config,
text_get_type,
text_get_flags,
&text_out_flags,
NULL,
&is_default,
(gpointer *) &to_free);
header_cell->skip = nmc_config->overview && is_default;
if (NM_FLAGS_HAS (text_out_flags, NM_META_ACCESSOR_GET_OUT_FLAGS_STRV)) {
if (value) {
if (nmc_config->multiline_output) {
@ -1239,6 +1245,9 @@ _print_skip_column (const NmcConfig *nmc_config,
selection_item = header_cell->col->selection_item;
info = selection_item->info;
if (header_cell->skip)
return TRUE;
if (nmc_config->multiline_output) {
if (info->meta_type == &nm_meta_type_setting_info_editor) {
/* we skip the "name" entry for the setting in multiline output. */