dec
1
4
Dynamic Web URLs with ExpanDrive
Often when I work with ExpanDrive the files I am working on correspond to some website that I own. When I’m mounted with ExpanDrive each file is accessible via “my hard drive” in the mounted volume and, more importantly, from a web URL! I found myself repeatedly opening up my browser and manually typing the URL for files that I just uploaded or edited. This was error prone, especially if some of the characters needed encoding. So, I spent some time to write up a Ruby script that can read ExpanDrive’s preferences, build the file’s “web URL,” and open it in your default browser.
Simple to Use
I followed along with ExpanDrive’s previous command line tool named expan and named my script expanurl. Given no arguments it will open the current directory via its web URL, or you can give a list of files and each will be opened at their web URLs. Its usage is pretty straightforward but there is a single catch: the server setting in an ExpanDrive Drive may not be a true one-to-one mapping with the web server’s address.
For example: I provide holly.cs.rit.edu as the server value for one of my personal ExpanDrive drives. However, when I view files on that server (inside the public_html directory) they have a much different looking URL: http://www.cs.rit.edu/~jjp1820/. The result? The script simply keeps its own mapping of ExpanDrive server values to their associated web page prefixes. When you use expanurl on a Drive you have never used it on before the script will prompt you for that mapping, store the value, and never ask again.
Here it is in action. I have removed all stored mappings so I can demonstrate what it would be like using expanurl for the first time. Here I use it on my BogoJoker ExpanDrive drive:
Notice that in the prompt it tells you:
- the server that the ExpanDrive volume is linked to and the one you will be providing a web url prefix for
- an example of a web url prefix (useful)
- where the mappings are stored in case you need to edit them later
The script is available on GitHub, so feel free to contribute and improve. Here is a link to the always current version, and here is a snapshot of the current version at the time of writing:
#!/usr/bin/env ruby
# Author: Joseph Pecoraro
# Date: Saturday December 13, 2008
# Description: When I'm using ExpanDrive and I'm
# remotely logged into a server, I can use this
# script to "open filename" and it will open using
# the server's associated URL.
# For URL Escaping and Stored Mappings
# Exit with a msg
puts msg
exit 1
end
# Simple Class to handle the mappings
MAP_PATH = File.expand_path('~/.expanurl')
@hash = load
end
if File.exists?(MAP_PATH)
YAML::load_file( File.expand_path(MAP_PATH) )
else
Hash.new
end
end
@hash[server] = mapto
File.open(MAP_PATH, 'w') do |file|
file.write(@hash.to_yaml)
end
end
@hash.has_key?(server)
end
@hash[server]
end
MAP_PATH
end
end
# Local Variables
mapping = UrlMap.new
url_prefix = nil
server = nil
volume = nil
# Check the if the current directory is an
# ExpanDrive Volume and a public_html folder
pwd = `pwd`
match = pwd.match(/^\/Volumes\/([^\/]+)/)
if match.nil?
err("Not inside an ExpanDrive Volume")
elsif !pwd.match(/\/public_html\/?/)
err("Not inside a public_html directory.")
else
volume = match[1]
defaults = `defaults read com.magnetk.ExpanDrive Drives`
defaults.gsub!(/\n/, '')
props = defaults.match(/\{[^\}]+driveName\s+=\s+[^\}]+server\s+=\s+"([^"]+)"[^\}]+\}/)
if props
server = props[1]
else
err("This Volume ( ) is not an ExpanDrive Volume")
end
end
# Check if a mapping exists
# Otherwise create and store one
if mapping.is_mapping?(server)
url_prefix = mapping.get_mapping(server)
else
# Prompt
puts
puts "This is the first time you've used expanurl for "
puts "Please Provide us with a mapping for "
puts "Mappings are stored in "
puts "Example: http://bogojoker.com/"
print ">> "
# Store user input and proceed
url_prefix = gets.chomp
url_prefix += '/' unless url_prefix.match(/\/$/)
mapping.add_mapping(server, url_prefix)
# Terminal Output
puts
puts "Server: "
puts "Maps to: "
puts
end
# Build the URL
subpath = pwd.match(/public_html\/?(.*)/)[1]
subpath += '/' unless subpath.length.zero? || subpath.match(/\/$/)
url_prefix += subpath
# If No Files, open the directory
# Otherwise, open each provided file
if ARGV.size == 0
`open `
else
ARGV.each do |filename|
`open `
end
end
How it Works
The Ruby Script grabs the current working directory using `pwd` and checks to make sure you’re in an ExpanDrive volume. ExpanDrive volume’s are dynamically generated by parsing the ExpanDrive preferences thanks to their foresight to make them accessible via the `defaults` command. So if you’re in an ExpanDrive volume and inside a public_html directory expanurl will then use its mapping to open a uri encoded web url in your default browser with the `open` command.
The mappings are stored in a hidden YAML file in your home directory (~/.expanurl). This style of storing preferences is just like dozens of other command line applications and scripts. YAML is just a lightweight textual data format popular with Ruby, similar to JSON and XML. Its so simple that you could edit the file yourself if you wanted/needed to. For instance here is what is in mine, just two simple key/value pairs:
The Future
Its just that simple. Being a Ruby Script you can call this from GUI applications, anything with built-in shell access, etc. It should play friendly with your usual Unix tools. I will likely make this script more and more robust if others find it useful, so I’d be happy to hear some feedback.
Cheers.