core: only persist explicit managed state in device's state file
For example, when starting without Wi-Fi plugin, a generic device is created. On stop, we should not store the unmanaged state on the state file, otherwise after restart the device is unmanaged. Only store explicit user decisions. https://bugzilla.redhat.com/show_bug.cgi?id=1440171
This commit is contained in:
@@ -1964,10 +1964,17 @@ nm_config_device_state_load (NMConfig *self,
|
||||
return device_state;
|
||||
}
|
||||
|
||||
NM_UTILS_LOOKUP_STR_DEFINE_STATIC (_device_state_managed_type_to_str, NMConfigDeviceStateManagedType,
|
||||
NM_UTILS_LOOKUP_DEFAULT_NM_ASSERT ("unknown"),
|
||||
NM_UTILS_LOOKUP_STR_ITEM (NM_CONFIG_DEVICE_STATE_MANAGED_TYPE_UNKNOWN, "unknown"),
|
||||
NM_UTILS_LOOKUP_STR_ITEM (NM_CONFIG_DEVICE_STATE_MANAGED_TYPE_UNMANAGED, "unmanaged"),
|
||||
NM_UTILS_LOOKUP_STR_ITEM (NM_CONFIG_DEVICE_STATE_MANAGED_TYPE_MANAGED, "managed"),
|
||||
);
|
||||
|
||||
gboolean
|
||||
nm_config_device_state_write (NMConfig *self,
|
||||
int ifindex,
|
||||
gboolean managed,
|
||||
NMConfigDeviceStateManagedType managed,
|
||||
const char *perm_hw_addr_fake,
|
||||
const char *connection_uuid)
|
||||
{
|
||||
@@ -1978,17 +1985,21 @@ nm_config_device_state_write (NMConfig *self,
|
||||
g_return_val_if_fail (NM_IS_CONFIG (self), FALSE);
|
||||
g_return_val_if_fail (ifindex > 0, FALSE);
|
||||
g_return_val_if_fail (!connection_uuid || *connection_uuid, FALSE);
|
||||
g_return_val_if_fail (managed || !connection_uuid, FALSE);
|
||||
g_return_val_if_fail (managed != NM_CONFIG_DEVICE_STATE_MANAGED_TYPE_MANAGED || !connection_uuid, FALSE);
|
||||
|
||||
nm_assert (!perm_hw_addr_fake || nm_utils_hwaddr_valid (perm_hw_addr_fake, -1));
|
||||
|
||||
nm_sprintf_buf (path, "%s/%d", NM_CONFIG_DEVICE_STATE_DIR, ifindex);
|
||||
|
||||
kf = nm_config_create_keyfile ();
|
||||
g_key_file_set_boolean (kf,
|
||||
DEVICE_RUN_STATE_KEYFILE_GROUP_DEVICE,
|
||||
DEVICE_RUN_STATE_KEYFILE_KEY_DEVICE_MANAGED,
|
||||
!!managed);
|
||||
if (NM_IN_SET (managed,
|
||||
NM_CONFIG_DEVICE_STATE_MANAGED_TYPE_MANAGED,
|
||||
NM_CONFIG_DEVICE_STATE_MANAGED_TYPE_UNMANAGED)) {
|
||||
g_key_file_set_boolean (kf,
|
||||
DEVICE_RUN_STATE_KEYFILE_GROUP_DEVICE,
|
||||
DEVICE_RUN_STATE_KEYFILE_KEY_DEVICE_MANAGED,
|
||||
managed == NM_CONFIG_DEVICE_STATE_MANAGED_TYPE_MANAGED);
|
||||
}
|
||||
if (perm_hw_addr_fake) {
|
||||
g_key_file_set_string (kf,
|
||||
DEVICE_RUN_STATE_KEYFILE_GROUP_DEVICE,
|
||||
@@ -2007,9 +2018,9 @@ nm_config_device_state_write (NMConfig *self,
|
||||
g_error_free (local);
|
||||
return FALSE;
|
||||
}
|
||||
_LOGT ("device-state: write #%d (%s); managed=%d%s%s%s%s%s%s",
|
||||
_LOGT ("device-state: write #%d (%s); managed=%s%s%s%s%s%s%s",
|
||||
ifindex, path,
|
||||
(bool) managed,
|
||||
_device_state_managed_type_to_str (managed),
|
||||
NM_PRINT_FMT_QUOTED (connection_uuid, ", connection-uuid=", connection_uuid, "", ""),
|
||||
NM_PRINT_FMT_QUOTED (perm_hw_addr_fake, ", perm-hw-addr-fake=", perm_hw_addr_fake, "", ""));
|
||||
return TRUE;
|
||||
|
@@ -207,7 +207,7 @@ NMConfigDeviceStateData *nm_config_device_state_load (NMConfig *self,
|
||||
int ifindex);
|
||||
gboolean nm_config_device_state_write (NMConfig *self,
|
||||
int ifindex,
|
||||
gboolean managed,
|
||||
NMConfigDeviceStateManagedType managed,
|
||||
const char *perm_hw_addr_fake,
|
||||
const char *connection_uuid);
|
||||
void nm_config_device_state_prune_unseen (NMConfig *self, GHashTable *seen_ifindexes);
|
||||
|
@@ -4937,6 +4937,7 @@ nm_manager_write_device_state (NMManager *self)
|
||||
NMDevice *device = NM_DEVICE (devices->data);
|
||||
int ifindex;
|
||||
gboolean managed;
|
||||
NMConfigDeviceStateManagedType managed_type;
|
||||
NMConnection *settings_connection;
|
||||
const char *uuid = NULL;
|
||||
const char *perm_hw_addr_fake = NULL;
|
||||
@@ -4958,7 +4959,11 @@ nm_manager_write_device_state (NMManager *self)
|
||||
settings_connection = NM_CONNECTION (nm_device_get_settings_connection (device));
|
||||
if (settings_connection)
|
||||
uuid = nm_connection_get_uuid (settings_connection);
|
||||
}
|
||||
managed_type = NM_CONFIG_DEVICE_STATE_MANAGED_TYPE_MANAGED;
|
||||
} else if (nm_device_get_unmanaged_flags (device, NM_UNMANAGED_USER_EXPLICIT))
|
||||
managed_type = NM_CONFIG_DEVICE_STATE_MANAGED_TYPE_UNMANAGED;
|
||||
else
|
||||
managed_type = NM_CONFIG_DEVICE_STATE_MANAGED_TYPE_UNKNOWN;
|
||||
|
||||
perm_hw_addr_fake = nm_device_get_permanent_hw_address_full (device, FALSE, &perm_hw_addr_is_fake);
|
||||
if (perm_hw_addr_fake && !perm_hw_addr_is_fake)
|
||||
@@ -4966,7 +4971,7 @@ nm_manager_write_device_state (NMManager *self)
|
||||
|
||||
if (nm_config_device_state_write (priv->config,
|
||||
ifindex,
|
||||
managed,
|
||||
managed_type,
|
||||
perm_hw_addr_fake,
|
||||
uuid))
|
||||
g_hash_table_add (seen_ifindexes, GINT_TO_POINTER (ifindex));
|
||||
|
Reference in New Issue
Block a user