Commit graph

2002 commits

Author SHA1 Message Date
Thomas Haller
2dcd9fa836 agent-manager: use cleanup macro for subject in agent_manager_register_with_capabilities()
More cleanup macros.
2019-12-31 02:13:45 +01:00
Thomas Haller
b32d656d26 agent-manager: drop unused error handling in agent_manager_register_with_capabilities()
nm_auth_chain_new_subject() cannot fail.
2019-12-31 02:13:45 +01:00
Antonio Cardace
1e45865e4f shared: nm-auth-subject: add unix-session type 2019-12-24 10:13:51 +01:00
Antonio Cardace
0f7994328d shared: move nm-dbus-auth-subject to shared/nm-libnm-core-intern
Move it to shared as it's useful for clients as well.

Move and rename nm_dbus_manager_new_auth_subject_from_context() and
nm_dbus_manager_new_auth_subject_from_message() in nm-dbus-manager.c
as they're needed there.
2019-12-24 10:13:51 +01:00
Thomas Haller
85ae90896c ifcfg-rh: remove calls to svUnsetAll()
We no longer need to explicitly clear values. Those that
we don't set, will be cleared automatically.
2019-12-21 13:37:11 +01:00
Thomas Haller
003a657c5c ifcfg-rh: treat base name as numbered tag and fix detection of NETMASK
We call svFindFirstNumberedKey() to check whether we have any NETMASK
set. Since commit 9085c5c3a9 ('ifcfg-rh: rename
svFindFirstKeyWithPrefix() to svFindFirstNumberedKey() for finding
NETMASK') that function would no longer find the "NETMASK" without
number.

Fix that, by letting nms_ifcfg_rh_utils_is_numbered_tag() return TRUE
for the tag itself. This also makes more sense, because it matches our
common understanding what numbered tags are.

Adjust the other callers that don't want this behavior to explicitly
check.

Fixes: 9085c5c3a9 ('ifcfg-rh: rename svFindFirstKeyWithPrefix() to svFindFirstNumberedKey() for finding NETMASK')
2019-12-21 13:37:11 +01:00
Thomas Haller
d9bb13f8e3 ifcfg-rh: add index for O(1) access of variables in shvarFile
Previously, setting or getting a variable required to scan all lines.

Note that frequently we would look up variables that didn't actually
exist, which we could only determine after searching the entire list.

Also, since we needed to handle having the same variable specified
multiple times (where the last occurrence wins), we always had to search
all keys and couldn't stop when finding the first key. Well, technically
we could have searched in reverse order for the getter, but that wasn't
done. For the setter we wanted to delete all but the last occurrences,
so to find them, we really had to search them all.

We want to support profiles with hundreds or thousands of addresses and routes.
This does not scale well.

Add an hash table to find the variables in constant time.

Test this commit and the parent commit:

   $ git clean -fdx &&
     CFLAGS=-O2 ./autogen.sh --with-more-asserts=0 &&
     ./tools/run-nm-test.sh -m src/settings/plugins/ifcfg-rh/tests/test-ifcfg-rh &&
     perf stat -r 50 -B src/settings/plugins/ifcfg-rh/tests/test-ifcfg-rh 1>/dev/null

Before:

 Performance counter stats for 'src/settings/plugins/ifcfg-rh/tests/test-ifcfg-rh' (50 runs):

            330.94 msec task-clock:u              #    0.961 CPUs utilized            ( +-  0.33% )
                 0      context-switches:u        #    0.000 K/sec
                 0      cpu-migrations:u          #    0.000 K/sec
             1,081      page-faults:u             #    0.003 M/sec                    ( +-  0.07% )
     1,035,923,116      cycles:u                  #    3.130 GHz                      ( +-  0.29% )
     1,800,084,022      instructions:u            #    1.74  insn per cycle           ( +-  0.01% )
       362,313,301      branches:u                # 1094.784 M/sec                    ( +-  0.02% )
         6,259,421      branch-misses:u           #    1.73% of all branches          ( +-  0.13% )

           0.34454 +- 0.00116 seconds time elapsed  ( +-  0.34% )

Now:

 Performance counter stats for 'src/settings/plugins/ifcfg-rh/tests/test-ifcfg-rh' (50 runs):

            329.78 msec task-clock:u              #    0.962 CPUs utilized            ( +-  0.39% )
                 0      context-switches:u        #    0.000 K/sec
                 0      cpu-migrations:u          #    0.000 K/sec
             1,084      page-faults:u             #    0.003 M/sec                    ( +-  0.05% )
     1,036,130,698      cycles:u                  #    3.142 GHz                      ( +-  0.13% )
     1,799,851,979      instructions:u            #    1.74  insn per cycle           ( +-  0.01% )
       360,374,338      branches:u                # 1092.756 M/sec                    ( +-  0.01% )
         6,160,796      branch-misses:u           #    1.71% of all branches          ( +-  0.08% )

           0.34287 +- 0.00133 seconds time elapsed  ( +-  0.39% )

So, not much difference. But this is not surprising, because test-ifcfg-rh loads and
writes predominantly ifcfg files with few variables. The difference should be visible
when having large files.
2019-12-21 12:56:23 +01:00
Thomas Haller
9085c5c3a9 ifcfg-rh: rename svFindFirstKeyWithPrefix() to svFindFirstNumberedKey() for finding NETMASK
svFindFirstKeyWithPrefix() only had one caller: to find whether there are
any NETMASK variables set. NETMASK is a numbered variable, so we should only
find variables that indeed follow the pattern. Since there was only
one caller, rename and repurpose the function.
2019-12-21 12:47:50 +01:00
Thomas Haller
820696f352 ifcfg-rh: remove explicit svUnsetValue() calls and rely on automatic removal of unvisited keys
Part 2 of previous commit. See there.
2019-12-21 12:47:50 +01:00
Thomas Haller
07262b165d ifcfg-rh: clear all untouched, known keys before writing ifcfg-rh file
When we write a connection profile to ifcfg-rh file, we first load the
possibly existing file and modify it. The purpose is to preserve
variables that we don't know about, keep comments and preserve the order
of the variables.

Note that the writer sets a bunch of variables according to the
profile's setting. At various places the writer would explicitly
clear variables with svUnsetValue(). However, that was problematic:

- we would not unset all variables that we care about. We really should
  not leave previous variables if they make no sense anymore for the
  profile. The only thing we want to preserve are entirely unknown keys
  and comments. Note that when the writer omits to clear an unset variable,
  it usually does so assuming that the reader would anyway ignore the
  key, become some other key renders it irrelevant. Given the complexity
  of the reader and writer, that is often not the case and hard to ensure.

  We might have simply forgotten a svUnsetValue(), which was an easy
  to make mistake and hard to find (because you'd have to test with
  a pre-existing profile that happens to contain that key, which leaves
  countless combinations for testing.

  That means, a profile written by the writter might be interpreted
  differently by the reader depending on which pre-existing keys were set.

- it was cumbersome to explicitly call svUnsetValue().
  Note that for numbered tags in particular we would iterate the keys
  trying to unset them. For example for addresses (like "IPADDR5") we
  would iterate over the first 256 IPADDR keys, trying to unset them.
  That is horrible. For one, it doesn't cover the case where there might
  be more than 256 addresses. Also, it adds a significant overhead every
  time.
  While writing a ifcfg file currently is O(n^2) because setting one key
  is O(l), with l being the number of keys/lines. So, if you set n keys
  in a file with l lines, you get O(n*l). Which is basically O(n^2),
  because the number of lines and the number of keys to set usually
  corresponds.
  So when setting 256 times IPADDR, the overall complexity was still
  O(n^2 + 256 * n) and didn't change. However, the 256 factor here can
  be very significant.

We should not explicitly unset variables, we should always unset all
known variables that we don't explicitly set.

The svUnsetValue() calls are still there. They will be dropped next.
2019-12-21 12:44:23 +01:00
Thomas Haller
8e212176b4 ifcfg-rh: add svUnsetDirtyWellknown() function
Helper function to remove all variables that are still dirty (not
visited) and well-known.

Also add svWriteFileWithoutDirtyWellknown() to clear the lines
before persisting to disk.
2019-12-21 12:41:48 +01:00
Thomas Haller
81e6fe963e ifcfg-rh: add functions to detect well-known ifcfg-rh keys
This adds a lot of meta-data about how we handle ifcfg-rh.

We will use this to prune/delete all variables that are not explicitly
set (dirty) but also well-known.

We could now easily emit a warning when an ifcfg-rh file contains
unused key.

We also could add more meta-data for each key. For example, we write
different files (ifcfg- and keys- files). We could add flags to indicate
that variables are valid in certain files. Currently that's not done.
Also, for simple properties we could associate the key with the
NMSetting property, and treat does generically, like keyfile does.

Anyway, there are potentials. For now, we will use this to clear dirty
variables.
2019-12-21 12:41:48 +01:00
Thomas Haller
3fa86a463c ifcfg-rh: refactor is_numbered_tag() macro and make it a function
Previously, IS_NUMBERED_TAG() could only be called with a C literal.
Add is_numbered_tag() which can be called with any C string.

Also, IS_NUMBERED_TAG_PARSE() and IS_NUMBERED_TAG() didn't do exactly
the same. I think they should. The only difference was if the number
was larger than 2^63-1. Now IS_NUMBERED_TAG() starts ignoring such
keys, which is fine.
2019-12-21 12:36:36 +01:00
Thomas Haller
32033d9086 ifcfg-rh: mark lines as non-dirty in shvarFile when we visit them
By default, all lines are now marked as dirty. Whenever we modify/set
a line, it becomes non-dirty. That will be used later to prune lines
that are dirty, that is, not yet visited.
2019-12-21 12:36:36 +01:00
Thomas Haller
89d8b254eb ifcfg-rh/trivial: rename nms_ifcfg_rh_utils_parse_unhandled_spec() helper
The name didn't follow the scheme.
2019-12-21 12:36:36 +01:00
Thomas Haller
bd9b253540 all: rename time related function to spell out nsec/usec/msec/sec
The abbreviations "ns" and "ms" seem not very clear to me. Spell them
out to nsec/msec. Also, in parts we already used the longer abbreviations,
so it wasn't consistent.
2019-12-13 16:54:40 +01:00
Thomas Haller
e0569ee575 settings: assert that we don't leak error variable in impl_settings_load_connections() 2019-12-09 09:54:17 +01:00
Thomas Haller
eb642fecdf settings: fix use after free in keyfile's load_connections()
Fixes: d35d3c468a ('settings: rework tracking settings connections and settings plugins')
2019-12-09 09:54:11 +01:00
Thomas Haller
1e742e0fb4 ifcfg: don't use D-Bus connection if NMDBusManager is without main connection
In configure-and-quit mode, NMDBusManager does not have a D-Bus connection.
Likewise, ifcfg-rh plugin should not use one either.
2019-12-09 09:02:24 +01:00
Thomas Haller
9d602529cc settings/trivial: comment why we create GDBusConnection for ifcfg D-Bus interface
There is nothing to fix. Replace the FIXME comment.
2019-12-09 08:59:29 +01:00
David Bauer
235cb4a5d3 settings/ifcfg: add support for KEY_MGMT=OWE 2019-12-05 14:00:10 +01:00
Thomas Haller
15fb8fe26d settings/trivial: add fixme comment for creating GDBusConnection for ifcfg D-Bus interface
We really should just use the one and only main connection.
2019-12-05 12:27:13 +01:00
Beniamino Galvani
292d3f2b57 ifcfg-rh: add support for DHCP hostname flags 2019-11-28 17:56:35 +01:00
Thomas Haller
b9f1beb06e all: add support for "scope" attribute for IPv4 routes
- systemd-networkd and initscripts both support it.

- it seems suggested to configure routes with scope "link" on AWS.

- the scope is only supported for IPv4 routes. Kernel ignores the
  attribute for IPv6 routes.

- we don't support the aliases like "link" or "global". Instead
  only the numeric value is supported. This is different from
  systemd-networkd, which accepts names like "global" and "link",
  but no numerical values. I think restricting ourself only to
  the aliases unnecessarily limits what is possible on netlink.
  The alternative would be to allow aliases and numbers both,
  but that causes multiple ways to define something and has
  thus downsides. So, only numeric values.

- when setting rtm_scope to RT_SCOPE_NOWHERE (0, the default), kernel
  will coerce that to RT_SCOPE_LINK. This ambiguity of nowhere vs. link
  is a problem, but we don't do anything about it.

- The other problem is, that when deleting a route with scope RT_SCOPE_NOWHERE,
  this acts as a wild care and removes the first route that matches (given the
  other route attributes). That means, NetworkManager has no meaningful
  way to delete a route with scope zero, there is always the danger that
  we might delete the wrong route. But this is nothing new to this
  patch. The problem existed already previously, except that
  NetworkManager could only add routes with scope nowhere (i.e. link).
2019-11-28 00:11:15 +01:00
Thomas Haller
b8c0078008 ifcfg-rh: separately handle static information during parsing ip-route commandline
There is an "info" part and a part with the data that we parsed.
Don't track the static and mutable data in the same variable.

Also, this allows to mark the static part as "const static".
2019-11-27 16:06:00 +01:00
Thomas Haller
e7816a2508 ifcfg-rh: fix accepting onlink flag also for IPv6 routes
In the past, kernel (and NetworkManager) did not support the onlink
flags for IPv6 routes. That is no longer the case.

Fixes: f5e8bbc8e0 ('libnm,core: enable "onlink" flags also for IPv6 routes')
2019-11-27 16:06:00 +01:00
Thomas Haller
5028206ec4 ifcfg: various cleanup in ifcfg writer
svUnsetValue (ifcfg, KEY);
    if (condition)
         svSetValue* (ifcfg, KEY, ...);

is not good. It requires first clearing the value, before setting
it again.

Various cleanup to fix such uses.
2019-11-22 11:39:47 +01:00
Thomas Haller
2a4fb75d3b ifcfg: add support for "802-1x.system-ca-certs" setting 2019-11-22 11:39:47 +01:00
Thomas Haller
87af96a9d6 ifcfg: add svSetValueBoolean_cond_true() helper 2019-11-22 11:39:47 +01:00
Beniamino Galvani
56a1a5426a all: add ipvX.dhcp-iaid properties
Add new ipv4.dhcp-iaid and ipv6.dhcp-iaid properties to specify a DHCP
IAID.
2019-11-11 10:31:33 +01:00
Thomas Haller
86097cc2e8 libnm: fix return value for nm_remote_settings_reload_connections*() to ignore server result
Note that the server always returns TRUE for the boolean return value
of ReloadConnections. Hence, this should not change in behavior, because
the server would never have returned FALSE.

However, change behavior of the API. It's odd that the function might
return %FALSE without setting the error output. It's also not clear
what the boolean value of the "ReloadConnections" D-Bus would mean
anyway.
2019-10-16 08:56:00 +02:00
Beniamino Galvani
eb3e932b6a ifcfg-rh: drop trailing dot from error messages 2019-10-15 08:34:31 +02:00
Beniamino Galvani
8763e6da9c all: add 802-1x.optional property
Introduce a 802-1x.optional boolean property that can be used to
succeed the connection even after an authentication timeout or
failure.
2019-10-15 08:34:31 +02:00
Beniamino Galvani
292ba430a0 ifcfg-rh: refactor reading 802.1X phase2 auth method
Refactor reading the phase2 authentication method for 802.1X.
Previously the reader only considered the first item of the
space-separated list; but since the 802.1x setting can hold distinct
phase2-auth and phase2-autheap properties - both mapped to the same
ifcfg-rh variable - we should parse the whole list. We only emit a
warning when multiple methods of the same type are found to avoid
breaking existing manually written ifcfg files.

Moreover, the reader implemented different checks for each of the
outer tunneled methods (PEAP, TTLS and FAST); drop those checks and
accept whatever the 802.1X setting also consider as valid. Note that
some combinations that are in principle valid, like PEAP + EAP-MD5,
were dropped before.
2019-10-15 08:33:46 +02:00
Thomas Haller
3b69f02164 all: unify format of our Copyright source code comments
```bash

readarray -d '' FILES < <(
  git ls-files -z \
    ':(exclude)po' \
    ':(exclude)shared/c-rbtree' \
    ':(exclude)shared/c-list' \
    ':(exclude)shared/c-siphash' \
    ':(exclude)shared/c-stdaux' \
    ':(exclude)shared/n-acd' \
    ':(exclude)shared/n-dhcp4' \
    ':(exclude)src/systemd/src' \
    ':(exclude)shared/systemd/src' \
    ':(exclude)m4' \
    ':(exclude)COPYING*'
  )

sed \
  -e 's/^\(--\|#\| \*\) *\(([cC]) *\)\?Copyright \+\(\(([cC])\) \+\)\?\(\(20\|19\)[0-9][0-9]\) *[-–] *\(\(20\|19\)[0-9][0-9]\) \+\([^ ].*\)$/\1 C1pyright#\5 - \7#\9/' \
  -e 's/^\(--\|#\| \*\) *\(([cC]) *\)\?Copyright \+\(\(([cC])\) \+\)\?\(\(20\|19\)[0-9][0-9]\) *[,] *\(\(20\|19\)[0-9][0-9]\) \+\([^ ].*\)$/\1 C2pyright#\5, \7#\9/' \
  -e 's/^\(--\|#\| \*\) *\(([cC]) *\)\?Copyright \+\(\(([cC])\) \+\)\?\(\(20\|19\)[0-9][0-9]\) \+\([^ ].*\)$/\1 C3pyright#\5#\7/' \
  -e 's/^Copyright \(\(20\|19\)[0-9][0-9]\) \+\([^ ].*\)$/C4pyright#\1#\3/' \
  -i \
  "${FILES[@]}"

echo ">>> untouched Copyright lines"
git grep Copyright "${FILES[@]}"

echo ">>> Copyright lines with unusual extra"
git grep '\<C[0-9]pyright#' "${FILES[@]}" | grep -i reserved

sed \
  -e 's/\<C[0-9]pyright#\([^#]*\)#\(.*\)$/Copyright (C) \1 \2/' \
  -i \
  "${FILES[@]}"

```

https://gitlab.freedesktop.org/NetworkManager/NetworkManager/merge_requests/298
2019-10-02 17:03:52 +02:00
Iñigo Martínez
7e1aacaef2 meson: Remove tests related to check_so_symbols
These tests are already working since 19a718bc1 so `FIXME` comments
are not needed anymore.
2019-10-01 09:49:33 +02:00
Iñigo Martínez
509706b62b meson: Avoid the creation of an extra variable
An extra variable is used for sources of
`libnm-settings-plugin-ifupdown` module. However, it only contains
one source file and using it directly avoiding the creation of the
extra variable doesn't hurt readibility.
2019-10-01 09:49:33 +02:00
Iñigo Martínez
146348199e meson: Remove unused variable 2019-10-01 09:49:33 +02:00
Iñigo Martínez
a010fcb5f7 meson: Move network-config directory creation to main install file
The `ifcfg-rh` meson build file installs a new post install script
to create the `network-config` directory.

This has been moved to the main post install file so it's easier to
find because all post install steps are together and it avoids and
extra post install script execution.
2019-10-01 09:49:33 +02:00
Iñigo Martínez
f5f9c071ba meson: Improve ifcfg-rh plugin build
The file has been fixed to be consistent with the rest of the files.
The data files to be installed have been grouped together. The
sourc files has been listed vertically and the link target in
`nm-settings-plugin-ifcfg-rh` does not use an array anymore.
2019-10-01 09:49:33 +02:00
Iñigo Martínez
31f1516760 meson: Improve the src build file
The targets that involve the use of the `NetworkManager` library,
built in the `src` build file have been improved by applying a set
of changes:

- Indentation has been fixed.
- Set of objects used in targets have been grouped together.
- Aritificial dependencies used to group dependencies and custom
  compiler flags have been removed and their use replaced with
  proper dependencies and compiler flags to avoid any confussion.
2019-10-01 09:49:33 +02:00
Iñigo Martínez
f427f4771e meson: Improve the libnm-core build file
The `libnm-core` build file has been improved by applying a set of
changes:

- Indentation has been fixed to be consistent.
- Library variable names have been changed to `lib{name}` pattern
  following their filename pattern.
- `shared` prefix has been removed from all variables using it.
- Dependencies have been reviewed to store the necessary data.
- The use of the libraries and dependencies created in this file
  has been reviewed through the entire source code. This has
  required the addition or the removal of different libraries and
  dependencies in different targets.
- Some files used directly with the `files` function have been moved
  to their nearest path build file because meson stores their full
  path seamessly and they can be used anywhere later.
2019-10-01 09:49:33 +02:00
Iñigo Martínez
70a34c54fe meson: Use dependency for nm-default header
The `nm-default.h` header is used widely in the code by many
targets. This header includes different headers and needs different
libraries depending the compilation flags.

A new set of `*nm_default_dep` dependencies have been created to
ease the inclusion of different directorires and libraries.

This allows cleaner build files and avoiding linking unnecessary
libraries so this has been applied allowing the removal of some
dependencies involving the linking of unnecessary libraries.
2019-10-01 09:49:33 +02:00
Thomas Haller
abff46cacf all: manually drop code comments with file description 2019-10-01 07:50:52 +02:00
Thomas Haller
7df769600b settings: fix creation of default-wired-connection in device_realized()
Fixes-test: @allow_wired_connections

Fixes: 3e39d2a586 ('settings: shortcut check for whether to create auto-default wired connection')
2019-09-27 09:12:35 +02:00
Thomas Haller
9cec6a1bc1 core: log why no "auto-default" connection was created
Add trace logging to aid debugging.
2019-09-26 19:33:05 +02:00
Thomas Haller
2a506d8a09 settings: drop redundant check from have_connection_for_device()
have_connection_for_device() really should just call nm_device_check_connection_compatible().
Note that nm_device_check_connection_compatible() of course checks the
connection type already, so this is redundant.
2019-09-23 13:13:23 +02:00
Thomas Haller
3e39d2a586 settings: shortcut check for whether to create auto-default wired connection
This check is only useful for devices that implement new_default_connection.
We can shortcut the possibly expensive checks like have_connection_for_device(),
which need to iterate all profiles.
2019-09-23 13:13:23 +02:00
Thomas Haller
5aa50d7c87 core: fix wrongly generating "Wired connection 1" (auto-default) for ethernet with MAC
If a profile has only "ethernet.mac-address" set, but
"connection.interface-name" not, then the previous check

    iface = nm_setting_connection_get_interface_name (s_con);
    if (!nm_streq0 (iface, nm_device_get_iface (device)))
         continue;

would wrongly consider the profile not matching for the device.
As a result, we would wrongly create a auto-default connection.

Fix that. We already call nm_device_check_connection_compatible()
above. That is fully suitable to compare the interface name and
the MAC address. We don't need to duplicate this check (wrongly).

See also commit 77d01c9094 ('settings: ignore incompatible connections
when looking for existing ones') for how this code changed.

https://bugzilla.redhat.com/show_bug.cgi?id=1727909
2019-09-23 13:13:23 +02:00
Thomas Haller
eae69e33dd core: extend nm_shutdown_wait_obj_*() to support notification via a GCancellable
Now nm_shutdown_wait_obj_*() supports two styles:

 - NM_SHUTDOWN_WAIT_TYPE_OBJECT: this just registers a weak pointer
   on a source GObject. As long as the object is not destroyed
   (and the object is not unregistered), the shutdown gets blocked.

 - now new is NM_SHUTDOWN_WAIT_TYPE_CANCELLABLE: this source object
   is a GCancellable, and during shutdown, the system will cancel
   the instances to notify about the shutdown. That aside, the GCancellable
   is tracked exactly like a regular NM_SHUTDOWN_WAIT_TYPE_OBJECT (meaning:
   a weak pointer is registered and shutdown gets delayed as long as the instance
   lives).

As the rest of the shutdown, it's not yet implemented on the shutdown-side.
What is now possible is to register such cancellables, so that users can make
use of this API before we fix shutdown. We cannot fix it all at the same time,
so first users must be ready for this approach.
2019-09-22 16:05:50 +02:00