Commit graph

876 commits

Author SHA1 Message Date
Thomas Haller
3be5e2908c settings: close module if loading of plugins fails 2015-06-17 17:46:54 +02:00
Thomas Haller
e700211f00 settings/example: remove 'example' settings plugin
The 'example' settings plugin is (obviously) unused, but it is also
badly maintained and no longer best-practice in several ways:

  - it directly reads "NetworkManager.conf" instead of using NMConfig.
  - it parses device specs itself, instead of using
    nm_match_spec_split().
  - read_connections() doesn't ensure that loading a file
    does not replace a previously loaded one (due to conflicting
    UUID). In general the example doesn't show/handle the complexity
    of potential UUID conflicts.

Instead of fixing these issues it is better to ensure our main plugin
('keyfile') corresponds to current best practices. Should we ever add a
new pluginww, 'keyfile' should be the example.
2015-06-12 15:59:40 +02:00
Thomas Haller
b16f31af45 keyfile: refactor reading "keyfile.unmanaged-devices" setting
Instead of parsing "/etc/NM/NetworkManager.conf" in keyfile plugin itself,
use NMConfig. Parsing it outside of NMConfig API has the significant disadvantage
of not considering files under "conf.d/".

This also has a behavioral change: keyfile no longer monitors
"NetworkManager.conf" file for changes, but instead only reacts
on explict "config-changed" signals from NMConfig.

This previous behavior of picking up file changes without
user-interaction is anyway not what we want. NM should not react
on mere file changes, but only on explicit reload commands. And
even if we want to support it, file watching should be implemented
properly inside NMConfig, watching *all* relevant files.

This was the last out-of-api access to the configuration after
refactoring NMConfig. Now that keyfile plugin no longer writes
the hostname, we can get rid of this.
2015-06-12 15:59:40 +02:00
Thomas Haller
bffe507cda keyfile: refactor dispose() of SCPluginKeyfile 2015-06-12 15:59:39 +02:00
Beniamino Galvani
4739ff6e7c settings: remove ifcfg-suse plugin
After the hostname functionality has been moved from plugins to core,
the ifcfg-suse plugin contains only boilerplate code with no actual
functionality.

Remove the plugin, mark it as deprecated in manual page and print a
warning when it is selected in configuration file.
2015-06-12 15:59:39 +02:00
Beniamino Galvani
6dc35e66d4 settings: add hostnamed support
When the systemd-hostnamed daemon is available, use it to read and
change the hostname.

Based on 'danw/wip/hostnamed' branch by Dan Winship <danw@redhat.com>
2015-06-12 15:59:39 +02:00
Beniamino Galvani
92a426be17 settings: factor out monitor initialization from nm_settings_new() 2015-06-12 15:59:39 +02:00
Beniamino Galvani
d385a2a57a settings: remove hostname handling from plugins
Remove all hostname-related code from plugins since this functionality
has been moved to the core.
2015-06-12 15:59:39 +02:00
Beniamino Galvani
6c3d71c431 core: move handling of hostname from plugins to core
How to write and read the machine hostname is something that has been
handled until now by plugins; this is questionable since the method
using for storing the hostname should depend only on the distro used
and not on which plugins are enabled.

This commit moves all hostname-related functions from plugins to the
core and allows to specify the method used to load and store the
hostname at build time with the

  --with-hostname-persist=default|suse|gentoo

configure option.

'default' method stores the hostname to /etc/hostname and monitors it
to detect runtime changes.

When the selected method is 'suse', the hostname gets read from and
written to /etc/HOSTNAME; the file /etc/sysconfig/network/dhcp is also
read to detect if the hostname is dynamic and thus invalid. Both files
are monitored for changes.

'gentoo' method relies on /etc/conf.d/hostname for storing the
hostname.
2015-06-12 15:59:39 +02:00
Beniamino Galvani
7e5e624daf ifcfg-rh: add support for CONNECTION_METERED 2015-06-09 18:18:45 +02:00
Beniamino Galvani
862fd91df0 ifcfg-rh: change type of svTrueValue() return value and argument
Change type of return value and 'def' argument of svTrueValue() to
gint to make clear that it can be something different from TRUE and
FALSE.
2015-06-09 18:18:45 +02:00
Thomas Haller
51b1fd976f ifcfg-rh: distinguish in reader and writer between unset and empty dns-options 2015-06-05 12:26:48 +02:00
Thomas Haller
a8dd1b5358 libnm: make dns-options support an "undefined" default value
We want to distinguish between "no-options/empty" and "unset/default".
The latter can be interpreted by NM to use a default set of options.
2015-06-05 12:26:48 +02:00
Thomas Haller
0348bc9195 ifcfg-rh: add svSetValueFull() to support writing empty values
svSetValue() treated the empty word like %NULL.
Handle empty differently from unset.
2015-06-05 12:26:48 +02:00
Thomas Haller
51255d8b64 ifcfg-rh: fix svSetValue() to properly handle empty variables
svSetValue() called svGetValue() which would return %NULL
for empty variables. That is wrong, because it caused svSetValue()
to add the variable anew.
2015-06-05 12:26:48 +02:00
Thomas Haller
c6efbeccf3 ifcfg-rh: use svGetValueFull() in svGetValueInt64()
Previously, it would silently accept a value set to "empty".
This is however not a valid number and we should raise a
warning just like for any other invalid number.
2015-06-05 12:26:48 +02:00
Thomas Haller
33aaa730c5 ifcfg-rh: add svGetValueFull() function 2015-06-05 12:26:48 +02:00
Thomas Haller
32871deecc ifcfg-rh: refactor svSetValue() and svEscape() not to clone string needlessly
In the most cases we don't expect that our values need
escaping. No need to do an additional copy of the unmodified
string.
2015-06-05 12:26:48 +02:00
Thomas Haller
0aed4e2388 ifcfg-rh: better detect alias files
Alias files have a ':' to separate the base name from their
alias. But we didn't always ensure not to write-out files without
colon, and also initscripts doesn't have that restriction.

We should detect alias files and handle them properly (e.g. by
reloading the base file).

This fixes an error that a `nmcli con load` would have tried to
load the alias file. Also extend load_connection() to support
passing filenames other then the base file.

We only have to handle this in plugin.c. Inside reader.c we always
have the normalized base filename.

Or detection of alias files only looks whether the filename has a ':'
and whether a corresponding base file exists.
2015-06-02 12:57:52 +02:00
Thomas Haller
2e87df8408 ifcfg-rh: escape colon in generated filename
A colon indicates an alias file. It should be escaped.
2015-06-02 12:57:52 +02:00
Thomas Haller
8be9e832b5 ifcfg-rh: refactor utils_should_ignore_file() to return early 2015-06-02 12:57:52 +02:00
Thomas Haller
4ef8c0c90c ifcfg-rh: also read alias file for dhcp connections
Previously, if the main ifcfg file doesn't define any
static ip addresses, any alias files would be ignored.

We should also allow alias files with (pure) 'dhcp' connections,
just like initscripts do.

Reported-by: Marek Hulan <mhulan@redhat.com>
2015-06-02 12:57:52 +02:00
Thomas Haller
900aa016b1 ifcfg-rh: log warning when loading of connection fails
connection_from_file() used to log a warning about failure,
but only when an @error argument was given.

update_connection() didn't ensure that in several cases,
so we would not log any failure reason when an ifcfg file
failed to read.

This behavior of controlling logging by passing @error (or not)
is unexpected. Instead, refactor the code so that the caller
can do appropriate logging.
Another reason for this refactoring is that PARSE_WARNING() does
not mention the file for which the failure is and uses some extra
indention that looks wrong. IOW, connection_from_file() doesn't
have the context to give the logging line a proper formatting.
2015-06-02 12:57:52 +02:00
Lubomir Rintel
eb2b8c2798 build: use compat version of g_clear_pointer()
Ubuntu 12.04 has an ancient version of glib, which we nevertheless support.
2015-06-02 12:30:03 +02:00
Thomas Haller
b8b1a01d96 build: rename file "include/nm-utils-internal.h" to "nm-macros-internal.h"
We already have "nm-utils*.h" and "NetworkManagerUtils.h" headers. Rename
"include/nm-utils-internal.h" to "nm-macros-internal.h". I think that
name is better, because this file is header-only, internal, and
repository-wide.

Also, it will never contain non-header-only declarations because
there is no backing object file under "include/".
It will only contain macros and inline functions.
2015-06-01 14:47:08 +02:00
Lubomir Rintel
c47c06470a builds: only enable TAP driver for glib >= 2.37.6
No TAP support for previous versions and --tap argument is silently ignored,
confusing the TAP driver.
2015-05-28 12:51:24 +02:00
Thomas Haller
fb623df747 ifnet/test: rename test check_ifnet to test-ifnet
All our other test binaries are named "test-*" so rename this
one too. Also we gitignore "test-*.log" files, but didn't ignore
"check_ifnet.log".
2015-05-26 16:35:00 +02:00
Beniamino Galvani
90a7ad8dec ifnet/tests: convert to GLib test functions 2015-05-26 14:47:22 +02:00
Beniamino Galvani
fe765d30da ifnet/tests: fix GCC 5 warning about possible misuse of logical not
With GCC 5, -Wlogical-not-parentheses is enabled by -Wall and warns
about suspicious code like:

  int a;
  ...
  if (!a > 1) { ... }

Fix the following warning:

test_all.c: In function ‘test_is_static’:
test_all.c:114:32: warning: logical not is only applied to the left hand side of comparison [-Wlogical-not-parentheses]
  ASSERT (!is_static_ip6 ("eth0") == TRUE, "is static",
                                  ^
2015-05-26 14:47:22 +02:00
Lubomir Rintel
6463ce5dd9 tests: use the TAP formatter
The test results in standard format are easily integrated into CI systems.
2015-05-26 13:51:45 +02:00
Lubomir Rintel
f627d6db8e tests: move all asserts into tests
Otherwise the TAP formatter would produce a plan-less output.
2015-05-26 13:51:44 +02:00
Thomas Haller
533f9fa2d2 libnm: move internal dns-option helpers to "nm-core-internal.h"
"nm-utils-private.h" should not be used outside of libnm-core/.
core/ should only use public API or "nm-core-internal.h".

Also, "nm-setting-ip-config.h" is a public header and should
not contain internal defines. Move them to "nm-core-internal.h"
too.

Fixes: 019943bb5d
2015-05-20 12:42:14 +02:00
Thomas Haller
d4dd9ba3cf keyfile: readd owner check of files (bgo #701112)
Commit 5dc4be54e6 dropped the
owner check for keyfiles to allow running `make check` as root.
Re-add it, but disable the check for tests.

https://bugzilla.gnome.org/show_bug.cgi?id=701112
2015-05-19 09:57:46 +02:00
Beniamino Galvani
09e216b8ab ifcfg-rh/tests: add missing file to EXTRA_DIST
'ifcfg-test-dns-options' was not included in the archive for
distribution and 'make distcheck' failed. Add it.
2015-05-14 16:55:15 +02:00
Beniamino Galvani
58236b0ab2 ifcfg-rh: use GLib test functions in new testcases for DNS options 2015-05-13 17:15:35 +02:00
Beniamino Galvani
66e63c1632 ifcfg-rh/tests: add tests for RES_OPTIONS parsing 2015-05-13 17:15:35 +02:00
Beniamino Galvani
bb9c7e2c18 ifcfg-rh: support RES_OPTIONS 2015-05-13 17:15:34 +02:00
Thomas Haller
78c1849b53 core: fix compile error due to missing pointer cast
Fixes: 72baf9fa24
2015-05-13 12:30:37 +02:00
Lubomir Rintel
72baf9fa24 manager: AddAndActivateConnection(): don't save until the connection is activatable
https://bugzilla.redhat.com/show_bug.cgi?id=1174164
2015-05-12 17:26:25 +02:00
Dan Williams
77d01c9094 settings: ignore incompatible connections when looking for existing ones
beb18050 made this code run for all devices instead of just ethernet
devices, which means any kind of connection gets compared to any
device.  But only compatible connections should be considered.
2015-05-06 16:14:24 -05:00
Dan Williams
bbcf5444fd settings: remove 'do_export' argument from claim_connection()
It was always TRUE, and unused anyway.
2015-04-27 11:33:59 +02:00
Dan Williams
fe96dbc0ee settings/dbus: harden connection removal and object unexport
None of these functions was checking if the same operation had already
been performed, or if the object being removed/unexported was known.
2015-04-27 11:33:59 +02:00
Lubomir Rintel
8a00bb36ec nm-settings: add nm_settings_has_connection()
Useful for checking if a connection is already deleted.

https://bugzilla.gnome.org/show_bug.cgi?id=744812
https://bugzilla.redhat.com/show_bug.cgi?id=1174164
2015-04-27 11:33:58 +02:00
Lubomir Rintel
72f264ad9b ifcfg-rh: don't try to read DEVTIMEOUT from file for in-memory connections
#0  0x00007ffff4a2c970 in g_logv (log_domain=0x7fffe9201115 "NetworkManager-ifcfg-rh", log_level=G_LOG_LEVEL_CRITICAL, format=<optimized out>, args=args@entry=0x7fffffffd710) at gmessages.c:1046
  #1  0x00007ffff4a2cbaf in g_log (log_domain=log_domain@entry=0x7fffe9201115 "NetworkManager-ifcfg-rh", log_level=log_level@entry=G_LOG_LEVEL_CRITICAL, format=format@entry=0x7ffff4a9bc1d "%s: assertion '%s' failed") at gmessages.c:1079
  #2  0x00007ffff4a2cbe9 in g_return_if_fail_warning (log_domain=log_domain@entry=0x7fffe9201115 "NetworkManager-ifcfg-rh", pretty_function=pretty_function@entry=0x7fffe9204b70 <__FUNCTION__.30626> "devtimeout_from_file", expression=expression@entry=0x7fffe9202d97 "filename != NULL") at gmessages.c:1088
  #3  0x00007fffe91fbfa2 in devtimeout_from_file (filename=<optimized out>) at reader.c:4884
  #4  0x00007fffe91ef845 in nm_ifcfg_connection_new (self=0x8d2200 [NMIfcfgConnection]) at nm-ifcfg-connection.c:159
  #5  0x00007fffe91ef845 in nm_ifcfg_connection_new (source=source@entry=0x83ba40, full_path=full_path@entry=0x0, error=error@entry=0x7fffffffd980) at nm-ifcfg-connection.c:240
  #6  0x00007fffe91ec7e6 in update_connection (self=self@entry=0x80c2a0 [SCPluginIfcfg], source=source@entry=0x83ba40, full_path=0x0, connection=connection@entry=0x0, protect_existing_connection=protect_existing_connection@entry=0, protected_connections=protected_connections@entry=0x0, error=0x7fffffffd980) at plugin.c:225
  #7  0x00007fffe91eddf2 in add_connection (config=<optimized out>, connection=0x83ba40, save_to_disk=<optimized out>, error=0x7fffffffd980) at plugin.c:715
  #8  0x000000000048fc1d in nm_settings_add_connection (self=<optimized out>, connection=0x83ba40, save_to_disk=0, error=<optimized out>) at settings/nm-settings.c:1045
  #9  0x0000000000490858 in pk_add_cb (chain=0x8b1fc0, chain_error=<optimized out>, context=<optimized out>, user_data=<optimized out>) at settings/nm-settings.c:1151
  #10 0x00000000004ca98c in auth_chain_finish (user_data=0x8b1fc0) at nm-auth-utils.c:82
  #11 0x00007ffff4a257fb in g_main_context_dispatch (context=0x7cd3e0) at gmain.c:3111
  #12 0x00007ffff4a257fb in g_main_context_dispatch (context=context@entry=0x7cd3e0) at gmain.c:3710
  #13 0x00007ffff4a25b98 in g_main_context_iterate (context=0x7cd3e0, block=block@entry=1, dispatch=dispatch@entry=1, self=<optimized out>) at gmain.c:3781
  #14 0x00007ffff4a25ec2 in g_main_loop_run (loop=0x7cd4a0) at gmain.c:3975
  #15 0x0000000000444c81 in main (argc=<optimized out>, argv=<optimized out>) at main.c:486
2015-04-23 17:14:03 +02:00
Thomas Haller
b04c99da0b ibft/logging: don't localize logging stagements
We don't localize any other nm-logging messages either.
2015-04-22 10:26:34 +02:00
Thomas Haller
c6529a9d74 platform: add self argument to platform functions
Most nm_platform_*() functions operate on the platform
singleton nm_platform_get(). That made sense because the
NMPlatform instance was mainly to hook fake platform for
testing.

While the implicit argument saved some typing, I think explicit is
better. Especially, because NMPlatform could become a more usable
object then just a hook for testing.

With this change, NMPlatform instances can be used individually, not
only as a singleton instance.

Before this change, the constructor of NMLinuxPlatform could not
call any nm_platform_*() functions because the singleton was not
yet initialized. We could only instantiate an incomplete instance,
register it via nm_platform_setup(), and then complete initialization
via singleton->setup().
With this change, we can create and fully initialize NMPlatform instances
before/without setting them up them as singleton.

Also, currently there is no clear distinction between functions
that operate on the NMPlatform instance, and functions that can
be used stand-alone (e.g. nm_platform_ip4_address_to_string()).
The latter can not be mocked for testing. With this change, the
distinction becomes obvious. That is also useful because it becomes
clearer which functions make use of the platform cache and which not.

Inside nm-linux-platform.c, continue the pattern that the
self instance is named @platform. That makes sense because
its type is NMPlatform, and not NMLinuxPlatform what we
would expect from a paramter named @self.

This is a major diff that causes some pain when rebasing. Try
to rebase to the parent commit of this commit as a first step.
Then rebase on top of this commit using merge-strategy "ours".
2015-04-21 17:51:34 +02:00
Thomas Haller
e9b9d9b627 core/logging: adjust log line about loading setting plugins
We have different kinds of plugins (settings, dhcp, dns).
Clearify, that we are about to load "settings" plugins.
2015-04-18 21:41:40 +02:00
Thomas Haller
d8e1d9b469 core/logging: downgrade some <info> loggings to <debug>
These logging statements are compile time dependent and
add little informational value.
2015-04-18 21:41:40 +02:00
Thomas Haller
b6d3b98655 test: setup logging during nmtst_init_assert_logging()
Before, when having a test with nmtst_init_assert_logging(),
the caller was expected to setup logging separately according
to the log level that the test asserts against.

Since 5e74891b58, the logging
level can be reset via NMTST_DEBUG also for tests that
assert logging. In this case, it would be useful, if the test
would not overwrite the logging level that is set externally
via NMTST_DEBUG.

Instead, let the test pass the logging configuration to
nmtst_init_assert_logging(), and nmtst will setup logging
-- either according to NMTST_DEBUG or as passed in.

This way, setting the log level works also for no-expect-message
tests:

  NMTST_DEBUG="debug,no-expect-message,log-level=TRACE" $TEST
2015-04-08 14:39:16 +02:00
Thomas Haller
628f47285d libnm: accept unknown WEP key type in nm_utils_wep_key_valid()
libnm-core treated the UNKNOWN WEP key type as KEY. Relax that
and try to guess the correct type based on the key.

This is for example important if you have a valid connection with
  wep-key-type=0 (unknown)
If you request passwords for such a connection, the user cannot
enter them in password format -- but there is no UI indication
that the password must be KEY.
2015-03-20 13:02:04 +01:00