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:
Thomas Haller
2017-04-07 13:48:43 +02:00
parent fad2cf0721
commit 142ebb1037
3 changed files with 27 additions and 11 deletions

View File

@@ -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;

View File

@@ -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);

View File

@@ -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));