Skip to content

Instantly share code, notes, and snippets.

@afragen
Created June 17, 2013 18:26
Show Gist options
  • Save afragen/5799030 to your computer and use it in GitHub Desktop.
Save afragen/5799030 to your computer and use it in GitHub Desktop.
Call in launchd plist to run at user login to automatically mount a disk. Example usage iTunes Library stored on NAS.
#!/usr/bin/env bash
# call with `mount.sh true` for debug messages
version="1.0"
dbg=false
home_vols=( "/Volumes/iTunes" "/Volumes/Drobo" ) # order is important
webdav_vols=( "/Volumes/user1" "/Volumes/user2" "/Volumes/user3" )
home_router_mac="mac-address-here"
# how to grab drobo_ip based upon drobo mac address using `netstat -rnf inet`
drobo_mac="mac-address-here"
drobo_ip=`netstat -rnf inet | grep $drobo_mac | awk {'print$1'}`
crashplan_server="mini-server"
media_server="mini-server"
mounts=( `mount | grep /Volumes | awk {'print$3'}` )
router_ip=`netstat -rnf inet | grep default | awk {'print$2'}`
router_mac=`netstat -rnf inet | grep -v link | grep -w ^$router_ip | awk {'print$2'}`
#test for any parameter, true if debugging
#test -n "$1" && dbg=$1 || dbg=false #;dbg=true
case "$1" in
"" ) ;; #if no parameter then run script
-v|--version ) echo $0" "v$version && exit 0 ;;
-d|--debug ) dbg=true ;;
*) echo -e "-v or --version for version number\n-d or --debug for debug info" ;;
esac
function debug {
[ $dbg == true ] && echo $1
}
function on_error {
echo "errno $1"
echo "rmdir $vol"
rmdir $vol
isMounted=false
}
function un_mount {
for mount in ${mounts[@]}; do
for vol in ${home_vols[@]}; do
[ $mount == $vol ] && mount | grep afp | grep $mount | awk {'print$3'} | xargs -t umount -f
done
for vol in ${webdav_vols[@]}; do
[ $mount == $vol ] && mount | grep http | grep $mount | awk {'print$3'} | xargs -t umount -f
done
done
run_iTunes
exit $?
}
function mount_disk {
run_iTunes
echo "trying to mount $vol as $1"
mkdir $vol
case "$1" in
"afp_rw" ) mount_afp afp://$drobo_ip/Drobo/$2 $vol ;;
"afp_ro" ) mount_afp -o rdonly afp://$drobo_ip/Drobo/$2 $vol ;;
#"webdav" ) mount_webdav http://host.com/webdav/$2 $vol ;;
*) echo "Usage: mount_disk [afp_rw|afp_ro|webdav] ['iTunes|webdav_disk']" ;;
esac
test $? != 0 && on_error $?
}
function run_iTunes {
[[ `mount | grep /Volumes | awk {'print$3'} | grep -Ec "(/Volumes/DroboShare)"` -ge 0 ]] && isMounted=false
[[ `mount | grep /Volumes | awk {'print$3'} | grep -Ec "(/Volumes/iTunes|/Volumes/Drobo$)"` -gt 0 ]] && isMounted=true
# startup iTunes on media_server
if ! $isMounted; then
killall -c iTunes
fi
[[ (`scutil --get ComputerName` == $media_server) && $isMounted ]] && /usr/local/etc/load_myProcess.sh
}
# if nothing mounted need $vols not empty to try when at home
[ -z $mounts ] && mounts=( "zero_mounts" )
debug "Running $0"
debug "router: ${router_ip} -- ${router_mac} -- drobo ip: ${drobo_ip}"
debug "volumes: `ls /Volumes*`"
debug "mounted volumes: `echo ${mounts[@]}`"
if [ "$router_mac" == "" ]; then
debug "not connected"
un_mount
fi
if ! [ "$router_mac" == $home_router_mac ]; then
debug "not at home"
un_mount
fi
if [ $router_mac == $home_router_mac ]; then
debug "at home"
run_iTunes
for mount in ${mounts[@]}; do
for vol in ${home_vols[@]}; do
if [ ! $mount == $vol ] && [ ! -d $vol ]; then
case $vol in
"/Volumes/Drobo" ) [ `scutil --get ComputerName` == $crashplan_server ] && mount_disk afp_rw ;;
"/Volumes/iTunes" ) [ `scutil --get ComputerName` != $crashplan_server ] && mount_disk afp_rw "iTunes" ;;
esac
fi
done
for vol in ${webdav_vols[@]}; do
if [ ! $mount == $vol ] && [ ! -d $vol ]; then
webdav=`echo $vol | awk -F/ '{print$3}'`
[ `scutil --get ComputerName` == $media_server ] && mount_disk webdav $webdav
case $vol in
"/Volumes/user1" ) [ $USER == "user1" ] && mount_disk webdav "user1" ;;
"/Volumes/user2" ) [ $USER == "user2" ] && mount_disk webdav "user2" ;;
"/Volumes/user3" ) [ $USER == "user3" ] && mount_disk webdav "user3" ;;
esac
fi
done
done
fi
run_iTunes
debug "isMounted: "$isMounted
debug "volumes: `ls /Volumes*`"
debug "mounted volumes: `mount | grep /Volumes | awk {'print$3'}`"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment