2010-02-25 09:52:30 -08:00
|
|
|
/* nmcli - command-line tool to control NetworkManager
|
|
|
|
|
*
|
|
|
|
|
* This program is free software; you can redistribute it and/or modify
|
|
|
|
|
* it under the terms of the GNU General Public License as published by
|
|
|
|
|
* the Free Software Foundation; either version 2 of the License, or
|
|
|
|
|
* (at your option) any later version.
|
|
|
|
|
*
|
|
|
|
|
* This program is distributed in the hope that it will be useful,
|
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
|
* GNU General Public License for more details.
|
|
|
|
|
*
|
|
|
|
|
* You should have received a copy of the GNU General Public License along
|
|
|
|
|
* with this program; if not, write to the Free Software Foundation, Inc.,
|
|
|
|
|
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
|
|
|
*
|
2014-10-01 10:31:03 +02:00
|
|
|
* Copyright 2010 - 2014 Red Hat, Inc.
|
2010-02-25 09:52:30 -08:00
|
|
|
*/
|
|
|
|
|
|
2016-02-19 14:57:48 +01:00
|
|
|
#include "nm-default.h"
|
2011-03-14 01:00:56 -05:00
|
|
|
|
2017-04-04 13:52:13 +02:00
|
|
|
#include "devices.h"
|
|
|
|
|
|
2010-02-25 09:52:30 -08:00
|
|
|
#include <stdio.h>
|
|
|
|
|
#include <string.h>
|
|
|
|
|
#include <stdlib.h>
|
|
|
|
|
#include <errno.h>
|
2014-05-14 09:22:50 +02:00
|
|
|
#include <readline/readline.h>
|
2010-02-25 09:52:30 -08:00
|
|
|
|
2014-11-20 12:36:14 +01:00
|
|
|
#include "nm-secret-agent-simple.h"
|
2017-03-28 12:16:31 +02:00
|
|
|
#include "nm-client-utils.h"
|
|
|
|
|
|
2014-10-30 15:45:43 +01:00
|
|
|
#include "polkit-agent.h"
|
2010-02-25 09:52:30 -08:00
|
|
|
#include "utils.h"
|
2012-01-06 13:51:33 +01:00
|
|
|
#include "common.h"
|
2016-06-22 18:25:48 +02:00
|
|
|
#include "connections.h"
|
2010-02-25 09:52:30 -08:00
|
|
|
|
2014-05-15 12:52:26 +02:00
|
|
|
/* define some prompts */
|
2015-03-11 19:10:58 +01:00
|
|
|
#define PROMPT_INTERFACE _("Interface: ")
|
|
|
|
|
#define PROMPT_INTERFACES _("Interface(s): ")
|
2010-02-25 09:52:30 -08:00
|
|
|
|
cli: split tracking of meta data out of NmcOutputField
When generating output data, nmcli iterates over a list of
property-descriptors (nmc_fields_ip4_config), creates an intermediate
array (output_data) and finally prints it.
However, previously both the meta data (nmc_fields_ip4_config) and
the intermediate format use the same type NmcOutputField. This means,
certain fields are relevant to describe a property, and other fields
are output/formatting fields.
Split this up. Now, the meta data is tracked in form of an NMMetaAbstractInfo
lists. This separates the information about properties from intermediate steps
during creation of the output.
Note that currently functions like print_ip4_config() still have all the
knowledge about how to generate the output. That is wrong, instead, the
meta data (NMMetaAbstractInfo) should describe how to create the output
and then all those functions could be replaced. This means, later we want
to add more knowledge to the NMMetaAbstractInfo, so it is important to
keep them separate from NmcOutputField.
2017-03-31 19:18:16 +02:00
|
|
|
const NmcMetaGenericInfo *const nmc_fields_dev_status[] = {
|
|
|
|
|
NMC_META_GENERIC ("DEVICE"), /* 0 */
|
|
|
|
|
NMC_META_GENERIC ("TYPE"), /* 1 */
|
|
|
|
|
NMC_META_GENERIC ("STATE"), /* 2 */
|
|
|
|
|
NMC_META_GENERIC ("DBUS-PATH"), /* 3 */
|
|
|
|
|
NMC_META_GENERIC ("CONNECTION"), /* 4 */
|
|
|
|
|
NMC_META_GENERIC ("CON-UUID"), /* 5 */
|
|
|
|
|
NMC_META_GENERIC ("CON-PATH"), /* 6 */
|
|
|
|
|
NULL,
|
2010-03-18 15:39:15 +01:00
|
|
|
};
|
2013-12-09 12:21:44 +01:00
|
|
|
#define NMC_FIELDS_DEV_STATUS_COMMON "DEVICE,TYPE,STATE,CONNECTION"
|
2010-03-18 15:39:15 +01:00
|
|
|
|
2010-03-24 19:05:35 +01:00
|
|
|
|
cli: split tracking of meta data out of NmcOutputField
When generating output data, nmcli iterates over a list of
property-descriptors (nmc_fields_ip4_config), creates an intermediate
array (output_data) and finally prints it.
However, previously both the meta data (nmc_fields_ip4_config) and
the intermediate format use the same type NmcOutputField. This means,
certain fields are relevant to describe a property, and other fields
are output/formatting fields.
Split this up. Now, the meta data is tracked in form of an NMMetaAbstractInfo
lists. This separates the information about properties from intermediate steps
during creation of the output.
Note that currently functions like print_ip4_config() still have all the
knowledge about how to generate the output. That is wrong, instead, the
meta data (NMMetaAbstractInfo) should describe how to create the output
and then all those functions could be replaced. This means, later we want
to add more knowledge to the NMMetaAbstractInfo, so it is important to
keep them separate from NmcOutputField.
2017-03-31 19:18:16 +02:00
|
|
|
const NmcMetaGenericInfo *const nmc_fields_dev_show_general[] = {
|
|
|
|
|
NMC_META_GENERIC ("NAME"), /* 0 */
|
|
|
|
|
NMC_META_GENERIC ("DEVICE"), /* 1 */
|
|
|
|
|
NMC_META_GENERIC ("TYPE"), /* 2 */
|
|
|
|
|
NMC_META_GENERIC ("NM-TYPE"), /* 3 */
|
|
|
|
|
NMC_META_GENERIC ("VENDOR"), /* 4 */
|
|
|
|
|
NMC_META_GENERIC ("PRODUCT"), /* 5 */
|
|
|
|
|
NMC_META_GENERIC ("DRIVER"), /* 6 */
|
|
|
|
|
NMC_META_GENERIC ("DRIVER-VERSION"), /* 7 */
|
|
|
|
|
NMC_META_GENERIC ("FIRMWARE-VERSION"), /* 8 */
|
|
|
|
|
NMC_META_GENERIC ("HWADDR"), /* 9 */
|
|
|
|
|
NMC_META_GENERIC ("MTU"), /* 10 */
|
|
|
|
|
NMC_META_GENERIC ("STATE"), /* 11 */
|
|
|
|
|
NMC_META_GENERIC ("REASON"), /* 12 */
|
|
|
|
|
NMC_META_GENERIC ("UDI"), /* 13 */
|
|
|
|
|
NMC_META_GENERIC ("IP-IFACE"), /* 14 */
|
|
|
|
|
NMC_META_GENERIC ("IS-SOFTWARE"), /* 15 */
|
|
|
|
|
NMC_META_GENERIC ("NM-MANAGED"), /* 16 */
|
|
|
|
|
NMC_META_GENERIC ("AUTOCONNECT"), /* 17 */
|
|
|
|
|
NMC_META_GENERIC ("FIRMWARE-MISSING"), /* 18 */
|
|
|
|
|
NMC_META_GENERIC ("NM-PLUGIN-MISSING"), /* 19 */
|
|
|
|
|
NMC_META_GENERIC ("PHYS-PORT-ID"), /* 20 */
|
|
|
|
|
NMC_META_GENERIC ("CONNECTION"), /* 21 */
|
|
|
|
|
NMC_META_GENERIC ("CON-UUID"), /* 22 */
|
|
|
|
|
NMC_META_GENERIC ("CON-PATH"), /* 23 */
|
|
|
|
|
NMC_META_GENERIC ("METERED"), /* 24 */
|
|
|
|
|
NULL,
|
2010-03-22 18:43:28 +01:00
|
|
|
};
|
2013-04-03 10:01:42 +02:00
|
|
|
#define NMC_FIELDS_DEV_SHOW_GENERAL_COMMON "NAME,DEVICE,TYPE,VENDOR,PRODUCT,DRIVER,HWADDR,STATE"
|
2010-03-22 18:43:28 +01:00
|
|
|
|
cli: split tracking of meta data out of NmcOutputField
When generating output data, nmcli iterates over a list of
property-descriptors (nmc_fields_ip4_config), creates an intermediate
array (output_data) and finally prints it.
However, previously both the meta data (nmc_fields_ip4_config) and
the intermediate format use the same type NmcOutputField. This means,
certain fields are relevant to describe a property, and other fields
are output/formatting fields.
Split this up. Now, the meta data is tracked in form of an NMMetaAbstractInfo
lists. This separates the information about properties from intermediate steps
during creation of the output.
Note that currently functions like print_ip4_config() still have all the
knowledge about how to generate the output. That is wrong, instead, the
meta data (NMMetaAbstractInfo) should describe how to create the output
and then all those functions could be replaced. This means, later we want
to add more knowledge to the NMMetaAbstractInfo, so it is important to
keep them separate from NmcOutputField.
2017-03-31 19:18:16 +02:00
|
|
|
const NmcMetaGenericInfo *const nmc_fields_dev_show_connections[] = {
|
|
|
|
|
NMC_META_GENERIC ("NAME"), /* 0 */
|
|
|
|
|
NMC_META_GENERIC ("AVAILABLE-CONNECTION-PATHS"), /* 1 */
|
|
|
|
|
NMC_META_GENERIC ("AVAILABLE-CONNECTIONS"), /* 2 */
|
|
|
|
|
NULL,
|
2012-08-31 12:48:27 +02:00
|
|
|
};
|
2017-03-24 12:38:01 +01:00
|
|
|
#define NMC_FIELDS_DEV_SHOW_CONNECTIONS_COMMON "NAME,AVAILABLE-CONNECTION-PATHS,AVAILABLE-CONNECTIONS"
|
2012-08-31 12:48:27 +02:00
|
|
|
|
cli: split tracking of meta data out of NmcOutputField
When generating output data, nmcli iterates over a list of
property-descriptors (nmc_fields_ip4_config), creates an intermediate
array (output_data) and finally prints it.
However, previously both the meta data (nmc_fields_ip4_config) and
the intermediate format use the same type NmcOutputField. This means,
certain fields are relevant to describe a property, and other fields
are output/formatting fields.
Split this up. Now, the meta data is tracked in form of an NMMetaAbstractInfo
lists. This separates the information about properties from intermediate steps
during creation of the output.
Note that currently functions like print_ip4_config() still have all the
knowledge about how to generate the output. That is wrong, instead, the
meta data (NMMetaAbstractInfo) should describe how to create the output
and then all those functions could be replaced. This means, later we want
to add more knowledge to the NMMetaAbstractInfo, so it is important to
keep them separate from NmcOutputField.
2017-03-31 19:18:16 +02:00
|
|
|
const NmcMetaGenericInfo *const nmc_fields_dev_show_cap[] = {
|
|
|
|
|
NMC_META_GENERIC ("NAME"), /* 0 */
|
|
|
|
|
NMC_META_GENERIC ("CARRIER-DETECT"), /* 1 */
|
|
|
|
|
NMC_META_GENERIC ("SPEED"), /* 2 */
|
|
|
|
|
NMC_META_GENERIC ("IS-SOFTWARE"), /* 3 */
|
2017-04-14 23:16:11 +02:00
|
|
|
NMC_META_GENERIC ("SRIOV"), /* 4 */
|
cli: split tracking of meta data out of NmcOutputField
When generating output data, nmcli iterates over a list of
property-descriptors (nmc_fields_ip4_config), creates an intermediate
array (output_data) and finally prints it.
However, previously both the meta data (nmc_fields_ip4_config) and
the intermediate format use the same type NmcOutputField. This means,
certain fields are relevant to describe a property, and other fields
are output/formatting fields.
Split this up. Now, the meta data is tracked in form of an NMMetaAbstractInfo
lists. This separates the information about properties from intermediate steps
during creation of the output.
Note that currently functions like print_ip4_config() still have all the
knowledge about how to generate the output. That is wrong, instead, the
meta data (NMMetaAbstractInfo) should describe how to create the output
and then all those functions could be replaced. This means, later we want
to add more knowledge to the NMMetaAbstractInfo, so it is important to
keep them separate from NmcOutputField.
2017-03-31 19:18:16 +02:00
|
|
|
NULL,
|
2010-03-22 18:43:28 +01:00
|
|
|
};
|
2014-07-11 10:33:11 +02:00
|
|
|
#define NMC_FIELDS_DEV_SHOW_CAP_COMMON "NAME,CARRIER-DETECT,SPEED,IS-SOFTWARE"
|
2010-03-22 18:43:28 +01:00
|
|
|
|
cli: split tracking of meta data out of NmcOutputField
When generating output data, nmcli iterates over a list of
property-descriptors (nmc_fields_ip4_config), creates an intermediate
array (output_data) and finally prints it.
However, previously both the meta data (nmc_fields_ip4_config) and
the intermediate format use the same type NmcOutputField. This means,
certain fields are relevant to describe a property, and other fields
are output/formatting fields.
Split this up. Now, the meta data is tracked in form of an NMMetaAbstractInfo
lists. This separates the information about properties from intermediate steps
during creation of the output.
Note that currently functions like print_ip4_config() still have all the
knowledge about how to generate the output. That is wrong, instead, the
meta data (NMMetaAbstractInfo) should describe how to create the output
and then all those functions could be replaced. This means, later we want
to add more knowledge to the NMMetaAbstractInfo, so it is important to
keep them separate from NmcOutputField.
2017-03-31 19:18:16 +02:00
|
|
|
const NmcMetaGenericInfo *const nmc_fields_dev_show_wired_prop[] = {
|
|
|
|
|
NMC_META_GENERIC ("NAME"), /* 0 */
|
|
|
|
|
NMC_META_GENERIC ("CARRIER"), /* 1 */
|
|
|
|
|
NMC_META_GENERIC ("S390-SUBCHANNELS"), /* 2 */
|
|
|
|
|
NULL,
|
2010-03-22 18:43:28 +01:00
|
|
|
};
|
2015-09-23 16:07:08 +02:00
|
|
|
#define NMC_FIELDS_DEV_SHOW_WIRED_PROP_COMMON "NAME,CARRIER,S390-SUBCHANNELS"
|
2010-03-22 18:43:28 +01:00
|
|
|
|
cli: split tracking of meta data out of NmcOutputField
When generating output data, nmcli iterates over a list of
property-descriptors (nmc_fields_ip4_config), creates an intermediate
array (output_data) and finally prints it.
However, previously both the meta data (nmc_fields_ip4_config) and
the intermediate format use the same type NmcOutputField. This means,
certain fields are relevant to describe a property, and other fields
are output/formatting fields.
Split this up. Now, the meta data is tracked in form of an NMMetaAbstractInfo
lists. This separates the information about properties from intermediate steps
during creation of the output.
Note that currently functions like print_ip4_config() still have all the
knowledge about how to generate the output. That is wrong, instead, the
meta data (NMMetaAbstractInfo) should describe how to create the output
and then all those functions could be replaced. This means, later we want
to add more knowledge to the NMMetaAbstractInfo, so it is important to
keep them separate from NmcOutputField.
2017-03-31 19:18:16 +02:00
|
|
|
const NmcMetaGenericInfo *const nmc_fields_dev_show_wifi_prop[] = {
|
|
|
|
|
NMC_META_GENERIC ("NAME"), /* 0 */
|
|
|
|
|
NMC_META_GENERIC ("WEP"), /* 1 */
|
|
|
|
|
NMC_META_GENERIC ("WPA"), /* 2 */
|
|
|
|
|
NMC_META_GENERIC ("WPA2"), /* 3 */
|
|
|
|
|
NMC_META_GENERIC ("TKIP"), /* 4 */
|
|
|
|
|
NMC_META_GENERIC ("CCMP"), /* 5 */
|
|
|
|
|
NMC_META_GENERIC ("AP"), /* 6 */
|
|
|
|
|
NMC_META_GENERIC ("ADHOC"), /* 7 */
|
|
|
|
|
NMC_META_GENERIC ("2GHZ"), /* 8 */
|
|
|
|
|
NMC_META_GENERIC ("5GHZ"), /* 9 */
|
|
|
|
|
NULL,
|
2010-03-22 18:43:28 +01:00
|
|
|
};
|
2013-04-03 10:01:42 +02:00
|
|
|
#define NMC_FIELDS_DEV_SHOW_WIFI_PROP_COMMON "NAME,WEP,WPA,WPA2,TKIP,CCMP,AP,ADHOC"
|
2010-03-22 18:43:28 +01:00
|
|
|
|
cli: split tracking of meta data out of NmcOutputField
When generating output data, nmcli iterates over a list of
property-descriptors (nmc_fields_ip4_config), creates an intermediate
array (output_data) and finally prints it.
However, previously both the meta data (nmc_fields_ip4_config) and
the intermediate format use the same type NmcOutputField. This means,
certain fields are relevant to describe a property, and other fields
are output/formatting fields.
Split this up. Now, the meta data is tracked in form of an NMMetaAbstractInfo
lists. This separates the information about properties from intermediate steps
during creation of the output.
Note that currently functions like print_ip4_config() still have all the
knowledge about how to generate the output. That is wrong, instead, the
meta data (NMMetaAbstractInfo) should describe how to create the output
and then all those functions could be replaced. This means, later we want
to add more knowledge to the NMMetaAbstractInfo, so it is important to
keep them separate from NmcOutputField.
2017-03-31 19:18:16 +02:00
|
|
|
const NmcMetaGenericInfo *const nmc_fields_dev_show_wimax_prop[] = {
|
|
|
|
|
NMC_META_GENERIC ("NAME"), /* 0 */
|
|
|
|
|
NMC_META_GENERIC ("CTR-FREQ"), /* 1 */
|
|
|
|
|
NMC_META_GENERIC ("RSSI"), /* 2 */
|
|
|
|
|
NMC_META_GENERIC ("CINR"), /* 3 */
|
|
|
|
|
NMC_META_GENERIC ("TX-POW"), /* 4 */
|
|
|
|
|
NMC_META_GENERIC ("BSID"), /* 5 */
|
|
|
|
|
NULL,
|
2011-01-06 17:01:55 -06:00
|
|
|
};
|
2013-04-03 10:01:42 +02:00
|
|
|
#define NMC_FIELDS_DEV_SHOW_WIMAX_PROP_COMMON "NAME,CTR-FREQ,RSSI,CINR,TX-POW,BSID"
|
2013-12-10 12:00:53 +01:00
|
|
|
|
cli: split tracking of meta data out of NmcOutputField
When generating output data, nmcli iterates over a list of
property-descriptors (nmc_fields_ip4_config), creates an intermediate
array (output_data) and finally prints it.
However, previously both the meta data (nmc_fields_ip4_config) and
the intermediate format use the same type NmcOutputField. This means,
certain fields are relevant to describe a property, and other fields
are output/formatting fields.
Split this up. Now, the meta data is tracked in form of an NMMetaAbstractInfo
lists. This separates the information about properties from intermediate steps
during creation of the output.
Note that currently functions like print_ip4_config() still have all the
knowledge about how to generate the output. That is wrong, instead, the
meta data (NMMetaAbstractInfo) should describe how to create the output
and then all those functions could be replaced. This means, later we want
to add more knowledge to the NMMetaAbstractInfo, so it is important to
keep them separate from NmcOutputField.
2017-03-31 19:18:16 +02:00
|
|
|
const NmcMetaGenericInfo *const nmc_fields_dev_wifi_list[] = {
|
|
|
|
|
NMC_META_GENERIC ("NAME"), /* 0 */
|
|
|
|
|
NMC_META_GENERIC ("SSID"), /* 1 */
|
|
|
|
|
NMC_META_GENERIC ("SSID-HEX"), /* 2 */
|
|
|
|
|
NMC_META_GENERIC ("BSSID"), /* 3 */
|
|
|
|
|
NMC_META_GENERIC ("MODE"), /* 4 */
|
|
|
|
|
NMC_META_GENERIC ("CHAN"), /* 5 */
|
|
|
|
|
NMC_META_GENERIC ("FREQ"), /* 6 */
|
|
|
|
|
NMC_META_GENERIC ("RATE"), /* 7 */
|
|
|
|
|
NMC_META_GENERIC ("SIGNAL"), /* 8 */
|
|
|
|
|
NMC_META_GENERIC ("BARS"), /* 9 */
|
|
|
|
|
NMC_META_GENERIC ("SECURITY"), /* 10 */
|
|
|
|
|
NMC_META_GENERIC ("WPA-FLAGS"), /* 11 */
|
|
|
|
|
NMC_META_GENERIC ("RSN-FLAGS"), /* 12 */
|
|
|
|
|
NMC_META_GENERIC ("DEVICE"), /* 13 */
|
|
|
|
|
NMC_META_GENERIC ("ACTIVE"), /* 14 */
|
|
|
|
|
NMC_META_GENERIC ("IN-USE"), /* 15 */
|
|
|
|
|
NMC_META_GENERIC ("DBUS-PATH"), /* 16 */
|
|
|
|
|
NULL,
|
2010-03-18 15:39:15 +01:00
|
|
|
};
|
2013-05-20 15:50:47 +02:00
|
|
|
#define NMC_FIELDS_DEV_WIFI_LIST_COMMON "IN-USE,SSID,MODE,CHAN,RATE,SIGNAL,BARS,SECURITY"
|
2010-03-22 18:43:28 +01:00
|
|
|
#define NMC_FIELDS_DEV_WIFI_LIST_FOR_DEV_LIST "NAME,"NMC_FIELDS_DEV_WIFI_LIST_COMMON
|
2010-03-18 15:39:15 +01:00
|
|
|
|
cli: split tracking of meta data out of NmcOutputField
When generating output data, nmcli iterates over a list of
property-descriptors (nmc_fields_ip4_config), creates an intermediate
array (output_data) and finally prints it.
However, previously both the meta data (nmc_fields_ip4_config) and
the intermediate format use the same type NmcOutputField. This means,
certain fields are relevant to describe a property, and other fields
are output/formatting fields.
Split this up. Now, the meta data is tracked in form of an NMMetaAbstractInfo
lists. This separates the information about properties from intermediate steps
during creation of the output.
Note that currently functions like print_ip4_config() still have all the
knowledge about how to generate the output. That is wrong, instead, the
meta data (NMMetaAbstractInfo) should describe how to create the output
and then all those functions could be replaced. This means, later we want
to add more knowledge to the NMMetaAbstractInfo, so it is important to
keep them separate from NmcOutputField.
2017-03-31 19:18:16 +02:00
|
|
|
const NmcMetaGenericInfo *const nmc_fields_dev_wimax_list[] = {
|
|
|
|
|
NMC_META_GENERIC ("NAME"), /* 0 */
|
|
|
|
|
NMC_META_GENERIC ("NSP"), /* 1 */
|
|
|
|
|
NMC_META_GENERIC ("SIGNAL"), /* 2 */
|
|
|
|
|
NMC_META_GENERIC ("TYPE"), /* 3 */
|
|
|
|
|
NMC_META_GENERIC ("DEVICE"), /* 4 */
|
|
|
|
|
NMC_META_GENERIC ("ACTIVE"), /* 5 */
|
|
|
|
|
NMC_META_GENERIC ("DBUS-PATH"), /* 6 */
|
|
|
|
|
NULL,
|
2011-01-06 17:01:55 -06:00
|
|
|
};
|
|
|
|
|
#define NMC_FIELDS_DEV_WIMAX_LIST_COMMON "NSP,SIGNAL,TYPE,DEVICE,ACTIVE"
|
|
|
|
|
#define NMC_FIELDS_DEV_WIMAX_LIST_FOR_DEV_LIST "NAME,"NMC_FIELDS_DEV_WIMAX_LIST_COMMON
|
|
|
|
|
|
cli: split tracking of meta data out of NmcOutputField
When generating output data, nmcli iterates over a list of
property-descriptors (nmc_fields_ip4_config), creates an intermediate
array (output_data) and finally prints it.
However, previously both the meta data (nmc_fields_ip4_config) and
the intermediate format use the same type NmcOutputField. This means,
certain fields are relevant to describe a property, and other fields
are output/formatting fields.
Split this up. Now, the meta data is tracked in form of an NMMetaAbstractInfo
lists. This separates the information about properties from intermediate steps
during creation of the output.
Note that currently functions like print_ip4_config() still have all the
knowledge about how to generate the output. That is wrong, instead, the
meta data (NMMetaAbstractInfo) should describe how to create the output
and then all those functions could be replaced. This means, later we want
to add more knowledge to the NMMetaAbstractInfo, so it is important to
keep them separate from NmcOutputField.
2017-03-31 19:18:16 +02:00
|
|
|
const NmcMetaGenericInfo *const nmc_fields_dev_show_master_prop[] = {
|
|
|
|
|
NMC_META_GENERIC ("NAME"), /* 0 */
|
|
|
|
|
NMC_META_GENERIC ("SLAVES"), /* 1 */
|
|
|
|
|
NULL,
|
2012-10-22 14:31:11 +02:00
|
|
|
};
|
2014-09-23 14:49:43 +02:00
|
|
|
#define NMC_FIELDS_DEV_SHOW_MASTER_PROP_COMMON "NAME,SLAVES"
|
2012-10-22 14:31:11 +02:00
|
|
|
|
cli: split tracking of meta data out of NmcOutputField
When generating output data, nmcli iterates over a list of
property-descriptors (nmc_fields_ip4_config), creates an intermediate
array (output_data) and finally prints it.
However, previously both the meta data (nmc_fields_ip4_config) and
the intermediate format use the same type NmcOutputField. This means,
certain fields are relevant to describe a property, and other fields
are output/formatting fields.
Split this up. Now, the meta data is tracked in form of an NMMetaAbstractInfo
lists. This separates the information about properties from intermediate steps
during creation of the output.
Note that currently functions like print_ip4_config() still have all the
knowledge about how to generate the output. That is wrong, instead, the
meta data (NMMetaAbstractInfo) should describe how to create the output
and then all those functions could be replaced. This means, later we want
to add more knowledge to the NMMetaAbstractInfo, so it is important to
keep them separate from NmcOutputField.
2017-03-31 19:18:16 +02:00
|
|
|
const NmcMetaGenericInfo *const nmc_fields_dev_show_team_prop[] = {
|
|
|
|
|
NMC_META_GENERIC ("NAME"), /* 0 */
|
|
|
|
|
NMC_META_GENERIC ("SLAVES"), /* 1 */
|
|
|
|
|
NMC_META_GENERIC ("CONFIG"), /* 2 */
|
|
|
|
|
NULL,
|
2016-05-16 14:42:41 +02:00
|
|
|
};
|
|
|
|
|
#define NMC_FIELDS_DEV_SHOW_TEAM_PROP_COMMON "NAME,SLAVES,CONFIG"
|
|
|
|
|
|
cli: split tracking of meta data out of NmcOutputField
When generating output data, nmcli iterates over a list of
property-descriptors (nmc_fields_ip4_config), creates an intermediate
array (output_data) and finally prints it.
However, previously both the meta data (nmc_fields_ip4_config) and
the intermediate format use the same type NmcOutputField. This means,
certain fields are relevant to describe a property, and other fields
are output/formatting fields.
Split this up. Now, the meta data is tracked in form of an NMMetaAbstractInfo
lists. This separates the information about properties from intermediate steps
during creation of the output.
Note that currently functions like print_ip4_config() still have all the
knowledge about how to generate the output. That is wrong, instead, the
meta data (NMMetaAbstractInfo) should describe how to create the output
and then all those functions could be replaced. This means, later we want
to add more knowledge to the NMMetaAbstractInfo, so it is important to
keep them separate from NmcOutputField.
2017-03-31 19:18:16 +02:00
|
|
|
const NmcMetaGenericInfo *const nmc_fields_dev_show_vlan_prop[] = {
|
|
|
|
|
NMC_META_GENERIC ("NAME"), /* 0 */
|
|
|
|
|
NMC_META_GENERIC ("PARENT"), /* 1 */
|
|
|
|
|
NMC_META_GENERIC ("ID"), /* 2 */
|
|
|
|
|
NULL,
|
2012-10-22 15:18:34 +02:00
|
|
|
};
|
2014-07-21 13:08:53 +02:00
|
|
|
#define NMC_FIELDS_DEV_SHOW_VLAN_PROP_COMMON "NAME,PARENT,ID"
|
2012-10-22 15:18:34 +02:00
|
|
|
|
cli: split tracking of meta data out of NmcOutputField
When generating output data, nmcli iterates over a list of
property-descriptors (nmc_fields_ip4_config), creates an intermediate
array (output_data) and finally prints it.
However, previously both the meta data (nmc_fields_ip4_config) and
the intermediate format use the same type NmcOutputField. This means,
certain fields are relevant to describe a property, and other fields
are output/formatting fields.
Split this up. Now, the meta data is tracked in form of an NMMetaAbstractInfo
lists. This separates the information about properties from intermediate steps
during creation of the output.
Note that currently functions like print_ip4_config() still have all the
knowledge about how to generate the output. That is wrong, instead, the
meta data (NMMetaAbstractInfo) should describe how to create the output
and then all those functions could be replaced. This means, later we want
to add more knowledge to the NMMetaAbstractInfo, so it is important to
keep them separate from NmcOutputField.
2017-03-31 19:18:16 +02:00
|
|
|
const NmcMetaGenericInfo *const nmc_fields_dev_show_bluetooth[] = {
|
|
|
|
|
NMC_META_GENERIC ("NAME"), /* 0 */
|
|
|
|
|
NMC_META_GENERIC ("CAPABILITIES"), /* 1 */
|
|
|
|
|
NULL,
|
2014-09-24 12:00:47 +02:00
|
|
|
};
|
|
|
|
|
#define NMC_FIELDS_DEV_SHOW_BLUETOOTH_COMMON "NAME,CAPABILITIES"
|
|
|
|
|
|
2013-12-10 12:00:53 +01:00
|
|
|
/* Available sections for 'device show' */
|
cli: split tracking of meta data out of NmcOutputField
When generating output data, nmcli iterates over a list of
property-descriptors (nmc_fields_ip4_config), creates an intermediate
array (output_data) and finally prints it.
However, previously both the meta data (nmc_fields_ip4_config) and
the intermediate format use the same type NmcOutputField. This means,
certain fields are relevant to describe a property, and other fields
are output/formatting fields.
Split this up. Now, the meta data is tracked in form of an NMMetaAbstractInfo
lists. This separates the information about properties from intermediate steps
during creation of the output.
Note that currently functions like print_ip4_config() still have all the
knowledge about how to generate the output. That is wrong, instead, the
meta data (NMMetaAbstractInfo) should describe how to create the output
and then all those functions could be replaced. This means, later we want
to add more knowledge to the NMMetaAbstractInfo, so it is important to
keep them separate from NmcOutputField.
2017-03-31 19:18:16 +02:00
|
|
|
const NmcMetaGenericInfo *const nmc_fields_dev_show_sections[] = {
|
|
|
|
|
NMC_META_GENERIC_WITH_NESTED ("GENERAL", nmc_fields_dev_show_general + 1), /* 0 */
|
|
|
|
|
NMC_META_GENERIC_WITH_NESTED ("CAPABILITIES", nmc_fields_dev_show_cap + 1), /* 1 */
|
|
|
|
|
NMC_META_GENERIC_WITH_NESTED ("WIFI-PROPERTIES", nmc_fields_dev_show_wifi_prop + 1), /* 2 */
|
|
|
|
|
NMC_META_GENERIC_WITH_NESTED ("AP", nmc_fields_dev_wifi_list + 1), /* 3 */
|
|
|
|
|
NMC_META_GENERIC_WITH_NESTED ("WIRED-PROPERTIES", nmc_fields_dev_show_wired_prop + 1), /* 4 */
|
|
|
|
|
NMC_META_GENERIC_WITH_NESTED ("WIMAX-PROPERTIES", nmc_fields_dev_show_wimax_prop + 1), /* 5 */
|
|
|
|
|
NMC_META_GENERIC_WITH_NESTED ("NSP", nmc_fields_dev_wimax_list + 1), /* 6 */
|
2017-04-06 15:14:23 +02:00
|
|
|
NMC_META_GENERIC_WITH_NESTED ("IP4", metagen_ip4_config), /* 7 */
|
cli: split tracking of meta data out of NmcOutputField
When generating output data, nmcli iterates over a list of
property-descriptors (nmc_fields_ip4_config), creates an intermediate
array (output_data) and finally prints it.
However, previously both the meta data (nmc_fields_ip4_config) and
the intermediate format use the same type NmcOutputField. This means,
certain fields are relevant to describe a property, and other fields
are output/formatting fields.
Split this up. Now, the meta data is tracked in form of an NMMetaAbstractInfo
lists. This separates the information about properties from intermediate steps
during creation of the output.
Note that currently functions like print_ip4_config() still have all the
knowledge about how to generate the output. That is wrong, instead, the
meta data (NMMetaAbstractInfo) should describe how to create the output
and then all those functions could be replaced. This means, later we want
to add more knowledge to the NMMetaAbstractInfo, so it is important to
keep them separate from NmcOutputField.
2017-03-31 19:18:16 +02:00
|
|
|
NMC_META_GENERIC_WITH_NESTED ("DHCP4", nmc_fields_dhcp4_config + 1), /* 8 */
|
|
|
|
|
NMC_META_GENERIC_WITH_NESTED ("IP6", nmc_fields_ip6_config + 1), /* 9 */
|
|
|
|
|
NMC_META_GENERIC_WITH_NESTED ("DHCP6", nmc_fields_dhcp6_config + 1), /* 10 */
|
|
|
|
|
NMC_META_GENERIC_WITH_NESTED ("BOND", nmc_fields_dev_show_master_prop + 1), /* 11 */
|
|
|
|
|
NMC_META_GENERIC_WITH_NESTED ("TEAM", nmc_fields_dev_show_team_prop + 1), /* 12 */
|
|
|
|
|
NMC_META_GENERIC_WITH_NESTED ("BRIDGE", nmc_fields_dev_show_master_prop + 1), /* 13 */
|
|
|
|
|
NMC_META_GENERIC_WITH_NESTED ("VLAN", nmc_fields_dev_show_vlan_prop + 1), /* 14 */
|
|
|
|
|
NMC_META_GENERIC_WITH_NESTED ("BLUETOOTH", nmc_fields_dev_show_bluetooth + 1), /* 15 */
|
|
|
|
|
NMC_META_GENERIC_WITH_NESTED ("CONNECTIONS", nmc_fields_dev_show_connections + 1), /* 16 */
|
|
|
|
|
NULL,
|
2013-12-10 12:00:53 +01:00
|
|
|
};
|
2013-12-16 17:08:28 +01:00
|
|
|
#define NMC_FIELDS_DEV_SHOW_SECTIONS_COMMON "GENERAL.DEVICE,GENERAL.TYPE,GENERAL.HWADDR,GENERAL.MTU,GENERAL.STATE,"\
|
|
|
|
|
"GENERAL.CONNECTION,GENERAL.CON-PATH,WIRED-PROPERTIES,IP4,IP6"
|
2013-12-10 12:00:53 +01:00
|
|
|
|
cli: split tracking of meta data out of NmcOutputField
When generating output data, nmcli iterates over a list of
property-descriptors (nmc_fields_ip4_config), creates an intermediate
array (output_data) and finally prints it.
However, previously both the meta data (nmc_fields_ip4_config) and
the intermediate format use the same type NmcOutputField. This means,
certain fields are relevant to describe a property, and other fields
are output/formatting fields.
Split this up. Now, the meta data is tracked in form of an NMMetaAbstractInfo
lists. This separates the information about properties from intermediate steps
during creation of the output.
Note that currently functions like print_ip4_config() still have all the
knowledge about how to generate the output. That is wrong, instead, the
meta data (NMMetaAbstractInfo) should describe how to create the output
and then all those functions could be replaced. This means, later we want
to add more knowledge to the NMMetaAbstractInfo, so it is important to
keep them separate from NmcOutputField.
2017-03-31 19:18:16 +02:00
|
|
|
const NmcMetaGenericInfo *const nmc_fields_dev_lldp_list[] = {
|
|
|
|
|
NMC_META_GENERIC ("NAME"), /* 0 */
|
|
|
|
|
NMC_META_GENERIC ("DEVICE"), /* 1 */
|
|
|
|
|
NMC_META_GENERIC ("CHASSIS-ID"), /* 2 */
|
|
|
|
|
NMC_META_GENERIC ("PORT-ID"), /* 3 */
|
|
|
|
|
NMC_META_GENERIC ("PORT-DESCRIPTION"), /* 4 */
|
|
|
|
|
NMC_META_GENERIC ("SYSTEM-NAME"), /* 5 */
|
|
|
|
|
NMC_META_GENERIC ("SYSTEM-DESCRIPTION"), /* 6 */
|
|
|
|
|
NMC_META_GENERIC ("SYSTEM-CAPABILITIES"), /* 7 */
|
|
|
|
|
NMC_META_GENERIC ("IEEE-802-1-PVID"), /* 8 */
|
|
|
|
|
NMC_META_GENERIC ("IEEE-802-1-PPVID"), /* 9 */
|
|
|
|
|
NMC_META_GENERIC ("IEEE-802-1-PPVID-FLAGS"), /* 10 */
|
|
|
|
|
NMC_META_GENERIC ("IEEE-802-1-VID"), /* 11 */
|
|
|
|
|
NMC_META_GENERIC ("IEEE-802-1-VLAN-NAME"), /* 12 */
|
|
|
|
|
NMC_META_GENERIC ("DESTINATION"), /* 13 */
|
|
|
|
|
NMC_META_GENERIC ("CHASSIS-ID-TYPE"), /* 14 */
|
|
|
|
|
NMC_META_GENERIC ("PORT-ID-TYPE"), /* 15 */
|
|
|
|
|
NULL,
|
2015-11-10 14:06:02 +01:00
|
|
|
};
|
|
|
|
|
#define NMC_FIELDS_DEV_LLDP_LIST_COMMON "DEVICE,CHASSIS-ID,PORT-ID,PORT-DESCRIPTION,SYSTEM-NAME,SYSTEM-DESCRIPTION," \
|
|
|
|
|
"SYSTEM-CAPABILITIES"
|
2010-03-18 15:39:15 +01:00
|
|
|
|
2012-04-28 22:32:21 +01:00
|
|
|
static guint progress_id = 0; /* ID of event source for displaying progress */
|
|
|
|
|
|
2010-02-25 09:52:30 -08:00
|
|
|
static void
|
|
|
|
|
usage (void)
|
|
|
|
|
{
|
2014-09-19 16:04:40 -04:00
|
|
|
g_printerr (_("Usage: nmcli device { COMMAND | help }\n\n"
|
2016-07-14 22:06:10 +02:00
|
|
|
"COMMAND := { status | show | set | connect | reapply | modify | disconnect | delete | monitor | wifi | lldp }\n\n"
|
2014-09-19 16:04:40 -04:00
|
|
|
" status\n\n"
|
|
|
|
|
" show [<ifname>]\n\n"
|
2015-09-18 10:49:19 +02:00
|
|
|
" set [ifname] <ifname> [autoconnect yes|no] [managed yes|no]\n\n"
|
2014-09-19 16:04:40 -04:00
|
|
|
" connect <ifname>\n\n"
|
2016-04-30 14:14:31 +02:00
|
|
|
" reapply <ifname>\n\n"
|
2016-07-14 22:06:10 +02:00
|
|
|
" modify <ifname> ([+|-]<setting>.<property> <value>)+\n\n"
|
2015-03-11 19:10:58 +01:00
|
|
|
" disconnect <ifname> ...\n\n"
|
|
|
|
|
" delete <ifname> ...\n\n"
|
2015-03-27 13:11:06 +01:00
|
|
|
" monitor <ifname> ...\n\n"
|
2014-09-19 16:04:40 -04:00
|
|
|
" wifi [list [ifname <ifname>] [bssid <BSSID>]]\n\n"
|
|
|
|
|
" wifi connect <(B)SSID> [password <password>] [wep-key-type key|phrase] [ifname <ifname>]\n"
|
2015-07-10 13:16:21 +02:00
|
|
|
" [bssid <BSSID>] [name <name>] [private yes|no] [hidden yes|no]\n\n"
|
2015-12-04 13:29:42 +01:00
|
|
|
" wifi hotspot [ifname <ifname>] [con-name <name>] [ssid <SSID>] [band a|bg] [channel <channel>] [password <password>]\n\n"
|
2015-07-14 09:50:56 +02:00
|
|
|
" wifi rescan [ifname <ifname>] [[ssid <SSID to scan>] ...]\n\n"
|
2015-11-10 14:06:02 +01:00
|
|
|
" lldp [list [ifname <ifname>]]\n\n"
|
2014-09-19 16:04:40 -04:00
|
|
|
));
|
2010-02-25 09:52:30 -08:00
|
|
|
}
|
|
|
|
|
|
2013-12-18 14:49:06 +01:00
|
|
|
static void
|
|
|
|
|
usage_device_status (void)
|
|
|
|
|
{
|
2014-09-19 16:04:40 -04:00
|
|
|
g_printerr (_("Usage: nmcli device status { help }\n"
|
|
|
|
|
"\n"
|
|
|
|
|
"Show status for all devices.\n"
|
|
|
|
|
"By default, the following columns are shown:\n"
|
|
|
|
|
" DEVICE - interface name\n"
|
|
|
|
|
" TYPE - device type\n"
|
|
|
|
|
" STATE - device state\n"
|
|
|
|
|
" CONNECTION - connection activated on device (if any)\n"
|
|
|
|
|
"Displayed columns can be changed using '--fields' global option. 'status' is\n"
|
|
|
|
|
"the default command, which means 'nmcli device' calls 'nmcli device status'.\n\n"));
|
2013-12-18 14:49:06 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
|
usage_device_show (void)
|
|
|
|
|
{
|
2014-09-19 16:04:40 -04:00
|
|
|
g_printerr (_("Usage: nmcli device show { ARGUMENTS | help }\n"
|
|
|
|
|
"\n"
|
|
|
|
|
"ARGUMENTS := [<ifname>]\n"
|
|
|
|
|
"\n"
|
|
|
|
|
"Show details of device(s).\n"
|
|
|
|
|
"The command lists details for all devices, or for a given device.\n\n"));
|
2013-12-18 14:49:06 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
|
usage_device_connect (void)
|
|
|
|
|
{
|
2014-09-19 16:04:40 -04:00
|
|
|
g_printerr (_("Usage: nmcli device connect { ARGUMENTS | help }\n"
|
|
|
|
|
"\n"
|
|
|
|
|
"ARGUMENTS := <ifname>\n"
|
|
|
|
|
"\n"
|
|
|
|
|
"Connect the device.\n"
|
|
|
|
|
"NetworkManager will try to find a suitable connection that will be activated.\n"
|
|
|
|
|
"It will also consider connections that are not set to auto-connect.\n\n"));
|
2013-12-18 14:49:06 +01:00
|
|
|
}
|
|
|
|
|
|
2015-05-14 18:33:53 +02:00
|
|
|
static void
|
|
|
|
|
usage_device_reapply (void)
|
|
|
|
|
{
|
|
|
|
|
g_printerr (_("Usage: nmcli device reapply { ARGUMENTS | help }\n"
|
|
|
|
|
"\n"
|
2016-04-30 14:14:31 +02:00
|
|
|
"ARGUMENTS := <ifname>\n"
|
2015-05-14 18:33:53 +02:00
|
|
|
"\n"
|
|
|
|
|
"Attempts to update device with changes to the currently active connection\n"
|
|
|
|
|
"made since it was last applied.\n\n"));
|
|
|
|
|
}
|
|
|
|
|
|
2016-06-22 18:25:48 +02:00
|
|
|
static void
|
|
|
|
|
usage_device_modify (void)
|
|
|
|
|
{
|
2016-07-14 22:06:10 +02:00
|
|
|
g_printerr (_("Usage: nmcli device modify { ARGUMENTS | --help }\n"
|
2016-06-22 18:25:48 +02:00
|
|
|
"\n"
|
|
|
|
|
"ARGUMENTS := <ifname> ([+|-]<setting>.<property> <value>)+\n"
|
|
|
|
|
"\n"
|
|
|
|
|
"Modify one or more properties currently active on the device without modifying\n"
|
|
|
|
|
"the connection profile. The changes have immediate effect. For multi-valued\n"
|
|
|
|
|
"properties you can use optional '+' or '-' prefix to the property name.\n"
|
|
|
|
|
"The '+' sign allows appending items instead of overwriting the whole value.\n"
|
|
|
|
|
"The '-' sign allows removing selected items instead of the whole value.\n"
|
|
|
|
|
"\n"
|
|
|
|
|
"Examples:\n"
|
|
|
|
|
"nmcli dev mod em1 ipv4.method manual ipv4.addr \"192.168.1.2/24, 10.10.1.5/8\"\n"
|
|
|
|
|
"nmcli dev mod em1 +ipv4.dns 8.8.4.4\n"
|
|
|
|
|
"nmcli dev mod em1 -ipv4.dns 1\n"
|
|
|
|
|
"nmcli dev mod em1 -ipv6.addr \"abbe::cafe/56\"\n"));
|
|
|
|
|
}
|
|
|
|
|
|
2013-12-18 14:49:06 +01:00
|
|
|
static void
|
|
|
|
|
usage_device_disconnect (void)
|
|
|
|
|
{
|
2014-09-19 16:04:40 -04:00
|
|
|
g_printerr (_("Usage: nmcli device disconnect { ARGUMENTS | help }\n"
|
|
|
|
|
"\n"
|
2015-03-11 19:10:58 +01:00
|
|
|
"ARGUMENTS := <ifname> ...\n"
|
2014-09-19 16:04:40 -04:00
|
|
|
"\n"
|
2015-03-11 19:10:58 +01:00
|
|
|
"Disconnect devices.\n"
|
2014-09-19 16:04:40 -04:00
|
|
|
"The command disconnects the device and prevents it from auto-activating\n"
|
|
|
|
|
"further connections without user/manual intervention.\n\n"));
|
2013-12-18 14:49:06 +01:00
|
|
|
}
|
|
|
|
|
|
2014-06-19 11:25:17 +02:00
|
|
|
static void
|
|
|
|
|
usage_device_delete (void)
|
|
|
|
|
{
|
2014-09-19 16:04:40 -04:00
|
|
|
g_printerr (_("Usage: nmcli device delete { ARGUMENTS | help }\n"
|
|
|
|
|
"\n"
|
2015-03-11 19:10:58 +01:00
|
|
|
"ARGUMENTS := <ifname> ...\n"
|
2014-09-19 16:04:40 -04:00
|
|
|
"\n"
|
2015-03-11 19:10:58 +01:00
|
|
|
"Delete the software devices.\n"
|
|
|
|
|
"The command removes the interfaces. It only works for software devices\n"
|
2014-09-19 16:04:40 -04:00
|
|
|
"(like bonds, bridges, etc.). Hardware devices cannot be deleted by the\n"
|
|
|
|
|
"command.\n\n"));
|
2014-06-19 11:25:17 +02:00
|
|
|
}
|
|
|
|
|
|
2015-03-23 14:11:43 +01:00
|
|
|
static void
|
|
|
|
|
usage_device_set (void)
|
|
|
|
|
{
|
|
|
|
|
g_printerr (_("Usage: nmcli device set { ARGUMENTS | help }\n"
|
|
|
|
|
"\n"
|
2015-09-18 10:49:19 +02:00
|
|
|
"ARGUMENTS := DEVICE { PROPERTY [ PROPERTY ... ] }\n"
|
|
|
|
|
"DEVICE := [ifname] <ifname> \n"
|
2015-03-23 14:11:43 +01:00
|
|
|
"PROPERTY := { autoconnect { yes | no } |\n"
|
|
|
|
|
" { managed { yes | no }\n"
|
|
|
|
|
"\n"
|
|
|
|
|
"Modify device properties.\n\n"));
|
|
|
|
|
}
|
|
|
|
|
|
2015-03-27 13:11:06 +01:00
|
|
|
static void
|
|
|
|
|
usage_device_monitor (void)
|
|
|
|
|
{
|
|
|
|
|
g_printerr (_("Usage: nmcli device monitor { ARGUMENTS | help }\n"
|
|
|
|
|
"\n"
|
|
|
|
|
"ARGUMENTS := [<ifname>] ...\n"
|
|
|
|
|
"\n"
|
|
|
|
|
"Monitor device activity.\n"
|
|
|
|
|
"This command prints a line whenever the specified devices change state.\n"
|
|
|
|
|
"Monitors all devices in case no interface is specified.\n\n"));
|
|
|
|
|
}
|
|
|
|
|
|
2013-12-18 14:49:06 +01:00
|
|
|
static void
|
|
|
|
|
usage_device_wifi (void)
|
|
|
|
|
{
|
2014-09-19 16:04:40 -04:00
|
|
|
g_printerr (_("Usage: nmcli device wifi { ARGUMENTS | help }\n"
|
|
|
|
|
"\n"
|
|
|
|
|
"Perform operation on Wi-Fi devices.\n"
|
|
|
|
|
"\n"
|
|
|
|
|
"ARGUMENTS := [list [ifname <ifname>] [bssid <BSSID>]]\n"
|
|
|
|
|
"\n"
|
|
|
|
|
"List available Wi-Fi access points. The 'ifname' and 'bssid' options can be\n"
|
|
|
|
|
"used to list APs for a particular interface, or with a specific BSSID.\n"
|
|
|
|
|
"\n"
|
|
|
|
|
"ARGUMENTS := connect <(B)SSID> [password <password>] [wep-key-type key|phrase] [ifname <ifname>]\n"
|
2016-10-12 15:06:04 +02:00
|
|
|
" [bssid <BSSID>] [name <name>] [private yes|no] [hidden yes|no]\n"
|
2014-09-19 16:04:40 -04:00
|
|
|
"\n"
|
|
|
|
|
"Connect to a Wi-Fi network specified by SSID or BSSID. The command creates\n"
|
|
|
|
|
"a new connection and then activates it on a device. This is a command-line\n"
|
|
|
|
|
"counterpart of clicking an SSID in a GUI client. The command always creates\n"
|
|
|
|
|
"a new connection and thus it is mainly useful for connecting to new Wi-Fi\n"
|
|
|
|
|
"networks. If a connection for the network already exists, it is better to\n"
|
|
|
|
|
"bring up the existing profile as follows: nmcli con up id <name>. Note that\n"
|
|
|
|
|
"only open, WEP and WPA-PSK networks are supported at the moment. It is also\n"
|
|
|
|
|
"assumed that IP configuration is obtained via DHCP.\n"
|
|
|
|
|
"\n"
|
2016-10-12 15:06:04 +02:00
|
|
|
"ARGUMENTS := hotspot [ifname <ifname>] [con-name <name>] [ssid <SSID>]\n"
|
|
|
|
|
" [band a|bg] [channel <channel>] [password <password>]\n"
|
2015-10-02 22:46:53 +02:00
|
|
|
"\n"
|
|
|
|
|
"Create a Wi-Fi hotspot. Use 'connection down' or 'device disconnect'\n"
|
|
|
|
|
"to stop the hotspot.\n"
|
|
|
|
|
"Parameters of the hotspot can be influenced by the optional parameters:\n"
|
|
|
|
|
"ifname - Wi-Fi device to use\n"
|
|
|
|
|
"con-name - name of the created hotspot connection profile\n"
|
|
|
|
|
"ssid - SSID of the hotspot\n"
|
|
|
|
|
"band - Wi-Fi band to use\n"
|
|
|
|
|
"channel - Wi-Fi channel to use\n"
|
2015-10-13 17:48:06 +02:00
|
|
|
"password - password to use for the hotspot\n"
|
2015-10-02 22:46:53 +02:00
|
|
|
"\n"
|
2015-07-14 09:50:56 +02:00
|
|
|
"ARGUMENTS := rescan [ifname <ifname>] [[ssid <SSID to scan>] ...]\n"
|
2014-09-19 16:04:40 -04:00
|
|
|
"\n"
|
|
|
|
|
"Request that NetworkManager immediately re-scan for available access points.\n"
|
|
|
|
|
"NetworkManager scans Wi-Fi networks periodically, but in some cases it might\n"
|
2015-07-14 09:50:56 +02:00
|
|
|
"be useful to start scanning manually. 'ssid' allows scanning for a specific\n"
|
|
|
|
|
"SSID, which is useful for APs with hidden SSIDs. More 'ssid' parameters can be\n"
|
|
|
|
|
"given. Note that this command does not show the APs,\n"
|
|
|
|
|
"use 'nmcli device wifi list' for that.\n\n"));
|
2013-12-18 14:49:06 +01:00
|
|
|
}
|
|
|
|
|
|
2015-11-10 14:06:02 +01:00
|
|
|
static void
|
|
|
|
|
usage_device_lldp (void)
|
|
|
|
|
{
|
|
|
|
|
g_printerr (_("Usage: nmcli device lldp { ARGUMENTS | help }\n"
|
|
|
|
|
"\n"
|
|
|
|
|
"ARGUMENTS := [list [ifname <ifname>]]\n"
|
|
|
|
|
"\n"
|
|
|
|
|
"List neighboring devices discovered through LLDP. The 'ifname' option can be\n"
|
|
|
|
|
"used to list neighbors for a particular interface.\n\n"));
|
|
|
|
|
}
|
|
|
|
|
|
2010-02-25 09:52:30 -08:00
|
|
|
static void
|
|
|
|
|
quit (void)
|
|
|
|
|
{
|
2017-11-29 10:19:12 +01:00
|
|
|
if (nm_clear_g_source (&progress_id))
|
2012-04-28 22:32:21 +01:00
|
|
|
nmc_terminal_erase_line ();
|
2017-04-06 19:39:36 +02:00
|
|
|
g_main_loop_quit (loop);
|
2010-02-25 09:52:30 -08:00
|
|
|
}
|
|
|
|
|
|
2013-04-24 15:27:11 -04:00
|
|
|
static int
|
|
|
|
|
compare_devices (const void *a, const void *b)
|
|
|
|
|
{
|
|
|
|
|
NMDevice *da = *(NMDevice **)a;
|
|
|
|
|
NMDevice *db = *(NMDevice **)b;
|
2017-06-26 13:22:59 +02:00
|
|
|
NMActiveConnection *da_ac;
|
|
|
|
|
NMActiveConnection *db_ac;
|
|
|
|
|
NMIPConfig *da_ip;
|
|
|
|
|
NMIPConfig *db_ip;
|
|
|
|
|
int da_num_addrs;
|
|
|
|
|
int db_num_addrs;
|
2013-04-24 15:27:11 -04:00
|
|
|
int cmp;
|
|
|
|
|
|
|
|
|
|
/* Sort by later device states first */
|
|
|
|
|
cmp = nm_device_get_state (db) - nm_device_get_state (da);
|
|
|
|
|
if (cmp != 0)
|
|
|
|
|
return cmp;
|
|
|
|
|
|
2017-06-26 13:22:59 +02:00
|
|
|
da_ac = nm_device_get_active_connection (da);
|
|
|
|
|
db_ac = nm_device_get_active_connection (db);
|
|
|
|
|
|
|
|
|
|
/* Prioritize devices with active connections */
|
|
|
|
|
if (da_ac)
|
|
|
|
|
cmp++;
|
|
|
|
|
if (db_ac)
|
|
|
|
|
cmp--;
|
|
|
|
|
if (cmp != 0)
|
|
|
|
|
return cmp;
|
|
|
|
|
|
|
|
|
|
/* VPNs go on the top if possible */
|
|
|
|
|
if (da_ac && !nm_active_connection_get_vpn (da_ac))
|
|
|
|
|
cmp++;
|
|
|
|
|
if (db_ac && !nm_active_connection_get_vpn (db_ac))
|
|
|
|
|
cmp--;
|
|
|
|
|
if (cmp != 0)
|
|
|
|
|
return cmp;
|
|
|
|
|
|
|
|
|
|
/* Default devices are prioritized */
|
|
|
|
|
if (da_ac && !nm_active_connection_get_default (da_ac))
|
|
|
|
|
cmp++;
|
|
|
|
|
if (db_ac && !nm_active_connection_get_default (db_ac))
|
|
|
|
|
cmp--;
|
|
|
|
|
if (cmp != 0)
|
|
|
|
|
return cmp;
|
|
|
|
|
|
|
|
|
|
/* Default IPv6 devices are prioritized */
|
|
|
|
|
if (da_ac && !nm_active_connection_get_default6 (da_ac))
|
|
|
|
|
cmp++;
|
|
|
|
|
if (db_ac && !nm_active_connection_get_default6 (db_ac))
|
|
|
|
|
cmp--;
|
|
|
|
|
if (cmp != 0)
|
|
|
|
|
return cmp;
|
|
|
|
|
|
|
|
|
|
/* Sort by number of addresses. */
|
|
|
|
|
da_ip = da_ac ? nm_active_connection_get_ip4_config (da_ac) : NULL;
|
|
|
|
|
da_num_addrs = da_ip ? nm_ip_config_get_addresses (da_ip)->len : 0;
|
|
|
|
|
db_ip = db_ac ? nm_active_connection_get_ip4_config (db_ac) : NULL;
|
|
|
|
|
db_num_addrs = db_ip ? nm_ip_config_get_addresses (db_ip)->len : 0;
|
|
|
|
|
|
|
|
|
|
da_ip = da_ac ? nm_active_connection_get_ip6_config (da_ac) : NULL;
|
|
|
|
|
da_num_addrs += da_ip ? nm_ip_config_get_addresses (da_ip)->len : 0;
|
|
|
|
|
db_ip = db_ac ? nm_active_connection_get_ip6_config (db_ac) : NULL;
|
|
|
|
|
db_num_addrs += db_ip ? nm_ip_config_get_addresses (db_ip)->len : 0;
|
|
|
|
|
|
|
|
|
|
cmp = db_num_addrs - da_num_addrs;
|
|
|
|
|
if (cmp != 0)
|
|
|
|
|
return cmp;
|
|
|
|
|
|
|
|
|
|
/* Fall back to alphanumeric sort by description and interface. */
|
2013-04-24 15:27:11 -04:00
|
|
|
cmp = g_strcmp0 (nm_device_get_type_description (da),
|
|
|
|
|
nm_device_get_type_description (db));
|
|
|
|
|
if (cmp != 0)
|
|
|
|
|
return cmp;
|
|
|
|
|
|
|
|
|
|
return g_strcmp0 (nm_device_get_iface (da),
|
|
|
|
|
nm_device_get_iface (db));
|
|
|
|
|
}
|
|
|
|
|
|
2016-07-01 21:45:43 +02:00
|
|
|
NMDevice **
|
|
|
|
|
nmc_get_devices_sorted (NMClient *client)
|
2013-04-24 15:27:11 -04:00
|
|
|
{
|
|
|
|
|
const GPtrArray *devs;
|
|
|
|
|
NMDevice **sorted;
|
|
|
|
|
|
|
|
|
|
devs = nm_client_get_devices (client);
|
|
|
|
|
|
|
|
|
|
sorted = g_new (NMDevice *, devs->len + 1);
|
|
|
|
|
memcpy (sorted, devs->pdata, devs->len * sizeof (NMDevice *));
|
|
|
|
|
sorted[devs->len] = NULL;
|
|
|
|
|
|
|
|
|
|
qsort (sorted, devs->len, sizeof (NMDevice *), compare_devices);
|
|
|
|
|
return sorted;
|
|
|
|
|
}
|
|
|
|
|
|
2016-06-23 10:49:20 +02:00
|
|
|
static void
|
2016-07-12 10:15:01 +02:00
|
|
|
complete_device (NMDevice **devices, const char *prefix, gboolean wifi_only)
|
2016-06-23 10:49:20 +02:00
|
|
|
{
|
|
|
|
|
int i;
|
|
|
|
|
|
|
|
|
|
for (i = 0; devices[i]; i++) {
|
|
|
|
|
const char *iface = nm_device_get_iface (devices[i]);
|
|
|
|
|
|
2016-07-12 10:15:01 +02:00
|
|
|
if (wifi_only && !NM_IS_DEVICE_WIFI (devices[i]))
|
|
|
|
|
continue;
|
|
|
|
|
|
2016-06-23 10:49:20 +02:00
|
|
|
if (g_str_has_prefix (iface, prefix))
|
|
|
|
|
g_print ("%s\n", iface);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2016-07-12 14:36:53 +02:00
|
|
|
void
|
|
|
|
|
nmc_complete_device (NMClient *client, const char *prefix, gboolean wifi_only)
|
|
|
|
|
{
|
|
|
|
|
gs_free NMDevice **devices = NULL;
|
|
|
|
|
|
|
|
|
|
devices = nmc_get_devices_sorted (client);
|
|
|
|
|
complete_device (devices, prefix, wifi_only);
|
|
|
|
|
}
|
|
|
|
|
|
2015-03-27 12:31:08 +01:00
|
|
|
static GSList *
|
2016-06-22 18:33:54 +02:00
|
|
|
get_device_list (NmCli *nmc, int argc, char **argv)
|
2015-03-27 12:31:08 +01:00
|
|
|
{
|
|
|
|
|
int arg_num = argc;
|
|
|
|
|
char **arg_arr = NULL;
|
|
|
|
|
char **arg_ptr = argv;
|
|
|
|
|
NMDevice **devices;
|
|
|
|
|
GSList *queue = NULL;
|
|
|
|
|
NMDevice *device;
|
|
|
|
|
int i;
|
|
|
|
|
|
|
|
|
|
if (argc == 0) {
|
|
|
|
|
if (nmc->ask) {
|
|
|
|
|
char *line = nmc_readline (PROMPT_INTERFACES);
|
|
|
|
|
nmc_string_to_arg_array (line, NULL, FALSE, &arg_arr, &arg_num);
|
|
|
|
|
g_free (line);
|
|
|
|
|
arg_ptr = arg_arr;
|
|
|
|
|
}
|
|
|
|
|
if (arg_num == 0) {
|
|
|
|
|
g_string_printf (nmc->return_text, _("Error: No interface specified."));
|
|
|
|
|
nmc->return_value = NMC_RESULT_ERROR_USER_INPUT;
|
|
|
|
|
goto error;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2016-07-01 21:45:43 +02:00
|
|
|
devices = nmc_get_devices_sorted (nmc->client);
|
2015-03-27 12:31:08 +01:00
|
|
|
while (arg_num > 0) {
|
2016-06-23 10:49:20 +02:00
|
|
|
if (arg_num == 1 && nmc->complete)
|
2016-07-12 10:15:01 +02:00
|
|
|
complete_device (devices, *arg_ptr, FALSE);
|
2016-06-23 10:49:20 +02:00
|
|
|
|
2015-03-27 12:31:08 +01:00
|
|
|
device = NULL;
|
|
|
|
|
for (i = 0; devices[i]; i++) {
|
|
|
|
|
if (!g_strcmp0 (nm_device_get_iface (devices[i]), *arg_ptr)) {
|
|
|
|
|
device = devices[i];
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (device) {
|
|
|
|
|
if (!g_slist_find (queue, device))
|
|
|
|
|
queue = g_slist_prepend (queue, device);
|
|
|
|
|
else
|
|
|
|
|
g_printerr (_("Warning: argument '%s' is duplicated.\n"), *arg_ptr);
|
|
|
|
|
} else {
|
2016-06-23 10:49:20 +02:00
|
|
|
if (!nmc->complete)
|
|
|
|
|
g_printerr (_("Error: Device '%s' not found.\n"), *arg_ptr);
|
2015-03-27 12:31:08 +01:00
|
|
|
g_string_printf (nmc->return_text, _("Error: not all devices found."));
|
|
|
|
|
nmc->return_value = NMC_RESULT_ERROR_NOT_FOUND;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Take next argument */
|
2017-03-30 16:09:46 +02:00
|
|
|
next_arg (nmc->ask ? NULL : nmc, &arg_num, &arg_ptr, NULL);
|
2015-03-27 12:31:08 +01:00
|
|
|
}
|
|
|
|
|
g_free (devices);
|
|
|
|
|
|
|
|
|
|
error:
|
|
|
|
|
g_strfreev (arg_arr);
|
|
|
|
|
|
|
|
|
|
return queue;
|
|
|
|
|
}
|
|
|
|
|
|
2016-06-27 11:54:25 +02:00
|
|
|
static NMDevice *
|
|
|
|
|
get_device (NmCli *nmc, int *argc, char ***argv, GError **error)
|
|
|
|
|
{
|
|
|
|
|
gs_free NMDevice **devices = NULL;
|
|
|
|
|
gs_free char *ifname_ask = NULL;
|
|
|
|
|
const char *ifname = NULL;
|
|
|
|
|
int i;
|
|
|
|
|
|
|
|
|
|
if (*argc == 0) {
|
|
|
|
|
if (nmc->ask)
|
|
|
|
|
ifname = ifname_ask = nmc_readline (PROMPT_INTERFACE);
|
|
|
|
|
|
|
|
|
|
if (!ifname_ask) {
|
|
|
|
|
g_set_error_literal (error, NMCLI_ERROR, NMC_RESULT_ERROR_USER_INPUT,
|
2016-07-15 11:38:01 +02:00
|
|
|
_("No interface specified"));
|
2016-06-27 11:54:25 +02:00
|
|
|
return NULL;
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
ifname = **argv;
|
2017-03-30 16:09:46 +02:00
|
|
|
next_arg (nmc, argc, argv, NULL);
|
2016-06-27 11:54:25 +02:00
|
|
|
}
|
|
|
|
|
|
2016-07-01 21:45:43 +02:00
|
|
|
devices = nmc_get_devices_sorted (nmc->client);
|
2016-06-27 11:54:25 +02:00
|
|
|
for (i = 0; devices[i]; i++) {
|
2016-06-23 10:49:20 +02:00
|
|
|
if (!g_strcmp0 (nm_device_get_iface (devices[i]), ifname))
|
|
|
|
|
break;
|
2016-06-27 11:54:25 +02:00
|
|
|
}
|
|
|
|
|
|
2016-06-23 10:49:20 +02:00
|
|
|
if (nmc->complete && !*argc)
|
2016-07-12 10:15:01 +02:00
|
|
|
complete_device (devices, ifname, FALSE);
|
2016-06-23 10:49:20 +02:00
|
|
|
|
|
|
|
|
if (devices[i] == NULL) {
|
|
|
|
|
g_set_error (error, NMCLI_ERROR, NMC_RESULT_ERROR_NOT_FOUND,
|
2016-07-15 11:38:01 +02:00
|
|
|
_("Device '%s' not found"), ifname);
|
2016-06-23 10:49:20 +02:00
|
|
|
}
|
2016-06-27 11:54:25 +02:00
|
|
|
|
2016-06-23 10:49:20 +02:00
|
|
|
return devices[i];
|
2016-06-27 11:54:25 +02:00
|
|
|
}
|
|
|
|
|
|
2015-02-26 11:51:07 +01:00
|
|
|
static int
|
|
|
|
|
compare_aps (gconstpointer a, gconstpointer b, gpointer user_data)
|
|
|
|
|
{
|
|
|
|
|
NMAccessPoint *apa = *(NMAccessPoint **)a;
|
|
|
|
|
NMAccessPoint *apb = *(NMAccessPoint **)b;
|
|
|
|
|
int cmp;
|
|
|
|
|
|
|
|
|
|
cmp = nm_access_point_get_strength (apb) - nm_access_point_get_strength (apa);
|
|
|
|
|
if (cmp != 0)
|
|
|
|
|
return cmp;
|
|
|
|
|
|
|
|
|
|
cmp = nm_access_point_get_frequency (apa) - nm_access_point_get_frequency (apb);
|
|
|
|
|
if (cmp != 0)
|
|
|
|
|
return cmp;
|
|
|
|
|
|
|
|
|
|
return nm_access_point_get_max_bitrate (apb) - nm_access_point_get_max_bitrate (apa);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static GPtrArray *
|
|
|
|
|
sort_access_points (const GPtrArray *aps)
|
|
|
|
|
{
|
|
|
|
|
GPtrArray *sorted;
|
|
|
|
|
int i;
|
|
|
|
|
|
2016-02-04 16:42:00 +01:00
|
|
|
g_return_val_if_fail (aps, NULL);
|
|
|
|
|
|
2015-02-26 11:51:07 +01:00
|
|
|
sorted = g_ptr_array_sized_new (aps->len);
|
2016-02-04 16:42:00 +01:00
|
|
|
for (i = 0; i < aps->len; i++)
|
2015-02-26 11:51:07 +01:00
|
|
|
g_ptr_array_add (sorted, aps->pdata[i]);
|
|
|
|
|
g_ptr_array_sort_with_data (sorted, compare_aps, NULL);
|
|
|
|
|
return sorted;
|
|
|
|
|
}
|
|
|
|
|
|
2016-07-01 21:45:43 +02:00
|
|
|
static void
|
2017-04-04 15:12:00 +02:00
|
|
|
wifi_signal_to_color (guint8 strength, NMMetaTermColor *color, NMMetaTermFormat *color_fmt)
|
2015-02-24 15:10:57 +01:00
|
|
|
{
|
2017-04-04 15:12:00 +02:00
|
|
|
*color = NM_META_TERM_COLOR_NORMAL;
|
|
|
|
|
*color_fmt = NM_META_TERM_FORMAT_NORMAL;
|
2015-02-24 15:10:57 +01:00
|
|
|
|
|
|
|
|
if (strength > 80)
|
2017-04-04 15:12:00 +02:00
|
|
|
*color = NM_META_TERM_COLOR_GREEN;
|
2015-02-24 15:10:57 +01:00
|
|
|
else if (strength > 55)
|
2017-04-04 15:12:00 +02:00
|
|
|
*color = NM_META_TERM_COLOR_YELLOW;
|
2015-02-24 15:10:57 +01:00
|
|
|
else if (strength > 30)
|
2017-04-04 15:12:00 +02:00
|
|
|
*color = NM_META_TERM_COLOR_MAGENTA;
|
2015-02-24 15:10:57 +01:00
|
|
|
else if (strength > 5)
|
2017-04-04 15:12:00 +02:00
|
|
|
*color = NM_META_TERM_COLOR_CYAN;
|
2015-02-24 15:10:57 +01:00
|
|
|
else
|
2017-04-04 15:12:00 +02:00
|
|
|
*color_fmt = NM_META_TERM_FORMAT_DIM;
|
2015-02-24 15:10:57 +01:00
|
|
|
}
|
|
|
|
|
|
2010-02-25 09:52:30 -08:00
|
|
|
static char *
|
2011-02-21 15:41:12 +01:00
|
|
|
ap_wpa_rsn_flags_to_string (NM80211ApSecurityFlags flags)
|
2010-02-25 09:52:30 -08:00
|
|
|
{
|
|
|
|
|
char *flags_str[16]; /* Enough space for flags and terminating NULL */
|
|
|
|
|
char *ret_str;
|
|
|
|
|
int i = 0;
|
|
|
|
|
|
|
|
|
|
if (flags & NM_802_11_AP_SEC_PAIR_WEP40)
|
|
|
|
|
flags_str[i++] = g_strdup ("pair_wpe40");
|
|
|
|
|
if (flags & NM_802_11_AP_SEC_PAIR_WEP104)
|
|
|
|
|
flags_str[i++] = g_strdup ("pair_wpe104");
|
|
|
|
|
if (flags & NM_802_11_AP_SEC_PAIR_TKIP)
|
|
|
|
|
flags_str[i++] = g_strdup ("pair_tkip");
|
|
|
|
|
if (flags & NM_802_11_AP_SEC_PAIR_CCMP)
|
|
|
|
|
flags_str[i++] = g_strdup ("pair_ccmp");
|
|
|
|
|
if (flags & NM_802_11_AP_SEC_GROUP_WEP40)
|
|
|
|
|
flags_str[i++] = g_strdup ("group_wpe40");
|
|
|
|
|
if (flags & NM_802_11_AP_SEC_GROUP_WEP104)
|
|
|
|
|
flags_str[i++] = g_strdup ("group_wpe104");
|
|
|
|
|
if (flags & NM_802_11_AP_SEC_GROUP_TKIP)
|
|
|
|
|
flags_str[i++] = g_strdup ("group_tkip");
|
|
|
|
|
if (flags & NM_802_11_AP_SEC_GROUP_CCMP)
|
|
|
|
|
flags_str[i++] = g_strdup ("group_ccmp");
|
|
|
|
|
if (flags & NM_802_11_AP_SEC_KEY_MGMT_PSK)
|
|
|
|
|
flags_str[i++] = g_strdup ("psk");
|
|
|
|
|
if (flags & NM_802_11_AP_SEC_KEY_MGMT_802_1X)
|
|
|
|
|
flags_str[i++] = g_strdup ("802.1X");
|
|
|
|
|
|
|
|
|
|
if (i == 0)
|
|
|
|
|
flags_str[i++] = g_strdup (_("(none)"));
|
|
|
|
|
|
|
|
|
|
flags_str[i] = NULL;
|
|
|
|
|
|
|
|
|
|
ret_str = g_strjoinv (" ", flags_str);
|
|
|
|
|
|
|
|
|
|
i = 0;
|
|
|
|
|
while (flags_str[i])
|
2012-04-28 22:54:02 +02:00
|
|
|
g_free (flags_str[i++]);
|
2010-02-25 09:52:30 -08:00
|
|
|
|
|
|
|
|
return ret_str;
|
|
|
|
|
}
|
|
|
|
|
|
2010-03-18 15:39:15 +01:00
|
|
|
typedef struct {
|
|
|
|
|
NmCli *nmc;
|
2010-03-24 19:05:35 +01:00
|
|
|
int index;
|
2013-05-22 08:37:50 +02:00
|
|
|
guint32 output_flags;
|
2010-03-18 15:39:15 +01:00
|
|
|
const char* active_bssid;
|
|
|
|
|
const char* device;
|
2017-03-30 14:56:19 +02:00
|
|
|
GPtrArray *output_data;
|
2010-03-18 15:39:15 +01:00
|
|
|
} APInfo;
|
|
|
|
|
|
2010-02-25 09:52:30 -08:00
|
|
|
static void
|
2013-05-22 08:37:50 +02:00
|
|
|
fill_output_access_point (gpointer data, gpointer user_data)
|
2010-02-25 09:52:30 -08:00
|
|
|
{
|
|
|
|
|
NMAccessPoint *ap = NM_ACCESS_POINT (data);
|
2010-03-18 15:39:15 +01:00
|
|
|
APInfo *info = (APInfo *) user_data;
|
2013-05-22 08:37:50 +02:00
|
|
|
NmcOutputField *arr;
|
2010-02-25 09:52:30 -08:00
|
|
|
gboolean active = FALSE;
|
2011-02-21 15:41:12 +01:00
|
|
|
NM80211ApFlags flags;
|
|
|
|
|
NM80211ApSecurityFlags wpa_flags, rsn_flags;
|
|
|
|
|
guint32 freq, bitrate;
|
2010-03-18 15:39:15 +01:00
|
|
|
guint8 strength;
|
2014-07-02 14:25:43 -04:00
|
|
|
GBytes *ssid;
|
2011-09-06 13:37:23 +02:00
|
|
|
const char *bssid;
|
2010-03-18 15:39:15 +01:00
|
|
|
NM80211Mode mode;
|
2014-01-08 11:39:22 -06:00
|
|
|
char *channel_str, *freq_str, *ssid_str = NULL, *ssid_hex_str = NULL,
|
|
|
|
|
*bitrate_str, *strength_str, *wpa_flags_str, *rsn_flags_str;
|
2010-03-18 15:39:15 +01:00
|
|
|
GString *security_str;
|
2010-03-24 19:05:35 +01:00
|
|
|
char *ap_name;
|
2013-05-17 11:23:21 +02:00
|
|
|
const char *sig_bars;
|
2017-04-04 15:12:00 +02:00
|
|
|
NMMetaTermColor color;
|
|
|
|
|
NMMetaTermFormat color_fmt;
|
2010-02-25 09:52:30 -08:00
|
|
|
|
2010-03-18 15:39:15 +01:00
|
|
|
if (info->active_bssid) {
|
2011-09-06 13:37:23 +02:00
|
|
|
const char *current_bssid = nm_access_point_get_bssid (ap);
|
2010-03-18 15:39:15 +01:00
|
|
|
if (current_bssid && !strcmp (current_bssid, info->active_bssid))
|
2010-02-25 09:52:30 -08:00
|
|
|
active = TRUE;
|
|
|
|
|
}
|
|
|
|
|
|
2010-03-18 15:39:15 +01:00
|
|
|
/* Get AP properties */
|
|
|
|
|
flags = nm_access_point_get_flags (ap);
|
|
|
|
|
wpa_flags = nm_access_point_get_wpa_flags (ap);
|
|
|
|
|
rsn_flags = nm_access_point_get_rsn_flags (ap);
|
|
|
|
|
ssid = nm_access_point_get_ssid (ap);
|
2011-09-06 13:37:23 +02:00
|
|
|
bssid = nm_access_point_get_bssid (ap);
|
2010-03-18 15:39:15 +01:00
|
|
|
freq = nm_access_point_get_frequency (ap);
|
|
|
|
|
mode = nm_access_point_get_mode (ap);
|
|
|
|
|
bitrate = nm_access_point_get_max_bitrate (ap);
|
2013-10-31 14:13:33 +01:00
|
|
|
strength = MIN (nm_access_point_get_strength (ap), 100);
|
2010-03-18 15:39:15 +01:00
|
|
|
|
|
|
|
|
/* Convert to strings */
|
2014-01-08 11:39:22 -06:00
|
|
|
if (ssid) {
|
2014-07-02 14:25:43 -04:00
|
|
|
const guint8 *ssid_data;
|
|
|
|
|
gsize ssid_len;
|
|
|
|
|
|
|
|
|
|
ssid_data = g_bytes_get_data (ssid, &ssid_len);
|
|
|
|
|
ssid_str = nm_utils_ssid_to_utf8 (ssid_data, ssid_len);
|
|
|
|
|
ssid_hex_str = ssid_to_hex ((const char *) ssid_data, ssid_len);
|
2014-01-08 11:39:22 -06:00
|
|
|
}
|
2013-05-17 10:38:09 +02:00
|
|
|
channel_str = g_strdup_printf ("%u", nm_utils_wifi_freq_to_channel (freq));
|
2010-03-18 15:39:15 +01:00
|
|
|
freq_str = g_strdup_printf (_("%u MHz"), freq);
|
2014-04-01 14:56:32 +02:00
|
|
|
bitrate_str = g_strdup_printf (_("%u Mbit/s"), bitrate/1000);
|
2010-03-18 15:39:15 +01:00
|
|
|
strength_str = g_strdup_printf ("%u", strength);
|
|
|
|
|
wpa_flags_str = ap_wpa_rsn_flags_to_string (wpa_flags);
|
|
|
|
|
rsn_flags_str = ap_wpa_rsn_flags_to_string (rsn_flags);
|
2014-09-19 16:51:07 -04:00
|
|
|
sig_bars = nm_utils_wifi_strength_bars (strength);
|
2010-02-25 09:52:30 -08:00
|
|
|
|
2010-03-18 15:39:15 +01:00
|
|
|
security_str = g_string_new (NULL);
|
2010-02-25 09:52:30 -08:00
|
|
|
|
|
|
|
|
if ( (flags & NM_802_11_AP_FLAGS_PRIVACY)
|
|
|
|
|
&& (wpa_flags == NM_802_11_AP_SEC_NONE)
|
2013-05-24 22:36:24 +02:00
|
|
|
&& (rsn_flags == NM_802_11_AP_SEC_NONE)) {
|
|
|
|
|
g_string_append (security_str, _("WEP"));
|
|
|
|
|
g_string_append_c (security_str, ' ');
|
|
|
|
|
}
|
|
|
|
|
if (wpa_flags != NM_802_11_AP_SEC_NONE) {
|
|
|
|
|
g_string_append (security_str, _("WPA1"));
|
|
|
|
|
g_string_append_c (security_str, ' ');
|
|
|
|
|
}
|
|
|
|
|
if (rsn_flags != NM_802_11_AP_SEC_NONE) {
|
|
|
|
|
g_string_append (security_str, _("WPA2"));
|
|
|
|
|
g_string_append_c (security_str, ' ');
|
|
|
|
|
}
|
2010-02-25 09:52:30 -08:00
|
|
|
if ( (wpa_flags & NM_802_11_AP_SEC_KEY_MGMT_802_1X)
|
2013-05-24 22:36:24 +02:00
|
|
|
|| (rsn_flags & NM_802_11_AP_SEC_KEY_MGMT_802_1X)) {
|
|
|
|
|
g_string_append (security_str, _("802.1X"));
|
|
|
|
|
g_string_append_c (security_str, ' ');
|
|
|
|
|
}
|
2010-03-18 15:39:15 +01:00
|
|
|
|
|
|
|
|
if (security_str->len > 0)
|
|
|
|
|
g_string_truncate (security_str, security_str->len-1); /* Chop off last space */
|
|
|
|
|
|
cli: split tracking of meta data out of NmcOutputField
When generating output data, nmcli iterates over a list of
property-descriptors (nmc_fields_ip4_config), creates an intermediate
array (output_data) and finally prints it.
However, previously both the meta data (nmc_fields_ip4_config) and
the intermediate format use the same type NmcOutputField. This means,
certain fields are relevant to describe a property, and other fields
are output/formatting fields.
Split this up. Now, the meta data is tracked in form of an NMMetaAbstractInfo
lists. This separates the information about properties from intermediate steps
during creation of the output.
Note that currently functions like print_ip4_config() still have all the
knowledge about how to generate the output. That is wrong, instead, the
meta data (NMMetaAbstractInfo) should describe how to create the output
and then all those functions could be replaced. This means, later we want
to add more knowledge to the NMMetaAbstractInfo, so it is important to
keep them separate from NmcOutputField.
2017-03-31 19:18:16 +02:00
|
|
|
arr = nmc_dup_fields_array ((const NMMetaAbstractInfo *const*) nmc_fields_dev_wifi_list,
|
2013-05-22 08:37:50 +02:00
|
|
|
info->output_flags);
|
|
|
|
|
|
2012-08-29 10:39:09 +02:00
|
|
|
ap_name = g_strdup_printf ("AP[%d]", info->index++); /* AP */
|
2013-05-22 08:37:50 +02:00
|
|
|
set_val_str (arr, 0, ap_name);
|
|
|
|
|
set_val_str (arr, 1, ssid_str);
|
2013-05-16 16:26:15 +02:00
|
|
|
set_val_str (arr, 2, ssid_hex_str);
|
|
|
|
|
set_val_strc (arr, 3, bssid);
|
|
|
|
|
set_val_strc (arr, 4, mode == NM_802_11_MODE_ADHOC ? _("Ad-Hoc")
|
2013-05-20 15:40:58 +02:00
|
|
|
: mode == NM_802_11_MODE_INFRA ? _("Infra")
|
|
|
|
|
: _("N/A"));
|
2013-05-17 10:38:09 +02:00
|
|
|
set_val_str (arr, 5, channel_str);
|
|
|
|
|
set_val_str (arr, 6, freq_str);
|
|
|
|
|
set_val_str (arr, 7, bitrate_str);
|
|
|
|
|
set_val_str (arr, 8, strength_str);
|
2013-05-17 11:23:21 +02:00
|
|
|
set_val_strc (arr, 9, sig_bars);
|
|
|
|
|
set_val_str (arr, 10, security_str->str);
|
|
|
|
|
set_val_str (arr, 11, wpa_flags_str);
|
|
|
|
|
set_val_str (arr, 12, rsn_flags_str);
|
|
|
|
|
set_val_strc (arr, 13, info->device);
|
|
|
|
|
set_val_strc (arr, 14, active ? _("yes") : _("no"));
|
2013-05-20 16:36:20 +02:00
|
|
|
set_val_strc (arr, 15, active ? "*" : " ");
|
|
|
|
|
set_val_strc (arr, 16, nm_object_get_path (NM_OBJECT (ap)));
|
2013-05-22 08:37:50 +02:00
|
|
|
|
2015-02-24 15:10:57 +01:00
|
|
|
/* Set colors */
|
2016-07-01 21:45:43 +02:00
|
|
|
wifi_signal_to_color (strength, &color, &color_fmt);
|
|
|
|
|
set_val_color_all (arr, color);
|
|
|
|
|
set_val_color_fmt_all (arr, color_fmt);
|
2015-02-24 15:10:57 +01:00
|
|
|
if (active)
|
2017-04-04 15:12:00 +02:00
|
|
|
arr[15].color = NM_META_TERM_COLOR_GREEN;
|
2015-02-24 15:10:57 +01:00
|
|
|
|
2017-03-30 14:56:19 +02:00
|
|
|
g_ptr_array_add (info->output_data, arr);
|
2013-05-22 08:37:50 +02:00
|
|
|
|
|
|
|
|
g_string_free (security_str, FALSE);
|
2010-02-25 09:52:30 -08:00
|
|
|
}
|
|
|
|
|
|
2014-09-24 12:00:47 +02:00
|
|
|
static char *
|
|
|
|
|
bluetooth_caps_to_string (NMBluetoothCapabilities caps)
|
|
|
|
|
{
|
|
|
|
|
char *caps_str[8]; /* Enough space for caps and terminating NULL */
|
|
|
|
|
char *ret_str;
|
|
|
|
|
int i = 0;
|
|
|
|
|
|
|
|
|
|
if (caps & NM_BT_CAPABILITY_DUN)
|
|
|
|
|
caps_str[i++] = g_strdup ("DUN");
|
|
|
|
|
if (caps & NM_BT_CAPABILITY_NAP)
|
|
|
|
|
caps_str[i++] = g_strdup ("NAP");
|
|
|
|
|
|
|
|
|
|
if (i == 0)
|
|
|
|
|
caps_str[i++] = g_strdup (_("(none)"));
|
|
|
|
|
|
|
|
|
|
caps_str[i] = NULL;
|
|
|
|
|
|
|
|
|
|
ret_str = g_strjoinv (" ", caps_str);
|
|
|
|
|
|
|
|
|
|
i = 0;
|
|
|
|
|
while (caps_str[i])
|
|
|
|
|
g_free (caps_str[i++]);
|
|
|
|
|
|
|
|
|
|
return ret_str;
|
|
|
|
|
}
|
|
|
|
|
|
2017-03-31 13:21:47 +02:00
|
|
|
static char *
|
2013-05-22 08:37:50 +02:00
|
|
|
construct_header_name (const char *base, const char *spec)
|
|
|
|
|
{
|
|
|
|
|
if (spec == NULL)
|
2017-03-31 13:21:47 +02:00
|
|
|
return g_strdup (base);
|
2013-05-22 08:37:50 +02:00
|
|
|
|
2017-03-31 13:21:47 +02:00
|
|
|
return g_strdup_printf ("%s (%s)", base, spec);
|
2013-05-22 08:37:50 +02:00
|
|
|
}
|
2010-02-25 09:52:30 -08:00
|
|
|
|
2013-12-13 14:19:43 +01:00
|
|
|
static const char *
|
|
|
|
|
get_active_connection_id (NMDevice *device)
|
|
|
|
|
{
|
|
|
|
|
NMActiveConnection *ac;
|
|
|
|
|
|
|
|
|
|
ac = nm_device_get_active_connection (device);
|
|
|
|
|
if (!ac)
|
|
|
|
|
return NULL;
|
|
|
|
|
|
2014-10-16 18:09:17 +02:00
|
|
|
return nm_active_connection_get_id (ac);
|
2013-12-13 14:19:43 +01:00
|
|
|
}
|
|
|
|
|
|
2014-09-23 14:49:43 +02:00
|
|
|
static gboolean
|
2016-05-16 14:42:41 +02:00
|
|
|
print_bond_bridge_info (NMDevice *device,
|
|
|
|
|
NmCli *nmc,
|
|
|
|
|
const char *group_prefix,
|
|
|
|
|
const char *one_field)
|
2014-09-23 14:49:43 +02:00
|
|
|
{
|
|
|
|
|
const GPtrArray *slaves = NULL;
|
|
|
|
|
GString *slaves_str;
|
|
|
|
|
int idx;
|
cli: split tracking of meta data out of NmcOutputField
When generating output data, nmcli iterates over a list of
property-descriptors (nmc_fields_ip4_config), creates an intermediate
array (output_data) and finally prints it.
However, previously both the meta data (nmc_fields_ip4_config) and
the intermediate format use the same type NmcOutputField. This means,
certain fields are relevant to describe a property, and other fields
are output/formatting fields.
Split this up. Now, the meta data is tracked in form of an NMMetaAbstractInfo
lists. This separates the information about properties from intermediate steps
during creation of the output.
Note that currently functions like print_ip4_config() still have all the
knowledge about how to generate the output. That is wrong, instead, the
meta data (NMMetaAbstractInfo) should describe how to create the output
and then all those functions could be replaced. This means, later we want
to add more knowledge to the NMMetaAbstractInfo, so it is important to
keep them separate from NmcOutputField.
2017-03-31 19:18:16 +02:00
|
|
|
const NMMetaAbstractInfo *const*tmpl;
|
|
|
|
|
NmcOutputField *arr;
|
2017-03-30 14:56:19 +02:00
|
|
|
NMC_OUTPUT_DATA_DEFINE_SCOPED (out);
|
2014-09-23 14:49:43 +02:00
|
|
|
|
|
|
|
|
if (NM_IS_DEVICE_BOND (device))
|
|
|
|
|
slaves = nm_device_bond_get_slaves (NM_DEVICE_BOND (device));
|
|
|
|
|
else if (NM_IS_DEVICE_BRIDGE (device))
|
|
|
|
|
slaves = nm_device_bridge_get_slaves (NM_DEVICE_BRIDGE (device));
|
2016-05-16 14:42:41 +02:00
|
|
|
else
|
|
|
|
|
g_return_val_if_reached (FALSE);
|
2014-09-23 14:49:43 +02:00
|
|
|
|
|
|
|
|
slaves_str = g_string_new (NULL);
|
|
|
|
|
for (idx = 0; slaves && idx < slaves->len; idx++) {
|
|
|
|
|
NMDevice *slave = g_ptr_array_index (slaves, idx);
|
|
|
|
|
const char *iface = nm_device_get_iface (slave);
|
|
|
|
|
|
|
|
|
|
if (iface) {
|
|
|
|
|
g_string_append (slaves_str, iface);
|
|
|
|
|
g_string_append_c (slaves_str, ' ');
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (slaves_str->len > 0)
|
|
|
|
|
g_string_truncate (slaves_str, slaves_str->len-1); /* Chop off last space */
|
|
|
|
|
|
cli: split tracking of meta data out of NmcOutputField
When generating output data, nmcli iterates over a list of
property-descriptors (nmc_fields_ip4_config), creates an intermediate
array (output_data) and finally prints it.
However, previously both the meta data (nmc_fields_ip4_config) and
the intermediate format use the same type NmcOutputField. This means,
certain fields are relevant to describe a property, and other fields
are output/formatting fields.
Split this up. Now, the meta data is tracked in form of an NMMetaAbstractInfo
lists. This separates the information about properties from intermediate steps
during creation of the output.
Note that currently functions like print_ip4_config() still have all the
knowledge about how to generate the output. That is wrong, instead, the
meta data (NMMetaAbstractInfo) should describe how to create the output
and then all those functions could be replaced. This means, later we want
to add more knowledge to the NMMetaAbstractInfo, so it is important to
keep them separate from NmcOutputField.
2017-03-31 19:18:16 +02:00
|
|
|
tmpl = (const NMMetaAbstractInfo *const*) nmc_fields_dev_show_master_prop;
|
|
|
|
|
out_indices = parse_output_fields (one_field,
|
2017-03-31 12:55:43 +02:00
|
|
|
tmpl, FALSE, NULL, NULL);
|
cli: split tracking of meta data out of NmcOutputField
When generating output data, nmcli iterates over a list of
property-descriptors (nmc_fields_ip4_config), creates an intermediate
array (output_data) and finally prints it.
However, previously both the meta data (nmc_fields_ip4_config) and
the intermediate format use the same type NmcOutputField. This means,
certain fields are relevant to describe a property, and other fields
are output/formatting fields.
Split this up. Now, the meta data is tracked in form of an NMMetaAbstractInfo
lists. This separates the information about properties from intermediate steps
during creation of the output.
Note that currently functions like print_ip4_config() still have all the
knowledge about how to generate the output. That is wrong, instead, the
meta data (NMMetaAbstractInfo) should describe how to create the output
and then all those functions could be replaced. This means, later we want
to add more knowledge to the NMMetaAbstractInfo, so it is important to
keep them separate from NmcOutputField.
2017-03-31 19:18:16 +02:00
|
|
|
arr = nmc_dup_fields_array (tmpl, NMC_OF_FLAG_FIELD_NAMES);
|
2017-03-30 14:56:19 +02:00
|
|
|
g_ptr_array_add (out.output_data, arr);
|
2014-09-23 14:49:43 +02:00
|
|
|
|
cli: split tracking of meta data out of NmcOutputField
When generating output data, nmcli iterates over a list of
property-descriptors (nmc_fields_ip4_config), creates an intermediate
array (output_data) and finally prints it.
However, previously both the meta data (nmc_fields_ip4_config) and
the intermediate format use the same type NmcOutputField. This means,
certain fields are relevant to describe a property, and other fields
are output/formatting fields.
Split this up. Now, the meta data is tracked in form of an NMMetaAbstractInfo
lists. This separates the information about properties from intermediate steps
during creation of the output.
Note that currently functions like print_ip4_config() still have all the
knowledge about how to generate the output. That is wrong, instead, the
meta data (NMMetaAbstractInfo) should describe how to create the output
and then all those functions could be replaced. This means, later we want
to add more knowledge to the NMMetaAbstractInfo, so it is important to
keep them separate from NmcOutputField.
2017-03-31 19:18:16 +02:00
|
|
|
arr = nmc_dup_fields_array (tmpl, NMC_OF_FLAG_SECTION_PREFIX);
|
2014-09-23 14:49:43 +02:00
|
|
|
set_val_strc (arr, 0, group_prefix); /* i.e. BOND, TEAM, BRIDGE */
|
|
|
|
|
set_val_str (arr, 1, slaves_str->str);
|
2017-03-30 14:56:19 +02:00
|
|
|
g_ptr_array_add (out.output_data, arr);
|
2014-09-23 14:49:43 +02:00
|
|
|
|
2017-03-30 14:56:19 +02:00
|
|
|
print_data_prepare_width (out.output_data);
|
2017-03-31 13:21:47 +02:00
|
|
|
print_data (&nmc->nmc_config, out_indices, NULL, 0, &out);
|
2014-09-23 14:49:43 +02:00
|
|
|
|
|
|
|
|
g_string_free (slaves_str, FALSE);
|
|
|
|
|
|
|
|
|
|
return TRUE;
|
|
|
|
|
}
|
|
|
|
|
|
2016-05-16 14:42:41 +02:00
|
|
|
static char *
|
|
|
|
|
sanitize_team_config (const char *config)
|
|
|
|
|
{
|
|
|
|
|
char *ret;
|
|
|
|
|
int i;
|
|
|
|
|
|
|
|
|
|
if (!config)
|
|
|
|
|
return NULL;
|
|
|
|
|
|
|
|
|
|
ret = g_strdup (config);
|
|
|
|
|
|
|
|
|
|
for (i = 0; i < strlen (ret); i++) {
|
|
|
|
|
if (ret[i] == '\n')
|
|
|
|
|
ret[i] = ' ';
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return ret;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static gboolean
|
|
|
|
|
print_team_info (NMDevice *device,
|
|
|
|
|
NmCli *nmc,
|
|
|
|
|
const char *group_prefix,
|
|
|
|
|
const char *one_field)
|
|
|
|
|
{
|
|
|
|
|
const GPtrArray *slaves = NULL;
|
|
|
|
|
GString *slaves_str;
|
|
|
|
|
int idx;
|
cli: split tracking of meta data out of NmcOutputField
When generating output data, nmcli iterates over a list of
property-descriptors (nmc_fields_ip4_config), creates an intermediate
array (output_data) and finally prints it.
However, previously both the meta data (nmc_fields_ip4_config) and
the intermediate format use the same type NmcOutputField. This means,
certain fields are relevant to describe a property, and other fields
are output/formatting fields.
Split this up. Now, the meta data is tracked in form of an NMMetaAbstractInfo
lists. This separates the information about properties from intermediate steps
during creation of the output.
Note that currently functions like print_ip4_config() still have all the
knowledge about how to generate the output. That is wrong, instead, the
meta data (NMMetaAbstractInfo) should describe how to create the output
and then all those functions could be replaced. This means, later we want
to add more knowledge to the NMMetaAbstractInfo, so it is important to
keep them separate from NmcOutputField.
2017-03-31 19:18:16 +02:00
|
|
|
const NMMetaAbstractInfo *const* tmpl;
|
|
|
|
|
NmcOutputField *arr;
|
2017-03-30 14:56:19 +02:00
|
|
|
NMC_OUTPUT_DATA_DEFINE_SCOPED (out);
|
2016-05-16 14:42:41 +02:00
|
|
|
|
|
|
|
|
if (NM_IS_DEVICE_TEAM (device))
|
|
|
|
|
slaves = nm_device_team_get_slaves (NM_DEVICE_TEAM (device));
|
|
|
|
|
else
|
|
|
|
|
g_return_val_if_reached (FALSE);
|
|
|
|
|
|
|
|
|
|
slaves_str = g_string_new (NULL);
|
|
|
|
|
for (idx = 0; slaves && idx < slaves->len; idx++) {
|
|
|
|
|
NMDevice *slave = g_ptr_array_index (slaves, idx);
|
|
|
|
|
const char *iface = nm_device_get_iface (slave);
|
|
|
|
|
|
|
|
|
|
if (iface) {
|
|
|
|
|
g_string_append (slaves_str, iface);
|
|
|
|
|
g_string_append_c (slaves_str, ' ');
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (slaves_str->len > 0)
|
|
|
|
|
g_string_truncate (slaves_str, slaves_str->len-1); /* Chop off last space */
|
|
|
|
|
|
cli: split tracking of meta data out of NmcOutputField
When generating output data, nmcli iterates over a list of
property-descriptors (nmc_fields_ip4_config), creates an intermediate
array (output_data) and finally prints it.
However, previously both the meta data (nmc_fields_ip4_config) and
the intermediate format use the same type NmcOutputField. This means,
certain fields are relevant to describe a property, and other fields
are output/formatting fields.
Split this up. Now, the meta data is tracked in form of an NMMetaAbstractInfo
lists. This separates the information about properties from intermediate steps
during creation of the output.
Note that currently functions like print_ip4_config() still have all the
knowledge about how to generate the output. That is wrong, instead, the
meta data (NMMetaAbstractInfo) should describe how to create the output
and then all those functions could be replaced. This means, later we want
to add more knowledge to the NMMetaAbstractInfo, so it is important to
keep them separate from NmcOutputField.
2017-03-31 19:18:16 +02:00
|
|
|
tmpl = (const NMMetaAbstractInfo *const*) nmc_fields_dev_show_team_prop;
|
|
|
|
|
out_indices = parse_output_fields (one_field,
|
2017-03-31 12:55:43 +02:00
|
|
|
tmpl, FALSE, NULL, NULL);
|
cli: split tracking of meta data out of NmcOutputField
When generating output data, nmcli iterates over a list of
property-descriptors (nmc_fields_ip4_config), creates an intermediate
array (output_data) and finally prints it.
However, previously both the meta data (nmc_fields_ip4_config) and
the intermediate format use the same type NmcOutputField. This means,
certain fields are relevant to describe a property, and other fields
are output/formatting fields.
Split this up. Now, the meta data is tracked in form of an NMMetaAbstractInfo
lists. This separates the information about properties from intermediate steps
during creation of the output.
Note that currently functions like print_ip4_config() still have all the
knowledge about how to generate the output. That is wrong, instead, the
meta data (NMMetaAbstractInfo) should describe how to create the output
and then all those functions could be replaced. This means, later we want
to add more knowledge to the NMMetaAbstractInfo, so it is important to
keep them separate from NmcOutputField.
2017-03-31 19:18:16 +02:00
|
|
|
arr = nmc_dup_fields_array (tmpl, NMC_OF_FLAG_FIELD_NAMES);
|
2017-03-30 14:56:19 +02:00
|
|
|
g_ptr_array_add (out.output_data, arr);
|
2016-05-16 14:42:41 +02:00
|
|
|
|
cli: split tracking of meta data out of NmcOutputField
When generating output data, nmcli iterates over a list of
property-descriptors (nmc_fields_ip4_config), creates an intermediate
array (output_data) and finally prints it.
However, previously both the meta data (nmc_fields_ip4_config) and
the intermediate format use the same type NmcOutputField. This means,
certain fields are relevant to describe a property, and other fields
are output/formatting fields.
Split this up. Now, the meta data is tracked in form of an NMMetaAbstractInfo
lists. This separates the information about properties from intermediate steps
during creation of the output.
Note that currently functions like print_ip4_config() still have all the
knowledge about how to generate the output. That is wrong, instead, the
meta data (NMMetaAbstractInfo) should describe how to create the output
and then all those functions could be replaced. This means, later we want
to add more knowledge to the NMMetaAbstractInfo, so it is important to
keep them separate from NmcOutputField.
2017-03-31 19:18:16 +02:00
|
|
|
arr = nmc_dup_fields_array (tmpl, NMC_OF_FLAG_SECTION_PREFIX);
|
2016-05-16 14:42:41 +02:00
|
|
|
set_val_strc (arr, 0, group_prefix); /* TEAM */
|
|
|
|
|
set_val_str (arr, 1, slaves_str->str);
|
|
|
|
|
set_val_str (arr, 2, sanitize_team_config (nm_device_team_get_config (NM_DEVICE_TEAM (device))));
|
2017-03-30 14:56:19 +02:00
|
|
|
g_ptr_array_add (out.output_data, arr);
|
2016-05-16 14:42:41 +02:00
|
|
|
|
2017-03-30 14:56:19 +02:00
|
|
|
print_data_prepare_width (out.output_data);
|
2017-03-31 13:21:47 +02:00
|
|
|
print_data (&nmc->nmc_config, out_indices, NULL, 0, &out);
|
2016-05-16 14:42:41 +02:00
|
|
|
|
|
|
|
|
g_string_free (slaves_str, FALSE);
|
|
|
|
|
|
|
|
|
|
return TRUE;
|
|
|
|
|
}
|
|
|
|
|
|
2014-01-10 13:19:14 +01:00
|
|
|
static gboolean
|
2013-05-22 08:37:50 +02:00
|
|
|
show_device_info (NMDevice *device, NmCli *nmc)
|
2010-02-25 09:52:30 -08:00
|
|
|
{
|
2010-03-24 19:05:35 +01:00
|
|
|
GError *error = NULL;
|
2010-03-22 18:43:28 +01:00
|
|
|
const char *hwaddr = NULL;
|
2010-03-25 13:39:49 -07:00
|
|
|
NMDeviceState state = NM_DEVICE_STATE_UNKNOWN;
|
2012-02-09 15:39:57 +01:00
|
|
|
NMDeviceStateReason reason = NM_DEVICE_STATE_REASON_NONE;
|
2011-02-21 16:38:02 +01:00
|
|
|
NMDeviceCapabilities caps;
|
2011-12-20 15:54:58 +01:00
|
|
|
NMActiveConnection *acon;
|
2010-02-25 09:52:30 -08:00
|
|
|
guint32 speed;
|
2013-12-16 17:08:28 +01:00
|
|
|
char *speed_str, *state_str, *reason_str, *mtu_str;
|
2010-03-24 19:05:35 +01:00
|
|
|
GArray *sections_array;
|
|
|
|
|
int k;
|
cli: split tracking of meta data out of NmcOutputField
When generating output data, nmcli iterates over a list of
property-descriptors (nmc_fields_ip4_config), creates an intermediate
array (output_data) and finally prints it.
However, previously both the meta data (nmc_fields_ip4_config) and
the intermediate format use the same type NmcOutputField. This means,
certain fields are relevant to describe a property, and other fields
are output/formatting fields.
Split this up. Now, the meta data is tracked in form of an NMMetaAbstractInfo
lists. This separates the information about properties from intermediate steps
during creation of the output.
Note that currently functions like print_ip4_config() still have all the
knowledge about how to generate the output. That is wrong, instead, the
meta data (NMMetaAbstractInfo) should describe how to create the output
and then all those functions could be replaced. This means, later we want
to add more knowledge to the NMMetaAbstractInfo, so it is important to
keep them separate from NmcOutputField.
2017-03-31 19:18:16 +02:00
|
|
|
const char *fields_str = NULL;
|
|
|
|
|
const NMMetaAbstractInfo *const*tmpl;
|
|
|
|
|
NmcOutputField *arr;
|
2010-03-24 19:05:35 +01:00
|
|
|
gboolean was_output = FALSE;
|
2014-10-22 13:48:18 -04:00
|
|
|
NMIPConfig *cfg4, *cfg6;
|
2014-10-22 13:48:18 -04:00
|
|
|
NMDhcpConfig *dhcp4, *dhcp6;
|
2013-05-22 08:37:50 +02:00
|
|
|
const char *base_hdr = _("Device details");
|
2013-12-10 12:00:53 +01:00
|
|
|
GPtrArray *fields_in_section = NULL;
|
2010-03-24 19:05:35 +01:00
|
|
|
|
|
|
|
|
if (!nmc->required_fields || strcasecmp (nmc->required_fields, "common") == 0)
|
cli: split tracking of meta data out of NmcOutputField
When generating output data, nmcli iterates over a list of
property-descriptors (nmc_fields_ip4_config), creates an intermediate
array (output_data) and finally prints it.
However, previously both the meta data (nmc_fields_ip4_config) and
the intermediate format use the same type NmcOutputField. This means,
certain fields are relevant to describe a property, and other fields
are output/formatting fields.
Split this up. Now, the meta data is tracked in form of an NMMetaAbstractInfo
lists. This separates the information about properties from intermediate steps
during creation of the output.
Note that currently functions like print_ip4_config() still have all the
knowledge about how to generate the output. That is wrong, instead, the
meta data (NMMetaAbstractInfo) should describe how to create the output
and then all those functions could be replaced. This means, later we want
to add more knowledge to the NMMetaAbstractInfo, so it is important to
keep them separate from NmcOutputField.
2017-03-31 19:18:16 +02:00
|
|
|
fields_str = NMC_FIELDS_DEV_SHOW_SECTIONS_COMMON;
|
|
|
|
|
else if (strcasecmp (nmc->required_fields, "all") == 0) {
|
|
|
|
|
} else
|
2010-03-24 19:05:35 +01:00
|
|
|
fields_str = nmc->required_fields;
|
|
|
|
|
|
cli: split tracking of meta data out of NmcOutputField
When generating output data, nmcli iterates over a list of
property-descriptors (nmc_fields_ip4_config), creates an intermediate
array (output_data) and finally prints it.
However, previously both the meta data (nmc_fields_ip4_config) and
the intermediate format use the same type NmcOutputField. This means,
certain fields are relevant to describe a property, and other fields
are output/formatting fields.
Split this up. Now, the meta data is tracked in form of an NMMetaAbstractInfo
lists. This separates the information about properties from intermediate steps
during creation of the output.
Note that currently functions like print_ip4_config() still have all the
knowledge about how to generate the output. That is wrong, instead, the
meta data (NMMetaAbstractInfo) should describe how to create the output
and then all those functions could be replaced. This means, later we want
to add more knowledge to the NMMetaAbstractInfo, so it is important to
keep them separate from NmcOutputField.
2017-03-31 19:18:16 +02:00
|
|
|
sections_array = parse_output_fields (fields_str, (const NMMetaAbstractInfo *const*) nmc_fields_dev_show_sections, TRUE, &fields_in_section, &error);
|
2010-03-24 19:05:35 +01:00
|
|
|
if (error) {
|
2013-12-10 12:00:53 +01:00
|
|
|
g_string_printf (nmc->return_text, _("Error: 'device show': %s"), error->message);
|
2010-03-24 19:05:35 +01:00
|
|
|
g_error_free (error);
|
|
|
|
|
nmc->return_value = NMC_RESULT_ERROR_USER_INPUT;
|
2014-01-10 13:19:14 +01:00
|
|
|
return FALSE;
|
2010-03-24 19:05:35 +01:00
|
|
|
}
|
2010-02-25 09:52:30 -08:00
|
|
|
|
2017-03-30 14:56:19 +02:00
|
|
|
{
|
cli: split tracking of meta data out of NmcOutputField
When generating output data, nmcli iterates over a list of
property-descriptors (nmc_fields_ip4_config), creates an intermediate
array (output_data) and finally prints it.
However, previously both the meta data (nmc_fields_ip4_config) and
the intermediate format use the same type NmcOutputField. This means,
certain fields are relevant to describe a property, and other fields
are output/formatting fields.
Split this up. Now, the meta data is tracked in form of an NMMetaAbstractInfo
lists. This separates the information about properties from intermediate steps
during creation of the output.
Note that currently functions like print_ip4_config() still have all the
knowledge about how to generate the output. That is wrong, instead, the
meta data (NMMetaAbstractInfo) should describe how to create the output
and then all those functions could be replaced. This means, later we want
to add more knowledge to the NMMetaAbstractInfo, so it is important to
keep them separate from NmcOutputField.
2017-03-31 19:18:16 +02:00
|
|
|
gs_unref_array GArray *out_indices = NULL;
|
2017-03-31 13:21:47 +02:00
|
|
|
gs_free char *header_name = NULL;
|
cli: split tracking of meta data out of NmcOutputField
When generating output data, nmcli iterates over a list of
property-descriptors (nmc_fields_ip4_config), creates an intermediate
array (output_data) and finally prints it.
However, previously both the meta data (nmc_fields_ip4_config) and
the intermediate format use the same type NmcOutputField. This means,
certain fields are relevant to describe a property, and other fields
are output/formatting fields.
Split this up. Now, the meta data is tracked in form of an NMMetaAbstractInfo
lists. This separates the information about properties from intermediate steps
during creation of the output.
Note that currently functions like print_ip4_config() still have all the
knowledge about how to generate the output. That is wrong, instead, the
meta data (NMMetaAbstractInfo) should describe how to create the output
and then all those functions could be replaced. This means, later we want
to add more knowledge to the NMMetaAbstractInfo, so it is important to
keep them separate from NmcOutputField.
2017-03-31 19:18:16 +02:00
|
|
|
gs_free NmcOutputField *row = NULL;
|
|
|
|
|
int i;
|
2017-02-03 18:11:24 +01:00
|
|
|
|
2017-03-30 14:56:19 +02:00
|
|
|
/* Main header (pretty only) */
|
2017-03-31 13:21:47 +02:00
|
|
|
header_name = construct_header_name (base_hdr, nm_device_get_iface (device));
|
2013-05-22 08:37:50 +02:00
|
|
|
|
2017-03-30 14:56:19 +02:00
|
|
|
/* Lazy way to retrieve sorted array from 0 to the number of dev fields */
|
cli: split tracking of meta data out of NmcOutputField
When generating output data, nmcli iterates over a list of
property-descriptors (nmc_fields_ip4_config), creates an intermediate
array (output_data) and finally prints it.
However, previously both the meta data (nmc_fields_ip4_config) and
the intermediate format use the same type NmcOutputField. This means,
certain fields are relevant to describe a property, and other fields
are output/formatting fields.
Split this up. Now, the meta data is tracked in form of an NMMetaAbstractInfo
lists. This separates the information about properties from intermediate steps
during creation of the output.
Note that currently functions like print_ip4_config() still have all the
knowledge about how to generate the output. That is wrong, instead, the
meta data (NMMetaAbstractInfo) should describe how to create the output
and then all those functions could be replaced. This means, later we want
to add more knowledge to the NMMetaAbstractInfo, so it is important to
keep them separate from NmcOutputField.
2017-03-31 19:18:16 +02:00
|
|
|
out_indices = parse_output_fields (NULL,
|
|
|
|
|
(const NMMetaAbstractInfo *const*) nmc_fields_dev_show_general,
|
|
|
|
|
FALSE, NULL, NULL);
|
|
|
|
|
|
|
|
|
|
row = g_new0 (NmcOutputField, _NM_META_SETTING_TYPE_NUM + 1);
|
|
|
|
|
for (i = 0; i < _NM_META_SETTING_TYPE_NUM; i++)
|
|
|
|
|
row[i].info = (const NMMetaAbstractInfo *) &nmc_fields_dev_show_general[i];
|
2017-03-30 14:56:19 +02:00
|
|
|
|
2017-03-31 12:55:43 +02:00
|
|
|
print_required_fields (&nmc->nmc_config, NMC_OF_FLAG_MAIN_HEADER_ONLY,
|
2017-03-31 13:21:47 +02:00
|
|
|
out_indices, header_name,
|
cli: split tracking of meta data out of NmcOutputField
When generating output data, nmcli iterates over a list of
property-descriptors (nmc_fields_ip4_config), creates an intermediate
array (output_data) and finally prints it.
However, previously both the meta data (nmc_fields_ip4_config) and
the intermediate format use the same type NmcOutputField. This means,
certain fields are relevant to describe a property, and other fields
are output/formatting fields.
Split this up. Now, the meta data is tracked in form of an NMMetaAbstractInfo
lists. This separates the information about properties from intermediate steps
during creation of the output.
Note that currently functions like print_ip4_config() still have all the
knowledge about how to generate the output. That is wrong, instead, the
meta data (NMMetaAbstractInfo) should describe how to create the output
and then all those functions could be replaced. This means, later we want
to add more knowledge to the NMMetaAbstractInfo, so it is important to
keep them separate from NmcOutputField.
2017-03-31 19:18:16 +02:00
|
|
|
0, row);
|
2017-03-30 14:56:19 +02:00
|
|
|
}
|
2010-02-25 09:52:30 -08:00
|
|
|
|
2010-03-24 19:05:35 +01:00
|
|
|
/* Loop through the required sections and print them. */
|
|
|
|
|
for (k = 0; k < sections_array->len; k++) {
|
|
|
|
|
int section_idx = g_array_index (sections_array, int, k);
|
2013-12-10 12:00:53 +01:00
|
|
|
char *section_fld = (char *) g_ptr_array_index (fields_in_section, k);
|
2010-02-25 09:52:30 -08:00
|
|
|
|
2017-03-30 12:45:41 +02:00
|
|
|
if (nmc->nmc_config.print_output != NMC_PRINT_TERSE && !nmc->nmc_config.multiline_output && was_output)
|
2014-09-19 16:04:40 -04:00
|
|
|
g_print ("\n"); /* Print empty line between groups in tabular mode */
|
2010-02-25 09:52:30 -08:00
|
|
|
|
2010-03-24 19:05:35 +01:00
|
|
|
was_output = FALSE;
|
2010-02-25 09:52:30 -08:00
|
|
|
|
2014-08-25 10:51:26 -04:00
|
|
|
state = nm_device_get_state (device);
|
|
|
|
|
reason = nm_device_get_state_reason (device);
|
2010-03-25 13:39:49 -07:00
|
|
|
|
2010-03-24 19:05:35 +01:00
|
|
|
/* section GENERAL */
|
cli: split tracking of meta data out of NmcOutputField
When generating output data, nmcli iterates over a list of
property-descriptors (nmc_fields_ip4_config), creates an intermediate
array (output_data) and finally prints it.
However, previously both the meta data (nmc_fields_ip4_config) and
the intermediate format use the same type NmcOutputField. This means,
certain fields are relevant to describe a property, and other fields
are output/formatting fields.
Split this up. Now, the meta data is tracked in form of an NMMetaAbstractInfo
lists. This separates the information about properties from intermediate steps
during creation of the output.
Note that currently functions like print_ip4_config() still have all the
knowledge about how to generate the output. That is wrong, instead, the
meta data (NMMetaAbstractInfo) should describe how to create the output
and then all those functions could be replaced. This means, later we want
to add more knowledge to the NMMetaAbstractInfo, so it is important to
keep them separate from NmcOutputField.
2017-03-31 19:18:16 +02:00
|
|
|
if (!strcasecmp (nmc_fields_dev_show_sections[section_idx]->name, nmc_fields_dev_show_sections[0]->name)) {
|
2017-03-30 14:56:19 +02:00
|
|
|
NMC_OUTPUT_DATA_DEFINE_SCOPED (out);
|
|
|
|
|
|
cli: split tracking of meta data out of NmcOutputField
When generating output data, nmcli iterates over a list of
property-descriptors (nmc_fields_ip4_config), creates an intermediate
array (output_data) and finally prints it.
However, previously both the meta data (nmc_fields_ip4_config) and
the intermediate format use the same type NmcOutputField. This means,
certain fields are relevant to describe a property, and other fields
are output/formatting fields.
Split this up. Now, the meta data is tracked in form of an NMMetaAbstractInfo
lists. This separates the information about properties from intermediate steps
during creation of the output.
Note that currently functions like print_ip4_config() still have all the
knowledge about how to generate the output. That is wrong, instead, the
meta data (NMMetaAbstractInfo) should describe how to create the output
and then all those functions could be replaced. This means, later we want
to add more knowledge to the NMMetaAbstractInfo, so it is important to
keep them separate from NmcOutputField.
2017-03-31 19:18:16 +02:00
|
|
|
tmpl = (const NMMetaAbstractInfo *const*) nmc_fields_dev_show_general;
|
|
|
|
|
out_indices = parse_output_fields (section_fld,
|
2017-03-31 12:55:43 +02:00
|
|
|
tmpl, FALSE, NULL, NULL);
|
cli: split tracking of meta data out of NmcOutputField
When generating output data, nmcli iterates over a list of
property-descriptors (nmc_fields_ip4_config), creates an intermediate
array (output_data) and finally prints it.
However, previously both the meta data (nmc_fields_ip4_config) and
the intermediate format use the same type NmcOutputField. This means,
certain fields are relevant to describe a property, and other fields
are output/formatting fields.
Split this up. Now, the meta data is tracked in form of an NMMetaAbstractInfo
lists. This separates the information about properties from intermediate steps
during creation of the output.
Note that currently functions like print_ip4_config() still have all the
knowledge about how to generate the output. That is wrong, instead, the
meta data (NMMetaAbstractInfo) should describe how to create the output
and then all those functions could be replaced. This means, later we want
to add more knowledge to the NMMetaAbstractInfo, so it is important to
keep them separate from NmcOutputField.
2017-03-31 19:18:16 +02:00
|
|
|
arr = nmc_dup_fields_array (tmpl, NMC_OF_FLAG_FIELD_NAMES);
|
2017-03-30 14:56:19 +02:00
|
|
|
g_ptr_array_add (out.output_data, arr);
|
2010-02-25 09:52:30 -08:00
|
|
|
|
2012-05-09 12:35:27 +02:00
|
|
|
state_str = g_strdup_printf ("%d (%s)", state, nmc_device_state_to_string (state));
|
|
|
|
|
reason_str = g_strdup_printf ("%d (%s)", reason, nmc_device_reason_to_string (reason));
|
2013-12-16 16:36:49 +01:00
|
|
|
hwaddr = nm_device_get_hw_address (device);
|
2013-12-16 17:08:28 +01:00
|
|
|
mtu_str = g_strdup_printf ("%u", nm_device_get_mtu (device));
|
2013-12-13 14:19:43 +01:00
|
|
|
acon = nm_device_get_active_connection (device);
|
2012-02-09 15:39:57 +01:00
|
|
|
|
cli: split tracking of meta data out of NmcOutputField
When generating output data, nmcli iterates over a list of
property-descriptors (nmc_fields_ip4_config), creates an intermediate
array (output_data) and finally prints it.
However, previously both the meta data (nmc_fields_ip4_config) and
the intermediate format use the same type NmcOutputField. This means,
certain fields are relevant to describe a property, and other fields
are output/formatting fields.
Split this up. Now, the meta data is tracked in form of an NMMetaAbstractInfo
lists. This separates the information about properties from intermediate steps
during creation of the output.
Note that currently functions like print_ip4_config() still have all the
knowledge about how to generate the output. That is wrong, instead, the
meta data (NMMetaAbstractInfo) should describe how to create the output
and then all those functions could be replaced. This means, later we want
to add more knowledge to the NMMetaAbstractInfo, so it is important to
keep them separate from NmcOutputField.
2017-03-31 19:18:16 +02:00
|
|
|
arr = nmc_dup_fields_array (tmpl, NMC_OF_FLAG_SECTION_PREFIX);
|
|
|
|
|
set_val_strc (arr, 0, nmc_fields_dev_show_sections[0]->name); /* "GENERAL"*/
|
2013-05-22 08:37:50 +02:00
|
|
|
set_val_strc (arr, 1, nm_device_get_iface (device));
|
|
|
|
|
set_val_strc (arr, 2, nm_device_get_type_description (device));
|
2015-04-14 14:35:14 +02:00
|
|
|
set_val_strc (arr, 3, G_OBJECT_TYPE_NAME (device));
|
|
|
|
|
set_val_strc (arr, 4, nm_device_get_vendor (device));
|
|
|
|
|
set_val_strc (arr, 5, nm_device_get_product (device));
|
|
|
|
|
set_val_strc (arr, 6, nm_device_get_driver (device) ? nm_device_get_driver (device) : _("(unknown)"));
|
|
|
|
|
set_val_strc (arr, 7, nm_device_get_driver_version (device));
|
|
|
|
|
set_val_strc (arr, 8, nm_device_get_firmware_version (device));
|
|
|
|
|
set_val_strc (arr, 9, hwaddr ? hwaddr : _("(unknown)"));
|
|
|
|
|
set_val_str (arr, 10, mtu_str);
|
|
|
|
|
set_val_str (arr, 11, state_str);
|
|
|
|
|
set_val_str (arr, 12, reason_str);
|
|
|
|
|
set_val_strc (arr, 13, nm_device_get_udi (device));
|
|
|
|
|
set_val_strc (arr, 14, nm_device_get_ip_iface (device));
|
|
|
|
|
set_val_strc (arr, 15, nm_device_is_software (device) ? _("yes") : _("no"));
|
|
|
|
|
set_val_strc (arr, 16, nm_device_get_managed (device) ? _("yes") : _("no"));
|
|
|
|
|
set_val_strc (arr, 17, nm_device_get_autoconnect (device) ? _("yes") : _("no"));
|
|
|
|
|
set_val_strc (arr, 18, nm_device_get_firmware_missing (device) ? _("yes") : _("no"));
|
2015-04-14 14:56:08 +02:00
|
|
|
set_val_strc (arr, 19, nm_device_get_nm_plugin_missing (device) ? _("yes") : _("no"));
|
|
|
|
|
set_val_strc (arr, 20, nm_device_get_physical_port_id (device));
|
|
|
|
|
set_val_strc (arr, 21, get_active_connection_id (device));
|
|
|
|
|
set_val_strc (arr, 22, acon ? nm_active_connection_get_uuid (acon) : NULL);
|
|
|
|
|
set_val_strc (arr, 23, acon ? nm_object_get_path (NM_OBJECT (acon)) : NULL);
|
2015-04-30 11:52:04 +02:00
|
|
|
set_val_strc (arr, 24, nmc_device_metered_to_string (nm_device_get_metered (device)));
|
2017-03-30 14:56:19 +02:00
|
|
|
g_ptr_array_add (out.output_data, arr);
|
2013-05-22 08:37:50 +02:00
|
|
|
|
2017-03-30 14:56:19 +02:00
|
|
|
print_data_prepare_width (out.output_data);
|
2017-03-31 13:21:47 +02:00
|
|
|
print_data (&nmc->nmc_config, out_indices, NULL, 0, &out);
|
2010-03-24 19:05:35 +01:00
|
|
|
was_output = TRUE;
|
|
|
|
|
}
|
2010-03-22 18:43:28 +01:00
|
|
|
|
2010-03-24 19:05:35 +01:00
|
|
|
/* section CAPABILITIES */
|
cli: split tracking of meta data out of NmcOutputField
When generating output data, nmcli iterates over a list of
property-descriptors (nmc_fields_ip4_config), creates an intermediate
array (output_data) and finally prints it.
However, previously both the meta data (nmc_fields_ip4_config) and
the intermediate format use the same type NmcOutputField. This means,
certain fields are relevant to describe a property, and other fields
are output/formatting fields.
Split this up. Now, the meta data is tracked in form of an NMMetaAbstractInfo
lists. This separates the information about properties from intermediate steps
during creation of the output.
Note that currently functions like print_ip4_config() still have all the
knowledge about how to generate the output. That is wrong, instead, the
meta data (NMMetaAbstractInfo) should describe how to create the output
and then all those functions could be replaced. This means, later we want
to add more knowledge to the NMMetaAbstractInfo, so it is important to
keep them separate from NmcOutputField.
2017-03-31 19:18:16 +02:00
|
|
|
if (!strcasecmp (nmc_fields_dev_show_sections[section_idx]->name, nmc_fields_dev_show_sections[1]->name)) {
|
2017-03-30 14:56:19 +02:00
|
|
|
NMC_OUTPUT_DATA_DEFINE_SCOPED (out);
|
|
|
|
|
|
cli: split tracking of meta data out of NmcOutputField
When generating output data, nmcli iterates over a list of
property-descriptors (nmc_fields_ip4_config), creates an intermediate
array (output_data) and finally prints it.
However, previously both the meta data (nmc_fields_ip4_config) and
the intermediate format use the same type NmcOutputField. This means,
certain fields are relevant to describe a property, and other fields
are output/formatting fields.
Split this up. Now, the meta data is tracked in form of an NMMetaAbstractInfo
lists. This separates the information about properties from intermediate steps
during creation of the output.
Note that currently functions like print_ip4_config() still have all the
knowledge about how to generate the output. That is wrong, instead, the
meta data (NMMetaAbstractInfo) should describe how to create the output
and then all those functions could be replaced. This means, later we want
to add more knowledge to the NMMetaAbstractInfo, so it is important to
keep them separate from NmcOutputField.
2017-03-31 19:18:16 +02:00
|
|
|
tmpl = (const NMMetaAbstractInfo *const*) nmc_fields_dev_show_cap;
|
|
|
|
|
out_indices = parse_output_fields (section_fld,
|
2017-03-31 12:55:43 +02:00
|
|
|
tmpl, FALSE, NULL, NULL);
|
cli: split tracking of meta data out of NmcOutputField
When generating output data, nmcli iterates over a list of
property-descriptors (nmc_fields_ip4_config), creates an intermediate
array (output_data) and finally prints it.
However, previously both the meta data (nmc_fields_ip4_config) and
the intermediate format use the same type NmcOutputField. This means,
certain fields are relevant to describe a property, and other fields
are output/formatting fields.
Split this up. Now, the meta data is tracked in form of an NMMetaAbstractInfo
lists. This separates the information about properties from intermediate steps
during creation of the output.
Note that currently functions like print_ip4_config() still have all the
knowledge about how to generate the output. That is wrong, instead, the
meta data (NMMetaAbstractInfo) should describe how to create the output
and then all those functions could be replaced. This means, later we want
to add more knowledge to the NMMetaAbstractInfo, so it is important to
keep them separate from NmcOutputField.
2017-03-31 19:18:16 +02:00
|
|
|
arr = nmc_dup_fields_array (tmpl, NMC_OF_FLAG_FIELD_NAMES);
|
2017-03-30 14:56:19 +02:00
|
|
|
g_ptr_array_add (out.output_data, arr);
|
2010-03-22 18:43:28 +01:00
|
|
|
|
2010-03-24 19:05:35 +01:00
|
|
|
caps = nm_device_get_capabilities (device);
|
|
|
|
|
speed = 0;
|
|
|
|
|
if (NM_IS_DEVICE_ETHERNET (device)) {
|
|
|
|
|
/* Speed in Mb/s */
|
|
|
|
|
speed = nm_device_ethernet_get_speed (NM_DEVICE_ETHERNET (device));
|
|
|
|
|
} else if (NM_IS_DEVICE_WIFI (device)) {
|
|
|
|
|
/* Speed in b/s */
|
|
|
|
|
speed = nm_device_wifi_get_bitrate (NM_DEVICE_WIFI (device));
|
|
|
|
|
speed /= 1000;
|
|
|
|
|
}
|
2013-05-22 08:37:50 +02:00
|
|
|
speed_str = speed ? g_strdup_printf (_("%u Mb/s"), speed) : g_strdup (_("unknown"));
|
2010-02-25 09:52:30 -08:00
|
|
|
|
cli: split tracking of meta data out of NmcOutputField
When generating output data, nmcli iterates over a list of
property-descriptors (nmc_fields_ip4_config), creates an intermediate
array (output_data) and finally prints it.
However, previously both the meta data (nmc_fields_ip4_config) and
the intermediate format use the same type NmcOutputField. This means,
certain fields are relevant to describe a property, and other fields
are output/formatting fields.
Split this up. Now, the meta data is tracked in form of an NMMetaAbstractInfo
lists. This separates the information about properties from intermediate steps
during creation of the output.
Note that currently functions like print_ip4_config() still have all the
knowledge about how to generate the output. That is wrong, instead, the
meta data (NMMetaAbstractInfo) should describe how to create the output
and then all those functions could be replaced. This means, later we want
to add more knowledge to the NMMetaAbstractInfo, so it is important to
keep them separate from NmcOutputField.
2017-03-31 19:18:16 +02:00
|
|
|
arr = nmc_dup_fields_array (tmpl, NMC_OF_FLAG_SECTION_PREFIX);
|
|
|
|
|
set_val_strc (arr, 0, nmc_fields_dev_show_sections[1]->name); /* "CAPABILITIES" */
|
2013-05-22 08:37:50 +02:00
|
|
|
set_val_strc (arr, 1, (caps & NM_DEVICE_CAP_CARRIER_DETECT) ? _("yes") : _("no"));
|
|
|
|
|
set_val_str (arr, 2, speed_str);
|
2014-07-11 10:33:11 +02:00
|
|
|
set_val_strc (arr, 3, (caps & NM_DEVICE_CAP_IS_SOFTWARE) ? _("yes") : _("no"));
|
2017-04-14 23:16:11 +02:00
|
|
|
set_val_strc (arr, 4, (caps & NM_DEVICE_CAP_SRIOV) ? _("yes") : _("no"));
|
2017-03-30 14:56:19 +02:00
|
|
|
g_ptr_array_add (out.output_data, arr);
|
2010-03-22 18:43:28 +01:00
|
|
|
|
2017-03-30 14:56:19 +02:00
|
|
|
print_data_prepare_width (out.output_data);
|
2017-03-31 13:21:47 +02:00
|
|
|
print_data (&nmc->nmc_config, out_indices, NULL, 0, &out);
|
2010-03-24 19:05:35 +01:00
|
|
|
was_output = TRUE;
|
2010-02-25 09:52:30 -08:00
|
|
|
}
|
|
|
|
|
|
2010-03-24 19:05:35 +01:00
|
|
|
/* Wireless specific information */
|
|
|
|
|
if ((NM_IS_DEVICE_WIFI (device))) {
|
2011-02-21 16:38:02 +01:00
|
|
|
NMDeviceWifiCapabilities wcaps;
|
2010-03-24 19:05:35 +01:00
|
|
|
NMAccessPoint *active_ap = NULL;
|
|
|
|
|
const char *active_bssid = NULL;
|
2015-02-26 11:51:07 +01:00
|
|
|
GPtrArray *aps;
|
2010-02-25 09:52:30 -08:00
|
|
|
|
2010-03-24 19:05:35 +01:00
|
|
|
/* section WIFI-PROPERTIES */
|
cli: split tracking of meta data out of NmcOutputField
When generating output data, nmcli iterates over a list of
property-descriptors (nmc_fields_ip4_config), creates an intermediate
array (output_data) and finally prints it.
However, previously both the meta data (nmc_fields_ip4_config) and
the intermediate format use the same type NmcOutputField. This means,
certain fields are relevant to describe a property, and other fields
are output/formatting fields.
Split this up. Now, the meta data is tracked in form of an NMMetaAbstractInfo
lists. This separates the information about properties from intermediate steps
during creation of the output.
Note that currently functions like print_ip4_config() still have all the
knowledge about how to generate the output. That is wrong, instead, the
meta data (NMMetaAbstractInfo) should describe how to create the output
and then all those functions could be replaced. This means, later we want
to add more knowledge to the NMMetaAbstractInfo, so it is important to
keep them separate from NmcOutputField.
2017-03-31 19:18:16 +02:00
|
|
|
if (!strcasecmp (nmc_fields_dev_show_sections[section_idx]->name, nmc_fields_dev_show_sections[2]->name)) {
|
2017-03-30 14:56:19 +02:00
|
|
|
NMC_OUTPUT_DATA_DEFINE_SCOPED (out);
|
|
|
|
|
|
2010-03-24 19:05:35 +01:00
|
|
|
wcaps = nm_device_wifi_get_capabilities (NM_DEVICE_WIFI (device));
|
2010-02-25 09:52:30 -08:00
|
|
|
|
cli: split tracking of meta data out of NmcOutputField
When generating output data, nmcli iterates over a list of
property-descriptors (nmc_fields_ip4_config), creates an intermediate
array (output_data) and finally prints it.
However, previously both the meta data (nmc_fields_ip4_config) and
the intermediate format use the same type NmcOutputField. This means,
certain fields are relevant to describe a property, and other fields
are output/formatting fields.
Split this up. Now, the meta data is tracked in form of an NMMetaAbstractInfo
lists. This separates the information about properties from intermediate steps
during creation of the output.
Note that currently functions like print_ip4_config() still have all the
knowledge about how to generate the output. That is wrong, instead, the
meta data (NMMetaAbstractInfo) should describe how to create the output
and then all those functions could be replaced. This means, later we want
to add more knowledge to the NMMetaAbstractInfo, so it is important to
keep them separate from NmcOutputField.
2017-03-31 19:18:16 +02:00
|
|
|
tmpl = (const NMMetaAbstractInfo *const*) nmc_fields_dev_show_wifi_prop;
|
|
|
|
|
out_indices = parse_output_fields (section_fld,
|
2017-03-31 12:55:43 +02:00
|
|
|
tmpl, FALSE, NULL, NULL);
|
cli: split tracking of meta data out of NmcOutputField
When generating output data, nmcli iterates over a list of
property-descriptors (nmc_fields_ip4_config), creates an intermediate
array (output_data) and finally prints it.
However, previously both the meta data (nmc_fields_ip4_config) and
the intermediate format use the same type NmcOutputField. This means,
certain fields are relevant to describe a property, and other fields
are output/formatting fields.
Split this up. Now, the meta data is tracked in form of an NMMetaAbstractInfo
lists. This separates the information about properties from intermediate steps
during creation of the output.
Note that currently functions like print_ip4_config() still have all the
knowledge about how to generate the output. That is wrong, instead, the
meta data (NMMetaAbstractInfo) should describe how to create the output
and then all those functions could be replaced. This means, later we want
to add more knowledge to the NMMetaAbstractInfo, so it is important to
keep them separate from NmcOutputField.
2017-03-31 19:18:16 +02:00
|
|
|
arr = nmc_dup_fields_array (tmpl, NMC_OF_FLAG_FIELD_NAMES);
|
2017-03-30 14:56:19 +02:00
|
|
|
g_ptr_array_add (out.output_data, arr);
|
2013-05-22 08:37:50 +02:00
|
|
|
|
cli: split tracking of meta data out of NmcOutputField
When generating output data, nmcli iterates over a list of
property-descriptors (nmc_fields_ip4_config), creates an intermediate
array (output_data) and finally prints it.
However, previously both the meta data (nmc_fields_ip4_config) and
the intermediate format use the same type NmcOutputField. This means,
certain fields are relevant to describe a property, and other fields
are output/formatting fields.
Split this up. Now, the meta data is tracked in form of an NMMetaAbstractInfo
lists. This separates the information about properties from intermediate steps
during creation of the output.
Note that currently functions like print_ip4_config() still have all the
knowledge about how to generate the output. That is wrong, instead, the
meta data (NMMetaAbstractInfo) should describe how to create the output
and then all those functions could be replaced. This means, later we want
to add more knowledge to the NMMetaAbstractInfo, so it is important to
keep them separate from NmcOutputField.
2017-03-31 19:18:16 +02:00
|
|
|
arr = nmc_dup_fields_array (tmpl, NMC_OF_FLAG_SECTION_PREFIX);
|
|
|
|
|
set_val_strc (arr, 0, nmc_fields_dev_show_sections[2]->name); /* "WIFI-PROPERTIES" */
|
2013-05-22 08:37:50 +02:00
|
|
|
set_val_strc (arr, 1, (wcaps & (NM_WIFI_DEVICE_CAP_CIPHER_WEP40 | NM_WIFI_DEVICE_CAP_CIPHER_WEP104)) ?
|
|
|
|
|
_("yes") : _("no"));
|
|
|
|
|
set_val_strc (arr, 2, (wcaps & NM_WIFI_DEVICE_CAP_WPA) ? _("yes") : _("no"));
|
|
|
|
|
set_val_strc (arr, 3, (wcaps & NM_WIFI_DEVICE_CAP_RSN) ? _("yes") : _("no"));
|
|
|
|
|
set_val_strc (arr, 4, (wcaps & NM_WIFI_DEVICE_CAP_CIPHER_TKIP) ? _("yes") : _("no"));
|
|
|
|
|
set_val_strc (arr, 5, (wcaps & NM_WIFI_DEVICE_CAP_CIPHER_CCMP) ? _("yes") : _("no"));
|
|
|
|
|
set_val_strc (arr, 6, (wcaps & NM_WIFI_DEVICE_CAP_AP) ? _("yes") : _("no"));
|
|
|
|
|
set_val_strc (arr, 7, (wcaps & NM_WIFI_DEVICE_CAP_ADHOC) ? _("yes") : _("no"));
|
2015-03-18 21:56:51 +01:00
|
|
|
set_val_strc (arr, 8, !(wcaps & NM_WIFI_DEVICE_CAP_FREQ_VALID) ? _("unknown") :
|
|
|
|
|
((wcaps & NM_WIFI_DEVICE_CAP_FREQ_2GHZ) ? _("yes") : _("no")));
|
|
|
|
|
set_val_strc (arr, 9, !(wcaps & NM_WIFI_DEVICE_CAP_FREQ_VALID) ? _("unknown") :
|
|
|
|
|
((wcaps & NM_WIFI_DEVICE_CAP_FREQ_5GHZ) ? _("yes") : _("no")));
|
2017-03-30 14:56:19 +02:00
|
|
|
g_ptr_array_add (out.output_data, arr);
|
2013-05-22 08:37:50 +02:00
|
|
|
|
2017-03-30 14:56:19 +02:00
|
|
|
print_data_prepare_width (out.output_data);
|
2017-03-31 13:21:47 +02:00
|
|
|
print_data (&nmc->nmc_config, out_indices, NULL, 0, &out);
|
2010-03-24 19:05:35 +01:00
|
|
|
was_output = TRUE;
|
|
|
|
|
}
|
2010-02-25 09:52:30 -08:00
|
|
|
|
2010-03-24 19:05:35 +01:00
|
|
|
/* section AP */
|
cli: split tracking of meta data out of NmcOutputField
When generating output data, nmcli iterates over a list of
property-descriptors (nmc_fields_ip4_config), creates an intermediate
array (output_data) and finally prints it.
However, previously both the meta data (nmc_fields_ip4_config) and
the intermediate format use the same type NmcOutputField. This means,
certain fields are relevant to describe a property, and other fields
are output/formatting fields.
Split this up. Now, the meta data is tracked in form of an NMMetaAbstractInfo
lists. This separates the information about properties from intermediate steps
during creation of the output.
Note that currently functions like print_ip4_config() still have all the
knowledge about how to generate the output. That is wrong, instead, the
meta data (NMMetaAbstractInfo) should describe how to create the output
and then all those functions could be replaced. This means, later we want
to add more knowledge to the NMMetaAbstractInfo, so it is important to
keep them separate from NmcOutputField.
2017-03-31 19:18:16 +02:00
|
|
|
if (!strcasecmp (nmc_fields_dev_show_sections[section_idx]->name, nmc_fields_dev_show_sections[3]->name)) {
|
2017-03-30 14:56:19 +02:00
|
|
|
NMC_OUTPUT_DATA_DEFINE_SCOPED (out);
|
|
|
|
|
|
2010-03-25 13:39:49 -07:00
|
|
|
if (state == NM_DEVICE_STATE_ACTIVATED) {
|
2010-03-24 19:05:35 +01:00
|
|
|
active_ap = nm_device_wifi_get_active_access_point (NM_DEVICE_WIFI (device));
|
2011-09-06 13:37:23 +02:00
|
|
|
active_bssid = active_ap ? nm_access_point_get_bssid (active_ap) : NULL;
|
2010-03-24 19:05:35 +01:00
|
|
|
}
|
2010-03-22 18:43:28 +01:00
|
|
|
|
cli: split tracking of meta data out of NmcOutputField
When generating output data, nmcli iterates over a list of
property-descriptors (nmc_fields_ip4_config), creates an intermediate
array (output_data) and finally prints it.
However, previously both the meta data (nmc_fields_ip4_config) and
the intermediate format use the same type NmcOutputField. This means,
certain fields are relevant to describe a property, and other fields
are output/formatting fields.
Split this up. Now, the meta data is tracked in form of an NMMetaAbstractInfo
lists. This separates the information about properties from intermediate steps
during creation of the output.
Note that currently functions like print_ip4_config() still have all the
knowledge about how to generate the output. That is wrong, instead, the
meta data (NMMetaAbstractInfo) should describe how to create the output
and then all those functions could be replaced. This means, later we want
to add more knowledge to the NMMetaAbstractInfo, so it is important to
keep them separate from NmcOutputField.
2017-03-31 19:18:16 +02:00
|
|
|
tmpl = (const NMMetaAbstractInfo *const*) nmc_fields_dev_wifi_list;
|
2017-03-31 13:21:47 +02:00
|
|
|
out_indices = parse_output_fields (section_fld ? section_fld : NMC_FIELDS_DEV_WIFI_LIST_FOR_DEV_LIST,
|
2017-03-31 12:55:43 +02:00
|
|
|
tmpl, FALSE, NULL, NULL);
|
cli: split tracking of meta data out of NmcOutputField
When generating output data, nmcli iterates over a list of
property-descriptors (nmc_fields_ip4_config), creates an intermediate
array (output_data) and finally prints it.
However, previously both the meta data (nmc_fields_ip4_config) and
the intermediate format use the same type NmcOutputField. This means,
certain fields are relevant to describe a property, and other fields
are output/formatting fields.
Split this up. Now, the meta data is tracked in form of an NMMetaAbstractInfo
lists. This separates the information about properties from intermediate steps
during creation of the output.
Note that currently functions like print_ip4_config() still have all the
knowledge about how to generate the output. That is wrong, instead, the
meta data (NMMetaAbstractInfo) should describe how to create the output
and then all those functions could be replaced. This means, later we want
to add more knowledge to the NMMetaAbstractInfo, so it is important to
keep them separate from NmcOutputField.
2017-03-31 19:18:16 +02:00
|
|
|
arr = nmc_dup_fields_array (tmpl, NMC_OF_FLAG_FIELD_NAMES);
|
2017-03-30 14:56:19 +02:00
|
|
|
g_ptr_array_add (out.output_data, arr);
|
|
|
|
|
|
|
|
|
|
{
|
|
|
|
|
APInfo info = {
|
|
|
|
|
.nmc = nmc,
|
|
|
|
|
.index = 1,
|
|
|
|
|
.output_flags = NMC_OF_FLAG_SECTION_PREFIX,
|
|
|
|
|
.active_bssid = active_bssid,
|
|
|
|
|
.device = nm_device_get_iface (device),
|
|
|
|
|
.output_data = out.output_data,
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
aps = sort_access_points (nm_device_wifi_get_access_points (NM_DEVICE_WIFI (device)));
|
|
|
|
|
g_ptr_array_foreach (aps, fill_output_access_point, &info);
|
|
|
|
|
g_ptr_array_free (aps, FALSE);
|
|
|
|
|
}
|
2010-02-25 09:52:30 -08:00
|
|
|
|
2017-03-30 14:56:19 +02:00
|
|
|
print_data_prepare_width (out.output_data);
|
2017-03-31 13:21:47 +02:00
|
|
|
print_data (&nmc->nmc_config, out_indices, NULL, 0, &out);
|
2010-03-24 19:05:35 +01:00
|
|
|
was_output = TRUE;
|
|
|
|
|
}
|
|
|
|
|
} else if (NM_IS_DEVICE_ETHERNET (device)) {
|
|
|
|
|
/* WIRED-PROPERTIES */
|
cli: split tracking of meta data out of NmcOutputField
When generating output data, nmcli iterates over a list of
property-descriptors (nmc_fields_ip4_config), creates an intermediate
array (output_data) and finally prints it.
However, previously both the meta data (nmc_fields_ip4_config) and
the intermediate format use the same type NmcOutputField. This means,
certain fields are relevant to describe a property, and other fields
are output/formatting fields.
Split this up. Now, the meta data is tracked in form of an NMMetaAbstractInfo
lists. This separates the information about properties from intermediate steps
during creation of the output.
Note that currently functions like print_ip4_config() still have all the
knowledge about how to generate the output. That is wrong, instead, the
meta data (NMMetaAbstractInfo) should describe how to create the output
and then all those functions could be replaced. This means, later we want
to add more knowledge to the NMMetaAbstractInfo, so it is important to
keep them separate from NmcOutputField.
2017-03-31 19:18:16 +02:00
|
|
|
if (!strcasecmp (nmc_fields_dev_show_sections[section_idx]->name, nmc_fields_dev_show_sections[4]->name)) {
|
2017-03-30 14:56:19 +02:00
|
|
|
NMC_OUTPUT_DATA_DEFINE_SCOPED (out);
|
|
|
|
|
|
cli: split tracking of meta data out of NmcOutputField
When generating output data, nmcli iterates over a list of
property-descriptors (nmc_fields_ip4_config), creates an intermediate
array (output_data) and finally prints it.
However, previously both the meta data (nmc_fields_ip4_config) and
the intermediate format use the same type NmcOutputField. This means,
certain fields are relevant to describe a property, and other fields
are output/formatting fields.
Split this up. Now, the meta data is tracked in form of an NMMetaAbstractInfo
lists. This separates the information about properties from intermediate steps
during creation of the output.
Note that currently functions like print_ip4_config() still have all the
knowledge about how to generate the output. That is wrong, instead, the
meta data (NMMetaAbstractInfo) should describe how to create the output
and then all those functions could be replaced. This means, later we want
to add more knowledge to the NMMetaAbstractInfo, so it is important to
keep them separate from NmcOutputField.
2017-03-31 19:18:16 +02:00
|
|
|
tmpl = (const NMMetaAbstractInfo *const*) nmc_fields_dev_show_wired_prop;
|
|
|
|
|
out_indices = parse_output_fields (section_fld,
|
2017-03-31 12:55:43 +02:00
|
|
|
tmpl, FALSE, NULL, NULL);
|
cli: split tracking of meta data out of NmcOutputField
When generating output data, nmcli iterates over a list of
property-descriptors (nmc_fields_ip4_config), creates an intermediate
array (output_data) and finally prints it.
However, previously both the meta data (nmc_fields_ip4_config) and
the intermediate format use the same type NmcOutputField. This means,
certain fields are relevant to describe a property, and other fields
are output/formatting fields.
Split this up. Now, the meta data is tracked in form of an NMMetaAbstractInfo
lists. This separates the information about properties from intermediate steps
during creation of the output.
Note that currently functions like print_ip4_config() still have all the
knowledge about how to generate the output. That is wrong, instead, the
meta data (NMMetaAbstractInfo) should describe how to create the output
and then all those functions could be replaced. This means, later we want
to add more knowledge to the NMMetaAbstractInfo, so it is important to
keep them separate from NmcOutputField.
2017-03-31 19:18:16 +02:00
|
|
|
arr = nmc_dup_fields_array (tmpl, NMC_OF_FLAG_FIELD_NAMES);
|
2017-03-30 14:56:19 +02:00
|
|
|
g_ptr_array_add (out.output_data, arr);
|
2013-05-22 08:37:50 +02:00
|
|
|
|
cli: split tracking of meta data out of NmcOutputField
When generating output data, nmcli iterates over a list of
property-descriptors (nmc_fields_ip4_config), creates an intermediate
array (output_data) and finally prints it.
However, previously both the meta data (nmc_fields_ip4_config) and
the intermediate format use the same type NmcOutputField. This means,
certain fields are relevant to describe a property, and other fields
are output/formatting fields.
Split this up. Now, the meta data is tracked in form of an NMMetaAbstractInfo
lists. This separates the information about properties from intermediate steps
during creation of the output.
Note that currently functions like print_ip4_config() still have all the
knowledge about how to generate the output. That is wrong, instead, the
meta data (NMMetaAbstractInfo) should describe how to create the output
and then all those functions could be replaced. This means, later we want
to add more knowledge to the NMMetaAbstractInfo, so it is important to
keep them separate from NmcOutputField.
2017-03-31 19:18:16 +02:00
|
|
|
arr = nmc_dup_fields_array (tmpl, NMC_OF_FLAG_SECTION_PREFIX);
|
|
|
|
|
set_val_strc (arr, 0, nmc_fields_dev_show_sections[4]->name); /* "WIRED-PROPERTIES" */
|
2013-05-22 08:37:50 +02:00
|
|
|
set_val_strc (arr, 1, (nm_device_ethernet_get_carrier (NM_DEVICE_ETHERNET (device))) ?
|
|
|
|
|
_("on") : _("off"));
|
2015-09-23 16:07:08 +02:00
|
|
|
set_val_arrc (arr, 2, ((const char **) nm_device_ethernet_get_s390_subchannels (NM_DEVICE_ETHERNET (device))));
|
2017-03-30 14:56:19 +02:00
|
|
|
g_ptr_array_add (out.output_data, arr);
|
2013-05-22 08:37:50 +02:00
|
|
|
|
2017-03-30 14:56:19 +02:00
|
|
|
print_data_prepare_width (out.output_data);
|
2017-03-31 13:21:47 +02:00
|
|
|
print_data (&nmc->nmc_config, out_indices, NULL, 0, &out);
|
2010-03-24 19:05:35 +01:00
|
|
|
was_output = TRUE;
|
|
|
|
|
}
|
2011-02-14 16:06:37 +01:00
|
|
|
}
|
2010-02-25 09:52:30 -08:00
|
|
|
|
2012-01-03 16:37:53 +01:00
|
|
|
/* IP configuration info */
|
2013-04-04 10:20:24 -04:00
|
|
|
cfg4 = nm_device_get_ip4_config (device);
|
|
|
|
|
cfg6 = nm_device_get_ip6_config (device);
|
|
|
|
|
dhcp4 = nm_device_get_dhcp4_config (device);
|
|
|
|
|
dhcp6 = nm_device_get_dhcp6_config (device);
|
|
|
|
|
|
|
|
|
|
/* IP4 */
|
cli: split tracking of meta data out of NmcOutputField
When generating output data, nmcli iterates over a list of
property-descriptors (nmc_fields_ip4_config), creates an intermediate
array (output_data) and finally prints it.
However, previously both the meta data (nmc_fields_ip4_config) and
the intermediate format use the same type NmcOutputField. This means,
certain fields are relevant to describe a property, and other fields
are output/formatting fields.
Split this up. Now, the meta data is tracked in form of an NMMetaAbstractInfo
lists. This separates the information about properties from intermediate steps
during creation of the output.
Note that currently functions like print_ip4_config() still have all the
knowledge about how to generate the output. That is wrong, instead, the
meta data (NMMetaAbstractInfo) should describe how to create the output
and then all those functions could be replaced. This means, later we want
to add more knowledge to the NMMetaAbstractInfo, so it is important to
keep them separate from NmcOutputField.
2017-03-31 19:18:16 +02:00
|
|
|
if (cfg4 && !strcasecmp (nmc_fields_dev_show_sections[section_idx]->name, nmc_fields_dev_show_sections[7]->name))
|
2017-04-06 15:14:23 +02:00
|
|
|
was_output = print_ip4_config (cfg4, &nmc->nmc_config, section_fld);
|
2013-04-04 10:20:24 -04:00
|
|
|
|
|
|
|
|
/* DHCP4 */
|
cli: split tracking of meta data out of NmcOutputField
When generating output data, nmcli iterates over a list of
property-descriptors (nmc_fields_ip4_config), creates an intermediate
array (output_data) and finally prints it.
However, previously both the meta data (nmc_fields_ip4_config) and
the intermediate format use the same type NmcOutputField. This means,
certain fields are relevant to describe a property, and other fields
are output/formatting fields.
Split this up. Now, the meta data is tracked in form of an NMMetaAbstractInfo
lists. This separates the information about properties from intermediate steps
during creation of the output.
Note that currently functions like print_ip4_config() still have all the
knowledge about how to generate the output. That is wrong, instead, the
meta data (NMMetaAbstractInfo) should describe how to create the output
and then all those functions could be replaced. This means, later we want
to add more knowledge to the NMMetaAbstractInfo, so it is important to
keep them separate from NmcOutputField.
2017-03-31 19:18:16 +02:00
|
|
|
if (dhcp4 && !strcasecmp (nmc_fields_dev_show_sections[section_idx]->name, nmc_fields_dev_show_sections[8]->name))
|
|
|
|
|
was_output = print_dhcp4_config (dhcp4, &nmc->nmc_config, nmc_fields_dev_show_sections[8]->name, section_fld);
|
2013-04-04 10:20:24 -04:00
|
|
|
|
|
|
|
|
/* IP6 */
|
cli: split tracking of meta data out of NmcOutputField
When generating output data, nmcli iterates over a list of
property-descriptors (nmc_fields_ip4_config), creates an intermediate
array (output_data) and finally prints it.
However, previously both the meta data (nmc_fields_ip4_config) and
the intermediate format use the same type NmcOutputField. This means,
certain fields are relevant to describe a property, and other fields
are output/formatting fields.
Split this up. Now, the meta data is tracked in form of an NMMetaAbstractInfo
lists. This separates the information about properties from intermediate steps
during creation of the output.
Note that currently functions like print_ip4_config() still have all the
knowledge about how to generate the output. That is wrong, instead, the
meta data (NMMetaAbstractInfo) should describe how to create the output
and then all those functions could be replaced. This means, later we want
to add more knowledge to the NMMetaAbstractInfo, so it is important to
keep them separate from NmcOutputField.
2017-03-31 19:18:16 +02:00
|
|
|
if (cfg6 && !strcasecmp (nmc_fields_dev_show_sections[section_idx]->name, nmc_fields_dev_show_sections[9]->name))
|
|
|
|
|
was_output = print_ip6_config (cfg6, &nmc->nmc_config, nmc_fields_dev_show_sections[9]->name, section_fld);
|
2013-04-04 10:20:24 -04:00
|
|
|
|
|
|
|
|
/* DHCP6 */
|
cli: split tracking of meta data out of NmcOutputField
When generating output data, nmcli iterates over a list of
property-descriptors (nmc_fields_ip4_config), creates an intermediate
array (output_data) and finally prints it.
However, previously both the meta data (nmc_fields_ip4_config) and
the intermediate format use the same type NmcOutputField. This means,
certain fields are relevant to describe a property, and other fields
are output/formatting fields.
Split this up. Now, the meta data is tracked in form of an NMMetaAbstractInfo
lists. This separates the information about properties from intermediate steps
during creation of the output.
Note that currently functions like print_ip4_config() still have all the
knowledge about how to generate the output. That is wrong, instead, the
meta data (NMMetaAbstractInfo) should describe how to create the output
and then all those functions could be replaced. This means, later we want
to add more knowledge to the NMMetaAbstractInfo, so it is important to
keep them separate from NmcOutputField.
2017-03-31 19:18:16 +02:00
|
|
|
if (dhcp6 && !strcasecmp (nmc_fields_dev_show_sections[section_idx]->name, nmc_fields_dev_show_sections[10]->name))
|
|
|
|
|
was_output = print_dhcp6_config (dhcp6, &nmc->nmc_config, nmc_fields_dev_show_sections[10]->name, section_fld);
|
2012-10-22 14:31:11 +02:00
|
|
|
|
2014-09-23 14:49:43 +02:00
|
|
|
/* Bond specific information */
|
|
|
|
|
if (NM_IS_DEVICE_BOND (device)) {
|
cli: split tracking of meta data out of NmcOutputField
When generating output data, nmcli iterates over a list of
property-descriptors (nmc_fields_ip4_config), creates an intermediate
array (output_data) and finally prints it.
However, previously both the meta data (nmc_fields_ip4_config) and
the intermediate format use the same type NmcOutputField. This means,
certain fields are relevant to describe a property, and other fields
are output/formatting fields.
Split this up. Now, the meta data is tracked in form of an NMMetaAbstractInfo
lists. This separates the information about properties from intermediate steps
during creation of the output.
Note that currently functions like print_ip4_config() still have all the
knowledge about how to generate the output. That is wrong, instead, the
meta data (NMMetaAbstractInfo) should describe how to create the output
and then all those functions could be replaced. This means, later we want
to add more knowledge to the NMMetaAbstractInfo, so it is important to
keep them separate from NmcOutputField.
2017-03-31 19:18:16 +02:00
|
|
|
if (!strcasecmp (nmc_fields_dev_show_sections[section_idx]->name, nmc_fields_dev_show_sections[11]->name))
|
|
|
|
|
was_output = print_bond_bridge_info (device, nmc, nmc_fields_dev_show_sections[11]->name, section_fld);
|
2014-09-23 14:49:43 +02:00
|
|
|
}
|
2012-10-22 14:31:11 +02:00
|
|
|
|
2014-09-23 14:49:43 +02:00
|
|
|
/* Team specific information */
|
|
|
|
|
if (NM_IS_DEVICE_TEAM (device)) {
|
cli: split tracking of meta data out of NmcOutputField
When generating output data, nmcli iterates over a list of
property-descriptors (nmc_fields_ip4_config), creates an intermediate
array (output_data) and finally prints it.
However, previously both the meta data (nmc_fields_ip4_config) and
the intermediate format use the same type NmcOutputField. This means,
certain fields are relevant to describe a property, and other fields
are output/formatting fields.
Split this up. Now, the meta data is tracked in form of an NMMetaAbstractInfo
lists. This separates the information about properties from intermediate steps
during creation of the output.
Note that currently functions like print_ip4_config() still have all the
knowledge about how to generate the output. That is wrong, instead, the
meta data (NMMetaAbstractInfo) should describe how to create the output
and then all those functions could be replaced. This means, later we want
to add more knowledge to the NMMetaAbstractInfo, so it is important to
keep them separate from NmcOutputField.
2017-03-31 19:18:16 +02:00
|
|
|
if (!strcasecmp (nmc_fields_dev_show_sections[section_idx]->name, nmc_fields_dev_show_sections[12]->name))
|
|
|
|
|
was_output = print_team_info (device, nmc, nmc_fields_dev_show_sections[12]->name, section_fld);
|
2014-09-23 14:49:43 +02:00
|
|
|
}
|
2012-10-22 14:31:11 +02:00
|
|
|
|
2014-09-23 14:49:43 +02:00
|
|
|
/* Bridge specific information */
|
|
|
|
|
if (NM_IS_DEVICE_BRIDGE (device)) {
|
cli: split tracking of meta data out of NmcOutputField
When generating output data, nmcli iterates over a list of
property-descriptors (nmc_fields_ip4_config), creates an intermediate
array (output_data) and finally prints it.
However, previously both the meta data (nmc_fields_ip4_config) and
the intermediate format use the same type NmcOutputField. This means,
certain fields are relevant to describe a property, and other fields
are output/formatting fields.
Split this up. Now, the meta data is tracked in form of an NMMetaAbstractInfo
lists. This separates the information about properties from intermediate steps
during creation of the output.
Note that currently functions like print_ip4_config() still have all the
knowledge about how to generate the output. That is wrong, instead, the
meta data (NMMetaAbstractInfo) should describe how to create the output
and then all those functions could be replaced. This means, later we want
to add more knowledge to the NMMetaAbstractInfo, so it is important to
keep them separate from NmcOutputField.
2017-03-31 19:18:16 +02:00
|
|
|
if (!strcasecmp (nmc_fields_dev_show_sections[section_idx]->name, nmc_fields_dev_show_sections[13]->name))
|
|
|
|
|
was_output = print_bond_bridge_info (device, nmc, nmc_fields_dev_show_sections[13]->name, section_fld);
|
2012-10-22 14:31:11 +02:00
|
|
|
}
|
|
|
|
|
|
2012-10-22 15:18:34 +02:00
|
|
|
/* VLAN-specific information */
|
|
|
|
|
if ((NM_IS_DEVICE_VLAN (device))) {
|
cli: split tracking of meta data out of NmcOutputField
When generating output data, nmcli iterates over a list of
property-descriptors (nmc_fields_ip4_config), creates an intermediate
array (output_data) and finally prints it.
However, previously both the meta data (nmc_fields_ip4_config) and
the intermediate format use the same type NmcOutputField. This means,
certain fields are relevant to describe a property, and other fields
are output/formatting fields.
Split this up. Now, the meta data is tracked in form of an NMMetaAbstractInfo
lists. This separates the information about properties from intermediate steps
during creation of the output.
Note that currently functions like print_ip4_config() still have all the
knowledge about how to generate the output. That is wrong, instead, the
meta data (NMMetaAbstractInfo) should describe how to create the output
and then all those functions could be replaced. This means, later we want
to add more knowledge to the NMMetaAbstractInfo, so it is important to
keep them separate from NmcOutputField.
2017-03-31 19:18:16 +02:00
|
|
|
if (!strcasecmp (nmc_fields_dev_show_sections[section_idx]->name, nmc_fields_dev_show_sections[14]->name)) {
|
2012-10-22 15:18:34 +02:00
|
|
|
char * vlan_id_str = g_strdup_printf ("%u", nm_device_vlan_get_vlan_id (NM_DEVICE_VLAN (device)));
|
2014-07-21 13:08:53 +02:00
|
|
|
NMDevice *parent = nm_device_vlan_get_parent (NM_DEVICE_VLAN (device));
|
2017-03-30 14:56:19 +02:00
|
|
|
NMC_OUTPUT_DATA_DEFINE_SCOPED (out);
|
2012-10-22 15:18:34 +02:00
|
|
|
|
cli: split tracking of meta data out of NmcOutputField
When generating output data, nmcli iterates over a list of
property-descriptors (nmc_fields_ip4_config), creates an intermediate
array (output_data) and finally prints it.
However, previously both the meta data (nmc_fields_ip4_config) and
the intermediate format use the same type NmcOutputField. This means,
certain fields are relevant to describe a property, and other fields
are output/formatting fields.
Split this up. Now, the meta data is tracked in form of an NMMetaAbstractInfo
lists. This separates the information about properties from intermediate steps
during creation of the output.
Note that currently functions like print_ip4_config() still have all the
knowledge about how to generate the output. That is wrong, instead, the
meta data (NMMetaAbstractInfo) should describe how to create the output
and then all those functions could be replaced. This means, later we want
to add more knowledge to the NMMetaAbstractInfo, so it is important to
keep them separate from NmcOutputField.
2017-03-31 19:18:16 +02:00
|
|
|
tmpl = (const NMMetaAbstractInfo *const*) nmc_fields_dev_show_vlan_prop;
|
|
|
|
|
out_indices = parse_output_fields (section_fld,
|
2017-03-31 12:55:43 +02:00
|
|
|
tmpl, FALSE, NULL, NULL);
|
cli: split tracking of meta data out of NmcOutputField
When generating output data, nmcli iterates over a list of
property-descriptors (nmc_fields_ip4_config), creates an intermediate
array (output_data) and finally prints it.
However, previously both the meta data (nmc_fields_ip4_config) and
the intermediate format use the same type NmcOutputField. This means,
certain fields are relevant to describe a property, and other fields
are output/formatting fields.
Split this up. Now, the meta data is tracked in form of an NMMetaAbstractInfo
lists. This separates the information about properties from intermediate steps
during creation of the output.
Note that currently functions like print_ip4_config() still have all the
knowledge about how to generate the output. That is wrong, instead, the
meta data (NMMetaAbstractInfo) should describe how to create the output
and then all those functions could be replaced. This means, later we want
to add more knowledge to the NMMetaAbstractInfo, so it is important to
keep them separate from NmcOutputField.
2017-03-31 19:18:16 +02:00
|
|
|
arr = nmc_dup_fields_array (tmpl, NMC_OF_FLAG_FIELD_NAMES);
|
2017-03-30 14:56:19 +02:00
|
|
|
g_ptr_array_add (out.output_data, arr);
|
2012-10-22 15:18:34 +02:00
|
|
|
|
cli: split tracking of meta data out of NmcOutputField
When generating output data, nmcli iterates over a list of
property-descriptors (nmc_fields_ip4_config), creates an intermediate
array (output_data) and finally prints it.
However, previously both the meta data (nmc_fields_ip4_config) and
the intermediate format use the same type NmcOutputField. This means,
certain fields are relevant to describe a property, and other fields
are output/formatting fields.
Split this up. Now, the meta data is tracked in form of an NMMetaAbstractInfo
lists. This separates the information about properties from intermediate steps
during creation of the output.
Note that currently functions like print_ip4_config() still have all the
knowledge about how to generate the output. That is wrong, instead, the
meta data (NMMetaAbstractInfo) should describe how to create the output
and then all those functions could be replaced. This means, later we want
to add more knowledge to the NMMetaAbstractInfo, so it is important to
keep them separate from NmcOutputField.
2017-03-31 19:18:16 +02:00
|
|
|
arr = nmc_dup_fields_array (tmpl, NMC_OF_FLAG_SECTION_PREFIX);
|
|
|
|
|
set_val_strc (arr, 0, nmc_fields_dev_show_sections[14]->name); /* "VLAN" */
|
2014-07-21 13:08:53 +02:00
|
|
|
set_val_strc (arr, 1, parent ? nm_device_get_iface (parent) : NULL);
|
|
|
|
|
set_val_str (arr, 2, vlan_id_str);
|
2017-03-30 14:56:19 +02:00
|
|
|
g_ptr_array_add (out.output_data, arr);
|
2012-10-22 15:18:34 +02:00
|
|
|
|
2017-03-30 14:56:19 +02:00
|
|
|
print_data_prepare_width (out.output_data);
|
2017-03-31 13:21:47 +02:00
|
|
|
print_data (&nmc->nmc_config, out_indices, NULL, 0, &out);
|
2012-10-22 15:18:34 +02:00
|
|
|
|
|
|
|
|
was_output = TRUE;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2014-09-24 12:00:47 +02:00
|
|
|
if (NM_IS_DEVICE_BT (device)) {
|
cli: split tracking of meta data out of NmcOutputField
When generating output data, nmcli iterates over a list of
property-descriptors (nmc_fields_ip4_config), creates an intermediate
array (output_data) and finally prints it.
However, previously both the meta data (nmc_fields_ip4_config) and
the intermediate format use the same type NmcOutputField. This means,
certain fields are relevant to describe a property, and other fields
are output/formatting fields.
Split this up. Now, the meta data is tracked in form of an NMMetaAbstractInfo
lists. This separates the information about properties from intermediate steps
during creation of the output.
Note that currently functions like print_ip4_config() still have all the
knowledge about how to generate the output. That is wrong, instead, the
meta data (NMMetaAbstractInfo) should describe how to create the output
and then all those functions could be replaced. This means, later we want
to add more knowledge to the NMMetaAbstractInfo, so it is important to
keep them separate from NmcOutputField.
2017-03-31 19:18:16 +02:00
|
|
|
if (!strcasecmp (nmc_fields_dev_show_sections[section_idx]->name, nmc_fields_dev_show_sections[15]->name)) {
|
2017-03-30 14:56:19 +02:00
|
|
|
NMC_OUTPUT_DATA_DEFINE_SCOPED (out);
|
|
|
|
|
|
cli: split tracking of meta data out of NmcOutputField
When generating output data, nmcli iterates over a list of
property-descriptors (nmc_fields_ip4_config), creates an intermediate
array (output_data) and finally prints it.
However, previously both the meta data (nmc_fields_ip4_config) and
the intermediate format use the same type NmcOutputField. This means,
certain fields are relevant to describe a property, and other fields
are output/formatting fields.
Split this up. Now, the meta data is tracked in form of an NMMetaAbstractInfo
lists. This separates the information about properties from intermediate steps
during creation of the output.
Note that currently functions like print_ip4_config() still have all the
knowledge about how to generate the output. That is wrong, instead, the
meta data (NMMetaAbstractInfo) should describe how to create the output
and then all those functions could be replaced. This means, later we want
to add more knowledge to the NMMetaAbstractInfo, so it is important to
keep them separate from NmcOutputField.
2017-03-31 19:18:16 +02:00
|
|
|
tmpl = (const NMMetaAbstractInfo *const*) nmc_fields_dev_show_bluetooth;
|
|
|
|
|
out_indices = parse_output_fields (section_fld,
|
2017-03-31 12:55:43 +02:00
|
|
|
tmpl, FALSE, NULL, NULL);
|
cli: split tracking of meta data out of NmcOutputField
When generating output data, nmcli iterates over a list of
property-descriptors (nmc_fields_ip4_config), creates an intermediate
array (output_data) and finally prints it.
However, previously both the meta data (nmc_fields_ip4_config) and
the intermediate format use the same type NmcOutputField. This means,
certain fields are relevant to describe a property, and other fields
are output/formatting fields.
Split this up. Now, the meta data is tracked in form of an NMMetaAbstractInfo
lists. This separates the information about properties from intermediate steps
during creation of the output.
Note that currently functions like print_ip4_config() still have all the
knowledge about how to generate the output. That is wrong, instead, the
meta data (NMMetaAbstractInfo) should describe how to create the output
and then all those functions could be replaced. This means, later we want
to add more knowledge to the NMMetaAbstractInfo, so it is important to
keep them separate from NmcOutputField.
2017-03-31 19:18:16 +02:00
|
|
|
arr = nmc_dup_fields_array (tmpl, NMC_OF_FLAG_FIELD_NAMES);
|
2017-03-30 14:56:19 +02:00
|
|
|
g_ptr_array_add (out.output_data, arr);
|
2014-09-24 12:00:47 +02:00
|
|
|
|
cli: split tracking of meta data out of NmcOutputField
When generating output data, nmcli iterates over a list of
property-descriptors (nmc_fields_ip4_config), creates an intermediate
array (output_data) and finally prints it.
However, previously both the meta data (nmc_fields_ip4_config) and
the intermediate format use the same type NmcOutputField. This means,
certain fields are relevant to describe a property, and other fields
are output/formatting fields.
Split this up. Now, the meta data is tracked in form of an NMMetaAbstractInfo
lists. This separates the information about properties from intermediate steps
during creation of the output.
Note that currently functions like print_ip4_config() still have all the
knowledge about how to generate the output. That is wrong, instead, the
meta data (NMMetaAbstractInfo) should describe how to create the output
and then all those functions could be replaced. This means, later we want
to add more knowledge to the NMMetaAbstractInfo, so it is important to
keep them separate from NmcOutputField.
2017-03-31 19:18:16 +02:00
|
|
|
arr = nmc_dup_fields_array (tmpl, NMC_OF_FLAG_SECTION_PREFIX);
|
|
|
|
|
set_val_strc (arr, 0, nmc_fields_dev_show_sections[15]->name); /* "BLUETOOTH" */
|
2014-09-24 12:00:47 +02:00
|
|
|
set_val_str (arr, 1, bluetooth_caps_to_string (nm_device_bt_get_capabilities (NM_DEVICE_BT (device))));
|
2017-03-30 14:56:19 +02:00
|
|
|
g_ptr_array_add (out.output_data, arr);
|
2014-09-24 12:00:47 +02:00
|
|
|
|
2017-03-30 14:56:19 +02:00
|
|
|
print_data_prepare_width (out.output_data);
|
2017-03-31 13:21:47 +02:00
|
|
|
print_data (&nmc->nmc_config, out_indices, NULL, 0, &out);
|
2014-09-24 12:00:47 +02:00
|
|
|
was_output = TRUE;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2012-08-31 12:48:27 +02:00
|
|
|
/* section CONNECTIONS */
|
cli: split tracking of meta data out of NmcOutputField
When generating output data, nmcli iterates over a list of
property-descriptors (nmc_fields_ip4_config), creates an intermediate
array (output_data) and finally prints it.
However, previously both the meta data (nmc_fields_ip4_config) and
the intermediate format use the same type NmcOutputField. This means,
certain fields are relevant to describe a property, and other fields
are output/formatting fields.
Split this up. Now, the meta data is tracked in form of an NMMetaAbstractInfo
lists. This separates the information about properties from intermediate steps
during creation of the output.
Note that currently functions like print_ip4_config() still have all the
knowledge about how to generate the output. That is wrong, instead, the
meta data (NMMetaAbstractInfo) should describe how to create the output
and then all those functions could be replaced. This means, later we want
to add more knowledge to the NMMetaAbstractInfo, so it is important to
keep them separate from NmcOutputField.
2017-03-31 19:18:16 +02:00
|
|
|
if (!strcasecmp (nmc_fields_dev_show_sections[section_idx]->name, nmc_fields_dev_show_sections[16]->name)) {
|
2012-08-31 12:48:27 +02:00
|
|
|
const GPtrArray *avail_cons;
|
|
|
|
|
GString *ac_paths_str;
|
|
|
|
|
char **ac_arr = NULL;
|
|
|
|
|
int i;
|
2017-03-30 14:56:19 +02:00
|
|
|
NMC_OUTPUT_DATA_DEFINE_SCOPED (out);
|
2012-08-31 12:48:27 +02:00
|
|
|
|
cli: split tracking of meta data out of NmcOutputField
When generating output data, nmcli iterates over a list of
property-descriptors (nmc_fields_ip4_config), creates an intermediate
array (output_data) and finally prints it.
However, previously both the meta data (nmc_fields_ip4_config) and
the intermediate format use the same type NmcOutputField. This means,
certain fields are relevant to describe a property, and other fields
are output/formatting fields.
Split this up. Now, the meta data is tracked in form of an NMMetaAbstractInfo
lists. This separates the information about properties from intermediate steps
during creation of the output.
Note that currently functions like print_ip4_config() still have all the
knowledge about how to generate the output. That is wrong, instead, the
meta data (NMMetaAbstractInfo) should describe how to create the output
and then all those functions could be replaced. This means, later we want
to add more knowledge to the NMMetaAbstractInfo, so it is important to
keep them separate from NmcOutputField.
2017-03-31 19:18:16 +02:00
|
|
|
tmpl = (const NMMetaAbstractInfo *const*) nmc_fields_dev_show_connections;
|
|
|
|
|
out_indices = parse_output_fields (section_fld,
|
2017-03-31 12:55:43 +02:00
|
|
|
tmpl, FALSE, NULL, NULL);
|
cli: split tracking of meta data out of NmcOutputField
When generating output data, nmcli iterates over a list of
property-descriptors (nmc_fields_ip4_config), creates an intermediate
array (output_data) and finally prints it.
However, previously both the meta data (nmc_fields_ip4_config) and
the intermediate format use the same type NmcOutputField. This means,
certain fields are relevant to describe a property, and other fields
are output/formatting fields.
Split this up. Now, the meta data is tracked in form of an NMMetaAbstractInfo
lists. This separates the information about properties from intermediate steps
during creation of the output.
Note that currently functions like print_ip4_config() still have all the
knowledge about how to generate the output. That is wrong, instead, the
meta data (NMMetaAbstractInfo) should describe how to create the output
and then all those functions could be replaced. This means, later we want
to add more knowledge to the NMMetaAbstractInfo, so it is important to
keep them separate from NmcOutputField.
2017-03-31 19:18:16 +02:00
|
|
|
arr = nmc_dup_fields_array (tmpl, NMC_OF_FLAG_FIELD_NAMES);
|
2017-03-30 14:56:19 +02:00
|
|
|
g_ptr_array_add (out.output_data, arr);
|
2012-08-31 12:48:27 +02:00
|
|
|
|
|
|
|
|
/* available-connections */
|
|
|
|
|
avail_cons = nm_device_get_available_connections (device);
|
|
|
|
|
ac_paths_str = g_string_new (NULL);
|
2014-08-25 10:33:53 -04:00
|
|
|
if (avail_cons->len) {
|
2012-08-31 12:48:27 +02:00
|
|
|
ac_arr = g_new (char *, avail_cons->len + 1);
|
|
|
|
|
ac_arr[avail_cons->len] = NULL;
|
|
|
|
|
}
|
2014-08-25 10:33:53 -04:00
|
|
|
for (i = 0; i < avail_cons->len; i++) {
|
2012-08-31 12:48:27 +02:00
|
|
|
NMRemoteConnection *avail_con = g_ptr_array_index (avail_cons, i);
|
|
|
|
|
const char *ac_path = nm_connection_get_path (NM_CONNECTION (avail_con));
|
|
|
|
|
const char *ac_id = nm_connection_get_id (NM_CONNECTION (avail_con));
|
|
|
|
|
const char *ac_uuid = nm_connection_get_uuid (NM_CONNECTION (avail_con));
|
|
|
|
|
|
|
|
|
|
ac_arr[i] = g_strdup_printf ("%s | %s", ac_uuid, ac_id);
|
|
|
|
|
|
|
|
|
|
if (i == 0)
|
|
|
|
|
g_string_printf (ac_paths_str, "%s/{", NM_DBUS_PATH_SETTINGS);
|
|
|
|
|
else
|
|
|
|
|
g_string_append_c (ac_paths_str, ',');
|
|
|
|
|
g_string_append (ac_paths_str, strrchr (ac_path, '/') + 1);
|
|
|
|
|
}
|
|
|
|
|
if (ac_paths_str->len > 0)
|
|
|
|
|
g_string_append_c (ac_paths_str, '}');
|
|
|
|
|
|
cli: split tracking of meta data out of NmcOutputField
When generating output data, nmcli iterates over a list of
property-descriptors (nmc_fields_ip4_config), creates an intermediate
array (output_data) and finally prints it.
However, previously both the meta data (nmc_fields_ip4_config) and
the intermediate format use the same type NmcOutputField. This means,
certain fields are relevant to describe a property, and other fields
are output/formatting fields.
Split this up. Now, the meta data is tracked in form of an NMMetaAbstractInfo
lists. This separates the information about properties from intermediate steps
during creation of the output.
Note that currently functions like print_ip4_config() still have all the
knowledge about how to generate the output. That is wrong, instead, the
meta data (NMMetaAbstractInfo) should describe how to create the output
and then all those functions could be replaced. This means, later we want
to add more knowledge to the NMMetaAbstractInfo, so it is important to
keep them separate from NmcOutputField.
2017-03-31 19:18:16 +02:00
|
|
|
arr = nmc_dup_fields_array (tmpl, NMC_OF_FLAG_SECTION_PREFIX);
|
|
|
|
|
set_val_strc (arr, 0, nmc_fields_dev_show_sections[16]->name); /* "CONNECTIONS" */
|
2013-05-22 08:37:50 +02:00
|
|
|
set_val_str (arr, 1, ac_paths_str->str);
|
|
|
|
|
set_val_arr (arr, 2, (ac_arr));
|
2017-03-30 14:56:19 +02:00
|
|
|
g_ptr_array_add (out.output_data, arr);
|
2012-08-31 12:48:27 +02:00
|
|
|
|
2017-03-30 14:56:19 +02:00
|
|
|
print_data_prepare_width (out.output_data);
|
2017-03-31 13:21:47 +02:00
|
|
|
print_data (&nmc->nmc_config, out_indices, NULL, 0, &out);
|
2012-08-31 12:48:27 +02:00
|
|
|
|
2013-05-22 08:37:50 +02:00
|
|
|
g_string_free (ac_paths_str, FALSE);
|
2012-08-31 12:48:27 +02:00
|
|
|
was_output = TRUE;
|
|
|
|
|
}
|
2010-02-25 09:52:30 -08:00
|
|
|
}
|
|
|
|
|
|
2010-03-24 19:05:35 +01:00
|
|
|
if (sections_array)
|
|
|
|
|
g_array_free (sections_array, TRUE);
|
2013-12-10 12:00:53 +01:00
|
|
|
if (fields_in_section)
|
|
|
|
|
g_ptr_array_free (fields_in_section, TRUE);
|
2014-01-10 13:19:14 +01:00
|
|
|
|
|
|
|
|
return TRUE;
|
2010-02-25 09:52:30 -08:00
|
|
|
}
|
|
|
|
|
|
2016-07-01 21:45:43 +02:00
|
|
|
void
|
2017-04-04 15:12:00 +02:00
|
|
|
nmc_device_state_to_color (NMDeviceState state, NMMetaTermColor *color, NMMetaTermFormat *color_fmt)
|
2015-03-26 17:52:35 +01:00
|
|
|
{
|
2017-04-04 15:12:00 +02:00
|
|
|
*color = NM_META_TERM_COLOR_NORMAL;
|
|
|
|
|
*color_fmt = NM_META_TERM_FORMAT_NORMAL;
|
2015-03-26 17:52:35 +01:00
|
|
|
|
|
|
|
|
if (state <= NM_DEVICE_STATE_UNAVAILABLE)
|
2017-04-04 15:12:00 +02:00
|
|
|
*color_fmt= NM_META_TERM_FORMAT_DIM;
|
2015-03-26 17:52:35 +01:00
|
|
|
else if (state == NM_DEVICE_STATE_DISCONNECTED)
|
2017-04-04 15:12:00 +02:00
|
|
|
*color = NM_META_TERM_COLOR_RED;
|
2015-03-26 17:52:35 +01:00
|
|
|
else if (state >= NM_DEVICE_STATE_PREPARE && state <= NM_DEVICE_STATE_SECONDARIES)
|
2017-04-04 15:12:00 +02:00
|
|
|
*color = NM_META_TERM_COLOR_YELLOW;
|
2015-03-26 17:52:35 +01:00
|
|
|
else if (state == NM_DEVICE_STATE_ACTIVATED)
|
2017-04-04 15:12:00 +02:00
|
|
|
*color = NM_META_TERM_COLOR_GREEN;
|
2015-03-26 17:52:35 +01:00
|
|
|
}
|
|
|
|
|
|
2010-02-25 09:52:30 -08:00
|
|
|
static void
|
2017-03-30 14:56:19 +02:00
|
|
|
fill_output_device_status (NMDevice *device, GPtrArray *output_data)
|
2010-02-25 09:52:30 -08:00
|
|
|
{
|
2013-12-09 12:21:44 +01:00
|
|
|
NMActiveConnection *ac;
|
2015-02-16 10:56:45 +01:00
|
|
|
NMDeviceState state;
|
2017-04-04 15:12:00 +02:00
|
|
|
NMMetaTermColor color;
|
|
|
|
|
NMMetaTermFormat color_fmt;
|
cli: split tracking of meta data out of NmcOutputField
When generating output data, nmcli iterates over a list of
property-descriptors (nmc_fields_ip4_config), creates an intermediate
array (output_data) and finally prints it.
However, previously both the meta data (nmc_fields_ip4_config) and
the intermediate format use the same type NmcOutputField. This means,
certain fields are relevant to describe a property, and other fields
are output/formatting fields.
Split this up. Now, the meta data is tracked in form of an NMMetaAbstractInfo
lists. This separates the information about properties from intermediate steps
during creation of the output.
Note that currently functions like print_ip4_config() still have all the
knowledge about how to generate the output. That is wrong, instead, the
meta data (NMMetaAbstractInfo) should describe how to create the output
and then all those functions could be replaced. This means, later we want
to add more knowledge to the NMMetaAbstractInfo, so it is important to
keep them separate from NmcOutputField.
2017-03-31 19:18:16 +02:00
|
|
|
NmcOutputField *arr = nmc_dup_fields_array ((const NMMetaAbstractInfo *const*) nmc_fields_dev_status,
|
2013-05-22 08:37:50 +02:00
|
|
|
0);
|
|
|
|
|
|
2015-02-16 10:56:45 +01:00
|
|
|
state = nm_device_get_state (device);
|
2013-12-09 12:21:44 +01:00
|
|
|
ac = nm_device_get_active_connection (device);
|
|
|
|
|
|
2015-02-16 10:56:45 +01:00
|
|
|
/* Show devices in color */
|
2016-07-01 21:45:43 +02:00
|
|
|
nmc_device_state_to_color (state, &color, &color_fmt);
|
|
|
|
|
set_val_color_all (arr, color);
|
|
|
|
|
set_val_color_fmt_all (arr, color_fmt);
|
2015-02-16 10:56:45 +01:00
|
|
|
|
2013-05-22 08:37:50 +02:00
|
|
|
set_val_strc (arr, 0, nm_device_get_iface (device));
|
|
|
|
|
set_val_strc (arr, 1, nm_device_get_type_description (device));
|
2015-02-16 10:56:45 +01:00
|
|
|
set_val_strc (arr, 2, nmc_device_state_to_string (state));
|
2013-05-22 08:37:50 +02:00
|
|
|
set_val_strc (arr, 3, nm_object_get_path (NM_OBJECT (device)));
|
2013-12-09 12:21:44 +01:00
|
|
|
set_val_strc (arr, 4, get_active_connection_id (device));
|
|
|
|
|
set_val_strc (arr, 5, ac ? nm_active_connection_get_uuid (ac) : NULL);
|
|
|
|
|
set_val_strc (arr, 6, ac ? nm_object_get_path (NM_OBJECT (ac)) : NULL);
|
2010-02-25 09:52:30 -08:00
|
|
|
|
2017-03-30 14:56:19 +02:00
|
|
|
g_ptr_array_add (output_data, arr);
|
2010-02-25 09:52:30 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static NMCResultCode
|
|
|
|
|
do_devices_status (NmCli *nmc, int argc, char **argv)
|
|
|
|
|
{
|
2010-03-18 15:39:15 +01:00
|
|
|
GError *error = NULL;
|
2013-04-24 15:27:11 -04:00
|
|
|
NMDevice **devices;
|
2010-02-25 09:52:30 -08:00
|
|
|
int i;
|
cli: split tracking of meta data out of NmcOutputField
When generating output data, nmcli iterates over a list of
property-descriptors (nmc_fields_ip4_config), creates an intermediate
array (output_data) and finally prints it.
However, previously both the meta data (nmc_fields_ip4_config) and
the intermediate format use the same type NmcOutputField. This means,
certain fields are relevant to describe a property, and other fields
are output/formatting fields.
Split this up. Now, the meta data is tracked in form of an NMMetaAbstractInfo
lists. This separates the information about properties from intermediate steps
during creation of the output.
Note that currently functions like print_ip4_config() still have all the
knowledge about how to generate the output. That is wrong, instead, the
meta data (NMMetaAbstractInfo) should describe how to create the output
and then all those functions could be replaced. This means, later we want
to add more knowledge to the NMMetaAbstractInfo, so it is important to
keep them separate from NmcOutputField.
2017-03-31 19:18:16 +02:00
|
|
|
const char *fields_str = NULL;
|
|
|
|
|
const NMMetaAbstractInfo *const*tmpl;
|
|
|
|
|
NmcOutputField *arr;
|
2017-03-30 14:56:19 +02:00
|
|
|
NMC_OUTPUT_DATA_DEFINE_SCOPED (out);
|
2010-02-25 09:52:30 -08:00
|
|
|
|
2017-03-30 16:09:46 +02:00
|
|
|
next_arg (nmc, &argc, &argv, NULL);
|
|
|
|
|
|
2016-06-23 10:49:20 +02:00
|
|
|
/* Nothing to complete */
|
|
|
|
|
if (nmc->complete)
|
|
|
|
|
return nmc->return_value;
|
|
|
|
|
|
2010-02-25 09:52:30 -08:00
|
|
|
while (argc > 0) {
|
2014-09-19 16:04:40 -04:00
|
|
|
g_printerr (_("Unknown parameter: %s\n"), *argv);
|
2017-03-30 16:09:46 +02:00
|
|
|
next_arg (nmc, &argc, &argv, NULL);
|
2010-02-25 09:52:30 -08:00
|
|
|
}
|
|
|
|
|
|
2010-03-18 15:39:15 +01:00
|
|
|
if (!nmc->required_fields || strcasecmp (nmc->required_fields, "common") == 0)
|
cli: split tracking of meta data out of NmcOutputField
When generating output data, nmcli iterates over a list of
property-descriptors (nmc_fields_ip4_config), creates an intermediate
array (output_data) and finally prints it.
However, previously both the meta data (nmc_fields_ip4_config) and
the intermediate format use the same type NmcOutputField. This means,
certain fields are relevant to describe a property, and other fields
are output/formatting fields.
Split this up. Now, the meta data is tracked in form of an NMMetaAbstractInfo
lists. This separates the information about properties from intermediate steps
during creation of the output.
Note that currently functions like print_ip4_config() still have all the
knowledge about how to generate the output. That is wrong, instead, the
meta data (NMMetaAbstractInfo) should describe how to create the output
and then all those functions could be replaced. This means, later we want
to add more knowledge to the NMMetaAbstractInfo, so it is important to
keep them separate from NmcOutputField.
2017-03-31 19:18:16 +02:00
|
|
|
fields_str = NMC_FIELDS_DEV_STATUS_COMMON;
|
|
|
|
|
else if (!nmc->required_fields || strcasecmp (nmc->required_fields, "all") == 0) {
|
|
|
|
|
} else
|
2010-03-18 15:39:15 +01:00
|
|
|
fields_str = nmc->required_fields;
|
|
|
|
|
|
cli: split tracking of meta data out of NmcOutputField
When generating output data, nmcli iterates over a list of
property-descriptors (nmc_fields_ip4_config), creates an intermediate
array (output_data) and finally prints it.
However, previously both the meta data (nmc_fields_ip4_config) and
the intermediate format use the same type NmcOutputField. This means,
certain fields are relevant to describe a property, and other fields
are output/formatting fields.
Split this up. Now, the meta data is tracked in form of an NMMetaAbstractInfo
lists. This separates the information about properties from intermediate steps
during creation of the output.
Note that currently functions like print_ip4_config() still have all the
knowledge about how to generate the output. That is wrong, instead, the
meta data (NMMetaAbstractInfo) should describe how to create the output
and then all those functions could be replaced. This means, later we want
to add more knowledge to the NMMetaAbstractInfo, so it is important to
keep them separate from NmcOutputField.
2017-03-31 19:18:16 +02:00
|
|
|
tmpl = (const NMMetaAbstractInfo *const*) nmc_fields_dev_status;
|
2017-03-31 13:21:47 +02:00
|
|
|
out_indices = parse_output_fields (fields_str, tmpl, FALSE, NULL, &error);
|
2010-03-18 15:39:15 +01:00
|
|
|
|
|
|
|
|
if (error) {
|
2013-12-10 12:00:53 +01:00
|
|
|
g_string_printf (nmc->return_text, _("Error: 'device status': %s"), error->message);
|
2010-03-18 15:39:15 +01:00
|
|
|
g_error_free (error);
|
2016-06-23 12:19:10 +02:00
|
|
|
return NMC_RESULT_ERROR_USER_INPUT;
|
2010-03-18 15:39:15 +01:00
|
|
|
}
|
|
|
|
|
|
2013-05-22 08:37:50 +02:00
|
|
|
/* Add headers */
|
cli: split tracking of meta data out of NmcOutputField
When generating output data, nmcli iterates over a list of
property-descriptors (nmc_fields_ip4_config), creates an intermediate
array (output_data) and finally prints it.
However, previously both the meta data (nmc_fields_ip4_config) and
the intermediate format use the same type NmcOutputField. This means,
certain fields are relevant to describe a property, and other fields
are output/formatting fields.
Split this up. Now, the meta data is tracked in form of an NMMetaAbstractInfo
lists. This separates the information about properties from intermediate steps
during creation of the output.
Note that currently functions like print_ip4_config() still have all the
knowledge about how to generate the output. That is wrong, instead, the
meta data (NMMetaAbstractInfo) should describe how to create the output
and then all those functions could be replaced. This means, later we want
to add more knowledge to the NMMetaAbstractInfo, so it is important to
keep them separate from NmcOutputField.
2017-03-31 19:18:16 +02:00
|
|
|
arr = nmc_dup_fields_array (tmpl, NMC_OF_FLAG_MAIN_HEADER_ADD | NMC_OF_FLAG_FIELD_NAMES);
|
2017-03-30 14:56:19 +02:00
|
|
|
g_ptr_array_add (out.output_data, arr);
|
2010-02-25 09:52:30 -08:00
|
|
|
|
2016-07-01 21:45:43 +02:00
|
|
|
devices = nmc_get_devices_sorted (nmc->client);
|
2013-04-24 15:27:11 -04:00
|
|
|
for (i = 0; devices[i]; i++)
|
2017-03-30 14:56:19 +02:00
|
|
|
fill_output_device_status (devices[i], out.output_data);
|
2013-05-22 08:37:50 +02:00
|
|
|
|
2017-03-30 14:56:19 +02:00
|
|
|
print_data_prepare_width (out.output_data);
|
2017-03-31 13:21:47 +02:00
|
|
|
print_data (&nmc->nmc_config, out_indices, _("Status of devices"), 0, &out);
|
2013-05-22 08:37:50 +02:00
|
|
|
|
2013-04-24 15:27:11 -04:00
|
|
|
g_free (devices);
|
2010-02-25 09:52:30 -08:00
|
|
|
|
|
|
|
|
return NMC_RESULT_SUCCESS;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static NMCResultCode
|
2016-06-23 18:49:39 +02:00
|
|
|
do_device_show (NmCli *nmc, int argc, char **argv)
|
2010-02-25 09:52:30 -08:00
|
|
|
{
|
2016-06-27 11:54:25 +02:00
|
|
|
gs_free_error GError *error = NULL;
|
2010-02-25 09:52:30 -08:00
|
|
|
|
2017-03-30 16:09:46 +02:00
|
|
|
next_arg (nmc, &argc, &argv, NULL);
|
2016-06-23 12:19:10 +02:00
|
|
|
if (!nmc->mode_specified)
|
2017-03-30 12:45:41 +02:00
|
|
|
nmc->nmc_config_mutable.multiline_output = TRUE; /* multiline mode is default for 'device show' */
|
2016-06-23 12:19:10 +02:00
|
|
|
|
2016-06-27 11:54:25 +02:00
|
|
|
if (argc) {
|
|
|
|
|
NMDevice *device;
|
2010-02-25 09:52:30 -08:00
|
|
|
|
2016-06-27 11:54:25 +02:00
|
|
|
device = get_device (nmc, &argc, &argv, &error);
|
2010-02-25 09:52:30 -08:00
|
|
|
if (!device) {
|
2016-06-27 11:54:25 +02:00
|
|
|
g_string_printf (nmc->return_text, _("Error: %s."), error->message);
|
|
|
|
|
return error->code;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (argc) {
|
|
|
|
|
g_string_printf (nmc->return_text, _("Error: invalid extra argument '%s'."), *argv);
|
|
|
|
|
return NMC_RESULT_ERROR_USER_INPUT;
|
2010-02-25 09:52:30 -08:00
|
|
|
}
|
2016-06-27 11:54:25 +02:00
|
|
|
|
2016-06-23 10:49:20 +02:00
|
|
|
if (nmc->complete)
|
|
|
|
|
return nmc->return_value;
|
|
|
|
|
|
2010-03-18 15:39:15 +01:00
|
|
|
show_device_info (device, nmc);
|
2010-02-25 09:52:30 -08:00
|
|
|
} else {
|
2016-07-01 21:45:43 +02:00
|
|
|
NMDevice **devices = nmc_get_devices_sorted (nmc->client);
|
2016-06-27 11:54:25 +02:00
|
|
|
int i;
|
|
|
|
|
|
2016-06-23 10:49:20 +02:00
|
|
|
/* nmc_do_cmd() should not call this with argc=0. */
|
|
|
|
|
g_assert (!nmc->complete);
|
|
|
|
|
|
2013-04-03 10:01:42 +02:00
|
|
|
/* Show details for all devices */
|
2013-04-24 15:27:11 -04:00
|
|
|
for (i = 0; devices[i]; i++) {
|
2016-06-27 11:54:25 +02:00
|
|
|
if (!show_device_info (devices[i], nmc))
|
2014-01-10 13:19:14 +01:00
|
|
|
break;
|
2013-04-24 15:27:11 -04:00
|
|
|
if (devices[i + 1])
|
2014-09-19 16:04:40 -04:00
|
|
|
g_print ("\n"); /* Empty line */
|
2013-04-03 10:01:42 +02:00
|
|
|
}
|
2016-06-27 11:54:25 +02:00
|
|
|
|
|
|
|
|
g_free (devices);
|
2010-02-25 09:52:30 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return nmc->return_value;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static gboolean
|
|
|
|
|
timeout_cb (gpointer user_data)
|
|
|
|
|
{
|
|
|
|
|
/* Time expired -> exit nmcli */
|
|
|
|
|
|
|
|
|
|
NmCli *nmc = (NmCli *) user_data;
|
|
|
|
|
|
|
|
|
|
g_string_printf (nmc->return_text, _("Error: Timeout %d sec expired."), nmc->timeout);
|
|
|
|
|
nmc->return_value = NMC_RESULT_ERROR_TIMEOUT_EXPIRED;
|
|
|
|
|
quit ();
|
|
|
|
|
return FALSE;
|
|
|
|
|
}
|
|
|
|
|
|
2012-05-03 11:54:52 +02:00
|
|
|
static gboolean
|
|
|
|
|
progress_cb (gpointer user_data)
|
|
|
|
|
{
|
|
|
|
|
NMDevice *device = (NMDevice *) user_data;
|
|
|
|
|
|
2012-05-09 12:35:27 +02:00
|
|
|
nmc_terminal_show_progress (device ? nmc_device_state_to_string (nm_device_get_state (device)) : "");
|
2012-05-03 11:54:52 +02:00
|
|
|
|
|
|
|
|
return TRUE;
|
|
|
|
|
}
|
|
|
|
|
|
2014-11-18 15:55:55 +01:00
|
|
|
static void connected_state_cb (NMDevice *device, NMActiveConnection *active);
|
|
|
|
|
|
2013-09-16 21:03:34 -05:00
|
|
|
static void
|
2014-11-18 15:55:55 +01:00
|
|
|
device_state_cb (NMDevice *device, GParamSpec *pspec, gpointer user_data)
|
2013-09-16 21:03:34 -05:00
|
|
|
{
|
2014-02-12 16:24:10 +01:00
|
|
|
NMActiveConnection *active = (NMActiveConnection *) user_data;
|
2014-11-18 15:55:55 +01:00
|
|
|
|
|
|
|
|
connected_state_cb (device, active);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
|
active_state_cb (NMActiveConnection *active, GParamSpec *pspec, gpointer user_data)
|
|
|
|
|
{
|
|
|
|
|
NMDevice *device = (NMDevice *) user_data;
|
|
|
|
|
|
|
|
|
|
connected_state_cb (device, active);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
|
connected_state_cb (NMDevice *device, NMActiveConnection *active)
|
|
|
|
|
{
|
2013-09-16 21:03:34 -05:00
|
|
|
NMDeviceState state;
|
2014-11-14 18:29:36 +01:00
|
|
|
NMDeviceStateReason reason;
|
|
|
|
|
NMActiveConnectionState ac_state;
|
2013-09-16 21:03:34 -05:00
|
|
|
|
|
|
|
|
state = nm_device_get_state (device);
|
2014-11-14 18:29:36 +01:00
|
|
|
ac_state = nm_active_connection_get_state (active);
|
|
|
|
|
|
|
|
|
|
if (ac_state == NM_ACTIVE_CONNECTION_STATE_ACTIVATING)
|
|
|
|
|
return;
|
2013-09-16 21:03:34 -05:00
|
|
|
|
|
|
|
|
if (state == NM_DEVICE_STATE_ACTIVATED) {
|
2014-02-12 16:24:10 +01:00
|
|
|
nmc_terminal_erase_line ();
|
2014-09-19 16:04:40 -04:00
|
|
|
g_print (_("Device '%s' successfully activated with '%s'.\n"),
|
|
|
|
|
nm_device_get_iface (device),
|
|
|
|
|
nm_active_connection_get_uuid (active));
|
2014-11-14 18:29:36 +01:00
|
|
|
} else if ( state <= NM_DEVICE_STATE_DISCONNECTED
|
|
|
|
|
|| state >= NM_DEVICE_STATE_DEACTIVATING) {
|
2014-09-13 00:35:05 +02:00
|
|
|
reason = nm_device_get_state_reason (device);
|
2014-11-14 18:29:36 +01:00
|
|
|
g_print (_("Error: Connection activation failed: (%d) %s.\n"),
|
|
|
|
|
reason, nmc_device_reason_to_string (reason));
|
2014-11-18 15:55:55 +01:00
|
|
|
} else
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
g_signal_handlers_disconnect_by_func (active, G_CALLBACK (active_state_cb), device);
|
|
|
|
|
g_signal_handlers_disconnect_by_func (device, G_CALLBACK (device_state_cb), active);
|
|
|
|
|
|
|
|
|
|
g_object_unref (active);
|
|
|
|
|
g_object_unref (device);
|
|
|
|
|
|
|
|
|
|
quit ();
|
2014-09-13 00:35:05 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
typedef struct {
|
|
|
|
|
NmCli *nmc;
|
|
|
|
|
NMDevice *device;
|
2015-10-02 22:46:53 +02:00
|
|
|
gboolean hotspot;
|
2014-09-13 00:35:05 +02:00
|
|
|
} AddAndActivateInfo;
|
|
|
|
|
|
|
|
|
|
static void
|
2014-09-11 16:27:13 -04:00
|
|
|
add_and_activate_cb (GObject *client,
|
|
|
|
|
GAsyncResult *result,
|
2014-09-13 00:35:05 +02:00
|
|
|
gpointer user_data)
|
|
|
|
|
{
|
|
|
|
|
AddAndActivateInfo *info = (AddAndActivateInfo *) user_data;
|
|
|
|
|
NmCli *nmc = info->nmc;
|
|
|
|
|
NMDevice *device = info->device;
|
|
|
|
|
NMActiveConnectionState state;
|
2014-09-11 16:27:13 -04:00
|
|
|
NMActiveConnection *active;
|
|
|
|
|
GError *error = NULL;
|
|
|
|
|
|
|
|
|
|
active = nm_client_add_and_activate_connection_finish (NM_CLIENT (client), result, &error);
|
2014-09-13 00:35:05 +02:00
|
|
|
|
2014-09-11 16:27:13 -04:00
|
|
|
if (error) {
|
2015-10-02 22:46:53 +02:00
|
|
|
if (info->hotspot)
|
|
|
|
|
g_string_printf (nmc->return_text, _("Error: Failed to setup a Wi-Fi hotspot: %s"),
|
|
|
|
|
error->message);
|
|
|
|
|
else
|
|
|
|
|
g_string_printf (nmc->return_text, _("Error: Failed to add/activate new connection: %s"),
|
|
|
|
|
error->message);
|
2014-09-11 16:27:13 -04:00
|
|
|
g_error_free (error);
|
2014-09-13 00:35:05 +02:00
|
|
|
nmc->return_value = NMC_RESULT_ERROR_CON_ACTIVATION;
|
|
|
|
|
quit ();
|
|
|
|
|
} else {
|
|
|
|
|
state = nm_active_connection_get_state (active);
|
|
|
|
|
|
|
|
|
|
if (state == NM_ACTIVE_CONNECTION_STATE_UNKNOWN) {
|
2015-10-02 22:46:53 +02:00
|
|
|
if (info->hotspot)
|
|
|
|
|
g_string_printf (nmc->return_text, _("Error: Failed to setup a Wi-Fi hotspot"));
|
|
|
|
|
else
|
|
|
|
|
g_string_printf (nmc->return_text, _("Error: Failed to add/activate new connection: Unknown error"));
|
2014-09-13 00:35:05 +02:00
|
|
|
nmc->return_value = NMC_RESULT_ERROR_CON_ACTIVATION;
|
2014-11-18 15:55:55 +01:00
|
|
|
g_object_unref (active);
|
2014-09-13 00:35:05 +02:00
|
|
|
quit ();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (nmc->nowait_flag || state == NM_ACTIVE_CONNECTION_STATE_ACTIVATED) {
|
|
|
|
|
/* User doesn't want to wait or already activated */
|
|
|
|
|
if (state == NM_ACTIVE_CONNECTION_STATE_ACTIVATED) {
|
2017-03-30 12:45:41 +02:00
|
|
|
if (nmc->nmc_config.print_output == NMC_PRINT_PRETTY)
|
2014-09-13 00:35:05 +02:00
|
|
|
nmc_terminal_erase_line ();
|
2015-10-02 22:46:53 +02:00
|
|
|
if (info->hotspot)
|
|
|
|
|
g_print (_("Connection with UUID '%s' created and activated on device '%s'\n"),
|
|
|
|
|
nm_active_connection_get_uuid (active), nm_device_get_iface (device));
|
|
|
|
|
else
|
|
|
|
|
g_print (_("Hotspot '%s' activated on device '%s'\n"),
|
|
|
|
|
nm_active_connection_get_id (active), nm_device_get_iface (device));
|
2014-09-13 00:35:05 +02:00
|
|
|
}
|
2014-09-11 16:27:13 -04:00
|
|
|
g_object_unref (active);
|
2014-09-13 00:35:05 +02:00
|
|
|
quit ();
|
|
|
|
|
} else {
|
2014-11-18 15:55:55 +01:00
|
|
|
g_object_ref (device);
|
|
|
|
|
g_signal_connect (device, "notify::state", G_CALLBACK (device_state_cb), active);
|
|
|
|
|
g_signal_connect (active, "notify::state", G_CALLBACK (active_state_cb), device);
|
|
|
|
|
|
2014-09-13 00:35:05 +02:00
|
|
|
g_timeout_add_seconds (nmc->timeout, timeout_cb, nmc); /* Exit if timeout expires */
|
|
|
|
|
|
2017-03-30 12:45:41 +02:00
|
|
|
if (nmc->nmc_config.print_output == NMC_PRINT_PRETTY)
|
2014-09-13 00:35:05 +02:00
|
|
|
progress_id = g_timeout_add (120, progress_cb, device);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
g_free (info);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
|
create_connect_connection_for_device (AddAndActivateInfo *info)
|
|
|
|
|
{
|
|
|
|
|
NMConnection *connection;
|
|
|
|
|
NMSettingConnection *s_con;
|
|
|
|
|
|
|
|
|
|
/* Create new connection and tie it to the device */
|
|
|
|
|
connection = nm_simple_connection_new ();
|
|
|
|
|
s_con = (NMSettingConnection *) nm_setting_connection_new ();
|
|
|
|
|
nm_connection_add_setting (connection, NM_SETTING (s_con));
|
|
|
|
|
g_object_set (s_con,
|
|
|
|
|
NM_SETTING_CONNECTION_ID, nm_device_get_iface (info->device),
|
|
|
|
|
NM_SETTING_CONNECTION_INTERFACE_NAME, nm_device_get_iface (info->device),
|
|
|
|
|
NULL);
|
|
|
|
|
|
2014-09-11 16:27:13 -04:00
|
|
|
nm_client_add_and_activate_connection_async (info->nmc->client,
|
|
|
|
|
connection,
|
|
|
|
|
info->device,
|
|
|
|
|
NULL,
|
|
|
|
|
NULL,
|
|
|
|
|
add_and_activate_cb,
|
|
|
|
|
info);
|
2014-09-13 00:35:05 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void
|
2014-09-11 16:27:13 -04:00
|
|
|
connect_device_cb (GObject *client, GAsyncResult *result, gpointer user_data)
|
2014-09-13 00:35:05 +02:00
|
|
|
{
|
|
|
|
|
AddAndActivateInfo *info = (AddAndActivateInfo *) user_data;
|
|
|
|
|
NmCli *nmc = info->nmc;
|
2014-09-11 16:27:13 -04:00
|
|
|
NMActiveConnection *active;
|
|
|
|
|
GError *error = NULL;
|
2013-09-16 21:03:34 -05:00
|
|
|
const GPtrArray *devices;
|
|
|
|
|
NMDevice *device;
|
|
|
|
|
NMDeviceState state;
|
|
|
|
|
|
2014-09-11 16:27:13 -04:00
|
|
|
active = nm_client_activate_connection_finish (NM_CLIENT (client), result, &error);
|
|
|
|
|
|
2013-09-16 21:03:34 -05:00
|
|
|
if (error) {
|
2014-09-13 00:35:05 +02:00
|
|
|
/* If no connection existed for the device, create one and activate it */
|
2014-10-15 15:27:25 -04:00
|
|
|
if (g_error_matches (error, NM_MANAGER_ERROR, NM_MANAGER_ERROR_UNKNOWN_CONNECTION)) {
|
2014-09-13 00:35:05 +02:00
|
|
|
create_connect_connection_for_device (info);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
2013-09-16 21:03:34 -05:00
|
|
|
g_string_printf (nmc->return_text, _("Error: Device activation failed: %s"),
|
2014-09-11 16:27:13 -04:00
|
|
|
error->message);
|
|
|
|
|
g_error_free (error);
|
2013-09-16 21:03:34 -05:00
|
|
|
nmc->return_value = NMC_RESULT_ERROR_CON_ACTIVATION;
|
|
|
|
|
quit ();
|
|
|
|
|
} else {
|
|
|
|
|
g_assert (active);
|
|
|
|
|
devices = nm_active_connection_get_devices (active);
|
2014-08-25 10:33:53 -04:00
|
|
|
if (devices->len == 0) {
|
2014-02-12 16:24:10 +01:00
|
|
|
g_string_printf (nmc->return_text, _("Error: Device activation failed: device was disconnected"));
|
|
|
|
|
nmc->return_value = NMC_RESULT_ERROR_CON_ACTIVATION;
|
2014-11-18 15:55:55 +01:00
|
|
|
g_object_unref (active);
|
2014-02-12 16:24:10 +01:00
|
|
|
quit ();
|
2014-09-13 00:35:05 +02:00
|
|
|
g_free (info);
|
2014-02-12 16:24:10 +01:00
|
|
|
return;
|
|
|
|
|
}
|
2013-09-16 21:03:34 -05:00
|
|
|
|
2014-02-12 16:24:10 +01:00
|
|
|
device = g_ptr_array_index (devices, 0);
|
2013-09-16 21:03:34 -05:00
|
|
|
state = nm_device_get_state (device);
|
|
|
|
|
|
|
|
|
|
if (nmc->nowait_flag || state == NM_DEVICE_STATE_ACTIVATED) {
|
|
|
|
|
/* Don't want to wait or device already activated */
|
2017-03-30 12:45:41 +02:00
|
|
|
if (state == NM_DEVICE_STATE_ACTIVATED && nmc->nmc_config.print_output == NMC_PRINT_PRETTY) {
|
2013-09-16 21:03:34 -05:00
|
|
|
nmc_terminal_erase_line ();
|
2014-09-19 16:04:40 -04:00
|
|
|
g_print (_("Device '%s' has been connected.\n"), nm_device_get_iface (device));
|
2013-09-16 21:03:34 -05:00
|
|
|
}
|
2014-11-18 15:55:55 +01:00
|
|
|
g_object_unref (active);
|
2013-09-16 21:03:34 -05:00
|
|
|
quit ();
|
|
|
|
|
} else {
|
2014-11-20 12:36:14 +01:00
|
|
|
if (nmc->secret_agent) {
|
|
|
|
|
NMRemoteConnection *connection = nm_active_connection_get_connection (active);
|
|
|
|
|
|
2014-11-20 16:00:34 -06:00
|
|
|
nm_secret_agent_simple_enable (NM_SECRET_AGENT_SIMPLE (nmc->secret_agent),
|
|
|
|
|
nm_connection_get_path (NM_CONNECTION (connection)));
|
2014-11-20 12:36:14 +01:00
|
|
|
}
|
|
|
|
|
|
2014-11-18 15:55:55 +01:00
|
|
|
g_object_ref (device);
|
|
|
|
|
g_signal_connect (device, "notify::state", G_CALLBACK (device_state_cb), active);
|
|
|
|
|
g_signal_connect (active, "notify::state", G_CALLBACK (active_state_cb), device);
|
2013-09-16 21:03:34 -05:00
|
|
|
/* Start timer not to loop forever if "notify::state" signal is not issued */
|
|
|
|
|
g_timeout_add_seconds (nmc->timeout, timeout_cb, nmc);
|
|
|
|
|
}
|
|
|
|
|
}
|
2014-09-13 00:35:05 +02:00
|
|
|
g_free (info);
|
2013-09-16 21:03:34 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static NMCResultCode
|
|
|
|
|
do_device_connect (NmCli *nmc, int argc, char **argv)
|
|
|
|
|
{
|
|
|
|
|
NMDevice *device = NULL;
|
2014-09-13 00:35:05 +02:00
|
|
|
AddAndActivateInfo *info;
|
2016-06-27 11:54:25 +02:00
|
|
|
gs_free_error GError *error = NULL;
|
2013-09-16 21:03:34 -05:00
|
|
|
|
|
|
|
|
/* Set default timeout for connect operation. */
|
|
|
|
|
if (nmc->timeout == -1)
|
|
|
|
|
nmc->timeout = 90;
|
|
|
|
|
|
2017-03-30 16:09:46 +02:00
|
|
|
next_arg (nmc, &argc, &argv, NULL);
|
2016-06-27 11:54:25 +02:00
|
|
|
device = get_device (nmc, &argc, &argv, &error);
|
|
|
|
|
if (!device) {
|
|
|
|
|
g_string_printf (nmc->return_text, _("Error: %s."), error->message);
|
|
|
|
|
return error->code;
|
2013-09-16 21:03:34 -05:00
|
|
|
}
|
|
|
|
|
|
2016-06-27 11:54:25 +02:00
|
|
|
if (*argv) {
|
2013-09-16 21:03:34 -05:00
|
|
|
g_string_printf (nmc->return_text, _("Error: extra argument not allowed: '%s'."), *argv);
|
2016-06-23 10:49:20 +02:00
|
|
|
return NMC_RESULT_ERROR_USER_INPUT;
|
2013-09-16 21:03:34 -05:00
|
|
|
}
|
|
|
|
|
|
2016-06-23 10:49:20 +02:00
|
|
|
if (nmc->complete)
|
|
|
|
|
return nmc->return_value;
|
|
|
|
|
|
2013-09-16 21:03:34 -05:00
|
|
|
/*
|
|
|
|
|
* Use nowait_flag instead of should_wait, because exiting has to be postponed
|
|
|
|
|
* till connect_device_cb() is called, giving NM time to check our permissions.
|
|
|
|
|
*/
|
|
|
|
|
nmc->nowait_flag = (nmc->timeout == 0);
|
2015-03-27 12:39:17 +01:00
|
|
|
nmc->should_wait++;
|
2014-09-13 00:35:05 +02:00
|
|
|
|
2014-11-20 12:36:14 +01:00
|
|
|
/* Create secret agent */
|
|
|
|
|
nmc->secret_agent = nm_secret_agent_simple_new ("nmcli-connect");
|
2016-09-09 17:33:09 +02:00
|
|
|
if (nmc->secret_agent) {
|
|
|
|
|
g_signal_connect (nmc->secret_agent,
|
|
|
|
|
NM_SECRET_AGENT_SIMPLE_REQUEST_SECRETS,
|
|
|
|
|
G_CALLBACK (nmc_secrets_requested),
|
|
|
|
|
nmc);
|
|
|
|
|
}
|
2014-11-20 12:36:14 +01:00
|
|
|
|
2014-09-13 00:35:05 +02:00
|
|
|
info = g_malloc0 (sizeof (AddAndActivateInfo));
|
|
|
|
|
info->nmc = nmc;
|
|
|
|
|
info->device = device;
|
2015-10-02 22:46:53 +02:00
|
|
|
info->hotspot = FALSE;
|
2014-09-13 00:35:05 +02:00
|
|
|
|
2014-09-11 16:27:13 -04:00
|
|
|
nm_client_activate_connection_async (nmc->client,
|
|
|
|
|
NULL, /* let NM find a connection automatically */
|
|
|
|
|
device,
|
|
|
|
|
NULL,
|
|
|
|
|
NULL,
|
|
|
|
|
connect_device_cb,
|
|
|
|
|
info);
|
2013-09-16 21:03:34 -05:00
|
|
|
|
|
|
|
|
/* Start progress indication */
|
2017-03-30 12:45:41 +02:00
|
|
|
if (nmc->nmc_config.print_output == NMC_PRINT_PRETTY)
|
2013-09-16 21:03:34 -05:00
|
|
|
progress_id = g_timeout_add (120, progress_cb, device);
|
|
|
|
|
|
|
|
|
|
return nmc->return_value;
|
|
|
|
|
}
|
|
|
|
|
|
2015-03-11 19:10:58 +01:00
|
|
|
typedef struct {
|
|
|
|
|
NmCli *nmc;
|
|
|
|
|
GSList *queue;
|
|
|
|
|
guint timeout_id;
|
|
|
|
|
gboolean cmd_disconnect;
|
|
|
|
|
} DeviceCbInfo;
|
|
|
|
|
|
|
|
|
|
static void device_cb_info_finish (DeviceCbInfo *info, NMDevice *device);
|
|
|
|
|
|
|
|
|
|
static gboolean
|
|
|
|
|
device_op_timeout_cb (gpointer user_data)
|
|
|
|
|
{
|
|
|
|
|
DeviceCbInfo *info = user_data;
|
|
|
|
|
|
|
|
|
|
timeout_cb (info->nmc);
|
|
|
|
|
device_cb_info_finish (info, NULL);
|
|
|
|
|
return G_SOURCE_REMOVE;
|
|
|
|
|
}
|
|
|
|
|
|
2013-09-16 21:03:34 -05:00
|
|
|
static void
|
2015-03-11 19:10:58 +01:00
|
|
|
device_removed_cb (NMClient *client, NMDevice *device, DeviceCbInfo *info)
|
2013-09-16 21:03:34 -05:00
|
|
|
{
|
2015-03-11 19:10:58 +01:00
|
|
|
/* Success: device has been removed.
|
|
|
|
|
* It can also happen when disconnecting a software device.
|
|
|
|
|
*/
|
|
|
|
|
if (!g_slist_find (info->queue, device))
|
|
|
|
|
return;
|
2013-09-16 21:03:34 -05:00
|
|
|
|
2015-03-11 19:10:58 +01:00
|
|
|
if (info->cmd_disconnect)
|
|
|
|
|
g_print (_("Device '%s' successfully disconnected.\n"),
|
|
|
|
|
nm_device_get_iface (device));
|
|
|
|
|
else
|
|
|
|
|
g_print (_("Device '%s' successfully removed.\n"),
|
|
|
|
|
nm_device_get_iface (device));
|
|
|
|
|
device_cb_info_finish (info, device);
|
|
|
|
|
}
|
2013-09-16 21:03:34 -05:00
|
|
|
|
2015-03-11 19:10:58 +01:00
|
|
|
static void
|
|
|
|
|
disconnect_state_cb (NMDevice *device, GParamSpec *pspec, DeviceCbInfo *info)
|
|
|
|
|
{
|
|
|
|
|
if (!g_slist_find (info->queue, device))
|
|
|
|
|
return;
|
|
|
|
|
|
2015-04-23 10:00:47 -04:00
|
|
|
if (nm_device_get_state (device) <= NM_DEVICE_STATE_DISCONNECTED) {
|
2014-11-10 16:56:34 +01:00
|
|
|
g_print (_("Device '%s' successfully disconnected.\n"),
|
|
|
|
|
nm_device_get_iface (device));
|
2015-03-11 19:10:58 +01:00
|
|
|
device_cb_info_finish (info, device);
|
2013-09-16 21:03:34 -05:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2014-11-10 16:56:34 +01:00
|
|
|
static void
|
2015-03-11 19:10:58 +01:00
|
|
|
destroy_queue_element (gpointer data)
|
2014-11-10 16:56:34 +01:00
|
|
|
{
|
2015-03-11 19:10:58 +01:00
|
|
|
g_signal_handlers_disconnect_matched (data, G_SIGNAL_MATCH_FUNC, 0, 0, 0,
|
|
|
|
|
disconnect_state_cb, NULL);
|
|
|
|
|
g_object_unref (data);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
|
device_cb_info_finish (DeviceCbInfo *info, NMDevice *device)
|
|
|
|
|
{
|
|
|
|
|
if (device) {
|
|
|
|
|
GSList *elem = g_slist_find (info->queue, device);
|
|
|
|
|
if (!elem)
|
|
|
|
|
return;
|
|
|
|
|
info->queue = g_slist_delete_link (info->queue, elem);
|
|
|
|
|
destroy_queue_element (device);
|
|
|
|
|
} else {
|
|
|
|
|
g_slist_free_full (info->queue, destroy_queue_element);
|
|
|
|
|
info->queue = NULL;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (info->queue)
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
if (info->timeout_id)
|
|
|
|
|
g_source_remove (info->timeout_id);
|
|
|
|
|
g_signal_handlers_disconnect_by_func (info->nmc->client, device_removed_cb, info);
|
|
|
|
|
g_slice_free (DeviceCbInfo, info);
|
2014-11-10 16:56:34 +01:00
|
|
|
quit ();
|
|
|
|
|
}
|
|
|
|
|
|
2015-05-14 18:33:53 +02:00
|
|
|
static void
|
|
|
|
|
reapply_device_cb (GObject *object, GAsyncResult *result, gpointer user_data)
|
|
|
|
|
{
|
|
|
|
|
NMDevice *device = NM_DEVICE (object);
|
|
|
|
|
DeviceCbInfo *info = (DeviceCbInfo *) user_data;
|
|
|
|
|
NmCli *nmc = info->nmc;
|
|
|
|
|
GError *error = NULL;
|
|
|
|
|
|
|
|
|
|
if (!nm_device_reapply_finish (device, result, &error)) {
|
2016-04-30 14:14:31 +02:00
|
|
|
g_string_printf (nmc->return_text, _("Error: Reapplying connection to device '%s' (%s) failed: %s"),
|
|
|
|
|
nm_device_get_iface (device),
|
|
|
|
|
nm_object_get_path (NM_OBJECT (device)),
|
|
|
|
|
error->message);
|
2015-05-14 18:33:53 +02:00
|
|
|
g_error_free (error);
|
|
|
|
|
nmc->return_value = NMC_RESULT_ERROR_DEV_DISCONNECT;
|
|
|
|
|
device_cb_info_finish (info, device);
|
|
|
|
|
} else {
|
2017-03-30 12:45:41 +02:00
|
|
|
if (nmc->nmc_config.print_output == NMC_PRINT_PRETTY)
|
2015-05-14 18:33:53 +02:00
|
|
|
nmc_terminal_erase_line ();
|
|
|
|
|
g_print (_("Connection successfully reapplied to device '%s'.\n"),
|
2016-04-30 13:46:18 +02:00
|
|
|
nm_device_get_iface (device));
|
2015-05-14 18:33:53 +02:00
|
|
|
device_cb_info_finish (info, device);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static NMCResultCode
|
|
|
|
|
do_device_reapply (NmCli *nmc, int argc, char **argv)
|
|
|
|
|
{
|
2016-06-27 11:54:25 +02:00
|
|
|
NMDevice *device;
|
2015-05-14 18:33:53 +02:00
|
|
|
DeviceCbInfo *info = NULL;
|
2016-06-27 11:54:25 +02:00
|
|
|
gs_free_error GError *error = NULL;
|
2015-05-14 18:33:53 +02:00
|
|
|
|
|
|
|
|
/* Set default timeout for reapply operation. */
|
|
|
|
|
if (nmc->timeout == -1)
|
|
|
|
|
nmc->timeout = 10;
|
|
|
|
|
|
2017-03-30 16:09:46 +02:00
|
|
|
next_arg (nmc, &argc, &argv, NULL);
|
2016-06-27 11:54:25 +02:00
|
|
|
device = get_device (nmc, &argc, &argv, &error);
|
|
|
|
|
if (!device) {
|
|
|
|
|
g_string_printf (nmc->return_text, _("Error: %s."), error->message);
|
|
|
|
|
return error->code;
|
2015-05-14 18:33:53 +02:00
|
|
|
}
|
|
|
|
|
|
2016-06-27 11:54:25 +02:00
|
|
|
if (argc) {
|
|
|
|
|
g_string_printf (nmc->return_text, _("Error: invalid extra argument '%s'."), *argv);
|
|
|
|
|
return NMC_RESULT_ERROR_USER_INPUT;
|
2015-05-14 18:33:53 +02:00
|
|
|
}
|
|
|
|
|
|
2016-06-23 10:49:20 +02:00
|
|
|
if (nmc->complete)
|
|
|
|
|
return nmc->return_value;
|
|
|
|
|
|
2015-05-14 18:33:53 +02:00
|
|
|
nmc->nowait_flag = (nmc->timeout == 0);
|
2016-06-22 17:44:39 +02:00
|
|
|
nmc->should_wait++;
|
2015-05-14 18:33:53 +02:00
|
|
|
|
2016-04-30 14:14:31 +02:00
|
|
|
info = g_slice_new0 (DeviceCbInfo);
|
|
|
|
|
info->nmc = nmc;
|
|
|
|
|
info->queue = g_slist_prepend (info->queue, g_object_ref (device));
|
2015-05-14 18:33:53 +02:00
|
|
|
|
2016-04-30 14:14:31 +02:00
|
|
|
/* Now reapply the connection to the device */
|
|
|
|
|
nm_device_reapply_async (device, NULL, 0, 0, NULL, reapply_device_cb, info);
|
2015-05-14 18:33:53 +02:00
|
|
|
|
|
|
|
|
return nmc->return_value;
|
|
|
|
|
}
|
|
|
|
|
|
2016-06-22 18:25:48 +02:00
|
|
|
typedef struct {
|
|
|
|
|
NmCli *nmc;
|
|
|
|
|
int argc;
|
|
|
|
|
char **argv;
|
|
|
|
|
} ModifyInfo;
|
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
|
modify_reapply_cb (GObject *object, GAsyncResult *result, gpointer user_data)
|
|
|
|
|
{
|
|
|
|
|
NMDevice *device = NM_DEVICE (object);
|
|
|
|
|
ModifyInfo *info = user_data;
|
|
|
|
|
NmCli *nmc = info->nmc;
|
|
|
|
|
GError *error = NULL;
|
|
|
|
|
|
|
|
|
|
if (!nm_device_reapply_finish (device, result, &error)) {
|
|
|
|
|
g_string_printf (nmc->return_text, _("Error: Reapplying connection to device '%s' (%s) failed: %s"),
|
|
|
|
|
nm_device_get_iface (device),
|
|
|
|
|
nm_object_get_path (NM_OBJECT (device)),
|
|
|
|
|
error->message);
|
|
|
|
|
g_error_free (error);
|
|
|
|
|
nmc->return_value = NMC_RESULT_ERROR_DEV_DISCONNECT;
|
|
|
|
|
} else {
|
2017-03-30 12:45:41 +02:00
|
|
|
if (nmc->nmc_config.print_output == NMC_PRINT_PRETTY)
|
2016-06-22 18:25:48 +02:00
|
|
|
nmc_terminal_erase_line ();
|
|
|
|
|
g_print (_("Connection successfully reapplied to device '%s'.\n"),
|
|
|
|
|
nm_device_get_iface (device));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
g_slice_free (ModifyInfo, info);
|
|
|
|
|
quit ();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
|
modify_get_applied_cb (GObject *object,
|
|
|
|
|
GAsyncResult *result,
|
|
|
|
|
gpointer user_data)
|
|
|
|
|
{
|
|
|
|
|
NMDevice *device = NM_DEVICE (object);
|
|
|
|
|
ModifyInfo *info = user_data;
|
|
|
|
|
NmCli *nmc = info->nmc;
|
|
|
|
|
gs_free_error GError *error = NULL;
|
|
|
|
|
NMConnection *connection;
|
|
|
|
|
guint64 version_id;
|
|
|
|
|
|
|
|
|
|
connection = nm_device_get_applied_connection_finish (device,
|
|
|
|
|
result,
|
|
|
|
|
&version_id,
|
|
|
|
|
&error);
|
|
|
|
|
if (!connection) {
|
|
|
|
|
g_string_printf (nmc->return_text, _("Error: Reading applied connection from device '%s' (%s) failed: %s"),
|
|
|
|
|
nm_device_get_iface (device),
|
|
|
|
|
nm_object_get_path (NM_OBJECT (device)),
|
|
|
|
|
error->message);
|
|
|
|
|
nmc->return_value = NMC_RESULT_ERROR_UNKNOWN;
|
|
|
|
|
g_slice_free (ModifyInfo, info);
|
|
|
|
|
quit ();
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!nmc_read_connection_properties (info->nmc, connection, &info->argc, &info->argv, &error)) {
|
|
|
|
|
g_string_assign (nmc->return_text, error->message);
|
|
|
|
|
nmc->return_value = error->code;
|
|
|
|
|
g_slice_free (ModifyInfo, info);
|
|
|
|
|
quit ();
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (nmc->complete)
|
|
|
|
|
quit ();
|
|
|
|
|
else
|
|
|
|
|
nm_device_reapply_async (device, connection, version_id, 0, NULL, modify_reapply_cb, info);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static NMCResultCode
|
|
|
|
|
do_device_modify (NmCli *nmc, int argc, char **argv)
|
|
|
|
|
{
|
|
|
|
|
NMDevice *device = NULL;
|
|
|
|
|
ModifyInfo *info = NULL;
|
|
|
|
|
gs_free_error GError *error = NULL;
|
|
|
|
|
|
2017-03-30 16:09:46 +02:00
|
|
|
next_arg (nmc, &argc, &argv, NULL);
|
2016-06-22 18:25:48 +02:00
|
|
|
device = get_device (nmc, &argc, &argv, &error);
|
|
|
|
|
if (!device) {
|
|
|
|
|
g_string_printf (nmc->return_text, _("Error: %s."), error->message);
|
|
|
|
|
return error->code;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (nmc->timeout == -1)
|
|
|
|
|
nmc->timeout = 10;
|
|
|
|
|
|
|
|
|
|
nmc->nowait_flag = (nmc->timeout == 0);
|
|
|
|
|
nmc->should_wait++;
|
|
|
|
|
|
|
|
|
|
info = g_slice_new0 (ModifyInfo);
|
|
|
|
|
info->nmc = nmc;
|
|
|
|
|
info->argc = argc;
|
|
|
|
|
info->argv = argv;
|
|
|
|
|
|
|
|
|
|
nm_device_get_applied_connection_async (device, 0, NULL, modify_get_applied_cb, info);
|
|
|
|
|
|
|
|
|
|
return nmc->return_value;
|
|
|
|
|
}
|
|
|
|
|
|
2010-02-25 09:52:30 -08:00
|
|
|
static void
|
2014-09-11 16:27:13 -04:00
|
|
|
disconnect_device_cb (GObject *object, GAsyncResult *result, gpointer user_data)
|
2010-02-25 09:52:30 -08:00
|
|
|
{
|
2014-09-11 16:27:13 -04:00
|
|
|
NMDevice *device = NM_DEVICE (object);
|
2015-03-11 19:10:58 +01:00
|
|
|
DeviceCbInfo *info = (DeviceCbInfo *) user_data;
|
|
|
|
|
NmCli *nmc = info->nmc;
|
2010-02-25 09:52:30 -08:00
|
|
|
NMDeviceState state;
|
2014-09-11 16:27:13 -04:00
|
|
|
GError *error = NULL;
|
2010-02-25 09:52:30 -08:00
|
|
|
|
2014-09-11 16:27:13 -04:00
|
|
|
if (!nm_device_disconnect_finish (device, result, &error)) {
|
2015-03-11 19:10:58 +01:00
|
|
|
g_string_printf (nmc->return_text, _("Error: not all devices disconnected."));
|
|
|
|
|
g_printerr (_("Error: Device '%s' (%s) disconnecting failed: %s\n"),
|
|
|
|
|
nm_device_get_iface (device),
|
|
|
|
|
nm_object_get_path (NM_OBJECT (device)),
|
|
|
|
|
error->message);
|
2014-09-11 16:27:13 -04:00
|
|
|
g_error_free (error);
|
2010-02-25 09:52:30 -08:00
|
|
|
nmc->return_value = NMC_RESULT_ERROR_DEV_DISCONNECT;
|
2015-03-11 19:10:58 +01:00
|
|
|
device_cb_info_finish (info, device);
|
2010-02-25 09:52:30 -08:00
|
|
|
} else {
|
|
|
|
|
state = nm_device_get_state (device);
|
2015-04-23 10:00:47 -04:00
|
|
|
if (nmc->nowait_flag || state <= NM_DEVICE_STATE_DISCONNECTED) {
|
2010-02-25 09:52:30 -08:00
|
|
|
/* Don't want to wait or device already disconnected */
|
2015-04-23 10:00:47 -04:00
|
|
|
if (state <= NM_DEVICE_STATE_DISCONNECTED) {
|
2017-03-30 12:45:41 +02:00
|
|
|
if (nmc->nmc_config.print_output == NMC_PRINT_PRETTY)
|
2013-09-19 15:15:10 +02:00
|
|
|
nmc_terminal_erase_line ();
|
2015-03-11 19:10:58 +01:00
|
|
|
g_print (_("Device '%s' successfully disconnected.\n"),
|
|
|
|
|
nm_device_get_iface (device));
|
2012-05-03 11:54:52 +02:00
|
|
|
}
|
2015-03-11 19:10:58 +01:00
|
|
|
device_cb_info_finish (info, device);
|
2010-02-25 09:52:30 -08:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static NMCResultCode
|
2016-06-23 18:49:39 +02:00
|
|
|
do_devices_disconnect (NmCli *nmc, int argc, char **argv)
|
2010-02-25 09:52:30 -08:00
|
|
|
{
|
2015-03-11 19:10:58 +01:00
|
|
|
NMDevice *device;
|
|
|
|
|
DeviceCbInfo *info = NULL;
|
2015-03-27 12:31:08 +01:00
|
|
|
GSList *queue, *iter;
|
2010-02-25 09:52:30 -08:00
|
|
|
|
2013-05-14 12:43:43 +02:00
|
|
|
/* Set default timeout for disconnect operation. */
|
|
|
|
|
if (nmc->timeout == -1)
|
|
|
|
|
nmc->timeout = 10;
|
2010-02-25 09:52:30 -08:00
|
|
|
|
2017-03-30 16:09:46 +02:00
|
|
|
next_arg (nmc, &argc, &argv, NULL);
|
2016-06-22 18:33:54 +02:00
|
|
|
queue = get_device_list (nmc, argc, argv);
|
2015-03-27 12:31:08 +01:00
|
|
|
if (!queue)
|
2016-06-23 10:49:20 +02:00
|
|
|
return nmc->return_value;
|
|
|
|
|
if (nmc->complete)
|
|
|
|
|
goto out;
|
2015-03-11 19:10:58 +01:00
|
|
|
queue = g_slist_reverse (queue);
|
|
|
|
|
|
|
|
|
|
info = g_slice_new0 (DeviceCbInfo);
|
|
|
|
|
info->nmc = nmc;
|
|
|
|
|
info->cmd_disconnect = TRUE;
|
|
|
|
|
if (nmc->timeout > 0)
|
|
|
|
|
info->timeout_id = g_timeout_add_seconds (nmc->timeout, device_op_timeout_cb, info);
|
|
|
|
|
|
|
|
|
|
g_signal_connect (nmc->client, NM_CLIENT_DEVICE_REMOVED,
|
|
|
|
|
G_CALLBACK (device_removed_cb), info);
|
2010-02-25 09:52:30 -08:00
|
|
|
|
2013-05-14 12:43:43 +02:00
|
|
|
nmc->nowait_flag = (nmc->timeout == 0);
|
2015-03-27 12:39:17 +01:00
|
|
|
nmc->should_wait++;
|
2010-02-25 09:52:30 -08:00
|
|
|
|
2015-03-11 19:10:58 +01:00
|
|
|
for (iter = queue; iter; iter = g_slist_next (iter)) {
|
|
|
|
|
device = iter->data;
|
|
|
|
|
|
|
|
|
|
info->queue = g_slist_prepend (info->queue, g_object_ref (device));
|
|
|
|
|
g_signal_connect (device, "notify::" NM_DEVICE_STATE,
|
|
|
|
|
G_CALLBACK (disconnect_state_cb), info);
|
|
|
|
|
|
|
|
|
|
/* Now disconnect the device */
|
|
|
|
|
nm_device_disconnect_async (device, NULL, disconnect_device_cb, info);
|
|
|
|
|
}
|
2012-05-03 11:54:52 +02:00
|
|
|
|
2016-06-23 10:49:20 +02:00
|
|
|
out:
|
2015-03-11 19:10:58 +01:00
|
|
|
g_slist_free (queue);
|
2010-02-25 09:52:30 -08:00
|
|
|
return nmc->return_value;
|
|
|
|
|
}
|
|
|
|
|
|
2014-06-19 11:25:17 +02:00
|
|
|
static void
|
2014-09-11 16:27:13 -04:00
|
|
|
delete_device_cb (GObject *object, GAsyncResult *result, gpointer user_data)
|
2014-06-19 11:25:17 +02:00
|
|
|
{
|
2014-09-11 16:27:13 -04:00
|
|
|
NMDevice *device = NM_DEVICE (object);
|
2015-03-11 19:10:58 +01:00
|
|
|
DeviceCbInfo *info = (DeviceCbInfo *) user_data;
|
|
|
|
|
NmCli *nmc = info->nmc;
|
2014-09-11 16:27:13 -04:00
|
|
|
GError *error = NULL;
|
2014-06-19 11:25:17 +02:00
|
|
|
|
2014-09-11 16:27:13 -04:00
|
|
|
if (!nm_device_delete_finish (device, result, &error)) {
|
2015-03-11 19:10:58 +01:00
|
|
|
g_string_printf (nmc->return_text, _("Error: not all devices deleted."));
|
|
|
|
|
g_printerr (_("Error: Device '%s' (%s) deletion failed: %s\n"),
|
|
|
|
|
nm_device_get_iface (device),
|
|
|
|
|
nm_object_get_path (NM_OBJECT (device)),
|
|
|
|
|
error->message);
|
2014-09-11 16:27:13 -04:00
|
|
|
g_error_free (error);
|
2014-06-19 11:25:17 +02:00
|
|
|
nmc->return_value = NMC_RESULT_ERROR_UNKNOWN;
|
2015-03-11 19:10:58 +01:00
|
|
|
device_cb_info_finish (info, device);
|
|
|
|
|
} else {
|
|
|
|
|
if (nmc->nowait_flag)
|
|
|
|
|
device_cb_info_finish (info, device);
|
2014-06-19 11:25:17 +02:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static NMCResultCode
|
2016-06-23 18:49:39 +02:00
|
|
|
do_devices_delete (NmCli *nmc, int argc, char **argv)
|
2014-06-19 11:25:17 +02:00
|
|
|
{
|
2015-03-11 19:10:58 +01:00
|
|
|
NMDevice *device;
|
|
|
|
|
DeviceCbInfo *info = NULL;
|
2015-03-27 12:31:08 +01:00
|
|
|
GSList *queue, *iter;
|
2014-06-19 11:25:17 +02:00
|
|
|
|
|
|
|
|
/* Set default timeout for delete operation. */
|
|
|
|
|
if (nmc->timeout == -1)
|
|
|
|
|
nmc->timeout = 10;
|
|
|
|
|
|
2017-03-30 16:09:46 +02:00
|
|
|
next_arg (nmc, &argc, &argv, NULL);
|
2016-06-22 18:33:54 +02:00
|
|
|
queue = get_device_list (nmc, argc, argv);
|
2015-03-27 12:31:08 +01:00
|
|
|
if (!queue)
|
2016-06-23 10:49:20 +02:00
|
|
|
return nmc->return_value;
|
|
|
|
|
if (nmc->complete)
|
|
|
|
|
goto out;
|
2015-03-11 19:10:58 +01:00
|
|
|
queue = g_slist_reverse (queue);
|
2014-06-19 11:25:17 +02:00
|
|
|
|
2015-03-11 19:10:58 +01:00
|
|
|
info = g_slice_new0 (DeviceCbInfo);
|
|
|
|
|
info->nmc = nmc;
|
|
|
|
|
if (nmc->timeout > 0)
|
|
|
|
|
info->timeout_id = g_timeout_add_seconds (nmc->timeout, device_op_timeout_cb, info);
|
|
|
|
|
|
|
|
|
|
g_signal_connect (nmc->client, NM_CLIENT_DEVICE_REMOVED,
|
|
|
|
|
G_CALLBACK (device_removed_cb), info);
|
2014-06-19 11:25:17 +02:00
|
|
|
|
|
|
|
|
nmc->nowait_flag = (nmc->timeout == 0);
|
2015-03-27 12:39:17 +01:00
|
|
|
nmc->should_wait++;
|
2014-06-19 11:25:17 +02:00
|
|
|
|
2015-03-11 19:10:58 +01:00
|
|
|
for (iter = queue; iter; iter = g_slist_next (iter)) {
|
|
|
|
|
device = iter->data;
|
|
|
|
|
|
|
|
|
|
info->queue = g_slist_prepend (info->queue, g_object_ref (device));
|
|
|
|
|
|
|
|
|
|
/* Now delete the device */
|
|
|
|
|
nm_device_delete_async (device, NULL, delete_device_cb, info);
|
|
|
|
|
}
|
2014-06-19 11:25:17 +02:00
|
|
|
|
2016-06-23 10:49:20 +02:00
|
|
|
out:
|
2015-03-11 19:10:58 +01:00
|
|
|
g_slist_free (queue);
|
2014-06-19 11:25:17 +02:00
|
|
|
return nmc->return_value;
|
|
|
|
|
}
|
|
|
|
|
|
2015-03-23 14:11:43 +01:00
|
|
|
static NMCResultCode
|
|
|
|
|
do_device_set (NmCli *nmc, int argc, char **argv)
|
|
|
|
|
{
|
|
|
|
|
#define DEV_SET_AUTOCONNECT 0
|
|
|
|
|
#define DEV_SET_MANAGED 1
|
|
|
|
|
NMDevice *device = NULL;
|
|
|
|
|
int i;
|
|
|
|
|
struct {
|
|
|
|
|
int idx;
|
|
|
|
|
gboolean value;
|
|
|
|
|
} values[2] = {
|
|
|
|
|
[DEV_SET_AUTOCONNECT] = { -1 },
|
|
|
|
|
[DEV_SET_MANAGED] = { -1 },
|
|
|
|
|
};
|
2016-06-24 18:45:19 +02:00
|
|
|
gs_free_error GError *error = NULL;
|
2015-03-23 14:11:43 +01:00
|
|
|
|
2017-03-30 16:09:46 +02:00
|
|
|
next_arg (nmc, &argc, &argv, NULL);
|
|
|
|
|
if (argc >= 1 && g_strcmp0 (*argv, "ifname") == 0)
|
|
|
|
|
next_arg (nmc, &argc, &argv, NULL);
|
2015-09-18 10:49:19 +02:00
|
|
|
|
2016-06-24 18:45:19 +02:00
|
|
|
device = get_device (nmc, &argc, &argv, &error);
|
2015-03-23 14:11:43 +01:00
|
|
|
if (!device) {
|
2016-06-24 18:45:19 +02:00
|
|
|
g_string_printf (nmc->return_text, _("Error: %s."), error->message);
|
|
|
|
|
return error->code;
|
2015-03-23 14:11:43 +01:00
|
|
|
}
|
|
|
|
|
|
2016-06-24 18:45:19 +02:00
|
|
|
if (!argc) {
|
2015-03-23 14:11:43 +01:00
|
|
|
g_string_printf (nmc->return_text, _("Error: No property specified."));
|
2016-06-24 18:45:19 +02:00
|
|
|
return NMC_RESULT_ERROR_USER_INPUT;
|
2015-03-23 14:11:43 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
i = 0;
|
2016-06-24 18:45:19 +02:00
|
|
|
do {
|
2015-03-23 14:11:43 +01:00
|
|
|
gboolean flag;
|
|
|
|
|
|
2016-06-24 18:07:24 +02:00
|
|
|
if (argc == 1 && nmc->complete)
|
|
|
|
|
nmc_complete_strings (*argv, "managed", "autoconnect", NULL);
|
|
|
|
|
|
cli: make match() return boolean
Coccinelle semantic patch:
@@
@@
-int
+gboolean
matches (...);
@@
expression pattern, cmd, len;
@@
-int
+gboolean
matches (...)
{
...
- return memcmp (pattern, cmd, len);
+ return memcmp (pattern, cmd, len) == 0;
}
@@
expression prefix, str;
@@
(
-matches (prefix, str) != 0
+!matches (prefix, str)
|
-matches (prefix, str) == 0
+matches (prefix, str)
)
@@
expression prefix, str;
@@
-(matches (prefix, str))
+matches (prefix, str)
@@
expression prefix, str;
@@
-(!matches (prefix, str))
+!matches (prefix, str)
spatch --smpl-spacing --sp-file match.cocci --dir clients/cli/ \
--include-headers --macro-file shared/nm-utils/gsystem-local-alloc.h
2017-02-15 12:20:55 +01:00
|
|
|
if (matches (*argv, "managed")) {
|
2017-03-29 12:02:14 +02:00
|
|
|
argc--;
|
|
|
|
|
argv++;
|
2017-03-24 14:00:25 +01:00
|
|
|
if (!argc) {
|
2015-11-25 16:39:00 +01:00
|
|
|
g_string_printf (nmc->return_text, _("Error: '%s' argument is missing."), *(argv-1));
|
2016-06-24 18:45:19 +02:00
|
|
|
return NMC_RESULT_ERROR_USER_INPUT;
|
2015-03-23 14:11:43 +01:00
|
|
|
}
|
2016-06-24 18:07:24 +02:00
|
|
|
if (argc == 1 && nmc->complete)
|
|
|
|
|
nmc_complete_bool (*argv);
|
2016-06-24 18:45:19 +02:00
|
|
|
if (!nmc_string_to_bool (*argv, &flag, &error)) {
|
2015-03-23 14:11:43 +01:00
|
|
|
g_string_printf (nmc->return_text, _("Error: 'managed': %s."),
|
2016-06-24 18:45:19 +02:00
|
|
|
error->message);
|
|
|
|
|
return NMC_RESULT_ERROR_USER_INPUT;
|
2015-03-23 14:11:43 +01:00
|
|
|
}
|
|
|
|
|
values[DEV_SET_MANAGED].idx = ++i;
|
|
|
|
|
values[DEV_SET_MANAGED].value = flag;
|
|
|
|
|
}
|
cli: make match() return boolean
Coccinelle semantic patch:
@@
@@
-int
+gboolean
matches (...);
@@
expression pattern, cmd, len;
@@
-int
+gboolean
matches (...)
{
...
- return memcmp (pattern, cmd, len);
+ return memcmp (pattern, cmd, len) == 0;
}
@@
expression prefix, str;
@@
(
-matches (prefix, str) != 0
+!matches (prefix, str)
|
-matches (prefix, str) == 0
+matches (prefix, str)
)
@@
expression prefix, str;
@@
-(matches (prefix, str))
+matches (prefix, str)
@@
expression prefix, str;
@@
-(!matches (prefix, str))
+!matches (prefix, str)
spatch --smpl-spacing --sp-file match.cocci --dir clients/cli/ \
--include-headers --macro-file shared/nm-utils/gsystem-local-alloc.h
2017-02-15 12:20:55 +01:00
|
|
|
else if (matches (*argv, "autoconnect")) {
|
2017-03-29 12:02:14 +02:00
|
|
|
argc--;
|
|
|
|
|
argv++;
|
2017-03-24 14:00:25 +01:00
|
|
|
if (!argc) {
|
2015-11-25 16:39:00 +01:00
|
|
|
g_string_printf (nmc->return_text, _("Error: '%s' argument is missing."), *(argv-1));
|
2016-06-24 18:45:19 +02:00
|
|
|
return NMC_RESULT_ERROR_USER_INPUT;
|
2015-03-23 14:11:43 +01:00
|
|
|
}
|
2016-06-24 18:07:24 +02:00
|
|
|
if (argc == 1 && nmc->complete)
|
|
|
|
|
nmc_complete_bool (*argv);
|
2016-06-24 18:45:19 +02:00
|
|
|
if (!nmc_string_to_bool (*argv, &flag, &error)) {
|
2015-03-23 14:11:43 +01:00
|
|
|
g_string_printf (nmc->return_text, _("Error: 'autoconnect': %s."),
|
2016-06-24 18:45:19 +02:00
|
|
|
error->message);
|
|
|
|
|
return NMC_RESULT_ERROR_USER_INPUT;
|
2015-03-23 14:11:43 +01:00
|
|
|
}
|
|
|
|
|
values[DEV_SET_AUTOCONNECT].idx = ++i;
|
|
|
|
|
values[DEV_SET_AUTOCONNECT].value = flag;
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
g_string_printf (nmc->return_text, _("Error: property '%s' is not known."), *argv);
|
2016-06-24 18:45:19 +02:00
|
|
|
return NMC_RESULT_ERROR_USER_INPUT;
|
2015-03-23 14:11:43 +01:00
|
|
|
}
|
2017-03-30 16:09:46 +02:00
|
|
|
} while (next_arg (nmc, &argc, &argv, NULL) == 0);
|
2015-03-23 14:11:43 +01:00
|
|
|
|
2016-06-24 18:07:24 +02:00
|
|
|
if (nmc->complete)
|
|
|
|
|
return nmc->return_value;
|
|
|
|
|
|
2015-03-23 14:11:43 +01:00
|
|
|
/* when multiple properties are specified, set them in the order as they
|
|
|
|
|
* are specified on the command line. */
|
|
|
|
|
if ( values[DEV_SET_AUTOCONNECT].idx >= 0
|
|
|
|
|
&& values[DEV_SET_MANAGED].idx >= 0
|
|
|
|
|
&& values[DEV_SET_MANAGED].idx < values[DEV_SET_AUTOCONNECT].idx) {
|
|
|
|
|
nm_device_set_managed (device, values[DEV_SET_MANAGED].value);
|
|
|
|
|
values[DEV_SET_MANAGED].idx = -1;
|
|
|
|
|
}
|
|
|
|
|
if (values[DEV_SET_AUTOCONNECT].idx >= 0)
|
|
|
|
|
nm_device_set_autoconnect (device, values[DEV_SET_AUTOCONNECT].value);
|
|
|
|
|
if (values[DEV_SET_MANAGED].idx >= 0)
|
2015-11-06 14:51:40 +01:00
|
|
|
nm_device_set_managed (device, values[DEV_SET_MANAGED].value);
|
2015-03-23 14:11:43 +01:00
|
|
|
|
|
|
|
|
return nmc->return_value;
|
|
|
|
|
}
|
|
|
|
|
|
2015-03-27 13:11:06 +01:00
|
|
|
static void
|
|
|
|
|
device_state (NMDevice *device, GParamSpec *pspec, NmCli *nmc)
|
|
|
|
|
{
|
|
|
|
|
NMDeviceState state = nm_device_get_state (device);
|
2017-04-04 15:12:00 +02:00
|
|
|
NMMetaTermColor color;
|
|
|
|
|
NMMetaTermFormat color_fmt;
|
2016-07-01 21:45:43 +02:00
|
|
|
char *str;
|
|
|
|
|
|
|
|
|
|
nmc_device_state_to_color (state, &color, &color_fmt);
|
2017-03-30 12:23:26 +02:00
|
|
|
str = nmc_colorize (nmc->nmc_config.use_colors, color, color_fmt, "%s: %s\n",
|
2016-07-01 21:45:43 +02:00
|
|
|
nm_device_get_iface (device),
|
|
|
|
|
nmc_device_state_to_string (state));
|
2015-03-27 13:11:06 +01:00
|
|
|
|
|
|
|
|
g_print ("%s", str);
|
|
|
|
|
g_free (str);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
|
device_ac (NMDevice *device, GParamSpec *pspec, NmCli *nmc)
|
|
|
|
|
{
|
|
|
|
|
NMActiveConnection *ac = nm_device_get_active_connection (device);
|
|
|
|
|
const char *id = ac ? nm_active_connection_get_id (ac) : NULL;
|
|
|
|
|
|
|
|
|
|
if (!id)
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
g_print (_("%s: using connection '%s'\n"), nm_device_get_iface (device), id);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
|
device_watch (NmCli *nmc, NMDevice *device)
|
|
|
|
|
{
|
|
|
|
|
nmc->should_wait++;
|
|
|
|
|
g_signal_connect (device, "notify::" NM_DEVICE_STATE, G_CALLBACK (device_state), nmc);
|
|
|
|
|
g_signal_connect (device, "notify::" NM_DEVICE_ACTIVE_CONNECTION, G_CALLBACK (device_ac), nmc);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
|
device_unwatch (NmCli *nmc, NMDevice *device)
|
|
|
|
|
{
|
|
|
|
|
g_signal_handlers_disconnect_by_func (device, device_state, nmc);
|
|
|
|
|
if (g_signal_handlers_disconnect_by_func (device, device_ac, nmc))
|
|
|
|
|
nmc->should_wait--;
|
|
|
|
|
|
|
|
|
|
/* Terminate if all the watched devices disappeared. */
|
|
|
|
|
if (!nmc->should_wait)
|
|
|
|
|
quit ();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
|
device_added (NMClient *client, NMDevice *device, NmCli *nmc)
|
|
|
|
|
{
|
|
|
|
|
g_print (_("%s: device created\n"), nm_device_get_iface (device));
|
|
|
|
|
device_watch (nmc, NM_DEVICE (device));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
|
device_removed (NMClient *client, NMDevice *device, NmCli *nmc)
|
|
|
|
|
{
|
|
|
|
|
g_print (_("%s: device removed\n"), nm_device_get_iface (device));
|
|
|
|
|
device_unwatch (nmc, device);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static NMCResultCode
|
2016-06-23 18:49:39 +02:00
|
|
|
do_devices_monitor (NmCli *nmc, int argc, char **argv)
|
2015-03-27 13:11:06 +01:00
|
|
|
{
|
2016-06-23 10:49:20 +02:00
|
|
|
if (nmc->complete)
|
|
|
|
|
return nmc->return_value;
|
|
|
|
|
|
2017-03-30 16:09:46 +02:00
|
|
|
next_arg (nmc, &argc, &argv, NULL);
|
2015-03-27 13:11:06 +01:00
|
|
|
if (argc == 0) {
|
|
|
|
|
/* No devices specified. Monitor all. */
|
|
|
|
|
const GPtrArray *devices = nm_client_get_devices (nmc->client);
|
|
|
|
|
int i;
|
|
|
|
|
|
|
|
|
|
for (i = 0; i < devices->len; i++)
|
|
|
|
|
device_watch (nmc, g_ptr_array_index (devices, i));
|
|
|
|
|
|
|
|
|
|
/* We'll watch the device additions too, never exit. */
|
|
|
|
|
nmc->should_wait++;
|
|
|
|
|
g_signal_connect (nmc->client, NM_CLIENT_DEVICE_ADDED, G_CALLBACK (device_added), nmc);
|
|
|
|
|
} else {
|
2017-04-11 15:39:08 +02:00
|
|
|
GSList *queue = get_device_list (nmc, argc, argv);
|
|
|
|
|
GSList *iter;
|
|
|
|
|
|
2016-06-23 10:49:20 +02:00
|
|
|
/* Monitor the specified devices. */
|
2015-03-27 13:11:06 +01:00
|
|
|
for (iter = queue; iter; iter = g_slist_next (iter))
|
|
|
|
|
device_watch (nmc, NM_DEVICE (iter->data));
|
|
|
|
|
g_slist_free (queue);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
g_signal_connect (nmc->client, NM_CLIENT_DEVICE_REMOVED, G_CALLBACK (device_removed), nmc);
|
2016-06-23 10:49:20 +02:00
|
|
|
return nmc->return_value;
|
2015-03-27 13:11:06 +01:00
|
|
|
}
|
|
|
|
|
|
2010-02-25 09:52:30 -08:00
|
|
|
static void
|
2017-03-30 14:56:19 +02:00
|
|
|
show_access_point_info (NMDevice *device, NmCli *nmc, NmcOutputData *out)
|
2010-02-25 09:52:30 -08:00
|
|
|
{
|
|
|
|
|
NMAccessPoint *active_ap = NULL;
|
|
|
|
|
const char *active_bssid = NULL;
|
2015-02-26 11:51:07 +01:00
|
|
|
GPtrArray *aps;
|
2013-05-22 08:37:50 +02:00
|
|
|
NmcOutputField *arr;
|
2010-02-25 09:52:30 -08:00
|
|
|
|
|
|
|
|
if (nm_device_get_state (device) == NM_DEVICE_STATE_ACTIVATED) {
|
|
|
|
|
active_ap = nm_device_wifi_get_active_access_point (NM_DEVICE_WIFI (device));
|
2011-09-06 13:37:23 +02:00
|
|
|
active_bssid = active_ap ? nm_access_point_get_bssid (active_ap) : NULL;
|
2010-02-25 09:52:30 -08:00
|
|
|
}
|
|
|
|
|
|
cli: split tracking of meta data out of NmcOutputField
When generating output data, nmcli iterates over a list of
property-descriptors (nmc_fields_ip4_config), creates an intermediate
array (output_data) and finally prints it.
However, previously both the meta data (nmc_fields_ip4_config) and
the intermediate format use the same type NmcOutputField. This means,
certain fields are relevant to describe a property, and other fields
are output/formatting fields.
Split this up. Now, the meta data is tracked in form of an NMMetaAbstractInfo
lists. This separates the information about properties from intermediate steps
during creation of the output.
Note that currently functions like print_ip4_config() still have all the
knowledge about how to generate the output. That is wrong, instead, the
meta data (NMMetaAbstractInfo) should describe how to create the output
and then all those functions could be replaced. This means, later we want
to add more knowledge to the NMMetaAbstractInfo, so it is important to
keep them separate from NmcOutputField.
2017-03-31 19:18:16 +02:00
|
|
|
arr = nmc_dup_fields_array ((const NMMetaAbstractInfo *const*) nmc_fields_dev_wifi_list,
|
2013-05-22 08:37:50 +02:00
|
|
|
NMC_OF_FLAG_MAIN_HEADER_ADD | NMC_OF_FLAG_FIELD_NAMES);
|
2017-03-30 14:56:19 +02:00
|
|
|
g_ptr_array_add (out->output_data, arr);
|
2013-05-22 08:37:50 +02:00
|
|
|
|
2017-03-30 14:56:19 +02:00
|
|
|
{
|
|
|
|
|
APInfo info = {
|
|
|
|
|
.nmc = nmc,
|
|
|
|
|
.index = 1,
|
|
|
|
|
.output_flags = 0,
|
|
|
|
|
.active_bssid = active_bssid,
|
|
|
|
|
.device = nm_device_get_iface (device),
|
|
|
|
|
.output_data = out->output_data,
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
aps = sort_access_points (nm_device_wifi_get_access_points (NM_DEVICE_WIFI (device)));
|
|
|
|
|
g_ptr_array_foreach (aps, fill_output_access_point, &info);
|
|
|
|
|
g_ptr_array_free (aps, FALSE);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
print_data_prepare_width (out->output_data);
|
2010-02-25 09:52:30 -08:00
|
|
|
}
|
|
|
|
|
|
2016-07-12 00:13:30 +02:00
|
|
|
/*
|
|
|
|
|
* Find a Wi-Fi device with 'iface' in 'devices' array. If 'iface' is NULL,
|
|
|
|
|
* the first Wi-Fi device is returned. 'idx' parameter is updated to the point
|
|
|
|
|
* where the function finished so that the function can be called repeatedly
|
|
|
|
|
* to get next matching device.
|
|
|
|
|
* Returns: found device or NULL
|
|
|
|
|
*/
|
|
|
|
|
static NMDevice *
|
2016-07-12 14:45:36 +02:00
|
|
|
find_wifi_device_by_iface (NMDevice **devices, const char *iface, int *idx)
|
2016-07-12 00:13:30 +02:00
|
|
|
{
|
|
|
|
|
int i;
|
|
|
|
|
|
2016-07-12 12:33:31 +02:00
|
|
|
for (i = idx ? *idx : 0; devices[i]; i++) {
|
2016-07-12 14:45:36 +02:00
|
|
|
const char *dev_iface = nm_device_get_iface (devices[i]);
|
2016-07-12 00:13:30 +02:00
|
|
|
|
2016-07-12 14:45:36 +02:00
|
|
|
if (!NM_IS_DEVICE_WIFI (devices[i]))
|
2016-07-12 00:13:30 +02:00
|
|
|
continue;
|
|
|
|
|
|
|
|
|
|
if (iface) {
|
|
|
|
|
/* If a iface was specified then use it. */
|
2016-07-12 14:45:36 +02:00
|
|
|
if (g_strcmp0 (dev_iface, iface) == 0)
|
2016-07-12 00:13:30 +02:00
|
|
|
break;
|
|
|
|
|
} else {
|
|
|
|
|
/* Else return the first Wi-Fi device. */
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2016-07-12 12:33:31 +02:00
|
|
|
if (idx)
|
|
|
|
|
*idx = i + 1;
|
2016-07-12 14:45:36 +02:00
|
|
|
return devices[i];
|
2016-07-12 00:13:30 +02:00
|
|
|
}
|
|
|
|
|
|
2016-07-12 14:31:25 +02:00
|
|
|
/*
|
|
|
|
|
* Find AP on 'device' according to 'bssid' or 'ssid' parameter.
|
|
|
|
|
* Returns: found AP or NULL
|
|
|
|
|
*/
|
|
|
|
|
static NMAccessPoint *
|
2016-07-12 14:36:53 +02:00
|
|
|
find_ap_on_device (NMDevice *device, const char *bssid, const char *ssid, gboolean complete)
|
2016-07-12 14:31:25 +02:00
|
|
|
{
|
|
|
|
|
const GPtrArray *aps;
|
|
|
|
|
NMAccessPoint *ap = NULL;
|
|
|
|
|
int i;
|
|
|
|
|
|
|
|
|
|
g_return_val_if_fail (NM_IS_DEVICE_WIFI (device), NULL);
|
|
|
|
|
|
|
|
|
|
aps = nm_device_wifi_get_access_points (NM_DEVICE_WIFI (device));
|
|
|
|
|
for (i = 0; i < aps->len; i++) {
|
|
|
|
|
NMAccessPoint *candidate_ap = g_ptr_array_index (aps, i);
|
|
|
|
|
|
2016-07-12 14:36:53 +02:00
|
|
|
if (bssid) {
|
|
|
|
|
/* Parameter is BSSID */
|
|
|
|
|
const char *candidate_bssid = nm_access_point_get_bssid (candidate_ap);
|
|
|
|
|
|
|
|
|
|
/* Compare BSSIDs */
|
|
|
|
|
if (complete) {
|
|
|
|
|
if (g_str_has_prefix (candidate_bssid, bssid))
|
|
|
|
|
g_print ("%s\n", candidate_bssid);
|
|
|
|
|
} else if (strcmp (bssid, candidate_bssid) == 0) {
|
|
|
|
|
ap = candidate_ap;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2016-07-12 14:31:25 +02:00
|
|
|
if (ssid) {
|
|
|
|
|
/* Parameter is SSID */
|
|
|
|
|
GBytes *candidate_ssid;
|
2016-07-12 14:36:53 +02:00
|
|
|
char *ssid_tmp;
|
2016-07-12 14:31:25 +02:00
|
|
|
|
|
|
|
|
candidate_ssid = nm_access_point_get_ssid (candidate_ap);
|
2016-07-12 14:36:53 +02:00
|
|
|
if (!candidate_ssid)
|
|
|
|
|
continue;
|
2016-07-12 14:31:25 +02:00
|
|
|
|
2016-07-12 14:36:53 +02:00
|
|
|
ssid_tmp = nm_utils_ssid_to_utf8 (g_bytes_get_data (candidate_ssid, NULL),
|
|
|
|
|
g_bytes_get_size (candidate_ssid));
|
|
|
|
|
|
|
|
|
|
/* Compare SSIDs */
|
|
|
|
|
if (complete) {
|
|
|
|
|
if (g_str_has_prefix (ssid_tmp, ssid))
|
|
|
|
|
g_print ("%s\n", ssid_tmp);
|
|
|
|
|
} else if (strcmp (ssid, ssid_tmp) == 0) {
|
2016-07-12 14:31:25 +02:00
|
|
|
ap = candidate_ap;
|
2016-07-12 14:36:53 +02:00
|
|
|
g_free (ssid_tmp);
|
2016-07-12 14:31:25 +02:00
|
|
|
break;
|
|
|
|
|
}
|
2016-07-12 14:36:53 +02:00
|
|
|
g_free (ssid_tmp);
|
2016-07-12 14:31:25 +02:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return ap;
|
|
|
|
|
}
|
|
|
|
|
|
2016-07-12 14:36:53 +02:00
|
|
|
static void
|
|
|
|
|
complete_aps (NMDevice **devices, const char *ifname,
|
|
|
|
|
const char *bssid_prefix, const char *ssid_prefix)
|
|
|
|
|
{
|
|
|
|
|
int devices_idx = 0;
|
|
|
|
|
NMDevice *device;
|
|
|
|
|
|
|
|
|
|
while ((device = find_wifi_device_by_iface (devices, ifname, &devices_idx)))
|
|
|
|
|
find_ap_on_device (device, bssid_prefix, ssid_prefix, TRUE);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
nmc_complete_bssid (NMClient *client, const char *ifname, const char *bssid_prefix)
|
|
|
|
|
{
|
|
|
|
|
gs_free NMDevice **devices = NULL;
|
|
|
|
|
|
|
|
|
|
devices = nmc_get_devices_sorted (client);
|
|
|
|
|
complete_aps (devices, ifname, bssid_prefix, NULL);
|
|
|
|
|
}
|
|
|
|
|
|
2010-02-25 09:52:30 -08:00
|
|
|
static NMCResultCode
|
|
|
|
|
do_device_wifi_list (NmCli *nmc, int argc, char **argv)
|
|
|
|
|
{
|
2010-03-18 15:39:15 +01:00
|
|
|
GError *error = NULL;
|
2010-02-25 09:52:30 -08:00
|
|
|
NMDevice *device = NULL;
|
2010-03-18 15:39:15 +01:00
|
|
|
NMAccessPoint *ap = NULL;
|
2013-04-18 14:54:01 +02:00
|
|
|
const char *ifname = NULL;
|
2011-09-06 13:37:23 +02:00
|
|
|
const char *bssid_user = NULL;
|
2016-07-12 10:16:24 +02:00
|
|
|
gs_free NMDevice **devices = NULL;
|
2010-03-18 15:39:15 +01:00
|
|
|
const GPtrArray *aps;
|
|
|
|
|
APInfo *info;
|
|
|
|
|
int i, j;
|
cli: split tracking of meta data out of NmcOutputField
When generating output data, nmcli iterates over a list of
property-descriptors (nmc_fields_ip4_config), creates an intermediate
array (output_data) and finally prints it.
However, previously both the meta data (nmc_fields_ip4_config) and
the intermediate format use the same type NmcOutputField. This means,
certain fields are relevant to describe a property, and other fields
are output/formatting fields.
Split this up. Now, the meta data is tracked in form of an NMMetaAbstractInfo
lists. This separates the information about properties from intermediate steps
during creation of the output.
Note that currently functions like print_ip4_config() still have all the
knowledge about how to generate the output. That is wrong, instead, the
meta data (NMMetaAbstractInfo) should describe how to create the output
and then all those functions could be replaced. This means, later we want
to add more knowledge to the NMMetaAbstractInfo, so it is important to
keep them separate from NmcOutputField.
2017-03-31 19:18:16 +02:00
|
|
|
const char *fields_str = NULL;
|
|
|
|
|
const NMMetaAbstractInfo *const*tmpl;
|
|
|
|
|
NmcOutputField *arr;
|
2013-05-22 08:37:50 +02:00
|
|
|
const char *base_hdr = _("Wi-Fi scan list");
|
2017-03-30 14:56:19 +02:00
|
|
|
NMC_OUTPUT_DATA_DEFINE_SCOPED (out);
|
2017-03-31 13:21:47 +02:00
|
|
|
gs_free char *header_name = NULL;
|
2010-02-25 09:52:30 -08:00
|
|
|
|
2016-07-12 10:16:24 +02:00
|
|
|
devices = nmc_get_devices_sorted (nmc->client);
|
2016-06-24 19:03:36 +02:00
|
|
|
|
2017-03-30 16:09:46 +02:00
|
|
|
next_arg (nmc, &argc, &argv, NULL);
|
2010-02-25 09:52:30 -08:00
|
|
|
while (argc > 0) {
|
2016-07-12 10:16:24 +02:00
|
|
|
if (argc == 1 && nmc->complete)
|
|
|
|
|
nmc_complete_strings (*argv, "ifname", "bssid", NULL);
|
|
|
|
|
|
2013-04-18 14:54:01 +02:00
|
|
|
if (strcmp (*argv, "ifname") == 0) {
|
2017-03-29 12:02:14 +02:00
|
|
|
argc--;
|
|
|
|
|
argv++;
|
2017-03-24 14:00:25 +01:00
|
|
|
if (!argc) {
|
2012-11-16 22:43:29 +01:00
|
|
|
g_string_printf (nmc->return_text, _("Error: %s argument is missing."), *(argv-1));
|
2016-07-12 10:16:24 +02:00
|
|
|
return NMC_RESULT_ERROR_USER_INPUT;
|
2010-02-25 09:52:30 -08:00
|
|
|
}
|
2013-04-18 14:54:01 +02:00
|
|
|
ifname = *argv;
|
2017-06-11 22:31:43 +02:00
|
|
|
if (argc == 1 && nmc->complete)
|
|
|
|
|
complete_device (devices, ifname, TRUE);
|
2011-09-06 13:37:23 +02:00
|
|
|
} else if (strcmp (*argv, "bssid") == 0 || strcmp (*argv, "hwaddr") == 0) {
|
|
|
|
|
/* hwaddr is deprecated and will be removed later */
|
2017-03-29 12:02:14 +02:00
|
|
|
argc--;
|
|
|
|
|
argv++;
|
2017-03-24 14:00:25 +01:00
|
|
|
if (!argc) {
|
2012-11-16 22:43:29 +01:00
|
|
|
g_string_printf (nmc->return_text, _("Error: %s argument is missing."), *(argv-1));
|
2016-07-12 10:16:24 +02:00
|
|
|
return NMC_RESULT_ERROR_USER_INPUT;
|
2010-03-18 15:39:15 +01:00
|
|
|
}
|
2011-09-06 13:37:23 +02:00
|
|
|
bssid_user = *argv;
|
2016-07-12 10:16:24 +02:00
|
|
|
if (argc == 1 && nmc->complete)
|
|
|
|
|
complete_aps (devices, NULL, bssid_user, NULL);
|
|
|
|
|
} else if (!nmc->complete) {
|
2014-09-19 16:04:40 -04:00
|
|
|
g_printerr (_("Unknown parameter: %s\n"), *argv);
|
2010-02-25 09:52:30 -08:00
|
|
|
}
|
|
|
|
|
|
2017-03-30 16:09:46 +02:00
|
|
|
next_arg (nmc, &argc, &argv, NULL);
|
2010-02-25 09:52:30 -08:00
|
|
|
}
|
|
|
|
|
|
2010-03-18 15:39:15 +01:00
|
|
|
if (!nmc->required_fields || strcasecmp (nmc->required_fields, "common") == 0)
|
cli: split tracking of meta data out of NmcOutputField
When generating output data, nmcli iterates over a list of
property-descriptors (nmc_fields_ip4_config), creates an intermediate
array (output_data) and finally prints it.
However, previously both the meta data (nmc_fields_ip4_config) and
the intermediate format use the same type NmcOutputField. This means,
certain fields are relevant to describe a property, and other fields
are output/formatting fields.
Split this up. Now, the meta data is tracked in form of an NMMetaAbstractInfo
lists. This separates the information about properties from intermediate steps
during creation of the output.
Note that currently functions like print_ip4_config() still have all the
knowledge about how to generate the output. That is wrong, instead, the
meta data (NMMetaAbstractInfo) should describe how to create the output
and then all those functions could be replaced. This means, later we want
to add more knowledge to the NMMetaAbstractInfo, so it is important to
keep them separate from NmcOutputField.
2017-03-31 19:18:16 +02:00
|
|
|
fields_str = NMC_FIELDS_DEV_WIFI_LIST_COMMON;
|
|
|
|
|
else if (!nmc->required_fields || strcasecmp (nmc->required_fields, "all") == 0) {
|
|
|
|
|
} else
|
2010-03-18 15:39:15 +01:00
|
|
|
fields_str = nmc->required_fields;
|
|
|
|
|
|
cli: split tracking of meta data out of NmcOutputField
When generating output data, nmcli iterates over a list of
property-descriptors (nmc_fields_ip4_config), creates an intermediate
array (output_data) and finally prints it.
However, previously both the meta data (nmc_fields_ip4_config) and
the intermediate format use the same type NmcOutputField. This means,
certain fields are relevant to describe a property, and other fields
are output/formatting fields.
Split this up. Now, the meta data is tracked in form of an NMMetaAbstractInfo
lists. This separates the information about properties from intermediate steps
during creation of the output.
Note that currently functions like print_ip4_config() still have all the
knowledge about how to generate the output. That is wrong, instead, the
meta data (NMMetaAbstractInfo) should describe how to create the output
and then all those functions could be replaced. This means, later we want
to add more knowledge to the NMMetaAbstractInfo, so it is important to
keep them separate from NmcOutputField.
2017-03-31 19:18:16 +02:00
|
|
|
tmpl = (const NMMetaAbstractInfo *const*) nmc_fields_dev_wifi_list;
|
2017-03-31 13:21:47 +02:00
|
|
|
out_indices = parse_output_fields (fields_str, tmpl, FALSE, NULL, &error);
|
2010-03-18 15:39:15 +01:00
|
|
|
|
|
|
|
|
if (error) {
|
2013-12-10 12:00:53 +01:00
|
|
|
g_string_printf (nmc->return_text, _("Error: 'device wifi': %s"), error->message);
|
2010-03-18 15:39:15 +01:00
|
|
|
g_error_free (error);
|
2016-07-12 10:16:24 +02:00
|
|
|
return NMC_RESULT_ERROR_USER_INPUT;
|
2010-03-18 15:39:15 +01:00
|
|
|
}
|
|
|
|
|
|
2016-07-12 10:16:24 +02:00
|
|
|
if (nmc->complete)
|
|
|
|
|
return nmc->return_value;
|
|
|
|
|
|
2013-04-18 14:54:01 +02:00
|
|
|
if (ifname) {
|
2017-03-31 13:21:47 +02:00
|
|
|
|
2016-07-12 10:16:47 +02:00
|
|
|
device = find_wifi_device_by_iface (devices, ifname, NULL);
|
2010-02-25 09:52:30 -08:00
|
|
|
if (!device) {
|
2013-04-18 14:54:01 +02:00
|
|
|
g_string_printf (nmc->return_text, _("Error: Device '%s' not found."), ifname);
|
2016-07-12 10:16:24 +02:00
|
|
|
return NMC_RESULT_ERROR_NOT_FOUND;
|
2010-02-25 09:52:30 -08:00
|
|
|
}
|
2013-05-22 08:37:50 +02:00
|
|
|
/* Main header name */
|
2017-03-31 13:21:47 +02:00
|
|
|
header_name = construct_header_name (base_hdr, ifname);
|
2013-05-22 08:37:50 +02:00
|
|
|
|
2010-03-18 15:39:15 +01:00
|
|
|
if (NM_IS_DEVICE_WIFI (device)) {
|
2011-09-06 13:37:23 +02:00
|
|
|
if (bssid_user) {
|
2010-03-18 15:39:15 +01:00
|
|
|
/* Specific AP requested - list only that */
|
|
|
|
|
aps = nm_device_wifi_get_access_points (NM_DEVICE_WIFI (device));
|
2014-08-25 10:33:53 -04:00
|
|
|
for (j = 0; j < aps->len; j++) {
|
2011-09-06 13:37:23 +02:00
|
|
|
char *bssid_up;
|
2010-03-18 15:39:15 +01:00
|
|
|
NMAccessPoint *candidate_ap = g_ptr_array_index (aps, j);
|
2011-09-06 13:37:23 +02:00
|
|
|
const char *candidate_bssid = nm_access_point_get_bssid (candidate_ap);
|
2010-03-18 15:39:15 +01:00
|
|
|
|
2011-09-06 13:37:23 +02:00
|
|
|
bssid_up = g_ascii_strup (bssid_user, -1);
|
|
|
|
|
if (!strcmp (bssid_up, candidate_bssid))
|
2010-03-18 15:39:15 +01:00
|
|
|
ap = candidate_ap;
|
2011-09-06 13:37:23 +02:00
|
|
|
g_free (bssid_up);
|
2010-03-18 15:39:15 +01:00
|
|
|
}
|
|
|
|
|
if (!ap) {
|
2013-05-22 08:37:50 +02:00
|
|
|
g_string_printf (nmc->return_text, _("Error: Access point with bssid '%s' not found."),
|
|
|
|
|
bssid_user);
|
2016-07-12 10:16:24 +02:00
|
|
|
return NMC_RESULT_ERROR_NOT_FOUND;
|
2010-03-18 15:39:15 +01:00
|
|
|
}
|
2013-05-22 08:37:50 +02:00
|
|
|
/* Add headers (field names) */
|
cli: split tracking of meta data out of NmcOutputField
When generating output data, nmcli iterates over a list of
property-descriptors (nmc_fields_ip4_config), creates an intermediate
array (output_data) and finally prints it.
However, previously both the meta data (nmc_fields_ip4_config) and
the intermediate format use the same type NmcOutputField. This means,
certain fields are relevant to describe a property, and other fields
are output/formatting fields.
Split this up. Now, the meta data is tracked in form of an NMMetaAbstractInfo
lists. This separates the information about properties from intermediate steps
during creation of the output.
Note that currently functions like print_ip4_config() still have all the
knowledge about how to generate the output. That is wrong, instead, the
meta data (NMMetaAbstractInfo) should describe how to create the output
and then all those functions could be replaced. This means, later we want
to add more knowledge to the NMMetaAbstractInfo, so it is important to
keep them separate from NmcOutputField.
2017-03-31 19:18:16 +02:00
|
|
|
arr = nmc_dup_fields_array (tmpl, NMC_OF_FLAG_MAIN_HEADER_ADD | NMC_OF_FLAG_FIELD_NAMES);
|
2017-03-30 14:56:19 +02:00
|
|
|
g_ptr_array_add (out.output_data, arr);
|
2013-05-22 08:37:50 +02:00
|
|
|
|
2010-03-18 15:39:15 +01:00
|
|
|
info = g_malloc0 (sizeof (APInfo));
|
|
|
|
|
info->nmc = nmc;
|
2010-03-24 19:05:35 +01:00
|
|
|
info->index = 1;
|
2013-05-22 08:37:50 +02:00
|
|
|
info->output_flags = 0;
|
2010-03-18 15:39:15 +01:00
|
|
|
info->active_bssid = NULL;
|
|
|
|
|
info->device = nm_device_get_iface (device);
|
2013-05-22 08:37:50 +02:00
|
|
|
|
|
|
|
|
fill_output_access_point (ap, info);
|
|
|
|
|
|
2017-03-30 14:56:19 +02:00
|
|
|
print_data_prepare_width (out.output_data);
|
2017-03-31 13:21:47 +02:00
|
|
|
print_data (&nmc->nmc_config, out_indices, header_name, 0, &out);
|
2010-03-18 15:39:15 +01:00
|
|
|
g_free (info);
|
|
|
|
|
} else {
|
2017-03-30 14:56:19 +02:00
|
|
|
show_access_point_info (device, nmc, &out);
|
2017-03-31 13:21:47 +02:00
|
|
|
print_data (&nmc->nmc_config, out_indices, NULL, 0, &out);
|
2010-03-18 15:39:15 +01:00
|
|
|
}
|
2010-02-25 09:52:30 -08:00
|
|
|
} else {
|
2015-04-14 14:35:14 +02:00
|
|
|
if ( nm_device_get_device_type (device) == NM_DEVICE_TYPE_GENERIC
|
2016-06-05 11:46:06 +02:00
|
|
|
&& g_strcmp0 (nm_device_get_type_description (device), "wifi") == 0) {
|
|
|
|
|
g_string_printf (nmc->return_text,
|
|
|
|
|
_("Error: Device '%s' was not recognized as a Wi-Fi device, check NetworkManager Wi-Fi plugin."),
|
|
|
|
|
ifname);
|
|
|
|
|
} else {
|
|
|
|
|
g_string_printf (nmc->return_text,
|
|
|
|
|
_("Error: Device '%s' is not a Wi-Fi device."),
|
|
|
|
|
ifname);
|
|
|
|
|
}
|
2016-07-12 10:16:24 +02:00
|
|
|
return NMC_RESULT_ERROR_UNKNOWN;
|
2010-02-25 09:52:30 -08:00
|
|
|
}
|
|
|
|
|
} else {
|
2014-08-18 12:41:01 +02:00
|
|
|
gboolean empty_line = FALSE;
|
|
|
|
|
|
2010-03-18 15:39:15 +01:00
|
|
|
/* List APs for all devices */
|
2011-09-06 13:37:23 +02:00
|
|
|
if (bssid_user) {
|
2010-03-18 15:39:15 +01:00
|
|
|
/* Specific AP requested - list only that */
|
2013-04-24 15:27:11 -04:00
|
|
|
for (i = 0; devices[i]; i++) {
|
|
|
|
|
NMDevice *dev = devices[i];
|
2017-03-31 12:32:23 +02:00
|
|
|
NMC_OUTPUT_DATA_DEFINE_SCOPED (out2);
|
2017-03-31 13:21:47 +02:00
|
|
|
gs_free char *header_name2 = NULL;
|
2010-03-18 15:39:15 +01:00
|
|
|
|
|
|
|
|
if (!NM_IS_DEVICE_WIFI (dev))
|
|
|
|
|
continue;
|
|
|
|
|
|
2013-05-22 08:37:50 +02:00
|
|
|
/* Main header name */
|
2017-03-31 13:21:47 +02:00
|
|
|
header_name2 = construct_header_name (base_hdr, nm_device_get_iface (dev));
|
|
|
|
|
out2_indices = parse_output_fields (fields_str, tmpl, FALSE, NULL, NULL);
|
2013-05-22 08:37:50 +02:00
|
|
|
|
cli: split tracking of meta data out of NmcOutputField
When generating output data, nmcli iterates over a list of
property-descriptors (nmc_fields_ip4_config), creates an intermediate
array (output_data) and finally prints it.
However, previously both the meta data (nmc_fields_ip4_config) and
the intermediate format use the same type NmcOutputField. This means,
certain fields are relevant to describe a property, and other fields
are output/formatting fields.
Split this up. Now, the meta data is tracked in form of an NMMetaAbstractInfo
lists. This separates the information about properties from intermediate steps
during creation of the output.
Note that currently functions like print_ip4_config() still have all the
knowledge about how to generate the output. That is wrong, instead, the
meta data (NMMetaAbstractInfo) should describe how to create the output
and then all those functions could be replaced. This means, later we want
to add more knowledge to the NMMetaAbstractInfo, so it is important to
keep them separate from NmcOutputField.
2017-03-31 19:18:16 +02:00
|
|
|
arr = nmc_dup_fields_array (tmpl, NMC_OF_FLAG_MAIN_HEADER_ADD | NMC_OF_FLAG_FIELD_NAMES);
|
2017-03-31 12:32:23 +02:00
|
|
|
g_ptr_array_add (out2.output_data, arr);
|
2013-05-22 08:37:50 +02:00
|
|
|
|
2010-03-18 15:39:15 +01:00
|
|
|
aps = nm_device_wifi_get_access_points (NM_DEVICE_WIFI (dev));
|
2014-08-25 10:33:53 -04:00
|
|
|
for (j = 0; j < aps->len; j++) {
|
2011-09-06 13:37:23 +02:00
|
|
|
char *bssid_up;
|
2010-03-18 15:39:15 +01:00
|
|
|
NMAccessPoint *candidate_ap = g_ptr_array_index (aps, j);
|
2011-09-06 13:37:23 +02:00
|
|
|
const char *candidate_bssid = nm_access_point_get_bssid (candidate_ap);
|
2010-03-18 15:39:15 +01:00
|
|
|
|
2011-09-06 13:37:23 +02:00
|
|
|
bssid_up = g_ascii_strup (bssid_user, -1);
|
|
|
|
|
if (!strcmp (bssid_up, candidate_bssid)) {
|
2010-03-18 15:39:15 +01:00
|
|
|
ap = candidate_ap;
|
|
|
|
|
|
|
|
|
|
info = g_malloc0 (sizeof (APInfo));
|
|
|
|
|
info->nmc = nmc;
|
2010-03-24 19:05:35 +01:00
|
|
|
info->index = 1;
|
2013-05-22 08:37:50 +02:00
|
|
|
info->output_flags = 0;
|
2010-03-18 15:39:15 +01:00
|
|
|
info->active_bssid = NULL;
|
|
|
|
|
info->device = nm_device_get_iface (dev);
|
2013-05-22 08:37:50 +02:00
|
|
|
fill_output_access_point (ap, info);
|
2010-03-18 15:39:15 +01:00
|
|
|
g_free (info);
|
|
|
|
|
}
|
2011-09-06 13:37:23 +02:00
|
|
|
g_free (bssid_up);
|
2010-03-18 15:39:15 +01:00
|
|
|
}
|
2014-08-18 12:41:01 +02:00
|
|
|
if (empty_line)
|
2014-09-19 16:04:40 -04:00
|
|
|
g_print ("\n"); /* Empty line between devices' APs */
|
2017-03-31 12:32:23 +02:00
|
|
|
print_data_prepare_width (out2.output_data);
|
2017-03-31 13:21:47 +02:00
|
|
|
print_data (&nmc->nmc_config, out2_indices, header_name2, 0, &out2);
|
2014-08-18 12:41:01 +02:00
|
|
|
empty_line = TRUE;
|
2010-02-25 09:52:30 -08:00
|
|
|
}
|
2010-03-18 15:39:15 +01:00
|
|
|
if (!ap) {
|
2013-05-22 08:37:50 +02:00
|
|
|
g_string_printf (nmc->return_text, _("Error: Access point with bssid '%s' not found."),
|
|
|
|
|
bssid_user);
|
2016-07-12 10:16:24 +02:00
|
|
|
return NMC_RESULT_ERROR_NOT_FOUND;
|
2010-02-25 09:52:30 -08:00
|
|
|
}
|
|
|
|
|
} else {
|
2013-04-24 15:27:11 -04:00
|
|
|
for (i = 0; devices[i]; i++) {
|
|
|
|
|
NMDevice *dev = devices[i];
|
2017-03-30 14:56:19 +02:00
|
|
|
NMC_OUTPUT_DATA_DEFINE_SCOPED (out2);
|
2017-03-31 13:21:47 +02:00
|
|
|
gs_free char *header_name2 = NULL;
|
2013-05-22 08:37:50 +02:00
|
|
|
|
|
|
|
|
/* Main header name */
|
2017-03-31 13:21:47 +02:00
|
|
|
header_name2 = construct_header_name (base_hdr,
|
|
|
|
|
nm_device_get_iface (dev));
|
|
|
|
|
out2_indices = parse_output_fields (fields_str, tmpl, FALSE, NULL, NULL);
|
2014-08-18 12:41:01 +02:00
|
|
|
|
|
|
|
|
if (NM_IS_DEVICE_WIFI (dev)) {
|
|
|
|
|
if (empty_line)
|
2014-09-19 16:04:40 -04:00
|
|
|
g_print ("\n"); /* Empty line between devices' APs */
|
2017-03-30 14:56:19 +02:00
|
|
|
show_access_point_info (dev, nmc, &out2);
|
2017-03-31 13:21:47 +02:00
|
|
|
print_data (&nmc->nmc_config, out2_indices, header_name2, 0, &out2);
|
2014-08-18 12:41:01 +02:00
|
|
|
empty_line = TRUE;
|
|
|
|
|
}
|
2010-03-18 15:39:15 +01:00
|
|
|
}
|
2010-02-25 09:52:30 -08:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return nmc->return_value;
|
|
|
|
|
}
|
|
|
|
|
|
2012-04-28 22:32:21 +01:00
|
|
|
static NMCResultCode
|
|
|
|
|
do_device_wifi_connect_network (NmCli *nmc, int argc, char **argv)
|
|
|
|
|
{
|
|
|
|
|
NMDevice *device = NULL;
|
|
|
|
|
NMAccessPoint *ap = NULL;
|
2015-07-10 13:16:21 +02:00
|
|
|
NM80211ApFlags ap_flags = NM_802_11_AP_FLAGS_NONE;
|
|
|
|
|
NM80211ApSecurityFlags ap_wpa_flags = NM_802_11_AP_SEC_NONE;
|
|
|
|
|
NM80211ApSecurityFlags ap_rsn_flags = NM_802_11_AP_SEC_NONE;
|
2012-04-28 22:32:21 +01:00
|
|
|
NMConnection *connection = NULL;
|
|
|
|
|
NMSettingConnection *s_con;
|
|
|
|
|
NMSettingWireless *s_wifi;
|
|
|
|
|
NMSettingWirelessSecurity *s_wsec;
|
|
|
|
|
AddAndActivateInfo *info;
|
|
|
|
|
const char *param_user = NULL;
|
2013-04-18 14:54:01 +02:00
|
|
|
const char *ifname = NULL;
|
2012-04-28 22:32:21 +01:00
|
|
|
const char *bssid = NULL;
|
|
|
|
|
const char *password = NULL;
|
|
|
|
|
const char *con_name = NULL;
|
|
|
|
|
gboolean private = FALSE;
|
2015-07-10 13:16:21 +02:00
|
|
|
gboolean hidden = FALSE;
|
2012-04-28 22:32:21 +01:00
|
|
|
gboolean wep_passphrase = FALSE;
|
|
|
|
|
GByteArray *bssid1_arr = NULL;
|
|
|
|
|
GByteArray *bssid2_arr = NULL;
|
2016-07-12 14:45:36 +02:00
|
|
|
gs_free NMDevice **devices = NULL;
|
2012-04-28 22:32:21 +01:00
|
|
|
int devices_idx;
|
2012-11-22 14:32:45 +01:00
|
|
|
char *ssid_ask = NULL;
|
|
|
|
|
char *passwd_ask = NULL;
|
2012-04-28 22:32:21 +01:00
|
|
|
|
2013-05-14 12:43:43 +02:00
|
|
|
/* Set default timeout waiting for operation completion. */
|
|
|
|
|
if (nmc->timeout == -1)
|
|
|
|
|
nmc->timeout = 90;
|
2012-04-28 22:32:21 +01:00
|
|
|
|
2016-07-12 09:45:23 +02:00
|
|
|
devices = nmc_get_devices_sorted (nmc->client);
|
|
|
|
|
|
2017-03-30 16:09:46 +02:00
|
|
|
next_arg (nmc, &argc, &argv, NULL);
|
2012-04-28 22:32:21 +01:00
|
|
|
/* Get the first compulsory argument (SSID or BSSID) */
|
|
|
|
|
if (argc > 0) {
|
|
|
|
|
param_user = *argv;
|
2014-07-04 15:59:19 -04:00
|
|
|
bssid1_arr = nm_utils_hwaddr_atoba (param_user, ETH_ALEN);
|
2012-04-28 22:32:21 +01:00
|
|
|
|
2016-07-12 09:45:23 +02:00
|
|
|
if (argc == 1 && nmc->complete)
|
|
|
|
|
complete_aps (devices, NULL, param_user, param_user);
|
|
|
|
|
|
2017-03-30 16:09:46 +02:00
|
|
|
next_arg (nmc, &argc, &argv, NULL);
|
2012-04-28 22:32:21 +01:00
|
|
|
} else {
|
2016-07-12 09:45:23 +02:00
|
|
|
/* nmc_do_cmd() should not call this with argc=0. */
|
|
|
|
|
g_assert (!nmc->complete);
|
|
|
|
|
|
2012-11-22 14:32:45 +01:00
|
|
|
if (nmc->ask) {
|
2014-05-14 09:22:50 +02:00
|
|
|
ssid_ask = nmc_readline (_("SSID or BSSID: "));
|
2012-11-22 14:32:45 +01:00
|
|
|
param_user = ssid_ask ? ssid_ask : "";
|
2014-07-04 15:59:19 -04:00
|
|
|
bssid1_arr = nm_utils_hwaddr_atoba (param_user, ETH_ALEN);
|
2012-11-22 14:32:45 +01:00
|
|
|
}
|
|
|
|
|
if (!ssid_ask) {
|
|
|
|
|
g_string_printf (nmc->return_text, _("Error: SSID or BSSID are missing."));
|
|
|
|
|
nmc->return_value = NMC_RESULT_ERROR_USER_INPUT;
|
2016-07-12 09:45:23 +02:00
|
|
|
goto finish;
|
2012-11-22 14:32:45 +01:00
|
|
|
}
|
2012-04-28 22:32:21 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Get the rest of the parameters */
|
|
|
|
|
while (argc > 0) {
|
2016-07-12 09:45:23 +02:00
|
|
|
if (argc == 1 && nmc->complete) {
|
|
|
|
|
nmc_complete_strings (*argv, "ifname", "bssid", "password", "wep-key-type",
|
|
|
|
|
"name", "private", "hidden", NULL);
|
|
|
|
|
}
|
|
|
|
|
|
2013-04-18 14:54:01 +02:00
|
|
|
if (strcmp (*argv, "ifname") == 0) {
|
2017-03-29 12:02:14 +02:00
|
|
|
argc--;
|
|
|
|
|
argv++;
|
2017-03-24 14:00:25 +01:00
|
|
|
if (!argc) {
|
2012-11-16 22:43:29 +01:00
|
|
|
g_string_printf (nmc->return_text, _("Error: %s argument is missing."), *(argv-1));
|
2012-04-28 22:32:21 +01:00
|
|
|
nmc->return_value = NMC_RESULT_ERROR_USER_INPUT;
|
2016-07-12 09:45:23 +02:00
|
|
|
goto finish;
|
2012-04-28 22:32:21 +01:00
|
|
|
}
|
2013-04-18 14:54:01 +02:00
|
|
|
ifname = *argv;
|
2017-06-11 22:31:43 +02:00
|
|
|
if (argc == 1 && nmc->complete)
|
|
|
|
|
complete_device (devices, ifname, TRUE);
|
2012-04-28 22:32:21 +01:00
|
|
|
} else if (strcmp (*argv, "bssid") == 0) {
|
2017-03-29 12:02:14 +02:00
|
|
|
argc--;
|
|
|
|
|
argv++;
|
2017-03-24 14:00:25 +01:00
|
|
|
if (!argc) {
|
2012-11-16 22:43:29 +01:00
|
|
|
g_string_printf (nmc->return_text, _("Error: %s argument is missing."), *(argv-1));
|
2012-04-28 22:32:21 +01:00
|
|
|
nmc->return_value = NMC_RESULT_ERROR_USER_INPUT;
|
2016-07-12 09:45:23 +02:00
|
|
|
goto finish;
|
2012-04-28 22:32:21 +01:00
|
|
|
}
|
|
|
|
|
bssid = *argv;
|
2016-07-12 09:45:23 +02:00
|
|
|
if (argc == 1 && nmc->complete)
|
|
|
|
|
complete_aps (devices, NULL, bssid, NULL);
|
2014-07-04 15:59:19 -04:00
|
|
|
bssid2_arr = nm_utils_hwaddr_atoba (bssid, ETH_ALEN);
|
2012-04-28 22:32:21 +01:00
|
|
|
if (!bssid2_arr) {
|
|
|
|
|
g_string_printf (nmc->return_text, _("Error: bssid argument value '%s' is not a valid BSSID."),
|
|
|
|
|
bssid);
|
|
|
|
|
nmc->return_value = NMC_RESULT_ERROR_USER_INPUT;
|
2016-07-12 09:45:23 +02:00
|
|
|
goto finish;
|
2012-04-28 22:32:21 +01:00
|
|
|
}
|
|
|
|
|
} else if (strcmp (*argv, "password") == 0) {
|
2017-03-29 12:02:14 +02:00
|
|
|
argc--;
|
|
|
|
|
argv++;
|
2017-03-24 14:00:25 +01:00
|
|
|
if (!argc) {
|
2012-11-16 22:43:29 +01:00
|
|
|
g_string_printf (nmc->return_text, _("Error: %s argument is missing."), *(argv-1));
|
2012-04-28 22:32:21 +01:00
|
|
|
nmc->return_value = NMC_RESULT_ERROR_USER_INPUT;
|
2016-07-12 09:45:23 +02:00
|
|
|
goto finish;
|
2012-04-28 22:32:21 +01:00
|
|
|
}
|
|
|
|
|
password = *argv;
|
|
|
|
|
} else if (strcmp (*argv, "wep-key-type") == 0) {
|
2017-03-29 12:02:14 +02:00
|
|
|
argc--;
|
|
|
|
|
argv++;
|
2017-03-24 14:00:25 +01:00
|
|
|
if (!argc) {
|
2012-11-16 22:43:29 +01:00
|
|
|
g_string_printf (nmc->return_text, _("Error: %s argument is missing."), *(argv-1));
|
2012-04-28 22:32:21 +01:00
|
|
|
nmc->return_value = NMC_RESULT_ERROR_USER_INPUT;
|
2016-07-12 09:45:23 +02:00
|
|
|
goto finish;
|
2012-04-28 22:32:21 +01:00
|
|
|
}
|
2016-07-12 09:45:23 +02:00
|
|
|
if (argc == 1 && nmc->complete)
|
|
|
|
|
nmc_complete_strings (*argv, "key", "phrase", NULL);
|
2012-04-28 22:32:21 +01:00
|
|
|
if (strcmp (*argv, "key") == 0)
|
|
|
|
|
wep_passphrase = FALSE;
|
|
|
|
|
else if (strcmp (*argv, "phrase") == 0)
|
|
|
|
|
wep_passphrase = TRUE;
|
|
|
|
|
else {
|
|
|
|
|
g_string_printf (nmc->return_text,
|
|
|
|
|
_("Error: wep-key-type argument value '%s' is invalid, use 'key' or 'phrase'."),
|
|
|
|
|
*argv);
|
|
|
|
|
nmc->return_value = NMC_RESULT_ERROR_USER_INPUT;
|
2016-07-12 09:45:23 +02:00
|
|
|
goto finish;
|
2012-04-28 22:32:21 +01:00
|
|
|
}
|
|
|
|
|
} else if (strcmp (*argv, "name") == 0) {
|
2017-03-29 12:02:14 +02:00
|
|
|
argc--;
|
|
|
|
|
argv++;
|
2017-03-24 14:00:25 +01:00
|
|
|
if (!argc) {
|
2012-11-16 22:43:29 +01:00
|
|
|
g_string_printf (nmc->return_text, _("Error: %s argument is missing."), *(argv-1));
|
2012-04-28 22:32:21 +01:00
|
|
|
nmc->return_value = NMC_RESULT_ERROR_USER_INPUT;
|
2016-07-12 09:45:23 +02:00
|
|
|
goto finish;
|
2012-04-28 22:32:21 +01:00
|
|
|
}
|
|
|
|
|
con_name = *argv;
|
2013-05-14 13:51:06 +02:00
|
|
|
} else if (strcmp (*argv, "private") == 0) {
|
|
|
|
|
GError *err_tmp = NULL;
|
2017-03-29 12:02:14 +02:00
|
|
|
|
|
|
|
|
argc--;
|
|
|
|
|
argv++;
|
2017-03-24 14:00:25 +01:00
|
|
|
if (!argc) {
|
2013-05-14 13:51:06 +02:00
|
|
|
g_string_printf (nmc->return_text, _("Error: %s argument is missing."), *(argv-1));
|
|
|
|
|
nmc->return_value = NMC_RESULT_ERROR_USER_INPUT;
|
2016-07-12 09:45:23 +02:00
|
|
|
goto finish;
|
2013-05-14 13:51:06 +02:00
|
|
|
}
|
2016-07-12 09:45:23 +02:00
|
|
|
if (argc == 1 && nmc->complete)
|
|
|
|
|
nmc_complete_bool (*argv);
|
2013-05-14 13:51:06 +02:00
|
|
|
if (!nmc_string_to_bool (*argv, &private, &err_tmp)) {
|
|
|
|
|
g_string_printf (nmc->return_text, _("Error: %s: %s."), *(argv-1), err_tmp->message);
|
|
|
|
|
nmc->return_value = NMC_RESULT_ERROR_USER_INPUT;
|
|
|
|
|
g_clear_error (&err_tmp);
|
2016-07-12 09:45:23 +02:00
|
|
|
goto finish;
|
2013-05-14 13:51:06 +02:00
|
|
|
}
|
2015-07-10 13:16:21 +02:00
|
|
|
} else if (strcmp (*argv, "hidden") == 0) {
|
|
|
|
|
GError *err_tmp = NULL;
|
2017-03-29 12:02:14 +02:00
|
|
|
|
|
|
|
|
argc--;
|
|
|
|
|
argv++;
|
2017-03-24 14:00:25 +01:00
|
|
|
if (!argc) {
|
2015-07-10 13:16:21 +02:00
|
|
|
g_string_printf (nmc->return_text, _("Error: %s argument is missing."), *(argv-1));
|
|
|
|
|
nmc->return_value = NMC_RESULT_ERROR_USER_INPUT;
|
2016-07-12 09:45:23 +02:00
|
|
|
goto finish;
|
2015-07-10 13:16:21 +02:00
|
|
|
}
|
2016-07-12 09:45:23 +02:00
|
|
|
if (argc == 1 && nmc->complete)
|
|
|
|
|
nmc_complete_bool (*argv);
|
2015-07-10 13:16:21 +02:00
|
|
|
if (!nmc_string_to_bool (*argv, &hidden, &err_tmp)) {
|
|
|
|
|
g_string_printf (nmc->return_text, _("Error: %s: %s."), *(argv-1), err_tmp->message);
|
|
|
|
|
nmc->return_value = NMC_RESULT_ERROR_USER_INPUT;
|
|
|
|
|
g_clear_error (&err_tmp);
|
2016-07-12 09:45:23 +02:00
|
|
|
goto finish;
|
2015-07-10 13:16:21 +02:00
|
|
|
}
|
2016-07-12 09:45:23 +02:00
|
|
|
} else if (!nmc->complete) {
|
2014-09-19 16:04:40 -04:00
|
|
|
g_printerr (_("Unknown parameter: %s\n"), *argv);
|
2012-04-28 22:32:21 +01:00
|
|
|
}
|
|
|
|
|
|
2017-03-30 16:09:46 +02:00
|
|
|
next_arg (nmc, &argc, &argv, NULL);
|
2012-04-28 22:32:21 +01:00
|
|
|
}
|
|
|
|
|
|
2016-07-12 09:45:23 +02:00
|
|
|
if (nmc->complete)
|
|
|
|
|
goto finish;
|
|
|
|
|
|
2012-04-28 22:32:21 +01:00
|
|
|
/* Verify SSID/BSSID parameters */
|
|
|
|
|
if (bssid1_arr && bssid2_arr && memcmp (bssid1_arr->data, bssid2_arr->data, ETH_ALEN)) {
|
|
|
|
|
g_string_printf (nmc->return_text, _("Error: BSSID to connect to (%s) differs from bssid argument (%s)."),
|
|
|
|
|
param_user, bssid);
|
|
|
|
|
nmc->return_value = NMC_RESULT_ERROR_USER_INPUT;
|
2016-07-12 09:45:23 +02:00
|
|
|
goto finish;
|
2012-04-28 22:32:21 +01:00
|
|
|
}
|
|
|
|
|
if (!bssid1_arr && strlen (param_user) > 32) {
|
|
|
|
|
g_string_printf (nmc->return_text, _("Error: Parameter '%s' is neither SSID nor BSSID."), param_user);
|
|
|
|
|
nmc->return_value = NMC_RESULT_ERROR_USER_INPUT;
|
2016-07-12 09:45:23 +02:00
|
|
|
goto finish;
|
2012-04-28 22:32:21 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Find a device to activate the connection on */
|
|
|
|
|
devices_idx = 0;
|
2013-04-18 14:54:01 +02:00
|
|
|
device = find_wifi_device_by_iface (devices, ifname, &devices_idx);
|
2012-04-28 22:32:21 +01:00
|
|
|
|
|
|
|
|
if (!device) {
|
2013-04-18 14:54:01 +02:00
|
|
|
if (ifname)
|
|
|
|
|
g_string_printf (nmc->return_text, _("Error: Device '%s' is not a Wi-Fi device."), ifname);
|
2012-04-28 22:32:21 +01:00
|
|
|
else
|
|
|
|
|
g_string_printf (nmc->return_text, _("Error: No Wi-Fi device found."));
|
|
|
|
|
nmc->return_value = NMC_RESULT_ERROR_UNKNOWN;
|
2016-07-12 09:45:23 +02:00
|
|
|
goto finish;
|
2012-04-28 22:32:21 +01:00
|
|
|
}
|
|
|
|
|
|
2015-07-10 13:16:21 +02:00
|
|
|
/* For hidden SSID first scan it so that NM learns about the AP */
|
|
|
|
|
if (hidden) {
|
|
|
|
|
GVariantBuilder builder, array_builder;
|
|
|
|
|
GVariant *options;
|
|
|
|
|
GError *scan_err = NULL;
|
|
|
|
|
|
|
|
|
|
g_variant_builder_init (&builder, G_VARIANT_TYPE_VARDICT);
|
|
|
|
|
g_variant_builder_init (&array_builder, G_VARIANT_TYPE ("aay"));
|
|
|
|
|
g_variant_builder_add (&array_builder, "@ay",
|
|
|
|
|
g_variant_new_fixed_array (G_VARIANT_TYPE_BYTE, param_user, strlen (param_user), 1));
|
|
|
|
|
g_variant_builder_add (&builder, "{sv}", "ssids", g_variant_builder_end (&array_builder));
|
|
|
|
|
options = g_variant_builder_end (&builder);
|
|
|
|
|
|
|
|
|
|
nm_device_wifi_request_scan_options (NM_DEVICE_WIFI (device), options, NULL, &scan_err);
|
|
|
|
|
if (scan_err) {
|
|
|
|
|
g_string_printf (nmc->return_text, _("Error: Failed to scan hidden SSID: %s."),
|
|
|
|
|
scan_err->message);
|
|
|
|
|
g_clear_error (&scan_err);
|
|
|
|
|
nmc->return_value = NMC_RESULT_ERROR_NOT_FOUND;
|
2016-07-12 09:45:23 +02:00
|
|
|
goto finish;
|
2015-07-10 13:16:21 +02:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2012-04-28 22:32:21 +01:00
|
|
|
/* Find an AP to connect to */
|
2016-07-12 14:36:53 +02:00
|
|
|
ap = find_ap_on_device (device, bssid1_arr ? param_user : NULL,
|
|
|
|
|
bssid1_arr ? NULL : param_user, FALSE);
|
2013-04-18 14:54:01 +02:00
|
|
|
if (!ap && !ifname) {
|
2015-07-10 13:16:21 +02:00
|
|
|
NMDevice *dev;
|
|
|
|
|
|
|
|
|
|
/* AP not found, ifname was not specified, so try finding the AP on another device. */
|
|
|
|
|
while ((dev = find_wifi_device_by_iface (devices, NULL, &devices_idx)) != NULL) {
|
2016-07-12 14:36:53 +02:00
|
|
|
ap = find_ap_on_device (dev, bssid1_arr ? param_user : NULL,
|
|
|
|
|
bssid1_arr ? NULL : param_user, FALSE);
|
2015-07-10 13:16:21 +02:00
|
|
|
if (ap) {
|
|
|
|
|
device = dev;
|
2012-04-28 22:32:21 +01:00
|
|
|
break;
|
2015-07-10 13:16:21 +02:00
|
|
|
}
|
2012-04-28 22:32:21 +01:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!ap) {
|
|
|
|
|
if (!bssid1_arr)
|
|
|
|
|
g_string_printf (nmc->return_text, _("Error: No network with SSID '%s' found."), param_user);
|
|
|
|
|
else
|
|
|
|
|
g_string_printf (nmc->return_text, _("Error: No access point with BSSID '%s' found."), param_user);
|
2013-11-21 09:19:18 -05:00
|
|
|
nmc->return_value = NMC_RESULT_ERROR_NOT_FOUND;
|
2016-07-12 09:45:23 +02:00
|
|
|
goto finish;
|
2012-04-28 22:32:21 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* If there are some connection data from user, create a connection and
|
|
|
|
|
* fill them into proper settings. */
|
2015-07-10 13:16:21 +02:00
|
|
|
if (con_name || private || bssid2_arr || password || hidden)
|
2014-08-13 14:34:29 -04:00
|
|
|
connection = nm_simple_connection_new ();
|
2012-04-28 22:32:21 +01:00
|
|
|
|
|
|
|
|
if (con_name || private) {
|
|
|
|
|
s_con = (NMSettingConnection *) nm_setting_connection_new ();
|
|
|
|
|
nm_connection_add_setting (connection, NM_SETTING (s_con));
|
|
|
|
|
|
|
|
|
|
/* Set user provided connection name */
|
|
|
|
|
if (con_name)
|
|
|
|
|
g_object_set (s_con, NM_SETTING_CONNECTION_ID, con_name, NULL);
|
|
|
|
|
|
2017-03-30 16:09:46 +02:00
|
|
|
/* Connection will only be visible to this user when 'private' is specified */
|
2012-04-28 22:32:21 +01:00
|
|
|
if (private)
|
|
|
|
|
nm_setting_connection_add_permission (s_con, "user", g_get_user_name (), NULL);
|
|
|
|
|
}
|
2015-07-10 13:16:21 +02:00
|
|
|
if (bssid2_arr || hidden) {
|
2012-04-28 22:32:21 +01:00
|
|
|
s_wifi = (NMSettingWireless *) nm_setting_wireless_new ();
|
|
|
|
|
nm_connection_add_setting (connection, NM_SETTING (s_wifi));
|
|
|
|
|
|
2015-07-10 13:16:21 +02:00
|
|
|
/* 'bssid' parameter is used to restrict the connection only to the BSSID */
|
|
|
|
|
if (bssid2_arr)
|
|
|
|
|
g_object_set (s_wifi, NM_SETTING_WIRELESS_BSSID, bssid2_arr, NULL);
|
|
|
|
|
|
|
|
|
|
/* 'hidden' parameter is used to indicate that SSID is not broadcasted */
|
|
|
|
|
if (hidden) {
|
|
|
|
|
GBytes *ssid = g_bytes_new (param_user, strlen (param_user));
|
|
|
|
|
|
|
|
|
|
g_object_set (s_wifi,
|
|
|
|
|
NM_SETTING_WIRELESS_SSID, ssid,
|
|
|
|
|
NM_SETTING_WIRELESS_HIDDEN, hidden,
|
|
|
|
|
NULL);
|
|
|
|
|
g_bytes_unref (ssid);
|
2015-11-09 14:33:34 +01:00
|
|
|
|
|
|
|
|
/* Warn when the provided AP identifier looks like BSSID instead of SSID */
|
|
|
|
|
if (bssid1_arr)
|
|
|
|
|
g_printerr (_("Warning: '%s' should be SSID for hidden APs; but it looks like a BSSID.\n"),
|
|
|
|
|
param_user);
|
2015-07-10 13:16:21 +02:00
|
|
|
}
|
2012-04-28 22:32:21 +01:00
|
|
|
}
|
|
|
|
|
|
2012-11-22 14:32:45 +01:00
|
|
|
/* handle password */
|
|
|
|
|
ap_flags = nm_access_point_get_flags (ap);
|
|
|
|
|
ap_wpa_flags = nm_access_point_get_wpa_flags (ap);
|
|
|
|
|
ap_rsn_flags = nm_access_point_get_rsn_flags (ap);
|
|
|
|
|
|
|
|
|
|
/* Set password for WEP or WPA-PSK. */
|
|
|
|
|
if (ap_flags & NM_802_11_AP_FLAGS_PRIVACY) {
|
|
|
|
|
/* Ask for missing password when one is expected and '--ask' is used */
|
|
|
|
|
if (!password && nmc->ask)
|
2017-04-06 15:26:23 +02:00
|
|
|
password = passwd_ask = nmc_readline_echo (nmc->nmc_config.show_secrets, _("Password: "));
|
2012-11-22 14:32:45 +01:00
|
|
|
|
|
|
|
|
if (password) {
|
|
|
|
|
if (!connection)
|
2014-08-13 14:34:29 -04:00
|
|
|
connection = nm_simple_connection_new ();
|
2012-11-22 14:32:45 +01:00
|
|
|
s_wsec = (NMSettingWirelessSecurity *) nm_setting_wireless_security_new ();
|
|
|
|
|
nm_connection_add_setting (connection, NM_SETTING (s_wsec));
|
2012-04-28 22:32:21 +01:00
|
|
|
|
2012-11-22 14:32:45 +01:00
|
|
|
if (ap_wpa_flags == NM_802_11_AP_SEC_NONE && ap_rsn_flags == NM_802_11_AP_SEC_NONE) {
|
2012-04-28 22:32:21 +01:00
|
|
|
/* WEP */
|
|
|
|
|
nm_setting_wireless_security_set_wep_key (s_wsec, 0, password);
|
|
|
|
|
g_object_set (G_OBJECT (s_wsec),
|
|
|
|
|
NM_SETTING_WIRELESS_SECURITY_WEP_KEY_TYPE,
|
|
|
|
|
wep_passphrase ? NM_WEP_KEY_TYPE_PASSPHRASE: NM_WEP_KEY_TYPE_KEY,
|
|
|
|
|
NULL);
|
2017-09-16 11:59:46 +02:00
|
|
|
} else if ( (ap_wpa_flags & NM_802_11_AP_SEC_KEY_MGMT_PSK)
|
|
|
|
|
|| (ap_rsn_flags & NM_802_11_AP_SEC_KEY_MGMT_PSK)) {
|
2012-04-28 22:32:21 +01:00
|
|
|
/* WPA PSK */
|
|
|
|
|
g_object_set (s_wsec, NM_SETTING_WIRELESS_SECURITY_PSK, password, NULL);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
2012-11-22 14:32:45 +01:00
|
|
|
// FIXME: WPA-Enterprise is not supported yet.
|
|
|
|
|
// We are not able to determine and fill all the parameters for
|
|
|
|
|
// 802.1X authentication automatically without user providing
|
|
|
|
|
// the data. Adding nmcli options for the 8021x setting would
|
|
|
|
|
// clutter the command. However, that could be solved later by
|
|
|
|
|
// implementing add/edit connections support for nmcli.
|
2012-04-28 22:32:21 +01:00
|
|
|
|
|
|
|
|
/* nowait_flag indicates user input. should_wait says whether quit in start().
|
|
|
|
|
* We have to delay exit after add_and_activate_cb() is called, even if
|
|
|
|
|
* the user doesn't want to wait, in order to give NM time to check our
|
|
|
|
|
* permissions. */
|
2013-05-14 12:43:43 +02:00
|
|
|
nmc->nowait_flag = (nmc->timeout == 0);
|
2015-03-27 12:39:17 +01:00
|
|
|
nmc->should_wait++;
|
2012-04-28 22:32:21 +01:00
|
|
|
|
|
|
|
|
info = g_malloc0 (sizeof (AddAndActivateInfo));
|
|
|
|
|
info->nmc = nmc;
|
|
|
|
|
info->device = device;
|
2015-10-02 22:46:53 +02:00
|
|
|
info->hotspot = FALSE;
|
2012-04-28 22:32:21 +01:00
|
|
|
|
2014-09-11 16:27:13 -04:00
|
|
|
nm_client_add_and_activate_connection_async (nmc->client,
|
|
|
|
|
connection,
|
|
|
|
|
device,
|
|
|
|
|
nm_object_get_path (NM_OBJECT (ap)),
|
|
|
|
|
NULL,
|
|
|
|
|
add_and_activate_cb,
|
|
|
|
|
info);
|
2012-04-28 22:32:21 +01:00
|
|
|
|
2016-07-12 09:45:23 +02:00
|
|
|
finish:
|
2012-04-28 22:32:21 +01:00
|
|
|
if (bssid1_arr)
|
|
|
|
|
g_byte_array_free (bssid1_arr, TRUE);
|
|
|
|
|
if (bssid2_arr)
|
|
|
|
|
g_byte_array_free (bssid2_arr, TRUE);
|
2012-11-22 14:32:45 +01:00
|
|
|
g_free (ssid_ask);
|
|
|
|
|
g_free (passwd_ask);
|
2012-04-28 22:32:21 +01:00
|
|
|
|
|
|
|
|
return nmc->return_value;
|
|
|
|
|
}
|
|
|
|
|
|
2015-10-02 22:46:53 +02:00
|
|
|
static GBytes *
|
|
|
|
|
generate_ssid_for_hotspot (const char *ssid)
|
|
|
|
|
{
|
|
|
|
|
GBytes *ssid_bytes;
|
|
|
|
|
char *hotspot_ssid = NULL;
|
|
|
|
|
|
|
|
|
|
if (!ssid) {
|
|
|
|
|
hotspot_ssid = g_strdup_printf ("Hotspot-%s", g_get_host_name ());
|
|
|
|
|
if (strlen (hotspot_ssid) > 32)
|
|
|
|
|
hotspot_ssid[32] = '\0';
|
|
|
|
|
ssid = hotspot_ssid;
|
|
|
|
|
}
|
|
|
|
|
ssid_bytes = g_bytes_new (ssid, strlen (ssid));
|
|
|
|
|
g_free (hotspot_ssid);
|
|
|
|
|
return ssid_bytes;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#define WPA_PASSKEY_SIZE 8
|
|
|
|
|
static void
|
|
|
|
|
generate_wpa_key (char *key, size_t len)
|
|
|
|
|
{
|
|
|
|
|
guint i;
|
|
|
|
|
|
|
|
|
|
g_return_if_fail (key);
|
|
|
|
|
g_return_if_fail (len > WPA_PASSKEY_SIZE);
|
|
|
|
|
|
|
|
|
|
/* generate a 8-chars ASCII WPA key */
|
|
|
|
|
for (i = 0; i < WPA_PASSKEY_SIZE; i++) {
|
|
|
|
|
int c;
|
|
|
|
|
c = g_random_int_range (33, 126);
|
|
|
|
|
/* too many non alphanumeric characters are hard to remember for humans */
|
|
|
|
|
while (!g_ascii_isalnum (c))
|
|
|
|
|
c = g_random_int_range (33, 126);
|
|
|
|
|
|
|
|
|
|
key[i] = (gchar) c;
|
|
|
|
|
}
|
|
|
|
|
key[WPA_PASSKEY_SIZE] = '\0';
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
|
generate_wep_key (char *key, size_t len)
|
|
|
|
|
{
|
|
|
|
|
int i;
|
|
|
|
|
const char *hexdigits = "0123456789abcdef";
|
|
|
|
|
|
|
|
|
|
g_return_if_fail (key);
|
|
|
|
|
g_return_if_fail (len > 10);
|
|
|
|
|
|
|
|
|
|
/* generate a 10-digit hex WEP key */
|
|
|
|
|
for (i = 0; i < 10; i++) {
|
|
|
|
|
int digit;
|
|
|
|
|
digit = g_random_int_range (0, 16);
|
|
|
|
|
key[i] = hexdigits[digit];
|
|
|
|
|
}
|
|
|
|
|
key[10] = '\0';
|
|
|
|
|
}
|
|
|
|
|
|
2015-10-13 17:48:06 +02:00
|
|
|
static gboolean
|
2015-10-02 22:46:53 +02:00
|
|
|
set_wireless_security_for_hotspot (NMSettingWirelessSecurity *s_wsec,
|
|
|
|
|
const char *wifi_mode,
|
2015-10-13 17:48:06 +02:00
|
|
|
NMDeviceWifiCapabilities caps,
|
|
|
|
|
const char *password,
|
2015-10-14 12:05:32 +02:00
|
|
|
gboolean show_password,
|
2015-10-13 17:48:06 +02:00
|
|
|
GError **error)
|
2015-10-02 22:46:53 +02:00
|
|
|
{
|
2015-10-13 17:48:06 +02:00
|
|
|
char generated_key[11];
|
|
|
|
|
const char *key;
|
2015-10-02 22:46:53 +02:00
|
|
|
const char *key_mgmt;
|
|
|
|
|
|
|
|
|
|
if (g_strcmp0 (wifi_mode, NM_SETTING_WIRELESS_MODE_AP) == 0) {
|
|
|
|
|
if (caps & NM_WIFI_DEVICE_CAP_RSN) {
|
|
|
|
|
nm_setting_wireless_security_add_proto (s_wsec, "rsn");
|
|
|
|
|
nm_setting_wireless_security_add_pairwise (s_wsec, "ccmp");
|
|
|
|
|
nm_setting_wireless_security_add_group (s_wsec, "ccmp");
|
|
|
|
|
key_mgmt = "wpa-psk";
|
|
|
|
|
} else if (caps & NM_WIFI_DEVICE_CAP_WPA) {
|
|
|
|
|
nm_setting_wireless_security_add_proto (s_wsec, "wpa");
|
|
|
|
|
nm_setting_wireless_security_add_pairwise (s_wsec, "tkip");
|
|
|
|
|
nm_setting_wireless_security_add_group (s_wsec, "tkip");
|
|
|
|
|
key_mgmt = "wpa-psk";
|
2015-10-13 17:48:06 +02:00
|
|
|
} else
|
2015-10-02 22:46:53 +02:00
|
|
|
key_mgmt = "none";
|
2015-10-13 17:48:06 +02:00
|
|
|
} else
|
2015-10-02 22:46:53 +02:00
|
|
|
key_mgmt = "none";
|
|
|
|
|
|
|
|
|
|
if (g_strcmp0 (key_mgmt, "wpa-psk") == 0) {
|
2015-10-13 17:48:06 +02:00
|
|
|
/* use WPA */
|
|
|
|
|
if (password) {
|
|
|
|
|
if (!nm_utils_wpa_psk_valid (password)) {
|
|
|
|
|
g_set_error (error, NMCLI_ERROR, 0, _("'%s' is not valid WPA PSK"), password);
|
|
|
|
|
return FALSE;
|
|
|
|
|
}
|
|
|
|
|
key = password;
|
|
|
|
|
} else {
|
|
|
|
|
generate_wpa_key (generated_key, sizeof (generated_key));
|
|
|
|
|
key = generated_key;
|
|
|
|
|
}
|
2015-10-02 22:46:53 +02:00
|
|
|
g_object_set (s_wsec,
|
|
|
|
|
NM_SETTING_WIRELESS_SECURITY_KEY_MGMT, key_mgmt,
|
|
|
|
|
NM_SETTING_WIRELESS_SECURITY_PSK, key,
|
|
|
|
|
NULL);
|
|
|
|
|
} else {
|
2015-10-13 17:48:06 +02:00
|
|
|
/* use WEP */
|
|
|
|
|
if (password) {
|
|
|
|
|
if (!nm_utils_wep_key_valid (password, NM_WEP_KEY_TYPE_KEY)) {
|
|
|
|
|
g_set_error (error, NMCLI_ERROR, 0,
|
|
|
|
|
_("'%s' is not valid WEP key (it should be 5 or 13 ASCII chars)"),
|
|
|
|
|
password);
|
|
|
|
|
return FALSE;
|
|
|
|
|
}
|
|
|
|
|
key = password;
|
|
|
|
|
} else {
|
|
|
|
|
generate_wep_key (generated_key, sizeof (generated_key));
|
|
|
|
|
key = generated_key;
|
|
|
|
|
}
|
2015-10-02 22:46:53 +02:00
|
|
|
g_object_set (s_wsec,
|
|
|
|
|
NM_SETTING_WIRELESS_SECURITY_KEY_MGMT, key_mgmt,
|
|
|
|
|
NM_SETTING_WIRELESS_SECURITY_WEP_KEY0, key,
|
|
|
|
|
NM_SETTING_WIRELESS_SECURITY_WEP_KEY_TYPE, NM_WEP_KEY_TYPE_KEY,
|
|
|
|
|
NULL);
|
|
|
|
|
}
|
2015-10-14 12:05:32 +02:00
|
|
|
if (show_password)
|
|
|
|
|
g_print (_("Hotspot password: %s\n"), key);
|
|
|
|
|
|
2015-10-13 17:48:06 +02:00
|
|
|
return TRUE;
|
2015-10-02 22:46:53 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static NMCResultCode
|
|
|
|
|
do_device_wifi_hotspot (NmCli *nmc, int argc, char **argv)
|
|
|
|
|
{
|
|
|
|
|
AddAndActivateInfo *info;
|
|
|
|
|
const char *ifname = NULL;
|
|
|
|
|
const char *con_name = NULL;
|
|
|
|
|
char *default_name = NULL;
|
|
|
|
|
const char *ssid = NULL;
|
|
|
|
|
const char *wifi_mode;
|
|
|
|
|
const char *band = NULL;
|
|
|
|
|
const char *channel = NULL;
|
|
|
|
|
unsigned long channel_int;
|
2015-10-13 17:48:06 +02:00
|
|
|
const char *password = NULL;
|
2015-10-14 12:05:32 +02:00
|
|
|
gboolean show_password = FALSE;
|
2015-10-02 22:46:53 +02:00
|
|
|
NMDevice *device = NULL;
|
2016-07-12 14:45:36 +02:00
|
|
|
gs_free NMDevice **devices = NULL;
|
2015-10-02 22:46:53 +02:00
|
|
|
NMDeviceWifiCapabilities caps;
|
|
|
|
|
NMConnection *connection = NULL;
|
|
|
|
|
NMSettingConnection *s_con;
|
|
|
|
|
NMSettingWireless *s_wifi;
|
|
|
|
|
NMSettingWirelessSecurity *s_wsec;
|
|
|
|
|
NMSettingIPConfig *s_ip4, *s_ip6;
|
2016-08-16 05:56:00 +05:30
|
|
|
NMSettingProxy *s_proxy;
|
2015-10-02 22:46:53 +02:00
|
|
|
GBytes *ssid_bytes;
|
2015-10-13 17:48:06 +02:00
|
|
|
GError *error = NULL;
|
2015-10-02 22:46:53 +02:00
|
|
|
|
|
|
|
|
/* Set default timeout waiting for operation completion. */
|
|
|
|
|
if (nmc->timeout == -1)
|
|
|
|
|
nmc->timeout = 60;
|
|
|
|
|
|
2016-07-12 11:37:18 +02:00
|
|
|
devices = nmc_get_devices_sorted (nmc->client);
|
|
|
|
|
|
2017-03-30 16:09:46 +02:00
|
|
|
next_arg (nmc, &argc, &argv, NULL);
|
2015-10-02 22:46:53 +02:00
|
|
|
while (argc > 0) {
|
2016-07-12 11:37:18 +02:00
|
|
|
if (argc == 1 && nmc->complete) {
|
|
|
|
|
nmc_complete_strings (*argv, "ifname", "con-name", "ssid", "band",
|
|
|
|
|
"channel", "password", NULL);
|
|
|
|
|
}
|
|
|
|
|
|
2015-10-02 22:46:53 +02:00
|
|
|
if (strcmp (*argv, "ifname") == 0) {
|
2017-03-29 12:02:14 +02:00
|
|
|
argc--;
|
|
|
|
|
argv++;
|
2017-03-24 14:00:25 +01:00
|
|
|
if (!argc) {
|
2015-10-02 22:46:53 +02:00
|
|
|
g_string_printf (nmc->return_text, _("Error: %s argument is missing."), *(argv-1));
|
2016-07-12 11:37:18 +02:00
|
|
|
return NMC_RESULT_ERROR_USER_INPUT;
|
2015-10-02 22:46:53 +02:00
|
|
|
}
|
|
|
|
|
ifname = *argv;
|
2016-07-12 11:37:18 +02:00
|
|
|
if (argc == 1 && nmc->complete)
|
|
|
|
|
complete_device (devices, ifname, TRUE);
|
2015-10-02 22:46:53 +02:00
|
|
|
} else if (strcmp (*argv, "con-name") == 0) {
|
2017-03-29 12:02:14 +02:00
|
|
|
argc--;
|
|
|
|
|
argv++;
|
2017-03-24 14:00:25 +01:00
|
|
|
if (!argc) {
|
2015-10-02 22:46:53 +02:00
|
|
|
g_string_printf (nmc->return_text, _("Error: %s argument is missing."), *(argv-1));
|
2016-07-12 11:37:18 +02:00
|
|
|
return NMC_RESULT_ERROR_USER_INPUT;
|
2015-10-02 22:46:53 +02:00
|
|
|
}
|
|
|
|
|
con_name = *argv;
|
|
|
|
|
} else if (strcmp (*argv, "ssid") == 0) {
|
2017-03-29 12:02:14 +02:00
|
|
|
argc--;
|
|
|
|
|
argv++;
|
2017-03-24 14:00:25 +01:00
|
|
|
if (!argc) {
|
2015-10-02 22:46:53 +02:00
|
|
|
g_string_printf (nmc->return_text, _("Error: %s argument is missing."), *(argv-1));
|
2016-07-12 11:37:18 +02:00
|
|
|
return NMC_RESULT_ERROR_USER_INPUT;
|
2015-10-02 22:46:53 +02:00
|
|
|
}
|
|
|
|
|
ssid = *argv;
|
|
|
|
|
if (strlen (ssid) > 32) {
|
|
|
|
|
g_string_printf (nmc->return_text, _("Error: ssid is too long."));
|
2016-07-12 11:37:18 +02:00
|
|
|
return NMC_RESULT_ERROR_USER_INPUT;
|
2015-10-02 22:46:53 +02:00
|
|
|
}
|
|
|
|
|
} else if (strcmp (*argv, "band") == 0) {
|
2017-03-29 12:02:14 +02:00
|
|
|
argc--;
|
|
|
|
|
argv++;
|
2017-03-24 14:00:25 +01:00
|
|
|
if (!argc) {
|
2015-10-02 22:46:53 +02:00
|
|
|
g_string_printf (nmc->return_text, _("Error: %s argument is missing."), *(argv-1));
|
2016-07-12 11:37:18 +02:00
|
|
|
return NMC_RESULT_ERROR_USER_INPUT;
|
2015-10-02 22:46:53 +02:00
|
|
|
}
|
|
|
|
|
band = *argv;
|
2016-07-12 11:37:18 +02:00
|
|
|
if (argc == 1 && nmc->complete)
|
|
|
|
|
nmc_complete_strings (band, "a", "bg", NULL);
|
2015-10-02 22:46:53 +02:00
|
|
|
if (strcmp (band, "a") && strcmp (band, "bg")) {
|
|
|
|
|
g_string_printf (nmc->return_text, _("Error: band argument value '%s' is invalid; use 'a' or 'bg'."),
|
|
|
|
|
band);
|
2016-07-12 11:37:18 +02:00
|
|
|
return NMC_RESULT_ERROR_USER_INPUT;
|
2015-10-02 22:46:53 +02:00
|
|
|
}
|
|
|
|
|
} else if (strcmp (*argv, "channel") == 0) {
|
2017-03-29 12:02:14 +02:00
|
|
|
argc--;
|
|
|
|
|
argv++;
|
2017-03-24 14:00:25 +01:00
|
|
|
if (!argc) {
|
2015-10-02 22:46:53 +02:00
|
|
|
g_string_printf (nmc->return_text, _("Error: %s argument is missing."), *(argv-1));
|
2016-07-12 11:37:18 +02:00
|
|
|
return NMC_RESULT_ERROR_USER_INPUT;
|
2015-10-02 22:46:53 +02:00
|
|
|
}
|
|
|
|
|
channel = *argv;
|
2015-10-13 17:48:06 +02:00
|
|
|
} else if (strcmp (*argv, "password") == 0) {
|
2017-03-29 12:02:14 +02:00
|
|
|
argc--;
|
|
|
|
|
argv++;
|
2017-03-24 14:00:25 +01:00
|
|
|
if (!argc) {
|
2015-10-13 17:48:06 +02:00
|
|
|
g_string_printf (nmc->return_text, _("Error: %s argument is missing."), *(argv-1));
|
2016-07-12 11:37:18 +02:00
|
|
|
return NMC_RESULT_ERROR_USER_INPUT;
|
2015-10-13 17:48:06 +02:00
|
|
|
}
|
|
|
|
|
password = *argv;
|
2015-12-04 13:29:42 +01:00
|
|
|
/* --show-password is deprecated in favour of global --show-secrets option */
|
|
|
|
|
/* Keep it here for backwards compatibility */
|
2015-10-14 12:05:32 +02:00
|
|
|
} else if (nmc_arg_is_option (*argv, "show-password")) {
|
|
|
|
|
show_password = TRUE;
|
2015-10-02 22:46:53 +02:00
|
|
|
} else {
|
|
|
|
|
g_string_printf (nmc->return_text, _("Error: Unknown parameter %s."), *argv);
|
2016-07-12 11:37:18 +02:00
|
|
|
return NMC_RESULT_ERROR_USER_INPUT;
|
2015-10-02 22:46:53 +02:00
|
|
|
}
|
|
|
|
|
|
2017-03-30 16:09:46 +02:00
|
|
|
next_arg (nmc, &argc, &argv, NULL);
|
2015-10-02 22:46:53 +02:00
|
|
|
}
|
2017-04-06 15:26:23 +02:00
|
|
|
show_password = nmc->nmc_config.show_secrets || show_password;
|
2015-10-02 22:46:53 +02:00
|
|
|
|
2016-07-12 11:37:18 +02:00
|
|
|
if (nmc->complete)
|
|
|
|
|
return nmc->return_value;
|
|
|
|
|
|
2015-10-02 22:46:53 +02:00
|
|
|
/* Verify band and channel parameters */
|
|
|
|
|
if (!channel) {
|
|
|
|
|
if (g_strcmp0 (band, "bg") == 0)
|
|
|
|
|
channel = "1";
|
|
|
|
|
if (g_strcmp0 (band, "a") == 0)
|
|
|
|
|
channel = "7";
|
|
|
|
|
}
|
|
|
|
|
if (channel) {
|
|
|
|
|
if (!band) {
|
|
|
|
|
g_string_printf (nmc->return_text, _("Error: channel requires band too."));
|
2016-07-12 11:37:18 +02:00
|
|
|
return NMC_RESULT_ERROR_USER_INPUT;
|
2015-10-02 22:46:53 +02:00
|
|
|
}
|
|
|
|
|
if ( !nmc_string_to_uint (channel, TRUE, 1, 5825, &channel_int)
|
|
|
|
|
|| !nm_utils_wifi_is_channel_valid (channel_int, band)) {
|
|
|
|
|
g_string_printf (nmc->return_text, _("Error: channel '%s' not valid for band '%s'."),
|
|
|
|
|
channel, band);
|
2016-07-12 11:37:18 +02:00
|
|
|
return NMC_RESULT_ERROR_USER_INPUT;
|
2015-10-02 22:46:53 +02:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Find Wi-Fi device. When no ifname is provided, the first Wi-Fi is used. */
|
2016-07-12 12:33:31 +02:00
|
|
|
device = find_wifi_device_by_iface (devices, ifname, NULL);
|
2015-10-02 22:46:53 +02:00
|
|
|
|
|
|
|
|
if (!device) {
|
|
|
|
|
if (ifname)
|
|
|
|
|
g_string_printf (nmc->return_text, _("Error: Device '%s' is not a Wi-Fi device."), ifname);
|
|
|
|
|
else
|
|
|
|
|
g_string_printf (nmc->return_text, _("Error: No Wi-Fi device found."));
|
2016-07-12 11:37:18 +02:00
|
|
|
return NMC_RESULT_ERROR_UNKNOWN;
|
2015-10-02 22:46:53 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Check device supported mode */
|
|
|
|
|
caps = nm_device_wifi_get_capabilities (NM_DEVICE_WIFI (device));
|
|
|
|
|
if (caps & NM_WIFI_DEVICE_CAP_AP)
|
|
|
|
|
wifi_mode = NM_SETTING_WIRELESS_MODE_AP;
|
|
|
|
|
else if (caps & NM_WIFI_DEVICE_CAP_ADHOC)
|
|
|
|
|
wifi_mode = NM_SETTING_WIRELESS_MODE_ADHOC;
|
|
|
|
|
else {
|
|
|
|
|
g_string_printf (nmc->return_text, _("Error: Device '%s' supports neither AP nor Ad-Hoc mode."),
|
|
|
|
|
nm_device_get_iface (device));
|
2016-07-12 11:37:18 +02:00
|
|
|
return NMC_RESULT_ERROR_UNKNOWN;
|
2015-10-02 22:46:53 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Create a connection with appropriate parameters */
|
|
|
|
|
connection = nm_simple_connection_new ();
|
|
|
|
|
s_con = (NMSettingConnection *) nm_setting_connection_new ();
|
|
|
|
|
nm_connection_add_setting (connection, NM_SETTING (s_con));
|
|
|
|
|
if (!con_name)
|
|
|
|
|
con_name = default_name = nmc_unique_connection_name (nm_client_get_connections (nmc->client), "Hotspot");
|
|
|
|
|
g_object_set (s_con,
|
|
|
|
|
NM_SETTING_CONNECTION_ID, con_name,
|
|
|
|
|
NM_SETTING_CONNECTION_AUTOCONNECT, FALSE,
|
|
|
|
|
NULL);
|
|
|
|
|
g_free (default_name);
|
|
|
|
|
|
|
|
|
|
s_wifi = (NMSettingWireless *) nm_setting_wireless_new ();
|
|
|
|
|
nm_connection_add_setting (connection, NM_SETTING (s_wifi));
|
|
|
|
|
ssid_bytes = generate_ssid_for_hotspot (ssid);
|
|
|
|
|
g_object_set (s_wifi, NM_SETTING_WIRELESS_MODE, wifi_mode,
|
|
|
|
|
NM_SETTING_WIRELESS_SSID, ssid_bytes,
|
|
|
|
|
NULL);
|
|
|
|
|
g_bytes_unref (ssid_bytes);
|
|
|
|
|
if (channel)
|
|
|
|
|
g_object_set (s_wifi,
|
|
|
|
|
NM_SETTING_WIRELESS_CHANNEL, (guint32) channel_int,
|
|
|
|
|
NM_SETTING_WIRELESS_BAND, band,
|
|
|
|
|
NULL);
|
|
|
|
|
|
|
|
|
|
s_wsec = (NMSettingWirelessSecurity *) nm_setting_wireless_security_new ();
|
|
|
|
|
nm_connection_add_setting (connection, NM_SETTING (s_wsec));
|
2015-10-14 12:05:32 +02:00
|
|
|
if (!set_wireless_security_for_hotspot (s_wsec, wifi_mode, caps, password, show_password, &error)) {
|
2015-10-13 17:48:06 +02:00
|
|
|
g_object_unref (connection);
|
|
|
|
|
g_string_printf (nmc->return_text, _("Error: Invalid 'password': %s."), error->message);
|
|
|
|
|
g_clear_error (&error);
|
2016-07-12 11:37:18 +02:00
|
|
|
return NMC_RESULT_ERROR_UNKNOWN;
|
2015-10-13 17:48:06 +02:00
|
|
|
}
|
2015-10-02 22:46:53 +02:00
|
|
|
|
|
|
|
|
s_ip4 = (NMSettingIPConfig *) nm_setting_ip4_config_new ();
|
|
|
|
|
nm_connection_add_setting (connection, NM_SETTING (s_ip4));
|
|
|
|
|
g_object_set (s_ip4, NM_SETTING_IP_CONFIG_METHOD, NM_SETTING_IP4_CONFIG_METHOD_SHARED, NULL);
|
|
|
|
|
|
|
|
|
|
s_ip6 = (NMSettingIPConfig *) nm_setting_ip6_config_new ();
|
|
|
|
|
nm_connection_add_setting (connection, NM_SETTING (s_ip6));
|
|
|
|
|
g_object_set (s_ip6, NM_SETTING_IP_CONFIG_METHOD, NM_SETTING_IP6_CONFIG_METHOD_IGNORE, NULL);
|
|
|
|
|
|
2016-08-16 05:56:00 +05:30
|
|
|
s_proxy = (NMSettingProxy *) nm_setting_proxy_new ();
|
|
|
|
|
nm_connection_add_setting (connection, NM_SETTING (s_proxy));
|
2016-10-04 16:32:09 +02:00
|
|
|
g_object_set (s_proxy, NM_SETTING_PROXY_METHOD, (int) NM_SETTING_PROXY_METHOD_NONE, NULL);
|
2016-08-16 05:56:00 +05:30
|
|
|
|
2015-10-02 22:46:53 +02:00
|
|
|
/* Activate the connection now */
|
|
|
|
|
nmc->nowait_flag = (nmc->timeout == 0);
|
2016-06-22 17:44:39 +02:00
|
|
|
nmc->should_wait++;
|
2015-10-02 22:46:53 +02:00
|
|
|
|
|
|
|
|
info = g_malloc0 (sizeof (AddAndActivateInfo));
|
|
|
|
|
info->nmc = nmc;
|
|
|
|
|
info->device = device;
|
|
|
|
|
info->hotspot = TRUE;
|
|
|
|
|
|
|
|
|
|
nm_client_add_and_activate_connection_async (nmc->client,
|
|
|
|
|
connection,
|
|
|
|
|
device,
|
|
|
|
|
NULL,
|
|
|
|
|
NULL,
|
|
|
|
|
add_and_activate_cb,
|
|
|
|
|
info);
|
|
|
|
|
|
|
|
|
|
return nmc->return_value;
|
|
|
|
|
}
|
|
|
|
|
|
2012-11-19 17:10:56 +01:00
|
|
|
static void
|
2014-09-11 16:27:13 -04:00
|
|
|
request_rescan_cb (GObject *object, GAsyncResult *result, gpointer user_data)
|
2012-11-19 17:10:56 +01:00
|
|
|
{
|
|
|
|
|
NmCli *nmc = (NmCli *) user_data;
|
2014-09-11 16:27:13 -04:00
|
|
|
GError *error = NULL;
|
2012-11-19 17:10:56 +01:00
|
|
|
|
2014-09-11 16:27:13 -04:00
|
|
|
nm_device_wifi_request_scan_finish (NM_DEVICE_WIFI (object), result, &error);
|
2012-11-19 17:10:56 +01:00
|
|
|
if (error) {
|
2014-09-11 16:27:13 -04:00
|
|
|
g_string_printf (nmc->return_text, _("Error: %s."), error->message);
|
2012-11-19 17:10:56 +01:00
|
|
|
nmc->return_value = NMC_RESULT_ERROR_UNKNOWN;
|
2014-09-11 16:27:13 -04:00
|
|
|
g_error_free (error);
|
2012-11-19 17:10:56 +01:00
|
|
|
}
|
|
|
|
|
quit ();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static NMCResultCode
|
2013-04-22 18:39:08 +02:00
|
|
|
do_device_wifi_rescan (NmCli *nmc, int argc, char **argv)
|
2012-11-19 17:10:56 +01:00
|
|
|
{
|
|
|
|
|
NMDevice *device;
|
2013-04-18 14:54:01 +02:00
|
|
|
const char *ifname = NULL;
|
2015-07-14 09:50:56 +02:00
|
|
|
GPtrArray *ssids;
|
2016-07-12 14:45:36 +02:00
|
|
|
gs_free NMDevice **devices = NULL;
|
2015-07-14 09:50:56 +02:00
|
|
|
GVariantBuilder builder, array_builder;
|
|
|
|
|
GVariant *options;
|
|
|
|
|
const char *ssid;
|
|
|
|
|
int i;
|
2012-11-19 17:10:56 +01:00
|
|
|
|
2015-07-14 09:50:56 +02:00
|
|
|
ssids = g_ptr_array_new ();
|
2016-07-12 10:14:53 +02:00
|
|
|
devices = nmc_get_devices_sorted (nmc->client);
|
2015-07-14 09:50:56 +02:00
|
|
|
|
2017-03-30 16:09:46 +02:00
|
|
|
next_arg (nmc, &argc, &argv, NULL);
|
2012-11-19 17:10:56 +01:00
|
|
|
/* Get the parameters */
|
2015-07-14 09:50:56 +02:00
|
|
|
while (argc > 0) {
|
2016-07-12 10:14:53 +02:00
|
|
|
if (argc == 1 && nmc->complete)
|
|
|
|
|
nmc_complete_strings (*argv, "ifname", "ssid", NULL);
|
|
|
|
|
|
2013-04-18 14:54:01 +02:00
|
|
|
if (strcmp (*argv, "ifname") == 0) {
|
2015-07-14 09:50:56 +02:00
|
|
|
if (ifname) {
|
|
|
|
|
g_string_printf (nmc->return_text, _("Error: '%s' cannot repeat."), *(argv-1));
|
|
|
|
|
nmc->return_value = NMC_RESULT_ERROR_USER_INPUT;
|
2016-07-12 10:14:53 +02:00
|
|
|
goto finish;
|
2015-07-14 09:50:56 +02:00
|
|
|
}
|
2017-03-29 12:02:14 +02:00
|
|
|
argc--;
|
|
|
|
|
argv++;
|
2017-03-24 14:00:25 +01:00
|
|
|
if (!argc) {
|
2012-11-19 17:10:56 +01:00
|
|
|
g_string_printf (nmc->return_text, _("Error: %s argument is missing."), *(argv-1));
|
|
|
|
|
nmc->return_value = NMC_RESULT_ERROR_USER_INPUT;
|
2016-07-12 10:14:53 +02:00
|
|
|
goto finish;
|
2012-11-19 17:10:56 +01:00
|
|
|
}
|
2015-07-14 09:50:56 +02:00
|
|
|
ifname = *argv;
|
2016-07-12 10:14:53 +02:00
|
|
|
if (argc == 1 && nmc->complete)
|
|
|
|
|
complete_device (devices, ifname, TRUE);
|
2015-07-14 09:50:56 +02:00
|
|
|
} else if (strcmp (*argv, "ssid") == 0) {
|
2017-03-29 12:02:14 +02:00
|
|
|
argc--;
|
|
|
|
|
argv++;
|
2017-03-24 14:00:25 +01:00
|
|
|
if (!argc) {
|
2015-07-14 09:50:56 +02:00
|
|
|
g_string_printf (nmc->return_text, _("Error: %s argument is missing."), *(argv-1));
|
|
|
|
|
nmc->return_value = NMC_RESULT_ERROR_USER_INPUT;
|
2016-07-12 10:14:53 +02:00
|
|
|
goto finish;
|
2015-07-14 09:50:56 +02:00
|
|
|
}
|
|
|
|
|
g_ptr_array_add (ssids, *argv);
|
2016-07-12 10:14:53 +02:00
|
|
|
} else if (!nmc->complete)
|
2015-07-14 09:50:56 +02:00
|
|
|
g_printerr (_("Unknown parameter: %s\n"), *argv);
|
|
|
|
|
|
2017-03-30 16:09:46 +02:00
|
|
|
next_arg (nmc, &argc, &argv, NULL);
|
2012-11-19 17:10:56 +01:00
|
|
|
}
|
|
|
|
|
|
2016-07-12 10:14:53 +02:00
|
|
|
if (nmc->complete)
|
|
|
|
|
goto finish;
|
|
|
|
|
|
2013-04-18 14:54:01 +02:00
|
|
|
/* Find Wi-Fi device to scan on. When no ifname is provided, the first Wi-Fi is used. */
|
2016-07-12 12:33:31 +02:00
|
|
|
device = find_wifi_device_by_iface (devices, ifname, NULL);
|
2012-11-19 17:10:56 +01:00
|
|
|
|
|
|
|
|
if (!device) {
|
2015-08-13 09:48:12 +02:00
|
|
|
if (ifname)
|
|
|
|
|
g_string_printf (nmc->return_text, _("Error: Device '%s' is not a Wi-Fi device."), ifname);
|
|
|
|
|
else
|
2012-11-19 17:10:56 +01:00
|
|
|
g_string_printf (nmc->return_text, _("Error: No Wi-Fi device found."));
|
|
|
|
|
nmc->return_value = NMC_RESULT_ERROR_UNKNOWN;
|
2016-07-12 10:14:53 +02:00
|
|
|
goto finish;
|
2012-11-19 17:10:56 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2015-07-14 09:50:56 +02:00
|
|
|
if (ssids->len) {
|
|
|
|
|
g_variant_builder_init (&builder, G_VARIANT_TYPE_VARDICT);
|
|
|
|
|
g_variant_builder_init (&array_builder, G_VARIANT_TYPE ("aay"));
|
|
|
|
|
|
|
|
|
|
for (i = 0; i < ssids->len; i++) {
|
|
|
|
|
ssid = g_ptr_array_index (ssids, i);
|
|
|
|
|
g_variant_builder_add (&array_builder, "@ay",
|
|
|
|
|
g_variant_new_fixed_array (G_VARIANT_TYPE_BYTE, ssid, strlen (ssid), 1));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
g_variant_builder_add (&builder, "{sv}", "ssids", g_variant_builder_end (&array_builder));
|
|
|
|
|
options = g_variant_builder_end (&builder);
|
|
|
|
|
|
|
|
|
|
nm_device_wifi_request_scan_options_async (NM_DEVICE_WIFI (device), options,
|
|
|
|
|
NULL, request_rescan_cb, nmc);
|
|
|
|
|
} else
|
|
|
|
|
nm_device_wifi_request_scan_async (NM_DEVICE_WIFI (device),
|
|
|
|
|
NULL, request_rescan_cb, nmc);
|
|
|
|
|
|
2015-03-27 12:39:17 +01:00
|
|
|
nmc->should_wait++;
|
2016-07-12 10:14:53 +02:00
|
|
|
finish:
|
2015-07-14 09:50:56 +02:00
|
|
|
g_ptr_array_free (ssids, FALSE);
|
2012-11-19 17:10:56 +01:00
|
|
|
return nmc->return_value;
|
|
|
|
|
}
|
|
|
|
|
|
2016-06-24 19:03:33 +02:00
|
|
|
static NMCCommand device_wifi_cmds[] = {
|
2016-08-31 20:52:48 +02:00
|
|
|
{ "list", do_device_wifi_list, NULL, TRUE, TRUE },
|
|
|
|
|
{ "connect", do_device_wifi_connect_network, NULL, TRUE, TRUE },
|
|
|
|
|
{ "hotspot", do_device_wifi_hotspot, NULL, TRUE, TRUE },
|
|
|
|
|
{ "rescan", do_device_wifi_rescan, NULL, TRUE, TRUE },
|
|
|
|
|
{ NULL, do_device_wifi_list, NULL, TRUE, TRUE },
|
2016-06-24 19:03:33 +02:00
|
|
|
};
|
|
|
|
|
|
2010-02-25 09:52:30 -08:00
|
|
|
static NMCResultCode
|
|
|
|
|
do_device_wifi (NmCli *nmc, int argc, char **argv)
|
|
|
|
|
{
|
2017-03-30 16:09:46 +02:00
|
|
|
next_arg (nmc, &argc, &argv, NULL);
|
2016-08-31 21:04:33 +02:00
|
|
|
nmc_do_cmd (nmc, device_wifi_cmds, *argv, argc, argv);
|
|
|
|
|
|
|
|
|
|
return nmc->return_value;
|
2010-02-25 09:52:30 -08:00
|
|
|
}
|
|
|
|
|
|
2015-11-10 14:06:02 +01:00
|
|
|
static int
|
cli: split tracking of meta data out of NmcOutputField
When generating output data, nmcli iterates over a list of
property-descriptors (nmc_fields_ip4_config), creates an intermediate
array (output_data) and finally prints it.
However, previously both the meta data (nmc_fields_ip4_config) and
the intermediate format use the same type NmcOutputField. This means,
certain fields are relevant to describe a property, and other fields
are output/formatting fields.
Split this up. Now, the meta data is tracked in form of an NMMetaAbstractInfo
lists. This separates the information about properties from intermediate steps
during creation of the output.
Note that currently functions like print_ip4_config() still have all the
knowledge about how to generate the output. That is wrong, instead, the
meta data (NMMetaAbstractInfo) should describe how to create the output
and then all those functions could be replaced. This means, later we want
to add more knowledge to the NMMetaAbstractInfo, so it is important to
keep them separate from NmcOutputField.
2017-03-31 19:18:16 +02:00
|
|
|
show_device_lldp_list (NMDevice *device, NmCli *nmc, const char *fields_str, int *counter)
|
2015-11-10 14:06:02 +01:00
|
|
|
{
|
cli: split tracking of meta data out of NmcOutputField
When generating output data, nmcli iterates over a list of
property-descriptors (nmc_fields_ip4_config), creates an intermediate
array (output_data) and finally prints it.
However, previously both the meta data (nmc_fields_ip4_config) and
the intermediate format use the same type NmcOutputField. This means,
certain fields are relevant to describe a property, and other fields
are output/formatting fields.
Split this up. Now, the meta data is tracked in form of an NMMetaAbstractInfo
lists. This separates the information about properties from intermediate steps
during creation of the output.
Note that currently functions like print_ip4_config() still have all the
knowledge about how to generate the output. That is wrong, instead, the
meta data (NMMetaAbstractInfo) should describe how to create the output
and then all those functions could be replaced. This means, later we want
to add more knowledge to the NMMetaAbstractInfo, so it is important to
keep them separate from NmcOutputField.
2017-03-31 19:18:16 +02:00
|
|
|
const NMMetaAbstractInfo *const*tmpl;
|
|
|
|
|
NmcOutputField *arr;
|
2015-11-10 14:06:02 +01:00
|
|
|
GPtrArray *neighbors;
|
|
|
|
|
const char *str;
|
|
|
|
|
int i;
|
2017-03-30 14:56:19 +02:00
|
|
|
NMC_OUTPUT_DATA_DEFINE_SCOPED (out);
|
2017-03-31 13:21:47 +02:00
|
|
|
gs_free char *header_name = NULL;
|
2015-11-10 14:06:02 +01:00
|
|
|
|
|
|
|
|
neighbors = nm_device_get_lldp_neighbors (device);
|
|
|
|
|
|
|
|
|
|
if (!neighbors || !neighbors->len)
|
|
|
|
|
return 0;
|
|
|
|
|
|
cli: split tracking of meta data out of NmcOutputField
When generating output data, nmcli iterates over a list of
property-descriptors (nmc_fields_ip4_config), creates an intermediate
array (output_data) and finally prints it.
However, previously both the meta data (nmc_fields_ip4_config) and
the intermediate format use the same type NmcOutputField. This means,
certain fields are relevant to describe a property, and other fields
are output/formatting fields.
Split this up. Now, the meta data is tracked in form of an NMMetaAbstractInfo
lists. This separates the information about properties from intermediate steps
during creation of the output.
Note that currently functions like print_ip4_config() still have all the
knowledge about how to generate the output. That is wrong, instead, the
meta data (NMMetaAbstractInfo) should describe how to create the output
and then all those functions could be replaced. This means, later we want
to add more knowledge to the NMMetaAbstractInfo, so it is important to
keep them separate from NmcOutputField.
2017-03-31 19:18:16 +02:00
|
|
|
tmpl = (const NMMetaAbstractInfo *const*) nmc_fields_dev_lldp_list;
|
2015-11-10 14:06:02 +01:00
|
|
|
|
|
|
|
|
/* Main header name */
|
2017-03-31 13:21:47 +02:00
|
|
|
header_name = construct_header_name (_("Device LLDP neighbors"),
|
|
|
|
|
nm_device_get_iface (device));
|
cli: split tracking of meta data out of NmcOutputField
When generating output data, nmcli iterates over a list of
property-descriptors (nmc_fields_ip4_config), creates an intermediate
array (output_data) and finally prints it.
However, previously both the meta data (nmc_fields_ip4_config) and
the intermediate format use the same type NmcOutputField. This means,
certain fields are relevant to describe a property, and other fields
are output/formatting fields.
Split this up. Now, the meta data is tracked in form of an NMMetaAbstractInfo
lists. This separates the information about properties from intermediate steps
during creation of the output.
Note that currently functions like print_ip4_config() still have all the
knowledge about how to generate the output. That is wrong, instead, the
meta data (NMMetaAbstractInfo) should describe how to create the output
and then all those functions could be replaced. This means, later we want
to add more knowledge to the NMMetaAbstractInfo, so it is important to
keep them separate from NmcOutputField.
2017-03-31 19:18:16 +02:00
|
|
|
out_indices = parse_output_fields (fields_str, (const NMMetaAbstractInfo *const*) nmc_fields_dev_lldp_list, FALSE, NULL, NULL);
|
|
|
|
|
arr = nmc_dup_fields_array (tmpl, NMC_OF_FLAG_MAIN_HEADER_ADD | NMC_OF_FLAG_FIELD_NAMES);
|
2017-03-30 14:56:19 +02:00
|
|
|
g_ptr_array_add (out.output_data, arr);
|
2015-11-10 14:06:02 +01:00
|
|
|
|
|
|
|
|
for (i = 0; i < neighbors->len; i++) {
|
|
|
|
|
NMLldpNeighbor *neighbor = neighbors->pdata[i];
|
|
|
|
|
guint value;
|
|
|
|
|
|
cli: split tracking of meta data out of NmcOutputField
When generating output data, nmcli iterates over a list of
property-descriptors (nmc_fields_ip4_config), creates an intermediate
array (output_data) and finally prints it.
However, previously both the meta data (nmc_fields_ip4_config) and
the intermediate format use the same type NmcOutputField. This means,
certain fields are relevant to describe a property, and other fields
are output/formatting fields.
Split this up. Now, the meta data is tracked in form of an NMMetaAbstractInfo
lists. This separates the information about properties from intermediate steps
during creation of the output.
Note that currently functions like print_ip4_config() still have all the
knowledge about how to generate the output. That is wrong, instead, the
meta data (NMMetaAbstractInfo) should describe how to create the output
and then all those functions could be replaced. This means, later we want
to add more knowledge to the NMMetaAbstractInfo, so it is important to
keep them separate from NmcOutputField.
2017-03-31 19:18:16 +02:00
|
|
|
arr = nmc_dup_fields_array (tmpl, NMC_OF_FLAG_SECTION_PREFIX);
|
2015-11-10 14:06:02 +01:00
|
|
|
set_val_str (arr, 0, g_strdup_printf ("NEIGHBOR[%d]", (*counter)++));
|
|
|
|
|
|
|
|
|
|
set_val_strc (arr, 1, nm_device_get_iface (device));
|
|
|
|
|
|
|
|
|
|
if (nm_lldp_neighbor_get_attr_string_value (neighbor, NM_LLDP_ATTR_CHASSIS_ID, &str))
|
|
|
|
|
set_val_strc (arr, 2, str);
|
|
|
|
|
|
|
|
|
|
if (nm_lldp_neighbor_get_attr_string_value (neighbor, NM_LLDP_ATTR_PORT_ID, &str))
|
|
|
|
|
set_val_strc (arr, 3, str);
|
|
|
|
|
|
|
|
|
|
if (nm_lldp_neighbor_get_attr_string_value (neighbor, NM_LLDP_ATTR_PORT_DESCRIPTION, &str))
|
|
|
|
|
set_val_strc (arr, 4, str);
|
|
|
|
|
|
|
|
|
|
if (nm_lldp_neighbor_get_attr_string_value (neighbor, NM_LLDP_ATTR_SYSTEM_NAME, &str))
|
|
|
|
|
set_val_strc (arr, 5, str);
|
|
|
|
|
|
|
|
|
|
if (nm_lldp_neighbor_get_attr_string_value (neighbor, NM_LLDP_ATTR_SYSTEM_DESCRIPTION, &str))
|
|
|
|
|
set_val_strc (arr, 6, str);
|
|
|
|
|
|
|
|
|
|
if (nm_lldp_neighbor_get_attr_uint_value (neighbor, NM_LLDP_ATTR_SYSTEM_CAPABILITIES, &value))
|
|
|
|
|
set_val_str (arr, 7, g_strdup_printf ("%u (%s)", value, nmc_parse_lldp_capabilities (value)));
|
|
|
|
|
|
|
|
|
|
if (nm_lldp_neighbor_get_attr_uint_value (neighbor, NM_LLDP_ATTR_IEEE_802_1_PVID, &value))
|
|
|
|
|
set_val_str (arr, 8, g_strdup_printf ("%u", value));
|
|
|
|
|
|
|
|
|
|
if (nm_lldp_neighbor_get_attr_uint_value (neighbor, NM_LLDP_ATTR_IEEE_802_1_PPVID, &value))
|
|
|
|
|
set_val_str (arr, 9, g_strdup_printf ("%u", value));
|
|
|
|
|
|
|
|
|
|
if (nm_lldp_neighbor_get_attr_uint_value (neighbor, NM_LLDP_ATTR_IEEE_802_1_PPVID_FLAGS, &value))
|
|
|
|
|
set_val_str (arr, 10, g_strdup_printf ("%u", value));
|
|
|
|
|
|
|
|
|
|
if (nm_lldp_neighbor_get_attr_uint_value (neighbor, NM_LLDP_ATTR_IEEE_802_1_VID, &value))
|
|
|
|
|
set_val_str (arr, 11, g_strdup_printf ("%u", value));
|
|
|
|
|
|
|
|
|
|
if (nm_lldp_neighbor_get_attr_string_value (neighbor, NM_LLDP_ATTR_IEEE_802_1_VLAN_NAME, &str))
|
|
|
|
|
set_val_strc (arr, 12, str);
|
|
|
|
|
|
|
|
|
|
if (nm_lldp_neighbor_get_attr_string_value (neighbor, NM_LLDP_ATTR_DESTINATION, &str))
|
|
|
|
|
set_val_strc (arr, 13, str);
|
|
|
|
|
|
|
|
|
|
if (nm_lldp_neighbor_get_attr_uint_value (neighbor, NM_LLDP_ATTR_CHASSIS_ID_TYPE, &value))
|
|
|
|
|
set_val_strc (arr, 14, g_strdup_printf ("%u", value));
|
|
|
|
|
|
|
|
|
|
if (nm_lldp_neighbor_get_attr_uint_value (neighbor, NM_LLDP_ATTR_PORT_ID_TYPE, &value))
|
|
|
|
|
set_val_strc (arr, 15, g_strdup_printf ("%u", value));
|
|
|
|
|
|
2017-03-30 14:56:19 +02:00
|
|
|
g_ptr_array_add (out.output_data, arr);
|
2015-11-10 14:06:02 +01:00
|
|
|
}
|
|
|
|
|
|
2017-03-30 14:56:19 +02:00
|
|
|
print_data_prepare_width (out.output_data);
|
2017-03-31 13:21:47 +02:00
|
|
|
print_data (&nmc->nmc_config, out_indices, header_name, 0, &out);
|
2015-11-10 14:06:02 +01:00
|
|
|
|
|
|
|
|
return neighbors->len;
|
|
|
|
|
}
|
|
|
|
|
|
2016-06-24 19:03:11 +02:00
|
|
|
static NMCResultCode
|
2015-11-10 14:06:02 +01:00
|
|
|
do_device_lldp_list (NmCli *nmc, int argc, char **argv)
|
|
|
|
|
{
|
2016-06-24 19:22:36 +02:00
|
|
|
NMDevice *device = NULL;
|
|
|
|
|
gs_free_error GError *error = NULL;
|
cli: split tracking of meta data out of NmcOutputField
When generating output data, nmcli iterates over a list of
property-descriptors (nmc_fields_ip4_config), creates an intermediate
array (output_data) and finally prints it.
However, previously both the meta data (nmc_fields_ip4_config) and
the intermediate format use the same type NmcOutputField. This means,
certain fields are relevant to describe a property, and other fields
are output/formatting fields.
Split this up. Now, the meta data is tracked in form of an NMMetaAbstractInfo
lists. This separates the information about properties from intermediate steps
during creation of the output.
Note that currently functions like print_ip4_config() still have all the
knowledge about how to generate the output. That is wrong, instead, the
meta data (NMMetaAbstractInfo) should describe how to create the output
and then all those functions could be replaced. This means, later we want
to add more knowledge to the NMMetaAbstractInfo, so it is important to
keep them separate from NmcOutputField.
2017-03-31 19:18:16 +02:00
|
|
|
const char *fields_str = NULL;
|
2016-06-24 19:22:36 +02:00
|
|
|
int counter = 0;
|
cli: split tracking of meta data out of NmcOutputField
When generating output data, nmcli iterates over a list of
property-descriptors (nmc_fields_ip4_config), creates an intermediate
array (output_data) and finally prints it.
However, previously both the meta data (nmc_fields_ip4_config) and
the intermediate format use the same type NmcOutputField. This means,
certain fields are relevant to describe a property, and other fields
are output/formatting fields.
Split this up. Now, the meta data is tracked in form of an NMMetaAbstractInfo
lists. This separates the information about properties from intermediate steps
during creation of the output.
Note that currently functions like print_ip4_config() still have all the
knowledge about how to generate the output. That is wrong, instead, the
meta data (NMMetaAbstractInfo) should describe how to create the output
and then all those functions could be replaced. This means, later we want
to add more knowledge to the NMMetaAbstractInfo, so it is important to
keep them separate from NmcOutputField.
2017-03-31 19:18:16 +02:00
|
|
|
gs_unref_array GArray *out_indices = NULL;
|
2015-11-10 14:06:02 +01:00
|
|
|
|
2017-03-30 16:09:46 +02:00
|
|
|
next_arg (nmc, &argc, &argv, NULL);
|
2015-11-10 14:06:02 +01:00
|
|
|
while (argc > 0) {
|
2016-06-24 19:03:14 +02:00
|
|
|
if (argc == 1 && nmc->complete)
|
|
|
|
|
nmc_complete_strings (*argv, "ifname", NULL);
|
|
|
|
|
|
2015-11-10 14:06:02 +01:00
|
|
|
if (strcmp (*argv, "ifname") == 0) {
|
2017-03-29 12:02:14 +02:00
|
|
|
argc--;
|
|
|
|
|
argv++;
|
2017-03-24 14:00:25 +01:00
|
|
|
if (!argc) {
|
2015-11-10 14:06:02 +01:00
|
|
|
g_string_printf (nmc->return_text, _("Error: %s argument is missing."), *(argv-1));
|
2016-06-24 19:22:36 +02:00
|
|
|
return NMC_RESULT_ERROR_USER_INPUT;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
device = get_device (nmc, &argc, &argv, &error);
|
|
|
|
|
if (!device) {
|
|
|
|
|
g_string_printf (nmc->return_text, _("Error: %s."), error->message);
|
|
|
|
|
return error->code;
|
2015-11-10 14:06:02 +01:00
|
|
|
}
|
|
|
|
|
} else {
|
2016-02-12 15:43:19 +01:00
|
|
|
g_string_printf (nmc->return_text, _("Error: invalid extra argument '%s'."), *argv);
|
2016-06-24 19:22:36 +02:00
|
|
|
return NMC_RESULT_ERROR_USER_INPUT;
|
2015-11-10 14:06:02 +01:00
|
|
|
}
|
|
|
|
|
|
2017-03-30 16:09:46 +02:00
|
|
|
next_arg (nmc, &argc, &argv, NULL);
|
2015-11-10 14:06:02 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!nmc->required_fields || strcasecmp (nmc->required_fields, "common") == 0)
|
|
|
|
|
fields_str = NMC_FIELDS_DEV_LLDP_LIST_COMMON;
|
cli: split tracking of meta data out of NmcOutputField
When generating output data, nmcli iterates over a list of
property-descriptors (nmc_fields_ip4_config), creates an intermediate
array (output_data) and finally prints it.
However, previously both the meta data (nmc_fields_ip4_config) and
the intermediate format use the same type NmcOutputField. This means,
certain fields are relevant to describe a property, and other fields
are output/formatting fields.
Split this up. Now, the meta data is tracked in form of an NMMetaAbstractInfo
lists. This separates the information about properties from intermediate steps
during creation of the output.
Note that currently functions like print_ip4_config() still have all the
knowledge about how to generate the output. That is wrong, instead, the
meta data (NMMetaAbstractInfo) should describe how to create the output
and then all those functions could be replaced. This means, later we want
to add more knowledge to the NMMetaAbstractInfo, so it is important to
keep them separate from NmcOutputField.
2017-03-31 19:18:16 +02:00
|
|
|
else if (!nmc->required_fields || strcasecmp (nmc->required_fields, "all") == 0) {
|
|
|
|
|
} else
|
2015-11-10 14:06:02 +01:00
|
|
|
fields_str = nmc->required_fields;
|
|
|
|
|
|
cli: split tracking of meta data out of NmcOutputField
When generating output data, nmcli iterates over a list of
property-descriptors (nmc_fields_ip4_config), creates an intermediate
array (output_data) and finally prints it.
However, previously both the meta data (nmc_fields_ip4_config) and
the intermediate format use the same type NmcOutputField. This means,
certain fields are relevant to describe a property, and other fields
are output/formatting fields.
Split this up. Now, the meta data is tracked in form of an NMMetaAbstractInfo
lists. This separates the information about properties from intermediate steps
during creation of the output.
Note that currently functions like print_ip4_config() still have all the
knowledge about how to generate the output. That is wrong, instead, the
meta data (NMMetaAbstractInfo) should describe how to create the output
and then all those functions could be replaced. This means, later we want
to add more knowledge to the NMMetaAbstractInfo, so it is important to
keep them separate from NmcOutputField.
2017-03-31 19:18:16 +02:00
|
|
|
out_indices = parse_output_fields (fields_str, (const NMMetaAbstractInfo *const*) nmc_fields_dev_lldp_list, FALSE, NULL, &error);
|
2015-11-10 14:06:02 +01:00
|
|
|
|
|
|
|
|
if (error) {
|
|
|
|
|
g_string_printf (nmc->return_text, _("Error: 'device lldp list': %s"), error->message);
|
2016-06-24 19:22:36 +02:00
|
|
|
return NMC_RESULT_ERROR_USER_INPUT;
|
2015-11-10 14:06:02 +01:00
|
|
|
}
|
|
|
|
|
|
2016-06-24 19:03:14 +02:00
|
|
|
if (nmc->complete)
|
|
|
|
|
return nmc->return_value;
|
2015-11-10 14:06:02 +01:00
|
|
|
|
2016-06-24 19:22:36 +02:00
|
|
|
if (device) {
|
2015-11-10 14:06:02 +01:00
|
|
|
show_device_lldp_list (device, nmc, fields_str, &counter);
|
|
|
|
|
} else {
|
2016-07-01 21:45:43 +02:00
|
|
|
NMDevice **devices = nmc_get_devices_sorted (nmc->client);
|
2016-06-24 19:22:36 +02:00
|
|
|
int i;
|
|
|
|
|
|
2017-03-30 14:56:19 +02:00
|
|
|
for (i = 0; devices[i]; i++)
|
2015-11-10 14:06:02 +01:00
|
|
|
show_device_lldp_list (devices[i], nmc, fields_str, &counter);
|
2016-06-24 19:22:36 +02:00
|
|
|
|
|
|
|
|
g_free (devices);
|
2015-11-10 14:06:02 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return nmc->return_value;
|
|
|
|
|
}
|
|
|
|
|
|
2016-06-24 19:03:11 +02:00
|
|
|
static NMCCommand device_lldp_cmds[] = {
|
2016-08-31 20:52:48 +02:00
|
|
|
{ "list", do_device_lldp_list, NULL, TRUE, TRUE },
|
|
|
|
|
{ NULL, do_device_lldp_list, NULL, TRUE, TRUE },
|
2016-06-24 19:03:11 +02:00
|
|
|
};
|
|
|
|
|
|
2015-11-10 14:06:02 +01:00
|
|
|
static NMCResultCode
|
|
|
|
|
do_device_lldp (NmCli *nmc, int argc, char **argv)
|
|
|
|
|
{
|
2016-06-23 12:19:10 +02:00
|
|
|
if (!nmc->mode_specified)
|
2017-03-30 12:45:41 +02:00
|
|
|
nmc->nmc_config_mutable.multiline_output = TRUE; /* multiline mode is default for 'device lldp' */
|
2016-06-23 12:19:10 +02:00
|
|
|
|
2017-03-30 16:09:46 +02:00
|
|
|
next_arg (nmc, &argc, &argv, NULL);
|
2016-08-31 21:04:33 +02:00
|
|
|
nmc_do_cmd (nmc, device_lldp_cmds, *argv, argc, argv);
|
|
|
|
|
|
|
|
|
|
return nmc->return_value;
|
2015-11-10 14:06:02 +01:00
|
|
|
}
|
|
|
|
|
|
2014-05-15 12:52:26 +02:00
|
|
|
static gboolean
|
|
|
|
|
is_single_word (const char* line)
|
|
|
|
|
{
|
|
|
|
|
size_t n1, n2, n3;
|
|
|
|
|
|
|
|
|
|
n1 = strspn (line, " \t");
|
|
|
|
|
n2 = strcspn (line+n1, " \t\0") + n1;
|
|
|
|
|
n3 = strspn (line+n2, " \t");
|
|
|
|
|
|
|
|
|
|
if (n3 == 0)
|
|
|
|
|
return TRUE;
|
|
|
|
|
else
|
|
|
|
|
return FALSE;
|
|
|
|
|
}
|
|
|
|
|
|
2014-05-14 09:22:50 +02:00
|
|
|
static char **
|
2014-06-06 11:22:24 +02:00
|
|
|
nmcli_device_tab_completion (const char *text, int start, int end)
|
2014-05-14 09:22:50 +02:00
|
|
|
{
|
2014-05-15 12:52:26 +02:00
|
|
|
char **match_array = NULL;
|
2014-06-06 11:22:24 +02:00
|
|
|
rl_compentry_func_t *generator_func = NULL;
|
2014-05-15 12:52:26 +02:00
|
|
|
|
2014-05-14 09:22:50 +02:00
|
|
|
/* Disable readline's default filename completion */
|
|
|
|
|
rl_attempted_completion_over = 1;
|
2014-05-15 12:52:26 +02:00
|
|
|
|
2015-03-11 19:10:58 +01:00
|
|
|
if (g_strcmp0 (rl_prompt, PROMPT_INTERFACE) == 0) {
|
|
|
|
|
/* Disable appending space after completion */
|
|
|
|
|
rl_completion_append_character = '\0';
|
2014-05-15 12:52:26 +02:00
|
|
|
|
2015-03-11 19:10:58 +01:00
|
|
|
if (!is_single_word (rl_line_buffer))
|
|
|
|
|
return NULL;
|
2014-05-15 12:52:26 +02:00
|
|
|
|
2016-09-15 01:20:53 +02:00
|
|
|
generator_func = nmc_rl_gen_func_ifnames;
|
2015-03-11 19:10:58 +01:00
|
|
|
} else if (g_strcmp0 (rl_prompt, PROMPT_INTERFACES) == 0) {
|
2016-09-15 01:20:53 +02:00
|
|
|
generator_func = nmc_rl_gen_func_ifnames;
|
2015-03-11 19:10:58 +01:00
|
|
|
}
|
2014-05-15 12:52:26 +02:00
|
|
|
|
|
|
|
|
if (generator_func)
|
|
|
|
|
match_array = rl_completion_matches (text, generator_func);
|
|
|
|
|
|
|
|
|
|
return match_array;
|
2014-05-14 09:22:50 +02:00
|
|
|
}
|
|
|
|
|
|
2016-06-23 12:19:10 +02:00
|
|
|
static const NMCCommand device_cmds[] = {
|
2016-08-31 20:52:48 +02:00
|
|
|
{ "status", do_devices_status, usage_device_status, TRUE, TRUE },
|
|
|
|
|
{ "show", do_device_show, usage_device_show, TRUE, TRUE },
|
|
|
|
|
{ "connect", do_device_connect, usage_device_connect, TRUE, TRUE },
|
|
|
|
|
{ "reapply", do_device_reapply, usage_device_reapply, TRUE, TRUE },
|
|
|
|
|
{ "disconnect", do_devices_disconnect, usage_device_disconnect, TRUE, TRUE },
|
|
|
|
|
{ "delete", do_devices_delete, usage_device_delete, TRUE, TRUE },
|
|
|
|
|
{ "set", do_device_set, usage_device_set, TRUE, TRUE },
|
|
|
|
|
{ "monitor", do_devices_monitor, usage_device_monitor, TRUE, TRUE },
|
|
|
|
|
{ "wifi", do_device_wifi, usage_device_wifi, FALSE, FALSE },
|
|
|
|
|
{ "lldp", do_device_lldp, usage_device_lldp, FALSE, FALSE },
|
|
|
|
|
{ "modify", do_device_modify, usage_device_modify, TRUE, TRUE },
|
|
|
|
|
{ NULL, do_devices_status, usage, TRUE, TRUE },
|
2016-06-23 12:19:10 +02:00
|
|
|
};
|
|
|
|
|
|
2010-02-25 09:52:30 -08:00
|
|
|
NMCResultCode
|
|
|
|
|
do_devices (NmCli *nmc, int argc, char **argv)
|
|
|
|
|
{
|
2017-03-30 16:09:46 +02:00
|
|
|
next_arg (nmc, &argc, &argv, NULL);
|
|
|
|
|
|
2014-10-30 15:45:43 +01:00
|
|
|
/* Register polkit agent */
|
|
|
|
|
nmc_start_polkit_agent_start_try (nmc);
|
|
|
|
|
|
2014-06-06 11:22:24 +02:00
|
|
|
rl_attempted_completion_function = (rl_completion_func_t *) nmcli_device_tab_completion;
|
2014-05-14 09:22:50 +02:00
|
|
|
|
2016-08-31 21:04:33 +02:00
|
|
|
nmc_do_cmd (nmc, device_cmds, *argv, argc, argv);
|
|
|
|
|
|
|
|
|
|
return nmc->return_value;
|
2010-02-25 09:52:30 -08:00
|
|
|
}
|
2015-03-27 13:07:43 +01:00
|
|
|
|
|
|
|
|
void
|
|
|
|
|
monitor_devices (NmCli *nmc)
|
|
|
|
|
{
|
2016-06-23 18:49:39 +02:00
|
|
|
do_devices_monitor (nmc, 0, NULL);
|
2015-03-27 13:07:43 +01:00
|
|
|
}
|