diff --git a/macros.sysusers b/macros.sysusers new file mode 100644 index 0000000..d8d8c1d --- /dev/null +++ b/macros.sysusers @@ -0,0 +1,10 @@ +# RPM macros for packages creating system accounts +# +# Turn a sysusers.d file into macros specified by +# https://docs.fedoraproject.org/en-US/packaging-guidelines/UsersAndGroups/#_dynamic_allocation + +%sysusers_requires_compat Requires(pre): shadow-utils + +%sysusers_create_compat() \ +%(%{_rpmconfigdir}/sysusers.generate-pre.sh %{?*}) \ +%{nil} diff --git a/split-files.py b/split-files.py index 61ed548..f4d8a35 100644 --- a/split-files.py +++ b/split-files.py @@ -48,7 +48,7 @@ for file in files(buildroot): continue if '/security/pam_' in n: o = o_pam - elif 'rpm/macros' in n: + elif '/rpm/' in n: o = o_rpm_macros elif re.search(r'/lib.*\.pc|/man3/|/usr/include|(? - 245~rc1-2 -- Add default 'disable *' preset for user units - (see https://fedoraproject.org/wiki/Changes/Systemd_presets_for_user_units). +- Add default 'disable *' preset for user units (#1792474), + see https://fedoraproject.org/wiki/Changes/Systemd_presets_for_user_units. +- Add macro to generate "compat" scriptlets based off sysusers.d format + and autogenerate user() and group() virtual provides (#1792462), + see https://fedoraproject.org/wiki/Changes/Adopting_sysusers.d_format. * Wed Feb 5 2020 Zbigniew Jędrzejewski-Szmek - 245~rc1-1 - New upstream release, see diff --git a/sysusers.attr b/sysusers.attr new file mode 100644 index 0000000..367c137 --- /dev/null +++ b/sysusers.attr @@ -0,0 +1,2 @@ +%__sysusers_provides %{_rpmconfigdir}/sysusers.prov +%__sysusers_path ^%{_sysusersdir}/.*\\.conf$ diff --git a/sysusers.generate-pre.sh b/sysusers.generate-pre.sh new file mode 100755 index 0000000..1d4b95f --- /dev/null +++ b/sysusers.generate-pre.sh @@ -0,0 +1,79 @@ +#!/bin/bash + +# This script turns sysuser.d files into scriptlets mandated by Fedora +# packaging guidelines. The general idea is to define users using the +# declarative syntax but to turn this into traditional scriptlets. + +user() { + user="$1" + uid="$2" + desc="$3" + group="$4" + home="$5" + shell="$6" + +[ "$desc" = '-' ] && desc= +[ "$home" = '-' -o "$home" = '' ] && home=/ +[ "$shell" = '-' -o "$shell" = '' ] && shell=/sbin/nologin + +if [ "$uid" = '-' -o "$uid" = '' ]; then + cat </dev/null || \\ + useradd -r -g '$group' -d '$home' -s '$shell' -c '$desc' '$user' +EOF +else + cat </dev/null ; then + if ! getent passwd '$uid' >/dev/null ; then + useradd -r -u '$uid' -g '$group' -d '$home' -s /sbin/nologin -c '$desc' '$user' + else + useradd -r -g '$group' -d '$home' -s /sbin/nologin -c '$desc' '$user' + fi +fi + +EOF +fi +} + +group() { + group="$1" + gid="$2" +if [ "$gid" = '-' ]; then + cat </dev/null || groupadd -r '$group' +EOF +else + cat </dev/null || groupadd -f -g '$gid' -r '$group' +EOF +fi +} + +parse() { + while read line; do + [ "${line:0:1}" = '#' -o "${line:0:1}" = ';' ] && continue + line="${line## *}" + [ -z "$line" ] && continue + eval arr=( $line ) + case "${arr[0]}" in + ('u') + group "${arr[1]}" "${arr[2]}" + user "${arr[1]}" "${arr[2]}" "${arr[3]}" "${arr[1]}" "${arr[4]}" "${arr[5]}" + # TODO: user:group support + ;; + ('g') + group "${arr[1]}" "${arr[2]}" + ;; + ('m') + group "${arr[2]}" "-" + user "${arr[1]}" "-" "" "${arr[2]}" + ;; + esac + done +} + +for fn in "$@"; do + [ -e "$fn" ] || continue + echo "# generated from $(basename $fn)" + parse < "$fn" +done diff --git a/sysusers.prov b/sysusers.prov new file mode 100755 index 0000000..a6eda5d --- /dev/null +++ b/sysusers.prov @@ -0,0 +1,28 @@ +#!/bin/bash + +parse() { + while read line; do + [ "${line:0:1}" = '#' -o "${line:0:1}" = ';' ] && continue + line="${line## *}" + [ -z "$line" ] && continue + set -- $line + case "$1" in + ('u') + echo "user($2)" + echo "group($2)" + # TODO: user:group support + ;; + ('g') + echo "group($2)" + ;; + ('m') + echo "user($2)" + echo "group($3)" + ;; + esac + done +} + +while read fn; do + parse < "$fn" +done