149 lines
3.2 KiB
Bash
Executable file
149 lines
3.2 KiB
Bash
Executable file
#!/bin/sh
|
|
#
|
|
# (Un)registers systems accounts (users/groups).
|
|
#
|
|
# Arguments: $ACTION = [run/targets]
|
|
# $TARGET = [post-install/pre-remove]
|
|
# $PKGNAME
|
|
# $VERSION
|
|
# $UPDATE = [yes/no]
|
|
#
|
|
ACTION="$1"
|
|
TARGET="$2"
|
|
PKGNAME="$3"
|
|
VERSION="$4"
|
|
UPDATE="$5"
|
|
|
|
USERADD=usr/sbin/useradd
|
|
USERDEL=usr/sbin/userdel
|
|
GROUPADD=usr/sbin/groupadd
|
|
GROUPDEL=usr/sbin/groupdel
|
|
PASSWD=usr/bin/passwd
|
|
GETENT=usr/bin/getent
|
|
|
|
group_add() {
|
|
local _grname _gid use_gid
|
|
|
|
_grname="${1%:*}"
|
|
_gid="${1#*:}"
|
|
|
|
if [ "${_gid}" != "${_grname}" ]; then
|
|
use_gid="gid ${_gid}"
|
|
fi
|
|
|
|
if ! $GETENT group ${_grname} >/dev/null; then
|
|
if [ -n "$use_gid" ]; then
|
|
$GROUPADD -r ${_grname} -g ${_gid} >/dev/null 2>&1
|
|
else
|
|
$GROUPADD -r ${_grname} >/dev/null 2>&1
|
|
fi
|
|
if [ $? -eq 0 ]; then
|
|
echo "Created ${_grname} ($use_gid) system group."
|
|
else
|
|
echo "Failed to create ${_grname} ($use_gid) system group!"
|
|
exit 1
|
|
fi
|
|
fi
|
|
}
|
|
|
|
case "$ACTION" in
|
|
targets)
|
|
echo "post-install pre-remove"
|
|
;;
|
|
run)
|
|
if [ ! -x $USERADD -a ! -x $GROUPADD -a ! -x $PASSWD -a ! -x $GETENT ]; then
|
|
exit 0
|
|
fi
|
|
|
|
if [ -z "$system_accounts" -a -z "$system_groups" ]; then
|
|
exit 0
|
|
fi
|
|
|
|
HOST_ARCH=$(uname -m)
|
|
|
|
if [ -n "$XBPS_TARGET_ARCH" -a "$XBPS_TARGET_ARCH" != "$HOST_ARCH" ]; then
|
|
USERADD=useradd
|
|
USERDEL=userdel
|
|
GROUPADD=groupadd
|
|
GROUPDEL=groupdel
|
|
PASSWD=passwd
|
|
GETENT=getent
|
|
fi
|
|
|
|
case "$TARGET" in
|
|
post-install)
|
|
# System groups required by a package.
|
|
for grp in ${system_groups}; do
|
|
if [ ! -x "$GROUPADD" ]; then
|
|
echo "WARNING: cannot create ${grp} system group (missing groupadd)"
|
|
continue
|
|
fi
|
|
group_add $grp
|
|
done
|
|
|
|
# System user/group required by a package.
|
|
for acct in ${system_accounts}; do
|
|
if [ ! -x "$USERADD" ]; then
|
|
echo "WARNING: cannot create ${acct} system user/group (missing useradd)"
|
|
continue
|
|
fi
|
|
eval homedir="\$${acct}_homedir"
|
|
eval shell="\$${acct}_shell"
|
|
eval descr="\$${acct}_descr"
|
|
eval groups="\$${acct}_groups"
|
|
[ -z "$homedir" ] && homedir="/"
|
|
[ -z "$shell" ] && shell="/sbin/nologin"
|
|
[ -z "$descr" ] && descr="$acct unpriviledged user"
|
|
[ -n "$groups" ] && user_groups="-G $groups"
|
|
|
|
group_add $acct
|
|
|
|
if ! $GETENT passwd ${acct} >/dev/null; then
|
|
$USERADD -c "$descr" -d "$homedir" \
|
|
-s "$shell" -g ${acct} $user_groups \
|
|
-r ${acct} && \
|
|
$PASSWD -l ${acct} >/dev/null 2>&1
|
|
if [ $? -eq 0 ]; then
|
|
echo "Created ${acct} system user."
|
|
else
|
|
echo "Failed to create ${acct} system user!"
|
|
exit 1
|
|
fi
|
|
fi
|
|
done
|
|
;;
|
|
pre-remove)
|
|
#
|
|
# Only unregister if we aren't updating a package.
|
|
#
|
|
if [ "$UPDATE" = "no" ]; then
|
|
for acct in ${system_accounts}; do
|
|
if [ ! -x "$USERDEL" ]; then
|
|
echo "WARNING: cannot remove ${acct} system user/group (missing userdel)"
|
|
continue
|
|
fi
|
|
$USERDEL ${acct} >/dev/null 2>&1
|
|
if [ $? -eq 0 ]; then
|
|
echo "Removed ${acct} system user/group."
|
|
fi
|
|
done
|
|
for grp in ${system_groups}; do
|
|
if [ ! -x "$GROUPDEL" ]; then
|
|
echo "WARNING: cannot remove ${acct} system group (missing groupdel)"
|
|
continue
|
|
fi
|
|
$GROUPDEL ${grp} >/dev/null 2>&1
|
|
if [ $? -eq 0 ]; then
|
|
echo "Removed ${grp} system group."
|
|
fi
|
|
done
|
|
fi
|
|
;;
|
|
esac
|
|
;;
|
|
*)
|
|
exit 1
|
|
;;
|
|
esac
|
|
|
|
exit 0
|