systemd/sysusers.generate-pre.sh

93 lines
2.2 KiB
Bash
Raw Normal View History

2020-02-07 15:34:30 +00:00
#!/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"
2021-05-31 11:45:35 +00:00
[ "$desc" = '-' ] && desc=
{ [ "$home" = '-' ] || [ "$home" = '' ]; } && home=/
{ [ "$shell" = '-' ] || [ "$shell" = '' ]; } && shell=/usr/sbin/nologin
2020-02-07 15:34:30 +00:00
if [ "$uid" = '-' ] || [ "$uid" = '' ]; then
2021-05-31 11:45:35 +00:00
cat <<EOF
2020-02-07 15:34:30 +00:00
getent passwd '$user' >/dev/null || \\
2022-05-25 12:18:17 +00:00
useradd -r -g '$group' -d '$home' -s '$shell' -c '$desc' '$user' || :
2020-02-07 15:34:30 +00:00
EOF
2021-05-31 11:45:35 +00:00
else
cat <<EOF
2022-05-25 12:18:17 +00:00
if ! getent passwd '$user' >/dev/null; then
if ! getent passwd '$uid' >/dev/null; then
useradd -r -u '$uid' -g '$group' -d '$home' -s '$shell' -c '$desc' '$user' || :
2020-02-07 15:34:30 +00:00
else
useradd -r -g '$group' -d '$home' -s '$shell' -c '$desc' '$user' || :
2020-02-07 15:34:30 +00:00
fi
fi
EOF
2021-05-31 11:45:35 +00:00
fi
2020-02-07 15:34:30 +00:00
}
group() {
group="$1"
gid="$2"
2021-05-31 11:45:35 +00:00
if [ "$gid" = '-' ]; then
cat <<-EOF
2022-05-25 12:18:17 +00:00
getent group '$group' >/dev/null || groupadd -r '$group' || :
2021-05-31 11:45:35 +00:00
EOF
else
cat <<-EOF
2022-05-25 12:18:17 +00:00
getent group '$group' >/dev/null || groupadd -f -g '$gid' -r '$group' || :
2021-05-31 11:45:35 +00:00
EOF
fi
2020-02-07 15:34:30 +00:00
}
usermod() {
user="$1"
group="$2"
cat <<-EOF
if getent group '$group' >/dev/null; then
usermod -a -G '$group' '$user' || :
fi
EOF
}
2020-02-07 15:34:30 +00:00
parse() {
while read -r line || [ -n "$line" ] ; do
{ [ "${line:0:1}" = '#' ] || [ "${line:0:1}" = ';' ]; } && continue
2020-02-07 15:34:30 +00:00
line="${line## *}"
[ -z "$line" ] && continue
eval "arr=( $line )"
2020-02-07 15:34:30 +00:00
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[1]}" "" ""
usermod "${arr[1]}" "${arr[2]}"
2020-02-07 15:34:30 +00:00
;;
esac
done
}
for fn in "$@"; do
[ -e "$fn" ] || continue
echo "# generated from $(basename "$fn")"
2021-05-31 11:45:35 +00:00
parse <"$fn"
2020-02-07 15:34:30 +00:00
done