Instantly share code, notes, and snippets.

Embed
What would you like to do?
AppleScript for converting "localhost" address to your Mac's current IP address. This enables testing in VMs (they can't resolve localhost but *can* resolve the local IP). This also enables your coworkers to view pages being served from your Mac. Read more at http://pipwerks.com/2014/03/08/convert-localhost-to-your-macs-current-ip-address/
(* functions *)
-- string replace function from http://www.macosxautomation.com/applescript/sbrt/sbrt-06.html
on replace_chars(this_text, search_string, replacement_string)
set AppleScript's text item delimiters to the search_string
set the item_list to every text item of this_text
set AppleScript's text item delimiters to the replacement_string
set this_text to the item_list as string
set AppleScript's text item delimiters to ""
return this_text
end replace_chars
-- replaces specified domain with IP address in specified URLs
on replace_localhost(theDomain, theURL, theIP)
set newURL to ""
if theDomain is in theURL then
set newURL to replace_chars(theURL, theDomain, theIP)
else
set newURL to "http://" & theIP & "/"
end if
return newURL
end replace_localhost
-- copies URL to clipboard and ensures original app remains active (frontmost)
on copy_to_clipboard(theText, currentApp)
try
tell application "Finder"
set the clipboard to theText as text
-- display alert "\"" & (the clipboard) & "\" was copied to the clipboard"
end tell
tell application "System Events" to set frontmost of process currentApp to true
end try
end copy_to_clipboard
on run
-- If user has custom hostname, let's get it
display dialog "If you are using a custom localhost domain (via VirtualHostX or similar), please enter the domain now:" default answer "localhost"
set domain to text returned of result
-- empty list for placing localhost URLs
set localhostURLs to {}
-- placeholder for target URL
set selectedURL to ""
-- get name of current active app so we can switch back after getting IP address
tell application "System Events"
set currentApp to item 1 of (get name of processes whose frontmost is true)
end tell
(*
get the IP of localhost. try en0 first, then en1 if no result found
originally used ifconfig with grep, like so:
do shell script "ifconfig en0|grep \"inet \"|cut -d ' ' -f 2"
A shorter, more concise method was described in The Macintosh Terminal Pocket Guide by Daniel J. Barrett
do shell script "ipconfig getifaddr en0"
This method sometimes produces an error in AppleScript. To avoid the error, add ";exit 0"
"ipconfig getifaddr en0; exit 0"
See this URL for an explanation
http://lists.apple.com/archives/applescript-studio/2006/Jul/msg00141.html
*)
-- try en0 (if both wired and wireless are available, en0 is usually the wired connection)
set theIP to do shell script "ipconfig getifaddr en0; exit 0"
-- if en0 didn't work, try en1
if theIP is equal to "" then
set theIP to do shell script "ipconfig getifaddr en1; exit 0"
end if
-- if both en0 and en1 don't work, you're out of luck
if theIP is equal to "" then
display dialog "Sorry, your IP address couldn't be determined."
return
end if
(*
Check Google Chrome
Loop to find localhost (or custom domain)
Code adapted from http://superuser.com/questions/263198/switch-between-google-chrome-tabs-using-applescript
*)
if application "Google Chrome" is running then
tell application "Google Chrome"
set i to 0
try
repeat with t in (tabs of (first window))
set i to i + 1
if domain is in URL of t then
set localhostURLs to localhostURLs & URL of t
end if
end repeat
end try
end tell
end if
(*
Check Apple Safari
Loop to find localhost (or custom domain)
*)
if application "Safari" is running then
tell application "Safari"
set i to 0
try
repeat with t in (tabs of (first window))
set i to i + 1
if domain is in URL of t then
set localhostURLs to localhostURLs & URL of t
end if
end repeat
end try
end tell
end if
-- Clean up the URLs: replace all instances of "localhost" with IP
set i to 1
repeat with theURL in localhostURLs
set item i of localhostURLs to replace_localhost(domain, theURL, theIP)
set i to i + 1
end repeat
if (count of localhostURLs) is greater than 1 then
choose from list localhostURLs with prompt "Which URL would you like to copy?" OK button name "Copy" default items item 1 of localhostURLs
-- "cancel" button will return a value of false
if the result is not false then
set selectedURL to item 1 of the result as text
end if
if selectedURL is not "" then copy_to_clipboard(selectedURL, currentApp)
else if (count of localhostURLs) is equal to 1 then
set selectedURL to item 1 of localhostURLs as text
copy_to_clipboard(selectedURL, currentApp)
display dialog selectedURL & " has been copied to your clipboard"
end if
end run
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment