diff options
author | Thomas Haller <thaller@redhat.com> | 2016-05-30 16:43:39 +0200 |
---|---|---|
committer | Thomas Haller <thaller@redhat.com> | 2016-06-01 13:13:13 +0200 |
commit | 06d19ff6765d9db3727adcc29a291739402911f4 (patch) | |
tree | 6f1c9d324a9dacbb3ee55e2384e5b2eddd649e4c | |
parent | 3d4b91598b95d2c98918d6533188c753f1a5803f (diff) | |
download | NetworkManager-06d19ff6765d9db3727adcc29a291739402911f4.tar.gz |
config,dns: support Reload flags to specify that only parts should be reloaded
Support 3 new flags for Reload:
- 0x01 (CONF): reload the configuration from disk
- 0x02 (DNS_RC): write DNS configuration to resolv.conf
- 0x04 (DNS_FULL): restart DNS plugin
Omitting all flags is the same as reloading everything, thus SIGHUP.
-rw-r--r-- | src/dns-manager/nm-dns-manager.c | 8 | ||||
-rw-r--r-- | src/nm-config-data.h | 37 | ||||
-rw-r--r-- | src/nm-config.c | 10 | ||||
-rw-r--r-- | src/nm-manager.c | 27 |
4 files changed, 65 insertions, 17 deletions
diff --git a/src/dns-manager/nm-dns-manager.c b/src/dns-manager/nm-dns-manager.c index b753954823..114b33d6c0 100644 --- a/src/dns-manager/nm-dns-manager.c +++ b/src/dns-manager/nm-dns-manager.c @@ -1610,17 +1610,21 @@ config_changed_cb (NMConfig *config, if (NM_FLAGS_ANY (changes, NM_CONFIG_CHANGE_DNS_MODE | NM_CONFIG_CHANGE_RC_MANAGER | - NM_CONFIG_CHANGE_CAUSE_SIGHUP)) { + NM_CONFIG_CHANGE_CAUSE_SIGHUP | + NM_CONFIG_CHANGE_CAUSE_DNS_FULL)) { /* reload the resolv-conf mode also on SIGHUP (when DNS_MODE didn't change). * The reason is, that the configuration also depends on whether resolv.conf * is immutable, thus, without the configuration changing, we always want to * re-configure the mode. */ init_resolv_conf_mode (self, - NM_FLAGS_HAS (changes, NM_CONFIG_CHANGE_CAUSE_SIGHUP)); + NM_FLAGS_ANY (changes, NM_CONFIG_CHANGE_CAUSE_SIGHUP + | NM_CONFIG_CHANGE_CAUSE_DNS_FULL)); } if (NM_FLAGS_ANY (changes, NM_CONFIG_CHANGE_CAUSE_SIGHUP | NM_CONFIG_CHANGE_CAUSE_SIGUSR1 | + NM_CONFIG_CHANGE_CAUSE_DNS_RC | + NM_CONFIG_CHANGE_CAUSE_DNS_FULL | NM_CONFIG_CHANGE_DNS_MODE | NM_CONFIG_CHANGE_RC_MANAGER | NM_CONFIG_CHANGE_GLOBAL_DNS_CONFIG)) { diff --git a/src/nm-config-data.h b/src/nm-config-data.h index 4fe07eb4b8..4ea6795240 100644 --- a/src/nm-config-data.h +++ b/src/nm-config-data.h @@ -44,7 +44,26 @@ G_BEGIN_DECLS #define NM_CONFIG_DATA_NO_AUTO_DEFAULT "no-auto-default" #define NM_CONFIG_DATA_DNS_MODE "dns" -typedef enum { /*<flags >*/ +/* The flags for Reload. Currently these are internal defines, + * only their numeric value matters and must be stable as + * they are public API! Also, the enum must fit in uint32. */ +enum { /*< skip >*/ + NM_MANAGER_RELOAD_FLAGS_NONE = 0, + + /* reload the configuration from disk */ + NM_MANAGER_RELOAD_FLAGS_CONF = (1LL << 0), + + /* write DNS configuration to resolv.conf */ + NM_MANAGER_RELOAD_FLAGS_DNS_RC = (1LL << 1), + + /* restart the DNS plugin (includes DNS_RC) */ + NM_MANAGER_RELOAD_FLAGS_DNS_FULL = (1LL << 2), + + _NM_MANAGER_RELOAD_FLAGS_ALL, + NM_MANAGER_RELOAD_FLAGS_ALL = ((_NM_MANAGER_RELOAD_FLAGS_ALL - 1) << 1) - 1, +}; + +typedef enum { /*< flags >*/ NM_CONFIG_GET_VALUE_NONE = 0, /* use g_key_file_get_value() instead of g_key_file_get_string(). */ @@ -68,13 +87,17 @@ typedef enum { /*< flags >*/ * The external cause which triggered the reload/configuration-change *************************************************************************/ - NM_CONFIG_CHANGE_CAUSE_SIGHUP = (1L << 0), - NM_CONFIG_CHANGE_CAUSE_SIGUSR1 = (1L << 1), - NM_CONFIG_CHANGE_CAUSE_SIGUSR2 = (1L << 2), - NM_CONFIG_CHANGE_CAUSE_NO_AUTO_DEFAULT = (1L << 3), - NM_CONFIG_CHANGE_CAUSE_SET_VALUES = (1L << 4), + NM_CONFIG_CHANGE_CAUSE_CONF = NM_MANAGER_RELOAD_FLAGS_CONF, + NM_CONFIG_CHANGE_CAUSE_DNS_RC = NM_MANAGER_RELOAD_FLAGS_DNS_RC, + NM_CONFIG_CHANGE_CAUSE_DNS_FULL = NM_MANAGER_RELOAD_FLAGS_DNS_FULL, + + NM_CONFIG_CHANGE_CAUSE_SIGHUP = (1L << 3), + NM_CONFIG_CHANGE_CAUSE_SIGUSR1 = (1L << 4), + NM_CONFIG_CHANGE_CAUSE_SIGUSR2 = (1L << 5), + NM_CONFIG_CHANGE_CAUSE_NO_AUTO_DEFAULT = (1L << 6), + NM_CONFIG_CHANGE_CAUSE_SET_VALUES = (1L << 7), - NM_CONFIG_CHANGE_CAUSES = ((1L << 5) - 1), + NM_CONFIG_CHANGE_CAUSES = ((1L << 8) - 1), /************************************************************************** * Following flags describe which property of the configuration changed: diff --git a/src/nm-config.c b/src/nm-config.c index 36380652b3..73c5d73ea2 100644 --- a/src/nm-config.c +++ b/src/nm-config.c @@ -1884,7 +1884,7 @@ nm_config_reload (NMConfig *self, NMConfigChangeFlags reload_flags) priv = NM_CONFIG_GET_PRIVATE (self); - if (reload_flags != NM_CONFIG_CHANGE_CAUSE_SIGHUP) { + if (!NM_FLAGS_ANY (reload_flags, NM_CONFIG_CHANGE_CAUSE_SIGHUP | NM_CONFIG_CHANGE_CAUSE_CONF)) { /* unless SIGHUP is specified, we don't reload the configuration from disc. */ _set_config_data (self, NULL, reload_flags); return; @@ -1930,6 +1930,9 @@ nm_config_reload (NMConfig *self, NMConfigChangeFlags reload_flags) NM_UTILS_FLAGS2STR_DEFINE (nm_config_change_flags_to_string, NMConfigChangeFlags, + NM_UTILS_FLAGS2STR (NM_CONFIG_CHANGE_CAUSE_CONF, "CONF"), + NM_UTILS_FLAGS2STR (NM_CONFIG_CHANGE_CAUSE_DNS_RC, "DNS_RC"), + NM_UTILS_FLAGS2STR (NM_CONFIG_CHANGE_CAUSE_DNS_FULL, "DNS_FULL"), NM_UTILS_FLAGS2STR (NM_CONFIG_CHANGE_CAUSE_SIGHUP, "SIGHUP"), NM_UTILS_FLAGS2STR (NM_CONFIG_CHANGE_CAUSE_SIGUSR1, "SIGUSR1"), NM_UTILS_FLAGS2STR (NM_CONFIG_CHANGE_CAUSE_SIGUSR2, "SIGUSR2"), @@ -1970,7 +1973,10 @@ _set_config_data (NMConfig *self, NMConfigData *new_data, NMConfigChangeFlags re changes |= changes_diff; } - if ( NM_IN_SET (reload_flags, NM_CONFIG_CHANGE_CAUSE_NO_AUTO_DEFAULT, NM_CONFIG_CHANGE_CAUSE_SET_VALUES) + if ( NM_IN_SET (reload_flags, + NM_CONFIG_CHANGE_CAUSE_NO_AUTO_DEFAULT, + NM_CONFIG_CHANGE_CAUSE_SET_VALUES, + NM_CONFIG_CHANGE_CAUSE_CONF) && !new_data) { /* no relevant changes that should be propagated. Return silently. */ return; diff --git a/src/nm-manager.c b/src/nm-manager.c index 9a7141a2f9..c49a026e17 100644 --- a/src/nm-manager.c +++ b/src/nm-manager.c @@ -477,6 +477,7 @@ _reload_auth_cb (NMAuthChain *chain, guint32 flags; NMAuthSubject *subject; char s_buf[60]; + NMConfigChangeFlags reload_type = NM_CONFIG_CHANGE_NONE; g_assert (context); @@ -496,10 +497,25 @@ _reload_auth_cb (NMAuthChain *chain, ret_error = g_error_new_literal (NM_MANAGER_ERROR, NM_MANAGER_ERROR_PERMISSION_DENIED, "Not authorized to reload configuration"); - } else if (flags != 0) { - ret_error = g_error_new_literal (NM_MANAGER_ERROR, - NM_MANAGER_ERROR_INVALID_ARGUMENTS, - "Invalid flags for reload"); + } else { + if (NM_FLAGS_ANY (flags, ~NM_MANAGER_RELOAD_FLAGS_ALL)) { + /* invalid flags */ + } else if (flags == 0) + reload_type = NM_CONFIG_CHANGE_CAUSE_SIGHUP; + else { + if (NM_FLAGS_HAS (flags, NM_MANAGER_RELOAD_FLAGS_CONF)) + reload_type |= NM_CONFIG_CHANGE_CAUSE_CONF; + if (NM_FLAGS_HAS (flags, NM_MANAGER_RELOAD_FLAGS_DNS_RC)) + reload_type |= NM_CONFIG_CHANGE_CAUSE_DNS_RC; + if (NM_FLAGS_HAS (flags, NM_MANAGER_RELOAD_FLAGS_DNS_FULL)) + reload_type |= NM_CONFIG_CHANGE_CAUSE_DNS_FULL; + } + + if (reload_type == NM_CONFIG_CHANGE_NONE) { + ret_error = g_error_new_literal (NM_MANAGER_ERROR, + NM_MANAGER_ERROR_INVALID_ARGUMENTS, + "Invalid flags for reload"); + } } nm_audit_log_control_op (NM_AUDIT_OP_RELOAD, @@ -512,8 +528,7 @@ _reload_auth_cb (NMAuthChain *chain, goto out; } - nm_config_reload (priv->config, NM_CONFIG_CHANGE_CAUSE_SIGHUP); - + nm_config_reload (priv->config, reload_type); g_dbus_method_invocation_return_value (context, NULL); out: |