mirror of
https://gitlab.freedesktop.org/NetworkManager/NetworkManager.git
synced 2025-12-20 02:20:06 +01:00
core: reject new connections if the feature is disabled or removed
If a feature like Wi-Fi, OVS, team, etc. is disabled or no longer supported, it is better to report an error when the connection is added via nmcli than accepting the connection and complaining later about a "missing plugin"; there is no plugin and the connection will never be able to activate. Example errors now: # nmcli connection add type team Error: Failed to add 'team-nm-team' connection: team support is disabled in this build # nmcli connection add type gsm Error: Failed to add 'gsm' connection: WWAN support is disabled in this build # nmcli connection add type wimax nsp 00:99:88:77:66:55 Error: Failed to add 'wimax' connection: WiMAX is no longer supported Note that we don't touch libnm-core (the part defining the settings and properties), as that defines the API of NetworkManager. The API should not change according to compile flags.
This commit is contained in:
parent
e5ae988603
commit
247000deed
6 changed files with 119 additions and 0 deletions
|
|
@ -239,6 +239,15 @@
|
||||||
/* Whether we build with OVS plugin */
|
/* Whether we build with OVS plugin */
|
||||||
#mesondefine WITH_OPENVSWITCH
|
#mesondefine WITH_OPENVSWITCH
|
||||||
|
|
||||||
|
/* Whether we build with team support */
|
||||||
|
#mesondefine WITH_TEAMDCTL
|
||||||
|
|
||||||
|
/* Whether we build with Wi-Fi support */
|
||||||
|
#mesondefine WITH_WIFI
|
||||||
|
|
||||||
|
/* Whether we build with WWAN support */
|
||||||
|
#mesondefine WITH_WWAN
|
||||||
|
|
||||||
/* Define if you have PPP support */
|
/* Define if you have PPP support */
|
||||||
#mesondefine WITH_PPP
|
#mesondefine WITH_PPP
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -327,6 +327,7 @@ config_h.set10('WITH_CONFIG_PLUGIN_IFUPDOWN', enable_ifupdown)
|
||||||
config_h.set_quoted('NM_DIST_VERSION', dist_version)
|
config_h.set_quoted('NM_DIST_VERSION', dist_version)
|
||||||
|
|
||||||
enable_wifi = get_option('wifi')
|
enable_wifi = get_option('wifi')
|
||||||
|
config_h.set10('WITH_WIFI', enable_wifi)
|
||||||
|
|
||||||
enable_iwd = get_option('iwd')
|
enable_iwd = get_option('iwd')
|
||||||
assert((not enable_iwd) or enable_wifi, 'Enabling iwd support requires Wi-Fi support as well')
|
assert((not enable_iwd) or enable_wifi, 'Enabling iwd support requires Wi-Fi support as well')
|
||||||
|
|
@ -507,6 +508,7 @@ if enable_teamdctl
|
||||||
libteamdctl_dep = dependency('libteamdctl', version: '>= 1.9')
|
libteamdctl_dep = dependency('libteamdctl', version: '>= 1.9')
|
||||||
assert(libteamdctl_dep.found(), 'You must have libteamdctl installed to build. Use -Dteamdctl=false to disable it')
|
assert(libteamdctl_dep.found(), 'You must have libteamdctl installed to build. Use -Dteamdctl=false to disable it')
|
||||||
endif
|
endif
|
||||||
|
config_h.set10('WITH_TEAMDCTL', enable_teamdctl)
|
||||||
|
|
||||||
# polkit
|
# polkit
|
||||||
enable_polkit = get_option('polkit')
|
enable_polkit = get_option('polkit')
|
||||||
|
|
@ -616,6 +618,7 @@ if enable_modem_manager
|
||||||
endif
|
endif
|
||||||
config_h.set_quoted('MOBILE_BROADBAND_PROVIDER_INFO_DATABASE', mobile_broadband_provider_info_database)
|
config_h.set_quoted('MOBILE_BROADBAND_PROVIDER_INFO_DATABASE', mobile_broadband_provider_info_database)
|
||||||
endif
|
endif
|
||||||
|
config_h.set10('WITH_WWAN', enable_modem_manager)
|
||||||
|
|
||||||
# Bluez5 DUN support
|
# Bluez5 DUN support
|
||||||
enable_bluez5_dun = get_option('bluez5_dun')
|
enable_bluez5_dun = get_option('bluez5_dun')
|
||||||
|
|
|
||||||
|
|
@ -5474,3 +5474,96 @@ nm_utils_shorten_hostname(const char *hostname, char **shortened)
|
||||||
*shortened = g_steal_pointer(&s);
|
*shortened = g_steal_pointer(&s);
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* nm_utils_connection_supported:
|
||||||
|
* @connection: the connection
|
||||||
|
* @error: on return, the reason why the connection in not supported
|
||||||
|
*
|
||||||
|
* Returns whether the given connection is supported by this version
|
||||||
|
* of NetworkManager.
|
||||||
|
*/
|
||||||
|
gboolean
|
||||||
|
nm_utils_connection_supported(NMConnection *connection, GError **error)
|
||||||
|
{
|
||||||
|
const char *type;
|
||||||
|
const char *feature = NULL;
|
||||||
|
|
||||||
|
g_return_val_if_fail(connection, FALSE);
|
||||||
|
g_return_val_if_fail(!error || !*error, FALSE);
|
||||||
|
|
||||||
|
type = nm_connection_get_connection_type(connection);
|
||||||
|
|
||||||
|
if (!WITH_TEAMDCTL) {
|
||||||
|
NMSettingConnection *s_con;
|
||||||
|
|
||||||
|
if (nm_streq0(type, NM_SETTING_TEAM_SETTING_NAME)) {
|
||||||
|
feature = "team";
|
||||||
|
goto out_disabled;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Match team ports */
|
||||||
|
if ((s_con = nm_connection_get_setting_connection(connection))
|
||||||
|
&& nm_streq0(nm_setting_connection_get_port_type(s_con),
|
||||||
|
NM_SETTING_TEAM_SETTING_NAME)) {
|
||||||
|
feature = "team";
|
||||||
|
goto out_disabled;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!WITH_OPENVSWITCH) {
|
||||||
|
if (NM_IN_STRSET(type,
|
||||||
|
NM_SETTING_OVS_BRIDGE_SETTING_NAME,
|
||||||
|
NM_SETTING_OVS_PORT_SETTING_NAME,
|
||||||
|
NM_SETTING_OVS_INTERFACE_SETTING_NAME)) {
|
||||||
|
feature = "Open vSwitch";
|
||||||
|
goto out_disabled;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Match OVS system interfaces */
|
||||||
|
if (nm_connection_get_setting_ovs_interface(connection)) {
|
||||||
|
feature = "Open vSwitch";
|
||||||
|
goto out_disabled;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!WITH_WIFI
|
||||||
|
&& NM_IN_STRSET(type,
|
||||||
|
NM_SETTING_WIRELESS_SETTING_NAME,
|
||||||
|
NM_SETTING_OLPC_MESH_SETTING_NAME,
|
||||||
|
NM_SETTING_WIFI_P2P_SETTING_NAME)) {
|
||||||
|
feature = "Wi-Fi";
|
||||||
|
goto out_disabled;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!WITH_WWAN
|
||||||
|
&& NM_IN_STRSET(type, NM_SETTING_GSM_SETTING_NAME, NM_SETTING_CDMA_SETTING_NAME)) {
|
||||||
|
feature = "WWAN";
|
||||||
|
goto out_disabled;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (nm_streq0(type, NM_SETTING_WIMAX_SETTING_NAME)) {
|
||||||
|
feature = "WiMAX";
|
||||||
|
goto out_removed;
|
||||||
|
}
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
|
||||||
|
out_disabled:
|
||||||
|
nm_assert(feature);
|
||||||
|
g_set_error(error,
|
||||||
|
NM_SETTINGS_ERROR,
|
||||||
|
NM_SETTINGS_ERROR_FEATURE_DISABLED,
|
||||||
|
"%s support is disabled in this build",
|
||||||
|
feature);
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
out_removed:
|
||||||
|
nm_assert(feature);
|
||||||
|
g_set_error(error,
|
||||||
|
NM_SETTINGS_ERROR,
|
||||||
|
NM_SETTINGS_ERROR_FEATURE_REMOVED,
|
||||||
|
"%s is no longer supported",
|
||||||
|
feature);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -490,4 +490,8 @@ uid_t nm_utils_get_nm_uid(void);
|
||||||
|
|
||||||
gid_t nm_utils_get_nm_gid(void);
|
gid_t nm_utils_get_nm_gid(void);
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
gboolean nm_utils_connection_supported(NMConnection *connection, GError **error);
|
||||||
|
|
||||||
#endif /* __NM_CORE_UTILS_H__ */
|
#endif /* __NM_CORE_UTILS_H__ */
|
||||||
|
|
|
||||||
|
|
@ -1851,6 +1851,9 @@ nm_settings_add_connection(NMSettings *self,
|
||||||
|
|
||||||
NM_SET_OUT(out_sett_conn, NULL);
|
NM_SET_OUT(out_sett_conn, NULL);
|
||||||
|
|
||||||
|
if (!nm_utils_connection_supported(connection, error))
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
uuid = nm_connection_get_uuid(connection);
|
uuid = nm_connection_get_uuid(connection);
|
||||||
|
|
||||||
sett_conn_entry = _sett_conn_entries_get(self, uuid);
|
sett_conn_entry = _sett_conn_entries_get(self, uuid);
|
||||||
|
|
|
||||||
|
|
@ -256,6 +256,11 @@ GQuark nm_secret_agent_error_quark(void);
|
||||||
* @NM_SETTINGS_ERROR_NOT_SUPPORTED_BY_PLUGIN: the requested operation is not
|
* @NM_SETTINGS_ERROR_NOT_SUPPORTED_BY_PLUGIN: the requested operation is not
|
||||||
* supported by the settings plugin currently in use for the specified object.
|
* supported by the settings plugin currently in use for the specified object.
|
||||||
* Since: 1.44.
|
* Since: 1.44.
|
||||||
|
* @NM_SETTINGS_ERROR_FEATURE_DISABLED: the requested operation failed because it
|
||||||
|
* requires a feature that is disabled in this build of NetworkManager.
|
||||||
|
* Since: 1.56
|
||||||
|
* @NM_SETTINGS_ERROR_FEATURE_REMOVED: the requested operation failed because it
|
||||||
|
* requires a feature that is no longer supported. Since: 1.56
|
||||||
*
|
*
|
||||||
* Errors related to the settings/persistent configuration interface of
|
* Errors related to the settings/persistent configuration interface of
|
||||||
* NetworkManager.
|
* NetworkManager.
|
||||||
|
|
@ -275,6 +280,8 @@ typedef enum {
|
||||||
NM_SETTINGS_ERROR_INVALID_ARGUMENTS, /*< nick=InvalidArguments >*/
|
NM_SETTINGS_ERROR_INVALID_ARGUMENTS, /*< nick=InvalidArguments >*/
|
||||||
NM_SETTINGS_ERROR_VERSION_ID_MISMATCH, /*< nick=VersionIdMismatch >*/
|
NM_SETTINGS_ERROR_VERSION_ID_MISMATCH, /*< nick=VersionIdMismatch >*/
|
||||||
NM_SETTINGS_ERROR_NOT_SUPPORTED_BY_PLUGIN, /*< nick=NotSupportedByPlugin >*/
|
NM_SETTINGS_ERROR_NOT_SUPPORTED_BY_PLUGIN, /*< nick=NotSupportedByPlugin >*/
|
||||||
|
NM_SETTINGS_ERROR_FEATURE_DISABLED, /*< nick=FeatureDisabled >*/
|
||||||
|
NM_SETTINGS_ERROR_FEATURE_REMOVED, /*< nick=FeatureRemoved >*/
|
||||||
} NMSettingsError;
|
} NMSettingsError;
|
||||||
|
|
||||||
GQuark nm_settings_error_quark(void);
|
GQuark nm_settings_error_quark(void);
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue