parent
4ce1a695cf
commit
d733fbe476
@ -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}
|
@ -0,0 +1,2 @@
|
|||||||
|
%__sysusers_provides %{_rpmconfigdir}/sysusers.prov
|
||||||
|
%__sysusers_path ^%{_sysusersdir}/.*\\.conf$
|
@ -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 <<EOF
|
||||||
|
getent passwd '$user' >/dev/null || \\
|
||||||
|
useradd -r -g '$group' -d '$home' -s '$shell' -c '$desc' '$user'
|
||||||
|
EOF
|
||||||
|
else
|
||||||
|
cat <<EOF
|
||||||
|
if ! getent passwd '$user' >/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
|
@ -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
|
Loading…
Reference in new issue