diff --git a/src/settings/plugins/ifcfg-rh/nms-ifcfg-rh-reader.c b/src/settings/plugins/ifcfg-rh/nms-ifcfg-rh-reader.c index 63a1fa7f00..991ad77d0d 100644 --- a/src/settings/plugins/ifcfg-rh/nms-ifcfg-rh-reader.c +++ b/src/settings/plugins/ifcfg-rh/nms-ifcfg-rh-reader.c @@ -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; } diff --git a/src/settings/plugins/ifcfg-rh/nms-ifcfg-rh-utils.c b/src/settings/plugins/ifcfg-rh/nms-ifcfg-rh-utils.c index 92e49caa51..06d4928ae5 100644 --- a/src/settings/plugins/ifcfg-rh/nms-ifcfg-rh-utils.c +++ b/src/settings/plugins/ifcfg-rh/nms-ifcfg-rh-utils.c @@ -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 ), diff --git a/src/settings/plugins/ifcfg-rh/nms-ifcfg-rh-utils.h b/src/settings/plugins/ifcfg-rh/nms-ifcfg-rh-utils.h index e6343e1dcd..805f1581f1 100644 --- a/src/settings/plugins/ifcfg-rh/nms-ifcfg-rh-utils.h +++ b/src/settings/plugins/ifcfg-rh/nms-ifcfg-rh-utils.h @@ -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); diff --git a/src/settings/plugins/ifcfg-rh/nms-ifcfg-rh-writer.c b/src/settings/plugins/ifcfg-rh/nms-ifcfg-rh-writer.c index a9bc091655..cc5cc75ab2 100644 --- a/src/settings/plugins/ifcfg-rh/nms-ifcfg-rh-writer.c +++ b/src/settings/plugins/ifcfg-rh/nms-ifcfg-rh-writer.c @@ -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; } diff --git a/src/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-Test_Write_Wired_match.cexpected b/src/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-Test_Write_Wired_match.cexpected index f0cd36cb13..9499278e3e 100644 --- a/src/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-Test_Write_Wired_match.cexpected +++ b/src/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-Test_Write_Wired_match.cexpected @@ -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 diff --git a/src/settings/plugins/ifcfg-rh/tests/test-ifcfg-rh.c b/src/settings/plugins/ifcfg-rh/tests/test-ifcfg-rh.c index efa9ea9b82..d0b9ffb8d3 100644 --- a/src/settings/plugins/ifcfg-rh/tests/test-ifcfg-rh.c +++ b/src/settings/plugins/ifcfg-rh/tests/test-ifcfg-rh.c @@ -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);