#!/bin/sh set -eu LOCKFILE="/run/$(basename "$0").pid" STATEFILE="/run/$(basename "$0").state" _basedn="$(awk '{ if ($1 == "BASE") print $2 }' /etc/openldap/ldap.conf)" if [ -z "$_basedn" ]; then logger -i -t "$(basename "$0")" -p user.error -s \ "ERROR: Failed to get LDAP basedn" 1>&2 exit 1 fi if [ $# -eq 1 ]; then _filter="(&(automountKey=$1)(objectClass=automount))" elif [ $# -eq 0 ]; then _filter="(objectClass=automount)" else echo "Usage: $(basename "$0") [username]" 1>&2 exit 1 fi if [ -f "$LOCKFILE" ]; then if kill -0 "$(cat "${LOCKFILE}")" ; then _started=" ($(stat --format='%y' "$LOCKFILE"))" logger -i -t "$(basename "$0")" -p user.notice -s \ "ERROR: Lockfile exists${_started}" exit 1 else logger -i -t "$(basename "$0")" -p user.notice -s \ "WARN: Removing stale lock file" fi fi trap 'rm -f ${LOCKFILE}' INT TERM EXIT echo "$$" > "$LOCKFILE" _state="$( ldapsearch -Q -LLL -s base contextCSN | awk ' BEGIN { csn=0 } { if ($1 == "contextCSN:") { val=substr($2, 0, 21); if (val > csn) { csn = val } } } END { print csn } ' )" if [ -f "$STATEFILE" ]; then if [ "$_state" = "$(cat "$STATEFILE")" ]; then exit 0 fi fi ldapsearch -Q -LLL -b "ou=People,${_basedn}" "$_filter" automountInformation | \ awk -v_hostname="$(hostname -f)" '{ if ($1 == "automountInformation:") { split($2, _, ":"); if (_[1] == _hostname) { print _[2]; } } }' | while read -r _target ; do _user="$(basename "$_target")" _basedir="$(dirname "$_target")" [ -d "$_target" ] && continue if ! getent passwd "$_user" > /dev/null 2>&1 ; then logger -i -t "$(basename "$0")" -p user.error -s \ "ERROR: Cannot find user '${_user}'" 1>&2 continue fi if ! getent group "$_user" > /dev/null 2>&1 ; then logger -i -t "$(basename "$0")" -p user.error -s \ "ERROR: Cannot find group '${_user}'" 1>&2 continue fi if [ ! -d "$_basedir" ]; then logger -i -t "$(basename "$0")" -p user.error -s \ "ERROR: Cannot find base direcory '${_basedir}'" continue fi logger -i -t "$(basename "$0")" -p user.info \ "Creating home directory '${_target}' for user '${_user}'" install -d -o "$_user" -g "$_user" -m 0700 "$_target" su "$_user" -s /bin/bash -c "umask 077 ; cp -r /etc/skel/. '${_target}'" done echo "$_state" > "$STATEFILE"