From 84b51d2a7a7feb6c3e76c6234308c42bc4cd705d Mon Sep 17 00:00:00 2001 From: Simon Quigley Date: Sun, 14 Apr 2024 15:51:23 -0500 Subject: [PATCH] Create lubuntu-snap-installation-monitor, which tells the user if snaps are still being pre-seeded in the background. Mostly used in the case of preseeding a lot of snaps, or preseeding snaps on a slower machine (LP: #2045580, LP: #2061318). --- Makefile | 15 ++-- debian/changelog | 9 ++ debian/control | 9 +- debian/copyright | 19 +++++ debian/lubuntu-default-settings.install | 3 + .../lubuntu-snap-installation-monitor.install | 2 + snap-installation-monitor/CMakeLists.txt | 9 ++ snap-installation-monitor/main.cpp | 84 +++++++++++++++++++ .../snap-installation-monitor.desktop | 8 ++ 9 files changed, 152 insertions(+), 6 deletions(-) create mode 100644 debian/lubuntu-default-settings.install create mode 100644 debian/lubuntu-snap-installation-monitor.install create mode 100644 snap-installation-monitor/CMakeLists.txt create mode 100644 snap-installation-monitor/main.cpp create mode 100644 snap-installation-monitor/snap-installation-monitor.desktop diff --git a/Makefile b/Makefile index d07f378..974feac 100644 --- a/Makefile +++ b/Makefile @@ -1,11 +1,16 @@ #!/usr/bin/make -f -all: install +all: build install + +build: make -C src/usr/share/xsessions/po/ rm -rf src/usr/share/xsessions/po/ src/usr/share/xsessions/*.in + cd snap-installation-monitor && cmake -DCMAKE_BUILD_TYPE=Release . && make install: - mkdir -pv $(DESTDIR) - cp -a src/etc src/usr $(DESTDIR)/. - -# vim:ts=4 + mkdir -pv $(DESTDIR)/lubuntu-snap-installation-monitor/usr/libexec + mkdir -pv $(DESTDIR)/lubuntu-snap-installation-monitor/etc/xdg/autostart + mkdir -pv $(DESTDIR)/lubuntu-default-settings/ + cp -a src/etc src/usr $(DESTDIR)/lubuntu-default-settings/. + cp -a snap-installation-monitor/snap-installation-monitor $(DESTDIR)/lubuntu-snap-installation-monitor/usr/libexec/. + cp -a snap-installation-monitor/snap-installation-monitor.desktop $(DESTDIR)/lubuntu-snap-installation-monitor/etc/xdg/autostart/. diff --git a/debian/changelog b/debian/changelog index 305f0b7..ebfda8c 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,12 @@ +lubuntu-default-settings (24.04.9) noble; urgency=medium + + * Create lubuntu-snap-installation-monitor, which tells the user if snaps + are still being pre-seeded in the background. Mostly used in the case of + preseeding a lot of snaps, or preseeding snaps on a slower machine + (LP: #2045580, LP: #2061318). + + -- Simon Quigley Sun, 14 Apr 2024 15:49:12 -0500 + lubuntu-default-settings (24.04.8) noble; urgency=medium * Don't decorate firmware-updater, it comes with its own (LP: #2061307). diff --git a/debian/control b/debian/control index 4136c67..e80d87f 100644 --- a/debian/control +++ b/debian/control @@ -3,7 +3,7 @@ Section: x11 Priority: optional Maintainer: Lubuntu Developers Uploaders: Simon Quigley -Build-Depends: debhelper-compat (= 13), intltool +Build-Depends: cmake, debhelper-compat (= 13), intltool, qtbase5-dev Standards-Version: 4.6.2 Homepage: https://lubuntu.me Vcs-Browser: https://git.launchpad.net/lubuntu-default-settings?h=master @@ -22,3 +22,10 @@ Depends: fonts-ubuntu, Recommends: breeze-gtk-theme Description: default settings for Lubuntu Various system settings tailored for Lubuntu. + +Package: lubuntu-snap-installation-monitor +Architecture: amd64 +Depends: ${misc:Depends}, ${shlibs:Depends} +Description: Simple notifier for snap installation + Let the user know if snaps are still being installed in the background when + booting up their desktop environment. diff --git a/debian/copyright b/debian/copyright index f8515a7..a843374 100644 --- a/debian/copyright +++ b/debian/copyright @@ -21,3 +21,22 @@ License: GPL-2+ . On Debian systems, the complete text of the GNU General Public License version 2 can be found in "/usr/share/common-licenses/GPL-2". + +Files: snap-installation-monitor/* +Copyright: Copyright 2024 Simon Quigley +License: GPL-3+ + This package is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + . + This package is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + . + You should have received a copy of the GNU General Public License + along with this program. If not, see + . + On Debian systems, the complete text of the GNU General + Public License version 3 can be found in "/usr/share/common-licenses/GPL-3". diff --git a/debian/lubuntu-default-settings.install b/debian/lubuntu-default-settings.install new file mode 100644 index 0000000..cf5cda8 --- /dev/null +++ b/debian/lubuntu-default-settings.install @@ -0,0 +1,3 @@ +lubuntu-default-settings/etc/xdg etc/ +lubuntu-default-settings/usr/lib usr/ +lubuntu-default-settings/usr/share usr/ diff --git a/debian/lubuntu-snap-installation-monitor.install b/debian/lubuntu-snap-installation-monitor.install new file mode 100644 index 0000000..0e2f44e --- /dev/null +++ b/debian/lubuntu-snap-installation-monitor.install @@ -0,0 +1,2 @@ +lubuntu-snap-installation-monitor/etc/xdg/autostart/snap-installation-monitor.desktop etc/xdg/autostart/ +lubuntu-snap-installation-monitor/usr/libexec/snap-installation-monitor usr/libexec/ diff --git a/snap-installation-monitor/CMakeLists.txt b/snap-installation-monitor/CMakeLists.txt new file mode 100644 index 0000000..6e2d14e --- /dev/null +++ b/snap-installation-monitor/CMakeLists.txt @@ -0,0 +1,9 @@ +cmake_minimum_required(VERSION 3.5.0) +project(snap-installation-monitor) + +set(CMAKE_INCLUDE_CURRENT_DIR ON) +set(CMAKE_AUTOMOC ON) +find_package(Qt5 COMPONENTS Widgets DBus REQUIRED) + +add_executable(snap-installation-monitor main.cpp) +target_link_libraries(snap-installation-monitor Qt5::Widgets Qt5::DBus) diff --git a/snap-installation-monitor/main.cpp b/snap-installation-monitor/main.cpp new file mode 100644 index 0000000..56c9513 --- /dev/null +++ b/snap-installation-monitor/main.cpp @@ -0,0 +1,84 @@ +// Copyright (C) 2024 Simon Quigley +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 3 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +#include +#include +#include +#include +#include + +int main(int argc, char *argv[]) { + QApplication app(argc, argv); + + // Create and set application icon + QIcon appIcon = QIcon::fromTheme("dialog-information"); + QApplication::setWindowIcon(appIcon); + + // DBus interface to systemd + QDBusInterface systemd("org.freedesktop.systemd1", + "/org/freedesktop/systemd1", + "org.freedesktop.systemd1.Manager", + QDBusConnection::systemBus()); + + // Retrieve current status of snapd.seeded.service, which tracks the preseed process + QDBusMessage methodCall = systemd.call("GetUnit", "snapd.seeded.service"); + QDBusObjectPath unitPath = methodCall.arguments().at(0).value(); + QDBusInterface unit("org.freedesktop.systemd1", + unitPath.path(), + "org.freedesktop.systemd1.Unit", + QDBusConnection::systemBus()); + QVariant activeState = unit.property("ActiveState"); + QVariant subState = unit.property("SubState"); + + // System tray icon setup + QSystemTrayIcon trayIcon(appIcon); + trayIcon.setToolTip("Snap Installation Monitor"); + + // Initial message displayed in the system tray + auto showMessage = [&trayIcon]() { + trayIcon.showMessage("Installation Notice", "Finalizing installation of snaps, please wait...", + QSystemTrayIcon::Information, 15000); + }; + + // If the user clicks the system tray icon, display the notification again + QObject::connect(&trayIcon, &QSystemTrayIcon::activated, [&](QSystemTrayIcon::ActivationReason reason) { + if (reason == QSystemTrayIcon::Trigger) { + showMessage(); + } + }); + + // Exit immediately if the service is "active (exited)", launch the GUI parts otherwise + if (activeState.toString() == "active" && subState.toString() == "exited") { return 0; } + trayIcon.show(); + showMessage(); + + QTimer timer; + QObject::connect(&timer, &QTimer::timeout, [&unit, &trayIcon]() { + QVariant newState = unit.property("ActiveState"); + QVariant newSubState = unit.property("SubState"); + if (newState.toString() == "active" && newSubState.toString() == "exited") { + trayIcon.hide(); + QMessageBox messageBox; + messageBox.setIcon(QMessageBox::Information); + messageBox.setText("Background snap installation is complete."); + messageBox.setWindowTitle("Installation Complete"); + messageBox.setStandardButtons(QMessageBox::Ok); + messageBox.exec(); + + QApplication::quit(); + } + }); + + timer.start(5000); // Check every 5 seconds + + return app.exec(); +} diff --git a/snap-installation-monitor/snap-installation-monitor.desktop b/snap-installation-monitor/snap-installation-monitor.desktop new file mode 100644 index 0000000..0b87125 --- /dev/null +++ b/snap-installation-monitor/snap-installation-monitor.desktop @@ -0,0 +1,8 @@ +[Desktop Entry] +Type=Application +Name=Snap Installation Monitor +Exec=/usr/libexec/snap-installation-monitor +Icon=dialog-information +Comment=Monitor snapd seeding at startup +X-LXQt-Need-Tray=true +NoDisplay=true