mirror of
https://gitlab.freedesktop.org/NetworkManager/NetworkManager.git
synced 2025-12-29 12:40:11 +01:00
ifnet: merge branch 'th/setting-plugin-ifnet'
Drop the "ifnet" settings plugin that was used on Gentoo. It's unmaintained and unused for a long time. https://github.com/NetworkManager/NetworkManager/pull/43
This commit is contained in:
commit
2e58982697
33 changed files with 22 additions and 7850 deletions
3
.gitignore
vendored
3
.gitignore
vendored
|
|
@ -256,7 +256,6 @@ test-*.trs
|
|||
/src/settings/plugins/ibft/tests/test-ibft
|
||||
/src/settings/plugins/ifcfg-rh/nmdbus-ifcfg-rh.[ch]
|
||||
/src/settings/plugins/ifcfg-rh/tests/test-ifcfg-rh
|
||||
/src/settings/plugins/ifnet/tests/test-ifnet
|
||||
/src/settings/plugins/ifupdown/tests/test-ifupdown
|
||||
/src/settings/plugins/keyfile/tests/test-keyfile
|
||||
/src/settings/plugins/ifcfg-rh/tests/network-scripts/tmp/
|
||||
|
|
@ -300,7 +299,6 @@ test-*.trs
|
|||
/src/dnsmasq-manager/tests/test-dnsmasq-utils
|
||||
/src/rdisc/
|
||||
/src/settings/plugins/ifcfg-rh/tests/test-ifcfg-rh-utils
|
||||
/src/settings/plugins/ifnet/tests/check_ifnet
|
||||
/src/supplicant-manager/tests/test-supplicant-config
|
||||
/introspection/nmdbus-*.c
|
||||
/introspection/nmdbus-*.h
|
||||
|
|
@ -313,3 +311,4 @@ test-*.trs
|
|||
/libnm-core/tests/test-setting-8021x
|
||||
/libnm-core/tests/test-setting-bond
|
||||
/libnm-core/tests/test-setting-dcb
|
||||
/src/settings/plugins/ifnet
|
||||
|
|
|
|||
|
|
@ -18,7 +18,7 @@ before_install:
|
|||
- sudo apt-get install libnl-3-dev libndp-dev automake libcurl4-gnutls-dev
|
||||
|
||||
script: |
|
||||
sh autogen.sh --with-systemd-logind=no --enable-more-warnings=no --enable-ifcfg-rh --enable-ifupdown --enable-ifnet --enable-tests &&
|
||||
sh autogen.sh --with-systemd-logind=no --enable-more-warnings=no --enable-ifcfg-rh --enable-ifupdown --enable-tests &&
|
||||
make -j4 &&
|
||||
./contrib/travis/travis-check.sh
|
||||
|
||||
|
|
|
|||
91
Makefile.am
91
Makefile.am
|
|
@ -123,7 +123,6 @@ DISTCHECK_CONFIGURE_FLAGS = \
|
|||
--with-wext=no \
|
||||
--enable-ifcfg-rh \
|
||||
--enable-ifupdown \
|
||||
--enable-ifnet \
|
||||
--disable-dependency-tracking
|
||||
|
||||
dist-configure-check:
|
||||
|
|
@ -2409,96 +2408,6 @@ EXTRA_DIST += \
|
|||
src/settings/plugins/ifupdown/tests/test21-source-dir-stanza \
|
||||
src/settings/plugins/ifupdown/tests/test21-source-dir-stanza.d
|
||||
|
||||
###############################################################################
|
||||
# src/settings/plugins/ifnet
|
||||
###############################################################################
|
||||
|
||||
if CONFIG_PLUGIN_IFNET
|
||||
|
||||
core_plugins += src/settings/plugins/ifnet/libnm-settings-plugin-ifnet.la
|
||||
|
||||
noinst_LTLIBRARIES += src/settings/plugins/ifnet/libnms-ifnet-core.la
|
||||
|
||||
src_settings_plugins_ifnet_cppflags = \
|
||||
-I$(srcdir)/src \
|
||||
-I$(srcdir)/shared \
|
||||
-I$(builddir)/shared \
|
||||
-I$(srcdir)/libnm-core \
|
||||
-I$(builddir)/libnm-core \
|
||||
-DG_LOG_DOMAIN=\""NetworkManager"\" \
|
||||
-DNETWORKMANAGER_COMPILATION=NM_NETWORKMANAGER_COMPILATION_INSIDE_DAEMON \
|
||||
$(GLIB_CFLAGS) \
|
||||
-DSYSCONFDIR=\"$(sysconfdir)\" \
|
||||
-DSBINDIR=\"$(sbindir)\"
|
||||
|
||||
src_settings_plugins_ifnet_libnms_ifnet_core_la_SOURCES = \
|
||||
src/settings/plugins/ifnet/nms-ifnet-net-parser.c\
|
||||
src/settings/plugins/ifnet/nms-ifnet-net-parser.h\
|
||||
src/settings/plugins/ifnet/nms-ifnet-connection-parser.c \
|
||||
src/settings/plugins/ifnet/nms-ifnet-connection-parser.h \
|
||||
src/settings/plugins/ifnet/nms-ifnet-net-utils.h\
|
||||
src/settings/plugins/ifnet/nms-ifnet-net-utils.c\
|
||||
src/settings/plugins/ifnet/nms-ifnet-wpa-parser.h\
|
||||
src/settings/plugins/ifnet/nms-ifnet-wpa-parser.c
|
||||
|
||||
src_settings_plugins_ifnet_libnms_ifnet_core_la_CPPFLAGS = $(src_settings_plugins_ifnet_cppflags)
|
||||
|
||||
src_settings_plugins_ifnet_libnm_settings_plugin_ifnet_la_SOURCES = \
|
||||
src/settings/plugins/ifnet/nms-ifnet-connection.c \
|
||||
src/settings/plugins/ifnet/nms-ifnet-connection.h \
|
||||
src/settings/plugins/ifnet/nms-ifnet-plugin.c \
|
||||
src/settings/plugins/ifnet/nms-ifnet-plugin.h
|
||||
|
||||
src_settings_plugins_ifnet_libnm_settings_plugin_ifnet_la_CPPFLAGS = $(src_settings_plugins_ifnet_cppflags)
|
||||
|
||||
src_settings_plugins_ifnet_libnm_settings_plugin_ifnet_la_LDFLAGS = \
|
||||
-module -avoid-version \
|
||||
-Wl,--version-script="$(srcdir)/linker-script-settings.ver"
|
||||
|
||||
src_settings_plugins_ifnet_libnm_settings_plugin_ifnet_la_LIBADD = \
|
||||
src/settings/plugins/ifnet/libnms-ifnet-core.la
|
||||
|
||||
check-local-symbols-settings-ifnet: src/settings/plugins/ifnet/libnm-settings-plugin-ifnet.la
|
||||
$(call check_so_symbols,$(builddir)/src/settings/plugins/ifnet/.libs/libnm-settings-plugin-ifnet.so)
|
||||
|
||||
check_local += check-local-symbols-settings-ifnet
|
||||
|
||||
###############################################################################
|
||||
|
||||
check_programs += src/settings/plugins/ifnet/tests/test-ifnet
|
||||
|
||||
src_settings_plugins_ifnet_tests_test_ifnet_CPPFLAGS = \
|
||||
-I$(srcdir)/shared \
|
||||
-I$(builddir)/shared \
|
||||
-I$(srcdir)/libnm-core \
|
||||
-I$(builddir)/libnm-core \
|
||||
-I$(srcdir)/src \
|
||||
-DG_LOG_DOMAIN=\""NetworkManager"\" \
|
||||
-DNETWORKMANAGER_COMPILATION=NM_NETWORKMANAGER_COMPILATION_INSIDE_DAEMON \
|
||||
$(GLIB_CFLAGS) \
|
||||
$(CODE_COVERAGE_CFLAGS) \
|
||||
-DTEST_IFNET_DIR=\"$(abs_srcdir)/src/settings/plugins/ifnet/tests\" \
|
||||
-DTEST_SCRATCH_DIR=\"$(abs_builddir)/src/settings/plugins/ifnet/tests/\" \
|
||||
-DTEST_WPA_SUPPLICANT_CONF='"$(srcdir)/src/settings/plugins/ifnet/tests/wpa_supplicant.conf"' \
|
||||
-DSYSCONFDIR=\"nonexistent\"
|
||||
|
||||
src_settings_plugins_ifnet_tests_test_ifnet_LDFLAGS = \
|
||||
$(GLIB_LDFLAGS)
|
||||
$(CODE_COVERAGE_LDFLAGS)
|
||||
|
||||
src_settings_plugins_ifnet_tests_test_ifnet_LDADD = \
|
||||
src/settings/plugins/ifnet/libnms-ifnet-core.la \
|
||||
src/libNetworkManagerTest.la
|
||||
|
||||
endif
|
||||
|
||||
EXTRA_DIST += \
|
||||
src/settings/plugins/ifnet/tests/net \
|
||||
src/settings/plugins/ifnet/tests/net.all \
|
||||
src/settings/plugins/ifnet/tests/nm-system-settings.conf \
|
||||
src/settings/plugins/ifnet/tests/wpa_supplicant.conf \
|
||||
src/settings/plugins/ifnet/tests/test_ca_cert.pem
|
||||
|
||||
###############################################################################
|
||||
# src/devices/adsl
|
||||
###############################################################################
|
||||
|
|
|
|||
16
configure.ac
16
configure.ac
|
|
@ -120,29 +120,21 @@ AC_CHECK_FUNCS([__secure_getenv secure_getenv])
|
|||
# Alternative configuration plugins
|
||||
AC_ARG_ENABLE(config-plugin-ibft, AS_HELP_STRING([--enable-config-plugin-ibft], [enable ibft configuration plugin]))
|
||||
AC_ARG_ENABLE(ifcfg-rh, AS_HELP_STRING([--enable-ifcfg-rh], [enable ifcfg-rh configuration plugin (Fedora/RHEL)]))
|
||||
AC_ARG_ENABLE(ifcfg-suse,
|
||||
AS_HELP_STRING([--enable-ifcfg-suse], [enable ifcfg-suse configuration plugin (SUSE) (deprecated)]))
|
||||
AC_ARG_ENABLE(ifupdown, AS_HELP_STRING([--enable-ifupdown], [enable ifupdown configuration plugin (Debian/Ubuntu)]))
|
||||
AC_ARG_ENABLE(ifnet, AS_HELP_STRING([--enable-ifnet], [enable ifnet configuration plugin (Gentoo)]))
|
||||
# Default alternative plugins by distribution
|
||||
AS_IF([test -z "$enable_ifcfg_rh"], AC_CHECK_FILE(/etc/redhat-release, enable_ifcfg_rh=yes))
|
||||
AS_IF([test -z "$enable_ifcfg_rh"], AC_CHECK_FILE(/etc/fedora-release, enable_ifcfg_rh=yes))
|
||||
AS_IF([test -z "$enable_ifcfg_rh"], AC_CHECK_FILE(/etc/mandriva-release, enable_ifcfg_rh=yes))
|
||||
AS_IF([test -z "$enable_ifcfg_suse"], AC_CHECK_FILE(/etc/SuSE-release, enable_ifcfg_suse=yes))
|
||||
AS_IF([test -z "$enable_ifupdown"], AC_CHECK_FILE(/etc/debian_version, enable_ifupdown=yes))
|
||||
AS_IF([test -z "$enable_ifnet"], AC_CHECK_FILE(/etc/gentoo-release, enable_ifnet=yes))
|
||||
# Otherwise plugins default to "no"
|
||||
AS_IF([test -z "$enable_ifcfg_rh"], enable_ifcfg_rh=no)
|
||||
AS_IF([test -z "$enable_ifcfg_suse"], enable_ifcfg_suse=no)
|
||||
AS_IF([test -z "$enable_ifupdown"], enable_ifupdown=no)
|
||||
AS_IF([test -z "$enable_ifnet"], enable_ifnet=no)
|
||||
# Enable ibft by default
|
||||
AS_IF([test -z "$enable_config_plugin_ibft"], enable_config_plugin_ibft="yes")
|
||||
# Create automake conditionals
|
||||
AM_CONDITIONAL(CONFIG_PLUGIN_IBFT, test "$enable_config_plugin_ibft" = "yes")
|
||||
AM_CONDITIONAL(CONFIG_PLUGIN_IFCFG_RH, test "$enable_ifcfg_rh" = "yes")
|
||||
AM_CONDITIONAL(CONFIG_PLUGIN_IFUPDOWN, test "$enable_ifupdown" = "yes")
|
||||
AM_CONDITIONAL(CONFIG_PLUGIN_IFNET, test "$enable_ifnet" = "yes")
|
||||
|
||||
AC_ARG_WITH(config-plugins-default,
|
||||
AS_HELP_STRING([--with-config-plugins-default=PLUGINS],
|
||||
|
|
@ -152,15 +144,12 @@ if test -z "$config_plugins_default" -o "$config_plugins_default" = no; then
|
|||
config_plugins_default=''
|
||||
test "$enable_ifcfg_rh" = "yes" && config_plugins_default="$config_plugins_default,ifcfg-rh"
|
||||
test "$enable_ifupdown" = "yes" && config_plugins_default="$config_plugins_default,ifupdown"
|
||||
test "$enable_ifnet" = "yes" && config_plugins_default="$config_plugins_default,ifnet"
|
||||
test "$enable_config_plugin_ibft" = "yes" && config_plugins_default="$config_plugins_default,ibft"
|
||||
config_plugins_default="${config_plugins_default#,}"
|
||||
fi
|
||||
|
||||
test "$enable_ifcfg_rh" = "yes" && distro_plugins="$distro_plugins,ifcfg-rh"
|
||||
test "$enable_ifcfg_suse" = "yes" && distro_plugins="$distro_plugins,ifcfg-suse"
|
||||
test "$enable_ifupdown" = "yes" && distro_plugins="$distro_plugins,ifupdown"
|
||||
test "$enable_ifnet" = "yes" && distro_plugins="$distro_plugins,ifnet"
|
||||
distro_plugins="${distro_plugins#,}"
|
||||
|
||||
AC_DEFINE_UNQUOTED(NM_CONFIG_DEFAULT_MAIN_PLUGINS, "$config_plugins_default", [Default configuration option for main.plugins setting])
|
||||
|
|
@ -413,8 +402,8 @@ AS_IF([test "$with_hostname_persist" = "gentoo"], hostname_persist=gentoo)
|
|||
AS_IF([test "$with_hostname_persist" = "slackware"], hostname_persist=slackware)
|
||||
AS_IF([test "$with_hostname_persist" = "default"], hostname_persist=default)
|
||||
# if the method was not explicitly set, try to guess it from the enabled plugins
|
||||
AS_IF([test -z "$hostname_persist" -a "$distro_plugins" = "ifcfg-suse"], hostname_persist=suse)
|
||||
AS_IF([test -z "$hostname_persist" -a "$distro_plugins" = "ifnet"], hostname_persist=gentoo)
|
||||
AS_IF([test -z "$hostname_persist" -a -f /etc/SuSE-release], hostname_persist=suse)
|
||||
AS_IF([test -z "$hostname_persist" -a -f /etc/gentoo-release], hostname_persist=gentoo)
|
||||
AS_IF([test -z "$hostname_persist" -a -f /etc/slackware-version], hostname_persist=slackware)
|
||||
AS_IF([test -z "$hostname_persist"], hostname_persist=default)
|
||||
|
||||
|
|
@ -1422,7 +1411,6 @@ echo "Configuration plugins (main.plugins=${config_plugins_default})"
|
|||
echo " ibft: ${enable_config_plugin_ibft}"
|
||||
echo " ifcfg-rh: ${enable_ifcfg_rh}"
|
||||
echo " ifupdown: ${enable_ifupdown}"
|
||||
echo " ifnet: ${enable_ifnet}"
|
||||
echo
|
||||
|
||||
echo "Handlers for /etc/resolv.conf:"
|
||||
|
|
|
|||
|
|
@ -131,7 +131,6 @@ if [[ $NO_DIST != 1 ]]; then
|
|||
--enable-ifcfg-rh \
|
||||
--enable-ifupdown \
|
||||
--enable-ibft \
|
||||
--enable-ifnet \
|
||||
--with-config-logging-backend-default=syslog \
|
||||
--with-libaudit=yes-disabled-by-default \
|
||||
--enable-polkit=yes \
|
||||
|
|
|
|||
|
|
@ -1180,6 +1180,7 @@ enable=nm-version-min:1.3,nm-version-min:1.2.6,nm-version-min:1.0.16
|
|||
</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
|
||||
<varlistentry>
|
||||
<term><varname>ifcfg-rh</varname></term>
|
||||
<listitem>
|
||||
|
|
@ -1197,17 +1198,6 @@ enable=nm-version-min:1.3,nm-version-min:1.2.6,nm-version-min:1.0.16
|
|||
</listitem>
|
||||
</varlistentry>
|
||||
|
||||
<varlistentry>
|
||||
<term><varname>ifcfg-suse</varname></term>
|
||||
<listitem>
|
||||
<para>
|
||||
This plugin is deprecated and its selection has no effect.
|
||||
The <literal>keyfile</literal> plugin should be used
|
||||
instead.
|
||||
</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
|
||||
<varlistentry>
|
||||
<term><varname>ifupdown</varname></term>
|
||||
<listitem>
|
||||
|
|
@ -1244,6 +1234,17 @@ enable=nm-version-min:1.3,nm-version-min:1.2.6,nm-version-min:1.0.16
|
|||
</listitem>
|
||||
</varlistentry>
|
||||
|
||||
<varlistentry>
|
||||
<term><varname>ifcfg-suse</varname>, <varname>ifnet</varname></term>
|
||||
<listitem>
|
||||
<para>
|
||||
These plugins are deprecated and their selection has no effect.
|
||||
The <literal>keyfile</literal> plugin should be used
|
||||
instead.
|
||||
</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
|
||||
</variablelist>
|
||||
</refsect1>
|
||||
|
||||
|
|
|
|||
|
|
@ -376,9 +376,9 @@
|
|||
<term><option>--plugins</option></term>
|
||||
<listitem><para>List plugins used to manage system-wide
|
||||
connection settings. This list has preference over plugins
|
||||
specified in the configuration file. Currently supported
|
||||
plugins are: keyfile, <option>ifcfg-rh</option>,
|
||||
<option>ifcfg-suse</option>, <option>ifupdown</option>.
|
||||
specified in the configuration file. See <literal>main.plugins</literal>
|
||||
setting in <link linkend='NetworkManager.conf'><citerefentry><refentrytitle>NetworkManager.conf</refentrytitle><manvolnum>5</manvolnum></citerefentry></link>
|
||||
for supported options.
|
||||
</para></listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
|
|
|
|||
11
meson.build
11
meson.build
|
|
@ -221,9 +221,7 @@ else
|
|||
endif
|
||||
|
||||
enable_ifcfg_rh = get_option('ifcfg_rh') or (distro == 'redhat')
|
||||
enable_ifcfg_suse = get_option('ifcfg_suse') or (distro == 'suse')
|
||||
enable_ifupdown = get_option('ifupdown') or (distro == 'debian')
|
||||
enable_ifnet = get_option('ifnet') or (distro == 'gentoo')
|
||||
|
||||
enable_config_plugin_ibft = get_option('config_plugin_ibft')
|
||||
config_h.set10('WITH_SETTINGS_PLUGIN_IBFT', enable_config_plugin_ibft)
|
||||
|
|
@ -236,18 +234,10 @@ if config_plugins_default == ''
|
|||
config_plugins += ['ifcfg-rh']
|
||||
endif
|
||||
|
||||
if enable_ifcfg_suse
|
||||
config_plugins += ['ifcfg-suse']
|
||||
endif
|
||||
|
||||
if enable_ifupdown
|
||||
config_plugins += ['ifupdown']
|
||||
endif
|
||||
|
||||
if enable_ifnet
|
||||
config_plugins += ['ifnet']
|
||||
endif
|
||||
|
||||
if enable_config_plugin_ibft
|
||||
config_plugins += ['ibft']
|
||||
endif
|
||||
|
|
@ -977,7 +967,6 @@ output += '\nConfiguration_plugins (main.plugins=' + config_plugins_default + ')
|
|||
output += ' ibft: ' + enable_config_plugin_ibft.to_string() + '\n'
|
||||
output += ' ifcfg-rh: ' + enable_ifcfg_rh.to_string() + '\n'
|
||||
output += ' ifupdown: ' + enable_ifupdown.to_string() + '\n'
|
||||
output += ' ifnet: ' + enable_ifnet.to_string() + '\n'
|
||||
output += '\nHandlers for /etc/resolv.conf:\n'
|
||||
output += ' resolvconf: ' + enable_resolvconf.to_string()
|
||||
if enable_resolvconf
|
||||
|
|
|
|||
|
|
@ -46,9 +46,7 @@ option('bluez5_dun', type: 'boolean', value: false, description: 'enable Bluez5
|
|||
option('config_plugins_default', type: 'string', value: '', description: 'Default configuration option for main.plugins setting, used as fallback if the configuration option is unset')
|
||||
option('config_plugin_ibft', type: 'boolean', value: true, description: 'enable ibft configuration plugin')
|
||||
option('ifcfg_rh', type: 'boolean', value: false, description: 'enable ifcfg-rh configuration plugin (Fedora/RHEL)')
|
||||
option('ifcfg_suse', type: 'boolean', value: false, description: 'enable ifcfg-suse configuration plugin (SUSE) (deprecated)')
|
||||
option('ifupdown', type: 'boolean', value: false, description: 'enable ifupdown configuration plugin (Debian/Ubuntu)')
|
||||
option('ifnet', type: 'boolean', value: false, description: 'enable ifnet configuration plugin (Gentoo)')
|
||||
|
||||
# handlers for resolv.conf
|
||||
option('resolvconf', type: 'array', value: ['resolvconf', '/sbin/resolvconf', '/usr/sbin/resolvconf', '/usr/local/sbin/resolvconf'], description: 'Enable resolvconf support')
|
||||
|
|
|
|||
|
|
@ -57,7 +57,6 @@
|
|||
|
||||
#define NM_CONFIG_KEYFILE_GROUP_KEYFILE "keyfile"
|
||||
#define NM_CONFIG_KEYFILE_GROUP_IFUPDOWN "ifupdown"
|
||||
#define NM_CONFIG_KEYFILE_GROUP_IFNET "ifnet"
|
||||
|
||||
#define NM_CONFIG_KEYFILE_KEY_MAIN_AUTH_POLKIT "auth-polkit"
|
||||
#define NM_CONFIG_KEYFILE_KEY_MAIN_AUTOCONNECT_RETRIES_DEFAULT "autoconnect-retries-default"
|
||||
|
|
|
|||
|
|
@ -677,8 +677,8 @@ load_plugins (NMSettings *self, const char **plugins, GError **error)
|
|||
continue;
|
||||
}
|
||||
|
||||
if (!strcmp (pname, "ifcfg-suse")) {
|
||||
_LOGW ("skipping deprecated plugin ifcfg-suse");
|
||||
if (NM_IN_STRSET (pname, "ifcfg-suse", "ifnet")) {
|
||||
_LOGW ("skipping deprecated plugin %s", pname);
|
||||
continue;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1,58 +0,0 @@
|
|||
sources = files(
|
||||
'nms-ifnet-connection-parser.c',
|
||||
'nms-ifnet-net-parser.c',
|
||||
'nms-ifnet-net-utils.c',
|
||||
'nms-ifnet-wpa-parser.c'
|
||||
)
|
||||
|
||||
cflags = [
|
||||
'-DSBINDIR="@0@"'.format(nm_sbindir),
|
||||
'-DSYSCONFDIR="@0@"'.format(nm_sysconfdir)
|
||||
]
|
||||
|
||||
libnms_ifnet_core = static_library(
|
||||
'nms-ifnet-core',
|
||||
sources: sources,
|
||||
dependencies: core_dep,
|
||||
c_args: cflags
|
||||
)
|
||||
|
||||
sources = files(
|
||||
'nms-ifnet-connection.c',
|
||||
'nms-ifnet-plugin.c'
|
||||
)
|
||||
|
||||
ldflags = []
|
||||
if have_version_script
|
||||
ldflags += '-Wl,--version-script,@0@'.format(linker_script_settings)
|
||||
endif
|
||||
|
||||
libnm_settings_plugin_ifnet = shared_module(
|
||||
'nm-settings-plugin-ifnet',
|
||||
sources: sources,
|
||||
dependencies: core_dep,
|
||||
c_args: cflags,
|
||||
link_with: libnms_ifnet_core,
|
||||
link_args: ldflags,
|
||||
link_depends: linker_script_settings,
|
||||
install: true,
|
||||
install_dir: nm_pkglibdir
|
||||
)
|
||||
|
||||
core_plugins += libnm_settings_plugin_ifnet
|
||||
|
||||
# FIXME: check_so_symbols replacement
|
||||
'''
|
||||
run_target(
|
||||
'check-local-symbols-settings-ifnet',
|
||||
command: [check_so_symbols, libnm_settings_plugin_ifnet.full_path()],
|
||||
depends: libnm_settings_plugin_ifnet
|
||||
)
|
||||
|
||||
check-local-symbols-settings-ifnet: src/settings/plugins/ifnet/libnm-settings-plugin-ifnet.la
|
||||
$(call check_so_symbols,$(builddir)/src/settings/plugins/ifnet/.libs/libnm-settings-plugin-ifnet.so)
|
||||
'''
|
||||
|
||||
if enable_tests
|
||||
subdir('tests')
|
||||
endif
|
||||
File diff suppressed because it is too large
Load diff
|
|
@ -1,55 +0,0 @@
|
|||
/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */
|
||||
/*
|
||||
* Mu Qiao <qiaomuf@gmail.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program 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 General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Copyright (C) 1999-2010 Gentoo Foundation, Inc.
|
||||
*/
|
||||
|
||||
#ifndef _CONNECTION_PARSER_H
|
||||
#define _CONNECTION_PARSER_H
|
||||
|
||||
#include "nm-connection.h"
|
||||
|
||||
#include "nms-ifnet-net-parser.h"
|
||||
|
||||
gboolean ifnet_can_write_connection (NMConnection *connection, GError **error);
|
||||
|
||||
NMConnection *ifnet_update_connection_from_config_block (const char *conn_name,
|
||||
const char *basepath,
|
||||
GError **error);
|
||||
|
||||
/* nm_conn_name is used to update nm_ifnet_connection's priv data */
|
||||
gboolean ifnet_update_parsers_by_connection (NMConnection *connection,
|
||||
const char *conn_name,
|
||||
const char *config_file,
|
||||
const char *wpa_file,
|
||||
gchar **out_new_name,
|
||||
gchar **out_backup,
|
||||
GError **error);
|
||||
|
||||
gboolean ifnet_delete_connection_in_parsers (const char *conn_name,
|
||||
const char *config_file,
|
||||
const char *wpa_file,
|
||||
gchar **out_backup);
|
||||
|
||||
gboolean ifnet_add_new_connection (NMConnection *connection,
|
||||
const char *config_file,
|
||||
const char *wpa_file,
|
||||
gchar **out_new_name,
|
||||
gchar **out_backup,
|
||||
GError ** error);
|
||||
#endif
|
||||
|
|
@ -1,233 +0,0 @@
|
|||
/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */
|
||||
/*
|
||||
* Mu Qiao <qiaomuf@gmail.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program 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 General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Copyright (C) 1999-2010 Gentoo Foundation, Inc.
|
||||
*/
|
||||
|
||||
#include "nm-default.h"
|
||||
|
||||
#include "nms-ifnet-connection.h"
|
||||
|
||||
#include <string.h>
|
||||
#include <glib/gstdio.h>
|
||||
|
||||
#include "nm-dbus-interface.h"
|
||||
#include "nm-utils.h"
|
||||
#include "nm-setting-wireless-security.h"
|
||||
#include "settings/nm-settings-connection.h"
|
||||
#include "settings/nm-settings-plugin.h"
|
||||
|
||||
#include "nms-ifnet-connection-parser.h"
|
||||
#include "nms-ifnet-net-parser.h"
|
||||
#include "nms-ifnet-net-utils.h"
|
||||
#include "nms-ifnet-wpa-parser.h"
|
||||
#include "nms-ifnet-plugin.h"
|
||||
|
||||
/*****************************************************************************/
|
||||
|
||||
enum {
|
||||
IFNET_SETUP_MONITORS,
|
||||
IFNET_CANCEL_MONITORS,
|
||||
IFNET_LAST_SIGNAL
|
||||
};
|
||||
|
||||
static guint signals[IFNET_LAST_SIGNAL] = { 0 };
|
||||
|
||||
typedef struct {
|
||||
gchar *conn_name;
|
||||
NMSettingsPlugin *config;
|
||||
} NMIfnetConnectionPrivate;
|
||||
|
||||
struct _NMIfnetConnection {
|
||||
NMSettingsConnection parent;
|
||||
NMIfnetConnectionPrivate _priv;
|
||||
};
|
||||
|
||||
struct _NMIfnetConnectionClass {
|
||||
NMSettingsConnectionClass parent;
|
||||
};
|
||||
|
||||
G_DEFINE_TYPE (NMIfnetConnection, nm_ifnet_connection, NM_TYPE_SETTINGS_CONNECTION)
|
||||
|
||||
#define NM_IFNET_CONNECTION_GET_PRIVATE(self) _NM_GET_PRIVATE (self, NMIfnetConnection, NM_IS_IFNET_CONNECTION)
|
||||
|
||||
/*****************************************************************************/
|
||||
|
||||
const char *
|
||||
nm_ifnet_connection_get_conn_name (NMIfnetConnection *connection)
|
||||
{
|
||||
return NM_IFNET_CONNECTION_GET_PRIVATE (connection)->conn_name;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
commit_changes (NMSettingsConnection *connection,
|
||||
NMConnection *new_connection,
|
||||
NMSettingsConnectionCommitReason commit_reason,
|
||||
NMConnection **out_reread_connection,
|
||||
char **out_logmsg_change,
|
||||
GError **error)
|
||||
{
|
||||
NMIfnetConnectionPrivate *priv = NM_IFNET_CONNECTION_GET_PRIVATE ((NMIfnetConnection *) connection);
|
||||
char *new_name = NULL;
|
||||
gboolean success = FALSE;
|
||||
gboolean added = FALSE;
|
||||
|
||||
nm_assert (out_reread_connection && !*out_reread_connection);
|
||||
nm_assert (!out_logmsg_change || !*out_logmsg_change);
|
||||
|
||||
g_signal_emit (connection, signals[IFNET_CANCEL_MONITORS], 0);
|
||||
|
||||
if (priv->conn_name) {
|
||||
success = ifnet_update_parsers_by_connection (new_connection,
|
||||
priv->conn_name,
|
||||
CONF_NET_FILE,
|
||||
WPA_SUPPLICANT_CONF,
|
||||
&new_name,
|
||||
NULL,
|
||||
error);
|
||||
} else {
|
||||
added = TRUE;
|
||||
success = ifnet_add_new_connection (new_connection,
|
||||
CONF_NET_FILE,
|
||||
WPA_SUPPLICANT_CONF,
|
||||
&new_name,
|
||||
NULL,
|
||||
error);
|
||||
}
|
||||
|
||||
g_assert (!!success == (new_name != NULL));
|
||||
if (success) {
|
||||
g_free (priv->conn_name);
|
||||
priv->conn_name = new_name;
|
||||
}
|
||||
|
||||
reload_parsers ();
|
||||
|
||||
g_signal_emit (connection, signals[IFNET_SETUP_MONITORS], 0);
|
||||
|
||||
if (success) {
|
||||
NM_SET_OUT (out_logmsg_change,
|
||||
g_strdup_printf ("ifcfg-rh: %s %s",
|
||||
added ? "persist" : "updated",
|
||||
new_name));
|
||||
}
|
||||
return success;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
delete (NMSettingsConnection *connection,
|
||||
GError **error)
|
||||
{
|
||||
NMIfnetConnectionPrivate *priv = NM_IFNET_CONNECTION_GET_PRIVATE ((NMIfnetConnection *) connection);
|
||||
|
||||
/* Only connections which exist in /etc/conf.d/net will have a conn_name */
|
||||
if (priv->conn_name) {
|
||||
g_signal_emit (connection, signals[IFNET_CANCEL_MONITORS], 0);
|
||||
|
||||
if (!ifnet_delete_connection_in_parsers (priv->conn_name, CONF_NET_FILE, WPA_SUPPLICANT_CONF, NULL)) {
|
||||
nm_log_warn (LOGD_SETTINGS, "Failed to delete %s", priv->conn_name);
|
||||
reload_parsers ();
|
||||
/* let's not return an error. */
|
||||
}
|
||||
|
||||
g_signal_emit (connection, signals[IFNET_SETUP_MONITORS], 0);
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
|
||||
static void
|
||||
nm_ifnet_connection_init (NMIfnetConnection * connection)
|
||||
{
|
||||
}
|
||||
|
||||
NMIfnetConnection *
|
||||
nm_ifnet_connection_new (NMConnection *source, const char *conn_name)
|
||||
{
|
||||
NMConnection *tmp;
|
||||
GObject *object;
|
||||
GError *error = NULL;
|
||||
gboolean update_unsaved = TRUE;
|
||||
|
||||
g_return_val_if_fail (source || conn_name, NULL);
|
||||
|
||||
if (source)
|
||||
tmp = g_object_ref (source);
|
||||
else {
|
||||
tmp = ifnet_update_connection_from_config_block (conn_name, NULL, &error);
|
||||
if (!tmp) {
|
||||
nm_log_warn (LOGD_SETTINGS, "Could not read connection '%s': %s",
|
||||
conn_name, error->message);
|
||||
g_error_free (error);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* If we just read the connection from disk, it's clearly not Unsaved */
|
||||
update_unsaved = FALSE;
|
||||
}
|
||||
|
||||
object = (GObject *) g_object_new (NM_TYPE_IFNET_CONNECTION, NULL);
|
||||
|
||||
NM_IFNET_CONNECTION_GET_PRIVATE ((NMIfnetConnection *) object)->conn_name = g_strdup (conn_name);
|
||||
if (!nm_settings_connection_update (NM_SETTINGS_CONNECTION (object),
|
||||
tmp,
|
||||
update_unsaved
|
||||
? NM_SETTINGS_CONNECTION_PERSIST_MODE_UNSAVED
|
||||
: NM_SETTINGS_CONNECTION_PERSIST_MODE_KEEP_SAVED,
|
||||
NM_SETTINGS_CONNECTION_COMMIT_REASON_NONE,
|
||||
NULL,
|
||||
NULL)) {
|
||||
g_object_unref (object);
|
||||
return NULL;
|
||||
}
|
||||
g_object_unref (tmp);
|
||||
|
||||
return NM_IFNET_CONNECTION (object);
|
||||
}
|
||||
|
||||
static void
|
||||
finalize (GObject * object)
|
||||
{
|
||||
g_free (NM_IFNET_CONNECTION_GET_PRIVATE ((NMIfnetConnection *) object)->conn_name);
|
||||
G_OBJECT_CLASS (nm_ifnet_connection_parent_class)->finalize (object);
|
||||
}
|
||||
|
||||
static void
|
||||
nm_ifnet_connection_class_init (NMIfnetConnectionClass * ifnet_connection_class)
|
||||
{
|
||||
GObjectClass *object_class = G_OBJECT_CLASS (ifnet_connection_class);
|
||||
NMSettingsConnectionClass *settings_class = NM_SETTINGS_CONNECTION_CLASS (ifnet_connection_class);
|
||||
|
||||
object_class->finalize = finalize;
|
||||
|
||||
settings_class->delete = delete;
|
||||
settings_class->commit_changes = commit_changes;
|
||||
|
||||
signals[IFNET_SETUP_MONITORS] =
|
||||
g_signal_new ("ifnet_setup_monitors",
|
||||
G_OBJECT_CLASS_TYPE (object_class), G_SIGNAL_RUN_LAST,
|
||||
0, NULL, NULL, g_cclosure_marshal_VOID__VOID,
|
||||
G_TYPE_NONE, 0);
|
||||
signals[IFNET_CANCEL_MONITORS] =
|
||||
g_signal_new ("ifnet_cancel_monitors",
|
||||
G_OBJECT_CLASS_TYPE (object_class), G_SIGNAL_RUN_LAST,
|
||||
0, NULL, NULL, g_cclosure_marshal_VOID__VOID,
|
||||
G_TYPE_NONE, 0);
|
||||
}
|
||||
|
|
@ -1,46 +0,0 @@
|
|||
/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */
|
||||
/*
|
||||
* Mu Qiao <qiaomuf@gmail.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program 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 General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Copyright (C) 1999-2010 Gentoo Foundation, Inc.
|
||||
*/
|
||||
|
||||
#ifndef __NETWORKMANAGER_IFNET_CONNECTION_H__
|
||||
#define __NETWORKMANAGER_IFNET_CONNECTION_H__
|
||||
|
||||
#include "settings/nm-settings-connection.h"
|
||||
|
||||
#include "nms-ifnet-net-parser.h"
|
||||
|
||||
#define NM_TYPE_IFNET_CONNECTION (nm_ifnet_connection_get_type ())
|
||||
#define NM_IFNET_CONNECTION(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), NM_TYPE_IFNET_CONNECTION, NMIfnetConnection))
|
||||
#define NM_IFNET_CONNECTION_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), NM_TYPE_IFNET_CONNECTION, NMIfnetConnectionClass))
|
||||
#define NM_IS_IFNET_CONNECTION(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), NM_TYPE_IFNET_CONNECTION))
|
||||
#define NM_IS_IFNET_CONNECTION_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), NM_TYPE_IFNET_CONNECTION))
|
||||
#define NM_IFNET_CONNECTION_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), NM_TYPE_IFNET_CONNECTION, NMIfnetConnectionClass))
|
||||
|
||||
typedef struct _NMIfnetConnection NMIfnetConnection;
|
||||
typedef struct _NMIfnetConnectionClass NMIfnetConnectionClass;
|
||||
|
||||
GType nm_ifnet_connection_get_type (void);
|
||||
|
||||
NMIfnetConnection *nm_ifnet_connection_new (NMConnection *source,
|
||||
const char *conn_name);
|
||||
|
||||
const char *nm_ifnet_connection_get_conn_name (NMIfnetConnection *connection);
|
||||
|
||||
#endif /* __NETWORKMANAGER_IFNET_CONNECTION_H__ */
|
||||
|
|
@ -1,734 +0,0 @@
|
|||
/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */
|
||||
/*
|
||||
* Mu Qiao <qiaomuf@gmail.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program 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 General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Copyright (C) 1999-2010 Gentoo Foundation, Inc.
|
||||
*/
|
||||
|
||||
#include "nm-default.h"
|
||||
|
||||
#include "nms-ifnet-net-parser.h"
|
||||
|
||||
#include <string.h>
|
||||
#include <stdio.h>
|
||||
#include <sys/ioctl.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include "settings/nm-settings-plugin.h"
|
||||
#include "platform/nm-platform.h"
|
||||
|
||||
#include "nms-ifnet-plugin.h"
|
||||
#include "nms-ifnet-net-utils.h"
|
||||
|
||||
/* Save all the connection information */
|
||||
static GHashTable *conn_table;
|
||||
|
||||
/* Save global settings which are used for writing*/
|
||||
static GHashTable *global_settings_table;
|
||||
|
||||
/* Save functions */
|
||||
static GList *functions_list;
|
||||
|
||||
/* Used to decide whether to write changes to file*/
|
||||
static gboolean net_parser_data_changed = FALSE;
|
||||
|
||||
static GHashTable *
|
||||
add_new_connection_config (const gchar * type, const gchar * name)
|
||||
{
|
||||
GHashTable *new_conn;
|
||||
gchar *new_name;
|
||||
|
||||
if (!name)
|
||||
return NULL;
|
||||
|
||||
/* Return existing connection */
|
||||
if ((new_conn = g_hash_table_lookup (conn_table, name)) != NULL)
|
||||
return new_conn;
|
||||
new_conn = g_hash_table_new (nm_str_hash, g_str_equal);
|
||||
new_name = g_strdup (name);
|
||||
g_hash_table_insert (new_conn, g_strdup ("name"), new_name);
|
||||
g_hash_table_insert (new_conn, g_strdup ("type"), g_strdup (type));
|
||||
g_hash_table_insert (conn_table, new_name, new_conn);
|
||||
return new_conn;
|
||||
}
|
||||
|
||||
gboolean
|
||||
ifnet_add_network (const char *name, const char *type)
|
||||
{
|
||||
if (ifnet_has_network (name))
|
||||
return TRUE;
|
||||
if (add_new_connection_config (type, name)) {
|
||||
nm_log_info (LOGD_SETTINGS, "Adding network for %s", name);
|
||||
net_parser_data_changed = TRUE;
|
||||
return TRUE;
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
gboolean
|
||||
ifnet_has_network (const char *conn_name)
|
||||
{
|
||||
return g_hash_table_lookup (conn_table, conn_name) != NULL;
|
||||
}
|
||||
|
||||
static GHashTable *
|
||||
get_connection_config (const char *name)
|
||||
{
|
||||
return g_hash_table_lookup (conn_table, name);
|
||||
}
|
||||
|
||||
/* Ignored name won't be treated as wireless ssid */
|
||||
static gchar *ignore_name[] = {
|
||||
"vlan", "bond", "atm", "ath", "ippp", "vpn", "tap", "tun", "1",
|
||||
"br", "nas", "6to4", "timeout", "kvm", "force", NULL
|
||||
};
|
||||
|
||||
static gboolean
|
||||
ignore_connection_name (const char *name)
|
||||
{
|
||||
gboolean result = FALSE;
|
||||
guint i = 0;
|
||||
|
||||
/* check ignore_name list */
|
||||
while (ignore_name[i] != NULL) {
|
||||
if (g_ascii_strncasecmp
|
||||
(name, ignore_name[i], strlen (ignore_name[i])) == 0) {
|
||||
return TRUE;
|
||||
}
|
||||
i++;
|
||||
}
|
||||
/* Ignore mac address based configuration */
|
||||
if (strlen (name) == 12 && is_hex (name))
|
||||
result = TRUE;
|
||||
return result;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
is_global_setting (char *key)
|
||||
{
|
||||
static gchar *global_settings[] = { "wpa_supplicant_", NULL };
|
||||
int i;
|
||||
|
||||
for (i = 0; global_settings[i] != NULL; i++) {
|
||||
if (strstr (key, global_settings[i]))
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Parse a complete line */
|
||||
/* Connection type is determined here */
|
||||
static void
|
||||
init_block_by_line (gchar * buf)
|
||||
{
|
||||
gchar **key_value;
|
||||
gchar *pos;
|
||||
gchar *data;
|
||||
gchar *tmp;
|
||||
GHashTable *conn;
|
||||
|
||||
key_value = g_strsplit (buf, "=", 2);
|
||||
if (g_strv_length (key_value) != 2) {
|
||||
nm_log_warn (LOGD_SETTINGS, "Can't handle this line: %s\n", buf);
|
||||
g_strfreev (key_value);
|
||||
return;
|
||||
}
|
||||
pos = g_strrstr (key_value[0], "_");
|
||||
if (pos == NULL || is_global_setting (key_value[0])) {
|
||||
/* global data */
|
||||
data = g_strdup (key_value[1]);
|
||||
tmp = strip_string (data, '"');
|
||||
strip_string (tmp, '\'');
|
||||
nm_log_info (LOGD_SETTINGS, "global:%s-%s\n", key_value[0], tmp);
|
||||
g_hash_table_insert (global_settings_table, g_strdup (key_value[0]), g_strdup (tmp));
|
||||
g_strfreev (key_value);
|
||||
g_free (data);
|
||||
return;
|
||||
}
|
||||
*pos++ = '\0';
|
||||
if ((conn = get_connection_config (pos)) == NULL) {
|
||||
if (g_ascii_strncasecmp (pos, "eth", 3) == 0
|
||||
&& strlen (pos) == 4)
|
||||
/* wired connection */
|
||||
conn = add_new_connection_config ("wired", pos);
|
||||
else if (g_ascii_strncasecmp (pos, "ppp", 3) == 0
|
||||
&& strlen (pos) == 4)
|
||||
/* pppoe connection */
|
||||
conn = add_new_connection_config ("ppp", pos);
|
||||
else if (ignore_connection_name (pos)) {
|
||||
/* ignored connection */
|
||||
conn = add_new_connection_config ("ignore", pos);
|
||||
} else {
|
||||
int ifindex = nm_platform_link_get_ifindex (NM_PLATFORM_GET, pos);
|
||||
|
||||
if (ifindex && nm_platform_link_get_type (NM_PLATFORM_GET, ifindex) != NM_LINK_TYPE_WIFI)
|
||||
/* wired connection */
|
||||
conn = add_new_connection_config ("wired", pos);
|
||||
else
|
||||
/* wireless connection */
|
||||
conn = add_new_connection_config ("wireless", pos);
|
||||
}
|
||||
}
|
||||
data = g_strdup (key_value[1]);
|
||||
tmp = strip_string (data, '"');
|
||||
strip_string (tmp, '\'');
|
||||
if (conn)
|
||||
g_hash_table_insert (conn, strip_string (g_strdup (key_value[0]), ' '),
|
||||
g_strdup (tmp));
|
||||
g_free (data);
|
||||
g_strfreev (key_value);
|
||||
}
|
||||
|
||||
static void
|
||||
destroy_connection_config (GHashTable * conn)
|
||||
{
|
||||
gpointer key, value;
|
||||
GHashTableIter iter;
|
||||
|
||||
g_hash_table_iter_init (&iter, conn);
|
||||
while (g_hash_table_iter_next (&iter, &key, &value)) {
|
||||
g_free (key);
|
||||
g_free (value);
|
||||
}
|
||||
|
||||
g_hash_table_destroy (conn);
|
||||
}
|
||||
|
||||
static void
|
||||
strip_function (GIOChannel * channel, gchar * line)
|
||||
{
|
||||
|
||||
int counter = 0;
|
||||
gchar *p, *tmp;
|
||||
gboolean begin = FALSE;
|
||||
GString *function_str = g_string_new (line);
|
||||
|
||||
g_string_append (function_str, "\n");
|
||||
while (1) {
|
||||
p = line;
|
||||
while (*p != '\0') {
|
||||
if (*p == '{') {
|
||||
counter++;
|
||||
begin = TRUE;
|
||||
} else if (*p == '}')
|
||||
counter--;
|
||||
p++;
|
||||
}
|
||||
if (begin && counter == 0) {
|
||||
g_free (line);
|
||||
goto done;
|
||||
}
|
||||
while (1) {
|
||||
g_free (line);
|
||||
if (g_io_channel_read_line
|
||||
(channel, &line, NULL, NULL,
|
||||
NULL) == G_IO_STATUS_EOF)
|
||||
goto done;
|
||||
g_string_append (function_str, line);
|
||||
tmp = g_strdup (line);
|
||||
g_strstrip (tmp);
|
||||
if (tmp[0] != '#' && tmp[0] != '\0') {
|
||||
g_free (tmp);
|
||||
break;
|
||||
} else
|
||||
g_free (tmp);
|
||||
}
|
||||
}
|
||||
done:
|
||||
functions_list =
|
||||
g_list_append (functions_list, g_strdup (function_str->str));
|
||||
g_string_free (function_str, TRUE);
|
||||
}
|
||||
|
||||
static gboolean
|
||||
is_function (gchar * line)
|
||||
{
|
||||
static gchar *func_names[] =
|
||||
{ "preup", "predown", "postup", "postdown", "failup", "faildown",
|
||||
NULL,
|
||||
};
|
||||
int i;
|
||||
|
||||
for (i = 0; func_names[i]; i++) {
|
||||
if (g_str_has_prefix (line, func_names[i])) {
|
||||
nm_log_info (LOGD_SETTINGS, "Ignoring function: %s", func_names[i]);
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static void
|
||||
append_line (GString *buf, gchar* line)
|
||||
{
|
||||
gchar *pos = NULL;
|
||||
|
||||
if ((pos = strchr (line, '#')) != NULL)
|
||||
*pos = '\0';
|
||||
g_strstrip (line);
|
||||
|
||||
if (line[0] != '\0')
|
||||
g_string_append_printf (buf, " %s", line);
|
||||
g_free (line);
|
||||
}
|
||||
|
||||
gboolean
|
||||
ifnet_init (gchar * config_file)
|
||||
{
|
||||
GIOChannel *channel = NULL;
|
||||
gchar *line;
|
||||
|
||||
/* Handle multiple lines with brackets */
|
||||
gboolean complete = TRUE;
|
||||
|
||||
gboolean openrc_style = TRUE;
|
||||
|
||||
/* line buffer */
|
||||
GString *buf;
|
||||
|
||||
net_parser_data_changed = FALSE;
|
||||
|
||||
conn_table = g_hash_table_new (nm_str_hash, g_str_equal);
|
||||
global_settings_table = g_hash_table_new (nm_str_hash, g_str_equal);
|
||||
functions_list = NULL;
|
||||
|
||||
if (g_file_test (config_file, G_FILE_TEST_IS_REGULAR))
|
||||
channel = g_io_channel_new_file (config_file, "r", NULL);
|
||||
if (channel == NULL) {
|
||||
nm_log_warn (LOGD_SETTINGS, "Can't open %s", config_file);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
buf = g_string_new (NULL);
|
||||
while (g_io_channel_read_line
|
||||
(channel, &line, NULL, NULL, NULL) != G_IO_STATUS_EOF) {
|
||||
g_strstrip (line);
|
||||
/* convert multiple lines to a complete line and
|
||||
* pass it to init_block_by_line() */
|
||||
if (is_function (line)) {
|
||||
strip_function (channel, line);
|
||||
continue;
|
||||
}
|
||||
|
||||
// New openrc style, bash arrays are not allowed. We only care about '"'
|
||||
if (openrc_style && line[0] != '#' && line[0] != '\0'
|
||||
&& !strchr (line, '(') && !strchr (line, ')')) {
|
||||
gchar *tmp = line;
|
||||
|
||||
while ((tmp = strchr (tmp, '"')) != NULL) {
|
||||
complete = !complete;
|
||||
++tmp;
|
||||
}
|
||||
|
||||
append_line (buf, line);
|
||||
// Add "(separator) for routes. It will be easier for later parsing
|
||||
if (strstr (buf->str, "via"))
|
||||
g_string_append_printf (buf, "\"");
|
||||
|
||||
if (!complete)
|
||||
continue;
|
||||
|
||||
strip_string (buf->str, '"');
|
||||
|
||||
init_block_by_line (buf->str);
|
||||
g_string_free (buf, TRUE);
|
||||
buf = g_string_new (NULL);
|
||||
}
|
||||
// Old bash arrays for baselayout-1, to be deleted
|
||||
else if (line[0] != '#' && line[0] != '\0') {
|
||||
if (!complete) {
|
||||
complete =
|
||||
g_strrstr (line,
|
||||
")") == NULL ? FALSE : TRUE;
|
||||
|
||||
append_line (buf, line);
|
||||
if (!complete) {
|
||||
openrc_style = FALSE;
|
||||
continue;
|
||||
}
|
||||
else {
|
||||
openrc_style = TRUE;
|
||||
}
|
||||
} else {
|
||||
complete =
|
||||
(g_strrstr (line, "(") != NULL
|
||||
&& g_strrstr (line, ")") != NULL)
|
||||
|| g_strrstr (line, "(") == NULL;
|
||||
|
||||
append_line (buf, line);
|
||||
if (!complete)
|
||||
{
|
||||
openrc_style = FALSE;
|
||||
continue;
|
||||
} else {
|
||||
openrc_style = TRUE;
|
||||
}
|
||||
}
|
||||
init_block_by_line (buf->str);
|
||||
g_string_free (buf, TRUE);
|
||||
buf = g_string_new (NULL);
|
||||
} else
|
||||
/* Blank line or comment line */
|
||||
g_free (line);
|
||||
}
|
||||
|
||||
g_string_free (buf, TRUE);
|
||||
g_io_channel_shutdown (channel, FALSE, NULL);
|
||||
g_io_channel_unref (channel);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
const char *
|
||||
ifnet_get_data (const char *conn_name, const char *key)
|
||||
{
|
||||
GHashTable *conn;
|
||||
|
||||
g_return_val_if_fail (conn_name && key, NULL);
|
||||
|
||||
conn = g_hash_table_lookup (conn_table, conn_name);
|
||||
|
||||
if (conn)
|
||||
return g_hash_table_lookup (conn, key);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* format ip values for comparison */
|
||||
static gchar*
|
||||
format_ip_for_comparison (const gchar * value)
|
||||
{
|
||||
gchar **ipset;
|
||||
guint length, i;
|
||||
GString *formated_string = g_string_new (NULL);
|
||||
gchar *formatted = NULL;
|
||||
|
||||
ipset = g_strsplit (value, "\"", 0);
|
||||
length = g_strv_length (ipset);
|
||||
|
||||
for (i = 0; i < length; i++)
|
||||
{
|
||||
strip_string (ipset[i], ' ');
|
||||
if (ipset[i][0] != '\0')
|
||||
g_string_append_printf (formated_string,
|
||||
"%s ", ipset[i]);
|
||||
}
|
||||
formatted = g_strdup (formated_string->str);
|
||||
formatted[formated_string->len - 1] = '\0';
|
||||
|
||||
g_string_free (formated_string, TRUE);
|
||||
g_strfreev (ipset);
|
||||
|
||||
return formatted;
|
||||
}
|
||||
|
||||
void
|
||||
ifnet_set_data (const char *conn_name, const char *key, const char *value)
|
||||
{
|
||||
gpointer old_key = NULL, old_value = NULL;
|
||||
GHashTable *conn = g_hash_table_lookup (conn_table, conn_name);
|
||||
gchar * stripped = NULL;
|
||||
|
||||
if (!conn) {
|
||||
nm_log_warn (LOGD_SETTINGS, "%s does not exist!", conn_name);
|
||||
return;
|
||||
}
|
||||
if (value){
|
||||
stripped = g_strdup (value);
|
||||
strip_string (stripped, '"');
|
||||
}
|
||||
/* Remove existing key value pair */
|
||||
if (g_hash_table_lookup_extended (conn, key, &old_key, &old_value)) {
|
||||
|
||||
/* This ugly hack is due to baselayout compatibility. We have to
|
||||
* deal with different ip format. So sometimes we have the same ips
|
||||
* but different strings.
|
||||
*/
|
||||
if (stripped &&
|
||||
(!strcmp (key, "config")
|
||||
|| !strcmp (key, "routes")
|
||||
|| !strcmp (key, "pppd")
|
||||
|| !strcmp (key, "chat")))
|
||||
{
|
||||
gchar *old_ips = format_ip_for_comparison (old_value);
|
||||
gchar *new_ips = format_ip_for_comparison (value);
|
||||
if(!strcmp (old_ips, new_ips))
|
||||
{
|
||||
g_free (stripped);
|
||||
g_free (old_ips);
|
||||
g_free (new_ips);
|
||||
return;
|
||||
}
|
||||
g_free (old_ips);
|
||||
g_free (new_ips);
|
||||
}
|
||||
|
||||
if (stripped && !strcmp (old_value, stripped)) {
|
||||
g_free (stripped);
|
||||
return;
|
||||
}
|
||||
g_hash_table_remove (conn, old_key);
|
||||
g_free (old_key);
|
||||
g_free (old_value);
|
||||
} else if (!value)
|
||||
return;
|
||||
if (stripped)
|
||||
g_hash_table_insert (conn, g_strdup (key), stripped);
|
||||
net_parser_data_changed = TRUE;
|
||||
}
|
||||
|
||||
// Remember to free return value
|
||||
const char *
|
||||
ifnet_get_global_data (const gchar * key)
|
||||
{
|
||||
return g_hash_table_lookup (global_settings_table, key);
|
||||
}
|
||||
|
||||
// Return names of legal connections
|
||||
GList *
|
||||
ifnet_get_connection_names (void)
|
||||
{
|
||||
GList *names = g_hash_table_get_keys (conn_table);
|
||||
GList *iter, *result = NULL;
|
||||
|
||||
for (iter = names; iter; iter = iter->next) {
|
||||
if (!ignore_connection_name (iter->data))
|
||||
result = g_list_prepend (result, iter->data);
|
||||
}
|
||||
|
||||
g_list_free (names);
|
||||
return g_list_reverse (result);
|
||||
}
|
||||
|
||||
/* format IP and route for writing */
|
||||
static void
|
||||
format_ips (gchar * value, gchar ** out_line, gchar * key, gchar * name)
|
||||
{
|
||||
gchar **ipset;
|
||||
guint length, i;
|
||||
GString *formated_string = g_string_new (NULL);
|
||||
|
||||
strip_string (value, '(');
|
||||
strip_string (value, ')');
|
||||
strip_string (value, '"');
|
||||
ipset = g_strsplit (value, "\"", 0);
|
||||
length = g_strv_length (ipset);
|
||||
|
||||
//only one line
|
||||
if (length < 2) {
|
||||
*out_line =
|
||||
g_strdup_printf ("%s_%s=\"%s\"\n", key, name, value);
|
||||
goto done;
|
||||
}
|
||||
// Multiple lines
|
||||
g_string_append_printf (formated_string, "%s_%s=\"\n", key, name);
|
||||
for (i = 0; i < length; i++)
|
||||
{
|
||||
strip_string (ipset[i], ' ');
|
||||
if (ipset[i][0] != '\0')
|
||||
g_string_append_printf (formated_string,
|
||||
"%s\n", ipset[i]);
|
||||
}
|
||||
g_string_append (formated_string, "\"\n");
|
||||
*out_line = g_strdup (formated_string->str);
|
||||
done:
|
||||
g_string_free (formated_string, TRUE);
|
||||
g_strfreev (ipset);
|
||||
}
|
||||
|
||||
gboolean
|
||||
ifnet_flush_to_file (const char *config_file, gchar **out_backup)
|
||||
{
|
||||
GIOChannel *channel;
|
||||
GError *error = NULL;
|
||||
gpointer key, value, name, network;
|
||||
GHashTableIter iter, iter_network;
|
||||
GList *list_iter;
|
||||
gchar *out_line = NULL;
|
||||
gsize bytes_written;
|
||||
gboolean result = FALSE;
|
||||
gchar *backup;
|
||||
|
||||
if (!net_parser_data_changed)
|
||||
return TRUE;
|
||||
if (!conn_table || !global_settings_table)
|
||||
return FALSE;
|
||||
|
||||
backup = backup_file (config_file);
|
||||
|
||||
channel = g_io_channel_new_file (config_file, "w", NULL);
|
||||
if (!channel) {
|
||||
nm_log_warn (LOGD_SETTINGS, "Can't open file %s for writing", config_file);
|
||||
g_free (backup);
|
||||
return FALSE;
|
||||
}
|
||||
g_hash_table_iter_init (&iter, global_settings_table);
|
||||
nm_log_info (LOGD_SETTINGS, "Writing to %s", config_file);
|
||||
g_io_channel_write_chars (channel,
|
||||
"#Generated by NetworkManager\n"
|
||||
"###### Global Configuration ######\n",
|
||||
-1, &bytes_written, &error);
|
||||
if (error)
|
||||
goto done;
|
||||
|
||||
/* Writing global data */
|
||||
while (g_hash_table_iter_next (&iter, &key, &value)) {
|
||||
out_line =
|
||||
g_strdup_printf ("%s=\"%s\"\n", (gchar *) key, (gchar *) value);
|
||||
g_io_channel_write_chars (channel, out_line, -1,
|
||||
&bytes_written, &error);
|
||||
if (bytes_written == 0 || error)
|
||||
goto done;
|
||||
g_free (out_line);
|
||||
}
|
||||
|
||||
/* Writing connection data */
|
||||
g_io_channel_write_chars (channel,
|
||||
"\n###### Connection Configuration ######\n",
|
||||
-1, &bytes_written, &error);
|
||||
if (error)
|
||||
goto done;
|
||||
|
||||
g_hash_table_iter_init (&iter, conn_table);
|
||||
while (g_hash_table_iter_next (&iter, &name, &network)) {
|
||||
g_hash_table_iter_init (&iter_network, (GHashTable *) network);
|
||||
g_io_channel_write_chars (channel,
|
||||
"#----------------------------------\n",
|
||||
-1, &bytes_written, &error);
|
||||
if (error)
|
||||
goto done;
|
||||
|
||||
while (g_hash_table_iter_next (&iter_network, &key, &value)) {
|
||||
if (!g_str_has_prefix ((gchar *) key, "name")
|
||||
&& !g_str_has_prefix ((gchar *) key, "type")) {
|
||||
/* These keys contain brackets */
|
||||
if (strcmp
|
||||
((gchar *) key,
|
||||
"config") == 0
|
||||
|| strcmp ((gchar *) key,
|
||||
"routes") == 0
|
||||
|| strcmp ((gchar *) key,
|
||||
"pppd") == 0
|
||||
|| strcmp ((gchar *) key, "chat") == 0)
|
||||
format_ips (value, &out_line, (gchar *)
|
||||
key, (gchar *)
|
||||
name);
|
||||
else
|
||||
out_line =
|
||||
g_strdup_printf
|
||||
("%s_%s=\"%s\"\n",
|
||||
(gchar *) key,
|
||||
(gchar *) name, (gchar *) value);
|
||||
g_io_channel_write_chars (channel, out_line, -1, &bytes_written, &error);
|
||||
if (bytes_written == 0 || error)
|
||||
goto done;
|
||||
g_free (out_line);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* Writing reserved functions */
|
||||
if (functions_list) {
|
||||
g_io_channel_write_chars (channel,
|
||||
"\n###### Reserved Functions ######\n",
|
||||
-1, &bytes_written, &error);
|
||||
if (error)
|
||||
goto done;
|
||||
|
||||
/* Writing functions */
|
||||
for (list_iter = functions_list; list_iter;
|
||||
list_iter = g_list_next (list_iter)) {
|
||||
out_line =
|
||||
g_strdup_printf ("%s\n", (gchar *) list_iter->data);
|
||||
g_io_channel_write_chars (channel, out_line, -1,
|
||||
&bytes_written, &error);
|
||||
if (bytes_written == 0 || error)
|
||||
goto done;
|
||||
g_free (out_line);
|
||||
}
|
||||
}
|
||||
|
||||
g_io_channel_flush (channel, &error);
|
||||
if (error)
|
||||
goto done;
|
||||
result = TRUE;
|
||||
net_parser_data_changed = FALSE;
|
||||
|
||||
done:
|
||||
if (error) {
|
||||
nm_log_warn (LOGD_SETTINGS, "Error writing the configuration file: %s", error->message);
|
||||
g_error_free (error);
|
||||
}
|
||||
|
||||
if (result && out_backup)
|
||||
*out_backup = backup;
|
||||
else
|
||||
g_free (backup);
|
||||
|
||||
g_io_channel_shutdown (channel, FALSE, NULL);
|
||||
g_io_channel_unref (channel);
|
||||
return result;
|
||||
}
|
||||
|
||||
gboolean
|
||||
ifnet_delete_network (const char *conn_name)
|
||||
{
|
||||
GHashTable *network = NULL;
|
||||
|
||||
g_return_val_if_fail (conn_table != NULL && conn_name != NULL, FALSE);
|
||||
nm_log_info (LOGD_SETTINGS, "Deleting network for %s", conn_name);
|
||||
network = g_hash_table_lookup (conn_table, conn_name);
|
||||
if (!network)
|
||||
return FALSE;
|
||||
g_hash_table_remove (conn_table, conn_name);
|
||||
destroy_connection_config (network);
|
||||
net_parser_data_changed = TRUE;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
void
|
||||
ifnet_destroy (void)
|
||||
{
|
||||
GHashTableIter iter;
|
||||
gpointer key;
|
||||
gpointer value;
|
||||
GList *list_iter;
|
||||
|
||||
/* Destroy connection setting */
|
||||
if (conn_table) {
|
||||
g_hash_table_iter_init (&iter, conn_table);
|
||||
while (g_hash_table_iter_next (&iter, &key, &value)) {
|
||||
destroy_connection_config ((GHashTable *)
|
||||
value);
|
||||
}
|
||||
g_hash_table_destroy (conn_table);
|
||||
conn_table = NULL;
|
||||
}
|
||||
|
||||
/* Destroy global data */
|
||||
if (global_settings_table) {
|
||||
g_hash_table_iter_init (&iter, global_settings_table);
|
||||
while (g_hash_table_iter_next (&iter, &key, &value)) {
|
||||
g_free (key);
|
||||
g_free (value);
|
||||
}
|
||||
g_hash_table_destroy (global_settings_table);
|
||||
global_settings_table = NULL;
|
||||
}
|
||||
for (list_iter = functions_list; list_iter;
|
||||
list_iter = g_list_next (list_iter))
|
||||
g_free (list_iter->data);
|
||||
g_list_free (functions_list);
|
||||
}
|
||||
|
|
@ -1,42 +0,0 @@
|
|||
/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */
|
||||
/*
|
||||
* Mu Qiao <qiaomuf@gmail.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program 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 General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Copyright (C) 1999-2010 Gentoo Foundation, Inc.
|
||||
*/
|
||||
|
||||
#ifndef _NET_PARSER_H
|
||||
#define _NET_PARSER_H
|
||||
|
||||
#define CONF_NET_FILE SYSCONFDIR "/conf.d/net"
|
||||
|
||||
gboolean ifnet_init (gchar * config_file);
|
||||
void ifnet_destroy (void);
|
||||
|
||||
/* Reader functions */
|
||||
GList *ifnet_get_connection_names (void);
|
||||
const char *ifnet_get_data (const char *conn_name, const char *key);
|
||||
const char *ifnet_get_global_data (const char *key);
|
||||
gboolean ifnet_has_network (const char *conn_name);
|
||||
|
||||
/* Writer functions */
|
||||
gboolean ifnet_flush_to_file (const char *config_file, gchar **out_backup);
|
||||
void ifnet_set_data (const char *conn_name, const char *key, const char *value);
|
||||
gboolean ifnet_add_network (const char *name, const char *type);
|
||||
gboolean ifnet_delete_network (const char *conn_name);
|
||||
|
||||
#endif
|
||||
|
|
@ -1,830 +0,0 @@
|
|||
/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */
|
||||
/*
|
||||
* Mu Qiao <qiaomuf@gmail.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program 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 General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Copyright (C) 1999-2010 Gentoo Foundation, Inc.
|
||||
*/
|
||||
|
||||
#include "nm-default.h"
|
||||
|
||||
#include "nms-ifnet-net-utils.h"
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <errno.h>
|
||||
|
||||
#include "nm-utils.h"
|
||||
#include "NetworkManagerUtils.h"
|
||||
#include "settings/nm-settings-plugin.h"
|
||||
#include "nm-config.h"
|
||||
#include "dhcp/nm-dhcp-manager.h"
|
||||
|
||||
#include "nms-ifnet-wpa-parser.h"
|
||||
#include "nms-ifnet-net-parser.h"
|
||||
|
||||
/* emit heading and tailing blank space, tab, character t */
|
||||
gchar *
|
||||
strip_string (gchar * str, gchar t)
|
||||
{
|
||||
gchar *ret = str;
|
||||
gint length = 0;
|
||||
guint i = 0;
|
||||
|
||||
while (ret[i] != '\0'
|
||||
&& (ret[i] == '\t' || ret[i] == ' ' || ret[i] == t)) {
|
||||
length++;
|
||||
i++;
|
||||
}
|
||||
i = 0;
|
||||
while (ret[i + length] != '\0') {
|
||||
ret[i] = ret[i + length];
|
||||
i++;
|
||||
}
|
||||
ret[i] = '\0';
|
||||
length = strlen (ret);
|
||||
while ((length - 1) >= 0
|
||||
&& (ret[length - 1] == ' ' || ret[length - 1] == '\n'
|
||||
|| ret[length - 1] == '\t' || ret[length - 1] == t))
|
||||
length--;
|
||||
ret[length] = '\0';
|
||||
return ret;
|
||||
}
|
||||
|
||||
gboolean
|
||||
is_hex (const char *value)
|
||||
{
|
||||
const char *p = value;
|
||||
|
||||
if (!p)
|
||||
return FALSE;
|
||||
while (*p) {
|
||||
if (!g_ascii_isxdigit (*p++))
|
||||
return FALSE;
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
gboolean
|
||||
is_ascii (const char *value)
|
||||
{
|
||||
const char *p = value;
|
||||
|
||||
while (*p) {
|
||||
if (!g_ascii_isprint (*p++))
|
||||
return FALSE;
|
||||
}
|
||||
return TRUE;
|
||||
|
||||
}
|
||||
|
||||
gboolean
|
||||
is_true (const char *str)
|
||||
{
|
||||
if (!g_ascii_strcasecmp (str, "yes")
|
||||
|| !g_ascii_strcasecmp (str, "true"))
|
||||
return TRUE;
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static char *
|
||||
find_default_gateway_str (char *str)
|
||||
{
|
||||
char *tmp;
|
||||
|
||||
if ((tmp = strstr (str, "default via ")) != NULL) {
|
||||
return tmp + strlen ("default via ");
|
||||
} else if ((tmp = strstr (str, "default gw ")) != NULL) {
|
||||
return tmp + strlen ("default gw ");
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static char *
|
||||
find_gateway_str (char *str)
|
||||
{
|
||||
char *tmp;
|
||||
|
||||
if ((tmp = strstr (str, "via ")) != NULL) {
|
||||
return tmp + strlen ("via ");
|
||||
} else if ((tmp = strstr (str, "gw ")) != NULL) {
|
||||
return tmp + strlen ("gw ");
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
gboolean
|
||||
reload_parsers (void)
|
||||
{
|
||||
ifnet_destroy ();
|
||||
wpa_parser_destroy ();
|
||||
if (!ifnet_init (CONF_NET_FILE))
|
||||
return FALSE;
|
||||
wpa_parser_init (WPA_SUPPLICANT_CONF);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
gboolean
|
||||
is_static_ip4 (const char *conn_name)
|
||||
{
|
||||
const char *data = ifnet_get_data (conn_name, "config");
|
||||
const char *dhcp6;
|
||||
|
||||
if (!data)
|
||||
return FALSE;
|
||||
if (!strcmp (data, "shared"))
|
||||
return FALSE;
|
||||
if (!strcmp (data, "autoip"))
|
||||
return FALSE;
|
||||
dhcp6 = strstr (data, "dhcp6");
|
||||
if (dhcp6) {
|
||||
gchar *dhcp4;
|
||||
|
||||
if (strstr (data, "dhcp "))
|
||||
return FALSE;
|
||||
dhcp4 = strstr (data, "dhcp");
|
||||
if (!dhcp4)
|
||||
return TRUE;
|
||||
if (dhcp4[4] == '\0')
|
||||
return FALSE;
|
||||
return TRUE;
|
||||
}
|
||||
return strstr (data, "dhcp") == NULL ? TRUE : FALSE;
|
||||
}
|
||||
|
||||
gboolean
|
||||
is_static_ip6 (const char *conn_name)
|
||||
{
|
||||
const char *data = ifnet_get_data (conn_name, "config");
|
||||
|
||||
if (!data)
|
||||
return TRUE;
|
||||
return strstr (data, "dhcp6") == NULL ? TRUE : FALSE;
|
||||
}
|
||||
|
||||
gboolean
|
||||
is_ip4_address (const char *in_address)
|
||||
{
|
||||
const char *pattern =
|
||||
"\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.((\\{\\d{1,3}\\.\\.\\d{1,3}\\})|\\d{1,3})$";
|
||||
gchar *address = g_strdup (in_address);
|
||||
gboolean result = FALSE;
|
||||
gchar *tmp;
|
||||
GRegex *regex = g_regex_new (pattern, 0, 0, NULL);
|
||||
GMatchInfo *match_info = NULL;
|
||||
|
||||
if (!address)
|
||||
goto done;
|
||||
g_strstrip (address);
|
||||
if ((tmp = strstr (address, "/")) != NULL)
|
||||
*tmp = '\0';
|
||||
if ((tmp = strstr (address, " ")) != NULL)
|
||||
*tmp = '\0';
|
||||
g_regex_match (regex, address, 0, &match_info);
|
||||
result = g_match_info_matches (match_info);
|
||||
done:
|
||||
if (match_info)
|
||||
g_match_info_free (match_info);
|
||||
g_regex_unref (regex);
|
||||
g_free (address);
|
||||
return result;
|
||||
}
|
||||
|
||||
gboolean
|
||||
is_ip6_address (const char *in_address)
|
||||
{
|
||||
struct in6_addr tmp_ip6_addr;
|
||||
gchar *tmp, *address;
|
||||
gboolean result = FALSE;
|
||||
|
||||
if (!in_address)
|
||||
return FALSE;
|
||||
address = g_strdup (in_address);
|
||||
g_strstrip (address);
|
||||
if ((tmp = strchr (address, '/')) != NULL)
|
||||
*tmp = '\0';
|
||||
if (inet_pton (AF_INET6, address, &tmp_ip6_addr))
|
||||
result = TRUE;
|
||||
g_free (address);
|
||||
return result;
|
||||
|
||||
}
|
||||
|
||||
// 'c' is only used for openrc style
|
||||
static gchar **
|
||||
split_addresses_by_char (const gchar *addresses, const gchar *c)
|
||||
{
|
||||
gchar **ipset;
|
||||
|
||||
if (addresses == NULL)
|
||||
return NULL;
|
||||
|
||||
if (strchr (addresses, '(') != NULL) { // old baselayout style
|
||||
gchar *tmp = g_strdup (addresses);
|
||||
strip_string (tmp, '(');
|
||||
strip_string (tmp, ')');
|
||||
strip_string (tmp, '"');
|
||||
strip_string (tmp, '\'');
|
||||
ipset = g_strsplit (tmp, "\" \"", 0);
|
||||
g_free(tmp);
|
||||
} else { // openrc style
|
||||
if (strstr (addresses, "netmask"))
|
||||
// There is only one ip address if "netmask" is specified.
|
||||
// '\n' is not used in config so there will be only one split.
|
||||
ipset = g_strsplit (addresses, "\n", 0);
|
||||
else
|
||||
ipset = g_strsplit (addresses, c, 0);
|
||||
}
|
||||
|
||||
return ipset;
|
||||
}
|
||||
|
||||
static gchar **
|
||||
split_addresses (const gchar* addresses)
|
||||
{
|
||||
// " " is only used by openrc style
|
||||
return split_addresses_by_char (addresses, " ");
|
||||
}
|
||||
|
||||
static gchar **
|
||||
split_routes (const gchar* routes)
|
||||
{
|
||||
// "\"" is only used by openrc style
|
||||
return split_addresses_by_char (routes, "\"");
|
||||
}
|
||||
|
||||
gboolean
|
||||
has_ip6_address (const char *conn_name)
|
||||
{
|
||||
gchar **ipset;
|
||||
guint length;
|
||||
guint i;
|
||||
|
||||
g_return_val_if_fail (conn_name != NULL, FALSE);
|
||||
ipset = split_addresses (ifnet_get_data (conn_name, "config"));
|
||||
length = ipset ? g_strv_length (ipset) : 0;
|
||||
for (i = 0; i < length; i++) {
|
||||
if (!is_ip6_address (ipset[i]))
|
||||
continue;
|
||||
else {
|
||||
g_strfreev (ipset);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
}
|
||||
g_strfreev (ipset);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
gboolean
|
||||
has_default_route (const char *conn_name, gboolean (*check_fn) (const char *))
|
||||
{
|
||||
char *routes = NULL, *end, *tmp;
|
||||
gboolean success = FALSE;
|
||||
|
||||
g_return_val_if_fail (conn_name != NULL, FALSE);
|
||||
|
||||
routes = g_strdup (ifnet_get_data (conn_name, "routes"));
|
||||
if (!routes)
|
||||
return FALSE;
|
||||
tmp = find_default_gateway_str (routes);
|
||||
if (tmp) {
|
||||
g_strstrip (tmp);
|
||||
if ((end = strstr (tmp, "\"")) != NULL)
|
||||
*end = '\0';
|
||||
if (check_fn (tmp))
|
||||
success = TRUE;
|
||||
}
|
||||
|
||||
g_free (routes);
|
||||
return success;
|
||||
}
|
||||
|
||||
static ip_block *
|
||||
create_ip4_block (gchar * ip)
|
||||
{
|
||||
ip_block *iblock = g_slice_new0 (ip_block);
|
||||
guint32 tmp_ip4_addr;
|
||||
int i;
|
||||
guint length;
|
||||
gchar **ip_mask;
|
||||
|
||||
/* prefix format */
|
||||
if (strstr (ip, "/")) {
|
||||
gchar *prefix;
|
||||
|
||||
ip_mask = g_strsplit (ip, "/", 0);
|
||||
length = g_strv_length (ip_mask);
|
||||
if (!nm_utils_ipaddr_valid (AF_INET, ip_mask[0]))
|
||||
goto error;
|
||||
iblock->ip = g_strdup (ip_mask[0]);
|
||||
prefix = ip_mask[1];
|
||||
i = 0;
|
||||
while (i < length && g_ascii_isdigit (prefix[i]))
|
||||
i++;
|
||||
prefix[i] = '\0';
|
||||
iblock->prefix = (guint32) atoi (ip_mask[1]);
|
||||
} else if (strstr (ip, "netmask")) {
|
||||
ip_mask = g_strsplit (ip, " ", 0);
|
||||
length = g_strv_length (ip_mask);
|
||||
if (!nm_utils_ipaddr_valid (AF_INET, ip_mask[0]))
|
||||
goto error;
|
||||
iblock->ip = g_strdup (ip_mask[0]);
|
||||
i = 0;
|
||||
while (i < length && !strstr (ip_mask[++i], "netmask")) ;
|
||||
while (i < length && ip_mask[++i][0] == '\0') ;
|
||||
if (i >= length)
|
||||
goto error;
|
||||
if (!inet_pton (AF_INET, ip_mask[i], &tmp_ip4_addr))
|
||||
goto error;
|
||||
iblock->prefix = nm_utils_ip4_netmask_to_prefix (tmp_ip4_addr);
|
||||
} else {
|
||||
g_slice_free (ip_block, iblock);
|
||||
if (!is_ip6_address (ip) && !strstr (ip, "dhcp"))
|
||||
nm_log_warn (LOGD_SETTINGS, "Can't handle ipv4 address: %s, missing netmask or prefix", ip);
|
||||
return NULL;
|
||||
}
|
||||
if (iblock->prefix == 0 || iblock->prefix > 32) {
|
||||
nm_log_warn (LOGD_SETTINGS, "Can't handle ipv4 address: %s, invalid prefix", ip);
|
||||
goto error;
|
||||
}
|
||||
g_strfreev (ip_mask);
|
||||
return iblock;
|
||||
error:
|
||||
if (!is_ip6_address (ip))
|
||||
nm_log_warn (LOGD_SETTINGS, "Can't handle IPv4 address: %s", ip);
|
||||
g_strfreev (ip_mask);
|
||||
g_free (iblock->ip);
|
||||
g_slice_free (ip_block, iblock);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static ip_block *
|
||||
create_ip_block (gchar * ip)
|
||||
{
|
||||
ip_block *iblock = g_slice_new0 (ip_block);
|
||||
gchar *dup_ip = g_strdup (ip);
|
||||
gchar *prefix = NULL;
|
||||
|
||||
if ((prefix = strstr (dup_ip, "/")) != NULL) {
|
||||
*prefix = '\0';
|
||||
prefix++;
|
||||
}
|
||||
if (!nm_utils_ipaddr_valid (AF_INET6, dup_ip))
|
||||
goto error;
|
||||
iblock->ip = dup_ip;
|
||||
if (prefix) {
|
||||
errno = 0;
|
||||
iblock->prefix = strtol (prefix, NULL, 10);
|
||||
if (errno || iblock->prefix <= 0 || iblock->prefix > 128) {
|
||||
goto error;
|
||||
}
|
||||
} else
|
||||
iblock->prefix = 64;
|
||||
return iblock;
|
||||
error:
|
||||
if (!is_ip4_address (ip))
|
||||
nm_log_warn (LOGD_SETTINGS, "Can't handle IPv6 address: %s", ip);
|
||||
g_slice_free (ip_block, iblock);
|
||||
g_free (dup_ip);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static char *
|
||||
get_ip4_gateway (gchar * gateway)
|
||||
{
|
||||
gchar *tmp, *split;
|
||||
|
||||
if (!gateway)
|
||||
return NULL;
|
||||
tmp = find_gateway_str (gateway);
|
||||
if (!tmp) {
|
||||
nm_log_warn (LOGD_SETTINGS, "Couldn't obtain gateway in \"%s\"", gateway);
|
||||
return NULL;
|
||||
}
|
||||
tmp = g_strdup (tmp);
|
||||
strip_string (tmp, ' ');
|
||||
strip_string (tmp, '"');
|
||||
|
||||
// Only one gateway is selected
|
||||
if ((split = strstr (tmp, "\"")) != NULL)
|
||||
*split = '\0';
|
||||
|
||||
if (!nm_utils_ipaddr_valid (AF_INET, tmp))
|
||||
goto error;
|
||||
return tmp;
|
||||
error:
|
||||
if (!is_ip6_address (tmp))
|
||||
nm_log_warn (LOGD_SETTINGS, "Can't handle IPv4 gateway: %s", tmp);
|
||||
g_free (tmp);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static char *
|
||||
get_ip6_next_hop (gchar * next_hop)
|
||||
{
|
||||
gchar *tmp;
|
||||
|
||||
if (!next_hop)
|
||||
return NULL;
|
||||
tmp = find_gateway_str (next_hop);
|
||||
if (!tmp) {
|
||||
nm_log_warn (LOGD_SETTINGS, "Couldn't obtain next_hop in \"%s\"", next_hop);
|
||||
return NULL;
|
||||
}
|
||||
tmp = g_strdup (tmp);
|
||||
strip_string (tmp, ' ');
|
||||
strip_string (tmp, '"');
|
||||
g_strstrip (tmp);
|
||||
if (!nm_utils_ipaddr_valid (AF_INET6, tmp))
|
||||
goto error;
|
||||
return tmp;
|
||||
error:
|
||||
if (!is_ip4_address (tmp))
|
||||
nm_log_warn (LOGD_SETTINGS, "Can't handle IPv6 next_hop: %s", tmp);
|
||||
g_free (tmp);
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
ip_block *
|
||||
convert_ip4_config_block (const char *conn_name)
|
||||
{
|
||||
gchar **ipset;
|
||||
guint length;
|
||||
guint i;
|
||||
gchar *ip;
|
||||
char *def_gateway = NULL;
|
||||
const char *routes;
|
||||
ip_block *start = NULL, *current = NULL, *iblock = NULL;
|
||||
|
||||
g_return_val_if_fail (conn_name != NULL, NULL);
|
||||
|
||||
ipset = split_addresses (ifnet_get_data (conn_name, "config"));
|
||||
length = ipset ? g_strv_length (ipset) : 0;
|
||||
|
||||
routes = ifnet_get_data (conn_name, "routes");
|
||||
if (routes)
|
||||
def_gateway = get_ip4_gateway (strstr (routes, "default"));
|
||||
|
||||
for (i = 0; i < length; i++) {
|
||||
ip = ipset[i];
|
||||
ip = strip_string (ip, '"');
|
||||
iblock = create_ip4_block (ip);
|
||||
if (iblock == NULL)
|
||||
continue;
|
||||
if (!iblock->next_hop && def_gateway != NULL)
|
||||
iblock->next_hop = g_strdup (def_gateway);
|
||||
if (start == NULL)
|
||||
start = current = iblock;
|
||||
else {
|
||||
current->next = iblock;
|
||||
current = iblock;
|
||||
}
|
||||
}
|
||||
g_strfreev (ipset);
|
||||
g_free (def_gateway);
|
||||
return start;
|
||||
}
|
||||
|
||||
ip_block *
|
||||
convert_ip6_config_block (const char *conn_name)
|
||||
{
|
||||
gchar **ipset;
|
||||
guint length;
|
||||
guint i;
|
||||
gchar *ip;
|
||||
ip_block *start = NULL, *current = NULL, *iblock = NULL;
|
||||
|
||||
g_return_val_if_fail (conn_name != NULL, NULL);
|
||||
ipset = split_addresses (ifnet_get_data (conn_name, "config"));
|
||||
length = ipset ? g_strv_length (ipset) : 0;
|
||||
for (i = 0; i < length; i++) {
|
||||
ip = ipset[i];
|
||||
ip = strip_string (ip, '"');
|
||||
iblock = create_ip_block (ip);
|
||||
if (iblock == NULL)
|
||||
continue;
|
||||
if (start == NULL)
|
||||
start = current = iblock;
|
||||
else {
|
||||
current->next = iblock;
|
||||
current = iblock;
|
||||
}
|
||||
}
|
||||
g_strfreev (ipset);
|
||||
return start;
|
||||
}
|
||||
|
||||
ip_block *
|
||||
convert_ip4_routes_block (const char *conn_name)
|
||||
{
|
||||
gchar **ipset;
|
||||
guint length;
|
||||
guint i;
|
||||
gchar *ip;
|
||||
ip_block *start = NULL, *current = NULL, *iblock = NULL;
|
||||
|
||||
g_return_val_if_fail (conn_name != NULL, NULL);
|
||||
|
||||
ipset = split_routes (ifnet_get_data (conn_name, "routes"));
|
||||
length = ipset ? g_strv_length (ipset) : 0;
|
||||
for (i = 0; i < length; i++) {
|
||||
ip = ipset[i];
|
||||
if (find_default_gateway_str (ip) || strstr (ip, "::")
|
||||
|| !find_gateway_str (ip))
|
||||
continue;
|
||||
ip = strip_string (ip, '"');
|
||||
iblock = create_ip4_block (ip);
|
||||
if (iblock == NULL)
|
||||
continue;
|
||||
iblock->next_hop = get_ip4_gateway (ip);
|
||||
if (start == NULL)
|
||||
start = current = iblock;
|
||||
else {
|
||||
current->next = iblock;
|
||||
current = iblock;
|
||||
}
|
||||
}
|
||||
g_strfreev (ipset);
|
||||
return start;
|
||||
}
|
||||
|
||||
ip_block *
|
||||
convert_ip6_routes_block (const char *conn_name)
|
||||
{
|
||||
gchar **ipset;
|
||||
guint length;
|
||||
guint i;
|
||||
gchar *ip, *tmp_addr;
|
||||
ip_block *start = NULL, *current = NULL, *iblock = NULL;
|
||||
|
||||
g_return_val_if_fail (conn_name != NULL, NULL);
|
||||
ipset = split_routes (ifnet_get_data (conn_name, "routes"));
|
||||
length = ipset ? g_strv_length (ipset) : 0;
|
||||
for (i = 0; i < length; i++) {
|
||||
ip = ipset[i];
|
||||
ip = strip_string (ip, '"');
|
||||
if (ip[0] == '\0')
|
||||
continue;
|
||||
if ((tmp_addr = find_default_gateway_str (ip)) != NULL) {
|
||||
if (!is_ip6_address (tmp_addr))
|
||||
continue;
|
||||
else {
|
||||
iblock = g_slice_new0 (ip_block);
|
||||
iblock->ip = g_strdup ("::");
|
||||
iblock->prefix = 128;
|
||||
}
|
||||
} else
|
||||
iblock = create_ip_block (ip);
|
||||
if (iblock == NULL)
|
||||
continue;
|
||||
iblock->next_hop = get_ip6_next_hop (ip);
|
||||
if (iblock->next_hop == NULL) {
|
||||
destroy_ip_block (iblock);
|
||||
continue;
|
||||
}
|
||||
if (start == NULL)
|
||||
start = current = iblock;
|
||||
else {
|
||||
current->next = iblock;
|
||||
current = iblock;
|
||||
}
|
||||
}
|
||||
g_strfreev (ipset);
|
||||
return start;
|
||||
}
|
||||
|
||||
void
|
||||
destroy_ip_block (ip_block * iblock)
|
||||
{
|
||||
g_free (iblock->ip);
|
||||
g_free (iblock->next_hop);
|
||||
g_slice_free (ip_block, iblock);
|
||||
}
|
||||
|
||||
void
|
||||
set_ip4_dns_servers (NMSettingIPConfig *s_ip4, const char *conn_name)
|
||||
{
|
||||
const char *dns_servers;
|
||||
gchar **server_list, *stripped;
|
||||
guint length, i;
|
||||
guint32 tmp_ip4_addr;
|
||||
|
||||
dns_servers = ifnet_get_data (conn_name, "dns_servers");
|
||||
if (!dns_servers)
|
||||
return;
|
||||
stripped = g_strdup (dns_servers);
|
||||
strip_string (stripped, '"');
|
||||
server_list = g_strsplit (stripped, " ", 0);
|
||||
g_free (stripped);
|
||||
|
||||
length = g_strv_length (server_list);
|
||||
if (length)
|
||||
g_object_set (s_ip4, NM_SETTING_IP_CONFIG_IGNORE_AUTO_DNS,
|
||||
TRUE, NULL);
|
||||
for (i = 0; i < length; i++) {
|
||||
g_strstrip (server_list[i]);
|
||||
if (server_list[i][0] == '\0')
|
||||
continue;
|
||||
if (!inet_pton (AF_INET, server_list[i], &tmp_ip4_addr)) {
|
||||
if (!is_ip6_address (server_list[i]))
|
||||
nm_log_warn (LOGD_SETTINGS, "ignored dns: %s\n", server_list[i]);
|
||||
continue;
|
||||
}
|
||||
if (!nm_setting_ip_config_add_dns (s_ip4, server_list[i]))
|
||||
nm_log_warn (LOGD_SETTINGS, "warning: duplicate DNS server %s", server_list[i]);
|
||||
}
|
||||
g_strfreev (server_list);
|
||||
}
|
||||
|
||||
void
|
||||
set_ip6_dns_servers (NMSettingIPConfig *s_ip6, const char *conn_name)
|
||||
{
|
||||
const char *dns_servers;
|
||||
gchar **server_list, *stripped;
|
||||
guint length, i;
|
||||
struct in6_addr tmp_ip6_addr;
|
||||
|
||||
dns_servers = ifnet_get_data (conn_name, "dns_servers");
|
||||
if (!dns_servers)
|
||||
return;
|
||||
|
||||
stripped = g_strdup (dns_servers);
|
||||
strip_string (stripped, '"');
|
||||
server_list = g_strsplit (stripped, " ", 0);
|
||||
g_free (stripped);
|
||||
|
||||
length = g_strv_length (server_list);
|
||||
if (length)
|
||||
g_object_set (s_ip6, NM_SETTING_IP_CONFIG_IGNORE_AUTO_DNS,
|
||||
TRUE, NULL);
|
||||
for (i = 0; i < length; i++) {
|
||||
g_strstrip (server_list[i]);
|
||||
if (server_list[i][0] == '\0')
|
||||
continue;
|
||||
if (!inet_pton (AF_INET6, server_list[i], &tmp_ip6_addr)) {
|
||||
if (is_ip6_address (server_list[i]))
|
||||
nm_log_warn (LOGD_SETTINGS, "ignored dns: %s\n", server_list[i]);
|
||||
continue;
|
||||
}
|
||||
if (!nm_setting_ip_config_add_dns (s_ip6, server_list[i]))
|
||||
nm_log_warn (LOGD_SETTINGS, "warning: duplicate DNS server %s", server_list[i]);
|
||||
}
|
||||
g_strfreev (server_list);
|
||||
}
|
||||
|
||||
gboolean
|
||||
is_managed (const char *conn_name)
|
||||
{
|
||||
gchar *config;
|
||||
|
||||
g_return_val_if_fail (conn_name != NULL, FALSE);
|
||||
config = (gchar *) ifnet_get_data (conn_name, "managed");
|
||||
if (!config)
|
||||
return TRUE;
|
||||
if (strcmp (config, "false") == 0)
|
||||
return FALSE;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static char *
|
||||
_has_prefix_impl (char *str, const char *prefix, gsize prefix_len)
|
||||
{
|
||||
if (!g_str_has_prefix (str, prefix))
|
||||
return NULL;
|
||||
str += prefix_len;
|
||||
if (!g_ascii_isspace (str[0]))
|
||||
return NULL;
|
||||
do {
|
||||
str++;
|
||||
} while (g_ascii_isspace (str[0]));
|
||||
return str;
|
||||
}
|
||||
#define _has_prefix(STR, PREFIX) _has_prefix_impl (STR, PREFIX, NM_STRLEN (PREFIX))
|
||||
|
||||
void
|
||||
get_dhcp_hostname_and_client_id (char **hostname, char **client_id)
|
||||
{
|
||||
const char *dhcp_client;
|
||||
const gchar *dhcpcd_conf = SYSCONFDIR "/dhcpcd.conf";
|
||||
const gchar *dhclient_conf = SYSCONFDIR "/dhcp/dhclient.conf";
|
||||
gchar *line = NULL, *tmp = NULL, *contents = NULL, *tmp1;
|
||||
gchar **all_lines;
|
||||
guint line_num, i;
|
||||
gboolean use_dhclient = FALSE;
|
||||
|
||||
*hostname = NULL;
|
||||
*client_id = NULL;
|
||||
dhcp_client = nm_dhcp_manager_get_config (nm_dhcp_manager_get ());
|
||||
if (dhcp_client) {
|
||||
if (!strcmp (dhcp_client, "dhclient")) {
|
||||
g_file_get_contents (dhclient_conf, &contents, NULL,
|
||||
NULL);
|
||||
use_dhclient = TRUE;
|
||||
} else if (!strcmp (dhcp_client, "dhcpcd")) {
|
||||
g_file_get_contents (dhcpcd_conf, &contents, NULL,
|
||||
NULL);
|
||||
}
|
||||
} else {
|
||||
if (g_file_test (dhclient_conf, G_FILE_TEST_IS_REGULAR)) {
|
||||
g_file_get_contents (dhclient_conf, &contents, NULL,
|
||||
NULL);
|
||||
use_dhclient = TRUE;
|
||||
} else if (g_file_test (dhcpcd_conf, G_FILE_TEST_IS_REGULAR)) {
|
||||
g_file_get_contents (dhcpcd_conf, &contents, NULL,
|
||||
NULL);
|
||||
}
|
||||
}
|
||||
if (!contents)
|
||||
return;
|
||||
all_lines = g_strsplit (contents, "\n", 0);
|
||||
line_num = g_strv_length (all_lines);
|
||||
for (i = 0; i < line_num; i++) {
|
||||
line = all_lines[i];
|
||||
g_strstrip (line);
|
||||
if (line[0] == '#' || line[0] == '\0')
|
||||
continue;
|
||||
if (!use_dhclient) {
|
||||
// dhcpcd.conf
|
||||
if ((tmp = _has_prefix (line, "hostname"))) {
|
||||
if (tmp[0] != '\0') {
|
||||
g_free (*hostname);
|
||||
*hostname = g_strdup (tmp);
|
||||
} else
|
||||
nm_log_info (LOGD_SETTINGS, "dhcpcd hostname not defined, ignoring");
|
||||
} else if ((tmp = _has_prefix (line, "clientid"))) {
|
||||
if (tmp[0] != '\0') {
|
||||
g_free (*client_id);
|
||||
*client_id = g_strdup (tmp);
|
||||
} else
|
||||
nm_log_info (LOGD_SETTINGS, "dhcpcd clientid not defined, ignoring");
|
||||
}
|
||||
} else {
|
||||
// dhclient.conf
|
||||
if ((tmp1 = _has_prefix (line, "send"))) {
|
||||
if ((tmp = _has_prefix (tmp1, "host-name"))) {
|
||||
strip_string (tmp, ';');
|
||||
strip_string (tmp, '"');
|
||||
if (tmp[0] != '\0') {
|
||||
g_free (*hostname);
|
||||
*hostname = g_strdup (tmp);
|
||||
} else
|
||||
nm_log_info (LOGD_SETTINGS, "dhclient hostname not defined, ignoring");
|
||||
} else if ((tmp = _has_prefix (tmp1, "dhcp-client-identifier"))) {
|
||||
strip_string (tmp, ';');
|
||||
if (tmp[0] != '\0') {
|
||||
g_free (*client_id);
|
||||
*client_id = g_strdup (tmp);
|
||||
} else
|
||||
nm_log_info (LOGD_SETTINGS, "dhclient clientid not defined, ignoring");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
g_strfreev (all_lines);
|
||||
g_free (contents);
|
||||
}
|
||||
|
||||
gchar *backup_file (const gchar* target)
|
||||
{
|
||||
GFile *source, *backup;
|
||||
gchar* backup_path;
|
||||
GError *error = NULL;
|
||||
|
||||
source = g_file_new_for_path (target);
|
||||
|
||||
if (!g_file_query_exists (source, NULL)) {
|
||||
g_object_unref (source);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
backup_path = g_strdup_printf ("%s.bak", target);
|
||||
backup = g_file_new_for_path (backup_path);
|
||||
|
||||
if (!g_file_copy (source, backup, G_FILE_COPY_OVERWRITE, NULL, NULL, NULL, &error)) {
|
||||
nm_log_warn (LOGD_SETTINGS, "Backup failed: %s", error->message);
|
||||
g_free (backup_path);
|
||||
backup_path = NULL;
|
||||
g_error_free (error);
|
||||
}
|
||||
|
||||
g_object_unref (source);
|
||||
g_object_unref (backup);
|
||||
|
||||
return backup_path;
|
||||
}
|
||||
|
|
@ -1,71 +0,0 @@
|
|||
/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */
|
||||
/*
|
||||
* Mu Qiao <qiaomuf@gmail.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program 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 General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Copyright (C) 1999-2010 Gentoo Foundation, Inc.
|
||||
*/
|
||||
|
||||
#ifndef _IFNET_UTILS_H
|
||||
#define _IFNET_UTILS_H
|
||||
|
||||
#define IFNET_PLUGIN_NAME "SettingsPlugin-Ifnet"
|
||||
|
||||
#include <arpa/inet.h>
|
||||
|
||||
#include "nm-setting-ip6-config.h"
|
||||
#include "nm-setting-ip4-config.h"
|
||||
|
||||
#include "nms-ifnet-net-parser.h"
|
||||
|
||||
#define has_default_ip4_route(conn_name) has_default_route((conn_name), &is_ip4_address)
|
||||
#define has_default_ip6_route(conn_name) has_default_route((conn_name), &is_ip6_address)
|
||||
|
||||
typedef struct _ip_block {
|
||||
char *ip;
|
||||
guint32 prefix;
|
||||
char *next_hop;
|
||||
struct _ip_block *next;
|
||||
} ip_block;
|
||||
|
||||
gboolean is_static_ip4 (const char *conn_name);
|
||||
gboolean is_static_ip6 (const char *conn_name);
|
||||
gboolean is_ip4_address (const char *in_address);
|
||||
gboolean is_ip6_address (const char *in_address);
|
||||
gboolean has_ip6_address (const char *conn_name);
|
||||
gboolean has_default_route (const char *conn_name, gboolean (*check_fn) (const char *));
|
||||
gboolean reload_parsers (void);
|
||||
|
||||
ip_block *convert_ip4_config_block (const char *conn_name);
|
||||
ip_block *convert_ip6_config_block (const char *conn_name);
|
||||
ip_block *convert_ip4_routes_block (const char *conn_name);
|
||||
ip_block *convert_ip6_routes_block (const char *conn_name);
|
||||
void destroy_ip_block (ip_block * iblock);
|
||||
|
||||
void set_ip4_dns_servers (NMSettingIPConfig * s_ip4, const char *conn_name);
|
||||
void set_ip6_dns_servers (NMSettingIPConfig * s_ip6, const char *conn_name);
|
||||
|
||||
gchar *strip_string (gchar *str, gchar t);
|
||||
gboolean is_managed (const char *conn_name);
|
||||
|
||||
gboolean is_hex (const char *value);
|
||||
gboolean is_ascii (const char *value);
|
||||
gboolean is_true (const char *str);
|
||||
|
||||
void get_dhcp_hostname_and_client_id (char **hostname, char **client_id);
|
||||
|
||||
gchar *backup_file (const gchar* target);
|
||||
#endif
|
||||
|
|
@ -1,524 +0,0 @@
|
|||
/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */
|
||||
/* NetworkManager system settings service (ifnet)
|
||||
*
|
||||
* Mu Qiao <qiaomuf@gmail.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program 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 General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Copyright (C) 1999-2010 Gentoo Foundation, Inc.
|
||||
*/
|
||||
|
||||
#include "nm-default.h"
|
||||
|
||||
#include "nms-ifnet-plugin.h"
|
||||
|
||||
#include <string.h>
|
||||
#include <gmodule.h>
|
||||
|
||||
#include "nm-utils.h"
|
||||
#include "nm-setting-connection.h"
|
||||
#include "nm-dbus-interface.h"
|
||||
#include "settings/nm-settings-plugin.h"
|
||||
#include "nm-config.h"
|
||||
#include "NetworkManagerUtils.h"
|
||||
|
||||
#include "nms-ifnet-connection.h"
|
||||
#include "nms-ifnet-net-utils.h"
|
||||
#include "nms-ifnet-net-parser.h"
|
||||
#include "nms-ifnet-wpa-parser.h"
|
||||
#include "nms-ifnet-connection-parser.h"
|
||||
|
||||
#define IFNET_PLUGIN_NAME_PRINT "ifnet"
|
||||
#define IFNET_PLUGIN_INFO "(C) 1999-2010 Gentoo Foundation, Inc. To report bugs please use bugs.gentoo.org with [networkmanager] or [qiaomuf] prefix."
|
||||
#define IFNET_MANAGE_WELL_KNOWN_DEFAULT TRUE
|
||||
|
||||
/*****************************************************************************/
|
||||
|
||||
typedef void (*FileChangedFn) (gpointer user_data);
|
||||
|
||||
typedef struct {
|
||||
FileChangedFn callback;
|
||||
gpointer user_data;
|
||||
} FileMonitorInfo;
|
||||
|
||||
/*****************************************************************************/
|
||||
|
||||
typedef struct {
|
||||
GHashTable *connections; /* uuid::connection */
|
||||
gboolean unmanaged_well_known;
|
||||
|
||||
GFileMonitor *net_monitor;
|
||||
GFileMonitor *wpa_monitor;
|
||||
} SettingsPluginIfnetPrivate;
|
||||
|
||||
struct _SettingsPluginIfnet {
|
||||
GObject parent;
|
||||
SettingsPluginIfnetPrivate _priv;
|
||||
};
|
||||
|
||||
struct _SettingsPluginIfnetClass {
|
||||
GObjectClass parent;
|
||||
};
|
||||
|
||||
static void settings_plugin_interface_init (NMSettingsPluginInterface *plugin_iface);
|
||||
|
||||
G_DEFINE_TYPE_EXTENDED (SettingsPluginIfnet, settings_plugin_ifnet, G_TYPE_OBJECT, 0,
|
||||
G_IMPLEMENT_INTERFACE (NM_TYPE_SETTINGS_PLUGIN,
|
||||
settings_plugin_interface_init))
|
||||
|
||||
#define SETTINGS_PLUGIN_IFNET_GET_PRIVATE(self) _NM_GET_PRIVATE (self, SettingsPluginIfnet, SETTINGS_IS_PLUGIN_IFNET)
|
||||
|
||||
/*****************************************************************************/
|
||||
|
||||
static SettingsPluginIfnet *settings_plugin_ifnet_get (void);
|
||||
|
||||
NM_DEFINE_SINGLETON_GETTER (SettingsPluginIfnet, settings_plugin_ifnet_get, SETTINGS_TYPE_PLUGIN_IFNET);
|
||||
|
||||
/*****************************************************************************/
|
||||
|
||||
static void reload_connections (NMSettingsPlugin *config);
|
||||
|
||||
/*****************************************************************************/
|
||||
|
||||
static gboolean
|
||||
is_managed_plugin (void)
|
||||
{
|
||||
return nm_config_data_get_value_boolean (NM_CONFIG_GET_DATA_ORIG,
|
||||
NM_CONFIG_KEYFILE_GROUP_IFNET, NM_CONFIG_KEYFILE_KEY_IFNET_MANAGED,
|
||||
IFNET_MANAGE_WELL_KNOWN_DEFAULT);
|
||||
}
|
||||
|
||||
static void
|
||||
file_changed (GFileMonitor * monitor,
|
||||
GFile * file,
|
||||
GFile * other_file,
|
||||
GFileMonitorEvent event_type, gpointer user_data)
|
||||
{
|
||||
FileMonitorInfo *info;
|
||||
|
||||
switch (event_type) {
|
||||
case G_FILE_MONITOR_EVENT_CHANGES_DONE_HINT:
|
||||
info = (FileMonitorInfo *) user_data;
|
||||
info->callback (info->user_data);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static GFileMonitor *
|
||||
monitor_file_changes (const char *filename,
|
||||
FileChangedFn callback, gpointer user_data)
|
||||
{
|
||||
GFile *file;
|
||||
GFileMonitor *monitor;
|
||||
FileMonitorInfo *info;
|
||||
GError **error = NULL;
|
||||
|
||||
if (!g_file_test (filename, G_FILE_TEST_IS_REGULAR))
|
||||
return NULL;
|
||||
file = g_file_new_for_path (filename);
|
||||
monitor = g_file_monitor_file (file, G_FILE_MONITOR_NONE, NULL, error);
|
||||
g_object_unref (file);
|
||||
|
||||
if (monitor) {
|
||||
info = g_new0 (FileMonitorInfo, 1);
|
||||
info->callback = callback;
|
||||
info->user_data = user_data;
|
||||
g_object_weak_ref (G_OBJECT (monitor), (GWeakNotify) g_free,
|
||||
info);
|
||||
g_signal_connect (monitor, "changed", G_CALLBACK (file_changed),
|
||||
info);
|
||||
} else {
|
||||
nm_log_warn (LOGD_SETTINGS, "Monitoring %s failed, error: %s", filename,
|
||||
error == NULL ? "nothing" : (*error)->message);
|
||||
}
|
||||
|
||||
return monitor;
|
||||
}
|
||||
|
||||
static void
|
||||
setup_monitors (NMIfnetConnection *connection, gpointer user_data)
|
||||
{
|
||||
SettingsPluginIfnet *self = SETTINGS_PLUGIN_IFNET (user_data);
|
||||
SettingsPluginIfnetPrivate *priv = SETTINGS_PLUGIN_IFNET_GET_PRIVATE (self);
|
||||
|
||||
if (!nm_config_get_monitor_connection_files (nm_config_get ()))
|
||||
return;
|
||||
|
||||
if (priv->net_monitor || priv->wpa_monitor)
|
||||
return;
|
||||
|
||||
priv->net_monitor = monitor_file_changes (CONF_NET_FILE,
|
||||
(FileChangedFn) reload_connections,
|
||||
user_data);
|
||||
priv->wpa_monitor = monitor_file_changes (WPA_SUPPLICANT_CONF,
|
||||
(FileChangedFn) reload_connections,
|
||||
user_data);
|
||||
}
|
||||
|
||||
static void
|
||||
cancel_monitors (NMIfnetConnection *connection, gpointer user_data)
|
||||
{
|
||||
SettingsPluginIfnet *self = SETTINGS_PLUGIN_IFNET (user_data);
|
||||
SettingsPluginIfnetPrivate *priv = SETTINGS_PLUGIN_IFNET_GET_PRIVATE (self);
|
||||
|
||||
if (priv->net_monitor) {
|
||||
g_file_monitor_cancel (priv->net_monitor);
|
||||
g_clear_object (&priv->net_monitor);
|
||||
}
|
||||
if (priv->wpa_monitor) {
|
||||
g_file_monitor_cancel (priv->wpa_monitor);
|
||||
g_clear_object (&priv->wpa_monitor);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
connection_removed_cb (NMSettingsConnection *obj, gpointer user_data)
|
||||
{
|
||||
g_hash_table_remove (SETTINGS_PLUGIN_IFNET_GET_PRIVATE ((SettingsPluginIfnet *) user_data)->connections,
|
||||
nm_connection_get_uuid (NM_CONNECTION (obj)));
|
||||
}
|
||||
|
||||
static void
|
||||
track_new_connection (SettingsPluginIfnet *self, NMIfnetConnection *connection)
|
||||
{
|
||||
g_hash_table_insert (SETTINGS_PLUGIN_IFNET_GET_PRIVATE (self)->connections,
|
||||
g_strdup (nm_connection_get_uuid (NM_CONNECTION (connection))),
|
||||
g_object_ref (connection));
|
||||
g_signal_connect (connection, NM_SETTINGS_CONNECTION_REMOVED,
|
||||
G_CALLBACK (connection_removed_cb),
|
||||
self);
|
||||
}
|
||||
|
||||
static void
|
||||
reload_connections (NMSettingsPlugin *config)
|
||||
{
|
||||
SettingsPluginIfnet *self = SETTINGS_PLUGIN_IFNET (config);
|
||||
SettingsPluginIfnetPrivate *priv = SETTINGS_PLUGIN_IFNET_GET_PRIVATE (self);
|
||||
GList *conn_names = NULL, *n_iter = NULL;
|
||||
gboolean auto_refresh;
|
||||
GError *error = NULL;
|
||||
|
||||
/* save names for removing unused connections */
|
||||
GHashTable *new_connections = NULL;
|
||||
GHashTableIter iter;
|
||||
const char *uuid;
|
||||
NMSettingsConnection *candidate;
|
||||
|
||||
if (priv->unmanaged_well_known)
|
||||
return;
|
||||
|
||||
if (!reload_parsers ())
|
||||
return;
|
||||
|
||||
nm_log_info (LOGD_SETTINGS, "Loading connections");
|
||||
|
||||
auto_refresh = nm_config_data_get_value_boolean (NM_CONFIG_GET_DATA_ORIG,
|
||||
NM_CONFIG_KEYFILE_GROUP_IFNET, NM_CONFIG_KEYFILE_KEY_IFNET_AUTO_REFRESH,
|
||||
FALSE);
|
||||
|
||||
new_connections = g_hash_table_new_full (nm_str_hash, g_str_equal, NULL, g_object_unref);
|
||||
|
||||
/* Reread on-disk data and refresh in-memory connections from it */
|
||||
conn_names = ifnet_get_connection_names ();
|
||||
for (n_iter = conn_names; n_iter; n_iter = g_list_next (n_iter)) {
|
||||
NMIfnetConnection *new;
|
||||
NMIfnetConnection *old;
|
||||
const char *conn_name = n_iter->data;
|
||||
|
||||
/* read the new connection */
|
||||
new = nm_ifnet_connection_new (NULL, conn_name);
|
||||
if (!new)
|
||||
continue;
|
||||
|
||||
g_signal_connect (G_OBJECT (new), "ifnet_setup_monitors",
|
||||
G_CALLBACK (setup_monitors), config);
|
||||
g_signal_connect (G_OBJECT (new), "ifnet_cancel_monitors",
|
||||
G_CALLBACK (cancel_monitors), config);
|
||||
|
||||
old = g_hash_table_lookup (priv->connections,
|
||||
nm_connection_get_uuid (NM_CONNECTION (new)));
|
||||
if (old && new) {
|
||||
if (auto_refresh) {
|
||||
/* If connection has changed, remove the old one and add the
|
||||
* new one to force a disconnect/reconnect with new settings
|
||||
*/
|
||||
if (!nm_connection_compare (NM_CONNECTION (old),
|
||||
NM_CONNECTION (new),
|
||||
NM_SETTING_COMPARE_FLAG_IGNORE_AGENT_OWNED_SECRETS |
|
||||
NM_SETTING_COMPARE_FLAG_IGNORE_NOT_SAVED_SECRETS)) {
|
||||
nm_log_info (LOGD_SETTINGS, "Auto refreshing %s", conn_name);
|
||||
|
||||
nm_settings_connection_signal_remove (NM_SETTINGS_CONNECTION (old));
|
||||
track_new_connection (self, new);
|
||||
if (is_managed_plugin () && is_managed (conn_name))
|
||||
g_signal_emit_by_name (self, NM_SETTINGS_PLUGIN_CONNECTION_ADDED, new);
|
||||
}
|
||||
} else {
|
||||
/* Update existing connection with new settings */
|
||||
if (!nm_settings_connection_update (NM_SETTINGS_CONNECTION (old),
|
||||
NM_CONNECTION (new),
|
||||
NM_SETTINGS_CONNECTION_PERSIST_MODE_KEEP_SAVED,
|
||||
NM_SETTINGS_CONNECTION_COMMIT_REASON_NONE,
|
||||
"ifnet-update",
|
||||
&error)) {
|
||||
/* Shouldn't ever get here as 'new' was verified by the reader already
|
||||
* and the UUID did not change. */
|
||||
g_assert_not_reached ();
|
||||
}
|
||||
g_assert_no_error (error);
|
||||
nm_log_info (LOGD_SETTINGS, "Connection %s updated",
|
||||
nm_connection_get_id (NM_CONNECTION (new)));
|
||||
}
|
||||
g_signal_emit_by_name (self, NM_SETTINGS_PLUGIN_UNMANAGED_SPECS_CHANGED);
|
||||
} else if (new) {
|
||||
track_new_connection (self, new);
|
||||
if (is_managed_plugin () && is_managed (conn_name))
|
||||
g_signal_emit_by_name (self, NM_SETTINGS_PLUGIN_CONNECTION_ADDED, new);
|
||||
}
|
||||
|
||||
/* Track all valid connections so we can remove deleted ones later */
|
||||
g_hash_table_insert (new_connections,
|
||||
(gpointer) nm_connection_get_uuid (NM_CONNECTION (new)),
|
||||
new);
|
||||
}
|
||||
|
||||
/* remove deleted/unused connections */
|
||||
g_hash_table_iter_init (&iter, priv->connections);
|
||||
while (g_hash_table_iter_next (&iter, (gpointer) &uuid, (gpointer) &candidate)) {
|
||||
/* only saved connections (which have a conn_name) get removed; unsaved
|
||||
* ones obviously don't exist in /etc/conf.d/net yet and shouldn't get
|
||||
* blown away by net file changes.
|
||||
*/
|
||||
if ( nm_ifnet_connection_get_conn_name (NM_IFNET_CONNECTION (candidate))
|
||||
&& !g_hash_table_lookup (new_connections, uuid)) {
|
||||
nm_settings_connection_signal_remove (candidate);
|
||||
g_hash_table_iter_remove (&iter);
|
||||
}
|
||||
}
|
||||
g_hash_table_destroy (new_connections);
|
||||
g_list_free (conn_names);
|
||||
}
|
||||
|
||||
static NMSettingsConnection *
|
||||
add_connection (NMSettingsPlugin *config,
|
||||
NMConnection *source,
|
||||
gboolean save_to_disk,
|
||||
GError **error)
|
||||
{
|
||||
SettingsPluginIfnetPrivate *priv = SETTINGS_PLUGIN_IFNET_GET_PRIVATE ((SettingsPluginIfnet *) config);
|
||||
NMIfnetConnection *new = NULL;
|
||||
|
||||
/* Ensure we reject attempts to add the connection long before we're
|
||||
* asked to write it to disk.
|
||||
*/
|
||||
if (!ifnet_can_write_connection (source, error))
|
||||
goto out;
|
||||
|
||||
if (save_to_disk) {
|
||||
if (!ifnet_add_new_connection (source, CONF_NET_FILE, WPA_SUPPLICANT_CONF, NULL, NULL, error))
|
||||
goto out;
|
||||
reload_connections (config);
|
||||
new = g_hash_table_lookup (priv->connections, nm_connection_get_uuid (source));
|
||||
} else {
|
||||
new = nm_ifnet_connection_new (source, NULL);
|
||||
if (new) {
|
||||
track_new_connection (SETTINGS_PLUGIN_IFNET (config), new);
|
||||
/* track_new_connection refs 'new' */
|
||||
g_object_unref (new);
|
||||
}
|
||||
}
|
||||
|
||||
out:
|
||||
if (!new && error && !*error) {
|
||||
g_set_error_literal (error, NM_SETTINGS_ERROR, NM_SETTINGS_ERROR_FAILED,
|
||||
"The ifnet plugin cannot add the connection (unknown error).");
|
||||
}
|
||||
return (NMSettingsConnection *) new;
|
||||
}
|
||||
|
||||
static void
|
||||
check_unmanaged (gpointer key, gpointer data, gpointer user_data)
|
||||
{
|
||||
NMIfnetConnection *connection = NM_IFNET_CONNECTION (data);
|
||||
GSList **list = (GSList **) user_data;
|
||||
const char *mac, *conn_name;
|
||||
char *unmanaged_spec;
|
||||
GSList *iter;
|
||||
|
||||
conn_name = nm_ifnet_connection_get_conn_name (connection);
|
||||
|
||||
if (!conn_name || is_managed (conn_name))
|
||||
return;
|
||||
|
||||
nm_log_info (LOGD_SETTINGS, "Checking unmanaged: %s", conn_name);
|
||||
mac = ifnet_get_data (conn_name, "mac");
|
||||
if (mac)
|
||||
unmanaged_spec = g_strdup_printf ("mac:%s", mac);
|
||||
else
|
||||
unmanaged_spec = g_strdup_printf ("interface-name:%s", conn_name);
|
||||
|
||||
/* Just return if the unmanaged spec is already in the list */
|
||||
for (iter = *list; iter; iter = g_slist_next (iter)) {
|
||||
if (g_str_equal (iter->data, unmanaged_spec)) {
|
||||
g_free (unmanaged_spec);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
nm_log_info (LOGD_SETTINGS, "Add unmanaged: %s", unmanaged_spec);
|
||||
*list = g_slist_prepend (*list, unmanaged_spec);
|
||||
}
|
||||
|
||||
static GSList *
|
||||
get_unmanaged_specs (NMSettingsPlugin * config)
|
||||
{
|
||||
SettingsPluginIfnetPrivate *priv = SETTINGS_PLUGIN_IFNET_GET_PRIVATE ((SettingsPluginIfnet *) config);
|
||||
GSList *list = NULL;
|
||||
|
||||
nm_log_info (LOGD_SETTINGS, "getting unmanaged specs...");
|
||||
g_hash_table_foreach (priv->connections, check_unmanaged, &list);
|
||||
return list;
|
||||
}
|
||||
|
||||
static GSList *
|
||||
get_connections (NMSettingsPlugin *config)
|
||||
{
|
||||
SettingsPluginIfnetPrivate *priv = SETTINGS_PLUGIN_IFNET_GET_PRIVATE ((SettingsPluginIfnet *) config);
|
||||
GSList *connections = NULL;
|
||||
GHashTableIter iter;
|
||||
NMIfnetConnection *connection;
|
||||
|
||||
nm_log_info (LOGD_SETTINGS, "(%p) ... get_connections.", config);
|
||||
|
||||
g_hash_table_iter_init (&iter, priv->connections);
|
||||
while (g_hash_table_iter_next (&iter, NULL, (gpointer) &connection)) {
|
||||
const char *conn_name = nm_ifnet_connection_get_conn_name (connection);
|
||||
|
||||
if (!conn_name || (!priv->unmanaged_well_known && is_managed (conn_name)))
|
||||
connections = g_slist_prepend (connections, connection);
|
||||
}
|
||||
nm_log_info (LOGD_SETTINGS, "(%p) connections count: %d",
|
||||
config, g_slist_length (connections));
|
||||
return connections;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
|
||||
static void
|
||||
get_property (GObject * object, guint prop_id, GValue * value,
|
||||
GParamSpec * pspec)
|
||||
{
|
||||
switch (prop_id) {
|
||||
case NM_SETTINGS_PLUGIN_PROP_NAME:
|
||||
g_value_set_string (value, IFNET_PLUGIN_NAME_PRINT);
|
||||
break;
|
||||
case NM_SETTINGS_PLUGIN_PROP_INFO:
|
||||
g_value_set_string (value, IFNET_PLUGIN_INFO);
|
||||
break;
|
||||
case NM_SETTINGS_PLUGIN_PROP_CAPABILITIES:
|
||||
g_value_set_uint (value,
|
||||
NM_SETTINGS_PLUGIN_CAP_MODIFY_CONNECTIONS);
|
||||
break;
|
||||
default:
|
||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
|
||||
static void
|
||||
init (NMSettingsPlugin *config)
|
||||
{
|
||||
SettingsPluginIfnet *self = SETTINGS_PLUGIN_IFNET (config);
|
||||
SettingsPluginIfnetPrivate *priv = SETTINGS_PLUGIN_IFNET_GET_PRIVATE (self);
|
||||
|
||||
nm_log_info (LOGD_SETTINGS, "Initializing!");
|
||||
|
||||
priv->connections = g_hash_table_new_full (nm_str_hash, g_str_equal, g_free, g_object_unref);
|
||||
priv->unmanaged_well_known = !is_managed_plugin ();
|
||||
nm_log_info (LOGD_SETTINGS, "management mode: %s",
|
||||
priv->unmanaged_well_known ? "unmanaged" : "managed");
|
||||
|
||||
setup_monitors (NULL, config);
|
||||
reload_connections (config);
|
||||
|
||||
nm_log_info (LOGD_SETTINGS, "Initialzation complete!");
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
|
||||
static void
|
||||
settings_plugin_ifnet_init (SettingsPluginIfnet * plugin)
|
||||
{
|
||||
}
|
||||
|
||||
static void
|
||||
dispose (GObject * object)
|
||||
{
|
||||
SettingsPluginIfnet *plugin = SETTINGS_PLUGIN_IFNET (object);
|
||||
SettingsPluginIfnetPrivate *priv = SETTINGS_PLUGIN_IFNET_GET_PRIVATE ((SettingsPluginIfnet *) plugin);
|
||||
|
||||
cancel_monitors (NULL, object);
|
||||
if (priv->connections) {
|
||||
g_hash_table_destroy (priv->connections);
|
||||
priv->connections = NULL;
|
||||
}
|
||||
|
||||
ifnet_destroy ();
|
||||
wpa_parser_destroy ();
|
||||
G_OBJECT_CLASS (settings_plugin_ifnet_parent_class)->dispose (object);
|
||||
}
|
||||
|
||||
static void
|
||||
settings_plugin_ifnet_class_init (SettingsPluginIfnetClass * req_class)
|
||||
{
|
||||
GObjectClass *object_class = G_OBJECT_CLASS (req_class);
|
||||
|
||||
object_class->dispose = dispose;
|
||||
object_class->get_property = get_property;
|
||||
|
||||
g_object_class_override_property (object_class,
|
||||
NM_SETTINGS_PLUGIN_PROP_NAME,
|
||||
NM_SETTINGS_PLUGIN_NAME);
|
||||
|
||||
g_object_class_override_property (object_class,
|
||||
NM_SETTINGS_PLUGIN_PROP_INFO,
|
||||
NM_SETTINGS_PLUGIN_INFO);
|
||||
|
||||
g_object_class_override_property (object_class,
|
||||
NM_SETTINGS_PLUGIN_PROP_CAPABILITIES,
|
||||
NM_SETTINGS_PLUGIN_CAPABILITIES);
|
||||
}
|
||||
|
||||
static void
|
||||
settings_plugin_interface_init (NMSettingsPluginInterface *plugin_iface)
|
||||
{
|
||||
plugin_iface->init = init;
|
||||
plugin_iface->get_connections = get_connections;
|
||||
plugin_iface->get_unmanaged_specs = get_unmanaged_specs;
|
||||
plugin_iface->add_connection = add_connection;
|
||||
plugin_iface->reload_connections = reload_connections;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
|
||||
G_MODULE_EXPORT GObject *
|
||||
nm_settings_plugin_factory (void)
|
||||
{
|
||||
return G_OBJECT (g_object_ref (settings_plugin_ifnet_get ()));
|
||||
}
|
||||
|
|
@ -1,38 +0,0 @@
|
|||
/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */
|
||||
/* NetworkManager system settings service (ifnet)
|
||||
*
|
||||
* Mu Qiao <qiaomuf@gmail.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program 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 General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Copyright (C) 1999-2010 Gentoo Foundation, Inc.
|
||||
*/
|
||||
|
||||
#ifndef _PLUGIN_H_
|
||||
#define _PLUGIN_H_
|
||||
|
||||
#define SETTINGS_TYPE_PLUGIN_IFNET (settings_plugin_ifnet_get_type ())
|
||||
#define SETTINGS_PLUGIN_IFNET(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), SETTINGS_TYPE_PLUGIN_IFNET, SettingsPluginIfnet))
|
||||
#define SETTINGS_PLUGIN_IFNET_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), SETTINGS_TYPE_PLUGIN_IFNET, SettingsPluginIfnetClass))
|
||||
#define SETTINGS_IS_PLUGIN_IFNET(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), SETTINGS_TYPE_PLUGIN_IFNET))
|
||||
#define SETTINGS_IS_PLUGIN_IFNET_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), SETTINGS_TYPE_PLUGIN_IFNET))
|
||||
#define SETTINGS_PLUGIN_IFNET_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), SETTINGS_TYPE_PLUGIN_IFNET, SettingsPluginIfnetClass))
|
||||
|
||||
typedef struct _SettingsPluginIfnet SettingsPluginIfnet;
|
||||
typedef struct _SettingsPluginIfnetClass SettingsPluginIfnetClass;
|
||||
|
||||
GType settings_plugin_ifnet_get_type (void);
|
||||
|
||||
#endif
|
||||
|
|
@ -1,583 +0,0 @@
|
|||
/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */
|
||||
/*
|
||||
* Mu Qiao <qiaomuf@gmail.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program 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 General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Copyright (C) 1999-2010 Gentoo Foundation, Inc.
|
||||
*/
|
||||
|
||||
#include "nm-default.h"
|
||||
|
||||
#include "nms-ifnet-wpa-parser.h"
|
||||
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#include "settings/nm-settings-plugin.h"
|
||||
|
||||
#include "nms-ifnet-net-parser.h"
|
||||
#include "nms-ifnet-net-utils.h"
|
||||
|
||||
/* Security information */
|
||||
static GHashTable *wsec_table = NULL;
|
||||
|
||||
/* Global information used for writing */
|
||||
static GHashTable *wsec_global_table = NULL;
|
||||
|
||||
static gboolean wpa_parser_data_changed = FALSE;
|
||||
|
||||
static long
|
||||
wpa_get_long (GHashTable *table, const char *key)
|
||||
{
|
||||
return atol (g_hash_table_lookup (table, key));
|
||||
}
|
||||
|
||||
static void
|
||||
destroy_security (GHashTable * network)
|
||||
{
|
||||
gpointer key, value;
|
||||
GHashTableIter iter;
|
||||
|
||||
g_return_if_fail (network);
|
||||
g_hash_table_iter_init (&iter, network);
|
||||
while (g_hash_table_iter_next (&iter, &key, &value)) {
|
||||
g_free (key);
|
||||
g_free (value);
|
||||
}
|
||||
|
||||
g_hash_table_destroy (network);
|
||||
}
|
||||
|
||||
static GHashTable *
|
||||
add_security (GHashTable *security)
|
||||
{
|
||||
GHashTable *oldsecurity;
|
||||
const char *ssid, *value;
|
||||
char *ssid_key;
|
||||
gboolean is_hex_ssid;
|
||||
|
||||
/* Every security information should have a ssid */
|
||||
ssid = g_hash_table_lookup (security, "ssid");
|
||||
if (!ssid) {
|
||||
destroy_security (security);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* Hex format begins with " */
|
||||
is_hex_ssid = (ssid[0] != '"');
|
||||
if ((value = g_hash_table_lookup (security, "disabled")) != NULL) {
|
||||
if (strcmp (value, "1") == 0) {
|
||||
destroy_security (security);
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
/* Default priority is 1 */
|
||||
if (g_hash_table_lookup (security, "priority") == NULL)
|
||||
g_hash_table_insert (security, g_strdup ("priority"),
|
||||
g_strdup ("1"));
|
||||
|
||||
oldsecurity = g_hash_table_lookup (wsec_table, ssid);
|
||||
/* Security with lower priority will be ignored */
|
||||
if (oldsecurity != NULL) {
|
||||
if (wpa_get_long (oldsecurity, "priority") >=
|
||||
wpa_get_long (security, "priority")) {
|
||||
destroy_security (security);
|
||||
return NULL;
|
||||
} else {
|
||||
g_hash_table_remove (wsec_table, ssid);
|
||||
destroy_security (oldsecurity);
|
||||
}
|
||||
}
|
||||
|
||||
/* format ssid */
|
||||
ssid_key =
|
||||
is_hex_ssid ? g_strdup_printf ("0x%s",
|
||||
ssid) :
|
||||
strip_string (g_strdup (ssid), '"');
|
||||
g_hash_table_insert (wsec_table, ssid_key, security);
|
||||
return security;
|
||||
}
|
||||
|
||||
static void
|
||||
add_key_value (GHashTable * network, gchar * line)
|
||||
{
|
||||
gpointer orig_key, orig_value;
|
||||
gchar **key_value;
|
||||
|
||||
if (g_str_has_prefix (line, "network={"))
|
||||
line += 9;
|
||||
strip_string (line, '{');
|
||||
strip_string (line, '}');
|
||||
if (line[0] == '\0')
|
||||
return;
|
||||
key_value = g_strsplit (line, "=", 2);
|
||||
if (g_strv_length (key_value) != 2) {
|
||||
g_strfreev (key_value);
|
||||
return;
|
||||
}
|
||||
g_strstrip (key_value[0]);
|
||||
g_strstrip (key_value[1]);
|
||||
|
||||
/* Reserve quotes for psk, wep_key, ssid
|
||||
* Quotes will determine whether they are hex format */
|
||||
if (strcmp (key_value[0], "psk") != 0
|
||||
&& !g_str_has_prefix (key_value[0], "wep_key")
|
||||
&& strcmp (key_value[0], "ssid") != 0)
|
||||
strip_string (key_value[1], '"');
|
||||
|
||||
/* This sucks */
|
||||
if (g_hash_table_lookup_extended (network, key_value[0], &orig_key, &orig_value)) {
|
||||
g_hash_table_remove (network, orig_key);
|
||||
g_free (orig_key);
|
||||
g_free (orig_value);
|
||||
}
|
||||
|
||||
g_hash_table_insert (network, g_strdup (key_value[0]),
|
||||
g_strdup (key_value[1]));
|
||||
g_strfreev (key_value);
|
||||
}
|
||||
|
||||
static void
|
||||
add_one_wep_key (GHashTable * table, int key_num, gchar * one_wep_key)
|
||||
{
|
||||
if (one_wep_key[0] == 's') {
|
||||
//asc key
|
||||
g_hash_table_insert (table,
|
||||
g_strdup_printf ("wep_key%d", key_num - 1),
|
||||
g_strdup_printf ("\"%s\"",
|
||||
one_wep_key + 2));
|
||||
} else {
|
||||
gchar buf[30];
|
||||
int i = 0, j = 0;
|
||||
|
||||
//hex key
|
||||
while (one_wep_key[i] != '\0') {
|
||||
if (one_wep_key[i] != '-')
|
||||
buf[j++] = one_wep_key[i];
|
||||
i++;
|
||||
}
|
||||
buf[j] = '\0';
|
||||
g_hash_table_insert (table,
|
||||
g_strdup_printf ("wep_key%d", key_num - 1),
|
||||
g_strdup (buf));
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
/* Reading wep security information from /etc/conf.d/net.
|
||||
* This should not be used in future, use wpa_supplicant instead. */
|
||||
static void
|
||||
add_keys_from_net (void)
|
||||
{
|
||||
GList *names = ifnet_get_connection_names ();
|
||||
GList *iter = names;
|
||||
gchar *wep_keys = "(\\[([1-4])\\]\\s+(s:\\w{5}|s:\\w{13}|"
|
||||
"([\\da-fA-F]{4}\\-){2}[\\da-fA-F]{2}|"
|
||||
"([\\da-fA-F]{4}\\-){6}[\\da-fA-F]{2})\\s+)";
|
||||
gchar *key_method =
|
||||
"\\s+key\\s+\\[([1-4])\\]\\s+enc\\s+(open|restricted)";
|
||||
GRegex *regex_keys = g_regex_new (wep_keys, 0, 0, NULL);
|
||||
GRegex *regex_method = g_regex_new (key_method, 0, 0, NULL);
|
||||
GMatchInfo *keys_info;
|
||||
GMatchInfo *method_info;
|
||||
|
||||
while (iter) {
|
||||
gchar *conn_name = iter->data;
|
||||
GHashTable *table;
|
||||
const char *key_str;
|
||||
|
||||
if ((key_str = ifnet_get_data (conn_name, "key")) == NULL) {
|
||||
iter = g_list_next (iter);
|
||||
continue;
|
||||
}
|
||||
|
||||
wpa_add_security (conn_name);
|
||||
table = _get_hash_table (conn_name);
|
||||
/* Give lowest priority */
|
||||
wpa_set_data (conn_name, "priority", "0");
|
||||
g_regex_match (regex_keys, key_str, 0, &keys_info);
|
||||
/* add wep keys */
|
||||
while (g_match_info_matches (keys_info)) {
|
||||
gchar *key_num = g_match_info_fetch (keys_info, 2);
|
||||
gchar *one_wep_key = g_match_info_fetch (keys_info, 3);
|
||||
|
||||
add_one_wep_key (table, atoi (key_num), one_wep_key);
|
||||
g_free (key_num);
|
||||
g_free (one_wep_key);
|
||||
g_match_info_next (keys_info, NULL);
|
||||
}
|
||||
g_match_info_free (keys_info);
|
||||
|
||||
g_regex_match (regex_method, key_str, 0, &method_info);
|
||||
/* set default key index and auth alg */
|
||||
if (g_match_info_matches (method_info)) {
|
||||
gchar *default_idx =
|
||||
g_match_info_fetch (method_info, 1);
|
||||
gchar *method = g_match_info_fetch (method_info, 2);
|
||||
|
||||
default_idx[0]--;
|
||||
g_hash_table_insert (table, g_strdup ("wep_tx_keyidx"),
|
||||
default_idx);
|
||||
g_hash_table_insert (table, g_strdup ("auth_alg"),
|
||||
g_ascii_strup (method, -1));
|
||||
}
|
||||
g_match_info_free (method_info);
|
||||
add_security (table);
|
||||
iter = g_list_next (iter);
|
||||
}
|
||||
g_list_free (names);
|
||||
g_regex_unref (regex_keys);
|
||||
g_regex_unref (regex_method);
|
||||
}
|
||||
|
||||
static void
|
||||
add_global_data (gchar * line)
|
||||
{
|
||||
gchar **key_value;
|
||||
|
||||
g_strstrip (line);
|
||||
key_value = g_strsplit (line, "=", 2);
|
||||
if (g_strv_length (key_value) != 2) {
|
||||
nm_log_warn (LOGD_SETTINGS, "Can't handle this line: %s\n", line);
|
||||
g_strfreev (key_value);
|
||||
return;
|
||||
}
|
||||
g_hash_table_insert (wsec_global_table,
|
||||
g_strdup (g_strstrip (key_value[0])),
|
||||
g_strdup (g_strstrip (key_value[1])));
|
||||
g_strfreev (key_value);
|
||||
}
|
||||
|
||||
void
|
||||
wpa_parser_init (const char *wpa_supplicant_conf)
|
||||
{
|
||||
GIOChannel *channel = NULL;
|
||||
gchar *line;
|
||||
gboolean complete = FALSE;
|
||||
|
||||
wpa_parser_data_changed = FALSE;
|
||||
wsec_table = g_hash_table_new (nm_str_hash, g_str_equal);
|
||||
wsec_global_table = g_hash_table_new (nm_str_hash, g_str_equal);
|
||||
|
||||
if (g_file_test (wpa_supplicant_conf, G_FILE_TEST_IS_REGULAR))
|
||||
channel =
|
||||
g_io_channel_new_file (wpa_supplicant_conf, "r", NULL);
|
||||
if (channel == NULL) {
|
||||
nm_log_warn (LOGD_SETTINGS, "Can't open %s for wireless security",
|
||||
wpa_supplicant_conf);
|
||||
return;
|
||||
}
|
||||
|
||||
while (g_io_channel_read_line (channel, &line, NULL, NULL, NULL)
|
||||
!= G_IO_STATUS_EOF) {
|
||||
g_strstrip (line);
|
||||
if (line[0] != '#' && line[0] != '\0') {
|
||||
if (strstr (line, "network={") == NULL) {
|
||||
add_global_data (line);
|
||||
g_free (line);
|
||||
continue;
|
||||
} else {
|
||||
GHashTable *network =
|
||||
g_hash_table_new (nm_str_hash, g_str_equal);
|
||||
|
||||
do {
|
||||
gchar *quote_start, *quote_end = NULL, *comment;
|
||||
|
||||
if (line[0] == '#' || line[0] == '\0') {
|
||||
g_free (line);
|
||||
continue;
|
||||
}
|
||||
/* ignore inline comments unless inside
|
||||
a double-quoted string */
|
||||
if ((quote_start = strchr (line, '"')) != NULL)
|
||||
quote_end = strrchr (quote_start + 1, '"');
|
||||
if ((comment = strchr ((quote_end != NULL) ?
|
||||
quote_end : line, '#')) != NULL)
|
||||
*comment = '\0';
|
||||
if (strstr (line, "}") != NULL)
|
||||
complete = TRUE;
|
||||
add_key_value (network, line);
|
||||
g_free (line);
|
||||
} while (complete == FALSE
|
||||
&&
|
||||
g_io_channel_read_line
|
||||
(channel, &line, NULL,
|
||||
NULL, NULL) != G_IO_STATUS_EOF);
|
||||
add_security (network);
|
||||
//EOF in inner loop
|
||||
if (complete == FALSE) {
|
||||
g_free (line);
|
||||
break;
|
||||
}
|
||||
complete = FALSE;
|
||||
}
|
||||
} else
|
||||
g_free (line);
|
||||
}
|
||||
|
||||
g_io_channel_shutdown (channel, FALSE, NULL);
|
||||
g_io_channel_unref (channel);
|
||||
|
||||
add_keys_from_net ();
|
||||
}
|
||||
|
||||
const char *
|
||||
wpa_get_value (const char *ssid, const char *key)
|
||||
{
|
||||
GHashTable *target = g_hash_table_lookup (wsec_table, ssid);
|
||||
|
||||
if (target)
|
||||
return g_hash_table_lookup (target, key);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
gboolean
|
||||
exist_ssid (const char *ssid)
|
||||
{
|
||||
return g_hash_table_lookup (wsec_table, ssid) != NULL;
|
||||
}
|
||||
|
||||
GHashTable *
|
||||
_get_hash_table (const char *ssid)
|
||||
{
|
||||
return g_hash_table_lookup (wsec_table, ssid);
|
||||
}
|
||||
|
||||
static gchar *quoted_keys[] =
|
||||
{ "identity", "cert", "private", "phase", "password", NULL };
|
||||
|
||||
/* tell whether the key needs quotes when writing is performed */
|
||||
static gboolean
|
||||
need_quote (gchar * key)
|
||||
{
|
||||
int i = 0;
|
||||
|
||||
while (quoted_keys[i] != NULL) {
|
||||
if (strstr (key, quoted_keys[i]))
|
||||
return TRUE;
|
||||
i++;
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
gboolean
|
||||
wpa_flush_to_file (const char *config_file)
|
||||
{
|
||||
GIOChannel *channel;
|
||||
GError *error = NULL;
|
||||
gpointer key, value, ssid, security;
|
||||
GHashTableIter iter, iter_security;
|
||||
gchar *out_line;
|
||||
gsize bytes_written;
|
||||
gboolean result = FALSE;
|
||||
|
||||
if (!wpa_parser_data_changed)
|
||||
return TRUE;
|
||||
if (!wsec_table || !wsec_global_table)
|
||||
return FALSE;
|
||||
|
||||
backup_file (config_file);
|
||||
|
||||
channel = g_io_channel_new_file (config_file, "w", NULL);
|
||||
if (!channel) {
|
||||
nm_log_warn (LOGD_SETTINGS, "Can't open file %s for writing", config_file);
|
||||
return FALSE;
|
||||
}
|
||||
g_hash_table_iter_init (&iter, wsec_global_table);
|
||||
nm_log_info (LOGD_SETTINGS, "Writing to %s", config_file);
|
||||
g_io_channel_write_chars (channel,
|
||||
"#Generated by NetworkManager\n"
|
||||
"###### Global Configuration ######\n",
|
||||
-1, &bytes_written, &error);
|
||||
if (error)
|
||||
goto done;
|
||||
|
||||
/* Writing global information */
|
||||
while (g_hash_table_iter_next (&iter, &key, &value)) {
|
||||
out_line =
|
||||
g_strdup_printf ("%s=%s\n", (gchar *) key, (gchar *) value);
|
||||
g_io_channel_write_chars (channel, out_line, -1, &bytes_written,
|
||||
&error);
|
||||
if (bytes_written == 0 || error)
|
||||
break;
|
||||
g_free (out_line);
|
||||
}
|
||||
if (error)
|
||||
goto done;
|
||||
g_io_channel_write_chars (channel,
|
||||
"\n###### Security Configuration ######\n",
|
||||
-1, &bytes_written, &error);
|
||||
if (error)
|
||||
goto done;
|
||||
|
||||
g_hash_table_iter_init (&iter, wsec_table);
|
||||
/* Writing security */
|
||||
while (g_hash_table_iter_next (&iter, &ssid, &security)) {
|
||||
g_hash_table_iter_init (&iter_security,
|
||||
(GHashTable *) security);
|
||||
g_io_channel_write_chars (channel, "network={\n", -1,
|
||||
&bytes_written, &error);
|
||||
if (error)
|
||||
goto done;
|
||||
while (g_hash_table_iter_next (&iter_security, &key, &value)) {
|
||||
out_line =
|
||||
g_strdup_printf (need_quote ((gchar *) key) ?
|
||||
"\t%s=\"%s\"\n" : "\t%s=%s\n",
|
||||
(gchar *) key, (gchar *) value);
|
||||
g_io_channel_write_chars (channel, out_line, -1,
|
||||
&bytes_written, &error);
|
||||
if (bytes_written == 0 || error)
|
||||
goto done;
|
||||
g_free (out_line);
|
||||
}
|
||||
g_io_channel_write_chars (channel, "}\n\n", -1, &bytes_written, &error);
|
||||
|
||||
}
|
||||
g_io_channel_flush (channel, &error);
|
||||
if (error)
|
||||
goto done;
|
||||
|
||||
wpa_parser_data_changed = FALSE;
|
||||
result = TRUE;
|
||||
done:
|
||||
if (error) {
|
||||
nm_log_warn (LOGD_SETTINGS, "Error writing WPA configuration: %s", error->message);
|
||||
g_error_free (error);
|
||||
}
|
||||
g_io_channel_shutdown (channel, FALSE, NULL);
|
||||
g_io_channel_unref (channel);
|
||||
return result;
|
||||
}
|
||||
|
||||
/* If value is NULL, this method will delete old key value pair */
|
||||
void
|
||||
wpa_set_data (const char *ssid, const char *key, const char *value)
|
||||
{
|
||||
gpointer old_key = NULL, old_value = NULL;
|
||||
GHashTable *security = g_hash_table_lookup (wsec_table, ssid);
|
||||
gchar * stripped = NULL;
|
||||
|
||||
g_return_if_fail (security != NULL);
|
||||
|
||||
if (value){
|
||||
stripped = g_strdup(value);
|
||||
if (strcmp (key, "ssid") != 0 && strcmp (key, "psk") != 0
|
||||
&& !g_str_has_prefix (key, "wep_key"))
|
||||
strip_string (stripped, '"');
|
||||
}
|
||||
|
||||
/* Remove old key value pairs */
|
||||
if (g_hash_table_lookup_extended
|
||||
(security, key, &old_key, &old_value)) {
|
||||
if (stripped && !strcmp(old_value, stripped)){
|
||||
g_free (stripped);
|
||||
return;
|
||||
}
|
||||
g_hash_table_remove (security, old_key);
|
||||
g_free (old_key);
|
||||
g_free (old_value);
|
||||
} else if (!value)
|
||||
return;
|
||||
|
||||
/* Add new key value */
|
||||
if (stripped)
|
||||
g_hash_table_insert (security, g_strdup (key), stripped);
|
||||
wpa_parser_data_changed = TRUE;
|
||||
}
|
||||
|
||||
gboolean
|
||||
wpa_has_security (const char *ssid)
|
||||
{
|
||||
return g_hash_table_lookup (wsec_table, ssid) != NULL;
|
||||
}
|
||||
|
||||
gboolean
|
||||
wpa_add_security (const char *ssid)
|
||||
{
|
||||
if (wpa_has_security (ssid))
|
||||
return TRUE;
|
||||
else {
|
||||
GHashTable *security =
|
||||
g_hash_table_new (nm_str_hash, g_str_equal);
|
||||
gchar *ssid_i;
|
||||
|
||||
nm_log_info (LOGD_SETTINGS, "Adding security for %s", ssid);
|
||||
if (g_str_has_prefix (ssid, "0x")) {
|
||||
/* hex ssid */
|
||||
ssid_i = g_strdup (ssid + 2);
|
||||
} else {
|
||||
/* ascii ssid requires quotes */
|
||||
ssid_i = g_strdup_printf ("\"%s\"", ssid);
|
||||
}
|
||||
g_hash_table_insert (security, strdup ("ssid"), ssid_i);
|
||||
g_hash_table_insert (security, strdup ("priority"),
|
||||
strdup ("1"));
|
||||
g_hash_table_insert (wsec_table, g_strdup (ssid), security);
|
||||
wpa_parser_data_changed = TRUE;
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
gboolean
|
||||
wpa_delete_security (const char *ssid)
|
||||
{
|
||||
gpointer old_key, old_value;
|
||||
|
||||
g_return_val_if_fail (wsec_table != NULL && ssid != NULL, FALSE);
|
||||
nm_log_info (LOGD_SETTINGS, "Deleting security for %s", ssid);
|
||||
if (!g_hash_table_lookup_extended
|
||||
(wsec_table, ssid, &old_key, &old_value))
|
||||
return FALSE;
|
||||
g_hash_table_remove (wsec_table, old_key);
|
||||
g_free (old_key);
|
||||
destroy_security ((GHashTable *) old_value);
|
||||
wpa_parser_data_changed = TRUE;
|
||||
return TRUE;
|
||||
|
||||
}
|
||||
|
||||
void
|
||||
wpa_parser_destroy (void)
|
||||
{
|
||||
GHashTableIter iter;
|
||||
gpointer key;
|
||||
gpointer value;
|
||||
|
||||
/* Destroy security */
|
||||
if (wsec_table) {
|
||||
g_hash_table_iter_init (&iter, wsec_table);
|
||||
while (g_hash_table_iter_next (&iter, &key, &value)) {
|
||||
destroy_security ((GHashTable *) value);
|
||||
g_free (key);
|
||||
}
|
||||
|
||||
g_hash_table_destroy (wsec_table);
|
||||
wsec_table = NULL;
|
||||
}
|
||||
|
||||
/* Destroy global data */
|
||||
if (wsec_global_table) {
|
||||
g_hash_table_iter_init (&iter, wsec_global_table);
|
||||
while (g_hash_table_iter_next (&iter, &key, &value)) {
|
||||
g_free (key);
|
||||
g_free (value);
|
||||
}
|
||||
|
||||
g_hash_table_destroy (wsec_global_table);
|
||||
wsec_global_table = NULL;
|
||||
}
|
||||
}
|
||||
|
|
@ -1,41 +0,0 @@
|
|||
/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */
|
||||
/*
|
||||
* Mu Qiao <qiaomuf@gmail.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program 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 General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Copyright (C) 1999-2010 Gentoo Foundation, Inc.
|
||||
*/
|
||||
|
||||
#ifndef _WPA_PARSER_H
|
||||
#define _WPA_PARSER_H
|
||||
|
||||
#define WPA_SUPPLICANT_CONF SYSCONFDIR "/wpa_supplicant/wpa_supplicant.conf"
|
||||
|
||||
void wpa_parser_init (const char *wpa_supplicant_conf);
|
||||
void wpa_parser_destroy (void);
|
||||
|
||||
/* reader functions */
|
||||
const char *wpa_get_value (const char *ssid, const char *key);
|
||||
gboolean exist_ssid (const char *ssid);
|
||||
GHashTable *_get_hash_table (const char *ssid);
|
||||
gboolean wpa_has_security (const char *ssid);
|
||||
|
||||
/* writer functions */
|
||||
gboolean wpa_flush_to_file (const char *config_file);
|
||||
void wpa_set_data (const char *ssid, const char *key, const char *value);
|
||||
gboolean wpa_add_security (const char *ssid);
|
||||
gboolean wpa_delete_security (const char *ssid);
|
||||
#endif
|
||||
|
|
@ -1,20 +0,0 @@
|
|||
test_unit = 'test-ifnet'
|
||||
|
||||
test_ifnet_dir = meson.current_source_dir()
|
||||
|
||||
cflags = [
|
||||
'-DSYSCONFDIR="nonexistent"',
|
||||
'-DTEST_IFNET_DIR="@0@"'.format(test_ifnet_dir),
|
||||
'-DTEST_SCRATCH_DIR="@0@"'.format(test_ifnet_dir),
|
||||
'-DTEST_WPA_SUPPLICANT_CONF="@0@"'.format(join_paths(test_ifnet_dir, 'wpa_supplicant.conf'))
|
||||
]
|
||||
|
||||
exe = executable(
|
||||
test_unit,
|
||||
test_unit + '.c',
|
||||
dependencies: test_core_dep,
|
||||
c_args: cflags,
|
||||
link_with: libnms_ifnet_core
|
||||
)
|
||||
|
||||
test(test_unit, exe)
|
||||
|
|
@ -1,158 +0,0 @@
|
|||
# This blank configuration will automatically use DHCP for any net.*
|
||||
# scripts in /etc/init.d. To create a more complete configuration,
|
||||
# please review /etc/conf.d/net.example and save your configuration
|
||||
# in /etc/conf.d/net (this file :]!).
|
||||
|
||||
modules="!wpa_supplicant"
|
||||
|
||||
config_eth0=(
|
||||
"202.117.16.121 netmask 255.255.255.0 brd 202.117.16.255"
|
||||
"192.168.4.121/24"
|
||||
"dhcp6"
|
||||
)
|
||||
routes_eth0=( "default via 202.117.16.1"
|
||||
"192.168.4.0/24 via 192.168.4.1")
|
||||
dns_servers_eth0="202.117.0.20 202.117.0.21"
|
||||
dns_search_eth0="p12.edu.cn p13.edu.cn"
|
||||
|
||||
config_eth1=(
|
||||
"dhcp"
|
||||
)
|
||||
enable_ipv6_eth1="true"
|
||||
routes_eth1=( "default via 202.117.16.1" )
|
||||
dns_servers_eth1="202.117.0.20 202.117.0.21"
|
||||
config_eth2=(
|
||||
"202.117.16.1211 netmask 255.255.255.0 brd 202.117.16.255"
|
||||
"192.168.4.121/24"
|
||||
"4321:0:1:2:3:4:567:89ab/64"
|
||||
)
|
||||
routes_eth2=("default via 4321:0:1:2:3:4:567:89ab")
|
||||
enable_ipv6_eth2="true"
|
||||
config_eth3=("nufjlsjlll")
|
||||
managed_eth4="false"
|
||||
routes_eth4=("default via 4321:0:1:2:3:4:567:89ab")
|
||||
config_eth5=("dhcp")
|
||||
|
||||
config_eth7=( "dhcp" )
|
||||
auto_eth7="true"
|
||||
|
||||
# missing config_eth8
|
||||
auto_eth8="true"
|
||||
|
||||
#new openrc style
|
||||
config_eth9="202.117.16.10/24 202.117.17.10/24"
|
||||
routes_eth9="default via 202.117.16.1
|
||||
10.0.0.0/8 via 192.168.0.1
|
||||
"
|
||||
config_eth10="202.117.16.2 netmask 255.255.255.0"
|
||||
routes_eth10="10.0.0.0/8 via 192.168.0.1"
|
||||
|
||||
config_myxjtu2=("202.117.16.121/24 brd 202.117.16.255")
|
||||
routes_myxjtu2=("default via 202.117.16.1")
|
||||
dns_servers_myxjtu2="202.117.0.20 202.117.0.21"
|
||||
#key_myxjtu2="[1] s:xjtud key [1] enc restricted"
|
||||
#key_eth6="[1] aaaa-4444-3d [2] s:xjtudlc key [1] enc open"
|
||||
|
||||
|
||||
username_ppp0='user'
|
||||
password_ppp0='password'
|
||||
|
||||
config_qiaomuf=("dhcp")
|
||||
|
||||
config_1xtest=("dhcp")
|
||||
|
||||
config_0xab3ace=("dhcp")
|
||||
|
||||
modules=( "iproute2" )
|
||||
config_kvm0=( "null" )
|
||||
config_kvm1=( "null" )
|
||||
|
||||
tuntap_kvm0="tap"
|
||||
tuntap_kvm1="tap"
|
||||
tunctl_kvm0="-u user"
|
||||
tunctl_kvm1="-u user"
|
||||
|
||||
bridge_br0="eth0 kvm0 kvm1"
|
||||
config_br0=( "192.168.1.10/24" )
|
||||
brctl_br0=( "setfd 0")
|
||||
dhcp_eth1="nosendhost nontp -I"
|
||||
|
||||
predown() {
|
||||
# The default in the script is to test for NFS root and disallow
|
||||
# downing interfaces in that case. Note that if you specify a
|
||||
# predown() function you will override that logic. Here it is, in
|
||||
# case you still want it...
|
||||
if is_net_fs /; then
|
||||
eerror "root filesystem is network mounted -- can't stop ${IFACE}"
|
||||
return 1
|
||||
fi
|
||||
|
||||
# Remember to return 0 on success
|
||||
return 0
|
||||
}
|
||||
|
||||
postup() {
|
||||
# This function could be used, for example, to register with a
|
||||
# dynamic DNS service. Another possibility would be to
|
||||
# send/receive mail once the interface is brought up.
|
||||
|
||||
# Here is an example that allows the use of iproute rules
|
||||
# which have been configured using the rules_eth0 variable.
|
||||
#rules_eth0=" \
|
||||
# 'from 24.80.102.112/32 to 192.168.1.0/24 table localnet priority 100' \
|
||||
# 'from 216.113.223.51/32 to 192.168.1.0/24 table localnet priority 100' \
|
||||
#"
|
||||
eval set -- \$rules_${IFVAR}
|
||||
if [ $# != 0 ]; then
|
||||
einfo "Adding IP policy routing rules"
|
||||
eindent
|
||||
# Ensure that the kernel supports policy routing
|
||||
if ! ip rule list | grep -q "^"; then
|
||||
eerror "You need to enable IP Policy Routing (CONFIG_IP_MULTIPLE_TABLES)"
|
||||
eerror "in your kernel to use ip rules"
|
||||
else
|
||||
for x; do
|
||||
ebegin "${x}"
|
||||
ip rule add ${x}
|
||||
eend $?
|
||||
done
|
||||
fi
|
||||
eoutdent
|
||||
# Flush the cache
|
||||
ip route flush cache dev "${IFACE}"
|
||||
fi
|
||||
|
||||
}
|
||||
|
||||
postdown() {
|
||||
# Enable Wake-On-LAN for every interface except for lo
|
||||
# Probably a good idea to set ifdown="no" in /etc/conf.d/net
|
||||
# as well ;)
|
||||
[ "${IFACE}" != "lo" ] && ethtool -s "${IFACE}" wol g
|
||||
|
||||
Automatically erase any ip rules created in the example postup above
|
||||
if interface_exists "${IFACE}"; then
|
||||
# Remove any rules for this interface
|
||||
local rule
|
||||
ip rule list | grep " iif ${IFACE}[ ]*" | {
|
||||
while read rule; do
|
||||
rule="${rule#*:}"
|
||||
ip rule del ${rule}
|
||||
done
|
||||
}
|
||||
# Flush the route cache
|
||||
ip route flush cache dev "${IFACE}"
|
||||
fi
|
||||
|
||||
# Return 0 always
|
||||
return 0
|
||||
}
|
||||
|
||||
failup() {
|
||||
# This function is mostly here for completeness... I haven't
|
||||
# thought of anything nifty to do with it yet ;-)
|
||||
}
|
||||
|
||||
faildown()
|
||||
{}
|
||||
|
||||
|
|
@ -1,864 +0,0 @@
|
|||
##############################################################################
|
||||
# QUICK-START
|
||||
#
|
||||
# The quickest start is if you want to use DHCP.
|
||||
# In that case, everything should work out of the box, no configuration
|
||||
# necessary, though the startup script will warn you that you haven't
|
||||
# specified anything.
|
||||
|
||||
# WARNING :- some examples have a mixture of IPv4 (ie 192.168.0.1) and IPv6
|
||||
# (ie 4321:0:1:2:3:4:567:89ab) internet addresses. They only work if you have
|
||||
# the relevant kernel option enabled. So if you don't have an IPv6 enabled
|
||||
# kernel then remove the IPv6 address from your config.
|
||||
|
||||
# If you want to use a static address or use DHCP explicitly, jump
|
||||
# down to the section labelled INTERFACE HANDLERS.
|
||||
#
|
||||
# If you want to do anything more fancy, you should take the time to
|
||||
# read through the rest of this file.
|
||||
|
||||
##############################################################################
|
||||
# MODULES
|
||||
#
|
||||
# We now support modular networking scripts which means we can easily
|
||||
# add support for new interface types and modules while keeping
|
||||
# compatability with existing ones.
|
||||
#
|
||||
# Modules load by default if the package they need is installed. If
|
||||
# you specify a module here that doesn't have it's package installed
|
||||
# then you get an error stating which package you need to install.
|
||||
# Ideally, you only use the modules setting when you have two or more
|
||||
# packages installed that supply the same service.
|
||||
#
|
||||
# In other words, you probably should DO NOTHING HERE...
|
||||
|
||||
# Prefer ifconfig over iproute2
|
||||
modules=( "ifconfig" )
|
||||
|
||||
# You can also specify other modules for an interface
|
||||
# In this case we prefer udhcpc over dhcpcd
|
||||
modules_eth0=( "udhcpc" )
|
||||
|
||||
# You can also specify which modules not to use - for example you may be
|
||||
# using a supplicant or linux-wlan-ng to control wireless configuration but
|
||||
# you still want to configure network settings per ESSID associated with.
|
||||
modules=( "!iwconfig" "!wpa_supplicant" )
|
||||
# IMPORTANT: If you need the above, please disable modules in that order
|
||||
|
||||
|
||||
##############################################################################
|
||||
# INTERFACE HANDLERS
|
||||
#
|
||||
# We provide two interface handlers presently: ifconfig and iproute2.
|
||||
# You need one of these to do any kind of network configuration.
|
||||
# For ifconfig support, emerge sys-apps/net-tools
|
||||
# For iproute2 support, emerge sys-apps/iproute2
|
||||
|
||||
# If you don't specify an interface then we prefer iproute2 if it's installed
|
||||
# To prefer ifconfig over iproute2
|
||||
modules=( "ifconfig" )
|
||||
|
||||
# For a static configuration, use something like this
|
||||
# (They all do exactly the same thing btw)
|
||||
config_eth0=( "192.168.0.2/24" )
|
||||
config_eth0=( "192.168.0.2 netmask 255.255.255.0" )
|
||||
|
||||
# We can also specify a broadcast
|
||||
config_eth0=( "192.168.0.2/24 brd 192.168.0.255" )
|
||||
config_eth0=( "192.168.0.2 netmask 255.255.255.0 broadcast 192.168.0.255" )
|
||||
|
||||
# If you need more than one address, you can use something like this
|
||||
# NOTE: ifconfig creates an aliased device for each extra IPv4 address
|
||||
# (eth0:1, eth0:2, etc)
|
||||
# iproute2 does not do this as there is no need to
|
||||
config_eth0=(
|
||||
"192.168.0.2/24"
|
||||
"192.168.0.3/24"
|
||||
"192.168.0.4/24"
|
||||
)
|
||||
# Or you can use sequence expressions
|
||||
config_eth0=( "192.168.0.{2..4}/24" )
|
||||
# which does the same as above. Be careful though as if you use this and
|
||||
# fallbacks, you have to ensure that both end up with the same number of
|
||||
# values otherwise your fallback won't work correctly.
|
||||
|
||||
# You can also use IPv6 addresses
|
||||
# (you should always specify a prefix length with IPv6 here)
|
||||
config_eth0=(
|
||||
"192.168.0.2/24"
|
||||
"4321:0:1:2:3:4:567:89ab/64"
|
||||
"4321:0:1:2:3:4:567:89ac/64"
|
||||
)
|
||||
|
||||
# If you wish to keep existing addresses + routing and the interface is up,
|
||||
# you can specify a noop (no operation). If the interface is down or there
|
||||
# are no addresses assigned, then we move onto the next step (default dhcp)
|
||||
# This is useful when configuring your interface with a kernel command line
|
||||
# or similar
|
||||
config_eth0=( "noop" "192.168.0.2/24" )
|
||||
|
||||
# If you don't want ANY address (only useful when calling for advanced stuff)
|
||||
config_eth0=( "null" )
|
||||
|
||||
# Here's how to do routing if you need it
|
||||
routes_eth0=(
|
||||
"default via 192.168.0.1" # IPv4 default route
|
||||
"10.0.0.0/8 via 192.168.0.1" # IPv4 subnet route
|
||||
"::/0" # IPv6 unicast
|
||||
)
|
||||
|
||||
# If a specified module fails (like dhcp - see below), you can specify a
|
||||
# fallback like so
|
||||
fallback_eth0=( "192.168.0.2 netmask 255.255.255.0" )
|
||||
fallback_route_eth0=( "default via 192.168.0.1" )
|
||||
|
||||
# NOTE: fallback entry must match the entry location in config_eth0
|
||||
# As such you can only have one fallback route.
|
||||
|
||||
# Some users may need to alter the MTU - here's how
|
||||
mtu_eth0="1500"
|
||||
|
||||
# Each module described below can set a default base metric, lower is
|
||||
# preferred over higher. This is so we can prefer a wired route over a
|
||||
# wireless route automaticaly. You can override this by setting
|
||||
metric_eth0="100"
|
||||
# or on a global basis
|
||||
metric="100"
|
||||
# The only downside of the global setting is that you have to ensure that
|
||||
# there are no conflicting routes yourself. For users with large routing
|
||||
# tables you may have to set a global metric as the due to a simple read of
|
||||
# the routing table taking over a minute at a time.
|
||||
|
||||
##############################################################################
|
||||
# OPTIONAL MODULES
|
||||
|
||||
# INTERFACE RENAMING
|
||||
# There is no consistent device renaming scheme for Linux.
|
||||
# The preferred way of naming devices is via the kernel module directly or
|
||||
# by using udev (http://www.reactivated.net/udevrules.php)
|
||||
|
||||
# If you are unable to write udev rules, then we do provide a way of renaming
|
||||
# the interface based on it's MAC address, but it is not optimal.
|
||||
# Here is how to rename an interface whose MAC address is 00:11:22:33:44:55
|
||||
# to foo1
|
||||
rename_001122334455="foo1"
|
||||
|
||||
# You can also do this based on current device name - although this is not
|
||||
# recommended. Here we rename eth1 to foo2.
|
||||
rename_eth1="foo2"
|
||||
|
||||
#-----------------------------------------------------------------------------
|
||||
# WIRELESS (802.11 support)
|
||||
# Wireless can be provided by iwconfig or wpa_supplicant
|
||||
|
||||
# iwconfig
|
||||
# emerge net-wireless/wireless-tools
|
||||
# Wireless options are held in /etc/conf.d/wireless - but could be here too
|
||||
# Consult the sample file /etc/conf.d/wireless.example for instructions
|
||||
# iwconfig is the default
|
||||
|
||||
# wpa_supplicant
|
||||
# emerge net-wireless/wpa-supplicant
|
||||
# Wireless options are held in /etc/wpa_supplicant.conf
|
||||
# Consult the sample file /etc/wpa_supplicant.conf.example for instructions
|
||||
# To choose wpa_supplicant over iwconfig
|
||||
modules=( "wpa_supplicant" )
|
||||
# To configure wpa_supplicant
|
||||
wpa_supplicant_eth0="-Dwext" # For generic wireless
|
||||
wpa_supplicant_ath0="-Dmadwifi" # For Atheros based cards
|
||||
# Consult wpa_supplicant for more drivers
|
||||
# By default don't wait for wpa_suppliant to associate and authenticate.
|
||||
# If you would like to, so can specify how long in seconds
|
||||
associate_timeout_eth0=60
|
||||
# A value of 0 means wait forever.
|
||||
|
||||
# GENERIC WIRELESS OPTIONS
|
||||
# PLEASE READ THE INSTRUCTIONS IN /etc/conf.d/wireless.example FOR
|
||||
# HOW TO USE THIS ESSID VARIABLE
|
||||
# You can also override any settings found here per ESSID - which is very
|
||||
# handy if you use different networks a lot
|
||||
config_ESSID=( "dhcp" )
|
||||
dhcpcd_ESSID="-t 5"
|
||||
|
||||
# Setting name/domain server causes /etc/resolv.conf to be overwritten
|
||||
# Note that if DHCP is used, and you want this to take precedence then
|
||||
set dhcp_ESSID="nodns"
|
||||
dns_servers_ESSID=( "192.168.0.1" "192.168.0.2" )
|
||||
dns_domain_ESSID="some.domain"
|
||||
dns_search_ESSID="search.this.domain search.that.domain"
|
||||
# Please check the man page for resolv.conf for more information
|
||||
# as domain and search are mutually exclusive.
|
||||
|
||||
# You can also override any settings found here per MAC address of the AP
|
||||
# in case you use Access Points with the same ESSID but need different
|
||||
# networking configs. Below is an example - of course you use the same
|
||||
# method with other variables
|
||||
mac_config_001122334455=( "dhcp" )
|
||||
mac_dhcpcd_001122334455="-t 10"
|
||||
mac_dns_servers_001122334455=( "192.168.0.1" "192.168.0.2" )
|
||||
|
||||
# When an interface has been associated with an Access Point, a global
|
||||
# variable called ESSID is set to the Access Point's ESSID for use in the
|
||||
# pre/post user functions below (although it's not available in preup as you
|
||||
# won't have associated then)
|
||||
|
||||
# If you're using anything else to configure wireless on your interface AND
|
||||
# you have installed any of the above packages, you need to disable them
|
||||
modules=( "!iwconfig" "!wpa_supplicant" )
|
||||
|
||||
#-----------------------------------------------------------------------------
|
||||
# DHCP
|
||||
# DHCP can be provided by dhclient, dhcpcd, pump or udhcpc.
|
||||
#
|
||||
# dhclient: emerge net-misc/dhcp
|
||||
# dhcpcd: emerge net-misc/dhcpcd
|
||||
# pump: emerge net-misc/pump
|
||||
# udhcpc: emerge net-misc/udhcp
|
||||
|
||||
# If you have more than one DHCP client installed, you need to specify which
|
||||
# one to use - otherwise we default to dhcpcd if available.
|
||||
modules=( "dhclient" ) # to select dhclient over dhcpcd
|
||||
#
|
||||
# Notes:
|
||||
# - All clients send the current hostname to the DHCP server by default
|
||||
# - dhcpcd does not daemonize when the lease time is infinite
|
||||
# - udhcp-0.9.3-r3 and earlier do not support getting NTP servers
|
||||
# - pump does not support getting NIS servers
|
||||
# - DHCP tends to erase any existing device information - so add
|
||||
# static addresses after dhcp if you need them
|
||||
# - dhclient and udhcpc can set other resolv.conf options such as "option"
|
||||
# and "sortlist"- see the System module for more details
|
||||
|
||||
# Regardless of which DHCP client you prefer, you configure them the
|
||||
# same way using one of following depending on which interface modules
|
||||
# you're using.
|
||||
config_eth0=( "dhcp" )
|
||||
|
||||
# For passing custom options to dhcpcd use something like the following. This
|
||||
# example reduces the timeout for retrieving an address from 60 seconds (the
|
||||
# default) to 10 seconds.
|
||||
dhcpcd_eth0="-t 10"
|
||||
|
||||
# dhclient, udhcpc and pump don't have many runtime options
|
||||
# You can pass options to them in a similar manner to dhcpcd though
|
||||
dhclient_eth0="..."
|
||||
udhcpc_eth0="..."
|
||||
pump_eth0="..."
|
||||
|
||||
# GENERIC DHCP OPTIONS
|
||||
# Set generic DHCP options like so
|
||||
dhcp_eth0="release nodns nontp nonis nogateway nosendhost"
|
||||
|
||||
# This tells the dhcp client to release it's lease when it stops, not to
|
||||
# overwrite dns, ntp and nis settings, not to set a default route and not to
|
||||
# send the current hostname to the dhcp server and when it starts.
|
||||
# You can use any combination of the above options - the default is not to
|
||||
# use any of them.
|
||||
|
||||
#-----------------------------------------------------------------------------
|
||||
# For APIPA support, emerge net-misc/iputils or net-analyzer/arping
|
||||
|
||||
# APIPA is a module that tries to find a free address in the range
|
||||
# 169.254.0.0-169.254.255.255 by arping a random address in that range on the
|
||||
# interface. If no reply is found then we assign that address to the interface
|
||||
|
||||
# This is only useful for LANs where there is no DHCP server and you don't
|
||||
# connect directly to the internet.
|
||||
config_eth0=( "dhcp" )
|
||||
fallback_eth0=( "apipa" )
|
||||
|
||||
#-----------------------------------------------------------------------------
|
||||
# ARPING Gateway configuration
|
||||
# and
|
||||
# Automatic Private IP Addressing (APIPA)
|
||||
# For arpingnet / apipa support, emerge net-misc/iputils or net-analyzer/arping
|
||||
#
|
||||
# This is a module that tries to find a gateway IP. If it exists then we use
|
||||
# that gateways configuration for our own. For the configuration variables
|
||||
# simply ensure that each octet is zero padded and the dots are removed.
|
||||
# Below is an example.
|
||||
#
|
||||
gateways_eth0="192.168.0.1 10.0.0.1"
|
||||
config_192168000001=( "192.168.0.2/24" )
|
||||
routes_192168000001=( "default via 192.168.0.1" )
|
||||
dns_servers_192168000001=( "192.168.0.1" )
|
||||
config_010000000001=( "10.0.0.254/8" )
|
||||
routes_010000000001=( "default via 10.0.0.1" )
|
||||
dns_servers_010000000001=( "10.0.0.1" )
|
||||
|
||||
# We can also specify a specific MAC address for each gateway if different
|
||||
# networks have the same gateway.
|
||||
gateways_eth0="192.168.0.1,00:11:22:AA:BB:CC 10.0.0.1,33:44:55:DD:EE:FF"
|
||||
config_192168000001_001122AABBCC=( "192.168.0.2/24" )
|
||||
routes_192168000001_001122AABBCC=( "default via 192.168.0.1" )
|
||||
dns_servers_192168000001_001122AABBCC=( "192.168.0.1" )
|
||||
config_010000000001_334455DDEEFF=( "10.0.0.254/8" )
|
||||
routes_010000000001_334455DDEEFF=( "default via 10.0.0.1" )
|
||||
dns_servers_010000000001_334455DDEEFF=( "10.0.0.1" )
|
||||
|
||||
# If we don't find any gateways (or there are none configured) then we try and
|
||||
# use APIPA to find a free address in the range 169.254.0.0-169.254.255.255
|
||||
# by arping a random address in that range on the interface. If no reply is
|
||||
# found then we assign that address to the interface.
|
||||
|
||||
# This is only useful for LANs where there is no DHCP server.
|
||||
config_eth0=( "arping" )
|
||||
|
||||
# or if no DHCP server can be found
|
||||
config_eth0=( "dhcp" )
|
||||
fallback_eth0=( "arping" )
|
||||
|
||||
# NOTE: We default to sleeping for 1 second the first time we attempt an
|
||||
# arping to give the interface time to settle on the LAN. This appears to
|
||||
# be a good default for most instances, but if not you can alter it here.
|
||||
arping_sleep=5
|
||||
arping_sleep_lan=7
|
||||
|
||||
# NOTE: We default to waiting 3 seconds to get an arping response. You can
|
||||
# change the default wait like so.
|
||||
arping_wait=3
|
||||
arping_wait_lan=2
|
||||
|
||||
#-----------------------------------------------------------------------------
|
||||
# VLAN (802.1q support)
|
||||
# For VLAN support, emerge net-misc/vconfig
|
||||
|
||||
# Specify the VLAN numbers for the interface like so
|
||||
# Please ensure your VLAN IDs are NOT zero-padded
|
||||
vlans_eth0="1 2"
|
||||
|
||||
# You may not want to assign an IP to the physical interface, but we still
|
||||
# need it up.
|
||||
config_eth0=( "null" )
|
||||
|
||||
# You can also configure the VLAN - see for vconfig man page for more details
|
||||
vconfig_eth0=( "set_name_type VLAN_PLUS_VID_NO_PAD" )
|
||||
vconfig_vlan1=( "set_flag 1" "set_egress_map 2 6" )
|
||||
config_vlan1=( "172.16.3.1 netmask 255.255.254.0" )
|
||||
config_vlan2=( "172.16.2.1 netmask 255.255.254.0" )
|
||||
|
||||
# NOTE: Vlans can be configured with a . in their interface names
|
||||
# When configuring vlans with this name type, you need to replace . with a _
|
||||
config_eth0.1=( "dhcp" ) - does not work
|
||||
config_eth0_1=( "dhcp" ) - does work
|
||||
|
||||
# NOTE: Vlans are controlled by their physical interface and not per vlan
|
||||
# This means you do not need to create init scripts in /etc/init.d for each
|
||||
# vlan, you must need to create one for the physical interface.
|
||||
# If you wish to control the configuration of each vlan through a separate
|
||||
# script, or wish to rename the vlan interface to something that vconfig
|
||||
# cannot then you need to do this.
|
||||
vlan_start_eth0="no"
|
||||
|
||||
# If you do the above then you may want to depend on eth0 like so
|
||||
RC_NEED_vlan1="net.eth0"
|
||||
# NOTE: depend functions only work in /etc/conf.d/net
|
||||
# and not in profile configs such as /etc/conf.d/net.foo
|
||||
|
||||
#-----------------------------------------------------------------------------
|
||||
# Bonding
|
||||
# For link bonding/trunking emerge net-misc/ifenslave
|
||||
|
||||
# To bond interfaces together
|
||||
slaves_bond0="eth0 eth1 eth2"
|
||||
config_bond0=( "null" ) # You may not want to assign an IP to the bond
|
||||
|
||||
# If any of the slaves require extra configuration - for example wireless or
|
||||
# ppp devices - we need to depend function on the bonded interfaces
|
||||
RC_NEED_bond0="net.eth0 net.eth1"
|
||||
|
||||
|
||||
#-----------------------------------------------------------------------------
|
||||
# Classical IP over ATM
|
||||
# For CLIP support emerge net-dialup/linux-atm
|
||||
|
||||
# Ensure that you have /etc/atmsigd.conf setup correctly
|
||||
# Now setup each clip interface like so
|
||||
clip_atm0=( "peer_ip [if.]vpi.vci [opts]" ... )
|
||||
# where "peer_ip" is the IP address of a PVC peer (in case of an ATM connection
|
||||
# with your ISP, your only peer is usually the ISP gateway closest to you),
|
||||
# "if" is the number of the ATM interface which will carry the PVC, "vpi.vci"
|
||||
# is the ATM VC address, and "opts" may optionally specify VC parameters like
|
||||
# qos, pcr, and the like (see "atmarp -s" for further reference). Please also
|
||||
# note quoting: it is meant to distinguish the VCs you want to create. You may,
|
||||
# in example, create an atm0 interface to more peers, like this:
|
||||
clip_atm0=( "1.1.1.254 0.8.35" "1.1.1.253 1.8.35" )
|
||||
|
||||
# By default, the PVC will use the LLC/SNAP encapsulation. If you rather need a
|
||||
# null encapsulation (aka "VC mode"), please add the keyword "null" to opts.
|
||||
|
||||
|
||||
#-----------------------------------------------------------------------------
|
||||
# PPP
|
||||
# For PPP support, emerge net-dialup/ppp
|
||||
# PPP is used for most dialup connections, including ADSL.
|
||||
# The older ADSL module is documented below, but you are encouraged to try
|
||||
# this module first.
|
||||
#
|
||||
# You need to create the PPP net script yourself. Make it like so
|
||||
#ln -s net.lo /etc/init.d/net.ppp0
|
||||
#
|
||||
# We have to instruct ppp0 to actually use ppp
|
||||
config_ppp0=( "ppp" )
|
||||
#
|
||||
# Each PPP interface requires an interface to use as a "Link"
|
||||
link_ppp0="/dev/ttyS0" # Most PPP links will use a serial port
|
||||
link_ppp0="eth0" # PPPoE requires an ethernet interface
|
||||
link_ppp0="[itf.]vpi.vci" # PPPoA requires the ATM VC's address
|
||||
link_ppp0="/dev/null" # ISDN links should have this
|
||||
link_ppp0="pty 'your_link_command'" # PPP links over ssh, rsh, etc
|
||||
#
|
||||
# Here you should specify what pppd plugins you want to use
|
||||
# Available plugins are: pppoe, pppoa, capi, dhcpc, minconn, radius,
|
||||
# radattr, radrealms and winbind
|
||||
plugins_ppp0=(
|
||||
"pppoe" # Required plugin for PPPoE
|
||||
"pppoa vc-encaps" # Required plugin for PPPoA with an option
|
||||
"capi" # Required plugin for ISDN
|
||||
)
|
||||
#
|
||||
# PPP requires at least a username. You can optionally set a password here too
|
||||
# If you don't, then it will use the password specified in /etc/ppp/*-secrets
|
||||
# against the specified username
|
||||
username_ppp0='user'
|
||||
password_ppp0='password'
|
||||
# NOTE: You can set a blank password like so
|
||||
password_ppp0=
|
||||
#
|
||||
# The PPP daemon has many options you can specify - although there are many
|
||||
# and may seem daunting, it is recommended that you read the pppd man page
|
||||
# before enabling any of them
|
||||
pppd_ppp0=(
|
||||
"maxfail 0" # WARNING: It's not recommended you use this
|
||||
# if you don't specify maxfail then we assume 0
|
||||
"updetach" # If not set, "/etc/init.d/net.ppp0 start" will return
|
||||
# immediately, without waiting the link to come up
|
||||
# for the first time.
|
||||
# Do not use it for dial-on-demand links!
|
||||
"debug" # Enables syslog debugging
|
||||
"noauth" # Do not require the peer to authenticate itself
|
||||
"defaultroute" # Make this PPP interface the default route
|
||||
"usepeerdns" # Use the DNS settings provided by PPP
|
||||
|
||||
# On demand options
|
||||
"demand" # Enable dial on demand
|
||||
"idle 30" # Link goes down after 30 seconds of inactivity
|
||||
"10.112.112.112:10.112.112.113" # Phony IP addresses
|
||||
"ipcp-accept-remote" # Accept the peers idea of remote address
|
||||
"ipcp-accept-local" # Accept the peers idea of local address
|
||||
"holdoff 3" # Wait 3 seconds after link dies before re-starting
|
||||
|
||||
# Dead peer detection
|
||||
"lcp-echo-interval 15" # Send a LCP echo every 15 seconds
|
||||
"lcp-echo-failure 3" # Make peer dead after 3 consective
|
||||
# echo-requests
|
||||
|
||||
# Compression options - use these to completely disable compression
|
||||
# noaccomp noccp nobsdcomp nodeflate nopcomp novj novjccomp
|
||||
|
||||
# Dial-up settings
|
||||
"lock" # Lock serial port
|
||||
"115200" # Set the serial port baud rate
|
||||
"modem crtscts" # Enable hardware flow control
|
||||
"192.168.0.1:192.168.0.2" # Local and remote IP addresses
|
||||
)
|
||||
#
|
||||
# Dial-up PPP users need to specify at least one telephone number
|
||||
phone_number_ppp0=( "12345689" ) # Maximum 2 phone numbers are supported
|
||||
# They will also need a chat script - here's a good one
|
||||
chat_ppp0=(
|
||||
# 'ABORT' 'BUSY'
|
||||
# 'ABORT' 'ERROR'
|
||||
# 'ABORT' 'NO ANSWER'
|
||||
# 'ABORT' 'NO CARRIER'
|
||||
# 'ABORT' 'NO DIALTONE'
|
||||
# 'ABORT' 'Invalid Login'
|
||||
# 'ABORT' 'Login incorrect'
|
||||
# 'TIMEOUT' '5'
|
||||
# '' 'ATZ'
|
||||
# 'OK' 'AT' # Put your modem initialization string here
|
||||
# 'OK' 'ATDT\T'
|
||||
# 'TIMEOUT' '60'
|
||||
# 'CONNECT' ''
|
||||
# 'TIMEOUT' '5'
|
||||
# '~--' ''
|
||||
)
|
||||
|
||||
# If the link require extra configuration - for example wireless or
|
||||
# RFC 268 bridge - we need to depend on the bridge so they get
|
||||
# configured correctly.
|
||||
RC_NEED_ppp0="net.nas0"
|
||||
|
||||
#WARNING: if MTU of the PPP interface is less than 1500 and you use this
|
||||
#machine as a router, you should add the following rule to your firewall
|
||||
#
|
||||
#iptables -I FORWARD 1 -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu
|
||||
|
||||
#-----------------------------------------------------------------------------
|
||||
# ADSL
|
||||
# For ADSL support, emerge net-dialup/rp-pppoe
|
||||
# WARNING: This ADSL module is being deprecated in favour of the PPP module
|
||||
# above.
|
||||
# You should make the following settings and also put your
|
||||
# username/password information in /etc/ppp/pap-secrets
|
||||
|
||||
# Configure the interface to use ADSL
|
||||
config_eth0=( "adsl" )
|
||||
|
||||
# You probably won't need to edit /etc/ppp/pppoe.conf if you set this
|
||||
adsl_user_eth0="my-adsl-username"
|
||||
|
||||
#-----------------------------------------------------------------------------
|
||||
# ISDN
|
||||
# For ISDN support, emerge net-dialup/isdn4k-utils
|
||||
# You should make the following settings and also put your
|
||||
# username/password information in /etc/ppp/pap-secrets
|
||||
|
||||
# Configure the interface to use ISDN
|
||||
config_ippp0=( "dhcp" )
|
||||
# It's important to specify dhcp if you need it!
|
||||
config_ippp0=( "192.168.0.1/24" )
|
||||
# Otherwise, you can use a static IP
|
||||
|
||||
# NOTE: The interface name must be either ippp or isdn followed by a number
|
||||
|
||||
# You may need this option to set the default route
|
||||
ipppd_eth0="defaultroute"
|
||||
|
||||
#-----------------------------------------------------------------------------
|
||||
# MAC changer
|
||||
# To set a specific MAC address
|
||||
mac_eth0="00:11:22:33:44:55"
|
||||
|
||||
# For changing MAC addresses using the below, emerge net-analyzer/macchanger
|
||||
# - to randomize the last 3 bytes only
|
||||
mac_eth0="random-ending"
|
||||
# - to randomize between the same physical type of connection (e.g. fibre,
|
||||
# copper, wireless) , all vendors
|
||||
mac_eth0="random-samekind"
|
||||
# - to randomize between any physical type of connection (e.g. fibre, copper,
|
||||
# wireless) , all vendors
|
||||
mac_eth0="random-anykind"
|
||||
# - full randomization - WARNING: some MAC addresses generated by this may NOT
|
||||
# act as expected
|
||||
mac_eth0="random-full"
|
||||
# custom - passes all parameters directly to net-analyzer/macchanger
|
||||
mac_eth0="some custom set of parameters"
|
||||
|
||||
# You can also set other options based on the MAC address of your network card
|
||||
# Handy if you use different docking stations with laptops
|
||||
config_001122334455=( "dhcp" )
|
||||
|
||||
#-----------------------------------------------------------------------------
|
||||
# TUN/TAP
|
||||
# For TUN/TAP support emerge net-misc/openvpn or sys-apps/usermode-utilities
|
||||
#
|
||||
# You must specify if we're a tun or tap device. Then you can give it any
|
||||
# name you like - such as vpn
|
||||
tuntap_vpn="tun"
|
||||
config_vpn=( "192.168.0.1/24")
|
||||
|
||||
# Or stick wit the generic names - like tap0
|
||||
tuntap_tap0="tap"
|
||||
config_tap0=( "192.168.0.1/24")
|
||||
|
||||
# For passing custom options to tunctl use something like the following. This
|
||||
# example sets the owner to adm
|
||||
tunctl_tun1="-u adm"
|
||||
# When using openvpn, there are no options
|
||||
|
||||
#-----------------------------------------------------------------------------
|
||||
# Bridging (802.1d)
|
||||
# For bridging support emerge net-misc/bridge-utils
|
||||
|
||||
# To add ports to bridge br0
|
||||
bridge_br0="eth0 eth1"
|
||||
# or dynamically add them when the interface comes up
|
||||
bridge_add_eth0="br0"
|
||||
bridge_add_eth1="br0"
|
||||
|
||||
# You need to configure the ports to null values so dhcp does not get started
|
||||
config_eth0=( "null" )
|
||||
config_eth1=( "null" )
|
||||
|
||||
# Finally give the bridge an address - dhcp or a static IP
|
||||
config_br0=( "dhcp" ) # may not work when adding ports dynamically
|
||||
config_br0=( "192.168.0.1/24" )
|
||||
|
||||
# If any of the ports require extra configuration - for example wireless or
|
||||
# ppp devices - we need to depend on them like so.
|
||||
RC_NEED_br0="net.eth0 net.eth1"
|
||||
|
||||
# Below is an example of configuring the bridge
|
||||
# Consult "man brctl" for more details
|
||||
brctl_br0=( "setfd 0" "sethello 0" "stp off" )
|
||||
|
||||
#-----------------------------------------------------------------------------
|
||||
# RFC 2684 Bridge Support
|
||||
# For RFC 2684 bridge support emerge net-misc/br2684ctl
|
||||
|
||||
# Interface names have to be of the form nas0, nas1, nas2, etc.
|
||||
# You have to specify a VPI and VCI for the interface like so
|
||||
br2684ctl_nas0="-a 0.38" # UK VPI and VCI
|
||||
|
||||
# You may want to configure the encapsulation method as well by adding the -e
|
||||
# option to the command above (may need to be before the -a command)
|
||||
# -e 0 # LLC (default)
|
||||
# -e 1 # VC mux
|
||||
|
||||
# Then you can configure the interface as normal
|
||||
config_nas0=( "192.168.0.1/24" )
|
||||
|
||||
#-----------------------------------------------------------------------------
|
||||
# Tunnelling
|
||||
# WARNING: For tunnelling it is highly recommended that you
|
||||
# emerge sys-apps/iproute2
|
||||
#
|
||||
# For GRE tunnels
|
||||
iptunnel_vpn0="mode gre remote 207.170.82.1 key 0xffffffff ttl 255"
|
||||
|
||||
# For IPIP tunnels
|
||||
iptunnel_vpn0="mode ipip remote 207.170.82.2 ttl 255"
|
||||
|
||||
# To configure the interface
|
||||
config_vpn0=( "192.168.0.2 pointopoint 192.168.1.2" ) # ifconfig style
|
||||
config_vpn0=( "192.168.0.2 peer 192.168.1.1" ) # iproute2 style
|
||||
|
||||
# 6to4 Tunnels allow IPv6 to work over IPv4 addresses, provided you
|
||||
# have a non-private address configured on an interface.
|
||||
link_6to4="eth0" # Interface to base it's addresses on
|
||||
config_6to4=( "ip6to4" )
|
||||
# You may want to depend on eth0 like so
|
||||
RC_NEED_6to4="net.eth0"
|
||||
# To ensure that eth0 is configured before 6to4. Of course, the tunnel could be
|
||||
# any name and this also works for any configured interface.
|
||||
# NOTE: If you're not using iproute2 then your 6to4 tunnel has to be called
|
||||
# sit0 - otherwise use a different name like 6to4 in the example above.
|
||||
|
||||
|
||||
#-----------------------------------------------------------------------------
|
||||
# System
|
||||
# For configuring system specifics such as domain, dns, ntp and nis servers
|
||||
# It's rare that you would need todo this, but you can anyway.
|
||||
# This is most benefit to wireless users who don't use DHCP so they can change
|
||||
# their configs based on ESSID. See wireless.example for more details
|
||||
|
||||
# To use dns settings such as these, dns_servers_eth0 must be set!
|
||||
# If you omit the _eth0 suffix, then it applies to all interfaces unless
|
||||
# overridden by the interface suffix.
|
||||
dns_domain_eth0="your.domain"
|
||||
dns_servers_eth0="192.168.0.2 192.168.0.3"
|
||||
dns_search_eth0="this.domain that.domain"
|
||||
dns_options_eth0=( "timeout 1" "rotate" )
|
||||
dns_sortlist_eth0="130.155.160.0/255.255.240.0 130.155.0.0"
|
||||
# See the man page for resolv.conf for details about the options and sortlist
|
||||
# directives
|
||||
|
||||
ntp_servers_eth0="192.168.0.2 192.168.0.3"
|
||||
|
||||
nis_domain_eth0="domain"
|
||||
nis_servers_eth0="192.168.0.2 192.168.0.3"
|
||||
|
||||
# NOTE: Setting any of these will stamp on the files in question. So if you
|
||||
# don't specify dns_servers but you do specify dns_domain then no nameservers
|
||||
# will be listed in /etc/resolv.conf even if there were any there to start
|
||||
# with.
|
||||
# If this is an issue for you then maybe you should look into a resolv.conf
|
||||
# manager like resolvconf-gentoo to manage this file for you. All packages
|
||||
# that baselayout supports use resolvconf-gentoo if installed.
|
||||
|
||||
#-----------------------------------------------------------------------------
|
||||
# Cable in/out detection
|
||||
# Sometimes the cable is in, others it's out. Obviously you don't want to
|
||||
# restart net.eth0 every time when you plug it in either.
|
||||
#
|
||||
# netplug is a package that detects this and requires no extra configuration
|
||||
# on your part.
|
||||
# emerge sys-apps/netplug
|
||||
# or
|
||||
# emerge sys-apps/ifplugd
|
||||
# and you're done :)
|
||||
|
||||
# By default we don't wait for netplug/ifplugd to configure the interface.
|
||||
# If you would like it to wait so that other services now that network is up
|
||||
# then you can specify a timeout here.
|
||||
plug_timeout="10"
|
||||
# A value of 0 means wait forever.
|
||||
|
||||
# If you don't want to use netplug on a specific interface but you have it
|
||||
# installed, you can disable it for that interface via the modules statement
|
||||
modules_eth0=( "!netplug" )
|
||||
# You can do the same for ifplugd
|
||||
#
|
||||
# You can disable them both with the generic plug
|
||||
modules_eth0=( "!plug" )
|
||||
|
||||
# To use specific ifplugd options, fex specifying wireless mode
|
||||
ifplugd_eth0="--api-mode=wlan"
|
||||
# man ifplugd for more options
|
||||
|
||||
##############################################################################
|
||||
# ADVANCED CONFIGURATION
|
||||
#
|
||||
# Four functions can be defined which will be called surrounding the
|
||||
# start/stop operations. The functions are called with the interface
|
||||
# name first so that one function can control multiple adapters. An extra two
|
||||
# functions can be defined when an interface fails to start or stop.
|
||||
#
|
||||
# The return values for the preup and predown functions should be 0
|
||||
# (success) to indicate that configuration or deconfiguration of the
|
||||
# interface can continue. If preup returns a non-zero value, then
|
||||
# interface configuration will be aborted. If predown returns a
|
||||
# non-zero value, then the interface will not be allowed to continue
|
||||
# deconfiguration.
|
||||
#
|
||||
# The return values for the postup, postdown, failup and faildown functions are
|
||||
# ignored since there's nothing to do if they indicate failure.
|
||||
#
|
||||
# ${IFACE} is set to the interface being brought up/down
|
||||
# ${IFVAR} is ${IFACE} converted to variable name bash allows
|
||||
|
||||
#preup() {
|
||||
# # Test for link on the interface prior to bringing it up. This
|
||||
# # only works on some network adapters and requires the mii-diag
|
||||
# # package to be installed.
|
||||
# if mii-tool "${IFACE}" 2> /dev/null | grep -q 'no link'; then
|
||||
# ewarn "No link on ${IFACE}, aborting configuration"
|
||||
# return 1
|
||||
# fi
|
||||
#
|
||||
# # Test for link on the interface prior to bringing it up. This
|
||||
# # only works on some network adapters and requires the ethtool
|
||||
# # package to be installed.
|
||||
# if ethtool "${IFACE}" | grep -q 'Link detected: no'; then
|
||||
# ewarn "No link on ${IFACE}, aborting configuration"
|
||||
# return 1
|
||||
# fi
|
||||
#
|
||||
#
|
||||
# # Remember to return 0 on success
|
||||
# return 0
|
||||
#}
|
||||
|
||||
#predown() {
|
||||
# # The default in the script is to test for NFS root and disallow
|
||||
# # downing interfaces in that case. Note that if you specify a
|
||||
# # predown() function you will override that logic. Here it is, in
|
||||
# # case you still want it...
|
||||
# if is_net_fs /; then
|
||||
# eerror "root filesystem is network mounted -- can't stop ${IFACE}"
|
||||
# return 1
|
||||
# fi
|
||||
#
|
||||
# # Remember to return 0 on success
|
||||
# return 0
|
||||
#}
|
||||
|
||||
#postup() {
|
||||
# # This function could be used, for example, to register with a
|
||||
# # dynamic DNS service. Another possibility would be to
|
||||
# # send/receive mail once the interface is brought up.
|
||||
|
||||
# # Here is an example that allows the use of iproute rules
|
||||
# # which have been configured using the rules_eth0 variable.
|
||||
# #rules_eth0=(
|
||||
# # "from 24.80.102.112/32 to 192.168.1.0/24 table localnet priority 100"
|
||||
# # "from 216.113.223.51/32 to 192.168.1.0/24 table localnet priority 100"
|
||||
# #)
|
||||
# local x="rules_${IFVAR}[@]"
|
||||
# local -a rules=( "${!x}" )
|
||||
# if [[ -n ${rules} ]] ; then
|
||||
# einfo "Adding IP policy routing rules"
|
||||
# eindent
|
||||
# # Ensure that the kernel supports policy routing
|
||||
# if ! ip rule list | grep -q "^" ; then
|
||||
# eerror "You need to enable IP Policy Routing (CONFIG_IP_MULTIPLE_TABLES)"
|
||||
# eerror "in your kernel to use ip rules"
|
||||
# else
|
||||
# for x in "${rules[@]}" ; do
|
||||
# ebegin "${x}"
|
||||
# ip rule add ${x} dev "${IFACE}"
|
||||
# eend $?
|
||||
# done
|
||||
# fi
|
||||
# eoutdent
|
||||
# # Flush the cache
|
||||
# ip route flush cache dev "${IFACE}"
|
||||
# fi
|
||||
|
||||
#}
|
||||
|
||||
#postdown() {
|
||||
# # Enable Wake-On-LAN for every interface except for lo
|
||||
# # Probably a good idea to set RC_DOWN_INTERFACE="no" in /etc/conf.d/rc
|
||||
# # as well ;)
|
||||
# [[ ${IFACE} != "lo" ]] && ethtool -s "${IFACE}" wol g
|
||||
|
||||
# Automatically erase any ip rules created in the example postup above
|
||||
# if interface_exists "${IFACE}" ; then
|
||||
# # Remove any rules for this interface
|
||||
# local rule
|
||||
# ip rule list | grep " iif ${IFACE}[ ]*" | {
|
||||
# while read rule ; do
|
||||
# rule="${rule#*:}"
|
||||
# ip rule del ${rule}
|
||||
# done
|
||||
# }
|
||||
# # Flush the route cache
|
||||
# ip route flush cache dev "${IFACE}"
|
||||
# fi
|
||||
|
||||
# # Return 0 always
|
||||
# return 0
|
||||
#}
|
||||
|
||||
#failup() {
|
||||
# # This function is mostly here for completeness... I haven't
|
||||
# # thought of anything nifty to do with it yet ;-)
|
||||
#}
|
||||
|
||||
#faildown() {
|
||||
# # This function is mostly here for completeness... I haven't
|
||||
# # thought of anything nifty to do with it yet ;-)
|
||||
#}
|
||||
|
||||
##############################################################################
|
||||
# FORCING MODULES
|
||||
# The Big Fat Warning :- If you use module forcing do not complain to us or
|
||||
# file bugs about it not working!
|
||||
#
|
||||
# Loading modules is a slow affair - we have to check each one for the following
|
||||
# 1) Code sanity
|
||||
# 2) Has the required package been emerged?
|
||||
# 3) Has it modified anything?
|
||||
# 4) Have all the dependant modules been loaded?
|
||||
|
||||
# Then we have to strip out the conflicting modules based on user preference
|
||||
# and default configuration and sort them into the correct order.
|
||||
# Finally we check the end result for dependencies.
|
||||
|
||||
# This, of course, takes valuable CPU time so we provide module forcing as a
|
||||
# means to speed things up. We still do *some* checking but not much.
|
||||
|
||||
# It is essential that you force modules in the correct order and supply all
|
||||
# the modules you need. You must always supply an interface module - we
|
||||
# supply ifconfig or iproute2.
|
||||
|
||||
# The Big Fat Warning :- If you use module forcing do not complain to us or
|
||||
# file bugs about it not working!
|
||||
|
||||
# Now that we've warned you twice, here's how to do it
|
||||
modules_force=( "ifconfig" )
|
||||
modules_force=( "iproute2" "dhcpcd" )
|
||||
|
||||
# We can also apply this to a specific interface
|
||||
modules_force_eth1=( "iproute2" )
|
||||
|
||||
# The below will not work
|
||||
modules_force=( "dhcpcd" )
|
||||
# No interface (ifconfig/iproute2)
|
||||
modules_force=( "ifconfig" "essidnet" "iwconfig" )
|
||||
# Although it will not crash, essidnet will not work as it has to come after
|
||||
# iwconfig
|
||||
modules_force=( "iproute2" "ifconfig" )
|
||||
# The interface will be setup twice which will cause problems
|
||||
|
|
@ -1,5 +0,0 @@
|
|||
[main]
|
||||
plugins=ifnet,keyfile
|
||||
|
||||
[ifnet]
|
||||
managed=false
|
||||
|
|
@ -1,396 +0,0 @@
|
|||
/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */
|
||||
/* NetworkManager system settings service (ifnet)
|
||||
*
|
||||
* Mu Qiao <qiaomuf@gmail.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program 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 General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Copyright (C) 1999-2010 Gentoo Foundation, Inc.
|
||||
*/
|
||||
|
||||
#include "nm-default.h"
|
||||
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <arpa/inet.h>
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include "nm-utils.h"
|
||||
|
||||
#include "platform/nm-linux-platform.h"
|
||||
#include "dhcp/nm-dhcp-manager.h"
|
||||
|
||||
#include "settings/plugins/ifnet/nms-ifnet-net-parser.h"
|
||||
#include "settings/plugins/ifnet/nms-ifnet-net-utils.h"
|
||||
#include "settings/plugins/ifnet/nms-ifnet-wpa-parser.h"
|
||||
#include "settings/plugins/ifnet/nms-ifnet-connection-parser.h"
|
||||
|
||||
#include "nm-test-utils-core.h"
|
||||
|
||||
/* Fake config handling; the values it returns don't matter, so this
|
||||
* is easier than forcing it to read our own config file, etc.
|
||||
*/
|
||||
NMDhcpManager *
|
||||
nm_dhcp_manager_get (void)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
const char *
|
||||
nm_dhcp_manager_get_config (NMDhcpManager *dhcp_manager)
|
||||
{
|
||||
return "dhclient";
|
||||
}
|
||||
|
||||
static void
|
||||
test_getdata (void)
|
||||
{
|
||||
g_assert (ifnet_get_data ("eth1", "config") &&
|
||||
strcmp (ifnet_get_data ("eth1", "config"), "( \"dhcp\" )") == 0);
|
||||
g_assert (ifnet_get_data ("ppp0", "username") &&
|
||||
strcmp (ifnet_get_data ("ppp0", "username"), "user") == 0);
|
||||
g_assert (ifnet_get_data ("ppp0", "password") &&
|
||||
strcmp (ifnet_get_data ("ppp0", "password"), "password") == 0);
|
||||
g_assert (ifnet_get_global_data ("modules") &&
|
||||
strcmp ("!wpa_supplicant", ifnet_get_global_data ("modules")) == 0);
|
||||
}
|
||||
|
||||
static void
|
||||
test_is_static (void)
|
||||
{
|
||||
g_assert (!is_static_ip4 ("eth1"));
|
||||
g_assert (is_static_ip4 ("eth0"));
|
||||
g_assert (!is_static_ip6 ("eth0"));
|
||||
}
|
||||
|
||||
static void
|
||||
test_has_default_route (void)
|
||||
{
|
||||
g_assert (has_default_ip4_route ("eth0"));
|
||||
g_assert (has_default_ip6_route ("eth4"));
|
||||
g_assert (!has_default_ip4_route ("eth5") &&
|
||||
!has_default_ip6_route ("eth5"));
|
||||
}
|
||||
|
||||
static void
|
||||
test_has_ip6_address (void)
|
||||
{
|
||||
g_assert (has_ip6_address ("eth2"));
|
||||
g_assert (!has_ip6_address ("eth0"));
|
||||
}
|
||||
|
||||
static void
|
||||
test_is_ip4_address (void)
|
||||
{
|
||||
gchar *address1 = "192.168.4.232/24";
|
||||
gchar *address2 = "192.168.100.{1..254}/24";
|
||||
gchar *address3 = "192.168.4.2555/24";
|
||||
|
||||
g_assert (is_ip4_address (address1));
|
||||
g_assert (is_ip4_address (address2));
|
||||
g_assert (!is_ip4_address (address3));
|
||||
}
|
||||
|
||||
static void
|
||||
test_is_ip6_address (void)
|
||||
{
|
||||
gchar *address1 = "4321:0:1:2:3:4:567:89ac/24";
|
||||
|
||||
g_assert (is_ip6_address (address1));
|
||||
}
|
||||
|
||||
static void
|
||||
check_ip_block (ip_block * iblock, gchar * ip, guint32 prefix, gchar * gateway)
|
||||
{
|
||||
g_assert_cmpstr (ip, ==, iblock->ip);
|
||||
g_assert (prefix == iblock->prefix);
|
||||
g_assert_cmpstr (gateway, ==, iblock->next_hop);
|
||||
}
|
||||
|
||||
static void
|
||||
test_convert_ipv4_config_block (void)
|
||||
{
|
||||
ip_block *iblock = convert_ip4_config_block ("eth0");
|
||||
ip_block *tmp = iblock;
|
||||
|
||||
g_assert (iblock != NULL);
|
||||
check_ip_block (iblock, "202.117.16.121", 24, "202.117.16.1");
|
||||
iblock = iblock->next;
|
||||
destroy_ip_block (tmp);
|
||||
g_assert (iblock != NULL);
|
||||
check_ip_block (iblock, "192.168.4.121", 24, "202.117.16.1");
|
||||
destroy_ip_block (iblock);
|
||||
|
||||
g_test_expect_message ("NetworkManager", G_LOG_LEVEL_MESSAGE,
|
||||
"*Can't handle IPv4 address*202.117.16.1211*");
|
||||
iblock = convert_ip4_config_block ("eth2");
|
||||
g_test_assert_expected_messages ();
|
||||
g_assert (iblock != NULL && iblock->next == NULL);
|
||||
check_ip_block (iblock, "192.168.4.121", 24, NULL);
|
||||
destroy_ip_block (iblock);
|
||||
|
||||
g_test_expect_message ("NetworkManager", G_LOG_LEVEL_MESSAGE,
|
||||
"*missing netmask or prefix*");
|
||||
iblock = convert_ip4_config_block ("eth3");
|
||||
g_assert (iblock == NULL);
|
||||
}
|
||||
|
||||
static void
|
||||
test_convert_ipv4_routes_block (void)
|
||||
{
|
||||
ip_block *iblock = convert_ip4_routes_block ("eth0");
|
||||
ip_block *tmp = iblock;
|
||||
|
||||
g_assert (iblock != NULL);
|
||||
check_ip_block (iblock, "192.168.4.0", 24, "192.168.4.1");
|
||||
iblock = iblock->next;
|
||||
destroy_ip_block (tmp);
|
||||
g_assert (iblock == NULL);
|
||||
|
||||
iblock = convert_ip4_routes_block ("eth9");
|
||||
tmp = iblock;
|
||||
|
||||
g_assert (iblock != NULL);
|
||||
check_ip_block (iblock, "10.0.0.0", 8, "192.168.0.1");
|
||||
iblock = iblock->next;
|
||||
destroy_ip_block (tmp);
|
||||
g_assert (iblock == NULL);
|
||||
}
|
||||
|
||||
static void
|
||||
test_wpa_parser (void)
|
||||
{
|
||||
const char *value;
|
||||
|
||||
g_assert (exist_ssid ("example"));
|
||||
|
||||
g_assert (exist_ssid ("static-wep-test"));
|
||||
value = wpa_get_value ("static-wep-test", "key_mgmt");
|
||||
g_assert_cmpstr (value, ==, "NONE");
|
||||
value = wpa_get_value ("static-wep-test", "wep_key0");
|
||||
g_assert_cmpstr (value, ==, "\"abcde\"");
|
||||
|
||||
g_assert (exist_ssid ("leap-example"));
|
||||
|
||||
value = wpa_get_value ("test-with-hash-in-psk", "psk");
|
||||
g_assert_cmpstr (value, ==, "\"xjtudlc3731###asdfasdfasdf\"");
|
||||
}
|
||||
|
||||
static void
|
||||
test_strip_string (void)
|
||||
{
|
||||
gchar *str = "( \"default via 202.117.16.1\" )";
|
||||
gchar *result = g_strdup (str);
|
||||
gchar *result_b = result;
|
||||
|
||||
result = strip_string (result, '(');
|
||||
result = strip_string (result, ')');
|
||||
result = strip_string (result, '"');
|
||||
g_assert_cmpstr (result, ==, "default via 202.117.16.1");
|
||||
g_free (result_b);
|
||||
}
|
||||
|
||||
static void
|
||||
test_is_unmanaged (void)
|
||||
{
|
||||
g_assert (is_managed ("eth0"));
|
||||
g_assert (!is_managed ("eth4"));
|
||||
}
|
||||
|
||||
static void
|
||||
test_new_connection (void)
|
||||
{
|
||||
GError *error = NULL;
|
||||
NMConnection *connection;
|
||||
|
||||
g_test_expect_message ("NetworkManager", G_LOG_LEVEL_MESSAGE,
|
||||
"*Can't handle IPv4 address*202.117.16.1211*");
|
||||
g_test_expect_message ("NetworkManager", G_LOG_LEVEL_MESSAGE,
|
||||
"*Can't handle IPv6 address*202.117.16.1211*");
|
||||
connection = ifnet_update_connection_from_config_block ("eth2", NULL, &error);
|
||||
g_test_assert_expected_messages ();
|
||||
g_assert (connection != NULL);
|
||||
g_object_unref (connection);
|
||||
|
||||
connection = ifnet_update_connection_from_config_block ("qiaomuf", NULL, &error);
|
||||
g_assert (connection != NULL);
|
||||
g_object_unref (connection);
|
||||
|
||||
connection = ifnet_update_connection_from_config_block ("myxjtu2", NULL, &error);
|
||||
g_assert (connection != NULL);
|
||||
g_object_unref (connection);
|
||||
|
||||
connection = ifnet_update_connection_from_config_block ("eth9", NULL, &error);
|
||||
g_assert (connection != NULL);
|
||||
g_object_unref (connection);
|
||||
|
||||
connection = ifnet_update_connection_from_config_block ("eth10", NULL, &error);
|
||||
g_assert (connection != NULL);
|
||||
g_object_unref (connection);
|
||||
}
|
||||
|
||||
static void
|
||||
kill_backup (char **path)
|
||||
{
|
||||
if (*path) {
|
||||
unlink (*path);
|
||||
g_free (*path);
|
||||
*path = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
#define NET_GEN_NAME "net.generate"
|
||||
#define SUP_GEN_NAME "wpa_supplicant.conf.generate"
|
||||
|
||||
static void
|
||||
test_update_connection (void)
|
||||
{
|
||||
GError *error = NULL;
|
||||
NMConnection *connection;
|
||||
gboolean success;
|
||||
char *backup = NULL;
|
||||
char *basepath = TEST_IFNET_DIR;
|
||||
|
||||
connection = ifnet_update_connection_from_config_block ("eth0", basepath, &error);
|
||||
g_assert (connection != NULL);
|
||||
|
||||
success = ifnet_update_parsers_by_connection (connection, "eth0",
|
||||
NET_GEN_NAME,
|
||||
SUP_GEN_NAME,
|
||||
NULL,
|
||||
&backup,
|
||||
&error);
|
||||
kill_backup (&backup);
|
||||
g_assert (success);
|
||||
g_object_unref (connection);
|
||||
|
||||
connection = ifnet_update_connection_from_config_block ("0xab3ace", basepath, &error);
|
||||
g_assert (connection != NULL);
|
||||
|
||||
success = ifnet_update_parsers_by_connection (connection, "0xab3ace",
|
||||
NET_GEN_NAME,
|
||||
SUP_GEN_NAME,
|
||||
NULL,
|
||||
&backup,
|
||||
&error);
|
||||
kill_backup (&backup);
|
||||
g_assert (success);
|
||||
g_object_unref (connection);
|
||||
|
||||
unlink (NET_GEN_NAME);
|
||||
unlink (SUP_GEN_NAME);
|
||||
}
|
||||
|
||||
static void
|
||||
test_add_connection (void)
|
||||
{
|
||||
NMConnection *connection;
|
||||
char *backup = NULL;
|
||||
const char *basepath = TEST_IFNET_DIR;
|
||||
|
||||
connection = ifnet_update_connection_from_config_block ("eth0", basepath, NULL);
|
||||
g_assert (ifnet_add_new_connection (connection, NET_GEN_NAME, SUP_GEN_NAME, NULL, &backup, NULL));
|
||||
kill_backup (&backup);
|
||||
g_object_unref (connection);
|
||||
|
||||
g_test_expect_message ("NetworkManager", G_LOG_LEVEL_MESSAGE,
|
||||
"*Can't handle ipv4 address: brd, missing netmask or prefix*");
|
||||
g_test_expect_message ("NetworkManager", G_LOG_LEVEL_MESSAGE,
|
||||
"*Can't handle ipv4 address: 202.117.16.255, missing netmask or prefix*");
|
||||
connection = ifnet_update_connection_from_config_block ("myxjtu2", basepath, NULL);
|
||||
g_test_assert_expected_messages ();
|
||||
g_assert (ifnet_add_new_connection (connection, NET_GEN_NAME, SUP_GEN_NAME, NULL, &backup, NULL));
|
||||
kill_backup (&backup);
|
||||
g_object_unref (connection);
|
||||
|
||||
unlink (NET_GEN_NAME);
|
||||
unlink (SUP_GEN_NAME);
|
||||
}
|
||||
|
||||
static void
|
||||
test_delete_connection (void)
|
||||
{
|
||||
GError *error = NULL;
|
||||
NMConnection *connection;
|
||||
char *backup = NULL;
|
||||
|
||||
connection = ifnet_update_connection_from_config_block ("eth7", NULL, &error);
|
||||
g_assert (connection != NULL);
|
||||
g_assert (ifnet_delete_connection_in_parsers ("eth7", NET_GEN_NAME, SUP_GEN_NAME, &backup));
|
||||
kill_backup (&backup);
|
||||
g_object_unref (connection);
|
||||
|
||||
connection = ifnet_update_connection_from_config_block ("qiaomuf", NULL, &error);
|
||||
g_assert (connection != NULL);
|
||||
g_assert (ifnet_delete_connection_in_parsers ("qiaomuf", NET_GEN_NAME, SUP_GEN_NAME, &backup));
|
||||
kill_backup (&backup);
|
||||
g_object_unref (connection);
|
||||
|
||||
unlink (NET_GEN_NAME);
|
||||
unlink (SUP_GEN_NAME);
|
||||
}
|
||||
|
||||
static void
|
||||
test_missing_config (void)
|
||||
{
|
||||
gs_free_error GError *error = NULL;
|
||||
NMConnection *connection;
|
||||
|
||||
connection = ifnet_update_connection_from_config_block ("eth8", NULL, &error);
|
||||
g_assert_error (error, NM_SETTINGS_ERROR, NM_SETTINGS_ERROR_INVALID_CONNECTION);
|
||||
g_assert (connection == NULL && error != NULL);
|
||||
}
|
||||
|
||||
NMTST_DEFINE ();
|
||||
|
||||
#define TPATH "/settings/plugins/ifnet/"
|
||||
|
||||
int
|
||||
main (int argc, char **argv)
|
||||
{
|
||||
int ret;
|
||||
|
||||
nm_linux_platform_setup ();
|
||||
|
||||
nmtst_init_assert_logging (&argc, &argv, "WARN", "DEFAULT");
|
||||
|
||||
ifnet_init (TEST_IFNET_DIR "/net");
|
||||
wpa_parser_init (TEST_IFNET_DIR "/wpa_supplicant.conf");
|
||||
|
||||
g_test_add_func (TPATH "strip-string", test_strip_string);
|
||||
g_test_add_func (TPATH "is-static", test_is_static);
|
||||
g_test_add_func (TPATH "has-ip6-address", test_has_ip6_address);
|
||||
g_test_add_func (TPATH "has-default-route", test_has_default_route);
|
||||
g_test_add_func (TPATH "get-data", test_getdata);
|
||||
g_test_add_func (TPATH "is-ip4-address", test_is_ip4_address);
|
||||
g_test_add_func (TPATH "is-ip6-address", test_is_ip6_address);
|
||||
g_test_add_func (TPATH "convert-ip4-config", test_convert_ipv4_config_block);
|
||||
g_test_add_func (TPATH "convert-ip4-routes", test_convert_ipv4_routes_block);
|
||||
g_test_add_func (TPATH "is-unmanaged", test_is_unmanaged);
|
||||
g_test_add_func (TPATH "wpa-parser", test_wpa_parser);
|
||||
g_test_add_func (TPATH "new-connection", test_new_connection);
|
||||
g_test_add_func (TPATH "update-connection", test_update_connection);
|
||||
g_test_add_func (TPATH "add-connection", test_add_connection);
|
||||
g_test_add_func (TPATH "delete-connection", test_delete_connection);
|
||||
g_test_add_func (TPATH "missing-config", test_missing_config);
|
||||
|
||||
ret = g_test_run ();
|
||||
|
||||
ifnet_destroy ();
|
||||
wpa_parser_destroy ();
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
|
@ -1,27 +0,0 @@
|
|||
-----BEGIN CERTIFICATE-----
|
||||
MIIEjzCCA3egAwIBAgIJAOvnZPt59yIZMA0GCSqGSIb3DQEBBQUAMIGLMQswCQYD
|
||||
VQQGEwJVUzESMBAGA1UECBMJQmVya3NoaXJlMRAwDgYDVQQHEwdOZXdidXJ5MRcw
|
||||
FQYDVQQKEw5NeSBDb21wYW55IEx0ZDEQMA4GA1UECxMHVGVzdGluZzENMAsGA1UE
|
||||
AxMEdGVzdDEcMBoGCSqGSIb3DQEJARYNdGVzdEB0ZXN0LmNvbTAeFw0wOTAzMTAx
|
||||
NTEyMTRaFw0xOTAzMDgxNTEyMTRaMIGLMQswCQYDVQQGEwJVUzESMBAGA1UECBMJ
|
||||
QmVya3NoaXJlMRAwDgYDVQQHEwdOZXdidXJ5MRcwFQYDVQQKEw5NeSBDb21wYW55
|
||||
IEx0ZDEQMA4GA1UECxMHVGVzdGluZzENMAsGA1UEAxMEdGVzdDEcMBoGCSqGSIb3
|
||||
DQEJARYNdGVzdEB0ZXN0LmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
|
||||
ggEBAKot9j+/+CX1/gZLgJHIXCRgCItKLGnf7qGbgqB9T2ACBqR0jllKWwDKrcWU
|
||||
xjXNIc+GF9Wnv+lX6G0Okn4Zt3/uRNobL+2b/yOF7M3Td3/9W873zdkQQX930YZc
|
||||
Rr8uxdRPP5bxiCgtcw632y21sSEbG9mjccAUnV/0jdvfmMNj0i8gN6E0fMBiJ9S3
|
||||
FkxX/KFvt9JWE9CtoyL7ki7UIDq+6vj7Gd5N0B3dOa1y+rRHZzKlJPcSXQSEYUS4
|
||||
HmKDwiKSVahft8c4tDn7KPi0vex91hlgZVd3usL2E/Vq7o5D9FAZ5kZY0AdFXwdm
|
||||
J4lO4Mj7ac7GE4vNERNcXVIX59sCAwEAAaOB8zCB8DAdBgNVHQ4EFgQUuDU3Mr7P
|
||||
T3n1e3Sy8hBauoDFahAwgcAGA1UdIwSBuDCBtYAUuDU3Mr7PT3n1e3Sy8hBauoDF
|
||||
ahChgZGkgY4wgYsxCzAJBgNVBAYTAlVTMRIwEAYDVQQIEwlCZXJrc2hpcmUxEDAO
|
||||
BgNVBAcTB05ld2J1cnkxFzAVBgNVBAoTDk15IENvbXBhbnkgTHRkMRAwDgYDVQQL
|
||||
EwdUZXN0aW5nMQ0wCwYDVQQDEwR0ZXN0MRwwGgYJKoZIhvcNAQkBFg10ZXN0QHRl
|
||||
c3QuY29tggkA6+dk+3n3IhkwDAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQUFAAOC
|
||||
AQEAVRG4aALIvCXCiKfe7K+iJxjBVRDFPEf7JWA9LGgbFOn6pNvbxonrR+0BETdc
|
||||
JV1ET4ct2xsE7QNFIkp9GKRC+6J32zCo8qtLCD5+v436r8TUG2/t2JRMkb9I2XVT
|
||||
p7RJoot6M0Ltf8KNQUPYh756xmKZ4USfQUwc58MOSDGY8VWEXJOYij9Pf0e0c52t
|
||||
qiCEjXH7uXiS8Pgq9TYm7AkWSOrglYhSa83x0f8mtT8Q15nBESIHZ6o8FAS2bBgn
|
||||
B0BkrKRjtBUkuJG3vTox+bYINh2Gxi1JZHWSV1tN5z3hd4VFcKqanW5OgQwToBqp
|
||||
3nniskIjbH0xjgZf/nVMyLnjxg==
|
||||
-----END CERTIFICATE-----
|
||||
|
|
@ -1,70 +0,0 @@
|
|||
# Only WPA-PSK is used. Any valid cipher combination is accepted.
|
||||
network={
|
||||
ssid="example"
|
||||
proto=WPA
|
||||
key_mgmt=WPA-PSK
|
||||
pairwise=CCMP TKIP
|
||||
group=CCMP TKIP WEP104 WEP40
|
||||
psk=06b4be19da289f475aa46a33cb793029d4ab3db7a23ee92382eb0106c72ac7bb
|
||||
priority=2
|
||||
}
|
||||
|
||||
# LEAP with dynamic WEP keys
|
||||
network={
|
||||
ssid="leap-example"
|
||||
key_mgmt=IEEE8021X
|
||||
eap=LEAP
|
||||
identity="user"
|
||||
password="foobar"
|
||||
}
|
||||
|
||||
# Shared WEP key connection (no WPA, no IEEE 802.1X)
|
||||
network={
|
||||
ssid="static-wep-test"
|
||||
key_mgmt=NONE
|
||||
wep_key0="abcde"
|
||||
wep_key1=0102030405
|
||||
wep_key2="1234567890123"
|
||||
wep_tx_keyidx=0
|
||||
priority=5
|
||||
}
|
||||
|
||||
# Wildcard match for SSID (plaintext APs only). This example select any
|
||||
# open AP regardless of its SSID.
|
||||
network={
|
||||
key_mgmt=NONE
|
||||
}
|
||||
|
||||
network={
|
||||
ssid="myxjtu2"
|
||||
scan_ssid=1
|
||||
key_mgmt=WPA-PSK
|
||||
psk="xjtudlc3731"
|
||||
disabled=0
|
||||
key_mgmt=NONE
|
||||
wep_key0="12345"
|
||||
wep_key1=1234567890
|
||||
wep_key2="zxcvb"
|
||||
wep_tx_keyidx=1
|
||||
auth_alg=OPEN
|
||||
mode=1
|
||||
}
|
||||
|
||||
network={
|
||||
ssid=ab3ace
|
||||
key_mgmt=WPA-EAP
|
||||
eap=TTLS
|
||||
identity="user@example.com"
|
||||
anonymous_identity="anonymous@example.com"
|
||||
password="foobar"
|
||||
ca_cert="test_ca_cert.pem"
|
||||
phase2="auth=CHAP"
|
||||
priority=20
|
||||
}
|
||||
|
||||
network={
|
||||
ssid="test-with-hash-in-psk"
|
||||
key_mgmt=WPA-PSK
|
||||
psk="xjtudlc3731###asdfasdfasdf"
|
||||
}
|
||||
|
||||
|
|
@ -10,10 +10,6 @@ if enable_ifupdown
|
|||
subdir('ifupdown')
|
||||
endif
|
||||
|
||||
if enable_ifnet
|
||||
subdir('ifnet')
|
||||
endif
|
||||
|
||||
if enable_config_plugin_ibft
|
||||
subdir('ibft')
|
||||
endif
|
||||
|
|
|
|||
|
|
@ -19,7 +19,7 @@ die() {
|
|||
_build() {
|
||||
git clean -fdx
|
||||
./autogen.sh --enable-ld-gc --enable-ifcfg-rh --enable-ifupdown \
|
||||
--enable-ifnet --enable-ibft --enable-teamdctl --enable-wifi \
|
||||
--enable-ibft --enable-teamdctl --enable-wifi \
|
||||
--with-modem-manager-1 --with-ofono --with-more-asserts \
|
||||
--with-more-logging
|
||||
make -j20
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue