cli: convert 'dev list' to new format; checking options validity for terse

This commit is contained in:
Jiří Klimeš 2010-03-22 18:43:28 +01:00
parent 6ab52b33ee
commit 21638ff470
7 changed files with 278 additions and 118 deletions

View file

@ -154,7 +154,7 @@ show_connection (NMConnection *data, gpointer user_data)
nmc->allowed_fields[6].value = nm_setting_connection_get_autoconnect (s_con) ? _("yes") : _("no");
nmc->allowed_fields[7].value = nm_setting_connection_get_read_only (s_con) ? _("yes") : _("no");
nmc->print_fields.flags &= ~NMC_PF_FLAG_HEADER; /* Clear HEADER flag */
nmc->print_fields.flags &= ~NMC_PF_FLAG_MAIN_HEADER & ~NMC_PF_FLAG_FIELD_NAMES; /* Clear header flags */
print_fields (nmc->print_fields, nmc->allowed_fields);
g_free (timestamp_str);
@ -227,12 +227,12 @@ do_connections_list (NmCli *nmc, int argc, char **argv)
if (argc == 0) {
valid_param_specified = TRUE;
nmc->print_fields.flags = multiline_flag | mode_flag | escape_flag | NMC_PF_FLAG_HEADER;
nmc->print_fields.flags = multiline_flag | mode_flag | escape_flag | NMC_PF_FLAG_MAIN_HEADER | NMC_PF_FLAG_FIELD_NAMES;
nmc->print_fields.header_name = _("System connections");
print_fields (nmc->print_fields, nmc->allowed_fields);
g_slist_foreach (nmc->system_connections, (GFunc) show_connection, nmc);
nmc->print_fields.flags = multiline_flag | mode_flag | escape_flag | NMC_PF_FLAG_HEADER;
nmc->print_fields.flags = multiline_flag | mode_flag | escape_flag | NMC_PF_FLAG_MAIN_HEADER | NMC_PF_FLAG_FIELD_NAMES;
nmc->print_fields.header_name = _("User connections");
print_fields (nmc->print_fields, nmc->allowed_fields);
g_slist_foreach (nmc->user_connections, (GFunc) show_connection, nmc);
@ -264,7 +264,7 @@ do_connections_list (NmCli *nmc, int argc, char **argv)
else if (strcmp (*argv, "system") == 0) {
valid_param_specified = TRUE;
nmc->print_fields.flags = multiline_flag | mode_flag | escape_flag | NMC_PF_FLAG_HEADER;
nmc->print_fields.flags = multiline_flag | mode_flag | escape_flag | NMC_PF_FLAG_MAIN_HEADER | NMC_PF_FLAG_FIELD_NAMES;
nmc->print_fields.header_name = _("System connections");
print_fields (nmc->print_fields, nmc->allowed_fields);
g_slist_foreach (nmc->system_connections, (GFunc) show_connection, nmc);
@ -273,7 +273,7 @@ do_connections_list (NmCli *nmc, int argc, char **argv)
else if (strcmp (*argv, "user") == 0) {
valid_param_specified = TRUE;
nmc->print_fields.flags = multiline_flag | mode_flag | escape_flag | NMC_PF_FLAG_HEADER;
nmc->print_fields.flags = multiline_flag | mode_flag | escape_flag | NMC_PF_FLAG_MAIN_HEADER | NMC_PF_FLAG_FIELD_NAMES;
nmc->print_fields.header_name = _("User connections");
print_fields (nmc->print_fields, nmc->allowed_fields);
g_slist_foreach (nmc->user_connections, (GFunc) show_connection, nmc);
@ -353,7 +353,7 @@ show_active_connection (gpointer data, gpointer user_data)
info->nmc->allowed_fields[6].value = nm_active_connection_get_specific_object (active);
info->nmc->allowed_fields[7].value = NM_IS_VPN_CONNECTION (active) ? _("yes") : _("no");
info->nmc->print_fields.flags &= ~NMC_PF_FLAG_HEADER; /* Clear HEADER flag */
info->nmc->print_fields.flags &= ~NMC_PF_FLAG_MAIN_HEADER & ~NMC_PF_FLAG_FIELD_NAMES; /* Clear header flags */
print_fields (info->nmc->print_fields, info->nmc->allowed_fields);
break;
}
@ -403,7 +403,7 @@ do_connections_status (NmCli *nmc, int argc, char **argv)
goto error;
}
nmc->print_fields.flags = multiline_flag | mode_flag | escape_flag | NMC_PF_FLAG_HEADER;
nmc->print_fields.flags = multiline_flag | mode_flag | escape_flag | NMC_PF_FLAG_MAIN_HEADER | NMC_PF_FLAG_FIELD_NAMES;
nmc->print_fields.header_name = _("Active connections");
print_fields (nmc->print_fields, nmc->allowed_fields);
@ -1266,6 +1266,7 @@ get_connections_cb (NMSettingsInterface *settings, gpointer user_data)
ArgsInfo *args = (ArgsInfo *) user_data;
static gboolean system_cb_called = FALSE;
static gboolean user_cb_called = FALSE;
GError *error = NULL;
if (NM_IS_REMOTE_SETTINGS_SYSTEM (settings)) {
system_cb_called = TRUE;
@ -1282,13 +1283,19 @@ get_connections_cb (NMSettingsInterface *settings, gpointer user_data)
return;
if (args->argc == 0) {
if (!nmc_terse_option_check (args->nmc->print_output, args->nmc->required_fields, &error))
goto error;
args->nmc->return_value = do_connections_list (args->nmc, args->argc, args->argv);
} else {
if (matches (*args->argv, "list") == 0) {
if (!nmc_terse_option_check (args->nmc->print_output, args->nmc->required_fields, &error))
goto error;
args->nmc->return_value = do_connections_list (args->nmc, args->argc-1, args->argv+1);
}
else if (matches(*args->argv, "status") == 0) {
if (!nmc_terse_option_check (args->nmc->print_output, args->nmc->required_fields, &error))
goto error;
args->nmc->return_value = do_connections_status (args->nmc, args->argc-1, args->argv+1);
}
else if (matches(*args->argv, "up") == 0) {
@ -1310,6 +1317,15 @@ get_connections_cb (NMSettingsInterface *settings, gpointer user_data)
if (!args->nmc->should_wait)
quit ();
return;
error:
g_string_printf (args->nmc->return_text, _("Error: %s."), error->message);
args->nmc->return_value = NMC_RESULT_ERROR_UNKNOWN;
args->nmc->should_wait = FALSE;
g_error_free (error);
quit ();
return;
}

View file

@ -65,6 +65,73 @@ static NmcOutputField nmc_fields_dev_status[] = {
#define NMC_FIELDS_DEV_STATUS_ALL "DEVICE,TYPE,STATE"
#define NMC_FIELDS_DEV_STATUS_COMMON "DEVICE,TYPE,STATE"
/* Available field for 'dev list' - general part */
static NmcOutputField nmc_fields_dev_list_general[] = {
{"NAME", N_("NAME"), 10, NULL, 0}, /* 0 */
{"DEVICE", N_("DEVICE"), 10, NULL, 0}, /* 1 */
{"TYPE", N_("TYPE"), 17, NULL, 0}, /* 2 */
{"DRIVER", N_("DRIVER"), 10, NULL, 0}, /* 3 */
{"HWADDR", N_("HWADDR"), 19, NULL, 0}, /* 4 */
{"STATE", N_("STATE"), 14, NULL, 0}, /* 5 */
{NULL, NULL, 0, NULL, 0}
};
#define NMC_FIELDS_DEV_LIST_GENERAL_ALL "NAME,DEVICE,TYPE,DRIVER,HWADDR,STATE"
#define NMC_FIELDS_DEV_LIST_GENERAL_COMMON "NAME,DEVICE,TYPE,DRIVER,HWADDR,STATE"
/* Available field for 'dev list' - capabilities part */
static NmcOutputField nmc_fields_dev_list_cap[] = {
{"NAME", N_("NAME"), 13, NULL, 0}, /* 0 */
{"CARRIER-DETECT", N_("CARRIER-DETECT"), 16, NULL, 0}, /* 1 */
{"SPEED", N_("SPEED"), 10, NULL, 0}, /* 2 */
{NULL, NULL, 0, NULL, 0}
};
#define NMC_FIELDS_DEV_LIST_CAP_ALL "NAME,CARRIER-DETECT,SPEED"
#define NMC_FIELDS_DEV_LIST_CAP_COMMON "NAME,CARRIER-DETECT,SPEED"
/* Available field for 'dev list' - wired properties part */
static NmcOutputField nmc_fields_dev_list_wired_prop[] = {
{"NAME", N_("NAME"), 18, NULL, 0}, /* 0 */
{"CARRIER", N_("CARRIER"), 10, NULL, 0}, /* 1 */
{NULL, NULL, 0, NULL, 0}
};
#define NMC_FIELDS_DEV_LIST_WIRED_PROP_ALL "NAME,CARRIER"
#define NMC_FIELDS_DEV_LIST_WIRED_PROP_COMMON "NAME,CARRIER"
/* Available field for 'dev list' - wireless properties part */
static NmcOutputField nmc_fields_dev_list_wifi_prop[] = {
{"NAME", N_("NAME"), 18, NULL, 0}, /* 0 */
{"WEP", N_("WEP"), 5, NULL, 0}, /* 1 */
{"WPA", N_("WPA"), 5, NULL, 0}, /* 2 */
{"WPA2", N_("WPA2"), 6, NULL, 0}, /* 3 */
{"TKIP", N_("TKIP"), 6, NULL, 0}, /* 4 */
{"CCMP", N_("CCMP"), 6, NULL, 0}, /* 5 */
{NULL, NULL, 0, NULL, 0}
};
#define NMC_FIELDS_DEV_LIST_WIFI_PROP_ALL "NAME,WEP,WPA,WPA2,TKIP,CCMP"
#define NMC_FIELDS_DEV_LIST_WIFI_PROP_COMMON "NAME,WEP,WPA,WPA2,TKIP,CCMP"
/* Available field for 'dev list' - IPv4 settings part */
static NmcOutputField nmc_fields_dev_list_ip4_settings[] = {
{"NAME", N_("NAME"), 15, NULL, 0}, /* 0 */
{"ADDRESS", N_("ADDRESS"), 15, NULL, 0}, /* 1 */
{"PREFIX", N_("PREFIX"), 20, NULL, 0}, /* 2 */
{"GATEWAY", N_("GATEWAY"), 20, NULL, 0}, /* 3 */
{NULL, NULL, 0, NULL, 0}
};
#define NMC_FIELDS_DEV_LIST_IP4_SETTINGS_ALL "NAME,ADDRESS,PREFIX,GATEWAY"
#define NMC_FIELDS_DEV_LIST_IP4_SETTINGS_COMMON "NAME,ADDRESS,PREFIX,GATEWAY"
/* Available field for 'dev list' - IPv4 settings DNS part */
static NmcOutputField nmc_fields_dev_list_ip4_dns[] = {
{"NAME", N_("NAME"), 15, NULL, 0}, /* 0 */
{"DNS", N_("DNS"), 17, NULL, 0}, /* 1 */
{NULL, NULL, 0, NULL, 0}
};
#define NMC_FIELDS_DEV_LIST_IP4_DNS_ALL "NAME,DNS"
#define NMC_FIELDS_DEV_LIST_IP4_DNS_COMMON "NAME,DNS"
/* Available field for 'dev wifi list' */
static NmcOutputField nmc_fields_dev_wifi_list[] = {
{"SSID", N_("SSID"), 33, NULL, 0}, /* 0 */
@ -78,10 +145,12 @@ static NmcOutputField nmc_fields_dev_wifi_list[] = {
{"RSN-FLAGS", N_("RSN-FLAGS"), 25, NULL, 0}, /* 8 */
{"DEVICE", N_("DEVICE"), 10, NULL, 0}, /* 9 */
{"ACTIVE", N_("ACTIVE"), 8, NULL, 0}, /* 10 */
{"NAME", N_("NAME"), 8, NULL, 0}, /* 11 */ /* For WiFi scan in nm dev list */
{NULL, NULL, 0, NULL, 0}
};
#define NMC_FIELDS_DEV_WIFI_LIST_ALL "SSID,BSSID,MODE,FREQ,RATE,SIGNAL,SECURITY,WPA-FLAGS,RSN-FLAGS,DEVICE,ACTIVE"
#define NMC_FIELDS_DEV_WIFI_LIST_COMMON "SSID,BSSID,MODE,FREQ,RATE,SIGNAL,SECURITY,ACTIVE"
#define NMC_FIELDS_DEV_WIFI_LIST_FOR_DEV_LIST "NAME,"NMC_FIELDS_DEV_WIFI_LIST_COMMON
/* static function prototypes */
@ -203,6 +272,7 @@ ap_wpa_rsn_flags_to_string (guint32 flags)
return ret_str;
}
#if 0
static void
print_header (const char *label, const char *iface, const char *connection)
{
@ -222,6 +292,7 @@ print_header (const char *label, const char *iface, const char *connection)
g_string_free (string, TRUE);
}
#endif
static gchar *
ip4_address_as_string (guint32 ip)
@ -318,8 +389,9 @@ detail_access_point (gpointer data, gpointer user_data)
info->nmc->allowed_fields[8].value = rsn_flags_str;
info->nmc->allowed_fields[9].value = info->device;
info->nmc->allowed_fields[10].value = active ? _("yes") : _("no");
info->nmc->allowed_fields[11].value = "AP";
info->nmc->print_fields.flags &= ~NMC_PF_FLAG_HEADER; /* Clear HEADER flag */
info->nmc->print_fields.flags &= ~NMC_PF_FLAG_MAIN_HEADER & ~NMC_PF_FLAG_FIELD_NAMES; /* Clear header flags */
print_fields (info->nmc->print_fields, info->nmc->allowed_fields);
g_free (ssid_str);
@ -343,44 +415,48 @@ show_device_info (gpointer data, gpointer user_data)
NmCli *nmc = (NmCli *) user_data;
APInfo *info;
char *tmp;
const char *hwaddr = NULL;
NMDeviceState state;
const char *dev_type;
guint32 caps;
guint32 speed;
char *speed_str = NULL;
const GArray *array;
gboolean is_default = FALSE;
const char *id = NULL;
state = nm_device_get_state (device);
print_header (_("Device"), nm_device_get_iface (device), id);
guint32 mode_flag = (nmc->print_output == NMC_PRINT_PRETTY) ? NMC_PF_FLAG_PRETTY : (nmc->print_output == NMC_PRINT_TERSE) ? NMC_PF_FLAG_TERSE : 0;
guint32 multiline_flag = nmc->multiline_output ? NMC_PF_FLAG_MULTILINE : 0;
guint32 escape_flag = nmc->escape_values ? NMC_PF_FLAG_ESCAPE : 0;
/* General information */
dev_type = get_device_type (device);
print_table_line (0, _("Type"), 25, dev_type, 0, NULL);
print_table_line (0, _("Driver"), 25, nm_device_get_driver (device) ? nm_device_get_driver (device) : _("(unknown)"), 0, NULL);
print_table_line (0, _("State"), 25, device_state_to_string (state), 0, NULL);
if (is_default)
print_table_line (0, _("Default"), 25, _("yes"), 0, NULL);
else
print_table_line (0, _("Default"), 25, _("no"), 0, NULL);
nmc->allowed_fields = nmc_fields_dev_list_general;
nmc->print_fields.flags = multiline_flag | mode_flag | escape_flag | NMC_PF_FLAG_MAIN_HEADER | NMC_PF_FLAG_FIELD_NAMES;
nmc->print_fields.header_name = _("Device details");
nmc->print_fields.indices = parse_output_fields (NMC_FIELDS_DEV_LIST_GENERAL_ALL, nmc->allowed_fields, NULL);
print_fields (nmc->print_fields, nmc->allowed_fields); /* Print header */
tmp = NULL;
state = nm_device_get_state (device);
if (NM_IS_DEVICE_ETHERNET (device))
tmp = g_strdup (nm_device_ethernet_get_hw_address (NM_DEVICE_ETHERNET (device)));
hwaddr = nm_device_ethernet_get_hw_address (NM_DEVICE_ETHERNET (device));
else if (NM_IS_DEVICE_WIFI (device))
tmp = g_strdup (nm_device_wifi_get_hw_address (NM_DEVICE_WIFI (device)));
hwaddr = nm_device_wifi_get_hw_address (NM_DEVICE_WIFI (device));
if (tmp) {
print_table_line (0, _("HW Address"), 25, tmp, 0, NULL);
g_free (tmp);
}
nmc->allowed_fields[0].value = "GENERAL";
nmc->allowed_fields[1].value = nm_device_get_iface (device);
nmc->allowed_fields[2].value = get_device_type (device);
nmc->allowed_fields[3].value = nm_device_get_driver (device) ? nm_device_get_driver (device) : _("(unknown)");
nmc->allowed_fields[4].value = hwaddr ? hwaddr : _("unknown)");
nmc->allowed_fields[5].value = device_state_to_string (state);
nmc->print_fields.flags &= ~NMC_PF_FLAG_MAIN_HEADER & ~NMC_PF_FLAG_FIELD_NAMES; /* Clear header flags */
print_fields (nmc->print_fields, nmc->allowed_fields); /* Print values */
printf ("\n"); /* empty line */
/* Capabilities */
caps = nm_device_get_capabilities (device);
printf (_("\n Capabilities:\n"));
if (caps & NM_DEVICE_CAP_CARRIER_DETECT)
print_table_line (2, _("Carrier Detect"), 23, _("yes"), 0, NULL);
nmc->allowed_fields = nmc_fields_dev_list_cap;
nmc->print_fields.flags = multiline_flag | mode_flag | escape_flag | NMC_PF_FLAG_FIELD_NAMES;
nmc->print_fields.indices = parse_output_fields (NMC_FIELDS_DEV_LIST_CAP_ALL, nmc->allowed_fields, NULL);
print_fields (nmc->print_fields, nmc->allowed_fields); /* Print header */
caps = nm_device_get_capabilities (device);
speed = 0;
if (NM_IS_DEVICE_ETHERNET (device)) {
/* Speed in Mb/s */
@ -390,14 +466,16 @@ show_device_info (gpointer data, gpointer user_data)
speed = nm_device_wifi_get_bitrate (NM_DEVICE_WIFI (device));
speed /= 1000;
}
if (speed)
speed_str = g_strdup_printf (_("%u Mb/s"), speed);
if (speed) {
char *speed_string;
nmc->allowed_fields[0].value = "CAPABILITIES";
nmc->allowed_fields[1].value = (caps & NM_DEVICE_CAP_CARRIER_DETECT) ? _("yes") : _("no");
nmc->allowed_fields[2].value = speed_str ? speed_str : _("unknown");
speed_string = g_strdup_printf (_("%u Mb/s"), speed);
print_table_line (2, _("Speed"), 23, speed_string, 0, NULL);
g_free (speed_string);
}
nmc->print_fields.flags = multiline_flag | mode_flag | escape_flag;
print_fields (nmc->print_fields, nmc->allowed_fields); /* Print values */
g_free (speed_str);
/* Wireless specific information */
if ((NM_IS_DEVICE_WIFI (device))) {
@ -406,31 +484,36 @@ show_device_info (gpointer data, gpointer user_data)
const char *active_bssid = NULL;
const GPtrArray *aps;
printf (_("\n Wireless Properties\n"));
printf ("\n"); /* empty line */
wcaps = nm_device_wifi_get_capabilities (NM_DEVICE_WIFI (device));
if (wcaps & (NM_WIFI_DEVICE_CAP_CIPHER_WEP40 | NM_WIFI_DEVICE_CAP_CIPHER_WEP104))
print_table_line (2, _("WEP Encryption"), 23, _("yes"), 0, NULL);
if (wcaps & NM_WIFI_DEVICE_CAP_WPA)
print_table_line (2, _("WPA Encryption"), 23, _("yes"), 0, NULL);
if (wcaps & NM_WIFI_DEVICE_CAP_RSN)
print_table_line (2, _("WPA2 Encryption"), 23, _("yes"), 0, NULL);
if (wcaps & NM_WIFI_DEVICE_CAP_CIPHER_TKIP)
print_table_line (2, _("TKIP cipher"), 23, _("yes"), 0, NULL);
if (wcaps & NM_WIFI_DEVICE_CAP_CIPHER_CCMP)
print_table_line (2, _("CCMP cipher"), 23, _("yes"), 0, NULL);
nmc->allowed_fields = nmc_fields_dev_list_wifi_prop;
nmc->print_fields.flags = multiline_flag | mode_flag | escape_flag | NMC_PF_FLAG_FIELD_NAMES;
nmc->print_fields.indices = parse_output_fields (NMC_FIELDS_DEV_LIST_WIFI_PROP_ALL, nmc->allowed_fields, NULL);
print_fields (nmc->print_fields, nmc->allowed_fields); /* Print header */
nmc->allowed_fields[0].value = "WIFI-PROPERTIES";
nmc->allowed_fields[1].value = (wcaps & (NM_WIFI_DEVICE_CAP_CIPHER_WEP40 | NM_WIFI_DEVICE_CAP_CIPHER_WEP104)) ? _("yes") : _("no");
nmc->allowed_fields[2].value = (wcaps & NM_WIFI_DEVICE_CAP_WPA) ? _("yes") : _("no");
nmc->allowed_fields[3].value = (wcaps & NM_WIFI_DEVICE_CAP_RSN) ? _("yes") : _("no");
nmc->allowed_fields[4].value = (wcaps & NM_WIFI_DEVICE_CAP_CIPHER_TKIP) ? _("yes") : _("no");
nmc->allowed_fields[5].value = (wcaps & NM_WIFI_DEVICE_CAP_CIPHER_CCMP) ? _("yes") : _("no");
nmc->print_fields.flags = multiline_flag | mode_flag | escape_flag;
print_fields (nmc->print_fields, nmc->allowed_fields); /* Print values */
printf ("\n"); /* empty line */
/* Wireless access points */
if (nm_device_get_state (device) == NM_DEVICE_STATE_ACTIVATED) {
active_ap = nm_device_wifi_get_active_access_point (NM_DEVICE_WIFI (device));
active_bssid = active_ap ? nm_access_point_get_hw_address (active_ap) : NULL;
}
printf (_("\n Wireless Access Points\n"));
nmc->print_fields.flags = NMC_PF_FLAG_HEADER;
nmc->print_fields.indent = 2; /* Indent by 2 spaces */
nmc->print_fields.indices = parse_output_fields (NMC_FIELDS_DEV_WIFI_LIST_COMMON, nmc->allowed_fields, NULL);
nmc->allowed_fields = nmc_fields_dev_wifi_list;
nmc->print_fields.flags = multiline_flag | mode_flag | escape_flag | NMC_PF_FLAG_FIELD_NAMES;
nmc->print_fields.indices = parse_output_fields (NMC_FIELDS_DEV_WIFI_LIST_FOR_DEV_LIST, nmc->allowed_fields, NULL);
print_fields (nmc->print_fields, nmc->allowed_fields); /* Print header */
info = g_malloc0 (sizeof (APInfo));
@ -442,12 +525,18 @@ show_device_info (gpointer data, gpointer user_data)
g_ptr_array_foreach ((GPtrArray *) aps, detail_access_point, (gpointer) info);
g_free (info);
} else if (NM_IS_DEVICE_ETHERNET (device)) {
printf (_("\n Wired Properties\n"));
printf ("\n"); /* empty line */
/* Wired properties */
nmc->allowed_fields = nmc_fields_dev_list_wired_prop;
nmc->print_fields.flags = multiline_flag | mode_flag | escape_flag | NMC_PF_FLAG_FIELD_NAMES;
nmc->print_fields.indices = parse_output_fields (NMC_FIELDS_DEV_LIST_WIRED_PROP_ALL, nmc->allowed_fields, NULL);
print_fields (nmc->print_fields, nmc->allowed_fields); /* Print header */
if (nm_device_ethernet_get_carrier (NM_DEVICE_ETHERNET (device)))
print_table_line (2, _("Carrier"), 23, _("on"), 0, NULL);
else
print_table_line (2, _("Carrier"), 23, _("off"), 0, NULL);
nmc->allowed_fields[0].value = "WIRED-PROPERTIES";
nmc->allowed_fields[1].value = (nm_device_ethernet_get_carrier (NM_DEVICE_ETHERNET (device))) ? _("on") : _("off");
nmc->print_fields.flags = multiline_flag | mode_flag | escape_flag;
print_fields (nmc->print_fields, nmc->allowed_fields); /* Print values */
}
/* IP Setup info */
@ -455,42 +544,62 @@ show_device_info (gpointer data, gpointer user_data)
NMIP4Config *cfg = nm_device_get_ip4_config (device);
GSList *iter;
printf (_("\n IPv4 Settings:\n"));
printf ("\n"); /* empty line */
nmc->allowed_fields = nmc_fields_dev_list_ip4_settings;
nmc->print_fields.flags = multiline_flag | mode_flag | escape_flag | NMC_PF_FLAG_FIELD_NAMES;
nmc->print_fields.indices = parse_output_fields (NMC_FIELDS_DEV_LIST_IP4_SETTINGS_ALL, nmc->allowed_fields, NULL);
print_fields (nmc->print_fields, nmc->allowed_fields); /* Print header */
for (iter = (GSList *) nm_ip4_config_get_addresses (cfg); iter; iter = g_slist_next (iter)) {
NMIP4Address *addr = (NMIP4Address *) iter->data;
guint32 prefix = nm_ip4_address_get_prefix (addr);
char *tmp2;
char *addr_str, *prefix_str, *gateway_str;
tmp = ip4_address_as_string (nm_ip4_address_get_address (addr));
print_table_line (2, _("Address"), 23, tmp, 0, NULL);
g_free (tmp);
addr_str = ip4_address_as_string (nm_ip4_address_get_address (addr));
tmp2 = ip4_address_as_string (nm_utils_ip4_prefix_to_netmask (prefix));
tmp = g_strdup_printf ("%d (%s)", prefix, tmp2);
prefix_str = g_strdup_printf ("%d (%s)", prefix, tmp2);
g_free (tmp2);
print_table_line (2, _("Prefix"), 23, tmp, 0, NULL);
g_free (tmp);
tmp = ip4_address_as_string (nm_ip4_address_get_gateway (addr));
print_table_line (2, _("Gateway"), 23, tmp, 0, NULL);
g_free (tmp);
printf ("\n");
gateway_str = ip4_address_as_string (nm_ip4_address_get_gateway (addr));
nmc->allowed_fields[0].value = "IPv4-SETTINGS";
nmc->allowed_fields[1].value = addr_str;
nmc->allowed_fields[2].value = prefix_str;
nmc->allowed_fields[3].value = gateway_str;
nmc->print_fields.flags = multiline_flag | mode_flag | escape_flag;
print_fields (nmc->print_fields, nmc->allowed_fields); /* Print values */
g_free (addr_str);
g_free (prefix_str);
g_free (gateway_str);
}
array = nm_ip4_config_get_nameservers (cfg);
if (array) {
int i;
printf ("\n"); /* empty line */
nmc->allowed_fields = nmc_fields_dev_list_ip4_dns;
nmc->print_fields.flags = multiline_flag | mode_flag | escape_flag | NMC_PF_FLAG_FIELD_NAMES;
nmc->print_fields.indices = parse_output_fields (NMC_FIELDS_DEV_LIST_IP4_DNS_ALL, nmc->allowed_fields, NULL);
print_fields (nmc->print_fields, nmc->allowed_fields); /* Print header */
for (i = 0; i < array->len; i++) {
tmp = ip4_address_as_string (g_array_index (array, guint32, i));
print_table_line (2, _("DNS"), 23, tmp, 0, NULL);
nmc->allowed_fields[0].value = "IPv4-DNS";
nmc->allowed_fields[1].value = tmp;
nmc->print_fields.flags = multiline_flag | mode_flag | escape_flag;
print_fields (nmc->print_fields, nmc->allowed_fields); /* Print values */
g_free (tmp);
}
}
}
printf ("\n\n");
printf ("\n");
}
static void
@ -500,7 +609,7 @@ show_device_status (NMDevice *device, NmCli *nmc)
nmc->allowed_fields[1].value = get_device_type (device);
nmc->allowed_fields[2].value = device_state_to_string (nm_device_get_state (device));
nmc->print_fields.flags &= ~NMC_PF_FLAG_HEADER; /* Clear HEADER flag */
nmc->print_fields.flags &= ~NMC_PF_FLAG_MAIN_HEADER & ~NMC_PF_FLAG_FIELD_NAMES; /* Clear header flags */
print_fields (nmc->print_fields, nmc->allowed_fields);
}
@ -549,7 +658,7 @@ do_devices_status (NmCli *nmc, int argc, char **argv)
goto error;
}
nmc->print_fields.flags = multiline_flag | mode_flag | escape_flag | NMC_PF_FLAG_HEADER;
nmc->print_fields.flags = multiline_flag | mode_flag | escape_flag | NMC_PF_FLAG_MAIN_HEADER | NMC_PF_FLAG_FIELD_NAMES;
nmc->print_fields.header_name = _("Status of devices");
print_fields (nmc->print_fields, nmc->allowed_fields);
@ -598,9 +707,6 @@ do_devices_list (NmCli *nmc, int argc, char **argv)
devices = nm_client_get_devices (nmc->client);
/* Set allowed fields for use while printing in detail_access_point() */
nmc->allowed_fields = nmc_fields_dev_wifi_list;
if (iface_specified) {
for (i = 0; devices && (i < devices->len); i++) {
NMDevice *candidate = g_ptr_array_index (devices, i);
@ -852,7 +958,7 @@ do_device_wifi_list (NmCli *nmc, int argc, char **argv)
goto error;
}
nmc->print_fields.flags = multiline_flag | mode_flag | escape_flag | NMC_PF_FLAG_HEADER;
nmc->print_fields.flags = multiline_flag | mode_flag | escape_flag | NMC_PF_FLAG_MAIN_HEADER | NMC_PF_FLAG_FIELD_NAMES;
nmc->print_fields.header_name = _("WiFi scan list");
if (iface) {
@ -979,15 +1085,22 @@ do_device_wifi (NmCli *nmc, int argc, char **argv)
NMCResultCode
do_devices (NmCli *nmc, int argc, char **argv)
{
GError *error = NULL;
/* create NMClient */
if (!nmc->get_client (nmc))
goto error;
goto end;
if (argc == 0)
nmc->return_value = do_devices_status (nmc, argc-1, argv+1);
if (argc == 0) {
if (!nmc_terse_option_check (nmc->print_output, nmc->required_fields, &error))
goto error;
nmc->return_value = do_devices_status (nmc, 0, NULL);
}
if (argc > 0) {
if (matches (*argv, "status") == 0) {
if (!nmc_terse_option_check (nmc->print_output, nmc->required_fields, &error))
goto error;
nmc->return_value = do_devices_status (nmc, argc-1, argv+1);
}
else if (matches (*argv, "list") == 0) {
@ -997,6 +1110,8 @@ do_devices (NmCli *nmc, int argc, char **argv)
nmc->return_value = do_device_disconnect (nmc, argc-1, argv+1);
}
else if (matches (*argv, "wifi") == 0) {
if (!nmc_terse_option_check (nmc->print_output, nmc->required_fields, &error))
goto error;
nmc->return_value = do_device_wifi (nmc, argc-1, argv+1);
}
else if (strcmp (*argv, "help") == 0) {
@ -1008,6 +1123,12 @@ do_devices (NmCli *nmc, int argc, char **argv)
}
}
end:
return nmc->return_value;
error:
g_string_printf (nmc->return_text, _("Error: %s."), error->message);
nmc->return_value = NMC_RESULT_ERROR_UNKNOWN;
g_error_free (error);
return nmc->return_value;
}

View file

@ -130,7 +130,7 @@ show_nm_status (NmCli *nmc)
return nmc->return_value;
}
nmc->print_fields.flags = multiline_flag | mode_flag | escape_flag | NMC_PF_FLAG_HEADER;
nmc->print_fields.flags = multiline_flag | mode_flag | escape_flag | NMC_PF_FLAG_MAIN_HEADER | NMC_PF_FLAG_FIELD_NAMES;
nmc->print_fields.header_name = _("NetworkManager status");
print_fields (nmc->print_fields, nmc->allowed_fields); /* Print header */
@ -152,7 +152,7 @@ show_nm_status (NmCli *nmc)
nmc->allowed_fields[4].value = wwan_hw_enabled_str;
nmc->allowed_fields[5].value = wwan_enabled_str;
nmc->print_fields.flags &= ~NMC_PF_FLAG_HEADER; /* Clear HEADER flag */
nmc->print_fields.flags &= ~NMC_PF_FLAG_MAIN_HEADER & ~NMC_PF_FLAG_FIELD_NAMES; /* Clear header flags */
print_fields (nmc->print_fields, nmc->allowed_fields); /* Print values */
return NMC_RESULT_SUCCESS;
@ -163,6 +163,7 @@ show_nm_status (NmCli *nmc)
NMCResultCode
do_network_manager (NmCli *nmc, int argc, char **argv)
{
GError *error = NULL;
gboolean enable_wifi;
gboolean enable_wwan;
guint32 mode_flag = (nmc->print_output == NMC_PRINT_PRETTY) ? NMC_PF_FLAG_PRETTY : (nmc->print_output == NMC_PRINT_TERSE) ? NMC_PF_FLAG_TERSE : 0;
@ -174,11 +175,15 @@ do_network_manager (NmCli *nmc, int argc, char **argv)
goto end;
if (argc == 0) {
if (!nmc_terse_option_check (nmc->print_output, nmc->required_fields, &error))
goto error;
nmc->return_value = show_nm_status (nmc);
}
if (argc > 0) {
if (matches (*argv, "status") == 0) {
if (!nmc_terse_option_check (nmc->print_output, nmc->required_fields, &error))
goto error;
nmc->return_value = show_nm_status (nmc);
}
else if (matches (*argv, "sleep") == 0) {
@ -190,6 +195,8 @@ do_network_manager (NmCli *nmc, int argc, char **argv)
else if (matches (*argv, "wifi") == 0) {
if (next_arg (&argc, &argv) != 0) {
/* no argument, show current WiFi state */
if (!nmc_terse_option_check (nmc->print_output, nmc->required_fields, &error))
goto error;
if (nmc->required_fields && strcasecmp (nmc->required_fields, "WIFI")) {
g_string_printf (nmc->return_text, _("Error: '--fields' value '%s' is not valid here; allowed fields: %s"),
nmc->required_fields, NMC_FIELDS_NM_WIFI);
@ -198,11 +205,11 @@ do_network_manager (NmCli *nmc, int argc, char **argv)
}
nmc->allowed_fields = nmc_fields_nm_status;
nmc->print_fields.indices = parse_output_fields (NMC_FIELDS_NM_WIFI, nmc->allowed_fields, NULL);
nmc->print_fields.flags = multiline_flag | mode_flag | escape_flag | NMC_PF_FLAG_HEADER;
nmc->print_fields.flags = multiline_flag | mode_flag | escape_flag | NMC_PF_FLAG_MAIN_HEADER | NMC_PF_FLAG_FIELD_NAMES;
nmc->print_fields.header_name = _("WiFi enabled");
print_fields (nmc->print_fields, nmc->allowed_fields); /* Print header */
nmc->allowed_fields[3].value = nm_client_wireless_get_enabled (nmc->client) ? _("enabled") : _("disabled");
nmc->print_fields.flags &= ~NMC_PF_FLAG_HEADER; /* Clear HEADER flag */
nmc->print_fields.flags &= ~NMC_PF_FLAG_MAIN_HEADER & ~NMC_PF_FLAG_FIELD_NAMES; /* Clear header flags */
print_fields (nmc->print_fields, nmc->allowed_fields); /* Print header */
} else {
if (!strcmp (*argv, "on"))
@ -219,6 +226,8 @@ do_network_manager (NmCli *nmc, int argc, char **argv)
}
else if (matches (*argv, "wwan") == 0) {
if (next_arg (&argc, &argv) != 0) {
if (!nmc_terse_option_check (nmc->print_output, nmc->required_fields, &error))
goto error;
/* no argument, show current WWAN state */
if (nmc->required_fields && strcasecmp (nmc->required_fields, "WWAN")) {
g_string_printf (nmc->return_text, _("Error: '--fields' value '%s' is not valid here; allowed fields: %s"),
@ -228,11 +237,11 @@ do_network_manager (NmCli *nmc, int argc, char **argv)
}
nmc->allowed_fields = nmc_fields_nm_status;
nmc->print_fields.indices = parse_output_fields (NMC_FIELDS_NM_WWAN, nmc->allowed_fields, NULL);
nmc->print_fields.flags = multiline_flag | mode_flag | escape_flag | NMC_PF_FLAG_HEADER;
nmc->print_fields.flags = multiline_flag | mode_flag | escape_flag | NMC_PF_FLAG_MAIN_HEADER | NMC_PF_FLAG_FIELD_NAMES;
nmc->print_fields.header_name = _("WWAN enabled");
print_fields (nmc->print_fields, nmc->allowed_fields); /* Print header */
nmc->allowed_fields[5].value = nm_client_wwan_get_enabled (nmc->client) ? _("enabled") : _("disabled");
nmc->print_fields.flags &= ~NMC_PF_FLAG_HEADER; /* Clear HEADER flag */
nmc->print_fields.flags &= ~NMC_PF_FLAG_MAIN_HEADER & ~NMC_PF_FLAG_FIELD_NAMES; /* Clear header flags */
print_fields (nmc->print_fields, nmc->allowed_fields); /* Print header */
} else {
if (!strcmp (*argv, "on"))
@ -259,4 +268,11 @@ do_network_manager (NmCli *nmc, int argc, char **argv)
end:
quit ();
return nmc->return_value;
error:
quit ();
g_string_printf (nmc->return_text, _("Error: %s."), error->message);
nmc->return_value = NMC_RESULT_ERROR_UNKNOWN;
g_error_free (error);
return nmc->return_value;
}

View file

@ -201,20 +201,6 @@ parse_command_line (NmCli *nmc, int argc, char **argv)
argv++;
}
/* Some validity options checks */
if (nmc->print_output == NMC_PRINT_TERSE) {
if (!nmc->required_fields) {
g_string_printf (nmc->return_text, _("Option '--terse' requires specifying '--fields'."));
nmc->return_value = NMC_RESULT_ERROR_UNKNOWN;
return nmc->return_value;
} else if ( !strcasecmp (nmc->required_fields, "all")
|| !strcasecmp (nmc->required_fields, "common")) {
g_string_printf (nmc->return_text, _("Option '--terse' requires specific '--fields' option, not 'all' or 'common'."));
nmc->return_value = NMC_RESULT_ERROR_UNKNOWN;
return nmc->return_value;
}
}
if (argc > 1)
return do_cmd (nmc, argv[1], argc-1, argv+1);

View file

@ -63,11 +63,12 @@ typedef struct {
} NmcOutputField;
/* Flags for NmcPrintFields */
#define NMC_PF_FLAG_MULTILINE 0x00000001 /* Multiline output instead of tabular*/
#define NMC_PF_FLAG_TERSE 0x00000002 /* Terse outpud mode */
#define NMC_PF_FLAG_PRETTY 0x00000004 /* Pretty output mode */
#define NMC_PF_FLAG_HEADER 0x00000008 /* Print headers instead of values */
#define NMC_PF_FLAG_ESCAPE 0x00000010 /* Escape column separator and '\' */
#define NMC_PF_FLAG_MULTILINE 0x00000001 /* Multiline output instead of tabular*/
#define NMC_PF_FLAG_TERSE 0x00000002 /* Terse outpud mode */
#define NMC_PF_FLAG_PRETTY 0x00000004 /* Pretty output mode */
#define NMC_PF_FLAG_MAIN_HEADER 0x00000008 /* Print main header */
#define NMC_PF_FLAG_FIELD_NAMES 0x00000010 /* Print field names instead of values */
#define NMC_PF_FLAG_ESCAPE 0x00000020 /* Escape column separator and '\' */
typedef struct {
GArray *indices; /* Array of field indices to the array of allowed fields */

View file

@ -91,6 +91,24 @@ done:
return array;
}
gboolean
nmc_terse_option_check (NMCPrintOutput print_output, const char *fields, GError **error)
{
g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
if (print_output == NMC_PRINT_TERSE) {
if (!fields) {
g_set_error (error, 0, 0, _("Option '--terse' requires specifying '--fields'"));
return FALSE;
} else if ( !strcasecmp (fields, "all")
|| !strcasecmp (fields, "common")) {
g_set_error (error, 0, 0, _("Option '--terse' requires specific '--fields' option values , not '%s'"), fields);
return FALSE;
}
}
return TRUE;
}
/*
* Print both headers or values of 'field_values' array.
* Entries to print and their order are specified via indices
@ -110,20 +128,21 @@ print_fields (const NmcPrintFields fields, const NmcOutputField field_values[])
gboolean multiline = fields.flags & NMC_PF_FLAG_MULTILINE;
gboolean terse = fields.flags & NMC_PF_FLAG_TERSE;
gboolean pretty = fields.flags & NMC_PF_FLAG_PRETTY;
gboolean header = fields.flags & NMC_PF_FLAG_HEADER;
gboolean main_header = fields.flags & NMC_PF_FLAG_MAIN_HEADER;
gboolean field_names = fields.flags & NMC_PF_FLAG_FIELD_NAMES;
gboolean escape = fields.flags & NMC_PF_FLAG_ESCAPE;
/* No headers are printed in terse mode:
* - neither whole name header nor field (column) names
* - neither main header nor field (column) names
*/
if (header && terse)
if ((main_header || field_names) && terse)
return;
if (multiline) {
/* --- Multiline mode --- */
enum { ML_HEADER_WIDTH = 79 };
if (header && pretty) {
/* Print the table header */
if (main_header && pretty) {
/* Print the main header */
int header_width = g_utf8_strlen (fields.header_name, -1) + 4;
table_width = header_width < ML_HEADER_WIDTH ? ML_HEADER_WIDTH : header_width;
@ -137,7 +156,7 @@ print_fields (const NmcPrintFields fields, const NmcOutputField field_values[])
}
/* Print values */
if (!header) {
if (!field_names) {
for (i = 0; i < fields.indices->len; i++) {
char *tmp;
idx = g_array_index (fields.indices, int, i);
@ -159,7 +178,7 @@ print_fields (const NmcPrintFields fields, const NmcOutputField field_values[])
for (i = 0; i < fields.indices->len; i++) {
idx = g_array_index (fields.indices, int, i);
if (header)
if (field_names)
value = _(field_values[idx].name_l10n);
else
value = field_values[idx].value;
@ -187,8 +206,8 @@ print_fields (const NmcPrintFields fields, const NmcOutputField field_values[])
}
}
/* Print the table header */
if (header && pretty) {
/* Print the main table header */
if (main_header && pretty) {
int header_width = g_utf8_strlen (fields.header_name, -1) + 4;
table_width = table_width < header_width ? header_width : table_width;
@ -213,7 +232,7 @@ print_fields (const NmcPrintFields fields, const NmcOutputField field_values[])
}
/* Print horizontal separator */
if (header && pretty) {
if (field_names && pretty) {
if (str->len > 0) {
line = g_strnfill (table_width, '-');
printf ("%s\n", line);

View file

@ -28,6 +28,7 @@
int matches (const char *cmd, const char *pattern);
int next_arg (int *argc, char ***argv);
GArray *parse_output_fields (const char *fields_str, const NmcOutputField fields_array[], GError **error);
gboolean nmc_terse_option_check (NMCPrintOutput print_output, const char *fields, GError **error);
void print_fields (const NmcPrintFields fields, const NmcOutputField field_values[]);
void print_table_header (const char *name, ...);
void print_table_line (int indent, ...);