Applescript - hoe het 'path' vinden naar een mounted share?

Vreemd maar mijn topic was verdwenen, dus effe opnieuw.

Moderators, de eerdere, van vannacht, als deze gevonden wordt, mag verwijderd worden.

Hoe weet ik welk pad gemaakt wordt als ik met applescript een share mount?
B.v ik heb op een bepaald moment een ‘public’ share van NAS1 welke dan een pad heeft ‘/Volumes/Public’.

Daarna ( of ervoor ) komt er een Applescript geactiveerde mount van NAS2 welke ook een public share heeft en een pad krijgt van ‘/Volumes/Public2’.

Maar hoe weet ik nu hoe het pad betrouwbaar is. Want als er geen ‘/Volumes/Public’ reeds aanwezig is dan heet het pad ‘/Volumes/Public’ ipv ‘Public2’?

Is de enige juiste manier om b.v. van te voren een lijst met ‘disks’ ophalen en dan vergelijken, of is er een betrouwbaarder manier?

Ik gebruik het volgende

on mountAvailable(serverName, shareName)
	tell application "System Events" to set diskNames to name of every disk
	if gDebug = true then set theChosenOne to choose from list diskNames
	if shareName is in diskNames then
		if gDebug = true then display dialog quoted form of shareName & " is already mounted." & return buttons {"OK"} default button 1
		log "Share Found"
	else
		set mountAddr to "afp://" & serverName & "/" & shareName
		if gDebug = true then display dialog quoted form of mountAddr buttons {"OK"} default button 1
		try
			log "Disk Not Found, mounting now…"
			set volumeName to POSIX path of ((mount volume mountAddr as user name "admin") as alias)
		on error
			if shareName is not in diskNames then
				log "Mounting failed"
				if gDebug = true then display dialog quoted form of shareName & " is failed to mount." & return buttons {"OK"} default button 1
			end if
		end try
	end if	
end mountAvailable

maar dit is niet betrouwbaar vanwege eerder genoemde redenen.

Dat weet je niet, daarom returned het command ook het pad naar het volume.

Je bedoeld in plaats van “/Volumes/Public2”?

Er zijn twee manieren om dit betrouwbaarder te maken. Ten eerste zou ik niet afgaan op disk names maar op werkelijke mount points. Mount points zijn de paden waarop de volumes zijn gemount. Maar dan nog heb je geen garantie of het volume van de juiste server is gemount. Het is beter om te achterhalen welke share van welke server komt. Op dit moment (ben aan het kijken of het zinvol is om dit te implementeren in AppleScript Toolbox.osax) kan dit alleen vanuit bash voor AppleScript voor zover ik weet. AppleScriptObjC heeft wel bridge support voor DiskAttributes.Framework maar vraag me af in hoeverre het met dit framework mogelijk is om de bron van het volume te achterhalen en deze informatie in AppleScript ook bruikbaar is. Het lijkt me dat dit een brtrouwbaardere oplossing is.

on mounAvailable(theServer, theVolume, theUser, thePasswd)
	set predictedLine to "//" & theUser & "@" & theServer & "/" & theVolume
	set shellResults to do shell script "mount | grep ^" & quoted form of predictedLine & " || echo no"
	if shellResults is not "no" then
		set mountPoint to item 1 of (AST find regex " on (.*) \\(" in string shellResults regex group 2)
	else
		set mountPoint to POSIX path of (mount volume "afp:" & predictedLine)
	end if
end mounAvailable

Als het volume al gemount is returned het het pad dat bij de gebruikersnaam, server en volume hoort. Het voorbeeld script maakt gebruikt van AppleScript Toolbox.osax[1] (zie: AST find regex). Indien je geen extra standard addition wil gebruiken kan je het pad ook ophalen middels AppleScript text item delimiters.

[1]Ik merk dat de url-tag is gebroken op dit forum. Maar de link naar de scripting addition: https://astoolbox.wordpress.com/

Je kunt met het volgende AppleScript command navragen welke server er bij een pad hoort:

tell application "System Events" to get server of disk "Public"

Het antwoord is dan NAS1 of NAS2 als het goed is. Dit werkt bij mij alleen als de shares gemount zijn met AFP, zoals in jou geval.

[quote=Franky Mac url=http://www.onemorething.nl/community/topic/applescript-hoe-het-path-vinden-naar-een-mounted-share-2/#post-2954852 time=1460319949]
Het antwoord is dan NAS1 of NAS2 als het goed is. [/quote]

Server property bevat de AFP server naam dat meestal gelijk is aan de locale hostnaam van de machine (werkt ook alleen bij AFP). DNS of IP adres dat je gebruikt bij het verbinden kan anders zijn. Indien deze gelijk zijn gaat het inderdaad goed.

Bedankt voor de toelichting. Dus als je een NAS geen vast IP-nummer geeft en de toewijzing vindt plaats via DHCP, dan is het niet 100% betrouwbaar.

BTW Wat is AppleScript Toolbox.osax? Ik krijg deze foutmelding als ik je link volg:
Warning! Domain mapping upgrade for this domain not found. Please log in and go to the Domains Upgrades page of your blog to use this domain.

@lord anubis Wat ik niet begrijp is waarom je meerdere scripts hebt, ik heb één script dat aan het begin van een sessie alles wat het kan vinden mount. Dit script wordt opgestart door ControlPlane als dit programma heeft bepaald dat ik thuis ben. Hierdoor kun je zelf de volgorde van het mounten bepalen.

Als je beide AFP servers een unieke naam geeft en deze opneemt in het script is het wel betrouwbaar. Er vanuit gaande dat dit om een klein thuisnetwerk gaat waar de client niet met allemaal onbekende servers verbind. Het is misschien allemaal heel erg theoretisch en komt in de praktijk niet tot zelden voor maar omdat ik het netwerk van Lord Anibus niet ken hou ik overal rekening mee zoals AFP servers met dezelfde naam.

Ik merk dat de URL tag gebroken is en heb linkje even als platte tekst in het bericht aangepast, dank je.

AppleScript Toolbox.osax (AST) is een scripting addition die ik heb geschreven en zit voornamelijk commando’s in die ikzelf vaak miste in AppleScript. Ik ben zelf een actieve gebruiker op MacScripter.net (en was dit ooit op omt, toen nog macosx.nl) en een paar commando’s zijn ook gebaseerd op veel vragen zoals verplaatsen van muis cursor en datum formattering. satimage.osax is ook een veel gebruikte osax ook in verband met support voor reguliere expressies alleen AST heeft betere support voor het ophalen van specifieke groepen. uiteraard kan je ook één van de vele do shell script commando’s gebruiken maar vanwege de overhead van fork() gevolgd door execve() zijn do shell scripts relatief traag. Voor dit commando ben je dus AST niet per se nodig.

Bedankt voor de reactie’s, had niet verwacht dat mijn topic nog tot leven kwam.

[quote=dj bazzie wazzie url=http://www.onemorething.nl/community/topic/applescript-hoe-het-path-vinden-naar-een-mounted-share-2/#post-2954833 time=1460317778][quote]

Dat weet je niet, daarom returned het command ook het pad naar het volume.
[/quote]
Wat het command terug geeft is ook niet altijd juist.

DJ Ik ga je script en de toolbox eens bekijken en ook even de andere opmerkingen doorlopen.

Ok, dat wist ik niet. Misschien heb je hier dan wat aan om te mounten, deze handler returned altijd het juiste pad na het mounten. Ik gebruik namelijk mount om een hele andere reden niet en deze handlers (aangepast) komen uit een script library van mijzelf.

my mountVolume:"public" fromServer:"NAS2" asUser:"admin" withPassword:"adminpasswd"

on mountVolume:theVolume atPath:thePath fromServer:theServer asUser:theUser withPassword:thePasswd
	-- do not continue if the file path already exists
	tell application "System Events" to set fileExists to exists of disk item thePath
	if fileExists then return false
	
	-- create directory (mount point)
	do shell script "mkdir " & quoted form of thePath
	
	-- mount the volume, if fails the directory created is removed
	do shell script "mount_afp afp://" & theUser & ":" & thePasswd & "@" & theServer & "/" & theVolume & space & quoted form of thePath & " || rmdir " & quoted form of thePath
	
	-- test if the volume is mounted or not
	tell application "System Events" to set fileExists to exists of disk item thePath
	return fileExists -- return if the mount was succesfull or not.
end mountVolume:atPath:fromServer:asUser:withPassword:

on mountVolume:theVolume fromServer:theServer asUser:theUser withPassword:thePasswd
	-- create a default folder and mount to
	set theMountPoint to "/Volumes/" & theVolume
	set availableFilePath to theMountPoint
	
	-- test if file exists
	tell application "System Events" to set fileExists to exists of disk item availableFilePath
	set i to 0
	
	-- create a new path until the mountpoint no longer exists
	repeat until fileExists is false
		set i to i + 1
		set availableFilePath to theMountPoint & space & i
		tell application "System Events" to set fileExists to exists of disk item availableFilePath
	end repeat
	
	-- if mount was succesful then return the mountpoint
	if (my mountVolume:theVolume atPath:availableFilePath fromServer:theServer asUser:theUser withPassword:thePasswd) then
		return availableFilePath
	end if
	
	-- if mount failed return empty path
	return missing value
end mountVolume:fromServer:asUser:withPassword: