How to Automatically Connect and Stay Connected to a Network Drive on OS X
I keep my music and my photos on a server at home. Whenever I’m home I want all of my shares to be accessible automatically so I can launch iTunes and iPhoto without needing to do anything first (i.e. I don’t want to click anything to mount the drives before I start listening to Adagio for Tron). Here’s how I pulled it off.
The short version: I run a script that checks whether any mounts are missing and if possible it restores them. Here’s the script:
#!/usr/bin/env ruby
require 'ruby-debug'
require 'dnssd'
require 'timeout'
login = 'login'
password = 'password'
host = 'fileserver-computer'
shares = [
'Music',
'Photos'
]
def file_server_online?(host)
begin
service = DNSSD::Service.new
timeout 3 do
service.query_record "#{host}._afpovertcp._tcp.local", DNSSD::Record::SRV do |record|
# FIXME: a valid record may be returned even when the server is missing, not sure...
# I only saw timeouts in that case
return true if record
break
end
end
rescue Timeout::Error
return false
end
end
shares_to_mount = shares - `mount`.scan(/on (.*) \(/).flatten.select
{|a| a =~ /^\/Volumes\//}.map {|a| a.sub('/Volumes/','')}
if shares_to_mount.size > 0 && file_server_online?(host)
shares_to_mount.each do |share|
Dir.mkdir("/Volumes/#{share}") if !File.exists?("/Volumes/#{share}")
`mount_afp -s afp://#{login}:#{password}@#{host}.local/#{share} /Volumes/#{share}`
end
end
I run it once a minute usingĀ launchd for which there’s a good GUI; and here’s a tip in case you’re using RVM. If you want to try this at home, you’ll also need to install the gems ‘required’ at the top of the script.
There are a number of other ways to achieve a similar effect, but I had trouble getting them to work:
- Mount a share at login. Judging by the number of discussions that reference this technique (and its cousins) it would seem popular, but it didn’t quite do what I wanted–each time my machine woke up from sleep or my wifi connection was interrupted, I’d lose my mounts and would need to manually remount them (or logout and login again).
- Use the automount feature of OSX. This sure looked promising, but I found it to be unreliable in practice. Sometimes my mount would be there, sometimes it would not, sometimes it was there but no files appeared when I browsed…
- Detect when I connect to my home network, run a mounting script then (using SideKick). This solution got a bit closer–it reconnects my shares after I wake from sleep or my network connection was otherwise interrupted, but a loss of connection to my file server was not always proceeded by a loss of connection to the network, so there were plenty of times when I was still forced to manually connect to my drives.
- Use an app that does what my script does: detect when my file server is accessible and restore the connections to it as needed. BonjourMounter does just that, but I found it to be unreliable on Lion. A Lion compatible version is in the works, but after waiting a couple months, I decided to take matters into my own hands.
That’s all folks, thanks for stopping by!
Update on September 23, 2011:
I’m finding Bonjour to be a bit flaky…there are plenty of times I can ping and mount my NAS, but it won’t show up in a Bonjour search. In light of that, I changed file_server_online() to use ping:
def file_server_online?(host)
ping_count = 1
result = `ping -q -c #{ping_count} #{host}`
if ($?.exitstatus == 0)
return true
else
return false
end
end
