summaryrefslogtreecommitdiffstats
path: root/server/modules/auth-freiburg/opt/openslx/scripts/pam_script_mount_persistent
diff options
context:
space:
mode:
Diffstat (limited to 'server/modules/auth-freiburg/opt/openslx/scripts/pam_script_mount_persistent')
-rw-r--r--server/modules/auth-freiburg/opt/openslx/scripts/pam_script_mount_persistent99
1 files changed, 99 insertions, 0 deletions
diff --git a/server/modules/auth-freiburg/opt/openslx/scripts/pam_script_mount_persistent b/server/modules/auth-freiburg/opt/openslx/scripts/pam_script_mount_persistent
new file mode 100644
index 00000000..dbe6ef01
--- /dev/null
+++ b/server/modules/auth-freiburg/opt/openslx/scripts/pam_script_mount_persistent
@@ -0,0 +1,99 @@
+###################################################################
+#
+# This script is a part of the pam_script_ses_open script
+# and is not stand-alone!
+#
+# It will try to mount the home directories of students
+# under /home/<user>/PERSISTENT using cifs/kerberos.
+#
+
+# Only run this if PAM_USER is not a local user.
+if ! grep -q "^${PAM_USER}:" "/etc/passwd"; then
+
+ # determine fileserver and share for home directories
+ ldapsearch -x -LLL uid="${PAM_USER}" rufHomepath homeDirectory rufFileserver> "/tmp/ldapsearch.${PAM_USER}" || \
+ { slxlog "pam-freiburg-ldapquery" "Could not query LDAP server for parameters of user '${PAM_USER}'."; exit 1; }
+
+ CIFS_VOLUME=$(cat /tmp/ldapsearch.${PAM_USER} | grep rufHomepath | cut -d" " -f2 | tr '\\' '/')
+
+ if [ ! -z "${CIFS_VOLUME}" ]; then
+ # now we can mount the home directory!
+ MOUNT_OPTS="-t cifs -o uid=${USER_UID},gid=${USER_GID},forceuid,forcegid,file_mode=0700,dir_mode=0700,nobrl,noacl"
+ export USER="${PAM_USER}"
+ export PASSWD="${PAM_AUTHTOK}"
+
+ SIGNAL=$(mktemp)
+ MOUNT_OUTPUT=$(mktemp)
+ rm -f -- "${SIGNAL}"
+ ( mount -v ${MOUNT_OPTS} "${CIFS_VOLUME}" "${PERSISTENT_HOME_DIR}" > "$MOUNT_OUTPUT" 2>&1 || touch "${SIGNAL}" ) &
+ MOUNT_PID=$!
+ for COUNTER in 1 2 4 4; do
+ kill -0 "${MOUNT_PID}" 2>/dev/null || break
+ sleep "${COUNTER}"
+ done
+
+ if [ -e "${SIGNAL}" ]; then
+ slxlog "pam-freiburg-cifs" "Mount of '${CIFS_VOLUME}' to '${PERSISTENT_HOME_DIR}' failed. (Args: ${MOUNT_OPTS})" "$MOUNT_OUTPUT"
+ rm -f -- "${SIGNAL}"
+ elif kill -9 "${MOUNT_PID}" 2>/dev/null; then
+ slxlog "pam-freiburg-cifs" "Mount of '${CIFS_VOLUME}' to '${PERSISTENT_HOME_DIR}' timed out. (Args: ${MOUNT_OPTS})" "$MOUNT_OUTPUT"
+ else
+ PERSISTENT_OK=yes
+ fi
+ ( sleep 2; rm -f -- "$MOUNT_OUTPUT" ) &
+ else
+ slxlog "pam-freiburg-ldap-cifs-volume" "LDAP server did not provide 'rufHomepath'. Aborting mount for ${PAM_USER}."
+ fi
+
+ # unset credentials
+ unset USER
+ unset PASSWD
+
+ # check if cifs mount worked.
+ if [ -z "$PERSISTENT_OK" ]; then
+
+ # determine the server and paths to the user's home directory
+ FILESERVER=$(cat /tmp/ldapsearch.${PAM_USER} | grep rufFileserver | cut -d" " -f2)
+ VOLUME=$(cat /tmp/ldapsearch.${PAM_USER} | grep homeDirectory | cut -d" " -f2)
+
+ [ -z "${FILESERVER}" ] && slxlog "pam-freiburg-ldapfs" "LDAP server did not provide 'rufFileserver'. Aborting mount for ${PAM_USER}." && exit 1
+ [ -z "${VOLUME}" ] && slxlog "pam-freiburg-ldapvolume" "LDAP server did not provide 'homeDirectory'. Aborting mount for ${PAM_USER}." && exit 1
+
+ # generate keytab (try twice :))
+ sslconnect npserv.ruf.uni-freiburg.de:3 > /etc/krb5.keytab || \
+ sslconnect npserv.ruf.uni-freiburg.de:3 > /etc/krb5.keytab || \
+ { slxlog "pam-freiburg-sslconnect" "Could not get /etc/krb5.keytab from npserv.ruf.uni-freiburg.de"; [ ! -s /etc/krb5.keytab ] && exit 1; }
+
+ chmod 600 /etc/krb5.keytab || \
+ { slxlog "pam-freiburg-keytab" "Could not run 'chmod 600 /etc/krb5.keytab'"; exit 1; }
+
+ MOUNT_OPTS="-t nfs4 -o rw,nosuid,nodev,nolock,intr,hard,sloppy"
+
+ if echo "$FILESERVER" | grep -q "sunfs6"; then
+ MOUNT_OPTS="${MOUNT_OPTS},sec=krb5i"
+ else
+ MOUNT_OPTS="${MOUNT_OPTS},sec=krb5p"
+ fi
+
+ SIGNAL=$(mktemp)
+ MOUNT_OUTPUT=$(mktemp)
+ rm -f -- "${SIGNAL}"
+ ( mount -v ${MOUNT_OPTS} "${FILESERVER}:${VOLUME}" "${PERSISTENT_HOME_DIR}" > "$MOUNT_OUTPUT" 2>&1 || touch "${SIGNAL}" ) &
+ MOUNT_PID=$!
+ for COUNTER in 1 2 4 4; do
+ kill -0 "${MOUNT_PID}" 2>/dev/null || break
+ sleep "${COUNTER}"
+ done
+
+ if [ -e "${SIGNAL}" ]; then
+ slxlog "pam-freiburg-krb" "Mount of '${FILESERVER}:${VOLUME}' to '${PERSISTENT_HOME_DIR}' failed. (Args: ${MOUNT_OPTS})" "$MOUNT_OUTPUT"
+ rm -f -- "${SIGNAL}"
+ elif kill -9 "${MOUNT_PID}" 2>/dev/null; then
+ slxlog "pam-freiburg-krb" "Mount of '${FILESERVER}:${VOLUME}' to '${PERSISTENT_HOME_DIR}' timed out. (Args: ${MOUNT_OPTS})" "$MOUNT_OUTPUT"
+ else
+ PERSISTENT_OK=yes
+ fi
+ ( sleep 2; rm -f -- "$MOUNT_OUTPUT" ) &
+ fi
+fi
+