ifcfg-rh: merge branch 'fg/dhcp_hostname_bgo775622'

https://bugzilla.gnome.org/show_bug.cgi?id=775622
This commit is contained in:
Francesco Giudici
2016-12-15 11:29:05 +01:00
6 changed files with 112 additions and 67 deletions

View File

@@ -1892,6 +1892,7 @@ EXTRA_DIST += \
src/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-test-wired-dhcp-plus-ip \ src/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-test-wired-dhcp-plus-ip \
src/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-test-wired-shared-plus-ip \ src/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-test-wired-shared-plus-ip \
src/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-test-wired-dhcp-send-hostname \ src/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-test-wired-dhcp-send-hostname \
src/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-test-wired-dhcpv6-hostname-fallback \
src/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-test-wired-dhcp6-only \ src/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-test-wired-dhcp6-only \
src/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-test-wired-autoip \ src/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-test-wired-autoip \
src/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-test-wired-global-gateway \ src/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-test-wired-global-gateway \

View File

@@ -411,7 +411,7 @@ dispose (GObject *object)
if (priv->clients) { if (priv->clients) {
values = g_hash_table_get_values (priv->clients); values = g_hash_table_get_values (priv->clients);
for (iter = values; iter; iter = g_list_next (iter)) for (iter = values; iter; iter = g_list_next (iter))
remove_client (NM_DHCP_MANAGER (object), NM_DHCP_CLIENT (iter->data)); remove_client (NM_DHCP_MANAGER (object), NM_DHCP_CLIENT (iter->data));
g_list_free (values); g_list_free (values);
} }

View File

@@ -1070,31 +1070,29 @@ make_ip4_setting (shvarFile *ifcfg,
return NM_SETTING (s_ip4); return NM_SETTING (s_ip4);
/* Handle DHCP settings */ /* Handle DHCP settings */
if (!strcmp (method, NM_SETTING_IP4_CONFIG_METHOD_AUTO)) { value = svGetValueString (ifcfg, "DHCP_HOSTNAME");
value = svGetValueString (ifcfg, "DHCP_HOSTNAME"); if (value && *value)
if (value && *value) g_object_set (s_ip4, NM_SETTING_IP_CONFIG_DHCP_HOSTNAME, value, NULL);
g_object_set (s_ip4, NM_SETTING_IP_CONFIG_DHCP_HOSTNAME, value, NULL); g_free (value);
g_free (value);
value = svGetValueString (ifcfg, "DHCP_FQDN");
if (value && *value) {
g_object_set (s_ip4,
NM_SETTING_IP_CONFIG_DHCP_HOSTNAME, NULL,
NM_SETTING_IP4_CONFIG_DHCP_FQDN, value,
NULL);
}
g_free (value);
value = svGetValueString (ifcfg, "DHCP_FQDN");
if (value && *value) {
g_object_set (s_ip4, g_object_set (s_ip4,
NM_SETTING_IP_CONFIG_DHCP_SEND_HOSTNAME, svGetValueBoolean (ifcfg, "DHCP_SEND_HOSTNAME", TRUE), NM_SETTING_IP_CONFIG_DHCP_HOSTNAME, NULL,
NM_SETTING_IP_CONFIG_DHCP_TIMEOUT, svGetValueInt64 (ifcfg, "IPV4_DHCP_TIMEOUT", 10, 0, G_MAXINT32, 0), NM_SETTING_IP4_CONFIG_DHCP_FQDN, value,
NULL); NULL);
value = svGetValueString (ifcfg, "DHCP_CLIENT_ID");
if (value && strlen (value))
g_object_set (s_ip4, NM_SETTING_IP4_CONFIG_DHCP_CLIENT_ID, value, NULL);
g_free (value);
} }
g_free (value);
g_object_set (s_ip4,
NM_SETTING_IP_CONFIG_DHCP_SEND_HOSTNAME, svGetValueBoolean (ifcfg, "DHCP_SEND_HOSTNAME", TRUE),
NM_SETTING_IP_CONFIG_DHCP_TIMEOUT, svGetValueInt64 (ifcfg, "IPV4_DHCP_TIMEOUT", 10, 0, G_MAXINT32, 0),
NULL);
value = svGetValueString (ifcfg, "DHCP_CLIENT_ID");
if (value && strlen (value))
g_object_set (s_ip4, NM_SETTING_IP4_CONFIG_DHCP_CLIENT_ID, value, NULL);
g_free (value);
/* Read static IP addresses. /* Read static IP addresses.
* Read them even for AUTO method - in this case the addresses are * Read them even for AUTO method - in this case the addresses are
@@ -1508,14 +1506,22 @@ make_ip6_setting (shvarFile *ifcfg,
if (strcmp (method, NM_SETTING_IP6_CONFIG_METHOD_IGNORE) == 0) if (strcmp (method, NM_SETTING_IP6_CONFIG_METHOD_IGNORE) == 0)
return NM_SETTING (s_ip6); return NM_SETTING (s_ip6);
if ( !strcmp (method, NM_SETTING_IP6_CONFIG_METHOD_AUTO) value = svGetValueString (ifcfg, "DHCPV6_HOSTNAME");
|| !strcmp (method, NM_SETTING_IP6_CONFIG_METHOD_DHCP)) { /* Use DHCP_HOSTNAME as fallback if it is in FQDN format and ipv6.method is
/* METHOD_AUTO may trigger DHCPv6, so save the hostname to send to DHCP */ * auto or dhcp: this is required to support old ifcfg files
*/
if (!value && ( !strcmp (method, NM_SETTING_IP6_CONFIG_METHOD_AUTO)
|| !strcmp (method, NM_SETTING_IP6_CONFIG_METHOD_DHCP))) {
value = svGetValueString (ifcfg, "DHCP_HOSTNAME"); value = svGetValueString (ifcfg, "DHCP_HOSTNAME");
if (value && value[0]) if (value && !strchr (value, '.'))
g_object_set (s_ip6, NM_SETTING_IP_CONFIG_DHCP_HOSTNAME, value, NULL); g_clear_pointer (&value, g_free);
g_free (value);
} }
if (value)
g_object_set (s_ip6, NM_SETTING_IP_CONFIG_DHCP_HOSTNAME, value, NULL);
g_free (value);
g_object_set (s_ip6, NM_SETTING_IP_CONFIG_DHCP_SEND_HOSTNAME,
svGetValueBoolean (ifcfg, "DHCPV6_SEND_HOSTNAME", TRUE), NULL);
/* Read static IP addresses. /* Read static IP addresses.
* Read them even for AUTO and DHCP methods - in this case the addresses are * Read them even for AUTO and DHCP methods - in this case the addresses are

View File

@@ -2172,36 +2172,32 @@ write_ip4_setting (NMConnection *connection, shvarFile *ifcfg, GError **error)
/* DEFROUTE; remember that it has the opposite meaning from never-default */ /* DEFROUTE; remember that it has the opposite meaning from never-default */
svSetValueBoolean (ifcfg, "DEFROUTE", !nm_setting_ip_config_get_never_default (s_ip4)); svSetValueBoolean (ifcfg, "DEFROUTE", !nm_setting_ip_config_get_never_default (s_ip4));
svUnsetValue (ifcfg, "PEERDNS"); /* Missing PEERDNS means TRUE, so write it only when is FALSE */
svUnsetValue (ifcfg, "PEERROUTES"); svSetValueString (ifcfg, "PEERDNS",
svUnsetValue (ifcfg, "DHCP_CLIENT_ID"); nm_setting_ip_config_get_ignore_auto_dns (s_ip4) ? "no" : NULL);
if (!strcmp (method, NM_SETTING_IP4_CONFIG_METHOD_AUTO)) { /* Missing PEERROUTES means TRUE, so write it only when is FALSE */
svSetValueBoolean (ifcfg, "PEERDNS", !nm_setting_ip_config_get_ignore_auto_dns (s_ip4)); svSetValueString (ifcfg, "PEERROUTES",
svSetValueBoolean (ifcfg, "PEERROUTES", !nm_setting_ip_config_get_ignore_auto_routes (s_ip4)); nm_setting_ip_config_get_ignore_auto_routes (s_ip4) ? "no" : NULL);
value = nm_setting_ip_config_get_dhcp_hostname (s_ip4); value = nm_setting_ip_config_get_dhcp_hostname (s_ip4);
if (value) svSetValueString (ifcfg, "DHCP_HOSTNAME", value);
svSetValueString (ifcfg, "DHCP_HOSTNAME", value);
value = nm_setting_ip4_config_get_dhcp_fqdn (NM_SETTING_IP4_CONFIG (s_ip4)); value = nm_setting_ip4_config_get_dhcp_fqdn (NM_SETTING_IP4_CONFIG (s_ip4));
if (value) svSetValueString (ifcfg, "DHCP_FQDN", value);
svSetValueString (ifcfg, "DHCP_FQDN", value);
/* Missing DHCP_SEND_HOSTNAME means TRUE, and we prefer not write it explicitly /* Missing DHCP_SEND_HOSTNAME means TRUE, and we prefer not write it explicitly
* in that case, because it is NM-specific variable * in that case, because it is NM-specific variable
*/ */
svSetValueString (ifcfg, "DHCP_SEND_HOSTNAME", svSetValueString (ifcfg, "DHCP_SEND_HOSTNAME",
nm_setting_ip_config_get_dhcp_send_hostname (s_ip4) ? NULL : "no"); nm_setting_ip_config_get_dhcp_send_hostname (s_ip4) ? NULL : "no");
value = nm_setting_ip4_config_get_dhcp_client_id (NM_SETTING_IP4_CONFIG (s_ip4)); value = nm_setting_ip4_config_get_dhcp_client_id (NM_SETTING_IP4_CONFIG (s_ip4));
if (value) svSetValueString (ifcfg, "DHCP_CLIENT_ID", value);
svSetValueString (ifcfg, "DHCP_CLIENT_ID", value);
timeout = nm_setting_ip_config_get_dhcp_timeout (s_ip4); timeout = nm_setting_ip_config_get_dhcp_timeout (s_ip4);
tmp = timeout ? g_strdup_printf ("%d", timeout) : NULL; tmp = timeout ? g_strdup_printf ("%d", timeout) : NULL;
svSetValueString (ifcfg, "IPV4_DHCP_TIMEOUT", tmp); svSetValueString (ifcfg, "IPV4_DHCP_TIMEOUT", tmp);
g_free (tmp); g_free (tmp);
}
svSetValueBoolean (ifcfg, "IPV4_FAILURE_FATAL", !nm_setting_ip_config_get_may_fail (s_ip4)); svSetValueBoolean (ifcfg, "IPV4_FAILURE_FATAL", !nm_setting_ip_config_get_may_fail (s_ip4));
@@ -2446,6 +2442,23 @@ error:
return success; return success;
} }
static void
write_ip6_setting_dhcp_hostname (NMSettingIPConfig *s_ip6, shvarFile *ifcfg)
{
const char *hostname;
hostname = nm_setting_ip_config_get_dhcp_hostname (s_ip6);
svSetValueString (ifcfg, "DHCPV6_HOSTNAME", hostname);
/* Missing DHCPV6_SEND_HOSTNAME means TRUE, and we prefer not write it
* explicitly in that case, because it is NM-specific variable
*/
if (nm_setting_ip_config_get_dhcp_send_hostname (s_ip6))
svUnsetValue (ifcfg, "DHCPV6_SEND_HOSTNAME");
else
svSetValueString (ifcfg, "DHCPV6_SEND_HOSTNAME", "no");
}
static gboolean static gboolean
write_ip6_setting (NMConnection *connection, shvarFile *ifcfg, GError **error) write_ip6_setting (NMConnection *connection, shvarFile *ifcfg, GError **error)
{ {
@@ -2473,6 +2486,8 @@ write_ip6_setting (NMConnection *connection, shvarFile *ifcfg, GError **error)
svUnsetValue (ifcfg, "IPV6INIT"); svUnsetValue (ifcfg, "IPV6INIT");
svUnsetValue (ifcfg, "IPV6_AUTOCONF"); svUnsetValue (ifcfg, "IPV6_AUTOCONF");
svUnsetValue (ifcfg, "DHCPV6C"); svUnsetValue (ifcfg, "DHCPV6C");
svUnsetValue (ifcfg, "DHCPV6_HOSTNAME");
svUnsetValue (ifcfg, "DHCPV6_SEND_HOSTNAME");
svUnsetValue (ifcfg, "IPV6_DEFROUTE"); svUnsetValue (ifcfg, "IPV6_DEFROUTE");
svUnsetValue (ifcfg, "IPV6_PEERDNS"); svUnsetValue (ifcfg, "IPV6_PEERDNS");
svUnsetValue (ifcfg, "IPV6_PEERROUTES"); svUnsetValue (ifcfg, "IPV6_PEERROUTES");
@@ -2493,13 +2508,9 @@ write_ip6_setting (NMConnection *connection, shvarFile *ifcfg, GError **error)
svSetValueString (ifcfg, "IPV6_AUTOCONF", "yes"); svSetValueString (ifcfg, "IPV6_AUTOCONF", "yes");
svUnsetValue (ifcfg, "DHCPV6C"); svUnsetValue (ifcfg, "DHCPV6C");
} else if (!strcmp (value, NM_SETTING_IP6_CONFIG_METHOD_DHCP)) { } else if (!strcmp (value, NM_SETTING_IP6_CONFIG_METHOD_DHCP)) {
const char *hostname;
svSetValueString (ifcfg, "IPV6INIT", "yes"); svSetValueString (ifcfg, "IPV6INIT", "yes");
svSetValueString (ifcfg, "IPV6_AUTOCONF", "no"); svSetValueString (ifcfg, "IPV6_AUTOCONF", "no");
svSetValueString (ifcfg, "DHCPV6C", "yes"); svSetValueString (ifcfg, "DHCPV6C", "yes");
hostname = nm_setting_ip_config_get_dhcp_hostname (s_ip6);
if (hostname)
svSetValueString (ifcfg, "DHCP_HOSTNAME", hostname);
} else if (!strcmp (value, NM_SETTING_IP6_CONFIG_METHOD_MANUAL)) { } else if (!strcmp (value, NM_SETTING_IP6_CONFIG_METHOD_MANUAL)) {
svSetValueString (ifcfg, "IPV6INIT", "yes"); svSetValueString (ifcfg, "IPV6INIT", "yes");
svSetValueString (ifcfg, "IPV6_AUTOCONF", "no"); svSetValueString (ifcfg, "IPV6_AUTOCONF", "no");
@@ -2514,6 +2525,8 @@ write_ip6_setting (NMConnection *connection, shvarFile *ifcfg, GError **error)
svUnsetValue (ifcfg, "DHCPV6C"); svUnsetValue (ifcfg, "DHCPV6C");
} }
write_ip6_setting_dhcp_hostname (s_ip6, ifcfg);
/* Write out IP addresses */ /* Write out IP addresses */
num = nm_setting_ip_config_get_num_addresses (s_ip6); num = nm_setting_ip_config_get_num_addresses (s_ip6);
ip_str1 = g_string_new (NULL); ip_str1 = g_string_new (NULL);
@@ -2570,6 +2583,7 @@ write_ip6_setting (NMConnection *connection, shvarFile *ifcfg, GError **error)
g_free (ip4_domains); g_free (ip4_domains);
} }
/* handle IPV6_DEFROUTE */ /* handle IPV6_DEFROUTE */
/* IPV6_DEFROUTE has the opposite meaning from 'never-default' */ /* IPV6_DEFROUTE has the opposite meaning from 'never-default' */
if (nm_setting_ip_config_get_never_default(s_ip6)) if (nm_setting_ip_config_get_never_default(s_ip6))
@@ -2577,15 +2591,11 @@ write_ip6_setting (NMConnection *connection, shvarFile *ifcfg, GError **error)
else else
svSetValueString (ifcfg, "IPV6_DEFROUTE", "yes"); svSetValueString (ifcfg, "IPV6_DEFROUTE", "yes");
svUnsetValue (ifcfg, "IPV6_PEERDNS"); svSetValueString (ifcfg, "IPV6_PEERDNS",
svUnsetValue (ifcfg, "IPV6_PEERROUTES"); nm_setting_ip_config_get_ignore_auto_dns (s_ip6) ? "no" : NULL);
if (!strcmp (value, NM_SETTING_IP6_CONFIG_METHOD_AUTO)) {
svSetValueString (ifcfg, "IPV6_PEERDNS",
nm_setting_ip_config_get_ignore_auto_dns (s_ip6) ? "no" : "yes");
svSetValueString (ifcfg, "IPV6_PEERROUTES", svSetValueString (ifcfg, "IPV6_PEERROUTES",
nm_setting_ip_config_get_ignore_auto_routes (s_ip6) ? "no" : "yes"); nm_setting_ip_config_get_ignore_auto_routes (s_ip6) ? "no" : NULL);
}
svSetValueString (ifcfg, "IPV6_FAILURE_FATAL", svSetValueString (ifcfg, "IPV6_FAILURE_FATAL",
nm_setting_ip_config_get_may_fail (s_ip6) ? "no" : "yes"); nm_setting_ip_config_get_may_fail (s_ip6) ? "no" : "yes");

View File

@@ -0,0 +1,12 @@
# Intel Corporation 82540EP Gigabit Ethernet Controller (Mobile)
TYPE=Ethernet
DEVICE=eth0
HWADDR=00:11:22:33:44:ee
BOOTPROTO=dhcp
ONBOOT=yes
IPV6INIT=yes
IPV6_AUTOCONF=yes
USERCTL=yes
NM_CONTROLLED=yes
PEERDNS=no
DHCP_HOSTNAME="fully.qualified.domain"

View File

@@ -3891,7 +3891,7 @@ test_read_write_wired_dhcp_send_hostname (void)
g_assert (s_ip6); g_assert (s_ip6);
g_assert (nm_setting_ip_config_get_dhcp_send_hostname (s_ip4) == TRUE); g_assert (nm_setting_ip_config_get_dhcp_send_hostname (s_ip4) == TRUE);
g_assert_cmpstr (nm_setting_ip_config_get_dhcp_hostname (s_ip4), ==, "svata-pulec"); g_assert_cmpstr (nm_setting_ip_config_get_dhcp_hostname (s_ip4), ==, "svata-pulec");
g_assert_cmpstr (nm_setting_ip_config_get_dhcp_hostname (s_ip6), ==, "svata-pulec"); g_assert_null (nm_setting_ip_config_get_dhcp_hostname (s_ip6));
/* Set dhcp-send-hostname=false dhcp-hostname="kamil-patka" and write the connection. */ /* Set dhcp-send-hostname=false dhcp-hostname="kamil-patka" and write the connection. */
g_object_set (s_ip4, NM_SETTING_IP_CONFIG_DHCP_SEND_HOSTNAME, FALSE, NULL); g_object_set (s_ip4, NM_SETTING_IP_CONFIG_DHCP_SEND_HOSTNAME, FALSE, NULL);
@@ -3916,6 +3916,21 @@ test_read_write_wired_dhcp_send_hostname (void)
g_assert_cmpstr (nm_setting_ip_config_get_dhcp_hostname (s_ip6), ==, dhcp_hostname); g_assert_cmpstr (nm_setting_ip_config_get_dhcp_hostname (s_ip6), ==, dhcp_hostname);
} }
static void
test_read_wired_dhcpv6_hostname_fallback (void)
{
gs_unref_object NMConnection *connection = NULL;
NMSettingIPConfig *s_ip6;
connection = _connection_from_file (TEST_IFCFG_DIR"/network-scripts/ifcfg-test-wired-dhcpv6-hostname-fallback",
NULL, TYPE_ETHERNET, NULL);
s_ip6 = nm_connection_get_setting_ip6_config (connection);
g_assert (s_ip6);
g_assert (nm_setting_ip_config_get_dhcp_send_hostname (s_ip6) == TRUE);
g_assert_cmpstr (nm_setting_ip_config_get_dhcp_hostname (s_ip6), ==, "fully.qualified.domain");
}
static void static void
test_write_wired_static_ip6_only (void) test_write_wired_static_ip6_only (void)
{ {
@@ -8838,6 +8853,7 @@ int main (int argc, char **argv)
g_test_add_func (TPATH "read-dhcp-plus-ip", test_read_wired_dhcp_plus_ip); g_test_add_func (TPATH "read-dhcp-plus-ip", test_read_wired_dhcp_plus_ip);
g_test_add_func (TPATH "read-shared-plus-ip", test_read_wired_shared_plus_ip); g_test_add_func (TPATH "read-shared-plus-ip", test_read_wired_shared_plus_ip);
g_test_add_func (TPATH "read-dhcp-send-hostname", test_read_write_wired_dhcp_send_hostname); g_test_add_func (TPATH "read-dhcp-send-hostname", test_read_write_wired_dhcp_send_hostname);
g_test_add_func (TPATH "read-dhcpv6-hostname-fallback", test_read_wired_dhcpv6_hostname_fallback);
g_test_add_func (TPATH "read-global-gateway", test_read_wired_global_gateway); g_test_add_func (TPATH "read-global-gateway", test_read_wired_global_gateway);
g_test_add_func (TPATH "read-global-gateway-ignore", test_read_wired_global_gateway_ignore); g_test_add_func (TPATH "read-global-gateway-ignore", test_read_wired_global_gateway_ignore);
g_test_add_func (TPATH "read-obsolete-gateway-n", test_read_wired_obsolete_gateway_n); g_test_add_func (TPATH "read-obsolete-gateway-n", test_read_wired_obsolete_gateway_n);