Zbigniew Jędrzejewski-Szmek ced923
#!/bin/bash
Zbigniew Jędrzejewski-Szmek ced923
Zbigniew Jędrzejewski-Szmek ced923
# This script turns sysuser.d files into scriptlets mandated by Fedora
Zbigniew Jędrzejewski-Szmek ced923
# packaging guidelines. The general idea is to define users using the
Zbigniew Jędrzejewski-Szmek ced923
# declarative syntax but to turn this into traditional scriptlets.
Zbigniew Jędrzejewski-Szmek ced923
Zbigniew Jędrzejewski-Szmek ced923
user() {
Zbigniew Jędrzejewski-Szmek ced923
    user="$1"
Zbigniew Jędrzejewski-Szmek ced923
    uid="$2"
Zbigniew Jędrzejewski-Szmek ced923
    desc="$3"
Zbigniew Jędrzejewski-Szmek ced923
    group="$4"
Zbigniew Jędrzejewski-Szmek ced923
    home="$5"
Zbigniew Jędrzejewski-Szmek ced923
    shell="$6"
Zbigniew Jędrzejewski-Szmek ced923
Zbigniew Jędrzejewski-Szmek ced923
[ "$desc" = '-' ] && desc=
Zbigniew Jędrzejewski-Szmek ced923
[ "$home" = '-' -o "$home" = '' ] && home=/
Zbigniew Jędrzejewski-Szmek ced923
[ "$shell" = '-' -o "$shell" = '' ] && shell=/sbin/nologin
Zbigniew Jędrzejewski-Szmek ced923
Zbigniew Jędrzejewski-Szmek ced923
if [ "$uid" = '-' -o "$uid" = '' ]; then
Zbigniew Jędrzejewski-Szmek ced923
    cat <
Zbigniew Jędrzejewski-Szmek ced923
getent passwd '$user' >/dev/null || \\
Zbigniew Jędrzejewski-Szmek ced923
    useradd -r -g '$group' -d '$home' -s '$shell' -c '$desc' '$user'
Zbigniew Jędrzejewski-Szmek ced923
EOF
Zbigniew Jędrzejewski-Szmek ced923
else
Zbigniew Jędrzejewski-Szmek ced923
    cat <
Zbigniew Jędrzejewski-Szmek ced923
if ! getent passwd '$user' >/dev/null ; then
Zbigniew Jędrzejewski-Szmek ced923
    if ! getent passwd '$uid' >/dev/null ; then
Zbigniew Jędrzejewski-Szmek ced923
        useradd -r -u '$uid' -g '$group' -d '$home' -s /sbin/nologin -c '$desc' '$user'
Zbigniew Jędrzejewski-Szmek ced923
    else
Zbigniew Jędrzejewski-Szmek ced923
        useradd -r -g '$group' -d '$home' -s /sbin/nologin -c '$desc' '$user'
Zbigniew Jędrzejewski-Szmek ced923
    fi
Zbigniew Jędrzejewski-Szmek ced923
fi
Zbigniew Jędrzejewski-Szmek ced923
Zbigniew Jędrzejewski-Szmek ced923
EOF
Zbigniew Jędrzejewski-Szmek ced923
fi
Zbigniew Jędrzejewski-Szmek ced923
}
Zbigniew Jędrzejewski-Szmek ced923
Zbigniew Jędrzejewski-Szmek ced923
group() {
Zbigniew Jędrzejewski-Szmek ced923
    group="$1"
Zbigniew Jędrzejewski-Szmek ced923
    gid="$2"
Zbigniew Jędrzejewski-Szmek ced923
if [ "$gid" = '-' ]; then
Zbigniew Jędrzejewski-Szmek ced923
    cat <
Zbigniew Jędrzejewski-Szmek ced923
getent group '$group' >/dev/null || groupadd -r '$group'
Zbigniew Jędrzejewski-Szmek ced923
EOF
Zbigniew Jędrzejewski-Szmek ced923
else
Zbigniew Jędrzejewski-Szmek ced923
    cat <
Zbigniew Jędrzejewski-Szmek ced923
getent group '$group' >/dev/null || groupadd -f -g '$gid' -r '$group'
Zbigniew Jędrzejewski-Szmek ced923
EOF
Zbigniew Jędrzejewski-Szmek ced923
fi
Zbigniew Jędrzejewski-Szmek ced923
}
Zbigniew Jędrzejewski-Szmek ced923
Zbigniew Jędrzejewski-Szmek ced923
parse() {
Zbigniew Jędrzejewski-Szmek ced923
    while read line; do
Zbigniew Jędrzejewski-Szmek ced923
        [ "${line:0:1}" = '#' -o "${line:0:1}" = ';' ] && continue
Zbigniew Jędrzejewski-Szmek ced923
        line="${line## *}"
Zbigniew Jędrzejewski-Szmek ced923
        [ -z "$line" ] && continue
Zbigniew Jędrzejewski-Szmek ced923
        eval arr=( $line )
Zbigniew Jędrzejewski-Szmek ced923
        case "${arr[0]}" in
Zbigniew Jędrzejewski-Szmek ced923
            ('u')
Zbigniew Jędrzejewski-Szmek ced923
                group "${arr[1]}" "${arr[2]}"
Zbigniew Jędrzejewski-Szmek ced923
                user "${arr[1]}" "${arr[2]}" "${arr[3]}" "${arr[1]}" "${arr[4]}" "${arr[5]}"
Zbigniew Jędrzejewski-Szmek ced923
                # TODO: user:group support
Zbigniew Jędrzejewski-Szmek ced923
                ;;
Zbigniew Jędrzejewski-Szmek ced923
            ('g')
Zbigniew Jędrzejewski-Szmek ced923
                group "${arr[1]}" "${arr[2]}"
Zbigniew Jędrzejewski-Szmek ced923
                ;;
Zbigniew Jędrzejewski-Szmek ced923
            ('m')
Zbigniew Jędrzejewski-Szmek ced923
                group "${arr[2]}" "-"
Zbigniew Jędrzejewski-Szmek ced923
                user "${arr[1]}" "-" "" "${arr[2]}"
Zbigniew Jędrzejewski-Szmek ced923
                ;;
Zbigniew Jędrzejewski-Szmek ced923
        esac
Zbigniew Jędrzejewski-Szmek ced923
    done
Zbigniew Jędrzejewski-Szmek ced923
}
Zbigniew Jędrzejewski-Szmek ced923
Zbigniew Jędrzejewski-Szmek ced923
for fn in "$@"; do
Zbigniew Jędrzejewski-Szmek ced923
    [ -e "$fn" ] || continue
Zbigniew Jędrzejewski-Szmek ced923
    echo "# generated from $(basename $fn)"
Zbigniew Jędrzejewski-Szmek ced923
    parse < "$fn"
Zbigniew Jędrzejewski-Szmek ced923
done