ifcfg-rh: write the master device name even if the master property is an UUID
We used MASTER, BRIDGE and TEAM_MASTER keys for a differnet purpose than the network.service did, confusing the legacy tooling. Let's do our best to write compatible configuration files: * Add *_UUID properties that won't clash with initscripts * Ignore non-*_UUID keys on read if *_UUID is present * If the connection.master is an UUID of a connection with a connection.interface-name, write the uuid into the *_UUID key while setting the non-*_UUID key to the interface name for compatibility https://bugzilla.redhat.com/show_bug.cgi?id=1369091
This commit is contained in:
@@ -1696,9 +1696,11 @@ nm_setting_connection_class_init (NMSettingConnectionClass *setting_class)
|
|||||||
**/
|
**/
|
||||||
/* ---ifcfg-rh---
|
/* ---ifcfg-rh---
|
||||||
* property: master
|
* property: master
|
||||||
* variable: MASTER, TEAM_MASTER, BRIDGE
|
* variable: MASTER, MASTER_UUID, TEAM_MASTER, TEAM_MASTER_UUID, BRIDGE, BRIDGE_UUID
|
||||||
* description: Reference to master connection. The variable used depends on
|
* description: Reference to master connection. The variable used depends on
|
||||||
* the connection type.
|
* the connection type and the value. In general, if the *_UUID variant is present,
|
||||||
|
* the variant without *_UUID is ignored. NetworkManager attempts to write both
|
||||||
|
* for compatibility with legacy tooling.
|
||||||
* ---end---
|
* ---end---
|
||||||
*/
|
*/
|
||||||
g_object_class_install_property
|
g_object_class_install_property
|
||||||
@@ -1719,10 +1721,12 @@ nm_setting_connection_class_init (NMSettingConnectionClass *setting_class)
|
|||||||
**/
|
**/
|
||||||
/* ---ifcfg-rh---
|
/* ---ifcfg-rh---
|
||||||
* property: slave-type
|
* property: slave-type
|
||||||
* variable: MASTER, TEAM_MASTER, DEVICETYPE, BRIDGE
|
* variable: MASTER, MASTER_UUID, TEAM_MASTER, TEAM_MASTER_UUID, DEVICETYPE,
|
||||||
|
* BRIDGE, BRIDGE_UUID
|
||||||
* description: Slave type doesn't map directly to a variable, but it is
|
* description: Slave type doesn't map directly to a variable, but it is
|
||||||
* recognized using different variables. MASTER for bonding,
|
* recognized using different variables. MASTER and MASTER_UUID for bonding,
|
||||||
* TEAM_MASTER and DEVICETYPE for teaming, BRIDGE for bridging.
|
* TEAM_MASTER, TEAM_MASTER_UUID and DEVICETYPE for teaming, BRIDGE
|
||||||
|
* and BRIDGE_UUID for bridging.
|
||||||
* ---end---
|
* ---end---
|
||||||
*/
|
*/
|
||||||
g_object_class_install_property
|
g_object_class_install_property
|
||||||
|
@@ -1145,6 +1145,30 @@ nm_manager_get_connection_iface (NMManager *self,
|
|||||||
return iface;
|
return iface;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* nm_manager_iface_for_uuid:
|
||||||
|
* @self: the #NMManager
|
||||||
|
* @uuid: the connection uuid
|
||||||
|
*
|
||||||
|
* Gets a link name for the given UUID. Useful for the settings plugins that
|
||||||
|
* wish to write configuration files compatible with tooling that can't
|
||||||
|
* interpret our UUIDs.
|
||||||
|
*
|
||||||
|
* Returns: An interface name; %NULL if none matches
|
||||||
|
*/
|
||||||
|
const char *
|
||||||
|
nm_manager_iface_for_uuid (NMManager *self, const char *uuid)
|
||||||
|
{
|
||||||
|
NMManagerPrivate *priv = NM_MANAGER_GET_PRIVATE (self);
|
||||||
|
NMSettingsConnection *connection;
|
||||||
|
|
||||||
|
connection = nm_settings_get_connection_by_uuid (priv->settings, uuid);
|
||||||
|
if (!connection)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
return nm_connection_get_interface_name (NM_CONNECTION (connection));
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* system_create_virtual_device:
|
* system_create_virtual_device:
|
||||||
* @self: the #NMManager
|
* @self: the #NMManager
|
||||||
|
@@ -103,6 +103,9 @@ char * nm_manager_get_connection_iface (NMManager *self,
|
|||||||
NMDevice **out_parent,
|
NMDevice **out_parent,
|
||||||
GError **error);
|
GError **error);
|
||||||
|
|
||||||
|
const char * nm_manager_iface_for_uuid (NMManager *self,
|
||||||
|
const char *uuid);
|
||||||
|
|
||||||
NMActiveConnection *nm_manager_activate_connection (NMManager *manager,
|
NMActiveConnection *nm_manager_activate_connection (NMManager *manager,
|
||||||
NMSettingsConnection *connection,
|
NMSettingsConnection *connection,
|
||||||
NMConnection *applied_connection,
|
NMConnection *applied_connection,
|
||||||
|
@@ -231,7 +231,9 @@ make_connection_setting (const char *file,
|
|||||||
g_strfreev (items);
|
g_strfreev (items);
|
||||||
}
|
}
|
||||||
|
|
||||||
value = svGetValueString (ifcfg, "BRIDGE");
|
value = svGetValueString (ifcfg, "BRIDGE_UUID");
|
||||||
|
if (!value)
|
||||||
|
value = svGetValueString (ifcfg, "BRIDGE");
|
||||||
if (value) {
|
if (value) {
|
||||||
const char *old_value;
|
const char *old_value;
|
||||||
|
|
||||||
@@ -1670,7 +1672,10 @@ check_if_bond_slave (shvarFile *ifcfg,
|
|||||||
{
|
{
|
||||||
char *value;
|
char *value;
|
||||||
|
|
||||||
value = svGetValueString (ifcfg, "MASTER");
|
value = svGetValueString (ifcfg, "MASTER_UUID");
|
||||||
|
if (!value)
|
||||||
|
value = svGetValueString (ifcfg, "MASTER");
|
||||||
|
|
||||||
if (value) {
|
if (value) {
|
||||||
g_object_set (s_con, NM_SETTING_CONNECTION_MASTER, value, NULL);
|
g_object_set (s_con, NM_SETTING_CONNECTION_MASTER, value, NULL);
|
||||||
g_object_set (s_con,
|
g_object_set (s_con,
|
||||||
@@ -1690,9 +1695,12 @@ check_if_team_slave (shvarFile *ifcfg,
|
|||||||
{
|
{
|
||||||
gs_free char *value = NULL;
|
gs_free char *value = NULL;
|
||||||
|
|
||||||
value = svGetValueString (ifcfg, "TEAM_MASTER");
|
value = svGetValueString (ifcfg, "TEAM_MASTER_UUID");
|
||||||
|
if (!value)
|
||||||
|
value = svGetValueString (ifcfg, "TEAM_MASTER");
|
||||||
if (!value)
|
if (!value)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
g_object_set (s_con, NM_SETTING_CONNECTION_MASTER, value, NULL);
|
g_object_set (s_con, NM_SETTING_CONNECTION_MASTER, value, NULL);
|
||||||
g_object_set (s_con, NM_SETTING_CONNECTION_SLAVE_TYPE, NM_SETTING_TEAM_SETTING_NAME, NULL);
|
g_object_set (s_con, NM_SETTING_CONNECTION_SLAVE_TYPE, NM_SETTING_TEAM_SETTING_NAME, NULL);
|
||||||
return TRUE;
|
return TRUE;
|
||||||
@@ -4646,7 +4654,9 @@ make_bridge_port_setting (shvarFile *ifcfg)
|
|||||||
|
|
||||||
g_return_val_if_fail (ifcfg != NULL, FALSE);
|
g_return_val_if_fail (ifcfg != NULL, FALSE);
|
||||||
|
|
||||||
value = svGetValueString (ifcfg, "BRIDGE");
|
value = svGetValueString (ifcfg, "BRIDGE_UUID");
|
||||||
|
if (!value)
|
||||||
|
value = svGetValueString (ifcfg, "BRIDGE");
|
||||||
if (value) {
|
if (value) {
|
||||||
g_free (value);
|
g_free (value);
|
||||||
|
|
||||||
|
@@ -32,6 +32,7 @@
|
|||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
||||||
|
#include "nm-manager.h"
|
||||||
#include "nm-setting-connection.h"
|
#include "nm-setting-connection.h"
|
||||||
#include "nm-setting-wired.h"
|
#include "nm-setting-wired.h"
|
||||||
#include "nm-setting-wireless.h"
|
#include "nm-setting-wireless.h"
|
||||||
@@ -1741,13 +1742,9 @@ write_connection_setting (NMSettingConnection *s_con, shvarFile *ifcfg)
|
|||||||
{
|
{
|
||||||
guint32 n, i;
|
guint32 n, i;
|
||||||
GString *str;
|
GString *str;
|
||||||
const char *master, *type;
|
const char *master, *master_iface = NULL, *type;
|
||||||
char *tmp;
|
char *tmp;
|
||||||
gint i_int;
|
gint i_int;
|
||||||
const char *v_master = NULL;
|
|
||||||
const char *v_slave = NULL;
|
|
||||||
const char *v_bridge = NULL;
|
|
||||||
const char *v_team_master = NULL;
|
|
||||||
|
|
||||||
svSetValueString (ifcfg, "NAME", nm_setting_connection_get_id (s_con));
|
svSetValueString (ifcfg, "NAME", nm_setting_connection_get_id (s_con));
|
||||||
svSetValueString (ifcfg, "UUID", nm_setting_connection_get_uuid (s_con));
|
svSetValueString (ifcfg, "UUID", nm_setting_connection_get_uuid (s_con));
|
||||||
@@ -1815,27 +1812,45 @@ write_connection_setting (NMSettingConnection *s_con, shvarFile *ifcfg)
|
|||||||
|
|
||||||
svSetValueString (ifcfg, "ZONE", nm_setting_connection_get_zone(s_con));
|
svSetValueString (ifcfg, "ZONE", nm_setting_connection_get_zone(s_con));
|
||||||
|
|
||||||
|
svSetValueString (ifcfg, "MASTER_UUID", NULL);
|
||||||
|
svSetValueString (ifcfg, "MASTER", NULL);
|
||||||
|
svSetValueString (ifcfg, "SLAVE", NULL);
|
||||||
|
svSetValueString (ifcfg, "BRIDGE_UUID", NULL);
|
||||||
|
svSetValueString (ifcfg, "BRIDGE", NULL);
|
||||||
|
svSetValueString (ifcfg, "TEAM_MASTER_UUID", NULL);
|
||||||
|
svSetValueString (ifcfg, "TEAM_MASTER", NULL);
|
||||||
|
|
||||||
master = nm_setting_connection_get_master (s_con);
|
master = nm_setting_connection_get_master (s_con);
|
||||||
if (master) {
|
if (master) {
|
||||||
|
/* The reader prefers the *_UUID variants, however we still try to resolve
|
||||||
|
* it into an interface name, so that legacy tooling is not confused. */
|
||||||
|
if (!nm_utils_get_testing ()) {
|
||||||
|
/* This is conditional for easier testing. */
|
||||||
|
master_iface = nm_manager_iface_for_uuid (nm_manager_get (), master);
|
||||||
|
}
|
||||||
|
if (!master_iface) {
|
||||||
|
master_iface = master;
|
||||||
|
master = NULL;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
if (nm_setting_connection_is_slave_type (s_con, NM_SETTING_BOND_SETTING_NAME)) {
|
if (nm_setting_connection_is_slave_type (s_con, NM_SETTING_BOND_SETTING_NAME)) {
|
||||||
v_master = master;
|
svSetValueString (ifcfg, "MASTER_UUID", master);
|
||||||
v_slave = "yes";
|
svSetValueString (ifcfg, "MASTER", master_iface);
|
||||||
} else if (nm_setting_connection_is_slave_type (s_con, NM_SETTING_BRIDGE_SETTING_NAME))
|
svSetValueString (ifcfg, "SLAVE", "yes");
|
||||||
v_bridge = master;
|
} else if (nm_setting_connection_is_slave_type (s_con, NM_SETTING_BRIDGE_SETTING_NAME)) {
|
||||||
else if (nm_setting_connection_is_slave_type (s_con, NM_SETTING_TEAM_SETTING_NAME)) {
|
svSetValueString (ifcfg, "BRIDGE_UUID", master);
|
||||||
v_team_master = master;
|
svSetValueString (ifcfg, "BRIDGE", master_iface);
|
||||||
|
} else if (nm_setting_connection_is_slave_type (s_con, NM_SETTING_TEAM_SETTING_NAME)) {
|
||||||
|
svSetValueString (ifcfg, "TEAM_MASTER_UUID", master);
|
||||||
|
svSetValueString (ifcfg, "TEAM_MASTER", master_iface);
|
||||||
svUnsetValue (ifcfg, "TYPE");
|
svUnsetValue (ifcfg, "TYPE");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
svSetValueString (ifcfg, "MASTER", v_master);
|
|
||||||
svSetValueString (ifcfg, "SLAVE", v_slave);
|
|
||||||
svSetValueString (ifcfg, "BRIDGE", v_bridge);
|
|
||||||
svSetValueString (ifcfg, "TEAM_MASTER", v_team_master);
|
|
||||||
|
|
||||||
if (nm_streq0 (type, NM_SETTING_TEAM_SETTING_NAME))
|
if (nm_streq0 (type, NM_SETTING_TEAM_SETTING_NAME))
|
||||||
svSetValueString (ifcfg, "DEVICETYPE", TYPE_TEAM);
|
svSetValueString (ifcfg, "DEVICETYPE", TYPE_TEAM);
|
||||||
else if (master && nm_setting_connection_is_slave_type (s_con, NM_SETTING_TEAM_SETTING_NAME))
|
else if (master_iface && nm_setting_connection_is_slave_type (s_con, NM_SETTING_TEAM_SETTING_NAME))
|
||||||
svSetValueString (ifcfg, "DEVICETYPE", TYPE_TEAM_PORT);
|
svSetValueString (ifcfg, "DEVICETYPE", TYPE_TEAM_PORT);
|
||||||
else
|
else
|
||||||
svUnsetValue (ifcfg, "DEVICETYPE");
|
svUnsetValue (ifcfg, "DEVICETYPE");
|
||||||
|
Reference in New Issue
Block a user