diff --git a/NEWS b/NEWS index 5c4af6a44..63019ee65 100644 --- a/NEWS +++ b/NEWS @@ -16,6 +16,10 @@ USE AT YOUR OWN RISK. NOT RECOMMENDED FOR PRODUCTION USE! configuration file. * Added support for configuring fq_codel line discipline and mirred action. * Added a possibility for distributions to ship dispatcher scripts in /usr/lib. +* Drop deprecated setting "main.monitor-connection-files" in NetworkManager.conf. + This setting has no more effect and was disabled by default for a long time. + Instead, after changes load files explicitly with `nmcli connection load` and + `nmcli connection reload`. ============================================= NetworkManager-1.18 diff --git a/man/NetworkManager.conf.xml b/man/NetworkManager.conf.xml index fc02af4fa..ec49fcdb8 100644 --- a/man/NetworkManager.conf.xml +++ b/man/NetworkManager.conf.xml @@ -153,29 +153,7 @@ plugins-=remove-me monitor-connection-files - Whether the configured settings plugin(s) - should set up file monitors and immediately pick up changes - made to connection files while NetworkManager is running. This - is disabled by default; NetworkManager will only read - the connection files at startup, and when explicitly requested - via the ReloadConnections D-Bus call. If this key is set to - 'true', then NetworkManager will reload - connection files any time they changed. - Automatic reloading is not advised because there are race conditions - involved and it depends on the way how the editor updates the file. - In some situations, NetworkManager might first delete and add the - connection anew, instead of updating the existing one. Also, NetworkManager - might pick up incomplete settings while the user is still editing the files. - - Note that neither this setting nor restarting the NetworkManager daemon - is the advised way to reload connection profiles from disk. Instead, after - modifying the files reload them with nmcli connection reload - or nmcli connection load "$FILENAME". Even better, - instead of modifying files directly, use NetworkManager tools like - nmcli, nmtui or the GUI. - - This setting is deprecated and will have no effect in the future. - + This setting is deprecated and has no effect. auth-polkit diff --git a/src/nm-config.c b/src/nm-config.c index 8262d7872..eff77647b 100644 --- a/src/nm-config.c +++ b/src/nm-config.c @@ -100,8 +100,6 @@ typedef struct { char *no_auto_default_file; char *intern_config_file; - gboolean monitor_connection_files; - char *log_level; char *log_domains; @@ -313,14 +311,6 @@ nm_config_get_data_orig (NMConfig *config) return NM_CONFIG_GET_PRIVATE (config)->config_data_orig; } -gboolean -nm_config_get_monitor_connection_files (NMConfig *config) -{ - g_return_val_if_fail (config != NULL, FALSE); - - return NM_CONFIG_GET_PRIVATE (config)->monitor_connection_files; -} - const char * nm_config_get_log_level (NMConfig *config) { @@ -2804,10 +2794,6 @@ init_sync (GInitable *initable, GCancellable *cancellable, GError **error) else priv->no_auto_default_file = g_strdup (DEFAULT_NO_AUTO_DEFAULT_FILE); - priv->monitor_connection_files = nm_config_keyfile_get_boolean (keyfile, - NM_CONFIG_KEYFILE_GROUP_MAIN, - NM_CONFIG_KEYFILE_KEY_MAIN_MONITOR_CONNECTION_FILES, - FALSE); priv->log_level = nm_strstrip (g_key_file_get_string (keyfile, NM_CONFIG_KEYFILE_GROUP_LOGGING, NM_CONFIG_KEYFILE_KEY_LOGGING_LEVEL, diff --git a/src/nm-config.h b/src/nm-config.h index 66f1b69c0..1fa2fa5b7 100644 --- a/src/nm-config.h +++ b/src/nm-config.h @@ -157,7 +157,6 @@ NMConfigData *nm_config_get_data_orig (NMConfig *config); #define NM_CONFIG_GET_DATA (nm_config_get_data (nm_config_get ())) #define NM_CONFIG_GET_DATA_ORIG (nm_config_get_data_orig (nm_config_get ())) -gboolean nm_config_get_monitor_connection_files (NMConfig *config); const char *nm_config_get_log_level (NMConfig *config); const char *nm_config_get_log_domains (NMConfig *config); NMConfigConfigureAndQuitType nm_config_get_configure_and_quit (NMConfig *config); diff --git a/src/settings/plugins/ifcfg-rh/nms-ifcfg-rh-connection.c b/src/settings/plugins/ifcfg-rh/nms-ifcfg-rh-connection.c index 4f769c5f7..c622c3266 100644 --- a/src/settings/plugins/ifcfg-rh/nms-ifcfg-rh-connection.c +++ b/src/settings/plugins/ifcfg-rh/nms-ifcfg-rh-connection.c @@ -41,7 +41,6 @@ #include "nms-ifcfg-rh-reader.h" #include "nms-ifcfg-rh-writer.h" #include "nms-ifcfg-rh-utils.h" -#include "nm-inotify-helper.h" /*****************************************************************************/ @@ -50,34 +49,12 @@ NM_GOBJECT_PROPERTIES_DEFINE_BASE ( PROP_UNRECOGNIZED_SPEC, ); -enum { - IFCFG_CHANGED, - LAST_SIGNAL -}; - -static guint signals[LAST_SIGNAL] = { 0 }; - typedef struct { - gulong ih_event_id; - - int file_wd; - - char *keyfile; - int keyfile_wd; - - char *routefile; - int routefile_wd; - - char *route6file; - int route6file_wd; - char *unmanaged_spec; char *unrecognized_spec; gulong devtimeout_link_changed_handler; guint devtimeout_timeout_id; - - NMInotifyHelper *inotify_helper; } NMIfcfgConnectionPrivate; struct _NMIfcfgConnection { @@ -193,76 +170,6 @@ nm_ifcfg_connection_check_devtimeout (NMIfcfgConnection *self) priv->devtimeout_timeout_id = g_timeout_add_seconds (devtimeout, devtimeout_expired, self); } -static void -files_changed_cb (NMInotifyHelper *ih, - struct inotify_event *evt, - const char *path, - gpointer user_data) -{ - NMIfcfgConnection *self = NM_IFCFG_CONNECTION (user_data); - NMIfcfgConnectionPrivate *priv = NM_IFCFG_CONNECTION_GET_PRIVATE (self); - - if ( (evt->wd != priv->file_wd) - && (evt->wd != priv->keyfile_wd) - && (evt->wd != priv->routefile_wd) - && (evt->wd != priv->route6file_wd)) - return; - - /* push the event up to the plugin */ - g_signal_emit (self, signals[IFCFG_CHANGED], 0); -} - -static void -path_watch_stop (NMIfcfgConnection *self) -{ - NMIfcfgConnectionPrivate *priv = NM_IFCFG_CONNECTION_GET_PRIVATE (self); - - nm_clear_g_signal_handler (priv->inotify_helper, &priv->ih_event_id); - - nm_inotify_helper_clear_watch (priv->inotify_helper, &priv->file_wd); - nm_inotify_helper_clear_watch (priv->inotify_helper, &priv->keyfile_wd); - nm_inotify_helper_clear_watch (priv->inotify_helper, &priv->routefile_wd); - nm_inotify_helper_clear_watch (priv->inotify_helper, &priv->route6file_wd); - - nm_clear_g_free (&priv->keyfile); - nm_clear_g_free (&priv->routefile); - nm_clear_g_free (&priv->route6file); -} - -static void -filename_changed (GObject *object, - GParamSpec *pspec, - gpointer user_data) -{ - NMIfcfgConnection *self = NM_IFCFG_CONNECTION (object); - NMIfcfgConnectionPrivate *priv = NM_IFCFG_CONNECTION_GET_PRIVATE (self); - const char *ifcfg_path; - - path_watch_stop (self); - - ifcfg_path = nm_settings_connection_get_filename (NM_SETTINGS_CONNECTION (self)); - if (!ifcfg_path) - return; - - priv->keyfile = utils_get_keys_path (ifcfg_path); - priv->routefile = utils_get_route_path (ifcfg_path); - priv->route6file = utils_get_route6_path (ifcfg_path); - - if (nm_config_get_monitor_connection_files (nm_config_get ())) { - NMInotifyHelper *ih; - - if (!priv->inotify_helper) - priv->inotify_helper = g_object_ref (nm_inotify_helper_get ()); - ih = priv->inotify_helper; - - priv->ih_event_id = g_signal_connect (ih, "event", G_CALLBACK (files_changed_cb), self); - priv->file_wd = nm_inotify_helper_add_watch (ih, ifcfg_path); - priv->keyfile_wd = nm_inotify_helper_add_watch (ih, priv->keyfile); - priv->routefile_wd = nm_inotify_helper_add_watch (ih, priv->routefile); - priv->route6file_wd = nm_inotify_helper_add_watch (ih, priv->route6file); - } -} - const char * nm_ifcfg_connection_get_unmanaged_spec (NMIfcfgConnection *self) { @@ -326,18 +233,21 @@ static gboolean delete (NMSettingsConnection *connection, GError **error) { - NMIfcfgConnectionPrivate *priv = NM_IFCFG_CONNECTION_GET_PRIVATE ((NMIfcfgConnection *) connection); const char *filename; filename = nm_settings_connection_get_filename (connection); if (filename) { + gs_free char *keyfile = utils_get_keys_path (filename); + gs_free char *routefile = utils_get_route_path (filename); + gs_free char *route6file = utils_get_route6_path (filename); + g_unlink (filename); - if (priv->keyfile) - g_unlink (priv->keyfile); - if (priv->routefile) - g_unlink (priv->routefile); - if (priv->route6file) - g_unlink (priv->route6file); + if (keyfile) + g_unlink (keyfile); + if (routefile) + g_unlink (routefile); + if (route6file) + g_unlink (route6file); } return TRUE; @@ -386,17 +296,8 @@ set_property (GObject *object, guint prop_id, /*****************************************************************************/ static void -nm_ifcfg_connection_init (NMIfcfgConnection *connection) +nm_ifcfg_connection_init (NMIfcfgConnection *self) { - NMIfcfgConnectionPrivate *priv = NM_IFCFG_CONNECTION_GET_PRIVATE (connection); - - priv->file_wd = -1; - priv->keyfile_wd = -1; - priv->routefile_wd = -1; - priv->route6file_wd = -1; - - g_signal_connect (connection, "notify::" NM_SETTINGS_CONNECTION_FILENAME, - G_CALLBACK (filename_changed), NULL); } NMIfcfgConnection * @@ -460,13 +361,9 @@ dispose (GObject *object) { NMIfcfgConnectionPrivate *priv = NM_IFCFG_CONNECTION_GET_PRIVATE ((NMIfcfgConnection *) object); - path_watch_stop (NM_IFCFG_CONNECTION (object)); - nm_clear_g_signal_handler (NM_PLATFORM_GET, &priv->devtimeout_link_changed_handler); nm_clear_g_source (&priv->devtimeout_timeout_id); - g_clear_object (&priv->inotify_helper); - g_clear_pointer (&priv->unmanaged_spec, g_free); g_clear_pointer (&priv->unrecognized_spec, g_free); @@ -499,13 +396,4 @@ nm_ifcfg_connection_class_init (NMIfcfgConnectionClass *ifcfg_connection_class) G_PARAM_STATIC_STRINGS); g_object_class_install_properties (object_class, _PROPERTY_ENUMS_LAST, obj_properties); - - signals[IFCFG_CHANGED] = - g_signal_new ("ifcfg-changed", - G_OBJECT_CLASS_TYPE (object_class), - G_SIGNAL_RUN_LAST, - 0, NULL, NULL, - g_cclosure_marshal_VOID__VOID, - G_TYPE_NONE, 0); } - diff --git a/src/settings/plugins/ifcfg-rh/nms-ifcfg-rh-plugin.c b/src/settings/plugins/ifcfg-rh/nms-ifcfg-rh-plugin.c index 87f4b72da..99a45cebb 100644 --- a/src/settings/plugins/ifcfg-rh/nms-ifcfg-rh-plugin.c +++ b/src/settings/plugins/ifcfg-rh/nms-ifcfg-rh-plugin.c @@ -61,10 +61,8 @@ typedef struct { } dbus; GHashTable *connections; /* uuid::connection */ - gboolean initialized; - GFileMonitor *ifcfg_monitor; - gulong ifcfg_monitor_id; + bool initialized:1; } SettingsPluginIfcfgPrivate; struct _SettingsPluginIfcfg { @@ -109,26 +107,6 @@ static NMIfcfgConnection *update_connection (SettingsPluginIfcfg *plugin, /*****************************************************************************/ -static void -connection_ifcfg_changed (NMIfcfgConnection *connection, gpointer user_data) -{ - SettingsPluginIfcfg *self = SETTINGS_PLUGIN_IFCFG (user_data); - SettingsPluginIfcfgPrivate *priv = SETTINGS_PLUGIN_IFCFG_GET_PRIVATE (self); - const char *path; - - path = nm_settings_connection_get_filename (NM_SETTINGS_CONNECTION (connection)); - g_return_if_fail (path != NULL); - - if (!priv->ifcfg_monitor) { - _LOGD ("connection_ifcfg_changed("NM_IFCFG_CONNECTION_LOG_FMTD"): %s", NM_IFCFG_CONNECTION_LOG_ARGD (connection), "ignore event"); - return; - } - - _LOGD ("connection_ifcfg_changed("NM_IFCFG_CONNECTION_LOG_FMTD"): %s", NM_IFCFG_CONNECTION_LOG_ARGD (connection), "reload"); - - update_connection (self, NULL, path, connection, TRUE, NULL, NULL); -} - static void connection_removed_cb (NMSettingsConnection *obj, gpointer user_data) { @@ -386,10 +364,6 @@ update_connection (SettingsPluginIfcfg *self, } else if (nm_ifcfg_connection_get_unrecognized_spec (connection_new)) _LOGW ("Ignoring connection "NM_IFCFG_CONNECTION_LOG_FMT" of unrecognized type.", NM_IFCFG_CONNECTION_LOG_ARG (connection_new)); - /* watch changes of ifcfg hardlinks */ - g_signal_connect (G_OBJECT (connection_new), "ifcfg-changed", - G_CALLBACK (connection_ifcfg_changed), self); - if (!source) { /* Only raise the signal if we were called without source, i.e. if we read the connection from file. * Otherwise, we were called by add_connection() which does not expect the signal. */ @@ -406,59 +380,6 @@ update_connection (SettingsPluginIfcfg *self, } } -static void -ifcfg_dir_changed (GFileMonitor *monitor, - GFile *file, - GFile *other_file, - GFileMonitorEvent event_type, - gpointer user_data) -{ - SettingsPluginIfcfg *plugin = SETTINGS_PLUGIN_IFCFG (user_data); - char *path, *ifcfg_path; - NMIfcfgConnection *connection; - - path = g_file_get_path (file); - - ifcfg_path = utils_detect_ifcfg_path (path, FALSE); - _LOGD ("ifcfg_dir_changed(%s) = %d // %s", path, event_type, ifcfg_path ?: "(none)"); - if (ifcfg_path) { - connection = find_by_path (plugin, ifcfg_path); - switch (event_type) { - case G_FILE_MONITOR_EVENT_DELETED: - if (connection) - remove_connection (plugin, connection); - break; - case G_FILE_MONITOR_EVENT_CREATED: - case G_FILE_MONITOR_EVENT_CHANGES_DONE_HINT: - /* Update or new */ - update_connection (plugin, NULL, ifcfg_path, connection, TRUE, NULL, NULL); - break; - default: - break; - } - g_free (ifcfg_path); - } - g_free (path); -} - -static void -setup_ifcfg_monitoring (SettingsPluginIfcfg *plugin) -{ - SettingsPluginIfcfgPrivate *priv = SETTINGS_PLUGIN_IFCFG_GET_PRIVATE (plugin); - GFile *file; - GFileMonitor *monitor; - - file = g_file_new_for_path (IFCFG_DIR "/"); - monitor = g_file_monitor_directory (file, G_FILE_MONITOR_NONE, NULL, NULL); - g_object_unref (file); - - if (monitor) { - priv->ifcfg_monitor_id = g_signal_connect (monitor, "changed", - G_CALLBACK (ifcfg_dir_changed), plugin); - priv->ifcfg_monitor = monitor; - } -} - static GHashTable * _paths_from_connections (GHashTable *connections) { @@ -578,8 +499,6 @@ get_connections (NMSettingsPlugin *config) NMIfcfgConnection *connection; if (!priv->initialized) { - if (nm_config_get_monitor_connection_files (nm_config_get ())) - setup_ifcfg_monitoring (plugin); read_connections (plugin); priv->initialized = TRUE; } @@ -1041,14 +960,6 @@ dispose (GObject *object) priv->connections = NULL; } - if (priv->ifcfg_monitor) { - if (priv->ifcfg_monitor_id) - g_signal_handler_disconnect (priv->ifcfg_monitor, priv->ifcfg_monitor_id); - - g_file_monitor_cancel (priv->ifcfg_monitor); - g_object_unref (priv->ifcfg_monitor); - } - G_OBJECT_CLASS (settings_plugin_ifcfg_parent_class)->dispose (object); } diff --git a/src/settings/plugins/keyfile/nms-keyfile-plugin.c b/src/settings/plugins/keyfile/nms-keyfile-plugin.c index c13cc1ff9..c0bc37b42 100644 --- a/src/settings/plugins/keyfile/nms-keyfile-plugin.c +++ b/src/settings/plugins/keyfile/nms-keyfile-plugin.c @@ -48,8 +48,6 @@ typedef struct { GHashTable *connections; /* uuid::connection */ gboolean initialized; - GFileMonitor *monitor; - gulong monitor_id; NMConfig *config; } NMSKeyfilePluginPrivate; @@ -297,47 +295,6 @@ update_connection (NMSKeyfilePlugin *self, } } -static void -dir_changed (GFileMonitor *monitor, - GFile *file, - GFile *other_file, - GFileMonitorEvent event_type, - gpointer user_data) -{ - NMSettingsPlugin *config = NM_SETTINGS_PLUGIN (user_data); - NMSKeyfilePlugin *self = NMS_KEYFILE_PLUGIN (config); - NMSKeyfileConnection *connection; - char *full_path; - gboolean exists; - - full_path = g_file_get_path (file); - if (nm_keyfile_utils_ignore_filename (full_path, FALSE)) { - g_free (full_path); - return; - } - exists = g_file_test (full_path, G_FILE_TEST_EXISTS); - - _LOGD ("dir_changed(%s) = %d; file %s", full_path, event_type, exists ? "exists" : "does not exist"); - - connection = find_by_path (self, full_path); - - switch (event_type) { - case G_FILE_MONITOR_EVENT_DELETED: - if (!exists && connection) - remove_connection (NMS_KEYFILE_PLUGIN (config), connection); - break; - case G_FILE_MONITOR_EVENT_CREATED: - case G_FILE_MONITOR_EVENT_CHANGES_DONE_HINT: - if (exists) - update_connection (NMS_KEYFILE_PLUGIN (config), NULL, full_path, connection, TRUE, NULL, NULL); - break; - default: - break; - } - - g_free (full_path); -} - static void config_changed_cb (NMConfig *config, NMConfigData *config_data, @@ -355,30 +312,6 @@ config_changed_cb (NMConfig *config, _nm_settings_plugin_emit_signal_unmanaged_specs_changed (NM_SETTINGS_PLUGIN (self)); } -static void -setup_monitoring (NMSettingsPlugin *config) -{ - NMSKeyfilePluginPrivate *priv = NMS_KEYFILE_PLUGIN_GET_PRIVATE ((NMSKeyfilePlugin *) config); - GFile *file; - GFileMonitor *monitor; - - if (nm_config_get_monitor_connection_files (priv->config)) { - file = g_file_new_for_path (nms_keyfile_utils_get_path ()); - monitor = g_file_monitor_directory (file, G_FILE_MONITOR_NONE, NULL, NULL); - g_object_unref (file); - - if (monitor) { - priv->monitor_id = g_signal_connect (monitor, "changed", G_CALLBACK (dir_changed), config); - priv->monitor = monitor; - } - } - - g_signal_connect (G_OBJECT (priv->config), - NM_CONFIG_SIGNAL_CONFIG_CHANGED, - G_CALLBACK (config_changed_cb), - config); -} - static GHashTable * _paths_from_connections (GHashTable *connections) { @@ -504,7 +437,6 @@ get_connections (NMSettingsPlugin *config) NMSKeyfilePluginPrivate *priv = NMS_KEYFILE_PLUGIN_GET_PRIVATE ((NMSKeyfilePlugin *) config); if (!priv->initialized) { - setup_monitoring (config); read_connections (config); priv->initialized = TRUE; } @@ -590,7 +522,8 @@ nms_keyfile_plugin_init (NMSKeyfilePlugin *plugin) static void constructed (GObject *object) { - NMSKeyfilePluginPrivate *priv = NMS_KEYFILE_PLUGIN_GET_PRIVATE ((NMSKeyfilePlugin *) object); + NMSKeyfilePlugin *self = NMS_KEYFILE_PLUGIN (object); + NMSKeyfilePluginPrivate *priv = NMS_KEYFILE_PLUGIN_GET_PRIVATE (self); G_OBJECT_CLASS (nms_keyfile_plugin_parent_class)->constructed (object); @@ -599,6 +532,17 @@ constructed (GObject *object) NM_CONFIG_KEYFILE_KEY_KEYFILE_HOSTNAME, NM_CONFIG_GET_VALUE_RAW)) _LOGW ("'hostname' option is deprecated and has no effect"); + + if (nm_config_data_has_value (nm_config_get_data_orig (priv->config), + NM_CONFIG_KEYFILE_GROUP_MAIN, + NM_CONFIG_KEYFILE_KEY_MAIN_MONITOR_CONNECTION_FILES, + NM_CONFIG_GET_VALUE_RAW)) + _LOGW ("'monitor-connection-files' option is deprecated and has no effect"); + + g_signal_connect (G_OBJECT (priv->config), + NM_CONFIG_SIGNAL_CONFIG_CHANGED, + G_CALLBACK (config_changed_cb), + self); } NMSKeyfilePlugin * @@ -612,13 +556,6 @@ dispose (GObject *object) { NMSKeyfilePluginPrivate *priv = NMS_KEYFILE_PLUGIN_GET_PRIVATE ((NMSKeyfilePlugin *) object); - if (priv->monitor) { - nm_clear_g_signal_handler (priv->monitor, &priv->monitor_id); - - g_file_monitor_cancel (priv->monitor); - g_clear_object (&priv->monitor); - } - if (priv->connections) { g_hash_table_destroy (priv->connections); priv->connections = NULL;