### Funktionen #################################### ### Funktionen Mounter ############################ function xor() { local RES=($(echo "$1" | sed "s/../0x& /g")) local ONE=($(echo "$2" | sed "s/../0x& /g")) local COUNT1=${#RES[@]} local COUNT2=${#ONE[@]} for (( i = 0; i < $COUNT1; i++ )); do RES[$i]=$((${ONE[$(( i % COUNT2 ))]:-0} ^ ${RES[$i]:-0})) done printf "%02x" "${RES[@]}" } function already_mounted() { # Ausgabe: gemountet = true = 0, nicht gemountet = false = 1 local AUSGANG mount | grep -q " ${1} " && AUSGANG=0 || AUSGANG=1 return $AUSGANG } function mounter() { MOUNTPARAM="$1" MOUNTOPTS="$2" SHAREPATH="$3" MOUNTDIR="$4" # Ausgabe: konnte mounten: 0, konnte nicht mounten: 1, schon gemountet 2 already_mounted "$MOUNTDIR" ERR=$? if [ "$ERR" -eq 0 ]; then logger "openslx sharemapper: $SHAREPATH already mounted." AUSGANG=2 else case "$MOUNTER" in nfs) AUSGANG=0 x=2 while ! mount $MOUNTPARAM "${MOUNTOPTS}" "$SHAREPATH" "$MOUNTDIR" 2>/dev/null 1>&2; do logger "openslx sharemapper: nfs: could not mount ${SHAREPATH} to ${MOUNTDIR}, waited $x seconds, retrying." let x=x+2 if [ "$x" -gt 4 ]; then AUSGANG=1 logger "openslx sharemapper: nfs: timeout, could not mount ${SHAREPATH} to ${MOUNTDIR} using ${MOUNTOPTS}. mount.nfs installed?" break fi sleep $x done [ "$AUSGANG" -eq 0 ] && logger "openslx sharemapper: nfs: ${SHAREPATH} mounted to ${MOUNTDIR} (nfs)." ;; cifs) [ -n "$GLOBALDOMAIN" ] && MOUNTOPTS="${MOUNTOPTS},domain=$GLOBALDOMAIN" for VERSION in $CIFSVERSIONS; do x=0 AUSGANG=0 while ! mount $MOUNTPARAM "${VERSION}","${MOUNTOPTS}" "$SHAREPATH" "$MOUNTDIR" 2>/dev/null 1>&2; do logger "openslx sharemapper: cifs: could not mount ${SHAREPATH} to ${MOUNTDIR}, waited $x seconds, retrying." let x=x+2 if [ "$x" -gt 4 ]; then AUSGANG=1 logger "openslx sharemapper: cifs: timeout, could not mount ${SHAREPATH} to ${MOUNTDIR} using ${MOUNTOPTS}, cifs v${VERSION}." break fi sleep $x done [ "$AUSGANG" -eq 0 ] && break done [ "$AUSGANG" -eq 0 ] && logger "openslx sharemapper: ${SHAREPATH} mounted to ${MOUNTDIR} using ${MOUNTOPTS}, cifs $VERSION." ;; dav) while ! echo -e "${USER}\n${PASSWD}" | mount $MOUNTPARAM "$MOUNTOPTS" "$SHAREPATH" "$MOUNTDIR" 2>/dev/null 1>&2; do x=2 AUSGANG=0 logger "openslx sharemapper: dav: could not mount ${SHAREPATH} to ${MOUNTDIR}, waited another $x seconds, retrying." if [ "$x" -gt 4 ]; then AUSGANG=1 logger "openslx sharemapper: dav: timeout, could not mount ${SHAREPATH} to ${MOUNTDIR} using ${MOUNTOPTS}. mount.davfs installed?" break fi sleep $x let x=x+2 done ;; *) logger "openslx sharemapper: unknown mounter ${MOUNTER}!" ;; esac fi return $AUSGANG } function mount_share() { # USERSHAREDIR="${USERHOME}"/SHARE_"${CONFIGROW}" # ROHSHARES: Zeilennummer; Shares >=1 USERSHAREDIR="${USERHOME}"/"${SHARENAME}" if [ ! -d "$USERSHAREDIR" ]; then mkdir -p "$USERSHAREDIR" 2>/dev/null chown "$LOCALUSER":$(id --group "$LOCALUSER") "$USERSHAREDIR" chmod 700 "$USERSHAREDIR" logger "openslx sharemapper: share mount dir $USERSHAREDIR created." fi # Wenn kein Homeverzeichnis, dann share zuerst mit den Credentials aus der share-Konfig # versuchen zu mounten; wenn nicht, dann mit den Hauptcredentials nachversuchen. logger "openslx sharemapper: non-home share \"$SHARENAME\" (${CONFIGROW}) found." export USER="${SHAREUSER}" export PASSWD="${SHAREPASS}" mounter "${MOUNTPARAM}" "${MOUNTOPTS}" "${SHAREPATH}" "${USERSHAREDIR}" 2>/dev/null 1>&2 ERR=$? unset USER unset PASSWD if [ "$ERR" -eq 1 ]; then export USER="${GLOBALUSER}" export PASSWD="${PW}" logger "openslx sharemapper: Could not mount ${USERSHAREDIR}, now trying using user credentials." mounter "${MOUNTPARAM}" "${MOUNTOPTS}" "${SHAREPATH}" "${USERSHAREDIR}" 2>/dev/null 1>&2 ERR=$? # ERR merken wg. Links aus USERSHAREDIR if [ "$ERR" -eq 1 ]; then logger "openslx sharemapper: Could not mount ${USERSHAREDIR} even using user credentials; giving up." echo "Konnte Laufwerk ${SHAREPATH} nicht einhängen. mount.cifs / mount.davfs installiert?" >> "$USERLOGFILE" fi unset USER unset PASSWD fi if [ "$ERR" -eq 0 ]; then logger "openslx sharemapper: Linking ${SHARENAME}, if possible." if [ -n "${SHARENAME}" ]; then ln -s "$USERSHAREDIR" "${USERDESKTOP}"/"$SHARENAME" chown "$LOCALUSER" "${USERDESKTOP}"/"$SHARENAME" logger "openslx sharemapper: ${SHARENAME} linked." elif [ -n "${SHARELETTER}" ]; then ln -s "$USERSHAREDIR" "${USERDESKTOP}"/"$SHARELETTER" chown "$LOCALUSER" "${USERDESKTOP}"/"$SHARELETTER" logger "openslx sharemapper: No sharename found, share letter ${SHARELETTER} linked." fi else logger "openslx sharemapper: deleting previously creates share mount dir $USERSHAREDIR." rmdir "$USERSHAREDIR" 2>/dev/null fi } function mount_home() { logger "openslx sharemapper: home share \"$SHARENAME\" found (for PERSISTENT)." export USER="${GLOBALUSER}" export PASSWD="${PW}" ERRORMSG="" mounter "${MOUNTPARAM}" "${MOUNTOPTS}" "${SHAREPATH}" "${USERHOMEDIR}" 2>/dev/null 1>&2 ERR=$? unset USER unset PASSWD case $ERR in 1) logger "openslx sharemapper: could not mount home share." echo "Konnte Home-Laufwerk nicht einhängen!" >> "$USERLOGFILE" ;; 2) logger "openslx sharemapper: home share seems to be already mounted." ;; 0) logger "openslx sharemapper: Linking ${USERDESKTOP}/$(basename $USERHOMEDIR), if possible." # Changed: Link on Desktop no longer "Home-verz.", but same # name as last part of $USERHOMEDIR (-->PERSISTENT) # ln -s "$USERHOMEDIR" "${USERDESKTOP}"/"$SHARENAME" ln -s "$USERHOMEDIR" "${USERDESKTOP}"/$(basename "$USERHOMEDIR") chown "$LOCALUSER" "${USERDESKTOP}"/$(basename "$USERHOMEDIR") logger "openslx sharemapper: "${USERDESKTOP}"/$(basename "$USERHOMEDIR") linked." ;; *) logger "openslx sharemapper: Unknown error level mounting home share." ;; esac } ### Funktionen Mounter Ende ####################### set_userpart() { case "$SCRIPTUSER" in 0) USERPART="" ;; 1) USERPART=" su -c - $LOCALUSER " ;; *) logger "openslx utility: runscript: Unknown script user or script user not set. Running as user ${LOCALUSER}." # USERPART="" # old default: Running as root USERPART=" su -c - $LOCALUSER " ;; esac } ### Funktionen Ende ###############################