diff options
| author | Michael Biebl <biebl@debian.org> | 2012-03-24 01:37:02 +0100 |
|---|---|---|
| committer | Michael Biebl <biebl@debian.org> | 2012-03-24 01:37:02 +0100 |
| commit | de06e5715e780baade318f3490ac7a4c9ce84e32 (patch) | |
| tree | 23fbc3fafc12072476eff98bee60100eb54c29db /src/settings/plugins/ifupdown | |
| parent | b436a68a20ff3114ded32a7a3d70cdd4954039f9 (diff) | |
Imported Upstream version 0.9.4.0 upstream/0.9.4.0
Diffstat (limited to 'src/settings/plugins/ifupdown')
| -rw-r--r-- | src/settings/plugins/ifupdown/Makefile.in | 9 | ||||
| -rw-r--r-- | src/settings/plugins/ifupdown/interface_parser.c | 13 | ||||
| -rw-r--r-- | src/settings/plugins/ifupdown/interface_parser.h | 3 | ||||
| -rw-r--r-- | src/settings/plugins/ifupdown/parser.c | 315 | ||||
| -rw-r--r-- | src/settings/plugins/ifupdown/plugin.c | 49 | ||||
| -rw-r--r-- | src/settings/plugins/ifupdown/tests/Makefile.am | 2 | ||||
| -rw-r--r-- | src/settings/plugins/ifupdown/tests/Makefile.in | 11 | ||||
| -rw-r--r-- | src/settings/plugins/ifupdown/tests/test-ifupdown.c | 391 | ||||
| -rw-r--r-- | src/settings/plugins/ifupdown/tests/test17-wired-static-verify-ip4 | 5 |
9 files changed, 698 insertions, 100 deletions
diff --git a/src/settings/plugins/ifupdown/Makefile.in b/src/settings/plugins/ifupdown/Makefile.in index 98dded68..f5087648 100644 --- a/src/settings/plugins/ifupdown/Makefile.in +++ b/src/settings/plugins/ifupdown/Makefile.in @@ -217,6 +217,8 @@ GIO_LIBS = @GIO_LIBS@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_GENMARSHAL = @GLIB_GENMARSHAL@ GLIB_LIBS = @GLIB_LIBS@ +GLIB_MAKEFILE = @GLIB_MAKEFILE@ +GLIB_MKENUMS = @GLIB_MKENUMS@ GMODULE_CFLAGS = @GMODULE_CFLAGS@ GMODULE_LIBS = @GMODULE_LIBS@ GMSGFMT = @GMSGFMT@ @@ -271,11 +273,15 @@ LIBNL2_LIBS = @LIBNL2_LIBS@ LIBNL3_CFLAGS = @LIBNL3_CFLAGS@ LIBNL3_LIBS = @LIBNL3_LIBS@ LIBNL_CFLAGS = @LIBNL_CFLAGS@ +LIBNL_GENL3_CFLAGS = @LIBNL_GENL3_CFLAGS@ +LIBNL_GENL3_LIBS = @LIBNL_GENL3_LIBS@ LIBNL_LIBS = @LIBNL_LIBS@ LIBNL_ROUTE3_CFLAGS = @LIBNL_ROUTE3_CFLAGS@ LIBNL_ROUTE3_LIBS = @LIBNL_ROUTE3_LIBS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ +LIBSOUP_CFLAGS = @LIBSOUP_CFLAGS@ +LIBSOUP_LIBS = @LIBSOUP_LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ @@ -286,6 +292,7 @@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ +MOC = @MOC@ MSGFMT = @MSGFMT@ MSGFMT_015 = @MSGFMT_015@ MSGMERGE = @MSGMERGE@ @@ -325,6 +332,8 @@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ +SYSTEMD_CFLAGS = @SYSTEMD_CFLAGS@ +SYSTEMD_LIBS = @SYSTEMD_LIBS@ SYSTEM_CA_PATH = @SYSTEM_CA_PATH@ UDEV_BASE_DIR = @UDEV_BASE_DIR@ USE_NLS = @USE_NLS@ diff --git a/src/settings/plugins/ifupdown/interface_parser.c b/src/settings/plugins/ifupdown/interface_parser.c index b7c64242..38ed1479 100644 --- a/src/settings/plugins/ifupdown/interface_parser.c +++ b/src/settings/plugins/ifupdown/interface_parser.c @@ -294,6 +294,19 @@ const char *ifparser_getkey(if_block* iface, const char *key) return NULL; } +gboolean +ifparser_haskey(if_block* iface, const char *key) +{ + if_data *curr = iface->info; + + while (curr != NULL) { + if (strcmp (curr->key, key) == 0) + return TRUE; + curr = curr->next; + } + return FALSE; +} + int ifparser_get_num_info(if_block* iface) { int i = 0; diff --git a/src/settings/plugins/ifupdown/interface_parser.h b/src/settings/plugins/ifupdown/interface_parser.h index 0c1de23a..e68abcf6 100644 --- a/src/settings/plugins/ifupdown/interface_parser.h +++ b/src/settings/plugins/ifupdown/interface_parser.h @@ -24,6 +24,8 @@ #ifndef _INTERFACE_PARSER_H #define _INTERFACE_PARSER_H +#include <glib.h> + typedef struct _if_data { char *key; @@ -45,6 +47,7 @@ void ifparser_destroy(void); if_block *ifparser_getif(const char* iface); if_block *ifparser_getfirst(void); const char *ifparser_getkey(if_block* iface, const char *key); +gboolean ifparser_haskey(if_block* iface, const char *key); int ifparser_get_num_blocks(void); int ifparser_get_num_info(if_block* iface); diff --git a/src/settings/plugins/ifupdown/parser.c b/src/settings/plugins/ifupdown/parser.c index dc2f8abf..6927f43f 100644 --- a/src/settings/plugins/ifupdown/parser.c +++ b/src/settings/plugins/ifupdown/parser.c @@ -25,6 +25,7 @@ #include <arpa/inet.h> #include <stdlib.h> #include <errno.h> +#include <ctype.h> #include <nm-connection.h> #include <NetworkManager.h> @@ -311,8 +312,7 @@ update_wireless_security_setting_from_if_block(NMConnection *connection, return; } - s_wireless = NM_SETTING_WIRELESS(nm_connection_get_setting(connection, - NM_TYPE_SETTING_WIRELESS)); + s_wireless = nm_connection_get_setting_wireless(connection); g_return_if_fail(s_wireless); PLUGIN_PRINT ("SCPlugin-Ifupdown","update wireless security settings (%s).", block->name); @@ -433,96 +433,263 @@ eni_plugin_error_quark() { return error_quark; } - static void +ifupdown_ip4_add_dns (NMSettingIP4Config *s_ip4, const char *dns) +{ + struct in_addr addr; + char **list, **iter; + + if (dns == NULL) + return; + + list = g_strsplit_set (dns, " \t", -1); + for (iter = list; iter && *iter; iter++) { + g_strstrip (*iter); + if (isblank (*iter[0])) + continue; + if (!inet_pton (AF_INET, *iter, &addr)) { + PLUGIN_WARN ("SCPlugin-Ifupdown", + " warning: ignoring invalid nameserver '%s'", *iter); + continue; + } + + if (!nm_setting_ip4_config_add_dns (s_ip4, addr.s_addr)) { + PLUGIN_WARN ("SCPlugin-Ifupdown", + " warning: duplicate DNS domain '%s'", *iter); + } + } + g_strfreev (list); +} + +static gboolean update_ip4_setting_from_if_block(NMConnection *connection, - if_block *block) + if_block *block, + GError **error) { - NMSettingIP4Config *ip4_setting = NM_SETTING_IP4_CONFIG (nm_setting_ip4_config_new()); + NMSettingIP4Config *s_ip4 = NM_SETTING_IP4_CONFIG (nm_setting_ip4_config_new()); const char *type = ifparser_getkey(block, "inet"); gboolean is_static = type && !strcmp("static", type); - if(!is_static) { - g_object_set(ip4_setting, - NM_SETTING_IP4_CONFIG_METHOD, NM_SETTING_IP4_CONFIG_METHOD_AUTO, - NULL); + if (!is_static) { + g_object_set (s_ip4, NM_SETTING_IP4_CONFIG_METHOD, NM_SETTING_IP4_CONFIG_METHOD_AUTO, NULL); } else { - struct in_addr tmp_ip4_addr; - NMIP4Address *ip4_addr = nm_ip4_address_new (); - - const char *address_v = ifparser_getkey(block, "address"); - const char *netmask_v = ifparser_getkey(block, "netmask"); - const char *gateway_v = ifparser_getkey(block, "gateway"); - const char *nameserver_v = ifparser_getkey(block, "dns-nameserver"); - const char *nameservers_v = ifparser_getkey(block, "dns-nameservers"); - GSList* nameservers_list = NULL; - GSList* nameservers_list_i = NULL; - GError *error = NULL; - - if(nameservers_v) - nameservers_list_i = nameservers_list = string_to_glist_of_strings (nameservers_v); - if(nameserver_v) - nameservers_list_i = nameservers_list = g_slist_append(nameservers_list, g_strdup(nameserver_v)); - - if (!address_v) - address_v = g_strdup ("0.0.0.0"); - - if (inet_pton (AF_INET, address_v, &tmp_ip4_addr)) - nm_ip4_address_set_address (ip4_addr, tmp_ip4_addr.s_addr); - else - g_set_error (&error, eni_plugin_error_quark (), 0, - "Invalid %s IP4 address '%s'", "address", address_v); - if (!netmask_v) - netmask_v = g_strdup( "255.255.255.255"); - - if (inet_pton (AF_INET, netmask_v, &tmp_ip4_addr)) - nm_ip4_address_set_prefix (ip4_addr, nm_utils_ip4_netmask_to_prefix(tmp_ip4_addr.s_addr)); - else - g_set_error (&error, eni_plugin_error_quark (), 0, - "Invalid %s IP4 address '%s'", "netmask", netmask_v); + struct in_addr tmp_addr, tmp_mask, tmp_gw; + NMIP4Address *addr; + const char *address_v; + const char *netmask_v; + const char *gateway_v; + const char *nameserver_v; + const char *nameservers_v; + const char *search_v; + char **list, **iter; + guint32 netmask_int = 32; + + /* Address */ + address_v = ifparser_getkey (block, "address"); + if (!address_v || !inet_pton (AF_INET, address_v, &tmp_addr)) { + g_set_error (error, eni_plugin_error_quark (), 0, + "Missing IPv4 address '%s'", + address_v ? address_v : "(none)"); + goto error; + } + /* mask/prefix */ + netmask_v = ifparser_getkey (block, "netmask"); + if (netmask_v) { + if (!inet_pton (AF_INET, netmask_v, &tmp_mask)) { + g_set_error (error, eni_plugin_error_quark (), 0, + "Invalid IPv4 netmask '%s'", netmask_v); + goto error; + } + netmask_int = nm_utils_ip4_netmask_to_prefix (tmp_mask.s_addr); + } + + /* gateway */ + gateway_v = ifparser_getkey (block, "gateway"); if (!gateway_v) - gateway_v = g_strdup (address_v); + gateway_v = address_v; /* dcbw: whaaa?? */ + if (!inet_pton (AF_INET, gateway_v, &tmp_gw)) { + g_set_error (error, eni_plugin_error_quark (), 0, + "Invalid IPv4 gateway '%s'", gateway_v); + goto error; + } - if (inet_pton (AF_INET, gateway_v, &tmp_ip4_addr)) - nm_ip4_address_set_gateway (ip4_addr, tmp_ip4_addr.s_addr); - else - g_set_error (&error, eni_plugin_error_quark (), 0, - "Invalid %s IP4 address '%s'", "gateway", gateway_v); + /* Add the new address to the setting */ + addr = nm_ip4_address_new (); + nm_ip4_address_set_address (addr, tmp_addr.s_addr); + nm_ip4_address_set_prefix (addr, netmask_int); + nm_ip4_address_set_gateway (addr, tmp_gw.s_addr); - if (nm_setting_ip4_config_add_address (ip4_setting, ip4_addr)) { + if (nm_setting_ip4_config_add_address (s_ip4, addr)) { PLUGIN_PRINT("SCPlugin-Ifupdown", "addresses count: %d", - nm_setting_ip4_config_get_num_addresses (ip4_setting)); + nm_setting_ip4_config_get_num_addresses (s_ip4)); } else { PLUGIN_PRINT("SCPlugin-Ifupdown", "ignoring duplicate IP4 address"); } - while(nameservers_list_i) { - gchar *dns = nameservers_list_i->data; - nameservers_list_i = nameservers_list_i -> next; - if(!dns) - continue; - if (inet_pton (AF_INET, dns, &tmp_ip4_addr)) { - if (!nm_setting_ip4_config_add_dns (ip4_setting, tmp_ip4_addr.s_addr)) - PLUGIN_PRINT("SCPlugin-Ifupdown", "ignoring duplicate DNS server '%s'", dns); - } else - g_set_error (&error, eni_plugin_error_quark (), 0, - "Invalid %s IP4 address nameserver '%s'", "nameserver", dns); + nameserver_v = ifparser_getkey (block, "dns-nameserver"); + ifupdown_ip4_add_dns (s_ip4, nameserver_v); + + nameservers_v = ifparser_getkey (block, "dns-nameservers"); + ifupdown_ip4_add_dns (s_ip4, nameservers_v); + + if (!nm_setting_ip4_config_get_num_dns (s_ip4)) + PLUGIN_PRINT("SCPlugin-Ifupdown", "No dns-nameserver configured in /etc/network/interfaces"); + + /* DNS searches */ + search_v = ifparser_getkey (block, "dns-search"); + if (search_v) { + list = g_strsplit_set (search_v, " \t", -1); + for (iter = list; iter && *iter; iter++) { + g_strstrip (*iter); + if (isblank (*iter[0])) + continue; + if (!nm_setting_ip4_config_add_dns_search (s_ip4, *iter)) { + PLUGIN_WARN ("SCPlugin-Ifupdown", + " warning: duplicate DNS domain '%s'", *iter); + } + } + g_strfreev (list); } - if (!nm_setting_ip4_config_get_num_dns (ip4_setting)) + + g_object_set (s_ip4, NM_SETTING_IP4_CONFIG_METHOD, NM_SETTING_IP4_CONFIG_METHOD_MANUAL, NULL); + } + + nm_connection_add_setting (connection, NM_SETTING (s_ip4)); + return TRUE; + +error: + g_object_unref (s_ip4); + return FALSE; +} + +static void +ifupdown_ip6_add_dns (NMSettingIP6Config *s_ip6, const char *dns) +{ + struct in6_addr addr; + char **list, **iter; + + if (dns == NULL) + return; + + list = g_strsplit_set (dns, " \t", -1); + for (iter = list; iter && *iter; iter++) { + g_strstrip (*iter); + if (isblank (*iter[0])) + continue; + if (!inet_pton (AF_INET6, *iter, &addr)) { + PLUGIN_WARN ("SCPlugin-Ifupdown", + " warning: ignoring invalid nameserver '%s'", *iter); + continue; + } + + if (!nm_setting_ip6_config_add_dns (s_ip6, &addr)) { + PLUGIN_WARN ("SCPlugin-Ifupdown", + " warning: duplicate DNS domain '%s'", *iter); + } + } + g_strfreev (list); +} + +static gboolean +update_ip6_setting_from_if_block(NMConnection *connection, + if_block *block, + GError **error) +{ + NMSettingIP6Config *s_ip6 = NM_SETTING_IP6_CONFIG (nm_setting_ip6_config_new()); + const char *type = ifparser_getkey(block, "inet6"); + gboolean is_static = type && (!strcmp("static", type) || + !strcmp("v4tunnel", type)); + + if (!is_static) { + g_object_set(s_ip6, NM_SETTING_IP6_CONFIG_METHOD, NM_SETTING_IP6_CONFIG_METHOD_AUTO, NULL); + } else { + struct in6_addr tmp_addr, tmp_gw; + NMIP6Address *addr; + const char *address_v; + const char *prefix_v; + const char *gateway_v; + const char *nameserver_v; + const char *nameservers_v; + const char *search_v; + int prefix_int = 128; + char **list, **iter; + + /* Address */ + address_v = ifparser_getkey(block, "address"); + if (!address_v || !inet_pton (AF_INET6, address_v, &tmp_addr)) { + g_set_error (error, eni_plugin_error_quark (), 0, + "Missing IPv6 address '%s'", + address_v ? address_v : "(none)"); + goto error; + } + + /* Prefix */ + prefix_v = ifparser_getkey(block, "netmask"); + if (prefix_v) + prefix_int = g_ascii_strtoll (prefix_v, NULL, 10); + + /* Gateway */ + gateway_v = ifparser_getkey (block, "gateway"); + if (!gateway_v) + gateway_v = address_v; /* dcbw: whaaa?? */ + if (!inet_pton (AF_INET6, gateway_v, &tmp_gw)) { + g_set_error (error, eni_plugin_error_quark (), 0, + "Invalid IPv6 gateway '%s'", gateway_v); + goto error; + } + + /* Add the new address to the setting */ + addr = nm_ip6_address_new (); + nm_ip6_address_set_address (addr, &tmp_addr); + nm_ip6_address_set_prefix (addr, prefix_int); + nm_ip6_address_set_gateway (addr, &tmp_gw); + + if (nm_setting_ip6_config_add_address (s_ip6, addr)) { + PLUGIN_PRINT("SCPlugin-Ifupdown", "addresses count: %d", + nm_setting_ip6_config_get_num_addresses (s_ip6)); + } else { + PLUGIN_PRINT("SCPlugin-Ifupdown", "ignoring duplicate IP6 address"); + } + + nameserver_v = ifparser_getkey(block, "dns-nameserver"); + ifupdown_ip6_add_dns (s_ip6, nameserver_v); + + nameservers_v = ifparser_getkey(block, "dns-nameservers"); + ifupdown_ip6_add_dns (s_ip6, nameservers_v); + + if (!nm_setting_ip6_config_get_num_dns (s_ip6)) PLUGIN_PRINT("SCPlugin-Ifupdown", "No dns-nameserver configured in /etc/network/interfaces"); - g_object_set(ip4_setting, - NM_SETTING_IP4_CONFIG_METHOD, NM_SETTING_IP4_CONFIG_METHOD_MANUAL, - NULL); + /* DNS searches */ + search_v = ifparser_getkey (block, "dns-search"); + if (search_v) { + list = g_strsplit_set (search_v, " \t", -1); + for (iter = list; iter && *iter; iter++) { + g_strstrip (*iter); + if (isblank (*iter[0])) + continue; + if (!nm_setting_ip6_config_add_dns_search (s_ip6, *iter)) { + PLUGIN_WARN ("SCPlugin-Ifupdown", + " warning: duplicate DNS domain '%s'", *iter); + } + } + g_strfreev (list); + } - g_slist_foreach (nameservers_list, (GFunc) g_free, NULL); - g_slist_free (nameservers_list); + g_object_set (s_ip6, + NM_SETTING_IP6_CONFIG_METHOD, NM_SETTING_IP6_CONFIG_METHOD_MANUAL, + NULL); } - nm_connection_add_setting(connection, NM_SETTING(ip4_setting)); + nm_connection_add_setting (connection, NM_SETTING (s_ip6)); + return TRUE; + +error: + g_object_unref (s_ip6); + return FALSE; } gboolean @@ -537,7 +704,7 @@ ifupdown_update_connection_from_if_block (NMConnection *connection, NMSettingConnection *s_con; gboolean success = FALSE; - s_con = (NMSettingConnection *) nm_connection_get_setting (connection, NM_TYPE_SETTING_CONNECTION); + s_con = nm_connection_get_setting_connection (connection); if(!s_con) { s_con = NM_SETTING_CONNECTION (nm_setting_connection_new()); g_assert (s_con); @@ -562,15 +729,19 @@ ifupdown_update_connection_from_if_block (NMConnection *connection, block->name, type, idstr, nm_setting_connection_get_uuid (s_con)); if (!strcmp (NM_SETTING_WIRED_SETTING_NAME, type)) - update_wired_setting_from_if_block (connection, block); + update_wired_setting_from_if_block (connection, block); else if (!strcmp (NM_SETTING_WIRELESS_SETTING_NAME, type)) { update_wireless_setting_from_if_block (connection, block); update_wireless_security_setting_from_if_block (connection, block); } - update_ip4_setting_from_if_block (connection, block); + if (ifparser_haskey(block, "inet6")) + success = update_ip6_setting_from_if_block (connection, block, error); + else + success = update_ip4_setting_from_if_block (connection, block, error); - success = nm_connection_verify (connection, error); + if (success == TRUE) + success = nm_connection_verify (connection, error); g_free (idstr); return success; diff --git a/src/settings/plugins/ifupdown/plugin.c b/src/settings/plugins/ifupdown/plugin.c index 9679edea..4dbb0aa2 100644 --- a/src/settings/plugins/ifupdown/plugin.c +++ b/src/settings/plugins/ifupdown/plugin.c @@ -19,7 +19,7 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * (C) Copyright 2007,2008 Canonical Ltd. - * (C) Copyright 2009 Red Hat, Inc. + * (C) Copyright 2009 - 2011 Red Hat, Inc. */ #include <string.h> @@ -42,6 +42,7 @@ #include "nm-setting-wireless.h" #include "nm-setting-wired.h" #include "nm-setting-ppp.h" +#include "nm-utils.h" #include "nm-ifupdown-connection.h" #include "plugin.h" @@ -60,9 +61,6 @@ #define IFUPDOWN_PLUGIN_INFO "(C) 2008 Canonical Ltd. To report bugs please use the NetworkManager mailing list." #define IFUPDOWN_SYSTEM_HOSTNAME_FILE "/etc/hostname" -#define IFUPDOWN_SYSTEM_SETTINGS_KEY_FILE SYSCONFDIR "/NetworkManager/NetworkManager.conf" -#define IFUPDOWN_OLD_SYSTEM_SETTINGS_KEY_FILE SYSCONFDIR "/NetworkManager/nm-system-settings.conf" - #define IFUPDOWN_KEY_FILE_GROUP "ifupdown" #define IFUPDOWN_KEY_FILE_KEY_MANAGED "managed" #define IFUPDOWN_UNMANAGE_WELL_KNOWN_DEFAULT TRUE @@ -81,7 +79,7 @@ typedef struct { GHashTable *well_known_interfaces; GHashTable *well_known_ifaces; gboolean unmanage_well_known; - const char *conf_file; + char *conf_file; gulong inotify_event_id; int inotify_system_hostname_wd; @@ -190,10 +188,9 @@ bind_device_to_connection (SCPluginIfupdown *self, NMIfupdownConnection *exported) { GByteArray *mac_address; - NMSetting *s_wired = NULL; - NMSetting *s_wifi = NULL; + NMSettingWired *s_wired; + NMSettingWireless *s_wifi; const char *iface, *address; - struct ether_addr *tmp_mac; iface = g_udev_device_get_name (device); if (!iface) { @@ -207,18 +204,15 @@ bind_device_to_connection (SCPluginIfupdown *self, return; } - tmp_mac = ether_aton (address); - if (!tmp_mac) { + mac_address = nm_utils_hwaddr_atoba (address, ARPHRD_ETHER); + if (!mac_address) { PLUGIN_WARN ("SCPluginIfupdown", "failed to parse MAC address '%s' for %s", address, iface); return; } - mac_address = g_byte_array_sized_new (ETH_ALEN); - g_byte_array_append (mac_address, &(tmp_mac->ether_addr_octet[0]), ETH_ALEN); - - s_wired = nm_connection_get_setting (NM_CONNECTION (exported), NM_TYPE_SETTING_WIRED); - s_wifi = nm_connection_get_setting (NM_CONNECTION (exported), NM_TYPE_SETTING_WIRELESS); + s_wired = nm_connection_get_setting_wired (NM_CONNECTION (exported)); + s_wifi = nm_connection_get_setting_wireless (NM_CONNECTION (exported)); if (s_wired) { PLUGIN_PRINT ("SCPluginIfupdown", "locking wired connection setting"); g_object_set (s_wired, NM_SETTING_WIRED_MAC_ADDRESS, mac_address, NULL); @@ -432,13 +426,13 @@ SCPluginIfupdown_init (NMSystemConfigInterface *config) keys = g_hash_table_get_keys (priv->iface_connections); for (iter = keys; iter; iter = g_list_next (iter)) { NMIfupdownConnection *exported; - NMSetting *setting; + NMSettingConnection *setting; if (!g_hash_table_lookup (auto_ifaces, iter->data)) continue; exported = g_hash_table_lookup (priv->iface_connections, iter->data); - setting = NM_SETTING (nm_connection_get_setting (NM_CONNECTION (exported), NM_TYPE_SETTING_CONNECTION)); + setting = nm_connection_get_setting_connection (NM_CONNECTION (exported)); g_object_set (setting, NM_SETTING_CONNECTION_AUTOCONNECT, TRUE, NULL); nm_settings_connection_commit_changes (NM_SETTINGS_CONNECTION (exported), ignore_cb, NULL); @@ -448,12 +442,7 @@ SCPluginIfupdown_init (NMSystemConfigInterface *config) g_list_free (keys); g_hash_table_destroy (auto_ifaces); - /* Find the config file */ - if (g_file_test (IFUPDOWN_SYSTEM_SETTINGS_KEY_FILE, G_FILE_TEST_EXISTS)) - priv->conf_file = IFUPDOWN_SYSTEM_SETTINGS_KEY_FILE; - else - priv->conf_file = IFUPDOWN_OLD_SYSTEM_SETTINGS_KEY_FILE; - + /* Read the config file to find out whether to manage interfaces */ keyfile = g_key_file_new (); if (!g_key_file_load_from_file (keyfile, priv->conf_file, @@ -706,20 +695,28 @@ GObject__dispose (GObject *object) if (priv->well_known_interfaces) g_hash_table_destroy(priv->well_known_interfaces); + g_free (priv->conf_file); + if (priv->client) g_object_unref (priv->client); + G_OBJECT_CLASS (sc_plugin_ifupdown_parent_class)->dispose (object); } G_MODULE_EXPORT GObject * -nm_system_config_factory (void) +nm_system_config_factory (const char *config_file) { static SCPluginIfupdown *singleton = NULL; + SCPluginIfupdownPrivate *priv; - if (!singleton) + if (!singleton) { singleton = SC_PLUGIN_IFUPDOWN (g_object_new (SC_TYPE_PLUGIN_IFUPDOWN, NULL)); - else + if (singleton) { + priv = SC_PLUGIN_IFUPDOWN_GET_PRIVATE (singleton); + priv->conf_file = strdup (config_file); + } + } else g_object_ref (singleton); return G_OBJECT (singleton); diff --git a/src/settings/plugins/ifupdown/tests/Makefile.am b/src/settings/plugins/ifupdown/tests/Makefile.am index aed86197..ff219d5d 100644 --- a/src/settings/plugins/ifupdown/tests/Makefile.am +++ b/src/settings/plugins/ifupdown/tests/Makefile.am @@ -29,4 +29,4 @@ endif EXTRA_DIST = \ test1 test2 test3 test4 test5 test6 test7 test8 test9 test11 test12 \ - test13 test14 test15 test16 + test13 test14 test15 test16 test17-wired-static-verify-ip4 diff --git a/src/settings/plugins/ifupdown/tests/Makefile.in b/src/settings/plugins/ifupdown/tests/Makefile.in index aca48837..a03be1bd 100644 --- a/src/settings/plugins/ifupdown/tests/Makefile.in +++ b/src/settings/plugins/ifupdown/tests/Makefile.in @@ -141,6 +141,8 @@ GIO_LIBS = @GIO_LIBS@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_GENMARSHAL = @GLIB_GENMARSHAL@ GLIB_LIBS = @GLIB_LIBS@ +GLIB_MAKEFILE = @GLIB_MAKEFILE@ +GLIB_MKENUMS = @GLIB_MKENUMS@ GMODULE_CFLAGS = @GMODULE_CFLAGS@ GMODULE_LIBS = @GMODULE_LIBS@ GMSGFMT = @GMSGFMT@ @@ -195,11 +197,15 @@ LIBNL2_LIBS = @LIBNL2_LIBS@ LIBNL3_CFLAGS = @LIBNL3_CFLAGS@ LIBNL3_LIBS = @LIBNL3_LIBS@ LIBNL_CFLAGS = @LIBNL_CFLAGS@ +LIBNL_GENL3_CFLAGS = @LIBNL_GENL3_CFLAGS@ +LIBNL_GENL3_LIBS = @LIBNL_GENL3_LIBS@ LIBNL_LIBS = @LIBNL_LIBS@ LIBNL_ROUTE3_CFLAGS = @LIBNL_ROUTE3_CFLAGS@ LIBNL_ROUTE3_LIBS = @LIBNL_ROUTE3_LIBS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ +LIBSOUP_CFLAGS = @LIBSOUP_CFLAGS@ +LIBSOUP_LIBS = @LIBSOUP_LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ @@ -210,6 +216,7 @@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ +MOC = @MOC@ MSGFMT = @MSGFMT@ MSGFMT_015 = @MSGFMT_015@ MSGMERGE = @MSGMERGE@ @@ -249,6 +256,8 @@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ +SYSTEMD_CFLAGS = @SYSTEMD_CFLAGS@ +SYSTEMD_LIBS = @SYSTEMD_LIBS@ SYSTEM_CA_PATH = @SYSTEM_CA_PATH@ UDEV_BASE_DIR = @UDEV_BASE_DIR@ USE_NLS = @USE_NLS@ @@ -334,7 +343,7 @@ test_ifupdown_LDADD = \ EXTRA_DIST = \ test1 test2 test3 test4 test5 test6 test7 test8 test9 test11 test12 \ - test13 test14 test15 test16 + test13 test14 test15 test16 test17-wired-static-verify-ip4 all: all-am diff --git a/src/settings/plugins/ifupdown/tests/test-ifupdown.c b/src/settings/plugins/ifupdown/tests/test-ifupdown.c index 16465364..01020bdf 100644 --- a/src/settings/plugins/ifupdown/tests/test-ifupdown.c +++ b/src/settings/plugins/ifupdown/tests/test-ifupdown.c @@ -21,6 +21,9 @@ #include <glib.h> #include <string.h> +#include <nm-utils.h> + +#include "nm-test-helpers.h" #include "interface_parser.h" #include "parser.h" @@ -455,6 +458,386 @@ test16_missing_newline (const char *path) ifparser_destroy (); expected_free (e); } +static void +test17_read_static_ipv4 (const char *path) +{ + NMConnection *connection; + NMSettingConnection *s_con; + NMSettingIP4Config *s_ip4; + NMSettingWired *s_wired; + char *unmanaged = NULL; + GError *error = NULL; + const char* tmp; + const char *expected_address = "10.0.0.3"; + const char *expected_id = "Ifupdown (eth0)"; + const char *expected_dns1 = "10.0.0.1"; + const char *expected_dns2 = "10.0.0.2"; + const char *expected_search1 = "example.com"; + const char *expected_search2 = "foo.example.com"; + guint32 expected_prefix = 8; + NMIP4Address *ip4_addr; + struct in_addr addr; +#define TEST17_NAME "wired-static-verify-ip4" + if_block *block = NULL; + + const char* file = "test17-" TEST17_NAME; + + init_ifparser_with_file (path, file); + block = ifparser_getfirst (); + connection = nm_connection_new(); + ifupdown_update_connection_from_if_block(connection, block, &error); + + ASSERT (connection != NULL, + TEST17_NAME, "failed to read %s: %s", file, error->message); + + ASSERT (nm_connection_verify (connection, &error), + TEST17_NAME, "failed to verify %s: %s", file, error->message); + + ASSERT (unmanaged == NULL, + TEST17_NAME, "failed to verify %s: unexpected unmanaged value", file); + + /* ===== CONNECTION SETTING ===== */ + + s_con = nm_connection_get_setting_connection (connection); + ASSERT (s_con != NULL, + TEST17_NAME, "failed to verify %s: missing %s setting", + file, + NM_SETTING_CONNECTION_SETTING_NAME); + + /* ID */ + tmp = nm_setting_connection_get_id (s_con); + ASSERT (tmp != NULL, + TEST17_NAME, "failed to verify %s: missing %s / %s key", + file, + NM_SETTING_CONNECTION_SETTING_NAME, + NM_SETTING_CONNECTION_ID); + ASSERT (strcmp (tmp, expected_id) == 0, + TEST17_NAME, "failed to verify %s: unexpected %s / %s key value: %s", + file, + NM_SETTING_CONNECTION_SETTING_NAME, + NM_SETTING_CONNECTION_ID, tmp); + + /* ===== WIRED SETTING ===== */ + + s_wired = nm_connection_get_setting_wired (connection); + ASSERT (s_wired != NULL, + TEST17_NAME, "failed to verify %s: missing %s setting", + file, + NM_SETTING_WIRED_SETTING_NAME); + + /* ===== IPv4 SETTING ===== */ + + ASSERT (inet_pton (AF_INET, expected_address, &addr) > 0, + TEST17_NAME, "failed to verify %s: couldn't convert IP address #1", + file); + + s_ip4 = nm_connection_get_setting_ip4_config (connection); + ASSERT (s_ip4 != NULL, + TEST17_NAME, "failed to verify %s: missing %s setting", + file, + NM_SETTING_IP4_CONFIG_SETTING_NAME); + + /* Method */ + tmp = nm_setting_ip4_config_get_method (s_ip4); + ASSERT (strcmp (tmp, NM_SETTING_IP4_CONFIG_METHOD_MANUAL) == 0, + TEST17_NAME, "failed to verify %s: unexpected %s / %s key value", + file, + NM_SETTING_IP4_CONFIG_SETTING_NAME, + NM_SETTING_IP4_CONFIG_METHOD); + + /* IP addresses */ + ASSERT (nm_setting_ip4_config_get_num_addresses (s_ip4) == 1, + TEST17_NAME, "failed to verify %s: unexpected %s / %s key value", + file, + NM_SETTING_IP4_CONFIG_SETTING_NAME, + NM_SETTING_IP4_CONFIG_ADDRESSES); + + ip4_addr = nm_setting_ip4_config_get_address (s_ip4, 0); + ASSERT (ip4_addr, + TEST17_NAME, "failed to verify %s: missing IP4 address #1", + file); + + ASSERT (nm_ip4_address_get_prefix (ip4_addr) == expected_prefix, + TEST17_NAME, "failed to verify %s: unexpected IP4 address prefix", + file); + + ASSERT (nm_ip4_address_get_address (ip4_addr) == addr.s_addr, + TEST17_NAME, "failed to verify %s: unexpected IP4 address: %s", + file, addr.s_addr); + + /* DNS Addresses */ + ASSERT (nm_setting_ip4_config_get_num_dns (s_ip4) == 2, + TEST17_NAME, "failed to verify %s: unexpected %s / %s key value", + file, + NM_SETTING_IP4_CONFIG_SETTING_NAME, + NM_SETTING_IP4_CONFIG_DNS); + + ASSERT (inet_pton (AF_INET, expected_dns1, &addr) > 0, + TEST17_NAME, "failed to verify %s: couldn't convert DNS IP address #1", + file, + NM_SETTING_IP4_CONFIG_SETTING_NAME, + NM_SETTING_IP4_CONFIG_DNS); + + ASSERT (nm_setting_ip4_config_get_dns (s_ip4, 0) == addr.s_addr, + TEST17_NAME, "failed to verify %s: unexpected %s / %s key value #1", + file, + NM_SETTING_IP4_CONFIG_SETTING_NAME, + NM_SETTING_IP4_CONFIG_DNS); + + ASSERT (inet_pton (AF_INET, expected_dns2, &addr) > 0, + TEST17_NAME, "failed to verify %s: couldn't convert DNS IP address #2", + file, + NM_SETTING_IP4_CONFIG_SETTING_NAME, + NM_SETTING_IP4_CONFIG_DNS); + + ASSERT (nm_setting_ip4_config_get_dns (s_ip4, 1) == addr.s_addr, + TEST17_NAME, "failed to verify %s: unexpected %s / %s key value #2", + file, + NM_SETTING_IP4_CONFIG_SETTING_NAME, + NM_SETTING_IP4_CONFIG_DNS); + + ASSERT (nm_setting_ip4_config_get_num_addresses (s_ip4) == 1, + TEST17_NAME, "failed to verify %s: unexpected %s / %s key value", + file, + NM_SETTING_IP4_CONFIG_SETTING_NAME, + NM_SETTING_IP4_CONFIG_DNS); + + /* DNS search domains */ + ASSERT (nm_setting_ip4_config_get_num_dns_searches (s_ip4) == 2, + TEST17_NAME, "failed to verify %s: unexpected %s / %s key value", + file, + NM_SETTING_IP4_CONFIG_SETTING_NAME, + NM_SETTING_IP4_CONFIG_DNS); + + tmp = nm_setting_ip4_config_get_dns_search (s_ip4, 0); + ASSERT (tmp != NULL, + TEST17_NAME, "failed to verify %s: missing %s / %s key", + file, + NM_SETTING_IP4_CONFIG_SETTING_NAME, + NM_SETTING_IP4_CONFIG_DNS_SEARCH); + ASSERT (strcmp (tmp, expected_search1) == 0, + TEST17_NAME, "failed to verify %s: unexpected %s / %s key value", + file, + NM_SETTING_IP4_CONFIG_SETTING_NAME, + NM_SETTING_IP4_CONFIG_DNS_SEARCH); + + tmp = nm_setting_ip4_config_get_dns_search (s_ip4, 1); + ASSERT (tmp != NULL, + TEST17_NAME, "failed to verify %s: missing %s / %s key", + file, + NM_SETTING_IP4_CONFIG_SETTING_NAME, + NM_SETTING_IP4_CONFIG_DNS_SEARCH); + + ASSERT (strcmp (tmp, expected_search2) == 0, + TEST17_NAME, "failed to verify %s: unexpected %s / %s key value", + file, + NM_SETTING_IP4_CONFIG_SETTING_NAME, + NM_SETTING_IP4_CONFIG_DNS_SEARCH); + + g_object_unref (connection); +} + +static void +test18_read_static_ipv6 (const char *path) +{ + NMConnection *connection; + NMSettingConnection *s_con; + NMSettingIP6Config *s_ip6; + NMSettingWired *s_wired; + char *unmanaged = NULL; + GError *error = NULL; + const char* tmp; + const char *expected_address = "fc00::1"; + const char *expected_id = "Ifupdown (myip6tunnel)"; + const char *expected_dns1 = "fc00::2"; + const char *expected_dns2 = "fc00::3"; + const char *expected_search1 = "example.com"; + const char *expected_search2 = "foo.example.com"; + guint32 expected_prefix = 64; + NMIP6Address *ip6_addr; + struct in6_addr addr; + if_block *block = NULL; +#define TEST18_NAME "wired-static-verify-ip6" + const char* file = "test18-" TEST18_NAME; + + init_ifparser_with_file (path, file); + block = ifparser_getfirst (); + connection = nm_connection_new(); + ifupdown_update_connection_from_if_block(connection, block, &error); + + ASSERT (connection != NULL, + TEST18_NAME + "failed to read %s: %s", file, error->message); + + ASSERT (nm_connection_verify (connection, &error), + TEST18_NAME, + "failed to verify %s: %s", file, error->message); + + ASSERT (unmanaged == NULL, + TEST18_NAME, + "failed to verify %s: unexpected unmanaged value", file); + + /* ===== CONNECTION SETTING ===== */ + + s_con = nm_connection_get_setting_connection (connection); + ASSERT (s_con != NULL, + TEST18_NAME, "failed to verify %s: missing %s setting", + file, + NM_SETTING_CONNECTION_SETTING_NAME); + + /* ID */ + tmp = nm_setting_connection_get_id (s_con); + ASSERT (tmp != NULL, + TEST18_NAME, + "failed to verify %s: missing %s / %s key", + file, + NM_SETTING_CONNECTION_SETTING_NAME, + NM_SETTING_CONNECTION_ID); + + ASSERT (strcmp (tmp, expected_id) == 0, + TEST18_NAME, + "failed to verify %s: unexpected %s / %s key value", + file, + NM_SETTING_CONNECTION_SETTING_NAME, + NM_SETTING_CONNECTION_ID); + + /* ===== WIRED SETTING ===== */ + + s_wired = nm_connection_get_setting_wired (connection); + ASSERT (s_wired != NULL, + TEST18_NAME, "failed to verify %s: missing %s setting", + file, + NM_SETTING_WIRED_SETTING_NAME); + + /* ===== IPv6 SETTING ===== */ + + ASSERT (inet_pton (AF_INET6, expected_address, &addr) > 0, + TEST18_NAME, + "failed to verify %s: couldn't convert IP address #1", + file); + + s_ip6 = nm_connection_get_setting_ip6_config (connection); + ASSERT (s_ip6 != NULL, + TEST18_NAME, + "failed to verify %s: missing %s setting", + file, + NM_SETTING_IP6_CONFIG_SETTING_NAME); + + /* Method */ + tmp = nm_setting_ip6_config_get_method (s_ip6); + ASSERT (strcmp (tmp, NM_SETTING_IP6_CONFIG_METHOD_MANUAL) == 0, + TEST18_NAME, + "failed to verify %s: unexpected %s / %s key value", + file, + NM_SETTING_IP6_CONFIG_SETTING_NAME, + NM_SETTING_IP6_CONFIG_METHOD); + + /* IP addresses */ + ASSERT (nm_setting_ip6_config_get_num_addresses (s_ip6) == 1, + TEST18_NAME, + "failed to verify %s: unexpected number of %s / %s", + file, + NM_SETTING_IP6_CONFIG_SETTING_NAME, + NM_SETTING_IP6_CONFIG_ADDRESSES); + + ip6_addr = nm_setting_ip6_config_get_address (s_ip6, 0); + ASSERT (ip6_addr, + TEST18_NAME, + "failed to verify %s: missing %s / %s #1", + file, + NM_SETTING_IP6_CONFIG_SETTING_NAME, + NM_SETTING_IP6_CONFIG_ADDRESSES); + + ASSERT (nm_ip6_address_get_prefix (ip6_addr) == expected_prefix, + TEST18_NAME + "failed to verify %s: unexpected %s / %s prefix", + file, + NM_SETTING_IP6_CONFIG_SETTING_NAME, + NM_SETTING_IP6_CONFIG_ADDRESSES); + + ASSERT (IN6_ARE_ADDR_EQUAL (nm_ip6_address_get_address (ip6_addr), + &addr), + TEST18_NAME, + "failed to verify %s: unexpected %s / %s", + file, + NM_SETTING_IP6_CONFIG_SETTING_NAME, + NM_SETTING_IP6_CONFIG_ADDRESSES); + + /* DNS Addresses */ + ASSERT (nm_setting_ip6_config_get_num_dns (s_ip6) == 2, + TEST18_NAME, + "failed to verify %s: unexpected number of %s / %s values", + file, + NM_SETTING_IP6_CONFIG_SETTING_NAME, + NM_SETTING_IP6_CONFIG_DNS); + + ASSERT (inet_pton (AF_INET6, expected_dns1, &addr) > 0, + TEST18_NAME, + "failed to verify %s: couldn't convert DNS IP address #1", + file); + + ASSERT (IN6_ARE_ADDR_EQUAL (nm_setting_ip6_config_get_dns (s_ip6, 0), + &addr), + TEST18_NAME, + "failed to verify %s: unexpected %s / %s #1", + file, + NM_SETTING_IP6_CONFIG_SETTING_NAME, + NM_SETTING_IP6_CONFIG_DNS); + + ASSERT (inet_pton (AF_INET6, expected_dns2, &addr) > 0, + TEST18_NAME, + "failed to verify %s: couldn't convert DNS IP address #2", + file); + + ASSERT (IN6_ARE_ADDR_EQUAL (nm_setting_ip6_config_get_dns (s_ip6, 1), + &addr), + TEST18_NAME, "failed to verify %s: unexpected %s / %s #2", + file, + NM_SETTING_IP6_CONFIG_SETTING_NAME, + NM_SETTING_IP6_CONFIG_DNS); + + /* DNS search domains */ + ASSERT (nm_setting_ip6_config_get_num_dns_searches (s_ip6) == 2, + TEST18_NAME, + "failed to verify %s: unexpected number of %s / %s values", + file, + NM_SETTING_IP6_CONFIG_SETTING_NAME, + NM_SETTING_IP6_CONFIG_DNS_SEARCH); + + tmp = nm_setting_ip6_config_get_dns_search (s_ip6, 0); + ASSERT (tmp != NULL, + "wired-ipv6-manual-verify-ip6", + "failed to verify %s: missing %s / %s #1", + file, + NM_SETTING_IP6_CONFIG_SETTING_NAME, + NM_SETTING_IP6_CONFIG_DNS_SEARCH); + + ASSERT (strcmp (tmp, expected_search1) == 0, + "wired-ipv6-manual-verify-ip6", + "failed to verify %s: unexpected %s / %s #1", + file, + NM_SETTING_IP6_CONFIG_SETTING_NAME, + NM_SETTING_IP6_CONFIG_DNS_SEARCH); + + tmp = nm_setting_ip6_config_get_dns_search (s_ip6, 1); + ASSERT (tmp != NULL, + TEST18_NAME, + "failed to verify %s: missing %s / %s #2", + file, + NM_SETTING_IP6_CONFIG_SETTING_NAME, + NM_SETTING_IP6_CONFIG_DNS_SEARCH); + + ASSERT (strcmp (tmp, expected_search2) == 0, + TEST18_NAME, + "failed to verify %s: unexpected %s / %s #2", + file, + NM_SETTING_IP6_CONFIG_SETTING_NAME, + NM_SETTING_IP6_CONFIG_DNS_SEARCH); + + g_free (unmanaged); + g_object_unref (connection); +} + #if GLIB_CHECK_VERSION(2,25,12) typedef GTestFixtureFunc TCFunc; @@ -467,6 +850,12 @@ typedef void (*TCFunc)(void); int main (int argc, char **argv) { GTestSuite *suite; + GError *error = NULL; + + g_type_init (); + + if (!nm_utils_init (&error)) + FAIL ("nm-utils-init", "failed to initialize libnm-util: %s", error->message); g_test_init (&argc, &argv, NULL); @@ -490,6 +879,8 @@ int main (int argc, char **argv) g_test_suite_add (suite, TESTCASE (test14_mixed_whitespace_block_start, TEST_ENI_DIR)); g_test_suite_add (suite, TESTCASE (test15_trailing_space, TEST_ENI_DIR)); g_test_suite_add (suite, TESTCASE (test16_missing_newline, TEST_ENI_DIR)); + g_test_suite_add (suite, TESTCASE (test17_read_static_ipv4, TEST_ENI_DIR)); + g_test_suite_add (suite, TESTCASE (test18_read_static_ipv6, TEST_ENI_DIR)); return g_test_run (); } diff --git a/src/settings/plugins/ifupdown/tests/test17-wired-static-verify-ip4 b/src/settings/plugins/ifupdown/tests/test17-wired-static-verify-ip4 new file mode 100644 index 00000000..9e5243a7 --- /dev/null +++ b/src/settings/plugins/ifupdown/tests/test17-wired-static-verify-ip4 @@ -0,0 +1,5 @@ +iface eth0 inet static + address 10.0.0.3 + netmask 255.0.0.0 + dns-search example.com foo.example.com + dns-nameservers 10.0.0.1 10.0.0.2 |