Skip to content

Commit 644466c

Browse files
committed
Add initial sysusers macros
These are derived from Fedora's systemd-rpm-macros package, adapted for Debian/Ubuntu and debbuild.
1 parent 6b09771 commit 644466c

File tree

3 files changed

+99
-0
lines changed

3 files changed

+99
-0
lines changed

debbuild-macros.spec

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,17 +91,23 @@ with Debian Policy.
9191
mkdir -p %{buildroot}%{_debconfigdir}
9292
cp -av gpgverify %{buildroot}%{_debconfigdir}
9393
cp -av cmake/cmake-* %{buildroot}%{_debconfigdir}
94+
cp -av sysusers.generate-pre.sh %{buildroot}%{_debconfigdir}
9495
mkdir -p %{buildroot}%{_debmacrodir}
9596
cp -av macros.* %{buildroot}%{_debmacrodir}
9697

9798
%if (0%{?debian} && 0%{?debian} < 8) || (0%{?ubuntu} && 0%{?ubuntu} < 1504)
99+
rm -fv %{buildroot}%{_debconfigdir}/sysusers.generate-pre.sh
98100
rm -fv %{buildroot}%{_debmacrodir}/macros.systemd
101+
rm -fv %{buildroot}%{_debmacrodir}/macros.sysusers
99102
%endif
100103

101104
%files
102105
%doc README.md
103106
%license LICENSE*
104107
%{_debconfigdir}/gpgverify
108+
%if !((0%{?debian} && 0%{?debian} < 8) || (0%{?ubuntu} && 0%{?ubuntu} < 1504))
109+
%{_debconfigdir}/sysusers.generate-pre.sh
110+
%endif
105111
%{_debconfigdir}/cmake-*
106112
%{_debmacrodir}/macros.*
107113

macros.sysusers

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
# SPDX-License-Identifier: MIT
2+
3+
# RPM macros for packages creating system accounts
4+
#
5+
# Turn a sysusers.d file into macros specified by
6+
# https://docs.fedoraproject.org/en-US/packaging-guidelines/UsersAndGroups/#_dynamic_allocation
7+
8+
%sysusers_requires_compat Requires(pre): passwd
9+
10+
%sysusers_create_compat() \
11+
%(%{_debconfigdir}/sysusers.generate-pre.sh %{?*}) \
12+
%{nil}

sysusers.generate-pre.sh

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
#!/bin/bash
2+
3+
# SPDX-License-Identifier: MIT
4+
5+
# This script turns sysuser.d files into scriptlets mandated by Fedora
6+
# packaging guidelines. The general idea is to define users using the
7+
# declarative syntax but to turn this into traditional scriptlets.
8+
9+
user() {
10+
user="$1"
11+
uid="$2"
12+
desc="$3"
13+
group="$4"
14+
home="$5"
15+
shell="$6"
16+
17+
[ "$desc" = '-' ] && desc=
18+
{ [ "$home" = '-' ] || [ "$home" = '' ]; } && home=/
19+
{ [ "$shell" = '-' ] || [ "$shell" = '' ]; } && shell=/sbin/nologin
20+
21+
if [ "$uid" = '-' ] || [ "$uid" = '' ]; then
22+
cat <<EOF
23+
getent passwd '$user' >/dev/null || \\
24+
useradd -r -g '$group' -d '$home' -s '$shell' -c '$desc' '$user'
25+
EOF
26+
else
27+
cat <<EOF
28+
if ! getent passwd '$user' >/dev/null ; then
29+
if ! getent passwd '$uid' >/dev/null ; then
30+
useradd -r -u '$uid' -g '$group' -d '$home' -s /sbin/nologin -c '$desc' '$user'
31+
else
32+
useradd -r -g '$group' -d '$home' -s /sbin/nologin -c '$desc' '$user'
33+
fi
34+
fi
35+
36+
EOF
37+
fi
38+
}
39+
40+
group() {
41+
group="$1"
42+
gid="$2"
43+
if [ "$gid" = '-' ]; then
44+
cat <<-EOF
45+
getent group '$group' >/dev/null || groupadd -r '$group'
46+
EOF
47+
else
48+
cat <<-EOF
49+
getent group '$group' >/dev/null || groupadd -f -g '$gid' -r '$group'
50+
EOF
51+
fi
52+
}
53+
54+
parse() {
55+
while read -r line || [ -n "$line" ] ; do
56+
{ [ "${line:0:1}" = '#' ] || [ "${line:0:1}" = ';' ]; } && continue
57+
line="${line## *}"
58+
[ -z "$line" ] && continue
59+
eval "arr=( $line )"
60+
case "${arr[0]}" in
61+
('u')
62+
group "${arr[1]}" "${arr[2]}"
63+
user "${arr[1]}" "${arr[2]}" "${arr[3]}" "${arr[1]}" "${arr[4]}" "${arr[5]}"
64+
# TODO: user:group support
65+
;;
66+
('g')
67+
group "${arr[1]}" "${arr[2]}"
68+
;;
69+
('m')
70+
group "${arr[2]}" "-"
71+
user "${arr[1]}" "-" "" "${arr[2]}"
72+
;;
73+
esac
74+
done
75+
}
76+
77+
for fn in "$@"; do
78+
[ -e "$fn" ] || continue
79+
echo "# generated from $(basename "$fn")"
80+
parse <"$fn"
81+
done

0 commit comments

Comments
 (0)