Source: mumble
Severity: wishlist
Tags: patch

Dear Maintainer(s),

sysusers.d/tmpfiles.d config files allow a package to use declarative
configuration instead of manually written maintainer scripts. This
also allows image-based systems to be created with /usr/ only, and
also allows for factory resetting a system and recreating /etc/ on
boot.

https://www.freedesktop.org/software/systemd/man/latest/sysusers.d.html
https://www.freedesktop.org/software/systemd/man/latest/tmpfiles.d.html

The package already ships both, but still makes use of manual
scripting in postinst. Please find patches attached to stop deleting
the system user on removal, which is widely considered bad practice,
as the kernel recycles UIDs/GIDs, and to rely on the upstream
(patched) sysusers.d and tmpfiles.d for the postinst setup.

Also CI run and branch to pull if you prefer on Salsa:
https://salsa.debian.org/bluca/mumble/-/pipelines/1073980

Thanks!
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Luca Boccassi <[email protected]>
Date: Sat, 25 Apr 2026 23:53:28 +0100
Subject: [PATCH] Install and use sysusers.d/tmpfiles.d config files

sysusers.d/tmpfiles.d config files allow a package to use
declarative configuration instead of manually written
maintainer scripts. This also allows image-based systems to
be created with /usr/ only, and also allows for factory
resetting a system and recreating /etc/ on boot.
https://www.freedesktop.org/software/systemd/man/latest/sysusers.d.html
---
 debian/control                                |  2 +-
 debian/extras/mumble-server.postinst          | 20 +++----------------
 debian/mumble-server.dirs                     |  1 -
 debian/mumble-server.postinst                 | 20 +++----------------
 debian/patches/90-debianize-systemd-unit.diff |  7 +++++--
 5 files changed, 12 insertions(+), 38 deletions(-)
 delete mode 100644 debian/mumble-server.dirs

diff --git a/debian/control b/debian/control
index b3cd29e..90ed2e9 100644
--- a/debian/control
+++ b/debian/control
@@ -5,6 +5,7 @@ Uploaders: Christopher Knadle <[email protected]>
 Rules-Requires-Root: no
 Build-Depends: debhelper-compat (= 13),
  cmake,
+ dh-sequence-installsysusers,
  libasound2-dev,
  libavahi-compat-libdnssd-dev,
  libboost-dev (>= 1.42),
@@ -62,7 +63,6 @@ Package: mumble-server
 Architecture: any
 Depends: ${shlibs:Depends},
  ${misc:Depends},
- adduser,
  libqt5sql5-sqlite,
  sysvinit-utils (>= 2.96)
 Description: Low latency encrypted VoIP server
diff --git a/debian/extras/mumble-server.postinst b/debian/extras/mumble-server.postinst
index e95a22b..bae20fa 100644
--- a/debian/extras/mumble-server.postinst
+++ b/debian/extras/mumble-server.postinst
@@ -19,23 +19,6 @@ set -e
 
 case "$1" in
 	configure)
-		# Add user and permanent directories
-		if [ ! $(getent group mumble-server) ]; then
-			adduser --system --quiet --home /var/lib/mumble-server --group mumble-server
-		fi
-		[ -d /var/lib/mumble-server ] || mkdir /var/lib/mumble-server
-		chmod 0750 /var/log/mumble-server
-		chmod 0750 /var/lib/mumble-server
-		chown mumble-server:adm /var/log/mumble-server
-		chown mumble-server:mumble-server /var/lib/mumble-server
-		if [ -f /etc/mumble/mumble-server.ini ]; then
-			chmod 0640 /etc/mumble/mumble-server.ini
-			chown root:mumble-server /etc/mumble/mumble-server.ini
-		fi
-		chown root:mumble-server /etc/mumble/
-		# Workaround for when this was in .dirs
-		[ -d /run/mumble-server ] && chown mumble-server:adm /run/mumble-server
-
 		# Ensure the file we put in /etc/dbus-1/system.d is loaded
 		# or mumble-server will fail to bind to dbus.
 		invoke-rc.d --quiet dbus force-reload || true
@@ -62,6 +45,9 @@ case "$1" in
 		# likely to update it outside of debconf.
 		db_get mumble-server/password
 		if [ "$RET" != "" ] ; then
+			# Create system user before manually running the server
+			systemd-sysusers ${DPKG_ROOT:+--root="$DPKG_ROOT"} mumble-server.conf
+
 			echo $RET | su mumble-server -s /bin/sh -c "/usr/bin/mumble-server -ini /etc/mumble/mumble-server.ini -readsupw"
 			if [ $? = 0 ] ; then
 				db_set mumble-server/password ""
diff --git a/debian/mumble-server.dirs b/debian/mumble-server.dirs
deleted file mode 100644
index 8d544eb..0000000
--- a/debian/mumble-server.dirs
+++ /dev/null
@@ -1 +0,0 @@
-var/log/mumble-server
diff --git a/debian/mumble-server.postinst b/debian/mumble-server.postinst
index d8d7ec2..b8a9e25 100644
--- a/debian/mumble-server.postinst
+++ b/debian/mumble-server.postinst
@@ -19,23 +19,6 @@ set -e
 
 case "$1" in
 	configure)
-		# Add user and permanent directories
-		if [ ! $(getent group mumble-server) ]; then
-			adduser --system --quiet --home /var/lib/mumble-server --group mumble-server
-		fi
-		[ -d /var/lib/mumble-server ] || mkdir /var/lib/mumble-server
-		chmod 0750 /var/log/mumble-server
-		chmod 0750 /var/lib/mumble-server
-		chown mumble-server:adm /var/log/mumble-server
-		chown mumble-server:mumble-server /var/lib/mumble-server
-		if [ -f /etc/mumble/mumble-server.ini ]; then
-			chmod 0640 /etc/mumble/mumble-server.ini
-			chown root:mumble-server /etc/mumble/mumble-server.ini
-		fi
-		chown root:mumble-server /etc/mumble/
-		# Workaround for when this was in .dirs
-		[ -d /run/mumble-server ] && chown mumble-server:adm /run/mumble-server
-
 		# Ensure the file we put in /etc/dbus-1/system.d is loaded
 		# or mumble-server will fail to bind to dbus.
 		invoke-rc.d --quiet dbus force-reload || true
@@ -45,6 +28,9 @@ case "$1" in
 		# likely to update it outside of debconf.
 		db_get mumble-server/password
 		if [ "$RET" != "" ] ; then
+			# Create system user before manually running the server
+			systemd-sysusers ${DPKG_ROOT:+--root="$DPKG_ROOT"} mumble-server.conf
+
 			echo $RET | su mumble-server -s /bin/sh -c "/usr/bin/mumble-server -ini /etc/mumble/mumble-server.ini -readsupw"
 			if [ $? = 0 ] ; then
 				db_set mumble-server/password ""
diff --git a/debian/patches/90-debianize-systemd-unit.diff b/debian/patches/90-debianize-systemd-unit.diff
index 4af6674..8ece531 100644
--- a/debian/patches/90-debianize-systemd-unit.diff
+++ b/debian/patches/90-debianize-systemd-unit.diff
@@ -31,12 +31,15 @@ Last-Update: 2024-12-01
  
  # Type # Name         # ID # GECOS              # Home # Shell
 -u      _mumble-server -    "Mumble server user" -      -
-+u      mumble-server -    "Mumble server user" -      -
++u      mumble-server -    "Mumble server user" /var/lib/mumble-server -
 --- a/auxiliary_files/config_files/mumble-server.tmpfiles.in
 +++ b/auxiliary_files/config_files/mumble-server.tmpfiles.in
-@@ -3,4 +3,4 @@
+@@ -3,4 +3,7 @@
  # special user used to execute the Mumble server when started via systemd
  
  # Type # Path                        # Mode # User # Group
 -z      @MUMBLE_INSTALL_ABS_SYSCONFDIR@/mumble-server.ini 0640   root   _mumble-server
 +z      @MUMBLE_INSTALL_ABS_SYSCONFDIR@/mumble-server.ini 0640   root   mumble-server
++z      @MUMBLE_INSTALL_ABS_SYSCONFDIR@ 0755 root mumble-server
++d      /var/lib/mumble-server 0750 mumble-server mumble-server
++d      /var/log/mumble-server 0750 mumble-server adm
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Luca Boccassi <[email protected]>
Date: Sat, 25 Apr 2026 23:51:45 +0100
Subject: [PATCH] Stop deleting system user on remove/purge

This is widely considered bad practice, as the kernel
recycles UIDs/GIDs. So any potential leftover file/directory
can then become owned by the next user/group that gets
added, with unpredictable consequences.
---
 debian/mumble-server.postrm | 12 ------------
 1 file changed, 12 deletions(-)

diff --git a/debian/mumble-server.postrm b/debian/mumble-server.postrm
index 82f0412..75850a0 100644
--- a/debian/mumble-server.postrm
+++ b/debian/mumble-server.postrm
@@ -22,18 +22,6 @@ case "$1" in
 		[ -d /var/lib/mumble-server ] && rm -rf /var/lib/mumble-server
 		[ -f /run/mumble-server/mumble-server.pid ] && rm -f /run/mumble-server/mumble-server.pid
 		[ -d /run/mumble-server ] && rmdir --ignore-fail-on-non-empty /run/mumble-server
-
-		if [ -x "$(command -v deluser)" ] ; then
-			if getent passwd|grep -q ^mumble-server: ; then
-				deluser --quiet --system mumble-server > /dev/null || true
-			fi
-			if getent group|grep -q ^mumble-server: ; then
-				deluser --quiet --system --group --only-if-empty mumble-server > /dev/null || true
-			fi
-		else
-			echo >&2 "not removing 'mumble-server' system account because deluser command was not found."
-			[ -d /var/lib/mumble-server ] && rmdir /var/lib/mumble-server
-		fi
 	;;
 
 	remove|upgrade|failed-upgrade|abort-install|abort-upgrade|disappear)

Reply via email to