#!/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 sshfs

USAGE
    $scriptname [user@]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
    -s
        Equivalent à -o allow_other ou -o allow_root selon que l'on est root ou
        non
    -u USER
        Spécifier le user pour la connexion distante, s'il n'est pas possible de
        le spécifier dans l'url. En cas de conflit, la valeur dans l'url est
        prioritaire par rapport à cette option."
}

progexists sshfs || die "Ce script nécessite sshfs"

action=auto
ssh=ssh
options=
shared=
user=
parse_opts "${PRETTYOPTS[@]}" \
    --help '$exit_with display_help' \
    -M action=mount \
    -U action=umount \
    -S:,--ssh: ssh= \
    -o:,--options: options= \
    -s,--shared shared=1 \
    -l:,-u:,--user: user= \
    @ args -- "$@" && set -- "${args[@]}" || die "$args"

if [ -n "$shared" ]; then
    if is_root; then
        options="${options:+"$options,"}allow_other"
    else
        options="${options:+"$options,"}allow_root"
    fi
fi

remote="$1"
[ -n "$remote" ] || die "Vous devez spécifier l'hôte et le répertoire distant à monter"

# userhost représente une chaine de la forme user@host
# userhostc représente une chaine de la forme user@host[:[path1]]
# path1 représente un chemin sans slash, e.g. path
# path représente un chemin avec potentiellement des slashes, e.g. some[/path]
if [[ "$remote" == */* ]]; then
    # remote est de la forme userhostc/[path]
    splitfsep "$remote" / userhost path
    if [ -n "$path" ]; then
        # remote est de la forme userhostc/path
        if [[ "$userhost" == *:* ]]; then
            # remote est de la forme userhost:[path1]/path
            # path=[path1]/path est pris tel quel
            splitfsep "$userhost" : userhost ppath
            path="$ppath/$path"
        else
            # remote est de la forme userhost/path
            # path est pris AVEC le slash, pour faire un chemin absolu
            path="/$path"
        fi
    else
        # remote est de la forme userhostc/
        if [[ "$userhost" == *:* ]]; then
            # remote est de la forme userhost:[path1]/
            # Si path1 est non vide, il est pris tel quel, mais le slash de fin
            # est enlevé, car il est inutile. Sinon, prendre le slash uniquement
            # parce que cela signifie que l'on veut monter le répertoire racine
            # distant.
            splitfsep "$userhost" : userhost ppath
            [ -n "$ppath" ] || ppath=/
            path="$ppath"
        else
            # remote est de la forme userhost/
            # path est pris AVEC le slash, pour faire un chemin absolu
            path=/
        fi
    fi
else
    # remote est de la forme userhost[:[path1]]
    splitfsep "$remote" : userhost path
fi

splituserhost "$userhost" cuser host
[ -n "$user" ] || user="$cuser"
[ -n "$user" ] || user="$USER"
[ -n "$host" ] || die "Vous devez spécifier l'hôte distant à monter"

mountpoint="$2"
[ -n "$mountpoint" ] || mountpoint="$host"
mountpoint="$(abspath "$mountpoint")"
mkdir -p "$mountpoint" || die

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

if [ "$action" == "umount" ]; then
    if fusermount -u "$mountpoint"; then
        echo "Volume $mountpoint démonté avec succès"
        rmdir "$mountpoint" 2>/dev/null
        exit 0
    fi
elif [ "$action" == "mount" ]; then
    if sshfs "$user@$host:$path" "$mountpoint" -o ssh_command="$ssh"${options:+",$options"}; then
        echo "Volume $user@$host:$path monté avec succès sur $(ppath "$mountpoint")"
        exit 0
    else
        rmdir "$mountpoint" 2>/dev/null
    fi
fi
