Files
docker-inotify-command/runas.sh
2015-06-24 13:36:15 -04:00

117 lines
3.0 KiB
Bash
Executable File

#!/bin/bash
USER=docker
GROUP=docker
#-----------------------------------------------------------------------------------------------------------------------
function ts {
echo [`date '+%b %d %X'`]
}
#-----------------------------------------------------------------------------------------------------------------------
function process_args {
# These are meant to be globals.
UMAP=$1
GMAP=$2
UGID=$3
for NAME_UID_GID in $UMAP
do
if [[ ! "$NAME_UID_GID" =~ ^[A-Za-z0-9._][-A-Za-z0-9._]*:[0-9]{1,}:[0-9]{1,}$ ]]
then
echo "UMAP value $NAME_UID_GID is not valid. It should be of the form <user name>:<uid>:<gid>"
exit 1
fi
done
for NAME_GID in $GMAP
do
if [[ ! "$NAME_GID" =~ ^[A-Za-z0-9._][-A-Za-z0-9._]*:[0-9]{1,}$ ]]
then
echo "GMAP value $NAME_GID is not valid. It should be of the form <group name>:<gid>"
exit 1
fi
done
if [[ ! "$UGID" =~ ^[0-9]{1,}:[0-9]{1,}$ ]]
then
echo "UGID value $UGID is not valid. It should be of the form <uid>:<gid>"
exit 1
fi
}
#-----------------------------------------------------------------------------------------------------------------------
function update_users {
local UMAP=$1
if [[ "$UMAP" == "" ]]; then return; fi
echo "$(ts) Updating existing users..."
for NAME_UID_GID in $UMAP
do
local NAME=${NAME_UID_GID%:*:*}
local USER_ID=${NAME_UID_GID#*:}
USER_ID=${USER_ID%:*}
local GROUP_ID=${NAME_UID_GID#*:*:}
echo "$(ts) Setting user \"$NAME\" to user ID=\"$USER_ID\" and default group ID=\"$GROUP_ID\""
usermod -o -u $USER_ID -g $GROUP_ID $NAME
done
}
#-----------------------------------------------------------------------------------------------------------------------
function update_groups {
local GMAP=$1
if [[ "$GMAP" == "" ]]; then return; fi
echo "$(ts) Updating existing groups..."
for NAME_GID in $GMAP
do
local NAME=${NAME_GID%:*}
local GROUP_ID=${NAME_GID#*:}
echo "$(ts) Setting group \"$NAME\" to ID=\"$GROUP_ID\""
groupmod -o -g $GROUP_ID $NAME
done
}
#-----------------------------------------------------------------------------------------------------------------------
function create_user {
local UGID=$1
# Create a new user with the proper user and group ID.
local USER_ID=${UGID%:*}
local GROUP_ID=${UGID#*:}
echo "$(ts) Creating user \"$USER\" (ID $USER_ID) and group \"$GROUP\" (ID $GROUP_ID) to run the command..."
# We could be aliasing this new user to some existing user. Let's assume that's harmless.
groupadd -o -g $GROUP_ID $GROUP
useradd -o -u $USER_ID -r -g $GROUP -d /home/$USER -s /sbin/nologin -c "Docker image user" $USER
mkdir -p /home/$USER
chown -R $USER:$GROUP /home/$USER
}
#-----------------------------------------------------------------------------------------------------------------------
process_args "$@"
# Shift off the args so that we can exec $@ below
shift; shift; shift
update_users "$UMAP"
update_groups "$GMAP"
create_user "$UGID"
echo "$(ts) Running command as user \"$USER\"..."
exec /sbin/setuser $USER "$@"