Files
NetworkManager/libnm-core/nm-setting-hostname.c
Beniamino Galvani 92c494f290 all: change default value of hostname.only-from-default to false
Currently, is retrieved by default only from the device with the
default route. This is done so that in presence of multiple
connections the choice is deterministic.

However, this limitation seems confusing for users, that expect to get
an hostname even for non-default devices. Change the default and allow
any device to obtain the hostname.

Note that when there is a default route, NM still prefers that device
and so the behavior doesn't change.

The only change in behavior is that when there is no default route and
the machine doesn't have a static hostname, NM will try to get
hostname from DHCP or reverse DNS.

https://bugzilla.redhat.com/show_bug.cgi?id=1766944
2021-01-18 16:29:55 +01:00

340 lines
9.9 KiB
C

/* SPDX-License-Identifier: LGPL-2.1-or-later */
/*
* Copyright (C) 2020 Red Hat, Inc.
*/
#include "nm-default.h"
#include "nm-setting-hostname.h"
#include "nm-setting-private.h"
#include "nm-utils-private.h"
/**
* SECTION:nm-setting-hostname
* @short_description: Contains properties related to the hostname
* @include: nm-setting-hostname.h
**/
/*****************************************************************************/
NM_GOBJECT_PROPERTIES_DEFINE(NMSettingHostname,
PROP_PRIORITY,
PROP_FROM_DHCP,
PROP_FROM_DNS_LOOKUP,
PROP_ONLY_FROM_DEFAULT, );
/**
* NMSettingHostname:
*
* Hostname settings
*
* Since: 1.30
*/
struct _NMSettingHostname {
NMSetting parent;
int priority;
NMTernary from_dhcp;
NMTernary from_dns_lookup;
NMTernary only_from_default;
};
struct _NMSettingHostnameClass {
NMSettingClass parent;
};
G_DEFINE_TYPE(NMSettingHostname, nm_setting_hostname, NM_TYPE_SETTING)
/**
* nm_setting_hostname_get_priority:
* @setting: the #NMSettingHostname
*
* Returns the value contained in the #NMSettingHostname:priority
* property.
*
* Returns: the 'priority' property value
*
* Since: 1.30
**/
int
nm_setting_hostname_get_priority(NMSettingHostname *setting)
{
g_return_val_if_fail(NM_IS_SETTING_HOSTNAME(setting), 0);
return setting->priority;
}
/**
* nm_setting_hostname_get_from_dhcp:
* @setting: the #NMSettingHostname
*
* Returns the value contained in the #NMSettingHostname:from-dhcp
* property.
*
* Returns: the 'from-dhcp' property value
*
* Since: 1.30
**/
NMTernary
nm_setting_hostname_get_from_dhcp(NMSettingHostname *setting)
{
g_return_val_if_fail(NM_IS_SETTING_HOSTNAME(setting), NM_TERNARY_DEFAULT);
return setting->from_dhcp;
}
/**
* nm_setting_hostname_get_from_dns_lookup:
* @setting: the #NMSettingHostname
*
* Returns the value contained in the #NMSettingHostname:from-dns-lookup
* property.
*
* Returns: the 'from-dns-lookup' property value
*
* Since: 1.30
**/
NMTernary
nm_setting_hostname_get_from_dns_lookup(NMSettingHostname *setting)
{
g_return_val_if_fail(NM_IS_SETTING_HOSTNAME(setting), NM_TERNARY_DEFAULT);
return setting->from_dns_lookup;
}
/**
* nm_setting_hostname_get_only_from_default:
* @setting: the #NMSettingHostname
*
* Returns the value contained in the #NMSettingHostname:only-from-default
* property.
*
* Returns: the 'only-from-default' property value
*
* Since: 1.30
**/
NMTernary
nm_setting_hostname_get_only_from_default(NMSettingHostname *setting)
{
g_return_val_if_fail(NM_IS_SETTING_HOSTNAME(setting), NM_TERNARY_DEFAULT);
return setting->only_from_default;
}
/*****************************************************************************/
static void
get_property(GObject *object, guint prop_id, GValue *value, GParamSpec *pspec)
{
NMSettingHostname *self = NM_SETTING_HOSTNAME(object);
switch (prop_id) {
case PROP_PRIORITY:
g_value_set_int(value, self->priority);
break;
case PROP_FROM_DHCP:
g_value_set_enum(value, self->from_dhcp);
break;
case PROP_FROM_DNS_LOOKUP:
g_value_set_enum(value, self->from_dns_lookup);
break;
case PROP_ONLY_FROM_DEFAULT:
g_value_set_enum(value, self->only_from_default);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
break;
}
}
static void
set_property(GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec)
{
NMSettingHostname *self = NM_SETTING_HOSTNAME(object);
switch (prop_id) {
case PROP_PRIORITY:
self->priority = g_value_get_int(value);
break;
case PROP_FROM_DHCP:
self->from_dhcp = g_value_get_enum(value);
break;
case PROP_FROM_DNS_LOOKUP:
self->from_dns_lookup = g_value_get_enum(value);
break;
case PROP_ONLY_FROM_DEFAULT:
self->only_from_default = g_value_get_enum(value);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
break;
}
}
/*****************************************************************************/
static void
nm_setting_hostname_init(NMSettingHostname *setting)
{
setting->from_dhcp = NM_TERNARY_DEFAULT;
setting->from_dns_lookup = NM_TERNARY_DEFAULT;
setting->only_from_default = NM_TERNARY_DEFAULT;
}
/**
* nm_setting_hostname_new:
*
* Creates a new #NMSettingHostname object with default values.
*
* Returns: (transfer full): the new empty #NMSettingHostname object
*
* Since: 1.30
**/
NMSetting *
nm_setting_hostname_new(void)
{
return g_object_new(NM_TYPE_SETTING_HOSTNAME, NULL);
}
static void
nm_setting_hostname_class_init(NMSettingHostnameClass *klass)
{
GObjectClass * object_class = G_OBJECT_CLASS(klass);
NMSettingClass *setting_class = NM_SETTING_CLASS(klass);
object_class->get_property = get_property;
object_class->set_property = set_property;
/**
* NMSettingHostname:priority
*
* The relative priority of this connection to determine the
* system hostname. A lower numerical value is better (higher
* priority). A connection with higher priority is considered
* before connections with lower priority.
*
* If the value is zero, it can be overridden by a global value
* from NetworkManager configuration. If the property doesn't have
* a value in the global configuration, the value is assumed to be
* 100.
*
* Negative values have the special effect of excluding other
* connections with a greater numerical priority value; so in
* presence of at least one negative priority, only connections
* with the lowest priority value will be used to determine the
* hostname.
*
* Since: 1.30
**/
/* ---ifcfg-rh---
* property: priority
* variable: HOSTNAME_PRIORITY(+)
* default: missing variable means global value or 100
* description: hostname priority
* example: HOSTNAME_PRIORITY=50
* ---end---
*/
obj_properties[PROP_PRIORITY] = g_param_spec_int(NM_SETTING_HOSTNAME_PRIORITY,
"",
"",
G_MININT32,
G_MAXINT32,
0,
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS);
/**
* NMSettingHostname:from-dhcp
*
* Whether the system hostname can be determined from DHCP on
* this connection.
*
* When set to %NM_TERNARY_DEFAULT, the value from global configuration
* is used. If the property doesn't have a value in the global
* configuration, NetworkManager assumes the value to be %NM_TERNARY_TRUE.
*
* Since: 1.30
**/
/* ---ifcfg-rh---
* property: from-dhcp
* variable: HOSTNAME_FROM_DHCP(+)
* default: missing variable means global default or 1
* description: whether the system hostname can be determined from DHCP
* example: HOSTNAME_FROM_DHCP=0,1
* ---end---
*/
obj_properties[PROP_FROM_DHCP] = g_param_spec_enum(
NM_SETTING_HOSTNAME_FROM_DHCP,
"",
"",
NM_TYPE_TERNARY,
NM_TERNARY_DEFAULT,
NM_SETTING_PARAM_FUZZY_IGNORE | G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS);
/**
* NMSettingHostname:from-dns-lookup
*
* Whether the system hostname can be determined from reverse
* DNS lookup of addresses on this device.
*
* When set to %NM_TERNARY_DEFAULT, the value from global configuration
* is used. If the property doesn't have a value in the global
* configuration, NetworkManager assumes the value to be %NM_TERNARY_TRUE.
*
* Since: 1.30
**/
/* ---ifcfg-rh---
* property: from-dhcp
* variable: HOSTNAME_FROM_DNS_LOOKUP(+)
* default: missing variable means global default or 1
* description: whether the system hostname can be determined from reverse
* DNS lookup
* example: HOSTNAME_FROM_DNS_LOOKUP=0,1
* ---end---
*/
obj_properties[PROP_FROM_DNS_LOOKUP] = g_param_spec_enum(
NM_SETTING_HOSTNAME_FROM_DNS_LOOKUP,
"",
"",
NM_TYPE_TERNARY,
NM_TERNARY_DEFAULT,
NM_SETTING_PARAM_FUZZY_IGNORE | G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS);
/**
* NMSettingHostname:only-from-default
*
* If set to %NM_TERNARY_TRUE, NetworkManager attempts to get
* the hostname via DHCPv4/DHCPv6 or reverse DNS lookup on this
* device only when the device has the default route for the given
* address family (IPv4/IPv6).
*
* If set to %NM_TERNARY_FALSE, the hostname can be set from this
* device even if it doesn't have the default route.
*
* When set to %NM_TERNARY_DEFAULT, the value from global configuration
* is used. If the property doesn't have a value in the global
* configuration, NetworkManager assumes the value to be %NM_TERNARY_FALSE.
*
* Since: 1.30
**/
/* ---ifcfg-rh---
* property: only-best-device
* variable: HOSTNAME_ONLY_FROM_DEFAULT(+)
* default: missing variable means global default or 1
* description: whether the hostname can be determined only from
* devices with the default route
* example: HOSTNAME_ONLY_FROM_DEFAULT=0,1
* ---end---
*/
obj_properties[PROP_ONLY_FROM_DEFAULT] = g_param_spec_enum(
NM_SETTING_HOSTNAME_ONLY_FROM_DEFAULT,
"",
"",
NM_TYPE_TERNARY,
NM_TERNARY_DEFAULT,
NM_SETTING_PARAM_FUZZY_IGNORE | G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS);
g_object_class_install_properties(object_class, _PROPERTY_ENUMS_LAST, obj_properties);
_nm_setting_class_commit(setting_class, NM_META_SETTING_TYPE_HOSTNAME);
}