From 9947473cb433fb0036ec7abf96cd668a24e18944 Mon Sep 17 00:00:00 2001 From: Jeremy Soller Date: Mon, 5 Feb 2024 15:44:38 -0700 Subject: [PATCH] Add debconf question for display-manager, based on gdm3 --- debian/control | 1 + debian/cosmic-greeter.config | 43 ++++++++++++++++++++++ debian/cosmic-greeter.postinst | 49 +++++++++++++++++++++++++ debian/cosmic-greeter.prerm | 64 +++++++++++++++++++++++++++++++++ debian/cosmic-greeter.service | 5 +-- debian/cosmic-greeter.templates | 20 +++++++++++ 6 files changed, 180 insertions(+), 2 deletions(-) create mode 100644 debian/cosmic-greeter.config create mode 100644 debian/cosmic-greeter.postinst create mode 100644 debian/cosmic-greeter.prerm create mode 100644 debian/cosmic-greeter.templates diff --git a/debian/control b/debian/control index 2608955..c202c3f 100644 --- a/debian/control +++ b/debian/control @@ -17,4 +17,5 @@ Homepage: https://github.com/pop-os/cosmic-greeter Package: cosmic-greeter Architecture: amd64 arm64 Depends: cage, greetd, ${misc:Depends}, ${shlibs:Depends} +Provides: x-display-manager Description: Cosmic Greeter diff --git a/debian/cosmic-greeter.config b/debian/cosmic-greeter.config new file mode 100644 index 0000000..3a69a68 --- /dev/null +++ b/debian/cosmic-greeter.config @@ -0,0 +1,43 @@ +#!/bin/sh +# Debian cosmic-greeter package configuration script +# Copyright 2000-2001 Branden Robinson. +# Licensed under the GNU General Public License, version 2. See the file +# /usr/share/common-licenses/GPL or . + +set -e + +# source debconf library +. /usr/share/debconf/confmodule + +THIS_PACKAGE=cosmic-greeter +DEFAULT_DISPLAY_MANAGER_FILE=/etc/X11/default-display-manager + +# set default display manager + +db_get shared/default-x-display-manager +OLD_DEFAULT="$RET" + +db_metaget shared/default-x-display-manager owners +OWNERS="$RET" +db_metaget shared/default-x-display-manager choices +CHOICES="$RET" + +if [ "$OWNERS" != "$CHOICES" ]; then + db_subst shared/default-x-display-manager choices $OWNERS + db_fset shared/default-x-display-manager seen false +fi + +db_input high shared/default-x-display-manager || true +db_go + +# using this display manager? +db_get shared/default-x-display-manager +CURRENT_DEFAULT="$RET" +# set a flag to indicate to postinst that we need to update from debconf +if [ "$OLD_DEFAULT" != "$CURRENT_DEFAULT" ]; then + DEFAULT_DISPLAY_MANAGER_DIR=$(dirname $DEFAULT_DISPLAY_MANAGER_FILE) + test -e $DEFAULT_DISPLAY_MANAGER_DIR || mkdir -p $DEFAULT_DISPLAY_MANAGER_DIR + touch $DEFAULT_DISPLAY_MANAGER_FILE.debconf-update +fi + +exit 0 diff --git a/debian/cosmic-greeter.postinst b/debian/cosmic-greeter.postinst new file mode 100644 index 0000000..b7af371 --- /dev/null +++ b/debian/cosmic-greeter.postinst @@ -0,0 +1,49 @@ +#!/bin/sh + +set -e + +. /usr/share/debconf/confmodule + +THIS_PACKAGE=cosmic-greeter +DEFAULT_DISPLAY_MANAGER_FILE=/etc/X11/default-display-manager + +# debconf is not a registry, so we only fiddle with the default file if +# the configure script requested an update +if [ -e $DEFAULT_DISPLAY_MANAGER_FILE.debconf-update ]; then + rm -f $DEFAULT_DISPLAY_MANAGER_FILE.debconf-update + if db_get shared/default-x-display-manager; then + # workaround debconf passthru bug (#379198) + if [ -z "$RET" ]; then + RET="$THIS_PACKAGE" + fi + if [ "$THIS_PACKAGE" != "$RET" ]; then + echo "Please be sure to run \"dpkg --configure $RET\"." + fi + if db_get "$RET"/daemon_name; then + echo "$RET" > $DEFAULT_DISPLAY_MANAGER_FILE + fi + fi +fi + +DEFAULT_SERVICE=/etc/systemd/system/display-manager.service +# set default-display-manager systemd service link according to our config +if [ "$1" = configure ] && [ -d /etc/systemd/system/ ]; then + if [ -e "$DEFAULT_DISPLAY_MANAGER_FILE" ]; then + SERVICE=/lib/systemd/system/$(basename $(cat "$DEFAULT_DISPLAY_MANAGER_FILE")).service + if [ -h "$DEFAULT_SERVICE" ] && [ $(readlink "$DEFAULT_SERVICE") = /dev/null ]; then + echo "Display manager service is masked" >&2 + elif [ -e "$SERVICE" ]; then + ln -sf "$SERVICE" "$DEFAULT_SERVICE" + else + echo "WARNING: $SERVICE is the selected default display manager but does not exist" >&2 + rm -f "$DEFAULT_SERVICE" + fi + else + rm -f "$DEFAULT_SERVICE" + fi +fi + +# debconf hangs if cosmic-greeter gets started below without this +db_stop || true + +#DEBHELPER# diff --git a/debian/cosmic-greeter.prerm b/debian/cosmic-greeter.prerm new file mode 100644 index 0000000..58c782a --- /dev/null +++ b/debian/cosmic-greeter.prerm @@ -0,0 +1,64 @@ +#!/bin/bash +# Debian gdm package pre-removal script +# Copyright 2001 Branden Robinson. +# Licensed under the GNU General Public License, version 2. See the file +# /usr/share/common-licenses/GPL or . +# Acknowlegements to Stephen Early, Mark Eichin, and Manoj Srivastava. + +set -e + +THIS_PACKAGE=cosmic-greeter +DEFAULT_DISPLAY_MANAGER_FILE=/etc/X11/default-display-manager + +if [ "$1" = "remove" -o "$1" = "deconfigure" ]; then + if [ -e /usr/share/debconf/confmodule ]; then + . /usr/share/debconf/confmodule + # disown this question + db_unregister shared/default-x-display-manager || true + # does the question still exist? + if db_get shared/default-x-display-manager; then + db_metaget shared/default-x-display-manager owners + db_subst shared/default-x-display-manager choices "$RET" + db_get shared/default-x-display-manager + # are we removing the currently selected display manager? + if [ "$THIS_PACKAGE" = "$RET" ]; then + if [ -e "$DEFAULT_DISPLAY_MANAGER_FILE" ]; then + db_get "$RET"/daemon_name + if [ "$(cat $DEFAULT_DISPLAY_MANAGER_FILE)" = "$RET" ]; then + rm "$DEFAULT_DISPLAY_MANAGER_FILE" + fi + fi + # ask the user to choose a new default + db_fset shared/default-x-display-manager seen false + db_input critical shared/default-x-display-manager || true + db_go + # if the display manager file doesn't exist, write it with the path + # to the new default display manager + if [ ! -e $DEFAULT_DISPLAY_MANAGER_FILE ]; then + db_get shared/default-x-display-manager + echo "Please be sure to run \"dpkg-reconfigure $RET\"." + db_get "$RET"/daemon_name + echo "$RET" > "$DEFAULT_DISPLAY_MANAGER_FILE" + fi + fi + fi + fi + + DEFAULT_SERVICE=/etc/systemd/system/display-manager.service + # set default-display-manager systemd service link according to our config + if [ -e "$DEFAULT_DISPLAY_MANAGER_FILE" ]; then + SERVICE=/lib/systemd/system/$(basename $(cat "$DEFAULT_DISPLAY_MANAGER_FILE")).service + if [ -h "$DEFAULT_SERVICE" ] && [ $(readlink "$DEFAULT_SERVICE") = /dev/null ]; then + echo "Display manager service is masked" >&2 + elif [ -e "$SERVICE" ]; then + ln -sf "$SERVICE" "$DEFAULT_SERVICE" + else + echo "WARNING: $SERVICE is the selected default display manager but does not exist" >&2 + rm -f "$DEFAULT_SERVICE" + fi + else + rm -f "$DEFAULT_SERVICE" + fi +fi + +#DEBHELPER# diff --git a/debian/cosmic-greeter.service b/debian/cosmic-greeter.service index 0bc2c66..4d783e7 100644 --- a/debian/cosmic-greeter.service +++ b/debian/cosmic-greeter.service @@ -16,5 +16,6 @@ RestartSec=1 StartLimitBurst=5 StartLimitInterval=30 -[Install] -Alias=display-manager.service +# Managed by debconf +#[Install] +#Alias=display-manager.service diff --git a/debian/cosmic-greeter.templates b/debian/cosmic-greeter.templates new file mode 100644 index 0000000..8f78865 --- /dev/null +++ b/debian/cosmic-greeter.templates @@ -0,0 +1,20 @@ +Template: cosmic-greeter/daemon_name +Type: string +Default: /usr/bin/cosmic-greeter +Description: for internal use only + +Template: shared/default-x-display-manager +Type: select +Choices: ${choices} +_Description: Default display manager: + A display manager is a program that provides graphical login capabilities for + the X Window System. + . + Only one display manager can manage a given X server, but multiple display + manager packages are installed. Please select which display manager should + run by default. + . + Multiple display managers can run simultaneously if they are configured to + manage different servers; to achieve this, configure the display managers + accordingly, edit each of their init scripts in /etc/init.d, and disable the + check for a default display manager.