On Thu, 20 Aug 2015 at 12:09:42 +0200, Michael Biebl wrote:
> nodm provides a special kind of display manager.
> I therefor think, it should use the same mechanism as other display
> managers like gdm3 or lightdm, to make sure that only ever one display
> manager is started during boot.
Here are patches; I based them on what gdm3 does. In my testing on an
embedded Debian derivative, they seem to interoperate nicely with xdm.
I haven't tried to do anything clever with NODM_ENABLED: even if nodm is
the default display manager, it still won't start unless NODM_ENABLED has
a suitable value. In practice I would expect that the sort of platforms
where nodm is useful will pre-seed nodm's configuration (that's what
we do on the platform I'm interested in).
S
>From 9e68000e4a84b708aa8817859216b67a9e179e7b Mon Sep 17 00:00:00 2001
From: Simon McVittie <[email protected]>
Date: Wed, 6 Jul 2016 17:45:19 +0100
Subject: [PATCH 2/3] nodm.service: add a native systemd service
In particular this makes sure to run nodm.service only after
systemd-user-sessions.service has allowed user logins.
Closes: #796203
Signed-off-by: Simon McVittie <[email protected]>
---
Makefile.am | 13 ++++++++++++-
debian/changelog | 1 +
debian/rules | 3 +++
nodm.service.in | 14 ++++++++++++++
4 files changed, 30 insertions(+), 1 deletion(-)
create mode 100644 nodm.service.in
diff --git a/Makefile.am b/Makefile.am
index 28709f9..299020f 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -64,9 +64,12 @@ test_internals_SOURCES = $(testlibsources) \
EXTRA_DIST = test_nodm \
nodm-man-extras \
autogen.sh \
+ nodm.service.in \
$(NULL)
-CLEANFILES = nodm.8
+CLEANFILES = $(man_MANS) \
+ $(systemdsystemunit_DATA) \
+ $(NULL)
DISTCLEANFILES = Makefile.in \
aclocal.m4 \
@@ -74,3 +77,11 @@ DISTCLEANFILES = Makefile.in \
config/* \
configure \
$(NULL)
+
+systemdsystemunitdir = $(prefix)/lib/systemd/system
+systemdsystemunit_DATA = nodm.service
+
+nodm.service: nodm.service.in
+ sed \
+ -e 's![@]sbindir[@]!${sbindir}!g' \
+ < $< > $@
diff --git a/debian/changelog b/debian/changelog
index ad15d48..88f62c6 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -13,6 +13,7 @@ nodm (0.12-2) UNRELEASED; urgency=medium
[ Simon McVittie ]
* Vcs-Git, Vcs-Browser: update to point to the GitHub repository
+ * nodm.service: add a native systemd service (Closes: #796203)
-- Mike Gabriel <[email protected]> Thu, 24 Mar 2016 14:43:36 +0100
diff --git a/debian/rules b/debian/rules
index 01dbed9..a460bc2 100755
--- a/debian/rules
+++ b/debian/rules
@@ -12,6 +12,9 @@ override_dh_auto_configure:
NOCONFIGURE=1 ./autogen.sh
dh_auto_configure $(DHFLAGS)
+override_dh_auto_install:
+ dh_auto_install -- systemdsystemunitdir=/lib/systemd/system
+
override_dh_auto_test:
#make check
diff --git a/nodm.service.in b/nodm.service.in
new file mode 100644
index 0000000..fdc4785
--- /dev/null
+++ b/nodm.service.in
@@ -0,0 +1,14 @@
+[Unit]
+Description=Display manager for automatic session logins
+Documentation=man:nodm(8)
+After=console-screen.service
+After=console-setup.service
+After=kbd.service
+After=systemd-user-sessions.service
+
+[Service]
+EnvironmentFile=-/etc/default/nodm
+ExecStartPre=/usr/bin/test ${NODM_ENABLED} != no
+ExecStartPre=/usr/bin/test ${NODM_ENABLED} != false
+ExecStart=@sbindir@/nodm $NODM_OPTIONS
+Restart=always
--
2.8.1
>From e0f5d2ec9cb95e3187ca4ce5801224a651a5d774 Mon Sep 17 00:00:00 2001
From: Simon McVittie <[email protected]>
Date: Wed, 6 Jul 2016 17:20:21 +0100
Subject: [PATCH 3/3] Participate in the /etc/X11/default-display-manager
mechanism
Signed-off-by: Simon McVittie <[email protected]>
---
debian/changelog | 1 +
debian/copyright | 15 ++++++++++
debian/nodm.config | 36 ++++++++++++++++++++++
debian/nodm.postinst | 41 ++++++++++++++++++++++++-
debian/nodm.prerm | 83 +++++++++++++++++++++++++++++++++++++++++++++++++++
debian/nodm.templates | 20 +++++++++++++
debian/rules | 2 ++
7 files changed, 197 insertions(+), 1 deletion(-)
create mode 100644 debian/nodm.prerm
diff --git a/debian/changelog b/debian/changelog
index 88f62c6..c72471d 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -14,6 +14,7 @@ nodm (0.12-2) UNRELEASED; urgency=medium
[ Simon McVittie ]
* Vcs-Git, Vcs-Browser: update to point to the GitHub repository
* nodm.service: add a native systemd service (Closes: #796203)
+ * Participate in the /etc/X11/default-display-manager mechanism
-- Mike Gabriel <[email protected]> Thu, 24 Mar 2016 14:43:36 +0100
diff --git a/debian/copyright b/debian/copyright
index c3be889..577d7d8 100644
--- a/debian/copyright
+++ b/debian/copyright
@@ -63,6 +63,17 @@ Copyright: 2008, Joachim Breitner <[email protected]>
2016, Mike Gabriel <[email protected]>
License: GPL-2+
+Files:
+ debian/nodm.config
+ debian/nodm.postinst
+ debian/nodm.prerm
+Copyright:
+ 2000-2001, Branden Robinson
+ 2008, Joachim Breitner <[email protected]>
+ 2009-2011, Enrico Zini <[email protected]>
+ 2016, Mike Gabriel <[email protected]>
+License: GPL-2
+
License: GPL-2+
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
@@ -81,3 +92,7 @@ License: GPL-2+
On Debian systems, the full text of the GNU General Public
License version 2 can be found in the file
`/usr/share/common-licenses/GPL-2'.
+
+License: GPL-2
+ Licensed under the GNU General Public License, version 2. See the file
+ /usr/share/common-licenses/GPL-2 or <http://www.gnu.org/copyleft/gpl.txt>.
diff --git a/debian/nodm.config b/debian/nodm.config
index 68fc680..40af76b 100644
--- a/debian/nodm.config
+++ b/debian/nodm.config
@@ -1,9 +1,45 @@
#!/bin/sh
+# Partially based on gdm3.config, © 2000-2001 Branden Robinson.
+# Licensed under the GNU General Public License, version 2. See the file
+# /usr/share/common-licenses/GPL-2 or <http://www.gnu.org/copyleft/gpl.txt>.
+
+
set -e
. /usr/share/debconf/confmodule
+THIS_PACKAGE=nodm
+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
+
if [ -s /etc/default/nodm ] ; then
. /etc/default/nodm
diff --git a/debian/nodm.postinst b/debian/nodm.postinst
index b209bce..9216c13 100644
--- a/debian/nodm.postinst
+++ b/debian/nodm.postinst
@@ -1,10 +1,49 @@
#! /bin/sh
-# postinst script for nodm
+# postinst script for nodm, partially based on gdm3.postinst
set -e
+THIS_PACKAGE=nodm
+DEFAULT_DISPLAY_MANAGER_FILE=/etc/X11/default-display-manager
+
. /usr/share/debconf/confmodule
+# 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
+
if [ "$1" = "configure" ] ; then
if [ -n "$2" ] && dpkg --compare-versions "$2" lt "0.2"; then
# Before version 0.2, nodm was only used on the OpenMoko. To
diff --git a/debian/nodm.prerm b/debian/nodm.prerm
new file mode 100644
index 0000000..f9aa470
--- /dev/null
+++ b/debian/nodm.prerm
@@ -0,0 +1,83 @@
+#!/bin/bash
+# Debian nodm package pre-removal script
+#
+# Based on gdm3.prerm:
+# © 2001 Branden Robinson
+#
+# Licensed under the GNU General Public License, version 2. See the file
+# /usr/share/common-licenses/GPL-2 or <http://www.gnu.org/copyleft/gpl.txt>.
+# Acknowlegements to Stephen Early, Mark Eichin, and Manoj Srivastava.
+
+set -e
+
+THIS_PACKAGE=nodm
+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
+
+if [ "$1" = "remove" ]; then
+ if [ -x /etc/init.d/nodm ]; then
+ nostop=
+ for hostname in "" "localhost" "$(hostname)" "$(hostname -f)"; do
+ if echo $DISPLAY | grep -q "^$hostname:0.*"; then
+ nostop=yes
+ fi
+ done
+ if [ -z $nostop ]; then
+ invoke-rc.d nodm stop
+ fi
+ fi
+fi
+
+#DEBHELPER#
+
+exit 0
diff --git a/debian/nodm.templates b/debian/nodm.templates
index 5d1223a..fd4b79b 100644
--- a/debian/nodm.templates
+++ b/debian/nodm.templates
@@ -72,3 +72,23 @@ Default: /etc/X11/Xsession
_Description: X session to use:
Please choose the name of the X session script to use with nodm.
+Template: nodm/daemon_name
+Type: string
+Default: /usr/sbin/nodm
+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.
diff --git a/debian/rules b/debian/rules
index a460bc2..62a74da 100755
--- a/debian/rules
+++ b/debian/rules
@@ -14,6 +14,8 @@ override_dh_auto_configure:
override_dh_auto_install:
dh_auto_install -- systemdsystemunitdir=/lib/systemd/system
+ echo "# Debian-specific change until all display managers participate in /etc/X11/default-display-manager" >> debian/nodm/lib/systemd/system/nodm.service
+ echo "ExecStartPre=/bin/sh -c '[ \"\$$(cat /etc/X11/default-display-manager 2>/dev/null)\" = \"/usr/sbin/nodm\" ]'" >> debian/nodm/lib/systemd/system/nodm.service
override_dh_auto_test:
#make check
--
2.8.1