#!/bin/sh
# Copyright (c) 2007, Quinton Dolan <q@onthenet.com.au>
#
MOUNTPREFIX=${MOUNTPREFIX:-/Volumes}
SSHFS=${SSHFS:-/usr/local/bin/sshfs}
MACFUSIONSSHFS='/Applications/MacFusion.app/Contents/PlugIns/SSHFS.plugin/Contents/Resources/sshfs-static'

if [ $# -lt 1 ]; then
  echo "Usage: `basename "$0"` sftp://[user@]hostname/path [mountpoint] [volname]"
  exit 1
fi

if [ ! -x "$SSHFS" ] ; then
  SSHFS=`(test -x $MACFUSIONSSHFS && echo $MACFUSIONSSHFS) || \
	 (test -x "\`which sshfs\`" && echo \`which sshfs\`)`
fi

if [ ! -x "$SSHFS" ]; then
  echo "Cannot find sshfs binary" ; exit 1
fi

# Check that the URL is valid
PROTOCOL=`echo "$1" | \
  sed -E 's#^(sftp|sshfs)://([^@/:]{1,}@){0,1}[^@:/]{1,}(:[0-9]{1,}){0,1}/.*#sftp#'`
if [ $PROTOCOL != "sftp" ]; then
  echo "Invalid URL $1" ; exit 1
fi

# Remap URL to use ':' separation
SSHURL=`echo "$1" | sed -E 's#^(sftp|sshfs)://*([^:/]*):{0,1}([0-9]*)#\2:\3:#'`
# Extact values from URL
SSHAUTH=`echo "$SSHURL" | cut -d: -f1 | cut -d@ -f1 -s | awk '{print $1"@"}'`
SSHHOST=`echo "$SSHURL" | cut -d: -f1 | cut -d@ -f2`
SSHPORT=`echo "$SSHURL" | cut -d: -f2`
SSHPORT=${SSHPORT:-22}
SSHARGS="$SSHARGS -p$SSHPORT"
SSHPATH=`echo "$SSHURL" | sed -E 's#^([^:]*:){2}##'`

# Derive mount point and volume name if not specified
MOUNTPOINT=${2:-$SSHHOST-`basename "$SSHPATH"`}
VOLNAME=${3:-`basename "$MOUNTPOINT"`}

# If mount point contains no '/' then prepend MOUNTPREFIX
MOUNTPOINT=`echo "$MOUNTPOINT" | sed -E 's#^([^/]{1,})$#'${MOUNTPREFIX}'/\1#'`

# Check hostname looks valid
if [ ! -z `echo "$SSHHOST" | sed -E 's#[0-9A-z\-\_\.]##g'` ]; then
  echo "Invalid hostname $SSHHOST" ; exit 1
fi

# Make sure mount point is absolute path
if [ ! `echo "$MOUNTPOINT" | cut -c 1` = "/" ]; then
  echo "Mount point must be an absolute path" ; exit 1
fi

mkdir -p "${MOUNTPOINT}"
${SSHFS} "${SSHAUTH}${SSHHOST}:${SSHPATH}" "${MOUNTPOINT}" \
   ${SSHARGS} -o CheckHostIp=no,StrictHostKeyChecking=no,reconnect \
   -o volname="${VOLNAME},ping_diskarb" || rmdir ${MOUNTPOINT}
