summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Haller <thaller@redhat.com>2017-09-26 16:28:49 +0200
committerThomas Haller <thaller@redhat.com>2017-09-28 14:44:46 +0200
commit5778bc6a34f2291d68247695119f2170bc3bf8b3 (patch)
tree893a8afd85737eda10075cba88c69023efa55774
parent286f21db1cb840d8bb1a4344664881470539398e (diff)
downloadNetworkManager-5778bc6a34f2291d68247695119f2170bc3bf8b3.tar.gz
device: add configuration option to mark devices as unmanaged
We already have various ways to mark a device as unmanaged. 1) via udev-rule ENV{NM_UNMANAGED}. This can be overwritten via D-Bus at runtime. 2) via settings plugin. That is NM_CONTROLLED=no for ifcfg-rh and keyfile.unmanaged-devices in NetworkManager.conf. 3) at runtime, via D-Bus. This is persisted in the run state file and persists restarts (but not reboot). This adds another way via NetworkManager.conf file. Note that the existing keyfile.unmanaged-devices (above 2) is also a configuration optin in NetworkManager.conf. However it has various downsides: - it cannot be overwritten at runtime (see commit c210134bd58ea40ee3458aff27ab41958e1f48b4). - you can only explicitly mark a device as unmanaged. That means, you cannot use it to manage a device which is unmanaged due to a udev rule. - the name "keyfile.*" sounds like it's only relevant for the keyfile settings plugin. Nowadays the keyfile plugin is always loaded, so the option applies to NetworkManager in general. https://github.com/NetworkManager/NetworkManager/pull/29
-rw-r--r--man/NetworkManager.conf.xml15
-rw-r--r--src/devices/nm-device.c50
-rw-r--r--src/devices/nm-device.h6
-rw-r--r--src/nm-config.h1
4 files changed, 66 insertions, 6 deletions
diff --git a/man/NetworkManager.conf.xml b/man/NetworkManager.conf.xml
index 749e97b64d..d9d5afcf96 100644
--- a/man/NetworkManager.conf.xml
+++ b/man/NetworkManager.conf.xml
@@ -821,7 +821,7 @@ ipv6.ip6-privacy=1
<programlisting>
[device]
match-device=interface-name:eth3
-ignore-carrier=1
+managed=1
</programlisting>
</para>
<refsect2>
@@ -829,6 +829,19 @@ ignore-carrier=1
<para>
The following properties can be configured per-device.
<variablelist>
+ <varlistentry id="managed">
+ <term><varname>managed</varname></term>
+ <listitem>
+ <para>
+ Whether the device is managed or not. A device can be
+ marked as managed via udev rules (ENV{NM_UNMANAGED}),
+ or via setting plugins (keyfile.unmanaged-devices).
+ This is yet another way. Note that this configuration
+ can be overruled at runtime via D-Bus. Also, it has
+ higher priority then udev rules.
+ </para>
+ </listitem>
+ </varlistentry>
<varlistentry id="ignore-carrier">
<term><varname>ignore-carrier</varname></term>
<listitem>
diff --git a/src/devices/nm-device.c b/src/devices/nm-device.c
index 96e39bf768..5e0940c451 100644
--- a/src/devices/nm-device.c
+++ b/src/devices/nm-device.c
@@ -2671,6 +2671,7 @@ device_link_changed (NMDevice *self)
NMDeviceStateReason reason;
nm_device_set_unmanaged_by_user_udev (self);
+ nm_device_set_unmanaged_by_user_conf (self);
reason = NM_DEVICE_STATE_REASON_NOW_MANAGED;
@@ -3309,6 +3310,7 @@ realize_start_setup (NMDevice *self,
nm_device_set_unmanaged_flags (self, NM_UNMANAGED_LOOPBACK, priv->ifindex == 1);
nm_device_set_unmanaged_by_user_udev (self);
+ nm_device_set_unmanaged_by_user_conf (self);
nm_device_set_unmanaged_flags (self, NM_UNMANAGED_PLATFORM_INIT,
plink && !plink->initialized);
@@ -11191,6 +11193,7 @@ NM_UTILS_FLAGS2STR_DEFINE (nm_unmanaged_flags2str, NMUnmanagedFlags,
NM_UTILS_FLAGS2STR (NM_UNMANAGED_USER_EXPLICIT, "user-explicit"),
NM_UTILS_FLAGS2STR (NM_UNMANAGED_BY_DEFAULT, "by-default"),
NM_UTILS_FLAGS2STR (NM_UNMANAGED_USER_SETTINGS, "user-settings"),
+ NM_UTILS_FLAGS2STR (NM_UNMANAGED_USER_CONF, "user-conf"),
NM_UTILS_FLAGS2STR (NM_UNMANAGED_USER_UDEV, "user-udev"),
NM_UTILS_FLAGS2STR (NM_UNMANAGED_EXTERNAL_DOWN, "external-down"),
NM_UTILS_FLAGS2STR (NM_UNMANAGED_IS_SLAVE, "is-slave"),
@@ -11283,11 +11286,19 @@ _get_managed_by_flags(NMUnmanagedFlags flags, NMUnmanagedFlags mask, gboolean fo
if (NM_FLAGS_ANY (mask, NM_UNMANAGED_USER_UDEV)) {
/* configuration from udev or nm-config overwrites the by-default flag
- * which is based on the device type. */
- flags &= ~NM_UNMANAGED_BY_DEFAULT;
+ * which is based on the device type.
+ * configuration from udev overwrites external-down */
+ flags &= ~( NM_UNMANAGED_BY_DEFAULT
+ | NM_UNMANAGED_EXTERNAL_DOWN);
+ }
- /* configuration from udev overwrites external-down */
- flags &= ~NM_UNMANAGED_EXTERNAL_DOWN;
+ if (NM_FLAGS_ANY (mask, NM_UNMANAGED_USER_CONF)) {
+ /* configuration from NetworkManager.conf overwrites the by-default flag
+ * which is based on the device type.
+ * It also overwrites the udev configuration and external-down */
+ flags &= ~( NM_UNMANAGED_BY_DEFAULT
+ || NM_UNMANAGED_USER_UDEV
+ || NM_UNMANAGED_EXTERNAL_DOWN);
}
if ( NM_FLAGS_HAS (mask, NM_UNMANAGED_IS_SLAVE)
@@ -11299,9 +11310,9 @@ _get_managed_by_flags(NMUnmanagedFlags flags, NMUnmanagedFlags mask, gboolean fo
if (NM_FLAGS_HAS (mask, NM_UNMANAGED_USER_EXPLICIT)) {
/* if the device is managed by user-decision, certain other flags
* are ignored. */
-
flags &= ~( NM_UNMANAGED_BY_DEFAULT
| NM_UNMANAGED_USER_UDEV
+ | NM_UNMANAGED_USER_CONF
| NM_UNMANAGED_EXTERNAL_DOWN);
}
@@ -11608,6 +11619,35 @@ nm_device_set_unmanaged_by_user_udev (NMDevice *self)
}
void
+nm_device_set_unmanaged_by_user_conf (NMDevice *self)
+{
+ gboolean value;
+ NMUnmanFlagOp set_op;
+
+ value = nm_config_data_get_device_config_boolean (NM_CONFIG_GET_DATA,
+ NM_CONFIG_KEYFILE_KEY_DEVICE_MANAGED,
+ self,
+ -1,
+ TRUE);
+ switch (value) {
+ case TRUE:
+ set_op = NM_UNMAN_FLAG_OP_SET_MANAGED;
+ break;
+ case FALSE:
+ set_op = NM_UNMAN_FLAG_OP_SET_UNMANAGED;
+ break;
+ default:
+ set_op = NM_UNMAN_FLAG_OP_FORGET;
+ break;
+ }
+
+ nm_device_set_unmanaged_by_flags (self,
+ NM_UNMANAGED_USER_CONF,
+ set_op,
+ NM_DEVICE_STATE_REASON_USER_REQUESTED);
+}
+
+void
nm_device_set_unmanaged_by_quitting (NMDevice *self)
{
NMDevicePrivate *priv = NM_DEVICE_GET_PRIVATE (self);
diff --git a/src/devices/nm-device.h b/src/devices/nm-device.h
index ffd5b847de..5b34446949 100644
--- a/src/devices/nm-device.h
+++ b/src/devices/nm-device.h
@@ -580,6 +580,10 @@ void nm_device_copy_ip6_dns_config (NMDevice *self, NMDevice *from_device);
* the settings plugins, such as NM_CONTROLLED=no in ifcfg-rh), it cannot
* be overruled and is authorative. That is because users may depend on
* dropping a ifcfg-rh file to ensure the device is unmanaged.
+ * @NM_UNMANAGED_USER_CONF: %TRUE when unmanaged by user decision via
+ * the NetworkManager.conf ("unmanaged" in the [device] section).
+ * Contray to @NM_UNMANAGED_USER_SETTINGS, this can be overwritten via
+ * D-Bus.
* @NM_UNMANAGED_BY_DEFAULT: %TRUE for certain device types where we unmanage
* them by default
* @NM_UNMANAGED_USER_UDEV: %TRUE when unmanaged by user decision (via UDev rule)
@@ -604,6 +608,7 @@ typedef enum { /*< skip >*/
/* These flags can be non-effective and be overwritten
* by other flags. */
NM_UNMANAGED_BY_DEFAULT = (1LL << 8),
+ NM_UNMANAGED_USER_CONF = (1LL << 9),
NM_UNMANAGED_USER_UDEV = (1LL << 10),
NM_UNMANAGED_EXTERNAL_DOWN = (1LL << 11),
NM_UNMANAGED_IS_SLAVE = (1LL << 12),
@@ -634,6 +639,7 @@ void nm_device_set_unmanaged_by_flags_queue (NMDevice *self,
NMDeviceStateReason reason);
void nm_device_set_unmanaged_by_user_settings (NMDevice *self);
void nm_device_set_unmanaged_by_user_udev (NMDevice *self);
+void nm_device_set_unmanaged_by_user_conf (NMDevice *self);
void nm_device_set_unmanaged_by_quitting (NMDevice *device);
gboolean nm_device_is_nm_owned (NMDevice *device);
diff --git a/src/nm-config.h b/src/nm-config.h
index 1f9d4aba4c..47e929884c 100644
--- a/src/nm-config.h
+++ b/src/nm-config.h
@@ -75,6 +75,7 @@
#define NM_CONFIG_KEYFILE_KEY_IFUPDOWN_MANAGED "managed"
#define NM_CONFIG_KEYFILE_KEY_AUDIT "audit"
+#define NM_CONFIG_KEYFILE_KEY_DEVICE_MANAGED "managed"
#define NM_CONFIG_KEYFILE_KEY_DEVICE_IGNORE_CARRIER "ignore-carrier"
#define NM_CONFIG_KEYFILE_KEY_DEVICE_SRIOV_NUM_VFS "sriov-num-vfs"