#!/bin/bash

user=$1
group=$2
homedir=$3

if [[ -z "${homedir}" ]]; then
	echo "Usage:     $0 <username> <group> <directory name>" >&2
	echo "Example:   $0 alice cdrexport wonderland" >&2
	exit 1
fi

if grep -q "^${user}:" /etc/passwd || grep -q "^${user}:" /etc/shadow ; then
	echo "User '${user}' already exists on system" >&2
	exit 1
fi

if grep -q "^${user}:" /home/jail/etc/passwd || grep -q "^${user}:" /home/jail/etc/shadow; then
	echo "User '${user}' already exists in chroot environment" >&2
	exit 1
fi

if ! grep -q "^${group}:" /etc/group ; then
	echo "Group '${group}' doesn't exist on system" >&2
	exit 1
fi

if ! grep -q "^${group}:" /home/jail/etc/group ; then
	echo "Group '${group}' doesn't exist in chroot environment" >&2
	exit 1
fi

# determine peer hostname
me=$(hostname)
case "${me}" in
	web01a)
		peer=web01b
		;;
	web01b)
		peer=web01a
		;;
	*)
		echo "Failed to determine peer hostname from our hostname '${me}'" >&2
		exit 1
		;;
esac

echo "Creating user '${user}' in group '${group}' with chrooted home directory '/home/${homedir}'"
echo "Press Enter to confirm or Ctrl-C to abort"
read -r

if ! useradd -d "/home/jail/home/${homedir}" -g "${group}" -M -N -s /bin/chroot-shell "${user}"; then
	echo "Failed to create user account" >&2
	exit 1
fi

pwline=$(grep "^${user}:" /etc/passwd)
if [[ -z "${pwline}" ]]; then
	echo "User account was created, but line in /etc/passwd was not found. Panic!" >&2
	exit 1
fi

echo "Set password for user ${user}:"
if ! passwd "${user}"; then
	echo "Failed to set password. Aborting." >&2
	echo "Delete user with 'userdel ${user}' before trying again." >&2
	exit 1
fi

shline=$(grep "^${user}:" /etc/shadow)
if [[ -z "${shline}" ]]; then
	echo "User account was created, but line in /etc/shadow was not found. Panic!" >&2
	exit 1
fi

# determine uid
uid=$(id -u "${user}")
if [[ -z "${uid}"  ]] || [[ "${uid}" -lt 1000 ]]; then
	echo "Invalid uid '${uid}' returned for user '${user}'. Panic!" >&2
	exit 1
fi

echo "Duplicating user on peer server ${peer}..."
if ! echo "${pwline}" | ssh "${peer}" 'cat >> /etc/passwd'; then
	echo "Failed to append line to /etc/passwd on ${peer}. Aborting." >&2
	echo "Delete user with 'userdel ${user}' before trying again." >&2
	exit 1
fi
if ! echo "${shline}" | ssh "${peer}" 'cat >> /etc/shadow'; then
	echo "Failed to append line to /etc/shadow on ${peer}. Aborting." >&2
	echo "Delete user with 'userdel ${user}' before trying again." >&2
	echo "Also clean up on ${peer} before trying again." >&2
	exit 1
fi

echo "OK."
echo "Creating home directory and jail user..."

if ! mkdir "/home/jail/home/${homedir}"; then
	echo "Failed to create home directory '/home/jail/home/${homedir}'. Aborting." >&2
	echo "Delete user with 'userdel ${user}' before trying again." >&2
	echo "Also clean up on ${peer} before trying again." >&2
	exit 1
fi
if ! chown "${user}". "/home/jail/home/${homedir}"; then
	echo "Failed to change ownership of home directory '/home/jail/home/${homedir}'. Aborting." >&2
	echo "Delete user with 'userdel ${user}' before trying again." >&2
	echo "Also clean up on ${peer} before trying again."
	exit 1
fi
if ! useradd -R /home/jail -u "${uid}" -d "/home/${homedir}" -g cdrexport -M -N -s /bin/bash "${user}"; then
	echo "Failed to create user '${user}' in chroot environment. Aborting." >&2
	echo "Delete user with 'userdel ${user}' before trying again." >&2
	echo "Also clean up on ${peer} before trying again." >&2
	exit 1
fi

echo "${user} ALL=NOPASSWD: /usr/sbin/chroot, /bin/su - ${user}" > /etc/sudoers.d/"jail-${user}"

echo "All done!"
