#!/bin/sh -e

export IFS=' 	
'
export PATH=/sbin:/usr/sbin:/bin:/usr/bin
umask 022

. "/usr/libexec/girar/girar-sh-functions"

sudo_init

# Validate /etc/girar/packages.git
GIT_DIR="/etc/girar/packages.git" git rev-parse --git-dir >/dev/null

# Validate /etc/girar/private.git
GIT_DIR="/etc/girar/private.git" git rev-parse --git-dir >/dev/null

usage()
{
	echo "$PROG: $*" >&2
	echo "usage: $PROG <NAME> <IDENTITY FILE> <GECOS>"
	exit 1
}

set_name "$1"
shift
printf %s "$NAME" |egrep -qs '^[a-z][a-z_0-9][a-z_0-9]+$' ||
	fatal "$NAME: invalid NAME specified"

load_identity "$1"
shift

GECOS="$*"
[ -n "$GECOS" ] ||
	usage 'not specified: GECOS'
[ -n "${GECOS//*:*/}" ] ||
	fatal "$NAME: invalid GECOS specified"

IT_NAME="git_$NAME"
IT_HOME="/usr/share/girar/home"
IT_SHELL="/usr/libexec/girar/girar-sh"
GIRAR_HOME="/people"
REAL_HOME="$GIRAR_HOME/$NAME"

[ -d "$IT_HOME" ] ||
	fatal "error adding $NAME: directory $IT_HOME not available"
[ -d "$GIRAR_HOME" ] ||
	fatal "error adding $NAME: directory $GIRAR_HOME not available"

AUTH="/etc/openssh/authorized_keys/$IT_NAME"
[ ! -e "$AUTH" ] ||
	fatal "error adding $NAME: authorized keys file '$AUTH' already exists"

useradd -c "$GECOS" -d "$IT_HOME" -g 'girar' -M -s "$IT_SHELL" "$IT_NAME" ||
	fatal "$IT_NAME: error adding user"

printf '%s:\t%s@etersoft.ru\n' "$IT_NAME" "$NAME" >>"/etc/girar/aliases" &&
	newaliases ||
	fatal "$IT_NAME: error adding email alias"

echo "no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty $IDENTITY" >"$AUTH" ||
	fatal "error creating authorized keys file '$AUTH' for user $IT_NAME"

GIRAR_HOME_MOUNT="$(df -P "$GIRAR_HOME" |awk '{dir=$6} END{print dir}')"
setquota "$IT_NAME" 1000000 1500000 100000 150000 "$GIRAR_HOME_MOUNT" ||
	message "$IT_NAME: failed to set disk quota on $GIRAR_HOME_MOUNT"

install -d -o "$IT_NAME" -g girar -m755 "$REAL_HOME" ||
	fatal "$IT_NAME: failed to create $REAL_HOME"

install -d -o "$IT_NAME" -g girar -m755 "$REAL_HOME/packages" ||
	fatal "$IT_NAME: failed to create $REAL_HOME/packages"

install -d -o "$IT_NAME" -g girar -m751 "$REAL_HOME/private" ||
	fatal "$IT_NAME: failed to create $REAL_HOME/private"

install -d -o "$IT_NAME" -g girar -m755 "$REAL_HOME/public" ||
	fatal "$IT_NAME: failed to create $REAL_HOME/public"

install -d -o "$IT_NAME" -g wheel -m750 "$REAL_HOME/etc" ||
	fatal "$IT_NAME: failed to create $REAL_HOME/etc"

for n in packages private public; do
	EMAIL_DIR="/var/lib/girar/email/$n"
	mkdir -p "$EMAIL_DIR"
	install -d -o "$IT_NAME" -g girar -m755 "$EMAIL_DIR/$NAME" ||
		fatal "$IT_NAME: failed to create $EMAIL_DIR/$NAME"
done

for d in "/var/spool/girar/people/$NAME"; do
	install -d -o "$IT_NAME" -g girar -m755 "$d" ||
		fatal "$IT_NAME: failed to create $d"
done

git_clone()
{
	local src="$1"; shift
	local dst="$1"; shift

	su -l "$IT_NAME" -s /bin/sh -c \
		"git clone --bare --template=/usr/share/girar/templates '$src' '$dst'" ||
	fatal "$IT_NAME: failed to setup $dst"
}

git_clone "/etc/girar/packages.git" "$REAL_HOME/etc/packages.git"
git_clone "/etc/girar/private.git" "$REAL_HOME/etc/private.git"
git_clone "/etc/girar/public.git" "$REAL_HOME/etc/public.git"
