From ed7abdb016766463cb72aaafedbf8742ea702fe2 Mon Sep 17 00:00:00 2001 From: Francesco Giudici Date: Thu, 23 Mar 2017 18:23:10 +0100 Subject: policy: add new hostname-mode "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 --- man/NetworkManager.conf.xml | 4 ++++ src/nm-policy.c | 5 +++++ src/nm-policy.h | 8 ++++++-- 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. + dhcp-sticky: NetworkManager will behave the same as + in dhcp mode, but will never reset the hostname also if the + related DHCP connection is deactivated. + none: NetworkManager will not manage the transient hostname and will never set it. 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; -- cgit v1.2.1