So the remote folder is not always present and needs to be manually remounted. To prevent this, I wrote a script, that can be called via cron to periodically test if the remote disk is mounted, and if it is not mounted, then the script calls sshfs to remount the remote disk.
Before remounting the remote disk, it will first do a clean unmount. This is written for the mac, and uses the binary sshfs found here.
I like to think of this like a command line version of macfusion.
#!/bin/sh
#Author: rouble prmatta
#Version: 1.0
#Date: March 29th, 2011
USER=${USER}
LOCAL_MOUNT_FOLDER=""
LOCAL_MOUNT_FOLDER=""
REMOTE_MOUNT_FOLDER=""
SSHFS=${DATAHOME}/bin/mac/sshfs
LOG="${DATAHOME}/Logs/mount_remote_folder_on_${HOSTNAME}.log"
#Binaries
PING=/sbin/ping
AWK=/usr/bin/awk
ECHO=/bin/echo
DATE=/bin/date
TEE=/usr/bin/tee
TOUCH=/usr/bin/touch
LS=/bin/ls
UMOUNT=/sbin/umount
DISKUTIL=/usr/sbin/diskutil
echodate () {
$ECHO [`$DATE +%y/%m/%d_%H:%M:%S`] $@
$ECHO [`$DATE +%y/%m/%d_%H:%M:%S`] $@ >> $LOG
}
runcommand () {
echodate $@
$@ 2>&1 | $TEE -a $LOG
return ${PIPESTATUS[0]};
}
setlogfile () {
if [ -f $LOG ]
then
LOG_SIZE=`$LS -l $LOG | $AWK '{print $5}'`
if [ $LOG_SIZE -gt 10485760 ]
then
$MV -f $LOG $LOG.bak
fi
else
$TOUCH $LOG
fi
}
usage () {
echo ""
echo "Usage:"
echo ""
echo "mount_remote_folder.sh -s server-name -l local-mount-folder "
echo " -r remote-mount-folder [-v volume-name] [-t test-file] [-f]"
echo ""
echo " -s server name : name of the server from where to mount the directory"
echo " -l local mount folder : name of the local folder to mount to"
echo " -r remote mount folder: name of the remote folder to mount from"
echo " -t test file : name of a file to look for in the local folder to determine if "
echo " we're already mounted successfully (optional)"
echo " -u user name : user name (optional)"
echo " -v volume name : name of the volume (optional)"
echo " -f : force, this will re-mount if we are already mounted (optional)"
}
if [ $# -lt 2 ]
then
echo "Not enough arguments."
usage
exit -1;
fi
setlogfile
fflag=0
while [ $# -gt 0 ]
do
case "$1" in
-f) fflag=1;;
-s) SERVER="$2"; shift;;
-l) LOCAL_MOUNT_FOLDER="$2"; shift;;
-r) REMOTE_MOUNT_FOLDER="$2"; shift;;
-v) VOLNAME="$2"; shift;;
-u) USER="$2"; shift;;
-t) TESTFILE="$2"; shift;;
esac
shift
done
if [ "$SERVER" == "" ]
then
echo "No server specified."
usage
exit -1;
fi
if [ "$LOCAL_MOUNT_FOLDER" == "" ]
then
echo "No local mount folder specified."
usage
exit -1;
fi
if [ "$REMOTE_MOUNT_FOLDER" == "" ]
then
echo "No remote mount folder specified."
usage
exit -1;
fi
if [ "$VOLNAME" == "" ]
then
VOLNAME="$SERVER:$REMOTE_MOUNT_FOLDER"
fi
echodate "Using server $SERVER"
echodate "Using local mount folder $LOCAL_MOUNT_FOLDER"
echodate "Using remote mount folder $REMOTE_MOUNT_FOLDER"
if [ "$TESTFILE" != "" ]
then
echodate "Using test file $LOCAL_MOUNT_FOLDER/$TESTFILE"
fi
echodate ">>>>>>>>>>>>>>>>>>>>>> Starting mount operation..."
if [ $fflag -eq 0 ]
then
if [ "$TESTFILE" != "" ]
then
if [ -d $LOCAL_MOUNT_FOLDER/$TESTFILE ]
then
echodate ">>>>>>>>>>>>>>>>>>>>>> $LOCAL_MOUNT_FOLDER/$TESTFILE already exists. Exiting."
exit 0;
else
echodate "$LOCAL_MOUNT_FOLDER/$TESTFILE does not exist. Try to mount..."
fi
fi
#else
# If force flag is true then we will remount
fi
runcommand $PING -c 3 $SERVER
if [ $? -ne 0 ]
then
echodate ">>>>>>>>>>>>>>>>>>>>>> ERROR! Cannot ping $SERVER exiting."
exit 3;
fi
runcommand $DISKUTIL unmount force $LOCAL_MOUNT_FOLDER
runcommand $SSHFS $USER@$SERVER:$REMOTE_MOUNT_FOLDER $LOCAL_MOUNT_FOLDER -oauto_cache,reconnect,volname=$VOLNAME
if [ -d $LOCAL_MOUNT_FOLDER/$TESTFILE ]
then
echodate ">>>>>>>>>>>>>>>>>>>>>> $LOCAL_MOUNT_FOLDER successfully mounted. Exiting."
exit 0;
else
echodate ">>>>>>>>>>>>>>>>>>>>>> $LOCAL_MOUNT_FOLDER NOT successfully mounted. Exiting."
exit 4;
fi
You can call the script from cron as follows. Note that in this example, I call it every 5 minutes. Most of the time the script does nothing, but test for the existence of the test file.
*/5 * * * * /path/to/mount_remote_folder.sh -s example.com -l /local/folder -r /remote/folder -t test-file > /dev/null 2>&1
No comments:
Post a Comment