diff --git a/epel-rpm-macros.spec b/epel-rpm-macros.spec index ac377e0..4b07174 100644 --- a/epel-rpm-macros.spec +++ b/epel-rpm-macros.spec @@ -1,6 +1,6 @@ Name: epel-rpm-macros Version: 8 -Release: 26 +Release: 27 Summary: Extra Packages for Enterprise Linux RPM macros Group: System Environment/Base @@ -15,6 +15,13 @@ Source1: macros.zzz-epel-override Source2: gpgverify Source3: pythondist.attr Source9: GPL + +# sysusers https://src.fedoraproject.org/rpms/systemd/c/ced9237a14d6775a98e1a2f93880990417b4ae6e +Source21: macros.sysusers +Source22: sysusers.attr +Source23: sysusers.prov +Source24: sysusers.generate-pre.sh + # misc macros Source150: macros.build-constraints @@ -33,11 +40,22 @@ Requires: python2-rpm-macros # instead of /usr/libexec/platform-python Requires: (python-modular-rpm-macros if python3-devel) Suggests: python36-rpm-macros +#systemd additional macros https://pagure.io/epel/issue/77 +Requires: (epel-rpm-macros-systemd if systemd-rpm-macros) %description This package contains the Extra Packages for Enterprise Linux (EPEL) RPM macros for building EPEL packages. +%package systemd +Summary: Extra Packages for Enterprise Linux RPM macros (systemd) +Requires: epel-rpm-macros +Requires: systemd-rpm-macros + +%description systemd +This package contains the systemd specific Extra Packages for Enterprise +Linux (EPEL) RPM macros for building EPEL packages. + %prep %setup -cT install -pm 644 %{SOURCE9} . @@ -56,6 +74,16 @@ install -Dpm 755 %{SOURCE2} \ install -Dpm 644 %{SOURCE3} \ %{buildroot}%{_fileattrsdir}/pythondist.attr +# sysusers +install -Dpm 0644 %{SOURCE21} \ + %{buildroot}%{_rpmmacrodir}/macros.sysusers +install -Dpm 0644 %{SOURCE22} \ + %{buildroot}%{_fileattrsdir}//sysusers.attr +install -Dpm 0755 %{SOURCE23} \ + %{buildroot}%{_rpmconfigdir}/sysusers.prov +install -Dpm 0755 %{SOURCE24} \ + %{buildroot}%{_rpmconfigdir}/sysusers.generate-pre.sh + # misc macros install -Dpm 644 %{SOURCE150} \ %{buildroot}%{_rpmmacrodir}/macros.build-constraints @@ -67,11 +95,22 @@ install -Dpm 644 %{SOURCE150} \ %{_sysconfdir}/rpm/macros.zzz-epel-override %{_rpmconfigdir}/gpgverify %{_fileattrsdir}/pythondist.attr + # misc macros %{_rpmmacrodir}/macros.build-constraints +%files systemd +# sysusers +%{_rpmconfigdir}/macros.d/macros.sysusers +%{_rpmconfigdir}/fileattrs/sysusers.attr +%{_rpmconfigdir}/sysusers.prov +%{_rpmconfigdir}/sysusers.generate-pre.sh + %changelog +* Wed Jan 19 2022 Pablo Greco - 8-27 +- Backport systemd sysusers macros from Fedora + * Wed Oct 27 2021 Karolina Surma - 8-26 - Add -t, -f, -e options to %%py_check_import which emit warning when used 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/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..fd9938d --- /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" = '-' ] || [ "$home" = '' ]; } && home=/ + { [ "$shell" = '-' ] || [ "$shell" = '' ]; } && shell=/sbin/nologin + + if [ "$uid" = '-' ] || [ "$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 <<-EOF + getent group '$group' >/dev/null || groupadd -r '$group' + EOF + else + cat <<-EOF + getent group '$group' >/dev/null || groupadd -f -g '$gid' -r '$group' + EOF + fi +} + +parse() { + while read -r line || [ -n "$line" ] ; do + { [ "${line:0:1}" = '#' ] || [ "${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