summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Haller <thaller@redhat.com>2016-05-30 16:43:39 +0200
committerThomas Haller <thaller@redhat.com>2016-06-01 13:13:13 +0200
commit06d19ff6765d9db3727adcc29a291739402911f4 (patch)
tree6f1c9d324a9dacbb3ee55e2384e5b2eddd649e4c
parent3d4b91598b95d2c98918d6533188c753f1a5803f (diff)
downloadNetworkManager-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.c8
-rw-r--r--src/nm-config-data.h37
-rw-r--r--src/nm-config.c10
-rw-r--r--src/nm-manager.c27
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: