Commit graph

312 commits

Author SHA1 Message Date
Thomas Haller
b54d695e98 libnm/gtk-doc: fix transfer-none annotation for nm_settings_get_connections()
Fixes: 6e54057bf7
2018-12-30 15:17:11 +01:00
Thomas Haller
793afb7d95 core: improve logging why startup-complete is blocked
Before:

    "manager: check_if_startup_complete returns FALSE because of eth0"

Now:

    "manager: startup complete is waiting for device 'eth0' (autoactivate)"

Also, the logging line is now more a human readable sentence, but still
follows the same pattern as later

    "manager: startup complete"

Meaning: grepping for "startup complete" becomes more helpful because
one first finds the reasons why startup-complete is not yet reached,
followed by the moment when it is reached.
2018-09-19 17:51:01 +02:00
Thomas Haller
0ea810fa96 settings: cleanup loading settings plugins
Drop the unnecessary @list argument and various cleanups.
2018-09-06 07:41:22 +02:00
Thomas Haller
dd5244af3e settings: disconnect signals from plugins when destroying NMSettings
Currently we anyway leak everything on shutdown, so this doesn't matter.
But to be correct, we must disconnect signal handlers.
2018-09-06 07:41:22 +02:00
Thomas Haller
32442b2661 settings: drop unused get_plugin() checks
Nowadays, keyfile settings plugin is always loaded. Hence,
this function never returns %NULL and the checks always
evalute the the same.
2018-09-06 07:41:22 +02:00
Thomas Haller
194e7f8df6 settings: rename NMSettingsPluginInterface.init() to initialize()
The virtual function init() naturally leads to calling the wrapper
function nm_settings_plugin_init(). However, such ${TYPE}_init() functions
are generated by G_DEFINE_TYPE().

Rename to avoid the naming conflict, which will matter next, when the
interface will be converted to a regular GObject class.

Note that while these are settings plugin, there is no public
or stable API which we need to preserve.
2018-09-06 07:41:22 +02:00
Thomas Haller
38273a8871 settings: use delegation instead of inheritance for NMSettingsConnection and NMConnection
NMConnection is an interface, which is implemented by the types
NMSimpleConnection (libnm-core), NMSettingsConnection (src) and
NMRemoteConnection (libnm).

NMSettingsConnection does a lot of things already:

  1) it "is-a" NMDBusObject and exports the API of a connection profile
     on D-Bus
  2) it interacts with NMSettings and contains functionality
     for tracking the profiles.
  3) it is the base-class of types like NMSKeyfileConnection and
     NMIfcfgConnection. These handle how the profile is persisted
     on disk.
  4) it implements NMConnection interface, to itself track the
     settings of the profile.

3) and 4) would be better implemented via delegation than inheritance.

Address 4) and don't let NMSettingsConnection implemente the NMConnection
interface. Instead, a settings-connection references now a NMSimpleConnection
instance, to which it delegates for keeping the actual profiles.

Advantages:

  - by delegating, there is a clearer separation of what
    NMSettingsConnection does. For example, in C we often required
    casts from NMSettingsConnection to NMConnection. NMConnection
    is a very trivial object with very little logic. When we have
    a NMConnection instance at hand, it's good to know that it is
    *only* that simple instead of also being an entire
    NMSettingsConnection instance.

    The main purpose of this patch is to simplify the code by separating
    the NMConnection from the NMSettingsConnection. We should generally
    be aware whether we handle a NMSettingsConnection or a trivial
    NMConnection instance. Now, because NMSettingsConnection no longer
    "is-a" NMConnection, this distinction is apparent.

  - NMConnection is implemented as an interface and we create
    NMSimpleConnection instances whenever we need a real instance.
    In GLib, interfaces have a performance overhead, that we needlessly
    pay all the time. With this change, we no longer require
    NMConnection to be an interface. Thus, in the future we could compile
    a version of libnm-core for the daemon, where NMConnection is not an
    interface but a GObject implementation akin to NMSimpleConnection.

  - In the previous implementation, we cannot treat NMConnection immutable
    and copy-on-write.
    For example, when NMDevice needs a snapshot of the activated
    profile as applied-connection, all it can do is clone the entire
    NMSettingsConnection as a NMSimpleConnection.
    Likewise, when we get a NMConnection instance and want to keep
    a reference to it, we cannot do that, because we never know
    who also references and modifies the instance.
    By separating NMSettingsConnection we could in the future have
    NMConnection immutable and copy-on-write, to avoid all unnecessary
    clones.
2018-08-28 22:27:55 +02:00
Thomas Haller
33a88ca566 core: give better error reason why device is incompatible with profile
Note the special error codes  NM_UTILS_ERROR_CONNECTION_AVAILABLE_*.
This will be used to determine, whether the profile is fundamentally
incompatible with the device, or whether just some other properties
mismatch. That information will be importand during a plain `nmcli
connection up`, where NetworkManager searches all devices for a device
to activate. If no device is found (and multiple errors happened),
we want to show the error that is most likely relevant for the user.

Also note, how NMDevice's check_connection_compatible() uses the new
class field "device_class->connection_type_check_compatible" to simplify
checks for compatible profiles.

The error reason is still unused.
2018-07-24 09:39:09 +02:00
Beniamino Galvani
3fb4eed3ef settings: let connections keep NMSettings alive
The NMSettings instance can't be disposed while there is any exported
connection. Ideally we should unexport all connections on NMSettings'
disposal, but for now leak @self on termination when there are
connections alive.

This fixes the following bug on shutdown:

 assertion failed: (c_list_is_empty (&priv->connections_lst_head))
 #0  raise () from target:/lib64/libc.so.6
 #1  abort () from target:/lib64/libc.so.6
 #2  g_assertion_message (domain=0x66cab2 "NetworkManager", file=0x6a5e48 "src/settings/nm-settings.c", line=1929)
 #3  g_assertion_message_expr () at gtestutils.c:2555
 #4  finalize (object=0x1dab170) at src/settings/nm-settings.c:1929
 #5  g_object_unref (_object=0x1dab170) at gobject.c:3340
 #6  dispose (object=0x1de50b0) at src/nm-manager.c:7139
 #7  g_object_unref (_object=0x1de50b0) at gobject.c:3303
 #8  _nm_singleton_instance_destroy () at src/nm-core-utils.c:138
 #9  _dl_fini () from target:/lib64/ld-linux-x86-64.so.2
 #10 __run_exit_handlers () from target:/lib64/libc.so.6
 #11 exit () from target:/lib64/libc.so.6
 #12 main (argc=<optimized out>, argv=<optimized out>) at src/main.c:460

https://bugzilla.redhat.com/show_bug.cgi?id=1579858
2018-06-03 16:46:48 +02:00
Beniamino Galvani
a1f1b13f4f settings: fix plugins loading
Since load_plugin() modifies the list, we must pass its address.

Fixes: fd86a1aebb
2018-06-01 10:26:01 +02:00
Lubomir Rintel
0112253064 settings: do away with plugin capabilities
There's exactly one and not too useful -- only used only in one spot
where we can do hapilly without it.
2018-05-31 11:50:02 +02:00
Lubomir Rintel
8b6c998a94 settings: don't use the name property to disambiguate plugins
Use the path instead. This drop an useless use of the "name" property,
which is, coincidentally also wrong. (We use "ibft" in the plugin path
whereas the property is set to "iBFT".)
2018-05-31 11:50:02 +02:00
Lubomir Rintel
159cb0302c settings: simplify the settings plugin loading log line
It's actually annoying, useless and wraps over even on wide displays.
Let's make it consistent with the log line we use for device plugins.

Also, this drops the last use of the "info" property and one useless use
of the "name" property.
2018-05-31 11:50:02 +02:00
Lubomir Rintel
fd86a1aebb settings: refactor load_plugins() to remote a harmful use of goto
Turn the plugin loading logic between load_plugin: and next: into a
subroutine.
2018-05-31 11:50:02 +02:00
Thomas Haller
feb1ec1e87 settings: avoid lookup in nm_settings_has_connection()
There is no need to perform a lookup by path. NMSettings is a singleton,
it has the connection exactly iff the connection is linked.

Also add an assertion to double-check that the results agree with
the previous implementation.
2018-04-30 16:36:29 +02:00
Thomas Haller
8b5f641211 settings: pass in authentication subject to nm_settings_add_connection_dbus()
nm_settings_add_connection_dbus() has two callers. One of them is NMManager
during AddAndActivate. In this case, the NMActiveConnection already created
an auth-subject. Re-use it.

Note how creating an auth-subject involves reading procfs to determine
whether the process still exists. This is not about the additional
overhead of that, but about the race where the process could drop
of in the meantime. The calling process might be gone now, and we would
fail creating the auth-subject. There is no need for that, because we
already evaluated all information we need. Quite likely, in the case
of this race, PolicyKit will also determine that the process is gone
and fail authorization too. But that's PolicyKit's decision to make,
not nm_settings_add_connection_dbus()'s.
2018-04-24 10:25:26 +02:00
Beniamino Galvani
aca671fff0 all: replace "it's" with "its" where needed 2018-04-18 14:14:07 +02:00
Thomas Haller
aa86327e45 core: cleanup code by using nm_auth_is_subject_in_acl_set_error() 2018-04-18 07:55:15 +02:00
Thomas Haller
8df245d773 settings: make NM_SETTINGS_CONNECTION_FLAGS property NM_SETTINGS_CONNECTION_FLAGS_CHANGED signal
For one, these flags are "internal" flags. Soon, we will gain
a new NMSettingsConnectionFlags type that is exported on D-Bus
and partly overlaps with these internal flags. However, then we
will need the "flags" properties to expose the public bits.

This property only exists because other parts are interested in
notification signals. Note that we encourage NMDbusObject types
to freeze/thaw property-changed notifications. As freezing the
notifications also delays the signals, this is not desired for
the purpose where internal users subscribe to the signal.
2018-04-16 15:30:07 +02:00
Thomas Haller
378833518a settings: return empty connections list on D-Bus util connections are loaded
We also don't emit the PropertiesChanged signal while connections are
not loaded. Maybe that is wrong, in any case, the property should agree
with the way how we emit notifications. So, for now, make the property
agree with not notifying about connections during startup.
2018-04-13 10:48:37 +02:00
Thomas Haller
e41db3fa55 settings: fix clearing agent-manager in NMSettings' dispose()
dispose() should be re-entrant. When releasing a resource, it must not
leave a dangling pointer. While at it, just move it to finalize() instead.
2018-04-13 10:34:43 +02:00
Thomas Haller
a92543d3b7 settings: use cleanup-attribute in send_agent_owned_secrets() 2018-04-13 10:34:42 +02:00
Thomas Haller
26a8d2a151 settings: fix leaking connection in NMSettings' connection_removed()
Also, take a reference of the NMSettingsConnection while
it is being tracked by NMSettings' list.

Fixes: 1f3b47deea
2018-04-13 10:34:03 +02:00
Thomas Haller
50b74731f6 auth-chain/trivial: rename nm_auth_chain_unref() to nm_auth_chain_destroy()
NMAuthChain is not really ref-counted. True, we have an internal ref-counter
to ensure that the instance stays alive while the callback is invoked. However,
the user cannot take additional references as there is no nm_auth_chain_ref().

When the user wants to get rid of the auth-chain, with the current API it
is important that the callback won't be called after that point. From the
name nm_auth_chain_unref(), it sounds like that there could be multiple references
to the auth-chain, and merely unreferencing the object might not guarantee that
the callback is canceled. However, that is luckily not the case, because
there is no real ref-counting involved here.

Just rename the destroy function to make this clearer.
2018-04-13 09:09:46 +02:00
Thomas Haller
4127f1234f settings: track connections via CList 2018-04-13 09:09:46 +02:00
Thomas Haller
7595b4f1c7 settings: don't let connection keep NMSettings alive
NMSettings already references NMSettingsConnection. Hence, it should not
at the same time reference itself. Arguably, during shutdown we do not properly
release all NMSettingsConnection. For example, there is no nm_settings_stop().
But that is a bug that needs fixing.

No need to keep the NMSettings instance alive here. If this is really
necessary, it needs fixing somewhere else. Besides, we know that we leak
a lot during shutdown, so this needs more work to do a clean shutdown.
2018-04-13 09:09:46 +02:00
Thomas Haller
1f3b47deea settings: reorder D-Bus events when removing settings-connection
It makes more sense to me this way.
2018-04-13 09:09:46 +02:00
Thomas Haller
a5e9980b34 core: use nm_dbus_utils_g_value_set_object_path_from_hash() 2018-04-13 09:09:46 +02:00
Thomas Haller
755c8bb30f settings: no longer call nm_connection_set_path() in server
It's unused.
2018-04-13 09:09:46 +02:00
Thomas Haller
b0bf9b2b9b core: explicitly pass D-Bus path to nm_utils_log_connection_diff()
No longer rely on nm_connection_get_path() being meaningful in server.
It also was wrong. During update, nm_settings_connection_update()
would call
  nm_utils_log_connection_diff (replace_connection, NM_CONNECTION (self), ...
where replace_connection has no path set, and nothing was logged.

Fix it, by explicitly passing the D-Bus path. Also, because
nm-core-utils.c should be independent of nm-dbus-object.h.
2018-04-13 09:09:46 +02:00
Thomas Haller
9efa7c7220 core: use nm_dbus_object_get_path() instead of nm_connection_get_path()
Essentially, nm_connection_get_path() mirros nm_dbus_object_get_path().
However, when cloning a simple-connection, the path also gets cloned.

I think this field doesn't belong to NMConnection in the first place,
because NMConnection is not a D-Bus object. NMSettingsConnection (in
core) and NMRemoteConnection (in libnm) is.

Don't use the misleading alias, but use nm_dbus_object_get_path()
directly.
2018-04-13 09:09:46 +02:00
Thomas Haller
fdbf696f22 settings: clear connection path when unexporting from D-Bus
At that point, the path becomes meaningless. Clear it.
2018-04-13 09:09:46 +02:00
Thomas Haller
f41279ca1d settings: use cleanup attribute to keep connection alive during connection_removed() 2018-04-13 09:09:46 +02:00
Thomas Haller
213323a6a7 settings: fix unrefing setting is there are no plugins loaded
This wasn't a problem, because load_plugins() can only fails
if the settings plugins fail to load, which can only happen
if you have a broken installation.
2018-04-13 09:09:46 +02:00
Thomas Haller
8c56c47bba settings: handle default-wired-connection in connection-removed signal
Don't subscribe twice to the same signal. The more subscribers a
signal has, the more confusing it gets what is happening.

We can handle also the default-wired-connection in the regular
connection-removed signal.

Note how connection_removed() is registered with
g_signal_connect_after(), but that is fine. There are few subscribers
to this signal (that don't do anything that interferes here).
Especially, since all other subscribers subscribe with the same
priority (hence, are unordered). So, moving this task explicitly
to after, does not change any ordering guarantee -- in fact, it
ensures an ordering that was undefined previously. Anyway, it
doesn't matter.
2018-04-13 09:09:46 +02:00
Thomas Haller
c5457fcadb settings: invalidate pointers for debugging use of outdated connections_cached_list
connections_cached_list stays only valid until we remove/add connections
to NMSettings. Using the list without cloning requires to be aware of that.

When clearing the list, invalidate all pointers, in the hope that a following
use-after-free will blow up with an assertion.

We only do this in elevated assertion mode. It's not to prevent any bugs,
it's to better notice it.
2018-03-20 15:08:18 +01:00
Thomas Haller
57ab9fd60f core/dbus: rework creating numbered D-Bus export path by putting counter into class
I dislike the static hash table to cache the integer counter for
numbered paths. Let's instead cache the counter at the class instance
itself -- since the class contains the information how the export
path should be exported.

However, we cannot use a plain integer field inside the class structure,
because the class is copied between derived classes. For example,
NMDeviceEthernet and NMDeviceBridge both get a copy of the NMDeviceClass
instance. Hence, the class doesn't contain the counter directly, but
a pointer to one counter that can be shared between sibling classes.
2018-03-13 11:29:18 +01:00
Thomas Haller
297d4985ab core/dbus: rework D-Bus implementation to use lower layer GDBusConnection API
Previously, we used the generated GDBusInterfaceSkeleton types and glued
them via the NMExportedObject base class to our NM types. We also used
GDBusObjectManagerServer.

Don't do that anymore. The resulting code was more complicated despite (or
because?) using generated classes. It was hard to understand, complex, had
ordering-issues, and had a runtime and memory overhead.

This patch refactors this entirely and uses the lower layer API GDBusConnection
directly. It replaces the generated code, GDBusInterfaceSkeleton, and
GDBusObjectManagerServer. All this is now done by NMDbusObject and NMDBusManager
and static descriptor instances of type GDBusInterfaceInfo.

This adds a net plus of more then 1300 lines of hand written code. I claim
that this implementation is easier to understand. Note that previously we
also required extensive and complex glue code to bind our objects to the
generated skeleton objects. Instead, now glue our objects directly to
GDBusConnection. The result is more immediate and gets rid of layers of
code in between.
Now that the D-Bus glue us more under our control, we can address issus and
bottlenecks better, instead of adding code to bend the generated skeletons
to our needs.

Note that the current implementation now only supports one D-Bus connection.
That was effectively the case already, although there were places (and still are)
where the code pretends it could also support connections from a private socket.
We dropped private socket support mainly because it was unused, untested and
buggy, but also because GDBusObjectManagerServer could not export the same
objects on multiple connections. Now, it would be rather straight forward to
fix that and re-introduce ObjectManager on each private connection. But this
commit doesn't do that yet, and the new code intentionally supports only one
D-Bus connection.
Also, the D-Bus startup was simplified. There is no retry, either nm_dbus_manager_start()
succeeds, or it detects the initrd case. In the initrd case, bus manager never tries to
connect to D-Bus. Since the initrd scenario is not yet used/tested, this is good enough
for the moment. It could be easily extended later, for example with polling whether the
system bus appears (like was done previously). Also, restart of D-Bus daemon isn't
supported either -- just like before.

Note how NMDBusManager now implements the ObjectManager D-Bus interface
directly.

Also, this fixes race issues in the server, by no longer delaying
PropertiesChanged signals. NMExportedObject would collect changed
properties and send the signal out in idle_emit_properties_changed()
on idle. This messes up the ordering of change events w.r.t. other
signals and events on the bus. Note that not only NMExportedObject
messed up the ordering. Also the generated code would hook into
notify() and process change events in and idle handle, exhibiting the
same ordering issue too.
No longer do that. PropertiesChanged signals will be sent right away
by hooking into dispatch_properties_changed(). This means, changing
a property in quick succession will no longer be combined and is
guaranteed to emit signals for each individual state. Quite possibly
we emit now more PropertiesChanged signals then before.
However, we are now able to group a set of changes by using standard
g_object_freeze_notify()/g_object_thaw_notify(). We probably should
make more use of that.

Also, now that our signals are all handled in the right order, we
might find places where we still emit them in the wrong order. But that
is then due to the order in which our GObjects emit signals, not due
to an ill behavior of the D-Bus glue. Possibly we need to identify
such ordering issues and fix them.

Numbers (for contrib/rpm --without debug on x86_64):

- the patch changes the code size of NetworkManager by
  - 2809360 bytes
  + 2537528 bytes (-9.7%)

- Runtime measurements are harder because there is a large variance
  during testing. In other words, the numbers are not reproducible.
  Currently, the implementation performs no caching of GVariants at all,
  but it would be rather simple to add it, if that turns out to be
  useful.
  Anyway, without strong claim, it seems that the new form tends to
  perform slightly better. That would be no surprise.

  $ time (for i in {1..1000}; do nmcli >/dev/null || break; echo -n .;  done)
  - real    1m39.355s
  + real    1m37.432s

  $ time (for i in {1..2000}; do busctl call org.freedesktop.NetworkManager /org/freedesktop org.freedesktop.DBus.ObjectManager GetManagedObjects > /dev/null || break; echo -n .; done)
  - real    0m26.843s
  + real    0m25.281s

- Regarding RSS size, just looking at the processes in similar
  conditions, doesn't give a large difference. On my system they
  consume about 19MB RSS. It seems that the new version has a
  slightly smaller RSS size.
  - 19356 RSS
  + 18660 RSS
2018-03-12 18:37:08 +01:00
Thomas Haller
a1f37964f0 core: rename "nm-bus-manager.h" to "nm-dbus-manager.h"
The next commit will completely rework NMBusManager and replace
NMExportedObject by a new type NMDBusObject.

Originally, NMDBusObject was added along NMExportedObject to ease
the rework and have compilable, intermediate stages of refactoring. Now,
I think the new name is better, because NMDBusObject is very strongly related
to the bus manager and the old name NMExportedObject didn't make that
clear.

I also slighly prefer the name NMDBusObject over NMBusObject, hence
for consistancy, also rename NMBusManager to NMDBusManager.

This commit only renames the file for a nicer diff in the next commit.
It does not actually update the type name in sources. That will be done
later.
2018-03-12 18:03:07 +01:00
Thomas Haller
608dfacb0b core: fix leaking connection in impl_settings_add_connection_helper()
Fixes: 0f6baeef35
2018-02-28 12:13:39 +01:00
Thomas Haller
0474441e22 settings: drop unmaintained ifnet settings plugin of Gentoo
Even Gentoo disables this plugin since before 0.9.8 release
of NetworkManager. Time to say goodbye.

If somebody happens to show up to maintain it, we may resurrect it
later.

If "$distro_plugins=ifnet" was set, configure.ac would use that
to autodetect --with-hostname-persist=gentoo. Replace that autodetect
part by checking for /etc/gentoo-release file.
2017-12-21 10:50:33 +01:00
Thomas Haller
7deb3b4fb5 settings: drop unused define for HOSTNAME_FILE
Fixes: 5bfb7c3c89
2017-12-20 12:10:59 +01:00
Beniamino Galvani
98ac0f404e settings: avoid assertion when deleting connections
If a volatile connection is deleted by user when it was already being
deleted internally because the device vanished, we may hit the
following failed assertion:

 file src/settings/nm-settings-connection.c: line 2196
 (nm_settings_connection_signal_remove): should not be reached

The @removed flag keeps track of whether we already signaled the
connection removal. Instead of throwing an assertion if we try to emit
the signal again, just return without action because this can happen
in the situation described above.

While at it, remove the @allow_reuse argument from
nm_settings_connection_signal_remove(): we should never emit the
signal twice. Instead, we should reset the @removed flag when the
connection is added.

Fixes: a9384452ed

https://bugzilla.redhat.com/show_bug.cgi?id=1506552
2017-12-20 10:39:23 +01:00
Thomas Haller
0e1abe5ef3 settings: track visible state as regular connection flags
We already need to re-emit the notify::flags signal.
It's cumbersome to do this for boolean properties, so
re-use the flags to also track the visibility state.
2017-12-05 19:57:25 +01:00
Thomas Haller
e704e827c4 settings: add "connection-flags-changed" signal to connection
We will need to subscribe to changes to "flags" from NMManager.
2017-12-05 19:57:25 +01:00
Thomas Haller
8e172eb984 ifcfg-rh: move nm-inotify-helper to ifcfg-rh plugin
The helper is only used by ifcfg-rh. Move it to the plugin.
2017-12-05 19:57:24 +01:00
Thomas Haller
776c5f3893 settings: unify settings-update API (rename and merge) 2017-12-05 19:57:24 +01:00
Thomas Haller
46af70b508 policy: use "agent-registered" signal directly from NMAgentManager instead of NMSettings 2017-11-27 15:21:58 +01:00
Thomas Haller
c3cae3d0dc core: use #define for "agent-registered" signal name 2017-11-27 15:21:58 +01:00
Thomas Haller
51531c9539 core: merge nm_settings_get_connections_sorted() with nm_settings_get_connections_clone() 2017-11-27 14:04:11 +01:00