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;
|
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
|
gboolean
|
||||||
nm_config_device_state_write (NMConfig *self,
|
nm_config_device_state_write (NMConfig *self,
|
||||||
int ifindex,
|
int ifindex,
|
||||||
gboolean managed,
|
NMConfigDeviceStateManagedType managed,
|
||||||
const char *perm_hw_addr_fake,
|
const char *perm_hw_addr_fake,
|
||||||
const char *connection_uuid)
|
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 (NM_IS_CONFIG (self), FALSE);
|
||||||
g_return_val_if_fail (ifindex > 0, FALSE);
|
g_return_val_if_fail (ifindex > 0, FALSE);
|
||||||
g_return_val_if_fail (!connection_uuid || *connection_uuid, 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_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);
|
nm_sprintf_buf (path, "%s/%d", NM_CONFIG_DEVICE_STATE_DIR, ifindex);
|
||||||
|
|
||||||
kf = nm_config_create_keyfile ();
|
kf = nm_config_create_keyfile ();
|
||||||
g_key_file_set_boolean (kf,
|
if (NM_IN_SET (managed,
|
||||||
DEVICE_RUN_STATE_KEYFILE_GROUP_DEVICE,
|
NM_CONFIG_DEVICE_STATE_MANAGED_TYPE_MANAGED,
|
||||||
DEVICE_RUN_STATE_KEYFILE_KEY_DEVICE_MANAGED,
|
NM_CONFIG_DEVICE_STATE_MANAGED_TYPE_UNMANAGED)) {
|
||||||
!!managed);
|
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) {
|
if (perm_hw_addr_fake) {
|
||||||
g_key_file_set_string (kf,
|
g_key_file_set_string (kf,
|
||||||
DEVICE_RUN_STATE_KEYFILE_GROUP_DEVICE,
|
DEVICE_RUN_STATE_KEYFILE_GROUP_DEVICE,
|
||||||
@@ -2007,9 +2018,9 @@ nm_config_device_state_write (NMConfig *self,
|
|||||||
g_error_free (local);
|
g_error_free (local);
|
||||||
return FALSE;
|
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,
|
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 (connection_uuid, ", connection-uuid=", connection_uuid, "", ""),
|
||||||
NM_PRINT_FMT_QUOTED (perm_hw_addr_fake, ", perm-hw-addr-fake=", perm_hw_addr_fake, "", ""));
|
NM_PRINT_FMT_QUOTED (perm_hw_addr_fake, ", perm-hw-addr-fake=", perm_hw_addr_fake, "", ""));
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
@@ -207,7 +207,7 @@ NMConfigDeviceStateData *nm_config_device_state_load (NMConfig *self,
|
|||||||
int ifindex);
|
int ifindex);
|
||||||
gboolean nm_config_device_state_write (NMConfig *self,
|
gboolean nm_config_device_state_write (NMConfig *self,
|
||||||
int ifindex,
|
int ifindex,
|
||||||
gboolean managed,
|
NMConfigDeviceStateManagedType managed,
|
||||||
const char *perm_hw_addr_fake,
|
const char *perm_hw_addr_fake,
|
||||||
const char *connection_uuid);
|
const char *connection_uuid);
|
||||||
void nm_config_device_state_prune_unseen (NMConfig *self, GHashTable *seen_ifindexes);
|
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);
|
NMDevice *device = NM_DEVICE (devices->data);
|
||||||
int ifindex;
|
int ifindex;
|
||||||
gboolean managed;
|
gboolean managed;
|
||||||
|
NMConfigDeviceStateManagedType managed_type;
|
||||||
NMConnection *settings_connection;
|
NMConnection *settings_connection;
|
||||||
const char *uuid = NULL;
|
const char *uuid = NULL;
|
||||||
const char *perm_hw_addr_fake = 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));
|
settings_connection = NM_CONNECTION (nm_device_get_settings_connection (device));
|
||||||
if (settings_connection)
|
if (settings_connection)
|
||||||
uuid = nm_connection_get_uuid (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);
|
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)
|
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,
|
if (nm_config_device_state_write (priv->config,
|
||||||
ifindex,
|
ifindex,
|
||||||
managed,
|
managed_type,
|
||||||
perm_hw_addr_fake,
|
perm_hw_addr_fake,
|
||||||
uuid))
|
uuid))
|
||||||
g_hash_table_add (seen_ifindexes, GINT_TO_POINTER (ifindex));
|
g_hash_table_add (seen_ifindexes, GINT_TO_POINTER (ifindex));
|
||||||
|
Reference in New Issue
Block a user