wwan: let systemd manage the ModemManager life-cycle (rh #1018017)
This commit is contained in:
parent
853145abcf
commit
29e938dcd1
282
0073-rh1018017-let-systemd-manage-mm.patch
Normal file
282
0073-rh1018017-let-systemd-manage-mm.patch
Normal file
@ -0,0 +1,282 @@
|
|||||||
|
From 3b76ae18a52b44dbe577557e038fdc263edc5715 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Aleksander Morgado <aleksander@lanedo.com>
|
||||||
|
Date: Thu, 31 Oct 2013 09:14:13 +0100
|
||||||
|
Subject: [PATCH] modem-manager: if building systemd support, assume it manages
|
||||||
|
the MM lifecycle
|
||||||
|
|
||||||
|
We will not explicitly poke MM to start it if NetworkManager is built with
|
||||||
|
systemd support.
|
||||||
|
|
||||||
|
https://bugzilla.gnome.org/show_bug.cgi?id=703040
|
||||||
|
---
|
||||||
|
configure.ac | 3 ++
|
||||||
|
src/modem-manager/nm-modem-manager.c | 71 ++++++++++++++++++++++--------------
|
||||||
|
2 files changed, 47 insertions(+), 27 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/configure.ac b/configure.ac
|
||||||
|
index 174b6bf..895ab09 100644
|
||||||
|
--- a/configure.ac
|
||||||
|
+++ b/configure.ac
|
||||||
|
@@ -300,14 +300,17 @@ AC_ARG_WITH([systemdsystemunitdir], AS_HELP_STRING([--with-systemdsystemunitdir=
|
||||||
|
AS_IF([test -z "$with_systemdsystemunitdir" && $PKG_CONFIG systemd],
|
||||||
|
with_systemdsystemunitdir="\$(prefix)/lib/systemd/system")
|
||||||
|
AS_IF([test -z "$with_systemdsystemunitdir"], with_systemdsystemunitdir=no)
|
||||||
|
# add conditional and subst
|
||||||
|
AM_CONDITIONAL(HAVE_SYSTEMD, [test "$with_systemdsystemunitdir" != no])
|
||||||
|
if test "$with_systemdsystemunitdir" != no; then
|
||||||
|
AC_SUBST([systemdsystemunitdir], [$with_systemdsystemunitdir])
|
||||||
|
+ AC_DEFINE(HAVE_SYSTEMD, 1, [Define if systemd support is available])
|
||||||
|
+else
|
||||||
|
+ AC_DEFINE(HAVE_SYSTEMD, 0, [Define if systemd support is available])
|
||||||
|
fi
|
||||||
|
|
||||||
|
PKG_CHECK_MODULES(SYSTEMD_200, [systemd >= 200], [have_systemd_200=yes],[have_systemd_200=no])
|
||||||
|
AM_CONDITIONAL(HAVE_SYSTEMD_200, test "${have_systemd_200}" = "yes")
|
||||||
|
|
||||||
|
# session tracking support
|
||||||
|
AC_MSG_CHECKING([Session tracking support])
|
||||||
|
diff --git a/src/modem-manager/nm-modem-manager.c b/src/modem-manager/nm-modem-manager.c
|
||||||
|
index 427d98c..bb85b77 100644
|
||||||
|
--- a/src/modem-manager/nm-modem-manager.c
|
||||||
|
+++ b/src/modem-manager/nm-modem-manager.c
|
||||||
|
@@ -45,15 +45,15 @@ struct _NMModemManagerPrivate {
|
||||||
|
DBusGProxy *proxy;
|
||||||
|
guint poke_id;
|
||||||
|
|
||||||
|
#if WITH_MODEM_MANAGER_1
|
||||||
|
/* ModemManager >= 0.7 */
|
||||||
|
GDBusConnection *dbus_connection;
|
||||||
|
MMManager *modem_manager_1;
|
||||||
|
- guint modem_manager_1_poke_id;
|
||||||
|
+ guint modem_manager_1_launch_id;
|
||||||
|
gboolean old_modem_manager_found;
|
||||||
|
gboolean new_modem_manager_found;
|
||||||
|
guint modem_manager_1_name_owner_changed_id;
|
||||||
|
guint modem_manager_1_object_added_id;
|
||||||
|
guint modem_manager_1_object_removed_id;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
@@ -355,17 +355,17 @@ modem_manager_1_clear_signals (NMModemManager *self)
|
||||||
|
self->priv->modem_manager_1_object_removed_id = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
clear_modem_manager_1_support (NMModemManager *self)
|
||||||
|
{
|
||||||
|
- if (self->priv->modem_manager_1_poke_id) {
|
||||||
|
- g_source_remove (self->priv->modem_manager_1_poke_id);
|
||||||
|
- self->priv->modem_manager_1_poke_id = 0;
|
||||||
|
+ if (self->priv->modem_manager_1_launch_id) {
|
||||||
|
+ g_source_remove (self->priv->modem_manager_1_launch_id);
|
||||||
|
+ self->priv->modem_manager_1_launch_id = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
modem_manager_1_clear_signals (self);
|
||||||
|
g_clear_object (&self->priv->modem_manager_1);
|
||||||
|
g_clear_object (&self->priv->dbus_connection);
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -458,23 +458,28 @@ static void
|
||||||
|
modem_manager_1_name_owner_changed (MMManager *modem_manager_1,
|
||||||
|
GParamSpec *pspec,
|
||||||
|
NMModemManager *self)
|
||||||
|
{
|
||||||
|
gchar *name_owner;
|
||||||
|
|
||||||
|
/* Quit poking, if any */
|
||||||
|
- if (self->priv->modem_manager_1_poke_id) {
|
||||||
|
- g_source_remove (self->priv->modem_manager_1_poke_id);
|
||||||
|
- self->priv->modem_manager_1_poke_id = 0;
|
||||||
|
+ if (self->priv->modem_manager_1_launch_id) {
|
||||||
|
+ g_source_remove (self->priv->modem_manager_1_launch_id);
|
||||||
|
+ self->priv->modem_manager_1_launch_id = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
name_owner = g_dbus_object_manager_client_get_name_owner (G_DBUS_OBJECT_MANAGER_CLIENT (modem_manager_1));
|
||||||
|
if (!name_owner) {
|
||||||
|
nm_log_info (LOGD_MB, "ModemManager disappeared from bus");
|
||||||
|
+
|
||||||
|
+#if !HAVE_SYSTEMD
|
||||||
|
+ /* If not managed by systemd, schedule relaunch */
|
||||||
|
schedule_modem_manager_1_relaunch (self, 0);
|
||||||
|
+#endif
|
||||||
|
+
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Available! */
|
||||||
|
g_free (name_owner);
|
||||||
|
|
||||||
|
/* Hack alert: GDBusObjectManagerClient won't signal neither 'object-added'
|
||||||
|
@@ -486,14 +491,16 @@ modem_manager_1_name_owner_changed (MMManager *modem_manager_1,
|
||||||
|
ensure_client (self);
|
||||||
|
|
||||||
|
/* Whenever GDBusObjectManagerClient is fixed, we can just do the following:
|
||||||
|
* modem_manager_1_available (self);
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
|
||||||
|
+#if !HAVE_SYSTEMD
|
||||||
|
+
|
||||||
|
static void
|
||||||
|
modem_manager_1_poke_cb (GDBusConnection *connection,
|
||||||
|
GAsyncResult *res,
|
||||||
|
NMModemManager *self)
|
||||||
|
{
|
||||||
|
GError *error = NULL;
|
||||||
|
GVariant *result;
|
||||||
|
@@ -519,40 +526,50 @@ modem_manager_1_poke_cb (GDBusConnection *connection,
|
||||||
|
/* Balance refcount */
|
||||||
|
g_object_unref (self);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
modem_manager_1_poke (NMModemManager *self)
|
||||||
|
{
|
||||||
|
- gchar *name_owner;
|
||||||
|
-
|
||||||
|
/* If there is no current owner right away, ensure we poke to get one */
|
||||||
|
- name_owner = g_dbus_object_manager_client_get_name_owner (G_DBUS_OBJECT_MANAGER_CLIENT (self->priv->modem_manager_1));
|
||||||
|
- if (name_owner) {
|
||||||
|
- /* Available! */
|
||||||
|
- modem_manager_1_available (self);
|
||||||
|
- g_free (name_owner);
|
||||||
|
- return;
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
- /* Poke! */
|
||||||
|
g_dbus_connection_call (self->priv->dbus_connection,
|
||||||
|
"org.freedesktop.ModemManager1",
|
||||||
|
"/org/freedesktop/ModemManager1",
|
||||||
|
"org.freedesktop.DBus.Peer",
|
||||||
|
"Ping",
|
||||||
|
NULL, /* inputs */
|
||||||
|
NULL, /* outputs */
|
||||||
|
G_DBUS_CALL_FLAGS_NONE,
|
||||||
|
-1,
|
||||||
|
NULL, /* cancellable */
|
||||||
|
(GAsyncReadyCallback)modem_manager_1_poke_cb, /* callback */
|
||||||
|
g_object_ref (self)); /* user_data */
|
||||||
|
}
|
||||||
|
|
||||||
|
+#endif /* HAVE_SYSTEMD */
|
||||||
|
+
|
||||||
|
+static void
|
||||||
|
+modem_manager_1_check_name_owner (NMModemManager *self)
|
||||||
|
+{
|
||||||
|
+ gchar *name_owner;
|
||||||
|
+
|
||||||
|
+ name_owner = g_dbus_object_manager_client_get_name_owner (G_DBUS_OBJECT_MANAGER_CLIENT (self->priv->modem_manager_1));
|
||||||
|
+ if (name_owner) {
|
||||||
|
+ /* Available! */
|
||||||
|
+ modem_manager_1_available (self);
|
||||||
|
+ g_free (name_owner);
|
||||||
|
+ return;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+#if !HAVE_SYSTEMD
|
||||||
|
+ /* If the lifecycle is not managed by systemd, poke */
|
||||||
|
+ modem_manager_1_poke (self);
|
||||||
|
+#endif
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
static void
|
||||||
|
manager_new_ready (GObject *source,
|
||||||
|
GAsyncResult *res,
|
||||||
|
NMModemManager *self)
|
||||||
|
{
|
||||||
|
/* Note we always get an extra reference to self here */
|
||||||
|
|
||||||
|
@@ -584,16 +601,16 @@ manager_new_ready (GObject *source,
|
||||||
|
G_CALLBACK (modem_object_added),
|
||||||
|
self);
|
||||||
|
self->priv->modem_manager_1_object_removed_id =
|
||||||
|
g_signal_connect (self->priv->modem_manager_1,
|
||||||
|
"object-removed",
|
||||||
|
G_CALLBACK (modem_object_removed),
|
||||||
|
self);
|
||||||
|
- /* Poke the MMManager! */
|
||||||
|
- modem_manager_1_poke (self);
|
||||||
|
+
|
||||||
|
+ modem_manager_1_check_name_owner (self);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Balance refcount */
|
||||||
|
g_object_unref (self);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
@@ -609,16 +626,16 @@ ensure_client (NMModemManager *self)
|
||||||
|
G_DBUS_OBJECT_MANAGER_CLIENT_FLAGS_DO_NOT_AUTO_START,
|
||||||
|
NULL,
|
||||||
|
(GAsyncReadyCallback)manager_new_ready,
|
||||||
|
g_object_ref (self));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
- /* If already available, poke! */
|
||||||
|
- modem_manager_1_poke (self);
|
||||||
|
+ /* If already available, recheck name owner! */
|
||||||
|
+ modem_manager_1_check_name_owner (self);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
bus_get_ready (GObject *source,
|
||||||
|
GAsyncResult *res,
|
||||||
|
NMModemManager *self)
|
||||||
|
{
|
||||||
|
@@ -632,27 +649,27 @@ bus_get_ready (GObject *source,
|
||||||
|
g_error_free (error);
|
||||||
|
/* Setup timeout to relaunch */
|
||||||
|
schedule_modem_manager_1_relaunch (self, MODEM_POKE_INTERVAL);
|
||||||
|
} else if (self->priv->old_modem_manager_found) {
|
||||||
|
/* If we found the old MM, abort */
|
||||||
|
clear_modem_manager_1_support (self);
|
||||||
|
} else {
|
||||||
|
- /* Got the bus, create new ModemManager client. */
|
||||||
|
+ /* Got the bus, ensure client */
|
||||||
|
ensure_client (self);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Balance refcount */
|
||||||
|
g_object_unref (self);
|
||||||
|
}
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
ensure_bus (NMModemManager *self)
|
||||||
|
{
|
||||||
|
- /* Clear poke ID */
|
||||||
|
- self->priv->modem_manager_1_poke_id = 0;
|
||||||
|
+ /* Clear launch ID */
|
||||||
|
+ self->priv->modem_manager_1_launch_id = 0;
|
||||||
|
|
||||||
|
if (!self->priv->dbus_connection)
|
||||||
|
g_bus_get (G_BUS_TYPE_SYSTEM,
|
||||||
|
NULL,
|
||||||
|
(GAsyncReadyCallback)bus_get_ready,
|
||||||
|
g_object_ref (self));
|
||||||
|
else
|
||||||
|
@@ -666,17 +683,17 @@ static void
|
||||||
|
schedule_modem_manager_1_relaunch (NMModemManager *self,
|
||||||
|
guint n_seconds)
|
||||||
|
{
|
||||||
|
/* No need to pass an extra reference to self; timeout/idle will be
|
||||||
|
* cancelled if the object gets disposed. */
|
||||||
|
|
||||||
|
if (n_seconds)
|
||||||
|
- self->priv->modem_manager_1_poke_id = g_timeout_add_seconds (n_seconds, (GSourceFunc)ensure_bus, self);
|
||||||
|
+ self->priv->modem_manager_1_launch_id = g_timeout_add_seconds (n_seconds, (GSourceFunc)ensure_bus, self);
|
||||||
|
else
|
||||||
|
- self->priv->modem_manager_1_poke_id = g_idle_add ((GSourceFunc)ensure_bus, self);
|
||||||
|
+ self->priv->modem_manager_1_launch_id = g_idle_add ((GSourceFunc)ensure_bus, self);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* WITH_MODEM_MANAGER_1 */
|
||||||
|
|
||||||
|
/************************************************************************/
|
||||||
|
|
||||||
|
static void
|
||||||
|
--
|
||||||
|
1.9.3
|
||||||
|
|
@ -46,7 +46,7 @@ Name: NetworkManager
|
|||||||
Summary: Network connection manager and user applications
|
Summary: Network connection manager and user applications
|
||||||
Epoch: 1
|
Epoch: 1
|
||||||
Version: 0.9.9.0
|
Version: 0.9.9.0
|
||||||
Release: 42%{snapshot}%{?dist}
|
Release: 43%{snapshot}%{?dist}
|
||||||
Group: System Environment/Base
|
Group: System Environment/Base
|
||||||
License: GPLv2+
|
License: GPLv2+
|
||||||
URL: http://www.gnome.org/projects/NetworkManager/
|
URL: http://www.gnome.org/projects/NetworkManager/
|
||||||
@ -128,6 +128,7 @@ Patch69: 0069-rh1115538-fix-supplicant-crash-for-AddBlob.patch
|
|||||||
Patch70: 0070-rh1047083-handle-mtu-for-ip4-config-merge-and-subtract.patch
|
Patch70: 0070-rh1047083-handle-mtu-for-ip4-config-merge-and-subtract.patch
|
||||||
Patch71: 0071-fix-connectivity-notification.patch
|
Patch71: 0071-fix-connectivity-notification.patch
|
||||||
Patch72: 0072-rh1010288-nm_client_new-fix.patch
|
Patch72: 0072-rh1010288-nm_client_new-fix.patch
|
||||||
|
Patch73: 0073-rh1018017-let-systemd-manage-mm.patch
|
||||||
|
|
||||||
BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
|
BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
|
||||||
|
|
||||||
@ -374,6 +375,7 @@ by nm-connection-editor and nm-applet in a non-graphical environment.
|
|||||||
%patch70 -p1 -b .0070-rh1047083-handle-mtu-for-ip4-config-merge-and-subtract.orig
|
%patch70 -p1 -b .0070-rh1047083-handle-mtu-for-ip4-config-merge-and-subtract.orig
|
||||||
%patch71 -p1 -b .0071-fix-connectivity-notification.orig
|
%patch71 -p1 -b .0071-fix-connectivity-notification.orig
|
||||||
%patch72 -p1 -b .0072-rh1010288-nm_client_new-fix.orig
|
%patch72 -p1 -b .0072-rh1010288-nm_client_new-fix.orig
|
||||||
|
%patch73 -p1 -b .0073-rh1018017-let-systemd-manage-mm.orig
|
||||||
|
|
||||||
%build
|
%build
|
||||||
|
|
||||||
@ -607,6 +609,9 @@ fi
|
|||||||
%endif
|
%endif
|
||||||
|
|
||||||
%changelog
|
%changelog
|
||||||
|
* Tue Jul 29 2014 Dan Williams <dcbw@redhat.com> - 0.9.9.0-43.git20131003
|
||||||
|
- wwan: let systemd manage the ModemManager life-cycle (rh #1018017)
|
||||||
|
|
||||||
* Thu Jul 24 2014 Jiří Klimeš <jklimes@redhat.com> - 0.9.9.0-42.git20131003
|
* Thu Jul 24 2014 Jiří Klimeš <jklimes@redhat.com> - 0.9.9.0-42.git20131003
|
||||||
- libnm-glib: fix a crash in nm_client_new() (rh #1010288) (rh #1122593)
|
- libnm-glib: fix a crash in nm_client_new() (rh #1010288) (rh #1122593)
|
||||||
- manager: fix notification of the connectivity property
|
- manager: fix notification of the connectivity property
|
||||||
|
Loading…
Reference in New Issue
Block a user