#!/bin/bash
# -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
source "$(dirname "$0")/lib/ulib/ulib" || exit 1
urequire DEFAULTS

function display_help() {
    uecho "$scriptname: Monter un répertoire sur un hôte distant avec davfs

USAGE
    $scriptname http[s]://host[/path] [mountpoint]

Par défaut, le répertoire distant est montée sur un répertoire avec le même nom
de base que l'hôte. Si le répertoire distant est déjà monté, il est démonté.
Les options -M et -U permettent de modifier le comportement par défaut.

OPTIONS
    -M
        Forcer le montage
    -U
        Forcer le démontage
    -o OPTIONS
        Ajouter les options spécifiées à la commande de montage
    -u USERNAME
    -p PASSWORD
    -c USERNAME:PASSWORD
        Si les credentials à utiliser ne sont pas configuré dans le fichier
        /etc/davfs2/secrets, cette option permet de les spécifier. Si cette
        option est utilisée, il est possible de rajouter
            ask_auth 0
        dans le fichier /etc/davfs2/davfs2.conf pour éviter le conflit qui se
        produit quand des informations sont demandées interactivement. C'est le
        cas par exemple si une connexion en https est faite et que la chaine de
        certification n'est pas configurée. Pour mémoire, cela se fait avec
            servercert myCAs.pem
        dans le fichier /etc/davfs2/davfs2.conf
        Bien entendu, il est préférable de configurer les credentials dans le
        fichier /etc/davfs2/secrets avec la syntaxe
            url         username    password
        ou
            mountpoint  username    password"
}

action=auto
options=
username=
password=
credentials=
parse_opts "${PRETTYOPTS[@]}" \
    --help '$exit_with display_help' \
    -M action=mount \
    -U action=umount \
    -o:,--options: options= \
    -u:,--user: username= \
    -p:,--password:,--passwd: password= \
    -c:,--credentials: credentials= \
    @ args -- "$@" && set -- "${args[@]}" || die "$args"

if ! progexists mount.davfs; then
    [ -x /usr/sbin/mount.davfs ] || die "Ce script nécessite davfs2. Sur debian, vous pouvez l'installer avec la commande
    sudo apt-get install davfs2"
fi

if is_root; then
    sudo=
else
    sudo=sudo
    options="${options:+"$options,"}uid=$USER,gid=$USER"
fi

url="$1"
[ -n "$url" ] || die "Vous devez spécifier l'url à monter"
spliturl "$url" scheme cusername cpassword host port path
[ -n "$cusername" ] && username="$cusername"
[ -n "$cpassword" ] && password="$cpassword"

if [ -n "$credentials" ]; then
    splitpair "$credentials" cusername cpassword
    [ -n "$cusername" ] && username="$cusername"
    [ -n "$cpassword" ] && password="$cpassword"
fi
[ -n "$username" ] && options="${options:+"$options,"}username=$username"

mountpoint="$2"
[ -n "$mountpoint" ] || mountpoint="$host"
[ -n "$mountpoint" ] || mountpoint=davfs
mountpoint="$(abspath "$mountpoint")"

if [ "$action" == "auto" ]; then
    if mount | grep -q "$mountpoint"; then
        action=umount
    else
        action=mount
    fi
fi

if [ "$action" == "umount" ]; then
    if $sudo umount "$mountpoint"; then
        echo "Volume $mountpoint démonté avec succès"
        rmdir "$mountpoint" 2>/dev/null
        exit 0
    fi
elif [ "$action" == "mount" ]; then
    mkdir -p "$mountpoint" || die
    cmd=($sudo mount -t davfs "$url" "$mountpoint" ${options:+-o "$options"})
    if [ -n "$password" ]; then
        echo "$password" | "${cmd[@]}"
    else
        "${cmd[@]}"
    fi && {
        echo "Volume $url monté avec succès sur $(ppath "$mountpoint")"
        exit 0
    }
fi
exit 1
