ifcfg-rh: support new match filters

This commit is contained in:
Adrian Freihofer 2020-04-21 17:39:38 +02:00 committed by Thomas Haller
parent d8a7f65ef4
commit 369d858525
No known key found for this signature in database
GPG key ID: 29C2366E4DFC5728
6 changed files with 73 additions and 15 deletions

View file

@ -1561,10 +1561,16 @@ make_match_setting (shvarFile *ifcfg)
{
NMSettingMatch *s_match = NULL;
gs_free char *value_ifn = NULL;
gs_free char *value_kcl = NULL;
gs_free char *value_d = NULL;
const char *v;
v = svGetValueStr (ifcfg, "MATCH_INTERFACE_NAME", &value_ifn);
make_match_setting_prop(v, &s_match, nm_setting_match_add_interface_name);
v = svGetValueStr (ifcfg, "MATCH_KERNEL_COMMAND_LINE", &value_kcl);
make_match_setting_prop(v, &s_match, nm_setting_match_add_kernel_command_line);
v = svGetValueStr (ifcfg, "MATCH_DRIVER", &value_d);
make_match_setting_prop(v, &s_match, nm_setting_match_add_driver);
return (NMSetting *) s_match;
}

View file

@ -888,7 +888,9 @@ const NMSIfcfgKeyTypeInfo nms_ifcfg_well_known_keys[] = {
_KEY_TYPE ("MAC_ADDRESS_RANDOMIZATION", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("MASTER", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("MASTER_UUID", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("MATCH_DRIVER", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("MATCH_INTERFACE_NAME", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("MATCH_KERNEL_COMMAND_LINE", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("MDNS", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("METRIC", NMS_IFCFG_KEY_TYPE_IS_NUMBERED ),
_KEY_TYPE ("MODE", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),

View file

@ -33,7 +33,7 @@ typedef struct {
NMSIfcfgKeyTypeFlags key_flags;
} NMSIfcfgKeyTypeInfo;
extern const NMSIfcfgKeyTypeInfo nms_ifcfg_well_known_keys[233];
extern const NMSIfcfgKeyTypeInfo nms_ifcfg_well_known_keys[235];
const NMSIfcfgKeyTypeInfo *nms_ifcfg_well_known_key_find_info (const char *key, gssize *out_idx);

View file

@ -2378,30 +2378,75 @@ static gboolean
write_match_setting (NMConnection *connection, shvarFile *ifcfg, GError **error)
{
NMSettingMatch *s_match;
nm_auto_free_gstring GString *str = NULL;
guint i, num;
s_match = (NMSettingMatch *) nm_connection_get_setting (connection, NM_TYPE_SETTING_MATCH);
if (!s_match)
return TRUE;
num = nm_setting_match_get_num_interface_names (s_match);
for (i = 0; i < num; i++) {
const char *name;
num = nm_setting_match_get_num_drivers (s_match);
{
nm_auto_free_gstring GString *str = NULL;
for (i = 0; i < num; i++) {
const char *name;
name = nm_setting_match_get_interface_name (s_match, i);
if (!name || !name[0])
continue;
name = nm_setting_match_get_driver (s_match, i);
if (!name || !name[0])
continue;
if (!str)
str = g_string_new ("");
else
g_string_append_c (str, ' ');
nm_utils_escaped_tokens_escape_gstr (name, NM_ASCII_SPACES, str);
if (!str)
str = g_string_new ("");
else
g_string_append_c (str, ' ');
nm_utils_escaped_tokens_escape_gstr (name, NM_ASCII_SPACES, str);
}
if (str)
svSetValueStr (ifcfg, "MATCH_DRIVER", str->str);
}
if (str)
svSetValueStr (ifcfg, "MATCH_INTERFACE_NAME", str->str);
num = nm_setting_match_get_num_interface_names (s_match);
{
nm_auto_free_gstring GString *str = NULL;
for (i = 0; i < num; i++) {
const char *name;
name = nm_setting_match_get_interface_name (s_match, i);
if (!name || !name[0])
continue;
if (!str)
str = g_string_new ("");
else
g_string_append_c (str, ' ');
nm_utils_escaped_tokens_escape_gstr (name, NM_ASCII_SPACES, str);
}
if (str)
svSetValueStr (ifcfg, "MATCH_INTERFACE_NAME", str->str);
}
num = nm_setting_match_get_num_kernel_command_lines (s_match);
{
nm_auto_free_gstring GString *str = NULL;
for (i = 0; i < num; i++) {
const char *name;
name = nm_setting_match_get_kernel_command_line (s_match, i);
if (!name || !name[0])
continue;
if (!str)
str = g_string_new ("");
else
g_string_append_c (str, ' ');
nm_utils_escaped_tokens_escape_gstr (name, NM_ASCII_SPACES, str);
}
if (str)
svSetValueStr (ifcfg, "MATCH_KERNEL_COMMAND_LINE", str->str);
}
return TRUE;
}

View file

@ -1,7 +1,9 @@
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
MATCH_DRIVER="!virtio e1000e"
MATCH_INTERFACE_NAME="ens* eth\\ 1? !veth*"
MATCH_KERNEL_COMMAND_LINE=!ip=
BOOTPROTO=dhcp
DEFROUTE=yes
IPV4_FAILURE_FATAL=no

View file

@ -4687,6 +4687,9 @@ test_write_wired_match (void)
nm_setting_match_add_interface_name (s_match, "ens*");
nm_setting_match_add_interface_name (s_match, "eth 1?");
nm_setting_match_add_interface_name (s_match, "!veth*");
nm_setting_match_add_driver (s_match, "!virtio");
nm_setting_match_add_driver (s_match, "e1000e");
nm_setting_match_add_kernel_command_line (s_match, "!ip=");
nm_connection_add_setting (connection, NM_SETTING (s_match));
nmtst_assert_connection_verifies (connection);