Commit graph

1457 commits

Author SHA1 Message Date
Thomas Haller
6cb46619ed ifcfg-rh: merge new_connection() and update_connection() functions
They are basically the same, with a minor difference where the @filename
argument determines whether to write a new file or do an update.

Also, rename them, to give them a nms_* prefix in the header file.
2017-10-25 14:04:36 +02:00
Thomas Haller
3c3fc089ad settings: return re-read connection from ifcfg-rh writer
As writing a connection to disk might modify it, we re-read
it back and use what we actually found on disk.

For example, if you have a connection with ipv6.method=ignore,
ifcfg-rh writer will not persist the ipv6.route-metric. That
is likely a bug in the writer. Before this patch, changing
the route metric would seemingly succeed, but on the next reload
from this, the changes are lost.

We should fix such bugs. Regardless, it's better to pick up
what we wrote to disk, instead of later.
2017-10-25 14:04:36 +02:00
Thomas Haller
713ad38fe5 settings: first persist connection to disk before replacing settings
Previously, we would first call replace_settings(), followed by
commit_changes(). There are two problems with that:

  - commit_changes() might fail easily, for example if the settings
    plugin cannot handle the connection. In that case, we fail the operation,
    but still we already replaced the settings in memory. We should
    first write to disk, and only when that succeeded, replace our
    settings.
    Also, note that replace_settings() cannot really fail at that
    point, because we already validate the setting previously
    (everything else would be a bug).

  - commit_changes() might modify the connection while writing it.
    We re-read it and replace the settings. If we already replaced
    it before, we replcace the settings twice -- needlessly.
2017-10-25 14:04:36 +02:00
Thomas Haller
5a82cad5f3 settings: extend commit_changes() to update the settings after writing
During write, it can regularly happen that the connection gets modified.
For example, keyfile never writes blobs as-is, it always writes the
blob to an external file, and replaces the certificate property with
a path.
Other reasons could be just bugs, where the reader and writer are not doing
a proper round trip (these cases should be fixed).

Refactor commit_changes(), to return the re-read connection to
the settings-connection class, and handle replacing the settings
there.

Also, prepare for another change. Sometimes we first call replace_settings()
followed by commit_changes(). It would be better to instead call commit_changes()
first, and only on success proceed with replace_settings(). Hence, commit_changes()
gets a new argument new_connection, that can be used to write another
connection to disk.
2017-10-25 14:04:36 +02:00
Thomas Haller
edc7503569 settings: split nm_settings_connection_replace_settings() function
Extract two function "replace_prepare" and "replace", so that
they can be used independently.
2017-10-25 14:04:36 +02:00
Thomas Haller
3ecb57fdc4 settings: get rid of callback arguments for nm_settings_connection_delete() 2017-10-25 14:04:36 +02:00
Thomas Haller
bd66285b1c settings: get rid of callback arguments for nm_settings_connection_commit_changes()
No need to return an error result via a callback function. Just
return the plain error.
2017-10-25 14:04:36 +02:00
Thomas Haller
7d7bc99ff0 settings: fix leaking info in update_auth_cb() 2017-10-25 14:04:36 +02:00
Thomas Haller
7a660ea66f settings: inline nm_settings_connection_replace_and_commit()
nm_settings_connection_replace_and_commit() only has one caller:
update_auth_cb().

Inline the function.
2017-10-25 14:04:36 +02:00
Thomas Haller
36f5d440fd settings: refactor virtual delete() function
Don't delegate so much to the virtual function delete().
2017-10-25 14:04:36 +02:00
Thomas Haller
ede1e08ac1 settings: refactor virtual commit_changes() function
Don't delegate so much to the virtual function commit_changes().
Calling the callback is not the task of the virtual function,
because every implementation must do that.

There are some minor changes in behavior for ifnet, where we now
first setup the monitors and reload the parsers, before invoking
the callback.
2017-10-25 14:04:36 +02:00
Thomas Haller
027229a4b0 settings: refactor replace_and_commit()
The virtual function replace_and_commit() had only one implementation: ifcfg-rh.

Refactor the code, to delegate less. That is, the main part of
replace-and-commit is not delegated to a virtual function.
Now, the virtual function is only a pre-check hook, so that
the ifcfg-rh implementation can abort the function.

There are no functional changes.
2017-10-25 14:04:36 +02:00
Thomas Haller
0a8822ce9b ifcfg-rh: use svGetValueInt64() to read DEVTIMEOUT 2017-10-25 14:04:36 +02:00
Thomas Haller
dbd0ffb8e6 ifcfg-rh: use svSetValueInt64_cond() in writer 2017-10-25 14:04:36 +02:00
Thomas Haller
4f4f05edc8 ifnet: avoid registering and leaking multiple file monitors
Also, need to avoid danling pointers in clear_monitor().

This was not really a problem, because we would always call
cancel() before setup(). Still, it's fragile.
2017-10-25 14:04:36 +02:00
Thomas Haller
02deb9cffb ifnet/trivial: whitespace only 2017-10-25 14:04:36 +02:00
Thomas Haller
de4742333a core: add option to pass ownership of file descriptor to nm_utils_fd_get_contents()
In many scenarios, we have no use for the file descriptor
after nm_utils_fd_get_contents(). We just want to read it
and close it.

API wise, it would be nice that the get_contents() function never
closes the passed in fd and it's always responsibility of the caller.

However, that costs an additional dup() syscall that could
be avoided, if we allow the function to (optionally) close
the file descriptor.
2017-10-19 15:49:58 +02:00
Beniamino Galvani
d29115c138 core: use nm_close()
Use nm_close() in the core to catch any improper use of close().
2017-10-19 15:49:58 +02:00
Thomas Haller
d1a58fbfbf ifcfg-rh: limit reading GATEWAY_PING_TIMEOUT to 600 seconds
libnm-core limits the rande for GATEWAY_PING_TIMEOUT to 0 to 600.
See commit e86f8354a7, "device: restart
ping process when it exits with an error".

The reader must not pass value out of range to g_object_set().
Clamp and warn.
2017-10-18 17:54:53 +02:00
Thomas Haller
3434261811 core,clients: use our own string hashing function nm_str_hash()
Replace the usage of g_str_hash() with our own nm_str_hash().

GLib's g_str_hash() uses djb2 hashing function, just like we
do at the moment. The only difference is, that we use a diffrent
seed value.

Note, that we initialize the hash seed with random data (by calling
getrandom() or reading /dev/urandom). That is a change compared to
before.

This change of the hashing function and accessing the random pool
might be undesired for libnm/libnm-core. Hence, the change is not
done there as it possibly changes behavior for public API. Maybe
we should do that later though.

At this point, there isn't much of a change. This patch becomes
interesting, if we decide to use a different hashing algorithm.
2017-10-18 13:05:00 +02:00
Thomas Haller
cc1ee1d286 all: rework configuring route table support by adding "route-table" setting
We added "ipv4.route-table-sync" and "ipv6.route-table-sync" to not change
behavior for users that configured policy routing outside of NetworkManager,
for example, via a dispatcher script. Users had to explicitly opt-in
for NetworkManager to fully manage all routing tables.

These settings were awkward. Replace them with new settings "ipv4.route-table"
and "ipv6.route-table". Note that this commit breaks API/ABI on the unstable
development branch by removing recently added API.

As before, a connection will have no route-table set by default. This
has the meaning that policy-routing is not enabled and only the main table
will be fully synced. Once the user sets a table, we recognize that and
NetworkManager manages all routing tables.

The new route-table setting has other important uses: analog to
"ipv4.route-metric", it is the default that applies to all routes.
Currently it only works for static routes, not DHCP, SLAAC,
default-route, etc. That will be implemented later.

For static routes, each route still can explicitly set a table, and
overwrite the per-connection setting in "ipv4.route-table" and
"ipv6.route-table".
2017-10-09 22:05:36 +02:00
Thomas Haller
a0aec7efea shared: pass addr_family as first argument to nm_utils_parse_inaddr*()
The addr_family should be the first argument. It mirrors inet_pton()
and is just nicer.

Also, rename the argument from "family" to "addr_family".
2017-10-06 11:08:39 +02:00
Thomas Haller
cfb14ce17e core: cleanup autoconnect retry handling
- clearify in the manual page that setting retry to 1 means to try
  once, without retry.
- log the initially set retry value in nm_settings_connection_get_autoconnect_retries().
- use nm_settings_connection_get_autoconnect_retries() in
  nm_settings_connection_can_autoconnect().
2017-10-04 13:57:16 +02:00
Thomas Haller
099be8e4db keyfile: fix reading/writing route metric zero
Zero is a valid route metric and distinct from -1, which means unspecified.
Fix reader and writer.

Fixes: e374923bbe
2017-10-04 11:40:47 +02:00
Beniamino Galvani
937ee1de82 core: rename NM_SETTINGS_AUTO_CONNECT_BLOCKED_REASON_UNBLOCKED enum
NM_SETTINGS_AUTO_CONNECT_BLOCKED_REASON_NONE sounds better.
2017-09-29 15:34:55 +02:00
Beniamino Galvani
b80ee4a72c core: make auto-connect-blocked-reason more specific
Distinguish between connections blocked from autoconnecting by user
request and connections blocked because they failed (and would fail
again).

Later, the reason will be used to unblock failed connection when some
conditions change.
2017-09-29 15:32:16 +02:00
Thomas Haller
5b0f895e19 libnm,core: add TABLE attribute for routes settings
https://bugzilla.redhat.com/show_bug.cgi?id=1436531
2017-09-26 19:39:36 +02:00
Thomas Haller
c71f26bf92 libnm,cli: add IP setting "route-table-sync" 2017-09-26 19:39:36 +02:00
Beniamino Galvani
7dc1f8b479 ifcfg-rh: trivial: rename write_bonding_setting() to write_bond_setting()
The setting name is NMSettingBond.
2017-09-25 22:36:45 +02:00
Beniamino Galvani
e89ed9b51e ifcfg-rh: write DEVICE only once
The plugin already writes DEVICE in write_connection_setting(), there
is no need to write it again elsewhere.
2017-09-25 22:36:43 +02:00
Thomas Haller
6d675a943b ifcfg-rh: refactor parsing of route options to be strict
The previous parsing was done using regex. One could implement a
complex regex to parse the setting. However, as it was implemented,
the regex would just pick out parts of the line that it expects,
and ignore unknown parts.

Let's be strict about what we parse. The only strong requirement
is that NM can parse everything that was written by NM itself.
Eventually, we could extend the parser to accept everything that
initscripts accept.

Initscripts split the line at $IFS and do filename globbing on the
arguments. That is ugly, because globbing is of coures wrong (we don't
do that). But also, the splitting at $IFS cannot be escaped, hence for
initscripts it is impossible to use '<space><tab><newline>'. We do that
too, as it makes it easy to parse. Later we may want to extend this to
allow a form of escaping/quoting.

Yes, we may now ignore routes that are not defined as we expect them.
2017-09-18 20:14:09 +02:00
Thomas Haller
62f2c4cf20 ifcfg-rh: write lock route attribute with zero value
Only specifying "lock" without a corresponding attribute shall have
the meaning of "$NAME lock 0".
2017-09-18 20:14:09 +02:00
Thomas Haller
e54fad0886 ifcfg-rh: refactor code to avoid unnecessary copies
svGetValueStr() is preferred over svGetValueStr_cp() because it may safe
an additional string copy (if the value needs no unescaping/unquoting).

Also, use nm_utils_strsplit_set() because it saves to copy each word.

There are some changes here. For example, read_8021x_list_value()
previously would not strip empty words. When switching from
g_strsplit_set() to nm_utils_strsplit_set(), empty words are implicitly
skipped.
2017-09-18 20:14:09 +02:00
Thomas Haller
b1029c6198 ifcfg-rh/trivial: rename function that are only for testing
We have similar functions, like _nmtst_ip4_config_del_route(). Rename testing
functions to have "_nmtst_" prefix for consistency.
2017-09-18 20:14:09 +02:00
Beniamino Galvani
2f3e978f57 ifnet: ensure an error is always returned when add fails
There are many places where the function can fail without returning an
error, leading to a crash. Fix this.
2017-09-07 15:09:15 +02:00
Thomas Haller
5c42cdb287 all: use _nm_utils_ip4_*() utils functions 2017-09-05 18:44:04 +02:00
Thomas Haller
a47153f5b8 ifcfg-rh/tests: test backward compatibility reading routes with "via (null)"
Due to a bug, NetworkManager used to write device routes with "via (null)".
That was fixed in commit af8aac9b54 and
bug rh#1452648.

Add a unit test to ensure we keep accepting such (invalid) routes that
NetworkManager once wrote.
2017-09-05 13:28:21 +02:00
Ikey Doherty
5c5a553ca6 settings: ensure the keyfile storage directory actually exists
When first trying to write out the connections we need to ensure that the
keyfile directory exists, as the /etc/ tree may be either stateless or
reset initially.

Creating the directory on demand ensures that we have a chance for our
writes to actually work.

[lkundrak@v3.sk: dropped a comment for what seems obvious, minor style
fixes]
2017-08-31 18:29:48 +02:00
Thomas Haller
75dc0fdd27 platform,libnm: cleanup handling of TOS for routes
- kernel ignores rtm_tos for IPv6 routes. While iproute2 accepts it,
  let libnm reject TOS attribute for routes as well.

- move the tos field from NMPlatformIPRoute to NMPlatformIP4Route.

- the tos field is part of the weak-id of an IPv4 route. Meaning,
  `ip route add` can add routes that only differ by their TOS.
2017-08-03 18:51:57 +02:00
Thomas Haller
f5c800885b ifcfg-rh: fix writing/reading TOS for routes in hexadecimal
iproute2 expects TOS in hex.

This is a change in behavior.
2017-08-03 18:51:57 +02:00
Beniamino Galvani
17ec3aef2f bridge: introduce a bridge.group-forward-mask connection property
https://bugzilla.redhat.com/show_bug.cgi?id=1358615
2017-07-27 09:35:11 +02:00
Mike Gorse
6405d17730 Move CONF_DHCP definition to nm-hostname-manager.c
It is only referenced from there. Fixes the build if HOSTNAME_PERSIST_SUSE
is defined.

Fixes: 5bfb7c3c89

https://bugzilla.gnome.org/show_bug.cgi?id=784225
2017-06-27 09:05:42 +02:00
Thomas Haller
2656ba8d1d core: log changes to NMSettingsConnection's flags 2017-06-16 13:47:08 +02:00
Tom Gundersen
6c8fe5754c ifcfg-rh: refactor dbus policy
This drops some redundant rules and orderes the remaining ones by
precedence.

The 'root' rules take precedence over the 'default' rules, so order
the file accordingly.

It is not necessary to repeat send_destination rules, as the default
rules already allows everyone to send to the interface.

Moreover, it is not necessary to restrict the ownership of the name
in the default context, as this is already done by the system-wide
default rule.

Reviewed-by: David Herrmann <dh.herrmann@gmail.com>
2017-06-15 13:20:55 +02:00
Thomas Haller
238efbbb12 settings: refactor nm_settings_connection_read_and_fill_timestamp()
Coverity complains about not checking the return value:

  src/settings/nm-settings-connection.c:2329: check_return: Calling "g_key_file_load_from_file" without checking return value (as is done elsewhere 6 out of 7 times).

While at it, refactor the code and check whether the timestamp
is valid.
2017-06-02 20:17:30 +02:00
Thomas Haller
c7c47575ce tests: work around coverity false-positives 2017-06-02 20:00:56 +02:00
Lubomir Rintel
0d71c0569f ifcfg: drop an unused variable 2017-05-31 19:50:58 +02:00
Thomas Haller
84f2d226b5 ifcfg-rh: fix build failure in write_wired_setting()
Fixes: f80d0eb29e
2017-05-30 18:27:37 +02:00
Thomas Haller
f80d0eb29e ifcfg-rh: use svSetValueInt64_cond() to write MTU value 2017-05-30 16:37:28 +02:00
Thomas Haller
80c0a37b47 ifcfg-rh: add svSetValueInt64_cond()
There are a lot of places where we want to either write a number,
or conditionally clear it. Like:

    mtu = nm_setting_wireless_get_mtu (s_wireless);
    if (mtu)
        svSetValueInt64 (ifcfg, "MTU", mtu);
    else
        svUnsetValue (ifcfg, "MTU");
2017-05-30 16:35:13 +02:00