[gnome-control-center/ua-daemon] Show ESM status
- From: Robert Ancell <rancell src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-control-center/ua-daemon] Show ESM status
- Date: Mon, 29 Nov 2021 22:59:39 +0000 (UTC)
commit 5c23ea06795bc3590905258ae06d226e27c4ccfa
Author: Robert Ancell <robert ancell canonical com>
Date: Mon Nov 29 16:13:09 2021 +1300
Show ESM status
panels/info-overview/cc-info-overview-panel.c | 107 +++++++++++++++++++++
panels/info-overview/cc-info-overview-panel.ui | 14 +++
.../com.canonical.UbuntuAdvantage.xml | 23 +++++
panels/info-overview/meson.build | 8 ++
4 files changed, 152 insertions(+)
---
diff --git a/panels/info-overview/cc-info-overview-panel.c b/panels/info-overview/cc-info-overview-panel.c
index 6e832eb35..3a243f6ba 100644
--- a/panels/info-overview/cc-info-overview-panel.c
+++ b/panels/info-overview/cc-info-overview-panel.c
@@ -25,6 +25,7 @@
#include "cc-hostname-entry.h"
#include "cc-info-overview-resources.h"
+#include "cc-ua-daemon-generated.h"
#include "info-cleanup.h"
#include <glib.h>
@@ -59,6 +60,7 @@ struct _CcInfoOverviewPanel
GtkEntry *device_name_entry;
GtkWidget *rename_button;
CcListRow *disk_row;
+ GtkLabel *esm_label;
CcListRow *gnome_version_row;
CcListRow *graphics_row;
GtkListBox *hardware_box;
@@ -75,6 +77,11 @@ struct _CcInfoOverviewPanel
CcListRow *software_updates_row;
CcListRow *virtualization_row;
CcListRow *windowing_system_row;
+
+ GCancellable *cancellable;
+ GDBusObjectManager *ua_object_manager;
+ CcUaDaemonManager *manager; // FIXME: Not required?
+ CcUaDaemonService *esm_infra_service;
};
typedef struct
@@ -922,15 +929,111 @@ setup_os_logo (CcInfoOverviewPanel *panel)
gtk_image_set_from_gicon (panel->os_logo, icon, GTK_ICON_SIZE_INVALID);
}
+static void update_ubuntu_pro_status (CcInfoOverviewPanel *self)
+{
+ gboolean esm_infra_enabled = self->esm_infra_service != NULL && g_strcmp0 (cc_ua_daemon_service_get_status
(self->esm_infra_service), "enabled") == 0;
+
+ gtk_widget_set_visible (GTK_WIDGET (self->esm_label), esm_infra_enabled);
+}
+
+static void ua_daemon_object_added_cb (CcInfoOverviewPanel *self, GDBusObject *object)
+{
+ g_autoptr(CcUaDaemonManager) manager = NULL;
+ g_autoptr(CcUaDaemonService) service = NULL;
+
+ manager = cc_ua_daemon_object_get_manager (CC_UA_DAEMON_OBJECT (object));
+ if (manager != NULL) {
+ g_clear_object (&self->manager);
+ self->manager = g_steal_pointer(&manager);
+ g_signal_connect_swapped(self->manager, "notify::attached", G_CALLBACK(update_ubuntu_pro_status), self);
+ }
+
+ service = cc_ua_daemon_object_get_service (CC_UA_DAEMON_OBJECT (object));
+ if (service != NULL) {
+ const char *name = cc_ua_daemon_service_get_name(service);
+ if (strcmp (name, "esm-infra") == 0) {
+ g_clear_object (&self->esm_infra_service);
+ self->esm_infra_service = g_steal_pointer(&service);
+ }
+ }
+
+ update_ubuntu_pro_status (self);
+}
+
+static void ua_daemon_object_removed_cb (CcInfoOverviewPanel *self, GDBusObject *object)
+{
+ const gchar *object_path = g_dbus_object_get_object_path (object);
+ if (self->manager != NULL && strcmp (g_dbus_proxy_get_object_path(G_DBUS_PROXY(self->manager)),
object_path) == 0) {
+ g_clear_object (&self->manager);
+ }
+ if (self->esm_infra_service != NULL && strcmp
(g_dbus_proxy_get_object_path(G_DBUS_PROXY(self->esm_infra_service)), object_path) == 0) {
+ g_clear_object (&self->esm_infra_service);
+ }
+
+ update_ubuntu_pro_status (self);
+}
+
+static void ua_daemon_cb (GObject *object, GAsyncResult *result, gpointer user_data)
+{
+ CcInfoOverviewPanel *self = user_data;
+ g_autoptr(GList) objects = NULL;
+ g_autoptr(GError) error = NULL;
+
+ self->ua_object_manager = cc_ua_daemon_object_manager_client_new_for_bus_finish (result, &error);
+ if (self->ua_object_manager == NULL) {
+ g_warning ("Failed to connect to UA daemon: %s", error->message);
+ return;
+ }
+
+ g_signal_connect_swapped (self->ua_object_manager, "object-added", G_CALLBACK (ua_daemon_object_added_cb),
self);
+ g_signal_connect_swapped (self->ua_object_manager, "object-removed", G_CALLBACK
(ua_daemon_object_removed_cb), self);
+ objects = g_dbus_object_manager_get_objects (self->ua_object_manager);
+ for (GList *link = objects; link != NULL; link = link->next) {
+ GDBusObject *object = link->data;
+ ua_daemon_object_added_cb (self, object);
+ }
+}
+
+static void setup_ua_daemon (CcInfoOverviewPanel *self)
+{
+ cc_ua_daemon_object_manager_client_new_for_bus(G_BUS_TYPE_SYSTEM,
+ G_DBUS_OBJECT_MANAGER_CLIENT_FLAGS_NONE,
+ "com.canonical.UbuntuAdvantage",
+ "/",
+ self->cancellable,
+ ua_daemon_cb,
+ self);
+ update_ubuntu_pro_status (self);
+}
+
+static void
+cc_info_overview_panel_dispose (GObject *object)
+{
+ CcInfoOverviewPanel *self = CC_INFO_OVERVIEW_PANEL (object);
+
+ g_cancellable_cancel (self->cancellable);
+
+ g_clear_object (&self->cancellable);
+ g_clear_object (&self->ua_object_manager);
+ g_clear_object (&self->manager);
+ g_clear_object (&self->esm_infra_service);
+
+ G_OBJECT_CLASS (cc_info_overview_panel_parent_class)->dispose (object);
+}
+
static void
cc_info_overview_panel_class_init (CcInfoOverviewPanelClass *klass)
{
+ GObjectClass *object_class = G_OBJECT_CLASS (klass);
GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
+ object_class->dispose = cc_info_overview_panel_dispose;
+
gtk_widget_class_set_template_from_resource (widget_class,
"/org/gnome/control-center/info-overview/cc-info-overview-panel.ui");
gtk_widget_class_bind_template_child (widget_class, CcInfoOverviewPanel, device_name_entry);
gtk_widget_class_bind_template_child (widget_class, CcInfoOverviewPanel, disk_row);
+ gtk_widget_class_bind_template_child (widget_class, CcInfoOverviewPanel, esm_label);
gtk_widget_class_bind_template_child (widget_class, CcInfoOverviewPanel, gnome_version_row);
gtk_widget_class_bind_template_child (widget_class, CcInfoOverviewPanel, graphics_row);
gtk_widget_class_bind_template_child (widget_class, CcInfoOverviewPanel, hardware_box);
@@ -963,6 +1066,8 @@ cc_info_overview_panel_init (CcInfoOverviewPanel *self)
g_resources_register (cc_info_overview_get_resource ());
+ self->cancellable = g_cancellable_new ();
+
if ((!does_gnome_software_exist () || !does_gnome_software_allow_updates ()) &&
!does_gpk_update_viewer_exist ())
gtk_widget_hide (GTK_WIDGET (self->software_updates_row));
@@ -970,6 +1075,8 @@ cc_info_overview_panel_init (CcInfoOverviewPanel *self)
info_overview_panel_setup_virt (self);
setup_os_logo (self);
+
+ setup_ua_daemon (self);
}
GtkWidget *
diff --git a/panels/info-overview/cc-info-overview-panel.ui b/panels/info-overview/cc-info-overview-panel.ui
index 95afe867c..cf682f0a2 100644
--- a/panels/info-overview/cc-info-overview-panel.ui
+++ b/panels/info-overview/cc-info-overview-panel.ui
@@ -35,6 +35,20 @@
<property name="fill">False</property>
</packing>
</child>
+ <child>
+ <object class="GtkLabel" id="esm_label">
+ <property name="visible">False</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Extended Security Maintenance</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
<child>
<object class="GtkListBox">
diff --git a/panels/info-overview/com.canonical.UbuntuAdvantage.xml
b/panels/info-overview/com.canonical.UbuntuAdvantage.xml
new file mode 100644
index 000000000..15ae2a0f8
--- /dev/null
+++ b/panels/info-overview/com.canonical.UbuntuAdvantage.xml
@@ -0,0 +1,23 @@
+<!DOCTYPE node PUBLIC
+"-//freedesktop//DTD D-BUS Object Introspection 1.0//EN"
+"http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd">
+
+<node name="/">
+ <interface name='com.canonical.UbuntuAdvantage.Manager'>
+ <method name='Attach'>
+ <arg type='s' name='token' direction='in'/>
+ </method>
+ <method name='Detach'/>
+ <property name='Attached' type='b' access='read'/>
+ <property name='DaemonVersion' type='s' access='read'/>
+ </interface>
+
+ <interface name='com.canonical.UbuntuAdvantage.Service'>
+ <method name='Enable'/>
+ <method name='Disable'/>
+ <property name='Name' type='s' access='read'/>
+ <property name='Description' type='s' access='read'/>
+ <property name='Entitled' type='s' access='read'/>
+ <property name='Status' type='s' access='read'/>
+ </interface>
+</node>
diff --git a/panels/info-overview/meson.build b/panels/info-overview/meson.build
index 2fe10b32c..ae834093d 100644
--- a/panels/info-overview/meson.build
+++ b/panels/info-overview/meson.build
@@ -27,6 +27,14 @@ sources = files(
'info-cleanup.c'
)
+sources += gnome.gdbus_codegen(
+ 'cc-ua-daemon-generated',
+ 'com.canonical.UbuntuAdvantage.xml',
+ interface_prefix: 'com.canonical.UbuntuAdvantage.',
+ namespace: 'CcUaDaemon',
+ object_manager: true
+)
+
resource_data = files(
'cc-info-overview-panel.ui'
)
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]