Bonjour-Link-Liste erstellen

Meine Remote-Desktop-Lizenz ist mal wieder abgelaufen und mal ehrlich, mehr als mal kurz einloggen und vielleicht die Zwischenablage übertragen mache ich mit dem Ding nicht. Da wäre es doch einfacher alle betreffenden Rechner als vnc.webloc abzuspeichern.
Das gleiche nur direkt als Menü macht ScreenSharingMenulet von Stefan Klieme, nur ist das nicht mehr umsonst und wenn ich damit die Clients aufrufe, kann ich so oft ich möchte das Kennwort speichern, er fragt jedes mal. Ausserdem ist die Liste einfach zu lang, wenn man sich in größeren Netzwerken aufhält =)
Das Skript hier macht also folgendes:

  • Es fragt ab nach welchem Bonjour-Services gesucht werden soll
  • listet anschließend alle Clients auf, die den gewählten Service im LAN anbieten
  • Diese können dann in einer Liste ausgewählt werden und das Skript erstellt einen entsprechenden Ordner auf dem Schreibtisch, in dem sich dann die entsprechenden Weblocs befinden.

Beim ersten Verbindung muss man vielleicht noch das Kennwort im Schlüsselbund abspeichern, aber das war es dann auch schon. Ist ein schönes Beispiel, wie man Bonjour-Informationen in der Shell verarbeiten kann.

##©hubionmac.com 2013-01-06 tested using 10.7.5
##Create webloc, afploc, vncloc files via bonjour list


## A simple Text Liste seperated with  tab
set serviceList to "Remote Desktop  _net-assistant._udp  vnc://
AFP  _afpovertcp._tcp  afp://"
set theselection to (choose from list every paragraph of serviceList) as text
if theselection ≠ "false" then
  set AppleScript's text item delimiters to "  "
  set service_name to text item 1 of theselection
  set Service_Name_Bonjour to text item 2 of theselection
  set Service_protocol to text item 3 of theselection
  
  set AppleScript's text item delimiters to ""
  
  ## get the .local hostenames of all Bonjour Clients running the selected Service
  set BonjourClientNames to return_bonjournames_running(Service_Name_Bonjour)
  if BonjourClientNames ≠ false then
    ##make a new folder at the desktop for all the weblocs  
    tell application "Finder"
      try
        set thefolder to make new folder at desktop with properties {name:service_name}
      on error
        set thefolder to folder service_name of desktop
        ## move all old weblocs into the trash
        move every item of thefolder to trash
      end try
    end tell
    ##create the weblocs (passwords can be stored in the keychain later on)
    repeat with theName in BonjourClientNames
      my makeWebloc(Service_protocol & theName & ".local", thefolder, theName)
    end repeat
  end if
end if


on return_bonjournames_running(service_name)
  ##Bonjour Namen herausfinden (die stehen im Sharing klartext mit allen Sonderzeichen)
  set myoutput to {}
  set expectCode to "
spawn -noecho dns-sd -B " & service_name & "
expect -timeout 5 eof {}
"
  set thescan to do shell script "echo " & quoted form of expectCode & "|/usr/bin/expect -f - | awk -F '" & service_name & ".' '{print $2}'"
  repeat with thescanline in every paragraph of thescan
    set thescanline to my delete_space(thescanline as text)
    if thescanline ≠ "" then
      set myoutput to myoutput & thescanline
    end if
  end repeat
  set myoutput to choose from list myoutput with multiple selections allowed
  if myoutput ≠ false then
    ##nun eigentlichen Host-Namen herausfinden, die enthalten keine Sonderzeichen bzw. können auch ganz anders lauten
    repeat with i from 1 to count of myoutput
      set expectCode to "
spawn -noecho dns-sd -L " & item i of myoutput & " " & service_name & " local
expect -timeout 1 eof {}
"
      set thescan to do shell script "echo " & quoted form of expectCode & "|/usr/bin/expect -f - | awk -F 'can be reached at ' '{print $2}'"
      repeat with theline in every paragraph of thescan
        if theline contains ".local" then
          set AppleScript's text item delimiters to ".local"
          set item i of myoutput to text item 1 of theline
          set AppleScript's text item delimiters to ""
        end if
      end repeat
      
    end repeat
  end if
  return myoutput
end return_bonjournames_running


on delete_space(thestring)
  repeat with i from 1 to count of characters of thestring
    if last character of thestring = " " then
      set thestring to (((characters 1 through -2 of thestring) as text) as text)
      set is_modified to true
    else
      exit repeat
    end if
  end repeat
  repeat with i from 1 to count of characters of thestring
    if first character of thestring = " " then
      set thestring to (((characters 2 through -1 of thestring) as text) as text)
      set is_modified to true
    else
      exit repeat
    end if
  end repeat
  return thestring
end delete_space

on makeWebloc(theURL, thefolder, theName)
  tell application "Finder" to set webloc to make new internet location file to theURL at thefolder with properties {name:theName}
end makeWebloc
									

Leave a Reply