summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFrancesco Giudici <fgiudici@redhat.com>2017-03-23 18:23:10 +0100
committerFrancesco Giudici <fgiudici@redhat.com>2017-04-05 11:49:08 +0200
commited7abdb016766463cb72aaafedbf8742ea702fe2 (patch)
treee719facdb0a468c7250a9a863b4c0b47443abed2
parent3d4d1bedda59bca23799db4d7a437c4a3a0c4be7 (diff)
downloadNetworkManager-fg/hostname_dhcp-sticky.tar.gz
policy: add new hostname-mode "dhcp-sticky"fg/hostname_dhcp-sticky
Retrieve the transient hostname from DHCP only, as it already does the "dhcp" hostname-mode, but avoid resetting the hostname when the DHCP connection is deactivated. Related: https://bugzilla.redhat.com/show_bug.cgi?id=1405275
-rw-r--r--man/NetworkManager.conf.xml4
-rw-r--r--src/nm-policy.c5
-rw-r--r--src/nm-policy.h8
3 files changed, 15 insertions, 2 deletions
diff --git a/man/NetworkManager.conf.xml b/man/NetworkManager.conf.xml
index 1230347d83..1e27bb06c7 100644
--- a/man/NetworkManager.conf.xml
+++ b/man/NetworkManager.conf.xml
@@ -299,6 +299,10 @@ no-auto-default=*
the hostname is reset to the last hostname set outside NetworkManager or
'localhost' if none valid is there.
</para>
+ <para><literal>dhcp-sticky</literal>: NetworkManager will behave the same as
+ in <literal>dhcp</literal> mode, but will never reset the hostname also if the
+ related DHCP connection is deactivated.
+ </para>
<para><literal>none</literal>: NetworkManager will not manage the transient
hostname and will never set it.
</para>
diff --git a/src/nm-policy.c b/src/nm-policy.c
index 80f9caedfa..6f420461d0 100644
--- a/src/nm-policy.c
+++ b/src/nm-policy.c
@@ -698,6 +698,9 @@ update_system_hostname (NMPolicy *self, NMDevice *best4, NMDevice *best6, const
if (external_hostname)
return;
+ if (priv->hostname_mode == NM_POLICY_HOSTNAME_MODE_DHCP_STICKY)
+ return;
+
if (priv->hostname_mode == NM_POLICY_HOSTNAME_MODE_DHCP) {
/* In dhcp hostname-mode, the hostname is updated only if it comes from
* a DHCP host-name option: if last set was from a host-name option and
@@ -2297,6 +2300,8 @@ nm_policy_init (NMPolicy *self)
priv->hostname_mode = NM_POLICY_HOSTNAME_MODE_NONE;
else if (nm_streq0 (hostname_mode, "dhcp"))
priv->hostname_mode = NM_POLICY_HOSTNAME_MODE_DHCP;
+ else if (nm_streq0 (hostname_mode, "dhcp-sticky"))
+ priv->hostname_mode = NM_POLICY_HOSTNAME_MODE_DHCP_STICKY;
else /* default - full mode */
priv->hostname_mode = NM_POLICY_HOSTNAME_MODE_FULL;
diff --git a/src/nm-policy.h b/src/nm-policy.h
index 2c96e6d090..8572355618 100644
--- a/src/nm-policy.h
+++ b/src/nm-policy.h
@@ -50,8 +50,11 @@ NMDevice *nm_policy_get_activating_ip6_device (NMPolicy *policy);
/**
* NMPolicyHostnameMode
* @NM_POLICY_HOSTNAME_MODE_NONE: never update the transient hostname.
- * @NM_POLICY_HOSTNAME_MODE_DHCP: only hostname from DHCP hostname
- * options are eligible to be set as transient hostname.
+ * @NM_POLICY_HOSTNAME_MODE_DHCP: only hostname from DHCP host-name
+ * option is eligible to be set as transient hostname
+ * @NM_POLICY_HOSTNAME_MODE_DHCP_STICKY: like NM_POLICY_HOSTNAME_MODE_DHCP
+ * but the hostname will not be reset if the DHCP connection which provided
+ * the host-name option becomes inactive
* @NM_POLICY_HOSTNAME_MODE_FULL: NM will try to update the hostname looking
* to current static hostname, DHCP options, reverse IP lookup and externally
* set hostnames.
@@ -61,6 +64,7 @@ NMDevice *nm_policy_get_activating_ip6_device (NMPolicy *policy);
typedef enum {
NM_POLICY_HOSTNAME_MODE_NONE,
NM_POLICY_HOSTNAME_MODE_DHCP,
+ NM_POLICY_HOSTNAME_MODE_DHCP_STICKY,
NM_POLICY_HOSTNAME_MODE_FULL,
} NMPolicyHostnameMode;