dns,config: merge branch 'th/dns-reload-bgo766996'

https://bugzilla.gnome.org/show_bug.cgi?id=766996
This commit is contained in:
Thomas Haller 2016-06-01 19:06:43 +02:00
commit 431c70832d
40 changed files with 523 additions and 199 deletions

View file

@ -25,6 +25,7 @@
#include "polkit-agent.h"
#include "utils.h"
#include "general.h"
#include "nm-common-macros.h"
#include "devices.h"
#include "connections.h"
@ -387,18 +388,6 @@ show_nm_status (NmCli *nmc, const char *pretty_header_name, const char *print_fl
return TRUE;
}
#define NM_AUTH_PERMISSION_ENABLE_DISABLE_NETWORK "org.freedesktop.NetworkManager.enable-disable-network"
#define NM_AUTH_PERMISSION_ENABLE_DISABLE_WIFI "org.freedesktop.NetworkManager.enable-disable-wifi"
#define NM_AUTH_PERMISSION_ENABLE_DISABLE_WWAN "org.freedesktop.NetworkManager.enable-disable-wwan"
#define NM_AUTH_PERMISSION_ENABLE_DISABLE_WIMAX "org.freedesktop.NetworkManager.enable-disable-wimax"
#define NM_AUTH_PERMISSION_SLEEP_WAKE "org.freedesktop.NetworkManager.sleep-wake"
#define NM_AUTH_PERMISSION_NETWORK_CONTROL "org.freedesktop.NetworkManager.network-control"
#define NM_AUTH_PERMISSION_WIFI_SHARE_PROTECTED "org.freedesktop.NetworkManager.wifi.share.protected"
#define NM_AUTH_PERMISSION_WIFI_SHARE_OPEN "org.freedesktop.NetworkManager.wifi.share.open"
#define NM_AUTH_PERMISSION_SETTINGS_MODIFY_SYSTEM "org.freedesktop.NetworkManager.settings.modify.system"
#define NM_AUTH_PERMISSION_SETTINGS_MODIFY_OWN "org.freedesktop.NetworkManager.settings.modify.own"
#define NM_AUTH_PERMISSION_SETTINGS_MODIFY_HOSTNAME "org.freedesktop.NetworkManager.settings.modify.hostname"
static const char *
permission_to_string (NMClientPermission perm)
{
@ -425,6 +414,10 @@ permission_to_string (NMClientPermission perm)
return NM_AUTH_PERMISSION_SETTINGS_MODIFY_OWN;
case NM_CLIENT_PERMISSION_SETTINGS_MODIFY_HOSTNAME:
return NM_AUTH_PERMISSION_SETTINGS_MODIFY_HOSTNAME;
case NM_CLIENT_PERMISSION_SETTINGS_MODIFY_GLOBAL_DNS:
return NM_AUTH_PERMISSION_SETTINGS_MODIFY_GLOBAL_DNS;
case NM_CLIENT_PERMISSION_RELOAD:
return NM_AUTH_PERMISSION_RELOAD;
default:
return _("unknown");
}
@ -433,7 +426,6 @@ permission_to_string (NMClientPermission perm)
static const char *
permission_result_to_string (NMClientPermissionResult perm_result)
{
switch (perm_result) {
case NM_CLIENT_PERMISSION_RESULT_YES:
return _("yes");

View file

@ -7,6 +7,7 @@ Before=network.target @DISTRO_NETWORK_SERVICE@
[Service]
Type=dbus
BusName=org.freedesktop.NetworkManager
#ExecReload=/usr/bin/dbus-send --print-reply --system --type=method_call --dest=org.freedesktop.NetworkManager /org/freedesktop/NetworkManager org.freedesktop.NetworkManager.Reload uint32:0
ExecReload=/bin/kill -HUP $MAINPID
ExecStart=@sbindir@/NetworkManager --no-daemon
Restart=on-failure

View file

@ -3,6 +3,34 @@
<interface name="org.freedesktop.NetworkManager">
<annotation name="org.gtk.GDBus.C.Name" value="Manager"/>
<!--
Reload:
@flags: optional flags to specify which parts shall be reloaded.
Reload NetworkManager's configuration and perform certain updates, like flushing a cache or
rewriting external state to disk. This is similar to sending SIGHUP to NetworkManager but it
allows for more fine-grained control over what to reload (see @flags). It also allows
non-root access via PolicyKit and contrary to signals it is synchronous.
No flags (0x00) means to reload everything that is supported which is identical to
sending a SIGHUP.
(0x01) means to reload the NetworkManager.conf configuration from disk. Note that this
does not include connections, which can be reloaded via Setting's ReloadConnections.
(0x02) means to update DNS configuration, which usually involves writing /etc/resolv.conf
anew.
(0x04) means to restart the DNS plugin. This is for example useful when using
dnsmasq plugin, which uses additional configuration in /etc/NetworkManager/dnsmasq.d.
If you edit those files, you can restart the DNS plugin. This action shortly interrupts
rename resolution.
Note that flags may affect each other. For example, restarting the DNS plugin (0x04)
implicitly updates DNS too (0x02). Or when reloading the configuration (0x01), changes
to DNS setting also cause a DNS update (0x02). However, (0x01) does not involve restarting
the DNS plugin (0x02), unless an entirely different plugin is selected.
-->
<method name="Reload">
<arg name="flags" type="u" direction="in"/>
</method>
<!--
GetDevices:
@devices: List of object paths of network devices known to the system. This list does not include device placeholders (see GetAllDevices()).

View file

@ -185,6 +185,7 @@ GQuark nm_device_error_quark (void);
* enabled/disabled.
* @NM_MANAGER_ERROR_UNKNOWN_LOG_LEVEL: Unknown log level in SetLogging
* @NM_MANAGER_ERROR_UNKNOWN_LOG_DOMAIN: Unknown log domain in SetLogging
* @NM_MANAGER_ERROR_INVALID_ARGUMENTS: Invalid arguments for D-Bus request
*
* Errors related to the main "network management" interface of NetworkManager.
* These may be returned from #NMClient methods that invoke D-Bus operations on
@ -204,6 +205,7 @@ typedef enum {
NM_MANAGER_ERROR_ALREADY_ENABLED_OR_DISABLED, /*< nick=AlreadyEnabledOrDisabled >*/
NM_MANAGER_ERROR_UNKNOWN_LOG_LEVEL, /*< nick=UnknownLogLevel >*/
NM_MANAGER_ERROR_UNKNOWN_LOG_DOMAIN, /*< nick=UnknownLogDomain >*/
NM_MANAGER_ERROR_INVALID_ARGUMENTS, /*< nick=InvalidArguments >*/
} NMManagerError;
GQuark nm_manager_error_quark (void);

View file

@ -27,6 +27,7 @@
#include <string.h>
#include "nm-utils.h"
#include "nm-common-macros.h"
#include "nm-device-ethernet.h"
#include "nm-device-wifi.h"
@ -208,18 +209,6 @@ register_properties (NMClient *client)
property_info);
}
#define NM_AUTH_PERMISSION_ENABLE_DISABLE_NETWORK "org.freedesktop.NetworkManager.enable-disable-network"
#define NM_AUTH_PERMISSION_ENABLE_DISABLE_WIFI "org.freedesktop.NetworkManager.enable-disable-wifi"
#define NM_AUTH_PERMISSION_ENABLE_DISABLE_WWAN "org.freedesktop.NetworkManager.enable-disable-wwan"
#define NM_AUTH_PERMISSION_ENABLE_DISABLE_WIMAX "org.freedesktop.NetworkManager.enable-disable-wimax"
#define NM_AUTH_PERMISSION_SLEEP_WAKE "org.freedesktop.NetworkManager.sleep-wake"
#define NM_AUTH_PERMISSION_NETWORK_CONTROL "org.freedesktop.NetworkManager.network-control"
#define NM_AUTH_PERMISSION_WIFI_SHARE_PROTECTED "org.freedesktop.NetworkManager.wifi.share.protected"
#define NM_AUTH_PERMISSION_WIFI_SHARE_OPEN "org.freedesktop.NetworkManager.wifi.share.open"
#define NM_AUTH_PERMISSION_SETTINGS_MODIFY_SYSTEM "org.freedesktop.NetworkManager.settings.modify.system"
#define NM_AUTH_PERMISSION_SETTINGS_MODIFY_OWN "org.freedesktop.NetworkManager.settings.modify.own"
#define NM_AUTH_PERMISSION_SETTINGS_MODIFY_HOSTNAME "org.freedesktop.NetworkManager.settings.modify.hostname"
static NMClientPermission
nm_permission_to_client (const char *nm)
{
@ -245,6 +234,10 @@ nm_permission_to_client (const char *nm)
return NM_CLIENT_PERMISSION_SETTINGS_MODIFY_OWN;
else if (!strcmp (nm, NM_AUTH_PERMISSION_SETTINGS_MODIFY_HOSTNAME))
return NM_CLIENT_PERMISSION_SETTINGS_MODIFY_HOSTNAME;
else if (!strcmp (nm, NM_AUTH_PERMISSION_SETTINGS_MODIFY_GLOBAL_DNS))
return NM_CLIENT_PERMISSION_SETTINGS_MODIFY_GLOBAL_DNS;
else if (!strcmp (nm, NM_AUTH_PERMISSION_RELOAD))
return NM_CLIENT_PERMISSION_RELOAD;
return NM_CLIENT_PERMISSION_NONE;
}

View file

@ -84,6 +84,10 @@ G_BEGIN_DECLS
* owned by the current user can be modified
* @NM_CLIENT_PERMISSION_SETTINGS_MODIFY_HOSTNAME: controls whether the
* persistent hostname can be changed
* @NM_CLIENT_PERMISSION_SETTINGS_MODIFY_GLOBAL_DNS: modify persistent global
* DNS configuration
* @NM_CLIENT_PERMISSION_RELOAD: controls access to Reload.
* persistent hostname can be changed
* @NM_CLIENT_PERMISSION_LAST: a reserved boundary value
*
* #NMClientPermission values indicate various permissions that NetworkManager
@ -102,8 +106,10 @@ typedef enum {
NM_CLIENT_PERMISSION_SETTINGS_MODIFY_SYSTEM = 9,
NM_CLIENT_PERMISSION_SETTINGS_MODIFY_OWN = 10,
NM_CLIENT_PERMISSION_SETTINGS_MODIFY_HOSTNAME = 11,
NM_CLIENT_PERMISSION_SETTINGS_MODIFY_GLOBAL_DNS = 12,
NM_CLIENT_PERMISSION_RELOAD = 13,
NM_CLIENT_PERMISSION_LAST = NM_CLIENT_PERMISSION_SETTINGS_MODIFY_HOSTNAME
NM_CLIENT_PERMISSION_LAST = 13,
} NMClientPermission;
/**

View file

@ -92,6 +92,9 @@ G_BEGIN_DECLS
* owned by the current user can be modified
* @NM_CLIENT_PERMISSION_SETTINGS_MODIFY_HOSTNAME: controls whether the
* persistent hostname can be changed
* @NM_CLIENT_PERMISSION_SETTINGS_MODIFY_GLOBAL_DNS: modify persistent global
* DNS configuration
* @NM_CLIENT_PERMISSION_RELOAD: controls access to Reload.
* @NM_CLIENT_PERMISSION_LAST: a reserved boundary value
*
* #NMClientPermission values indicate various permissions that NetworkManager
@ -110,8 +113,10 @@ typedef enum {
NM_CLIENT_PERMISSION_SETTINGS_MODIFY_SYSTEM = 9,
NM_CLIENT_PERMISSION_SETTINGS_MODIFY_OWN = 10,
NM_CLIENT_PERMISSION_SETTINGS_MODIFY_HOSTNAME = 11,
NM_CLIENT_PERMISSION_SETTINGS_MODIFY_GLOBAL_DNS = 12,
NM_CLIENT_PERMISSION_RELOAD = 13,
NM_CLIENT_PERMISSION_LAST = NM_CLIENT_PERMISSION_SETTINGS_MODIFY_HOSTNAME
NM_CLIENT_PERMISSION_LAST = 13,
} NMClientPermission;
/**

View file

@ -26,6 +26,7 @@
#include <string.h>
#include "nm-utils.h"
#include "nm-common-macros.h"
#include "nm-device-ethernet.h"
#include "nm-device-wifi.h"
#include "nm-device-private.h"
@ -202,18 +203,6 @@ init_dbus (NMObject *object)
G_CALLBACK (manager_recheck_permissions), object);
}
#define NM_AUTH_PERMISSION_ENABLE_DISABLE_NETWORK "org.freedesktop.NetworkManager.enable-disable-network"
#define NM_AUTH_PERMISSION_ENABLE_DISABLE_WIFI "org.freedesktop.NetworkManager.enable-disable-wifi"
#define NM_AUTH_PERMISSION_ENABLE_DISABLE_WWAN "org.freedesktop.NetworkManager.enable-disable-wwan"
#define NM_AUTH_PERMISSION_ENABLE_DISABLE_WIMAX "org.freedesktop.NetworkManager.enable-disable-wimax"
#define NM_AUTH_PERMISSION_SLEEP_WAKE "org.freedesktop.NetworkManager.sleep-wake"
#define NM_AUTH_PERMISSION_NETWORK_CONTROL "org.freedesktop.NetworkManager.network-control"
#define NM_AUTH_PERMISSION_WIFI_SHARE_PROTECTED "org.freedesktop.NetworkManager.wifi.share.protected"
#define NM_AUTH_PERMISSION_WIFI_SHARE_OPEN "org.freedesktop.NetworkManager.wifi.share.open"
#define NM_AUTH_PERMISSION_SETTINGS_MODIFY_SYSTEM "org.freedesktop.NetworkManager.settings.modify.system"
#define NM_AUTH_PERMISSION_SETTINGS_MODIFY_OWN "org.freedesktop.NetworkManager.settings.modify.own"
#define NM_AUTH_PERMISSION_SETTINGS_MODIFY_HOSTNAME "org.freedesktop.NetworkManager.settings.modify.hostname"
static NMClientPermission
nm_permission_to_client (const char *nm)
{
@ -239,6 +228,10 @@ nm_permission_to_client (const char *nm)
return NM_CLIENT_PERMISSION_SETTINGS_MODIFY_OWN;
else if (!strcmp (nm, NM_AUTH_PERMISSION_SETTINGS_MODIFY_HOSTNAME))
return NM_CLIENT_PERMISSION_SETTINGS_MODIFY_HOSTNAME;
else if (!strcmp (nm, NM_AUTH_PERMISSION_SETTINGS_MODIFY_GLOBAL_DNS))
return NM_CLIENT_PERMISSION_SETTINGS_MODIFY_GLOBAL_DNS;
else if (!strcmp (nm, NM_AUTH_PERMISSION_RELOAD))
return NM_CLIENT_PERMISSION_RELOAD;
return NM_CLIENT_PERMISSION_NONE;
}

View file

@ -78,6 +78,10 @@
This file is not intended to be modified by the user, but it is read last and can shadow
user configuration from <literal>NetworkManager.conf</literal>.
</para>
<para>
Certain settings from the configuration can be reloaded at runtime either by sending SIGHUP signal or via
D-Bus' Reload call.
</para>
</refsect1>

View file

@ -428,24 +428,45 @@
The signal causes a reload of NetworkManager's configuration.
Note that not all configuration parameters can be changed at
runtime and therefore some changes may be applied only after
the next restart of the daemon. The signal also forces a
rewrite of DNS configuration.
the next restart of the daemon.
A SIGHUP also involves further reloading actions, like doing
a DNS update and restarting the DNS plugin. The latter can be
useful for example when using the dnsmasq plugin and changing
its configuration in /etc/NetworkManager/dnsmasq.d. However,
it also means this will shortly interrupt name resolution.
In the future, there may be further actions added.
A SIGHUP means to update NetworkManager configuration and reload
everything that is supported. Note that this does not reload
connections from disk. For that there is a D-Bus API and
nmcli's reload action
</para></listitem>
</varlistentry>
<varlistentry>
<term><varname>SIGUSR1</varname></term>
<listitem><para>
The signal forces a rewrite of DNS configuration.
The signal forces a rewrite of DNS configuration. Contrary to
SIGHUP, this does not restart the DNS plugin and will not interrupt
name resolution.
In the future, further actions may be added. A SIGUSR1
means to write out data like resolv.conf, or refresh a cache.
It is a subset of what is done for SIGHUP without reloading
configuration from disk.
</para></listitem>
</varlistentry>
<varlistentry>
<term><varname>SIGUSR2</varname></term>
<listitem><para>
The signal has no effect at the moment.
The signal has no effect at the moment but is reserved for future
use.
</para></listitem>
</varlistentry>
</variablelist>
</para>
<para>
An alternative to a signal to reload configuration is the Reload D-Bus call.
It allows for more fine-grained selection of what to reload, it only returns
after the reload is complete, and it is guarded by PolicyKit.
</para>
</refsect1>
<refsect1>

View file

@ -140,7 +140,8 @@ org.freedesktop.NetworkManager.wifi.share.protected yes
org.freedesktop.NetworkManager.wifi.share.open yes
org.freedesktop.NetworkManager.settings.modify.system yes
org.freedesktop.NetworkManager.settings.modify.own yes
org.freedesktop.NetworkManager.settings.modify.hostname auth</screen>
org.freedesktop.NetworkManager.settings.modify.hostname auth
org.freedesktop.NetworkManager.reload no</screen>
<para>
This command shows configured polkit permissions for various NetworkManager
operations. These permissions or actions (using polkit language) are configured

View file

@ -1,3 +1,4 @@
data/NetworkManager.service.in
examples/python/NetworkManager.py
examples/python/systray/eggtrayicon.c
policy/org.freedesktop.NetworkManager.policy.in

View file

@ -18,6 +18,16 @@
</defaults>
</action>
<action id="org.freedesktop.NetworkManager.reload">
<_description>Reload NetworkManager configuration</_description>
<_message>System policy prevents reloading NetworkManager</_message>
<defaults>
<allow_any>auth_admin_keep</allow_any>
<allow_inactive>auth_admin_keep</allow_inactive>
<allow_active>auth_admin_keep</allow_active>
</defaults>
</action>
<action id="org.freedesktop.NetworkManager.sleep-wake">
<_description>Put NetworkManager to sleep or wake it up (should only be used by system power management)</_description>
<_message>System policy prevents putting NetworkManager to sleep or waking it up</_message>

View file

@ -1,5 +1,6 @@
EXTRA_DIST = \
gsystem-local-alloc.h \
nm-common-macros.h \
nm-dbus-compat.h \
nm-default.h \
nm-glib.h \

43
shared/nm-common-macros.h Normal file
View file

@ -0,0 +1,43 @@
/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */
/* NetworkManager -- Network link manager
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
* Boston, MA 02110-1301 USA.
*
* (C) Copyright 2016 Red Hat, Inc.
*/
#ifndef __NM_COMMON_MACROS_H__
#define __NM_COMMON_MACROS_H__
/******************************************************************************/
#define NM_AUTH_PERMISSION_ENABLE_DISABLE_NETWORK "org.freedesktop.NetworkManager.enable-disable-network"
#define NM_AUTH_PERMISSION_SLEEP_WAKE "org.freedesktop.NetworkManager.sleep-wake"
#define NM_AUTH_PERMISSION_ENABLE_DISABLE_WIFI "org.freedesktop.NetworkManager.enable-disable-wifi"
#define NM_AUTH_PERMISSION_ENABLE_DISABLE_WWAN "org.freedesktop.NetworkManager.enable-disable-wwan"
#define NM_AUTH_PERMISSION_ENABLE_DISABLE_WIMAX "org.freedesktop.NetworkManager.enable-disable-wimax"
#define NM_AUTH_PERMISSION_NETWORK_CONTROL "org.freedesktop.NetworkManager.network-control"
#define NM_AUTH_PERMISSION_WIFI_SHARE_PROTECTED "org.freedesktop.NetworkManager.wifi.share.protected"
#define NM_AUTH_PERMISSION_WIFI_SHARE_OPEN "org.freedesktop.NetworkManager.wifi.share.open"
#define NM_AUTH_PERMISSION_SETTINGS_MODIFY_SYSTEM "org.freedesktop.NetworkManager.settings.modify.system"
#define NM_AUTH_PERMISSION_SETTINGS_MODIFY_OWN "org.freedesktop.NetworkManager.settings.modify.own"
#define NM_AUTH_PERMISSION_SETTINGS_MODIFY_HOSTNAME "org.freedesktop.NetworkManager.settings.modify.hostname"
#define NM_AUTH_PERMISSION_SETTINGS_MODIFY_GLOBAL_DNS "org.freedesktop.NetworkManager.settings.modify.global-dns"
#define NM_AUTH_PERMISSION_RELOAD "org.freedesktop.NetworkManager.reload"
/******************************************************************************/
#endif /* __NM_COMMON_MACROS_H__ */

View file

@ -23,6 +23,7 @@
#include "NetworkManagerUtils.h"
#include "nm-common-macros.h"
#include "nm-utils.h"
#include "nm-setting-connection.h"
#include "nm-setting-ip4-config.h"

View file

@ -36,6 +36,7 @@
#include <netlink/route/addr.h>
#include <linux/if_addr.h>
#include "nm-common-macros.h"
#include "nm-device-private.h"
#include "NetworkManagerUtils.h"
#include "nm-manager.h"

View file

@ -28,6 +28,7 @@
#include <unistd.h>
#include <errno.h>
#include "nm-common-macros.h"
#include "nm-device.h"
#include "nm-device-private.h"
#include "nm-utils.h"

View file

@ -431,11 +431,16 @@ start_dnsmasq (NMDnsDnsmasq *self)
NMBusManager *dbus_mgr;
GDBusConnection *connection;
if ( priv->running
|| priv->dnsmasq
|| priv->dnsmasq_cancellable)
if (priv->running) {
/* the dnsmasq process is running. Nothing to do. */
return;
}
if (nm_dns_plugin_child_pid ((NMDnsPlugin *) self) > 0) {
/* if we already have a child process spawned, don't do
* it again. */
return;
}
dm_binary = nm_utils_find_helper ("dnsmasq", DNSMASQ_PATH, NULL);
if (!dm_binary) {
@ -467,6 +472,13 @@ start_dnsmasq (NMDnsDnsmasq *self)
if (!pid)
return;
if ( priv->dnsmasq
|| priv->dnsmasq_cancellable) {
/* we already have a proxy or are about to create it.
* We are done. */
return;
}
dbus_mgr = nm_bus_manager_get ();
g_return_if_fail (dbus_mgr);
@ -522,6 +534,7 @@ static void
child_quit (NMDnsPlugin *plugin, gint status)
{
NMDnsDnsmasq *self = NM_DNS_DNSMASQ (plugin);
NMDnsDnsmasqPrivate *priv = NM_DNS_DNSMASQ_GET_PRIVATE (self);
gboolean failed = TRUE;
int err;
@ -530,8 +543,10 @@ child_quit (NMDnsPlugin *plugin, gint status)
if (err) {
_LOGW ("dnsmasq exited with error: %s",
nm_utils_dnsmasq_status_to_string (err, NULL, 0));
} else
} else {
_LOGD ("dnsmasq exited normally");
failed = FALSE;
}
} else if (WIFSTOPPED (status))
_LOGW ("dnsmasq stopped unexpectedly with signal %d", WSTOPSIG (status));
else if (WIFSIGNALED (status))
@ -539,6 +554,8 @@ child_quit (NMDnsPlugin *plugin, gint status)
else
_LOGW ("dnsmasq died from an unknown cause");
priv->running = FALSE;
if (failed)
g_signal_emit_by_name (self, NM_DNS_PLUGIN_FAILED);
}

View file

@ -61,10 +61,6 @@
#define DOMAIN_IS_VALID(domain) (*(domain))
#endif
G_DEFINE_TYPE (NMDnsManager, nm_dns_manager, G_TYPE_OBJECT)
#define NM_DNS_MANAGER_GET_PRIVATE(o) ((o)->priv)
#define HASH_LEN 20
#ifndef RESOLVCONF_PATH
@ -79,7 +75,19 @@ G_DEFINE_TYPE (NMDnsManager, nm_dns_manager, G_TYPE_OBJECT)
#define PLUGIN_RATELIMIT_BURST 5
#define PLUGIN_RATELIMIT_DELAY 300
NM_DEFINE_SINGLETON_INSTANCE (NMDnsManager);
enum {
CONFIG_CHANGED,
LAST_SIGNAL
};
static guint signals[LAST_SIGNAL] = { 0 };
typedef enum {
SR_SUCCESS,
SR_NOTFOUND,
SR_ERROR
} SpawnResult;
/*********************************************************************************************/
@ -105,7 +113,7 @@ NM_DEFINE_SINGLETON_INSTANCE (NMDnsManager);
/*********************************************************************************************/
typedef struct _NMDnsManagerPrivate {
typedef struct {
GPtrArray *configs;
NMDnsIPConfigData *best_conf4, *best_conf6;
gboolean need_sort;
@ -130,20 +138,33 @@ typedef struct _NMDnsManagerPrivate {
} plugin_ratelimit;
} NMDnsManagerPrivate;
enum {
CONFIG_CHANGED,
LAST_SIGNAL
struct _NMDnsManager {
GObject parent;
NMDnsManagerPrivate _priv;
};
typedef enum {
SR_SUCCESS,
SR_NOTFOUND,
SR_ERROR
} SpawnResult;
struct _NMDnsManagerClass {
GObjectClass parent;
};
static guint signals[LAST_SIGNAL] = { 0 };
G_DEFINE_TYPE (NMDnsManager, nm_dns_manager, G_TYPE_OBJECT)
NM_DEFINE_SINGLETON_INSTANCE (NMDnsManager);
#define NM_DNS_MANAGER_GET_PRIVATE(self) \
({ \
/* preserve the const-ness of self. Unfortunately, that
* way, @self cannot be a void pointer */ \
typeof (self) _self = (self); \
\
/* Get compiler error if variable is of wrong type */ \
_nm_unused const NMDnsManager *_self2 = (_self); \
\
nm_assert (NM_IS_DNS_MANAGER (_self)); \
&_self->_priv; \
})
/*****************************************************************************/
typedef struct {
GPtrArray *nameservers;
@ -1472,9 +1493,12 @@ _clear_plugin (NMDnsManager *self)
if (priv->plugin) {
g_signal_handlers_disconnect_by_func (priv->plugin, plugin_failed, self);
g_signal_handlers_disconnect_by_func (priv->plugin, plugin_child_quit, self);
nm_dns_plugin_stop (priv->plugin);
g_clear_object (&priv->plugin);
return TRUE;
}
priv->plugin_ratelimit.ts = 0;
nm_clear_g_source (&priv->plugin_ratelimit.timer);
return FALSE;
}
@ -1496,7 +1520,7 @@ _get_resconf_immutable (void)
NM_DEFINE_SINGLETON_GETTER (NMDnsManager, nm_dns_manager_get, NM_TYPE_DNS_MANAGER);
static void
init_resolv_conf_mode (NMDnsManager *self)
init_resolv_conf_mode (NMDnsManager *self, gboolean force_reload_plugin)
{
NMDnsManagerPrivate *priv = NM_DNS_MANAGER_GET_PRIVATE (self);
NMDnsManagerResolvConfManager rc_manager;
@ -1541,13 +1565,13 @@ again:
}
if (nm_streq0 (mode, "dnsmasq")) {
if (!NM_IS_DNS_DNSMASQ (priv->plugin)) {
if (force_reload_plugin || !NM_IS_DNS_DNSMASQ (priv->plugin)) {
_clear_plugin (self);
priv->plugin = nm_dns_dnsmasq_new ();
plugin_changed = TRUE;
}
} else if (nm_streq0 (mode, "unbound")) {
if (!NM_IS_DNS_UNBOUND (priv->plugin)) {
if (force_reload_plugin || !NM_IS_DNS_UNBOUND (priv->plugin)) {
_clear_plugin (self);
priv->plugin = nm_dns_unbound_new ();
plugin_changed = TRUE;
@ -1586,16 +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_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);
init_resolv_conf_mode (self,
NM_FLAGS_ANY (changes, NM_CONFIG_CHANGE_CAUSE_SIGHUP
| NM_CONFIG_CHANGE_CAUSE_DNS_FULL));
}
if (NM_FLAGS_ANY (changes, NM_CONFIG_CHANGE_SIGHUP |
NM_CONFIG_CHANGE_SIGUSR1 |
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)) {
@ -1609,9 +1638,7 @@ config_changed_cb (NMConfig *config,
static void
nm_dns_manager_init (NMDnsManager *self)
{
NMDnsManagerPrivate *priv = G_TYPE_INSTANCE_GET_PRIVATE (self, NM_TYPE_DNS_MANAGER, NMDnsManagerPrivate);
self->priv = priv;
NMDnsManagerPrivate *priv = NM_DNS_MANAGER_GET_PRIVATE (self);
_LOGT ("creating...");
@ -1625,7 +1652,7 @@ nm_dns_manager_init (NMDnsManager *self)
NM_CONFIG_SIGNAL_CONFIG_CHANGED,
G_CALLBACK (config_changed_cb),
self);
init_resolv_conf_mode (self);
init_resolv_conf_mode (self, TRUE);
}
static void
@ -1666,6 +1693,8 @@ dispose (GObject *object)
priv->configs = NULL;
}
nm_clear_g_source (&priv->plugin_ratelimit.timer);
G_OBJECT_CLASS (nm_dns_manager_parent_class)->dispose (object);
}
@ -1685,8 +1714,6 @@ nm_dns_manager_class_init (NMDnsManagerClass *klass)
{
GObjectClass *object_class = G_OBJECT_CLASS (klass);
g_type_class_add_private (object_class, sizeof (NMDnsManagerPrivate));
/* virtual methods */
object_class->dispose = dispose;
object_class->finalize = finalize;
@ -1696,8 +1723,7 @@ nm_dns_manager_class_init (NMDnsManagerClass *klass)
g_signal_new (NM_DNS_MANAGER_CONFIG_CHANGED,
G_OBJECT_CLASS_TYPE (object_class),
G_SIGNAL_RUN_FIRST,
G_STRUCT_OFFSET (NMDnsManagerClass, config_changed),
NULL, NULL,
0, NULL, NULL,
g_cclosure_marshal_VOID__VOID,
G_TYPE_NONE, 0);
}

View file

@ -56,20 +56,8 @@ typedef struct {
#define NM_DNS_MANAGER_CONFIG_CHANGED "config-changed"
struct _NMDnsManagerPrivate;
typedef struct {
GObject parent;
/* private */
struct _NMDnsManagerPrivate *priv;
} NMDnsManager;
typedef struct {
GObjectClass parent;
/* Signals */
void (*config_changed) (NMDnsManager *mgr);
} NMDnsManagerClass;
typedef struct _NMDnsManager NMDnsManager;
typedef struct _NMDnsManagerClass NMDnsManagerClass;
GType nm_dns_manager_get_type (void);

View file

@ -177,6 +177,17 @@ watch_cb (GPid pid, gint status, gpointer user_data)
g_signal_emit (self, signals[CHILD_QUIT], 0, status);
}
GPid
nm_dns_plugin_child_pid (NMDnsPlugin *self)
{
NMDnsPluginPrivate *priv;
g_return_val_if_fail (NM_IS_DNS_PLUGIN (self), 0);
priv = NM_DNS_PLUGIN_GET_PRIVATE (self);
return priv->pid;
}
GPid
nm_dns_plugin_child_spawn (NMDnsPlugin *self,
const char **argv,
@ -243,6 +254,12 @@ nm_dns_plugin_child_kill (NMDnsPlugin *self)
return TRUE;
}
void
nm_dns_plugin_stop (NMDnsPlugin *self)
{
nm_dns_plugin_child_kill (self);
}
/********************************************/
static void
@ -255,7 +272,7 @@ dispose (GObject *object)
{
NMDnsPlugin *self = NM_DNS_PLUGIN (object);
nm_dns_plugin_child_kill (self);
nm_dns_plugin_stop (self);
G_OBJECT_CLASS (nm_dns_plugin_parent_class)->dispose (object);
}

View file

@ -90,6 +90,8 @@ gboolean nm_dns_plugin_update (NMDnsPlugin *self,
const NMGlobalDnsConfig *global_config,
const char *hostname);
void nm_dns_plugin_stop (NMDnsPlugin *self);
/* For subclasses/plugins */
/* Spawn a child process and watch for it to quit. 'argv' is the NULL-terminated
@ -103,6 +105,8 @@ GPid nm_dns_plugin_child_spawn (NMDnsPlugin *self,
const char *pidfile,
const char *kill_match);
GPid nm_dns_plugin_child_pid (NMDnsPlugin *self);
gboolean nm_dns_plugin_child_kill (NMDnsPlugin *self);
#endif /* __NETWORKMANAGER_DNS_PLUGIN_H__ */

View file

@ -116,14 +116,31 @@ _init_nm_debug (const char *debug)
void
nm_main_config_reload (int signal)
{
NMConfigChangeFlags reload_flags;
switch (signal) {
case SIGHUP:
reload_flags = NM_CONFIG_CHANGE_CAUSE_SIGHUP;
break;
case SIGUSR1:
reload_flags = NM_CONFIG_CHANGE_CAUSE_SIGUSR1;
break;
case SIGUSR2:
reload_flags = NM_CONFIG_CHANGE_CAUSE_SIGUSR2;
break;
default:
g_return_if_reached ();
}
nm_log_info (LOGD_CORE, "reload configuration (signal %s)...", strsignal (signal));
/* The signal handler thread is only installed after
* creating NMConfig instance, and on shut down we
* no longer run the mainloop (to reach this point).
*
* Hence, a NMConfig singleton instance must always be
* available. */
nm_config_reload (nm_config_get (), signal);
nm_config_reload (nm_config_get (), reload_flags);
}
static void

View file

@ -21,6 +21,8 @@
#include "nm-default.h"
#include "nm-active-connection.h"
#include "nm-common-macros.h"
#include "nm-dbus-interface.h"
#include "nm-device.h"
#include "nm-settings-connection.h"

View file

@ -53,6 +53,7 @@ typedef struct {
#define NM_AUDIT_OP_CONN_DEACTIVATE "connection-deactivate"
#define NM_AUDIT_OP_CONN_CLEAR_SECRETS "connection-clear-secrets"
#define NM_AUDIT_OP_RELOAD "reload"
#define NM_AUDIT_OP_SLEEP_CONTROL "sleep-control"
#define NM_AUDIT_OP_NET_CONTROL "networking-control"
#define NM_AUDIT_OP_RADIO_CONTROL "radio-control"

View file

@ -20,10 +20,11 @@
#include "nm-default.h"
#include "nm-auth-utils.h"
#include <string.h>
#include "nm-setting-connection.h"
#include "nm-auth-utils.h"
#include "nm-auth-subject.h"
#include "nm-auth-manager.h"
#include "nm-session-monitor.h"

View file

@ -21,22 +21,7 @@
#ifndef __NETWORKMANAGER_MANAGER_AUTH_H__
#define __NETWORKMANAGER_MANAGER_AUTH_H__
#include <nm-connection.h>
#include "nm-default.h"
#define NM_AUTH_PERMISSION_ENABLE_DISABLE_NETWORK "org.freedesktop.NetworkManager.enable-disable-network"
#define NM_AUTH_PERMISSION_SLEEP_WAKE "org.freedesktop.NetworkManager.sleep-wake"
#define NM_AUTH_PERMISSION_ENABLE_DISABLE_WIFI "org.freedesktop.NetworkManager.enable-disable-wifi"
#define NM_AUTH_PERMISSION_ENABLE_DISABLE_WWAN "org.freedesktop.NetworkManager.enable-disable-wwan"
#define NM_AUTH_PERMISSION_ENABLE_DISABLE_WIMAX "org.freedesktop.NetworkManager.enable-disable-wimax"
#define NM_AUTH_PERMISSION_NETWORK_CONTROL "org.freedesktop.NetworkManager.network-control"
#define NM_AUTH_PERMISSION_WIFI_SHARE_PROTECTED "org.freedesktop.NetworkManager.wifi.share.protected"
#define NM_AUTH_PERMISSION_WIFI_SHARE_OPEN "org.freedesktop.NetworkManager.wifi.share.open"
#define NM_AUTH_PERMISSION_SETTINGS_MODIFY_SYSTEM "org.freedesktop.NetworkManager.settings.modify.system"
#define NM_AUTH_PERMISSION_SETTINGS_MODIFY_OWN "org.freedesktop.NetworkManager.settings.modify.own"
#define NM_AUTH_PERMISSION_SETTINGS_MODIFY_HOSTNAME "org.freedesktop.NetworkManager.settings.modify.hostname"
#define NM_AUTH_PERMISSION_SETTINGS_MODIFY_GLOBAL_DNS "org.freedesktop.NetworkManager.settings.modify.global-dns"
#include "nm-connection.h"
typedef struct NMAuthChain NMAuthChain;

View file

@ -1201,6 +1201,8 @@ nm_config_data_diff (NMConfigData *old_data, NMConfigData *new_data)
if (!global_dns_equal (priv_old->global_dns, priv_new->global_dns))
changes |= NM_CONFIG_CHANGE_GLOBAL_DNS_CONFIG;
nm_assert (!NM_FLAGS_ANY (changes, NM_CONFIG_CHANGE_CAUSES));
return changes;
}

View file

@ -21,11 +21,6 @@
#ifndef NM_CONFIG_DATA_H
#define NM_CONFIG_DATA_H
#include "nm-default.h"
G_BEGIN_DECLS
#define NM_TYPE_CONFIG_DATA (nm_config_data_get_type ())
#define NM_CONFIG_DATA(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), NM_TYPE_CONFIG_DATA, NMConfigData))
#define NM_CONFIG_DATA_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), NM_TYPE_CONFIG_DATA, NMConfigDataClass))
@ -44,7 +39,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(). */
@ -64,22 +78,54 @@ typedef enum { /*<flags >*/
typedef enum { /*< flags >*/
NM_CONFIG_CHANGE_NONE = 0,
NM_CONFIG_CHANGE_SIGHUP = (1L << 0),
NM_CONFIG_CHANGE_SIGUSR1 = (1L << 1),
NM_CONFIG_CHANGE_SIGUSR2 = (1L << 2),
/**************************************************************************
* The external cause which triggered the reload/configuration-change
*************************************************************************/
NM_CONFIG_CHANGE_CONFIG_FILES = (1L << 3),
NM_CONFIG_CHANGE_VALUES = (1L << 4),
NM_CONFIG_CHANGE_VALUES_USER = (1L << 5),
NM_CONFIG_CHANGE_VALUES_INTERN = (1L << 6),
NM_CONFIG_CHANGE_CONNECTIVITY = (1L << 7),
NM_CONFIG_CHANGE_NO_AUTO_DEFAULT = (1L << 8),
NM_CONFIG_CHANGE_DNS_MODE = (1L << 9),
NM_CONFIG_CHANGE_RC_MANAGER = (1L << 10),
NM_CONFIG_CHANGE_GLOBAL_DNS_CONFIG = (1L << 11),
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 = (1L << 5),
NM_CONFIG_CHANGE_CAUSE_DNS_RC = (1L << 6),
NM_CONFIG_CHANGE_CAUSE_DNS_FULL = (1L << 7),
NM_CONFIG_CHANGE_CAUSES = ((1L << 8) - 1),
/**************************************************************************
* Following flags describe which property of the configuration changed:
*************************************************************************/
/* main-file or config-description changed */
NM_CONFIG_CHANGE_CONFIG_FILES = (1L << 10),
/* any configuration on disk changed */
NM_CONFIG_CHANGE_VALUES = (1L << 11),
/* any user configuration on disk changed (NetworkManager.conf) */
NM_CONFIG_CHANGE_VALUES_USER = (1L << 12),
/* any internal configuration on disk changed (NetworkManager-intern.conf) */
NM_CONFIG_CHANGE_VALUES_INTERN = (1L << 13),
/* configuration regarding connectivity changed */
NM_CONFIG_CHANGE_CONNECTIVITY = (1L << 14),
/* configuration regarding no-auto-default changed */
NM_CONFIG_CHANGE_NO_AUTO_DEFAULT = (1L << 15),
/* configuration regarding dns-mode changed */
NM_CONFIG_CHANGE_DNS_MODE = (1L << 16),
/* configuration regarding rc-manager changed */
NM_CONFIG_CHANGE_RC_MANAGER = (1L << 17),
/* configuration regarding global dns-config changed */
NM_CONFIG_CHANGE_GLOBAL_DNS_CONFIG = (1L << 18),
_NM_CONFIG_CHANGE_LAST,
NM_CONFIG_CHANGE_ALL = ((_NM_CONFIG_CHANGE_LAST - 1) << 1) - 1,
} NMConfigChangeFlags;
struct _NMConfigData {
@ -164,7 +210,5 @@ GKeyFile *_nm_config_data_get_keyfile (const NMConfigData *self);
GKeyFile *_nm_config_data_get_keyfile_user (const NMConfigData *self);
GKeyFile *_nm_config_data_get_keyfile_intern (const NMConfigData *self);
G_END_DECLS
#endif /* NM_CONFIG_DATA_H */

View file

@ -21,10 +21,11 @@
#include "nm-default.h"
#include "nm-config.h"
#include <string.h>
#include <stdio.h>
#include "nm-config.h"
#include "nm-utils.h"
#include "nm-device.h"
#include "NetworkManagerUtils.h"
@ -141,7 +142,7 @@ G_DEFINE_TYPE_WITH_CODE (NMConfig, nm_config, G_TYPE_OBJECT,
/************************************************************************/
static void _set_config_data (NMConfig *self, NMConfigData *new_data, int signal);
static void _set_config_data (NMConfig *self, NMConfigData *new_data, NMConfigChangeFlags reload_flags);
/************************************************************************/
@ -425,7 +426,7 @@ nm_config_set_no_auto_default_for_device (NMConfig *self, NMDevice *device)
/* unref no_auto_default_set here. Note that _set_config_data() probably invalidates the content of the array. */
g_ptr_array_unref (no_auto_default_new);
_set_config_data (self, new_data, 0);
_set_config_data (self, new_data, NM_CONFIG_CHANGE_CAUSE_NO_AUTO_DEFAULT);
}
/************************************************************************/
@ -682,7 +683,7 @@ read_config (GKeyFile *keyfile, gboolean is_base_config, const char *dirname, co
/* the config-group is internal to every configuration snippets. It doesn't make sense
* to merge the into the global configuration, and it doesn't make sense to preserve the
* group beyond this point. */
g_key_file_remove_group (keyfile, NM_CONFIG_KEYFILE_GROUP_CONFIG, NULL);
g_key_file_remove_group (kf, NM_CONFIG_KEYFILE_GROUP_CONFIG, NULL);
/* Override the current settings with the new ones */
groups = g_key_file_get_groups (kf, &ngroups);
@ -1674,7 +1675,7 @@ nm_config_set_values (NMConfig *self,
nm_log_dbg (LOGD_CORE, "don't persistate internal configuration (no file set, use --intern-config?)");
}
if (new_data)
_set_config_data (self, new_data, 0);
_set_config_data (self, new_data, NM_CONFIG_CHANGE_CAUSE_SET_VALUES);
g_key_file_unref (keyfile_new);
}
@ -1865,7 +1866,7 @@ _nm_config_state_set (NMConfig *self,
/*****************************************************************************/
void
nm_config_reload (NMConfig *self, int signal)
nm_config_reload (NMConfig *self, NMConfigChangeFlags reload_flags)
{
NMConfigPrivate *priv;
GError *error = NULL;
@ -1877,11 +1878,16 @@ nm_config_reload (NMConfig *self, int signal)
gboolean intern_config_needs_rewrite;
g_return_if_fail (NM_IS_CONFIG (self));
g_return_if_fail ( reload_flags
&& !NM_FLAGS_ANY (reload_flags, ~NM_CONFIG_CHANGE_CAUSES)
&& !NM_FLAGS_ANY (reload_flags, NM_CONFIG_CHANGE_CAUSE_NO_AUTO_DEFAULT
| NM_CONFIG_CHANGE_CAUSE_SET_VALUES));
priv = NM_CONFIG_GET_PRIVATE (self);
if (signal != SIGHUP) {
_set_config_data (self, NULL, signal);
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;
}
@ -1898,7 +1904,7 @@ nm_config_reload (NMConfig *self, int signal)
if (!keyfile) {
nm_log_err (LOGD_CORE, "Failed to reload the configuration: %s", error->message);
g_clear_error (&error);
_set_config_data (self, NULL, signal);
_set_config_data (self, NULL, reload_flags);
return;
}
@ -1920,13 +1926,20 @@ nm_config_reload (NMConfig *self, int signal)
if (keyfile_intern)
g_key_file_unref (keyfile_intern);
_set_config_data (self, new_data, signal);
_set_config_data (self, new_data, reload_flags);
}
NM_UTILS_FLAGS2STR_DEFINE (nm_config_change_flags_to_string, NMConfigChangeFlags,
NM_UTILS_FLAGS2STR (NM_CONFIG_CHANGE_SIGHUP, "SIGHUP"),
NM_UTILS_FLAGS2STR (NM_CONFIG_CHANGE_SIGUSR1, "SIGUSR1"),
NM_UTILS_FLAGS2STR (NM_CONFIG_CHANGE_SIGUSR2, "SIGUSR2"),
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"),
NM_UTILS_FLAGS2STR (NM_CONFIG_CHANGE_CAUSE_NO_AUTO_DEFAULT, "NO_AUTO_DEFAULT"),
NM_UTILS_FLAGS2STR (NM_CONFIG_CHANGE_CAUSE_SET_VALUES, "SET_VALUES"),
NM_UTILS_FLAGS2STR (NM_CONFIG_CHANGE_CONFIG_FILES, "config-files"),
NM_UTILS_FLAGS2STR (NM_CONFIG_CHANGE_VALUES, "values"),
NM_UTILS_FLAGS2STR (NM_CONFIG_CHANGE_VALUES_USER, "values-user"),
@ -1939,27 +1952,19 @@ NM_UTILS_FLAGS2STR_DEFINE (nm_config_change_flags_to_string, NMConfigChangeFlags
);
static void
_set_config_data (NMConfig *self, NMConfigData *new_data, int signal)
_set_config_data (NMConfig *self, NMConfigData *new_data, NMConfigChangeFlags reload_flags)
{
NMConfigPrivate *priv = NM_CONFIG_GET_PRIVATE (self);
NMConfigData *old_data = priv->config_data;
NMConfigChangeFlags changes, changes_diff;
gboolean had_new_data = !!new_data;
switch (signal) {
case SIGHUP:
changes = NM_CONFIG_CHANGE_SIGHUP;
break;
case SIGUSR1:
changes = NM_CONFIG_CHANGE_SIGUSR1;
break;
case SIGUSR2:
changes = NM_CONFIG_CHANGE_SIGUSR2;
break;
default:
changes = NM_CONFIG_CHANGE_NONE;
break;
}
nm_assert (reload_flags);
nm_assert (!NM_FLAGS_ANY (reload_flags, ~NM_CONFIG_CHANGE_CAUSES));
nm_assert ( NM_IN_SET (reload_flags, NM_CONFIG_CHANGE_CAUSE_NO_AUTO_DEFAULT, NM_CONFIG_CHANGE_CAUSE_SET_VALUES)
|| !NM_FLAGS_ANY (reload_flags, NM_CONFIG_CHANGE_CAUSE_NO_AUTO_DEFAULT | NM_CONFIG_CHANGE_CAUSE_SET_VALUES));
changes = reload_flags;
if (new_data) {
changes_diff = nm_config_data_diff (old_data, new_data);
@ -1969,12 +1974,19 @@ _set_config_data (NMConfig *self, NMConfigData *new_data, int signal)
changes |= changes_diff;
}
if (changes == NM_CONFIG_CHANGE_NONE)
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;
}
if (new_data) {
nm_log_info (LOGD_CORE, "config: update %s (%s)", nm_config_data_get_config_description (new_data),
nm_config_change_flags_to_string (changes, NULL, 0));
nm_log_info (LOGD_CORE, "config: signal %s (%s)",
nm_config_change_flags_to_string (changes, NULL, 0),
nm_config_data_get_config_description (new_data));
nm_config_data_log (new_data, "CONFIG: ", " ", NULL);
priv->config_data = new_data;
} else if (had_new_data)

View file

@ -22,12 +22,8 @@
#ifndef __NETWORKMANAGER_CONFIG_H__
#define __NETWORKMANAGER_CONFIG_H__
#include "nm-default.h"
#include "nm-config-data.h"
G_BEGIN_DECLS
#define NM_TYPE_CONFIG (nm_config_get_type ())
#define NM_CONFIG(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), NM_TYPE_CONFIG, NMConfig))
#define NM_CONFIG_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), NM_TYPE_CONFIG, NMConfigClass))
@ -147,7 +143,7 @@ void nm_config_set_no_auto_default_for_device (NMConfig *config, NMDevice *devi
NMConfig *nm_config_new (const NMConfigCmdLineOptions *cli, char **atomic_section_prefixes, GError **error);
NMConfig *nm_config_setup (const NMConfigCmdLineOptions *cli, char **atomic_section_prefixes, GError **error);
void nm_config_reload (NMConfig *config, int signal);
void nm_config_reload (NMConfig *config, NMConfigChangeFlags reload_flags);
const NMConfigState *nm_config_state_get (NMConfig *config);
@ -186,7 +182,5 @@ gboolean nm_config_set_global_dns (NMConfig *self, NMGlobalDnsConfig *global_dns
extern guint _nm_config_match_nm_version;
extern char *_nm_config_match_env;
G_END_DECLS
#endif /* __NETWORKMANAGER_CONFIG_H__ */

View file

@ -29,6 +29,7 @@
#include <string.h>
#include <unistd.h>
#include "nm-common-macros.h"
#include "nm-bus-manager.h"
#include "nm-vpn-manager.h"
#include "nm-device.h"
@ -464,6 +465,104 @@ _config_changed_cb (NMConfig *config, NMConfigData *config_data, NMConfigChangeF
_notify (self, PROP_GLOBAL_DNS_CONFIGURATION);
}
static void
_reload_auth_cb (NMAuthChain *chain,
GError *error,
GDBusMethodInvocation *context,
gpointer user_data)
{
NMManager *self = NM_MANAGER (user_data);
NMManagerPrivate *priv = NM_MANAGER_GET_PRIVATE (self);
GError *ret_error = NULL;
NMAuthCallResult result;
guint32 flags;
NMAuthSubject *subject;
char s_buf[60];
NMConfigChangeFlags reload_type = NM_CONFIG_CHANGE_NONE;
g_assert (context);
priv->auth_chains = g_slist_remove (priv->auth_chains, chain);
flags = GPOINTER_TO_UINT (nm_auth_chain_get_data (chain, "flags"));
subject = nm_auth_chain_get_subject (chain);
result = nm_auth_chain_get_result (chain, NM_AUTH_PERMISSION_RELOAD);
if (error) {
_LOGD (LOGD_CORE, "Reload request failed: %s", error->message);
ret_error = g_error_new (NM_MANAGER_ERROR,
NM_MANAGER_ERROR_PERMISSION_DENIED,
"Reload request failed: %s",
error->message);
} else if (result != NM_AUTH_CALL_RESULT_YES) {
ret_error = g_error_new_literal (NM_MANAGER_ERROR,
NM_MANAGER_ERROR_PERMISSION_DENIED,
"Not authorized to reload configuration");
} 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,
nm_sprintf_buf (s_buf, "%u", flags),
ret_error == NULL, subject,
ret_error ? ret_error->message : NULL);
if (ret_error) {
g_dbus_method_invocation_take_error (context, ret_error);
goto out;
}
nm_config_reload (priv->config, reload_type);
g_dbus_method_invocation_return_value (context, NULL);
out:
nm_auth_chain_unref (chain);
}
static void
impl_manager_reload (NMManager *self,
GDBusMethodInvocation *context,
guint32 flags)
{
NMManagerPrivate *priv;
NMAuthChain *chain;
GError *error = NULL;
g_return_if_fail (NM_IS_MANAGER (self));
priv = NM_MANAGER_GET_PRIVATE (self);
chain = nm_auth_chain_new_context (context, _reload_auth_cb, self);
if (!chain) {
error = g_error_new_literal (NM_MANAGER_ERROR,
NM_MANAGER_ERROR_PERMISSION_DENIED,
"Unable to authenticate request");
g_dbus_method_invocation_take_error (context, error);
return;
}
priv->auth_chains = g_slist_append (priv->auth_chains, chain);
nm_auth_chain_set_data (chain, "flags", GUINT_TO_POINTER (flags), NULL);
nm_auth_chain_add_call (chain, NM_AUTH_PERMISSION_RELOAD, TRUE);
}
/************************************************************************/
static NMDevice *
@ -4312,6 +4411,7 @@ get_permissions_done_cb (NMAuthChain *chain,
get_perm_add_result (self, chain, &results, NM_AUTH_PERMISSION_SETTINGS_MODIFY_SYSTEM);
get_perm_add_result (self, chain, &results, NM_AUTH_PERMISSION_SETTINGS_MODIFY_OWN);
get_perm_add_result (self, chain, &results, NM_AUTH_PERMISSION_SETTINGS_MODIFY_HOSTNAME);
get_perm_add_result (self, chain, &results, NM_AUTH_PERMISSION_RELOAD);
g_dbus_method_invocation_return_value (context,
g_variant_new ("(a{ss})", &results));
@ -4349,6 +4449,7 @@ impl_manager_get_permissions (NMManager *self,
nm_auth_chain_add_call (chain, NM_AUTH_PERMISSION_SETTINGS_MODIFY_SYSTEM, FALSE);
nm_auth_chain_add_call (chain, NM_AUTH_PERMISSION_SETTINGS_MODIFY_OWN, FALSE);
nm_auth_chain_add_call (chain, NM_AUTH_PERMISSION_SETTINGS_MODIFY_HOSTNAME, FALSE);
nm_auth_chain_add_call (chain, NM_AUTH_PERMISSION_RELOAD, FALSE);
}
static void
@ -5818,6 +5919,7 @@ nm_manager_class_init (NMManagerClass *manager_class)
nm_exported_object_class_add_interface (NM_EXPORTED_OBJECT_CLASS (manager_class),
NMDBUS_TYPE_MANAGER_SKELETON,
"Reload", impl_manager_reload,
"GetDevices", impl_manager_get_devices,
"GetAllDevices", impl_manager_get_all_devices,
"GetDeviceByIpIface", impl_manager_get_device_by_ip_iface,

View file

@ -20,11 +20,13 @@
#include "nm-default.h"
#include "nm-agent-manager.h"
#include <string.h>
#include <pwd.h>
#include "nm-common-macros.h"
#include "nm-dbus-interface.h"
#include "nm-agent-manager.h"
#include "nm-secret-agent.h"
#include "nm-auth-utils.h"
#include "nm-setting-vpn.h"

View file

@ -21,7 +21,7 @@
#ifndef __NETWORKMANAGER_AGENT_MANAGER_H__
#define __NETWORKMANAGER_AGENT_MANAGER_H__
#include <nm-connection.h>
#include "nm-connection.h"
#include "nm-exported-object.h"
#include "nm-secret-agent.h"

View file

@ -21,10 +21,12 @@
#include "nm-default.h"
#include "nm-settings-connection.h"
#include <string.h>
#include "nm-common-macros.h"
#include "nm-dbus-interface.h"
#include "nm-settings-connection.h"
#include "nm-session-monitor.h"
#include "nm-auth-utils.h"
#include "nm-auth-subject.h"

View file

@ -38,6 +38,7 @@
#include <selinux/selinux.h>
#endif
#include "nm-common-macros.h"
#include "nm-dbus-interface.h"
#include "nm-connection.h"
#include "nm-setting-8021x.h"

View file

@ -942,8 +942,8 @@ config_changed_cb (NMConfig *config,
* On SIGHUP and SIGUSR1 try to re-connect to D-Bus. So in the unlikely
* event that the D-Bus conneciton is broken, that allows for recovery
* without need for restarting NetworkManager. */
if ( NM_FLAGS_HAS (changes, NM_CONFIG_CHANGE_SIGHUP)
|| NM_FLAGS_HAS (changes, NM_CONFIG_CHANGE_SIGUSR1)) {
if (NM_FLAGS_ANY (changes, NM_CONFIG_CHANGE_CAUSE_SIGHUP
| NM_CONFIG_CHANGE_CAUSE_SIGUSR1)) {
if (!SETTINGS_PLUGIN_IFCFG_GET_PRIVATE (self)->dbus.connection)
_dbus_setup (self);
}

View file

@ -343,7 +343,7 @@ test_config_no_auto_default (void)
g_assert (!nm_config_get_no_auto_default_for_device (config, dev3));
g_assert (nm_config_get_no_auto_default_for_device (config, dev4));
g_test_expect_message ("NetworkManager", G_LOG_LEVEL_INFO, "*config: update * (no-auto-default)*");
g_test_expect_message ("NetworkManager", G_LOG_LEVEL_INFO, "*config: signal NO_AUTO_DEFAULT,no-auto-default *");
nm_config_set_no_auto_default_for_device (config, dev3);
g_test_assert_expected_messages ();
@ -511,9 +511,9 @@ _set_values_config_changed_cb (NMConfig *config,
g_assert (config_changed_data);
g_assert (config_changed_data->changes == NM_CONFIG_CHANGE_NONE);
if (changes == NM_CONFIG_CHANGE_SIGHUP)
if (changes == NM_CONFIG_CHANGE_CAUSE_SIGHUP)
return;
changes &= ~NM_CONFIG_CHANGE_SIGHUP;
changes &= ~NM_CONFIG_CHANGE_CAUSE_SIGHUP;
config_changed_data->changes = changes;
@ -556,11 +556,11 @@ _set_values_user (NMConfig *config,
config_data_before = g_object_ref (nm_config_get_data (config));
if (expected_changes != NM_CONFIG_CHANGE_NONE)
g_test_expect_message ("NetworkManager", G_LOG_LEVEL_INFO, "*config: update *");
g_test_expect_message ("NetworkManager", G_LOG_LEVEL_INFO, "*config: signal *");
else
g_test_expect_message ("NetworkManager", G_LOG_LEVEL_INFO, "*config: signal SIGHUP (no changes from disk)*");
nm_config_reload (config, SIGHUP);
nm_config_reload (config, NM_CONFIG_CHANGE_CAUSE_SIGHUP);
g_test_assert_expected_messages ();
@ -600,7 +600,7 @@ _set_values_intern (NMConfig *config,
&config_changed_data);
if (expected_changes != NM_CONFIG_CHANGE_NONE)
g_test_expect_message ("NetworkManager", G_LOG_LEVEL_INFO, "*config: update *");
g_test_expect_message ("NetworkManager", G_LOG_LEVEL_INFO, "*config: signal *");
nm_config_set_values (config, keyfile_intern, TRUE, FALSE);
@ -649,14 +649,14 @@ static void
_set_values_intern_internal_set (NMConfig *config, gboolean set_user, GKeyFile *keyfile, NMConfigChangeFlags *out_expected_changes)
{
g_key_file_set_string (keyfile, NM_CONFIG_KEYFILE_GROUPPREFIX_INTERN"section1", "key", "internal-section");
*out_expected_changes = NM_CONFIG_CHANGE_VALUES | NM_CONFIG_CHANGE_VALUES_INTERN;
*out_expected_changes = NM_CONFIG_CHANGE_CAUSE_SET_VALUES | NM_CONFIG_CHANGE_VALUES | NM_CONFIG_CHANGE_VALUES_INTERN;
}
static void
_set_values_intern_internal_check (NMConfig *config, NMConfigData *config_data, gboolean is_change_event, NMConfigChangeFlags changes, NMConfigData *old_data)
{
if (is_change_event)
g_assert (changes == (NM_CONFIG_CHANGE_VALUES | NM_CONFIG_CHANGE_VALUES_INTERN));
g_assert (changes == (NM_CONFIG_CHANGE_CAUSE_SET_VALUES | NM_CONFIG_CHANGE_VALUES | NM_CONFIG_CHANGE_VALUES_INTERN));
assert_config_value (config_data, NM_CONFIG_KEYFILE_GROUPPREFIX_INTERN"section1", "key", "internal-section");
}
@ -690,14 +690,14 @@ _set_values_intern_atomic_section_1_set (NMConfig *config, gboolean set_user, GK
g_key_file_set_string (keyfile, "atomic-prefix-1.section-a", "key3", "intern-value3");
g_key_file_set_string (keyfile, "non-atomic-prefix-1.section-a", "nap1-key1", "intern-value1");
g_key_file_set_string (keyfile, "non-atomic-prefix-1.section-a", "nap1-key3", "intern-value3");
*out_expected_changes = NM_CONFIG_CHANGE_VALUES | NM_CONFIG_CHANGE_VALUES_INTERN;
*out_expected_changes = NM_CONFIG_CHANGE_CAUSE_SET_VALUES | NM_CONFIG_CHANGE_VALUES | NM_CONFIG_CHANGE_VALUES_INTERN;
}
static void
_set_values_intern_atomic_section_1_check (NMConfig *config, NMConfigData *config_data, gboolean is_change_event, NMConfigChangeFlags changes, NMConfigData *old_data)
{
if (is_change_event)
g_assert (changes == (NM_CONFIG_CHANGE_VALUES | NM_CONFIG_CHANGE_VALUES_INTERN));
g_assert (changes == (NM_CONFIG_CHANGE_CAUSE_SET_VALUES | NM_CONFIG_CHANGE_VALUES | NM_CONFIG_CHANGE_VALUES_INTERN));
assert_config_value (config_data, "atomic-prefix-1.section-a", "key1", "intern-value1");
assert_config_value (config_data, "atomic-prefix-1.section-a", "key2", NULL);
assert_config_value (config_data, "atomic-prefix-1.section-a", "key3", "intern-value3");
@ -744,14 +744,14 @@ _set_values_intern_atomic_section_2_set (NMConfig *config, gboolean set_user, GK
g_key_file_set_string (keyfile, "non-atomic-prefix-1.section-a", "nap1-key3", "intern-value3");
g_key_file_set_string (keyfile, NM_CONFIG_KEYFILE_GROUPPREFIX_INTERN"with-whitespace", "key1", " b c\\, d ");
g_key_file_set_value (keyfile, NM_CONFIG_KEYFILE_GROUPPREFIX_INTERN"with-whitespace", "key2", " b c\\, d ");
*out_expected_changes = NM_CONFIG_CHANGE_VALUES | NM_CONFIG_CHANGE_VALUES_INTERN;
*out_expected_changes = NM_CONFIG_CHANGE_CAUSE_SET_VALUES | NM_CONFIG_CHANGE_VALUES | NM_CONFIG_CHANGE_VALUES_INTERN;
}
static void
_set_values_intern_atomic_section_2_check (NMConfig *config, NMConfigData *config_data, gboolean is_change_event, NMConfigChangeFlags changes, NMConfigData *old_data)
{
if (is_change_event)
g_assert (changes == (NM_CONFIG_CHANGE_VALUES | NM_CONFIG_CHANGE_VALUES_INTERN));
g_assert (changes == (NM_CONFIG_CHANGE_CAUSE_SET_VALUES | NM_CONFIG_CHANGE_VALUES | NM_CONFIG_CHANGE_VALUES_INTERN));
g_assert (!nm_config_data_has_group (config_data, "atomic-prefix-1.section-a"));
assert_config_value (config_data, "atomic-prefix-1.section-b", "key1", "user-value1");
assert_config_value (config_data, "non-atomic-prefix-1.section-a", "nap1-key1", NULL);
@ -862,17 +862,17 @@ test_config_signal (void)
G_CALLBACK (_test_signal_config_changed_cb),
&expected);
expected = NM_CONFIG_CHANGE_SIGUSR1;
expected = NM_CONFIG_CHANGE_CAUSE_SIGUSR1;
g_test_expect_message ("NetworkManager", G_LOG_LEVEL_INFO, "*config: signal SIGUSR1");
nm_config_reload (config, SIGUSR1);
nm_config_reload (config, expected);
expected = NM_CONFIG_CHANGE_SIGUSR2;
expected = NM_CONFIG_CHANGE_CAUSE_SIGUSR2;
g_test_expect_message ("NetworkManager", G_LOG_LEVEL_INFO, "*config: signal SIGUSR2");
nm_config_reload (config, SIGUSR2);
nm_config_reload (config, expected);
expected = NM_CONFIG_CHANGE_SIGHUP;
expected = NM_CONFIG_CHANGE_CAUSE_SIGHUP;
g_test_expect_message ("NetworkManager", G_LOG_LEVEL_INFO, "*config: signal SIGHUP (no changes from disk)*");
nm_config_reload (config, SIGHUP);
nm_config_reload (config, expected);
/* test with subscribing two signals...
@ -883,9 +883,9 @@ test_config_signal (void)
NM_CONFIG_SIGNAL_CONFIG_CHANGED,
G_CALLBACK (_test_signal_config_changed_cb2),
&expected);
expected = NM_CONFIG_CHANGE_SIGUSR2;
expected = NM_CONFIG_CHANGE_CAUSE_SIGUSR2;
g_test_expect_message ("NetworkManager", G_LOG_LEVEL_INFO, "*config: signal SIGUSR2");
nm_config_reload (config, SIGUSR2);
nm_config_reload (config, NM_CONFIG_CHANGE_CAUSE_SIGUSR2);
g_signal_handlers_disconnect_by_func (config, _test_signal_config_changed_cb2, &expected);

View file

@ -783,7 +783,10 @@ class NetworkManager(ExportedObj):
"org.freedesktop.NetworkManager.wifi.share.open": "yes",
"org.freedesktop.NetworkManager.settings.modify.own": "yes",
"org.freedesktop.NetworkManager.settings.modify.system": "yes",
"org.freedesktop.NetworkManager.settings.modify.hostname": "yes" }
"org.freedesktop.NetworkManager.settings.modify.hostname": "yes",
"org.freedesktop.NetworkManager.settings.modify.global-dns": "no",
"org.freedesktop.NetworkManager.reload": "no",
}
@dbus.service.method(dbus_interface=IFACE_NM, in_signature='ss', out_signature='')
def SetLogging(self, level, domains):