#!/bin/bash
# $Id: cifsmount,v 1.7 2018/05/24 19:52:03 friedman Exp $

apush() { eval "$1=(\"\${$1[@]}\" \"\${@:2}\")"; }

join()
{
    local sep=$1
    local res=$2
    shift 2
    while [ $# -gt 0 ]; do
        res=$res${sep}$1
        shift
    done
    echo "$res"
}

mkoptstr()
{
    declare -a optelt
    for key in "${!cifs_opts[@]}"; do
        case ${cifs_opts[$key]} in
            '' ) apush optelt "$key" ;;
            *  ) apush optelt "$key=${cifs_opts[$key]}" ;;
        esac
    done
    join "," "${optelt[@]}"
}

env_opts()
{
    cifs_opts=( [workgroup]=WORKGROUP
                 [username]=${SUDO_USER-${LOGNAME-${USER-`id -un`}}}
                      [uid]=${UID-`id -u`}
                      [gid]=`id -g`
                 [dir_mode]=0777
                [file_mode]=0777
                     [vers]=1.0
                      [sec]=ntlm )

    for var in ${!CIFSMOUNT_*}; do
        optname=${var#CIFSMOUNT_}  # strip prefix
        optname=${optname,,}       # convert to lowercase
        cifs_opts[$optname]=${!var}
        unset $var
    done
    mkoptstr
}

parse_shares()
{
    sharemap=()
    for name in "$@"; do
        case $name in
            *\\* ) name=${name//\\//} ;; # convert all \ to /
        esac
        case $name in
            *:/* ) name=//${name%:*}${name#*:} ;;
        esac

        case $name in
            //* )
                share=$name
                mntpt=/s/${name#//}
                sharemap[$share]=$mntpt ;;

            /s/* )
                share=//${name#/s/}
                mntpt=$name
                sharemap[$share]=$mntpt ;;
        esac
    done
}

do_mounts()
{
    for share in "${!sharemap[@]}"; do
        mntpt=${sharemap[$share]}
        test -d "$mntpt" || mkdir -p "$mntpt"
        mount.cifs "$share" "$mntpt" -o "$cifs_optstr" || exitstat=$?
    done
    find /s -xdev -type d -print0 | sort -rz | xargs -0 rmdir 2> /dev/null
}

main()
{
    declare -A cifs_opts sharemap

    case ${cifs_optstr-notset} in
        notset )
            cifs_optstr=`env_opts`
            while [ $# -gt 0 ]; do
                case $1 in
                    -o ) cifs_optstr=$cifs_optstr,$2
                         shift 2 ;;
                    * ) break
                esac
            done ;;
    esac

    case ${EUID-`id -u`} in
        0 ) umask 022 ;;

        * ) export cifs_optstr
            exec sudo "$0" "$@" ;;
    esac

    exitstat=0
    parse_shares "$@"
    do_mounts
    exit $exitstat
}

main "$@"

# eof
