ifcfg-rh: preserve existence of wired setting

Currently the plugin doesn't preserve the existence of a wired setting
because the writer saves only variables with non-default values and,
especially, the reader always creates the setting.

Fix this; now the writer writes HWADDR even if empty when the setting
is present; the reader creates the setting when at least one property
is found.

https://gitlab.freedesktop.org/NetworkManager/NetworkManager/merge_requests/166
https://bugzilla.redhat.com/show_bug.cgi?id=1703960
(cherry picked from commit d6a51ced40)
This commit is contained in:
Beniamino Galvani 2019-05-23 11:21:04 +02:00
parent e14cc0d424
commit bb5038defc
7 changed files with 158 additions and 79 deletions

View file

@ -693,6 +693,8 @@ _nm_g_slice_free_fcn_define (16)
* @NM_UTILS_ERROR_CONNECTION_AVAILABLE_TEMPORARY: the profile is currently not * @NM_UTILS_ERROR_CONNECTION_AVAILABLE_TEMPORARY: the profile is currently not
* available/compatible with the device, but this may be only temporary. * available/compatible with the device, but this may be only temporary.
* *
* @NM_UTILS_ERROR_SETTING_MISSING: the setting is missing
*
* @NM_UTILS_ERROR_INVALID_ARGUMENT: invalid argument. * @NM_UTILS_ERROR_INVALID_ARGUMENT: invalid argument.
*/ */
typedef enum { typedef enum {
@ -715,6 +717,8 @@ typedef enum {
NM_UTILS_ERROR_CONNECTION_AVAILABLE_UNMANAGED_DEVICE, NM_UTILS_ERROR_CONNECTION_AVAILABLE_UNMANAGED_DEVICE,
NM_UTILS_ERROR_CONNECTION_AVAILABLE_TEMPORARY, NM_UTILS_ERROR_CONNECTION_AVAILABLE_TEMPORARY,
NM_UTILS_ERROR_SETTING_MISSING,
} NMUtilsError; } NMUtilsError;
#define NM_UTILS_ERROR (nm_utils_error_quark ()) #define NM_UTILS_ERROR (nm_utils_error_quark ())

View file

@ -4369,9 +4369,11 @@ parse_ethtool_options (shvarFile *ifcfg, NMConnection *connection)
gboolean autoneg = FALSE; gboolean autoneg = FALSE;
guint32 speed = 0; guint32 speed = 0;
const char *duplex = NULL; const char *duplex = NULL;
gboolean wired_found = FALSE;
ethtool_opts = svGetValue (ifcfg, "ETHTOOL_OPTS", &ethtool_opts_free); ethtool_opts = svGetValue (ifcfg, "ETHTOOL_OPTS", &ethtool_opts_free);
if (ethtool_opts) { if (ethtool_opts) {
wired_found = TRUE;
/* WAKE_ON_LAN_IGNORE is inferred from a specified but empty ETHTOOL_OPTS */ /* WAKE_ON_LAN_IGNORE is inferred from a specified but empty ETHTOOL_OPTS */
if (!ethtool_opts[0]) if (!ethtool_opts[0])
wol_flags = NM_SETTING_WIRED_WAKE_ON_LAN_IGNORE; wol_flags = NM_SETTING_WIRED_WAKE_ON_LAN_IGNORE;
@ -4395,7 +4397,9 @@ parse_ethtool_options (shvarFile *ifcfg, NMConnection *connection)
} }
/* ETHTOOL_WAKE_ON_LAN = ignore overrides WoL settings in ETHTOOL_OPTS */ /* ETHTOOL_WAKE_ON_LAN = ignore overrides WoL settings in ETHTOOL_OPTS */
tmp = svGetValueStr (ifcfg, "ETHTOOL_WAKE_ON_LAN", &wol_value_free); tmp = svGetValue (ifcfg, "ETHTOOL_WAKE_ON_LAN", &wol_value_free);
if (tmp)
wired_found = TRUE;
if (nm_streq0 (tmp, "ignore")) if (nm_streq0 (tmp, "ignore"))
wol_flags = NM_SETTING_WIRED_WAKE_ON_LAN_IGNORE; wol_flags = NM_SETTING_WIRED_WAKE_ON_LAN_IGNORE;
else if (tmp) else if (tmp)
@ -4408,6 +4412,10 @@ parse_ethtool_options (shvarFile *ifcfg, NMConnection *connection)
} }
s_wired = nm_connection_get_setting_wired (connection); s_wired = nm_connection_get_setting_wired (connection);
if (!s_wired && wired_found) {
s_wired = (NMSettingWired *) nm_setting_wired_new ();
nm_connection_add_setting (connection, NM_SETTING (s_wired));
}
if (s_wired) { if (s_wired) {
g_object_set (s_wired, g_object_set (s_wired,
NM_SETTING_WIRED_WAKE_ON_LAN, wol_flags, NM_SETTING_WIRED_WAKE_ON_LAN, wol_flags,
@ -4433,86 +4441,100 @@ make_wired_setting (shvarFile *ifcfg,
gs_unref_object NMSettingWired *s_wired = NULL; gs_unref_object NMSettingWired *s_wired = NULL;
const char *cvalue; const char *cvalue;
gs_free char *value = NULL; gs_free char *value = NULL;
char *nettype; gboolean found = FALSE;
s_wired = NM_SETTING_WIRED (nm_setting_wired_new ()); s_wired = NM_SETTING_WIRED (nm_setting_wired_new ());
value = svGetValueStr_cp (ifcfg, "MTU"); cvalue = svGetValue (ifcfg, "MTU", &value);
if (value) { if (cvalue) {
int mtu; int mtu;
mtu = _nm_utils_ascii_str_to_int64 (value, 0, 0, 65535, -1); mtu = _nm_utils_ascii_str_to_int64 (cvalue, 0, 0, 65535, -1);
if (mtu >= 0) if (mtu >= 0)
g_object_set (s_wired, NM_SETTING_WIRED_MTU, (guint) mtu, NULL); g_object_set (s_wired, NM_SETTING_WIRED_MTU, (guint) mtu, NULL);
else else
PARSE_WARNING ("invalid MTU '%s'", value); PARSE_WARNING ("invalid MTU '%s'", cvalue);
nm_clear_g_free (&value); nm_clear_g_free (&value);
found = TRUE;
} }
value = svGetValueStr_cp (ifcfg, "HWADDR"); value = svGetValue_cp (ifcfg, "HWADDR");
if (value) { if (value) {
value = g_strstrip (value); if (value[0] != '\0') {
g_object_set (s_wired, NM_SETTING_WIRED_MAC_ADDRESS, value, NULL); value = g_strstrip (value);
g_object_set (s_wired, NM_SETTING_WIRED_MAC_ADDRESS, value, NULL);
}
nm_clear_g_free (&value); nm_clear_g_free (&value);
found = TRUE;
} }
value = svGetValueStr_cp (ifcfg, "SUBCHANNELS"); cvalue = svGetValue (ifcfg, "SUBCHANNELS", &value);
if (value) { if (cvalue) {
const char *p = value; if (cvalue[0] != '\0') {
gboolean success = TRUE; const char *p = cvalue;
gboolean success = TRUE;
/* basic sanity checks */ /* basic sanity checks */
while (*p) { while (*p) {
if (!g_ascii_isxdigit (*p) && (*p != ',') && (*p != '.')) { if (!g_ascii_isxdigit (*p) && (*p != ',') && (*p != '.')) {
PARSE_WARNING ("invalid SUBCHANNELS '%s'", value); PARSE_WARNING ("invalid SUBCHANNELS '%s'", cvalue);
success = FALSE; success = FALSE;
break; break;
}
p++;
} }
p++;
}
if (success) { if (success) {
gs_free const char **chans = NULL; gs_free const char **chans = NULL;
guint32 num_chans; guint32 num_chans;
chans = nm_utils_strsplit_set (value, ","); chans = nm_utils_strsplit_set (cvalue, ",");
num_chans = NM_PTRARRAY_LEN (chans); num_chans = NM_PTRARRAY_LEN (chans);
if (num_chans < 2 || num_chans > 3) { if (num_chans < 2 || num_chans > 3) {
PARSE_WARNING ("invalid SUBCHANNELS '%s' (%u channels, 2 or 3 expected)", PARSE_WARNING ("invalid SUBCHANNELS '%s' (%u channels, 2 or 3 expected)",
value, (unsigned) NM_PTRARRAY_LEN (chans)); cvalue, (unsigned) NM_PTRARRAY_LEN (chans));
} else } else
g_object_set (s_wired, NM_SETTING_WIRED_S390_SUBCHANNELS, chans, NULL); g_object_set (s_wired, NM_SETTING_WIRED_S390_SUBCHANNELS, chans, NULL);
}
} }
nm_clear_g_free (&value); nm_clear_g_free (&value);
found = TRUE;
} }
value = svGetValueStr_cp (ifcfg, "PORTNAME"); cvalue = svGetValue (ifcfg, "PORTNAME", &value);
if (value) { if (cvalue) {
nm_setting_wired_add_s390_option (s_wired, "portname", value); if (cvalue[0] != '\0')
nm_setting_wired_add_s390_option (s_wired, "portname", cvalue);
found = TRUE;
nm_clear_g_free (&value); nm_clear_g_free (&value);
} }
value = svGetValueStr_cp (ifcfg, "CTCPROT"); cvalue = svGetValue (ifcfg, "CTCPROT", &value);
if (value) { if (cvalue) {
nm_setting_wired_add_s390_option (s_wired, "ctcprot", value); if (cvalue[0] != '\0')
nm_setting_wired_add_s390_option (s_wired, "ctcprot", cvalue);
nm_clear_g_free (&value); nm_clear_g_free (&value);
found = TRUE;
} }
nettype = svGetValueStr_cp (ifcfg, "NETTYPE"); cvalue = svGetValue (ifcfg, "NETTYPE", &value);
if (nettype) { if (cvalue) {
if (!strcmp (nettype, "qeth") || !strcmp (nettype, "lcs") || !strcmp (nettype, "ctc")) if (NM_IN_STRSET (cvalue, "qeth", "lcs", "ctc"))
g_object_set (s_wired, NM_SETTING_WIRED_S390_NETTYPE, nettype, NULL); g_object_set (s_wired, NM_SETTING_WIRED_S390_NETTYPE, cvalue, NULL);
else else
PARSE_WARNING ("unknown s390 NETTYPE '%s'", nettype); PARSE_WARNING ("unknown s390 NETTYPE '%s'", cvalue);
g_free (nettype); nm_clear_g_free (&value);
found = TRUE;
} }
value = svGetValueStr_cp (ifcfg, "OPTIONS"); cvalue = svGetValue (ifcfg, "OPTIONS", &value);
if (value) { if (cvalue)
found = TRUE;
if (cvalue && cvalue[0]) {
gs_free const char **options = NULL; gs_free const char **options = NULL;
gsize i; gsize i;
options = nm_utils_strsplit_set_with_empty (value, " "); options = nm_utils_strsplit_set_with_empty (cvalue, " ");
for (i = 0; options && options[i]; i++) { for (i = 0; options && options[i]; i++) {
const char *line = options[i]; const char *line = options[i];
const char *equals; const char *equals;
@ -4526,20 +4548,33 @@ make_wired_setting (shvarFile *ifcfg,
if (!valid) if (!valid)
PARSE_WARNING ("invalid s390 OPTION '%s'", line); PARSE_WARNING ("invalid s390 OPTION '%s'", line);
} }
found = TRUE;
}
nm_clear_g_free (&value);
cvalue = svGetValueStr (ifcfg, "MACADDR", &value);
if (cvalue) {
if (cvalue[0] != '\0') {
g_object_set (s_wired,
NM_SETTING_WIRED_CLONED_MAC_ADDRESS,
cvalue,
NULL);
}
nm_clear_g_free (&value); nm_clear_g_free (&value);
found = TRUE;
} }
g_object_set (s_wired, cvalue = svGetValueStr (ifcfg, "GENERATE_MAC_ADDRESS_MASK", &value);
NM_SETTING_WIRED_CLONED_MAC_ADDRESS, if (cvalue) {
svGetValueStr (ifcfg, "MACADDR", &value), if (cvalue[0] != '\0') {
NULL); g_object_set (s_wired,
nm_clear_g_free (&value); NM_SETTING_WIRED_GENERATE_MAC_ADDRESS_MASK,
cvalue,
g_object_set (s_wired, NULL);
NM_SETTING_WIRED_GENERATE_MAC_ADDRESS_MASK, }
svGetValueStr (ifcfg, "GENERATE_MAC_ADDRESS_MASK", &value), nm_clear_g_free (&value);
NULL); found = TRUE;
nm_clear_g_free (&value); }
cvalue = svGetValueStr (ifcfg, "HWADDR_BLACKLIST", &value); cvalue = svGetValueStr (ifcfg, "HWADDR_BLACKLIST", &value);
if (cvalue) { if (cvalue) {
@ -4548,20 +4583,31 @@ make_wired_setting (shvarFile *ifcfg,
strv = transform_hwaddr_blacklist (cvalue); strv = transform_hwaddr_blacklist (cvalue);
g_object_set (s_wired, NM_SETTING_WIRED_MAC_ADDRESS_BLACKLIST, strv, NULL); g_object_set (s_wired, NM_SETTING_WIRED_MAC_ADDRESS_BLACKLIST, strv, NULL);
nm_clear_g_free (&value); nm_clear_g_free (&value);
found = TRUE;
} }
value = svGetValueStr_cp (ifcfg, "KEY_MGMT"); cvalue = svGetValue (ifcfg, "KEY_MGMT", &value);
if (value) { if (cvalue)
if (!strcmp (value, "IEEE8021X")) { found = TRUE;
*s_8021x = fill_8021x (ifcfg, file, value, FALSE, error); if (cvalue && cvalue[0] != '\0') {
if (!strcmp (cvalue, "IEEE8021X")) {
*s_8021x = fill_8021x (ifcfg, file, cvalue, FALSE, error);
if (!*s_8021x) if (!*s_8021x)
return NULL; return NULL;
} else { } else {
g_set_error (error, NM_SETTINGS_ERROR, NM_SETTINGS_ERROR_INVALID_CONNECTION, g_set_error (error, NM_SETTINGS_ERROR, NM_SETTINGS_ERROR_INVALID_CONNECTION,
"Unknown wired KEY_MGMT type '%s'", value); "Unknown wired KEY_MGMT type '%s'", cvalue);
return NULL; return NULL;
} }
nm_clear_g_free (&value); }
nm_clear_g_free (&value);
if (!found) {
g_set_error (error,
NM_UTILS_ERROR,
NM_UTILS_ERROR_SETTING_MISSING,
"The setting is missing.");
return NULL;
} }
return (NMSetting *) g_steal_pointer (&s_wired); return (NMSetting *) g_steal_pointer (&s_wired);
@ -4576,6 +4622,7 @@ wired_connection_from_ifcfg (const char *file,
NMSetting *con_setting = NULL; NMSetting *con_setting = NULL;
NMSetting *wired_setting = NULL; NMSetting *wired_setting = NULL;
NMSetting8021x *s_8021x = NULL; NMSetting8021x *s_8021x = NULL;
GError *local = NULL;
g_return_val_if_fail (file != NULL, NULL); g_return_val_if_fail (file != NULL, NULL);
g_return_val_if_fail (ifcfg != NULL, NULL); g_return_val_if_fail (ifcfg != NULL, NULL);
@ -4591,12 +4638,16 @@ wired_connection_from_ifcfg (const char *file,
} }
nm_connection_add_setting (connection, con_setting); nm_connection_add_setting (connection, con_setting);
wired_setting = make_wired_setting (ifcfg, file, &s_8021x, error); wired_setting = make_wired_setting (ifcfg, file, &s_8021x, &local);
if (!wired_setting) { if (local && !g_error_matches (local, NM_UTILS_ERROR, NM_UTILS_ERROR_SETTING_MISSING)) {
g_propagate_error (error, local);
g_object_unref (connection); g_object_unref (connection);
return NULL; return NULL;
} }
nm_connection_add_setting (connection, wired_setting); g_clear_error (&local);
if (wired_setting)
nm_connection_add_setting (connection, wired_setting);
if (s_8021x) if (s_8021x)
nm_connection_add_setting (connection, NM_SETTING (s_8021x)); nm_connection_add_setting (connection, NM_SETTING (s_8021x));
@ -4827,6 +4878,7 @@ bond_connection_from_ifcfg (const char *file,
NMSetting *bond_setting = NULL; NMSetting *bond_setting = NULL;
NMSetting *wired_setting = NULL; NMSetting *wired_setting = NULL;
NMSetting8021x *s_8021x = NULL; NMSetting8021x *s_8021x = NULL;
GError *local = NULL;
g_return_val_if_fail (file != NULL, NULL); g_return_val_if_fail (file != NULL, NULL);
g_return_val_if_fail (ifcfg != NULL, NULL); g_return_val_if_fail (ifcfg != NULL, NULL);
@ -4849,12 +4901,16 @@ bond_connection_from_ifcfg (const char *file,
} }
nm_connection_add_setting (connection, bond_setting); nm_connection_add_setting (connection, bond_setting);
wired_setting = make_wired_setting (ifcfg, file, &s_8021x, error); wired_setting = make_wired_setting (ifcfg, file, &s_8021x, &local);
if (!wired_setting) { if (local && !g_error_matches (local, NM_UTILS_ERROR, NM_UTILS_ERROR_SETTING_MISSING)) {
g_propagate_error (error, local);
g_object_unref (connection); g_object_unref (connection);
return NULL; return NULL;
} }
nm_connection_add_setting (connection, wired_setting); g_clear_error (&local);
if (wired_setting)
nm_connection_add_setting (connection, wired_setting);
if (s_8021x) if (s_8021x)
nm_connection_add_setting (connection, NM_SETTING (s_8021x)); nm_connection_add_setting (connection, NM_SETTING (s_8021x));
@ -4930,6 +4986,7 @@ team_connection_from_ifcfg (const char *file,
NMSetting *team_setting = NULL; NMSetting *team_setting = NULL;
NMSetting *wired_setting = NULL; NMSetting *wired_setting = NULL;
NMSetting8021x *s_8021x = NULL; NMSetting8021x *s_8021x = NULL;
GError *local = NULL;
g_return_val_if_fail (file != NULL, NULL); g_return_val_if_fail (file != NULL, NULL);
g_return_val_if_fail (ifcfg != NULL, NULL); g_return_val_if_fail (ifcfg != NULL, NULL);
@ -4952,12 +5009,16 @@ team_connection_from_ifcfg (const char *file,
} }
nm_connection_add_setting (connection, team_setting); nm_connection_add_setting (connection, team_setting);
wired_setting = make_wired_setting (ifcfg, file, &s_8021x, error); wired_setting = make_wired_setting (ifcfg, file, &s_8021x, &local);
if (!wired_setting) { if (local && !g_error_matches (local, NM_UTILS_ERROR, NM_UTILS_ERROR_SETTING_MISSING)) {
g_propagate_error (error, local);
g_object_unref (connection); g_object_unref (connection);
return NULL; return NULL;
} }
nm_connection_add_setting (connection, wired_setting); g_clear_error (&local);
if (wired_setting)
nm_connection_add_setting (connection, wired_setting);
if (s_8021x) if (s_8021x)
nm_connection_add_setting (connection, NM_SETTING (s_8021x)); nm_connection_add_setting (connection, NM_SETTING (s_8021x));
@ -5207,6 +5268,7 @@ bridge_connection_from_ifcfg (const char *file,
NMSetting *bridge_setting = NULL; NMSetting *bridge_setting = NULL;
NMSetting *wired_setting = NULL; NMSetting *wired_setting = NULL;
NMSetting8021x *s_8021x = NULL; NMSetting8021x *s_8021x = NULL;
GError *local = NULL;
g_return_val_if_fail (file != NULL, NULL); g_return_val_if_fail (file != NULL, NULL);
g_return_val_if_fail (ifcfg != NULL, NULL); g_return_val_if_fail (ifcfg != NULL, NULL);
@ -5229,12 +5291,16 @@ bridge_connection_from_ifcfg (const char *file,
} }
nm_connection_add_setting (connection, bridge_setting); nm_connection_add_setting (connection, bridge_setting);
wired_setting = make_wired_setting (ifcfg, file, &s_8021x, error); wired_setting = make_wired_setting (ifcfg, file, &s_8021x, &local);
if (!wired_setting) { if (local && !g_error_matches (local, NM_UTILS_ERROR, NM_UTILS_ERROR_SETTING_MISSING)) {
g_propagate_error (error, local);
g_object_unref (connection); g_object_unref (connection);
return NULL; return NULL;
} }
nm_connection_add_setting (connection, wired_setting); g_clear_error (&local);
if (wired_setting)
nm_connection_add_setting (connection, wired_setting);
if (s_8021x) if (s_8021x)
nm_connection_add_setting (connection, NM_SETTING (s_8021x)); nm_connection_add_setting (connection, NM_SETTING (s_8021x));
@ -5486,6 +5552,7 @@ vlan_connection_from_ifcfg (const char *file,
NMSetting *wired_setting = NULL; NMSetting *wired_setting = NULL;
NMSetting *vlan_setting = NULL; NMSetting *vlan_setting = NULL;
NMSetting8021x *s_8021x = NULL; NMSetting8021x *s_8021x = NULL;
GError *local = NULL;
g_return_val_if_fail (file != NULL, NULL); g_return_val_if_fail (file != NULL, NULL);
g_return_val_if_fail (ifcfg != NULL, NULL); g_return_val_if_fail (ifcfg != NULL, NULL);
@ -5508,12 +5575,16 @@ vlan_connection_from_ifcfg (const char *file,
} }
nm_connection_add_setting (connection, vlan_setting); nm_connection_add_setting (connection, vlan_setting);
wired_setting = make_wired_setting (ifcfg, file, &s_8021x, error); wired_setting = make_wired_setting (ifcfg, file, &s_8021x, &local);
if (!wired_setting) { if (local && !g_error_matches (local, NM_UTILS_ERROR, NM_UTILS_ERROR_SETTING_MISSING)) {
g_propagate_error (error, local);
g_object_unref (connection); g_object_unref (connection);
return NULL; return NULL;
} }
nm_connection_add_setting (connection, wired_setting); g_clear_error (&local);
if (wired_setting)
nm_connection_add_setting (connection, wired_setting);
if (s_8021x) if (s_8021x)
nm_connection_add_setting (connection, NM_SETTING (s_8021x)); nm_connection_add_setting (connection, NM_SETTING (s_8021x));

View file

@ -1302,7 +1302,7 @@ write_wired_for_virtual (NMConnection *connection, shvarFile *ifcfg)
has_wired = TRUE; has_wired = TRUE;
device_mac = nm_setting_wired_get_mac_address (s_wired); device_mac = nm_setting_wired_get_mac_address (s_wired);
svSetValueStr (ifcfg, "HWADDR", device_mac); svSetValue (ifcfg, "HWADDR", device_mac ?: "");
cloned_mac = nm_setting_wired_get_cloned_mac_address (s_wired); cloned_mac = nm_setting_wired_get_cloned_mac_address (s_wired);
svSetValueStr (ifcfg, "MACADDR", cloned_mac); svSetValueStr (ifcfg, "MACADDR", cloned_mac);

View file

@ -1,6 +1,7 @@
BONDING_OPTS="downdelay=5 miimon=100 mode=balance-rr updelay=10" BONDING_OPTS="downdelay=5 miimon=100 mode=balance-rr updelay=10"
TYPE=Bond TYPE=Bond
BONDING_MASTER=yes BONDING_MASTER=yes
HWADDR=
PROXY_METHOD=none PROXY_METHOD=none
BROWSER_ONLY=no BROWSER_ONLY=no
BOOTPROTO=none BOOTPROTO=none

View file

@ -5,6 +5,7 @@ VLAN_ID=444
REORDER_HDR=yes REORDER_HDR=yes
GVRP=no GVRP=no
MVRP=no MVRP=no
HWADDR=
PROXY_METHOD=none PROXY_METHOD=none
BROWSER_ONLY=no BROWSER_ONLY=no
BOOTPROTO=dhcp BOOTPROTO=dhcp

View file

@ -8,6 +8,7 @@ VLAN_FLAGS=LOOSE_BINDING
MVRP=no MVRP=no
VLAN_INGRESS_PRIORITY_MAP=0:1,2:5 VLAN_INGRESS_PRIORITY_MAP=0:1,2:5
VLAN_EGRESS_PRIORITY_MAP=3:1,12:3,14:7 VLAN_EGRESS_PRIORITY_MAP=3:1,12:3,14:7
HWADDR=
PROXY_METHOD=none PROXY_METHOD=none
BROWSER_ONLY=no BROWSER_ONLY=no
BOOTPROTO=none BOOTPROTO=none

View file

@ -4,6 +4,7 @@ VLAN_ID=142
REORDER_HDR=yes REORDER_HDR=yes
GVRP=no GVRP=no
MVRP=no MVRP=no
HWADDR=
NAME=team-slave-enp31s0f1-142 NAME=team-slave-enp31s0f1-142
UUID=74f435bb-ede4-415a-9d48-f580b60eba04 UUID=74f435bb-ede4-415a-9d48-f580b60eba04
DEVICE=enp31s0f1-142 DEVICE=enp31s0f1-142