Files
docker-php-fpm/Dockerfiles/base/data/docker-entrypoint.d/101-uid-gid.sh
2020-11-21 15:15:02 +01:00

146 lines
4.2 KiB
Bash
Executable File

#!/usr/bin/env bash
set -e
set -u
set -o pipefail
############################################################
# Functions
############################################################
###
### Helper
###
_get_username_by_uid() {
if getent="$( getent passwd "${1}" )"; then
echo "${getent//:*}"
return 0
fi
return 1
}
_get_groupname_by_gid() {
if getent="$( getent group "${1}" )"; then
echo "${getent//:*}"
return 0
fi
return 1
}
###
### Change UID
###
set_uid() {
local uid_varname="${1}"
local username="${2}"
local homedir="${3}"
local debug="${4}"
local uid= # new uid
local spare_uid=9876 # spare uid to change another user to
if ! env_set "${uid_varname}"; then
log "info" "\$${uid_varname} not set. Keeping default uid for '${username}'." "${debug}"
else
uid="$( env_get "${uid_varname}" )"
if ! isint "${uid}"; then
log "err" "\$${uid_varname} is not an integer: '${uid}'" "${debug}"
exit 1
else
# Username with this uid already exists
if target_username="$( _get_username_by_uid "${uid}" )"; then
# It is not our user, so we need to changes his/her uid to something else first
if [ "${target_username}" != "${username}" ]; then
log "warn" "User with ${uid} already exists: ${target_username}" "${debug}"
log "info" "Changing UID of ${target_username} to ${spare_uid}" "${debug}"
run "usermod -u ${spare_uid} ${target_username}" "${debug}"
fi
fi
# Change uid and fix homedir permissions
log "info" "Changing user '${username}' uid to: ${uid}" "${debug}"
if ! run "usermod -u ${uid} ${username} 2>/dev/null" "${debug}"; then
run "usermod -u ${uid} ${username}" "${debug}"
fi
run "chown -R ${username} ${homedir} 2>/dev/null || true" "${debug}"
run "chown -R ${username} /var/lib/php/session" "${debug}"
run "chown -R ${username} /var/lib/php/wsdlcache" "${debug}"
if [ -f "/var/spool/mail/devilbox" ]; then
run "chown -R ${username} /var/spool/mail/devilbox" "${debug}"
fi
if [ -d "/etc/supervisor/custom.d" ]; then
run "chown -R ${username} /etc/supervisor/custom.d" "${debug}"
fi
fi
fi
}
###
### Change GID
###
set_gid() {
local gid_varname="${1}"
local groupname="${2}"
local homedir="${3}"
local debug="${4}"
local gid= # new gid
local spare_gid=9876 # spare gid to change another group to
if ! env_set "${gid_varname}"; then
log "info" "\$${gid_varname} not set. Keeping default gid for '${groupname}'." "${debug}"
else
# Retrieve the value from env
gid="$( env_get "${gid_varname}" )"
if ! isint "${gid}"; then
log "err" "\$${gid_varname} is not an integer: '${gid}'" "${debug}"
exit 1
else
# Groupname with this gid already exists
if target_groupname="$( _get_groupname_by_gid "${gid}" )"; then
# It is not our group, so we need to changes his/her gid to something else first
if [ "${target_groupname}" != "${groupname}" ]; then
log "warn" "Group with ${gid} already exists: ${target_groupname}" "${debug}"
log "info" "Changing GID of ${target_groupname} to ${spare_gid}" "${debug}"
run "groupmod -g ${spare_gid} ${target_groupname}" "${debug}"
fi
fi
# Change gid and fix homedir permissions
log "info" "Changing group '${groupname}' gid to: ${gid}" "${debug}"
if ! run "groupmod -g ${gid} ${groupname} 2>/dev/null" "${debug}"; then
run "groupmod -g ${gid} ${groupname}" "${debug}"
fi
run "chown -R :${groupname} ${homedir} 2>/dev/null || true" "${debug}"
run "chown -R :${groupname} /var/lib/php/session" "${debug}"
run "chown -R :${groupname} /var/lib/php/wsdlcache" "${debug}"
if [ -f "/var/spool/mail/devilbox" ]; then
run "chown -R :${groupname} /var/spool/mail/devilbox" "${debug}"
fi
if [ -d "/etc/supervisor/custom.d" ]; then
run "chown -R :${groupname} /etc/supervisor/custom.d" "${debug}"
fi
fi
fi
}
############################################################
# Sanity Checks
############################################################
if ! command -v usermod >/dev/null 2>&1; then
log "err" "usermod not found, but required." "1"
exit 1
fi
if ! command -v groupmod >/dev/null 2>&1; then
log "err" "groupmod not found, but required." "1"
exit 1
fi
if ! command -v getent >/dev/null 2>&1; then
log "err" "getent not found, but required." "1"
exit 1
fi