Mon CV

Se connecter au serveur de fichier AFP

12 mai 2013

Dans le cadre de mon travail nous utilisons plusieurs volumes sur un serveur (Mac OS X 10.6 Server en l’occurrence) pour du partage de fichier. Ces volumes sont accessibles en AFP et chaque utilisateur dispose d’un couple login + pass, grâce à l’OpenDirectory.

Au démarrage des sessions utilisateur sur les Mac de notre parc, une préférence gérée (MCX) permet de monter les trois volumes en utilisant automatiquement les identifiants de l’utilisateur qui vient d’ouvrir sa session. Jusque là, pour l’utilisateur, c’est simplissime.

Là où ça se gâte, c’est quand, pour une raison ou pour une autre, le service AFP est déconnecté quelques instants. Les points de partage sont alors démontés. Evidemment, il suffit d’utiliser le menu du Finder (Finder > Aller > Se connecter au serveur ou CMD+K) et d’entrer l’adresse du serveur, d’entrer ses identifiants puis de choisir les volumes à monter. En pratique, une fois sur deux cela se terminait par une demande d’assistance 😉


J’ai donc choisi de réaliser une petite application en AppleScript pour cela. Mais il me fallait aussi :

  1. Vérifier si l’utilisateur dispose d’une connection réseau (c’est mieux !).
  2. Tester si l’utilisateur est connecté sur le réseau local (ici nous disposons de deux IP publiques sur lesquelles je fais un test), éventuellement lui adresser un avertissement si il n’est pas connecté en local. Vous pouvez évidemment modifier cela pour interdire l’accès depuis l’extérieur du réseau local si vos réglages de pare-feu ne permettent pas l’accès au partage de fichier depuis l’extérieur. 
  3. Récupérer le nom d’utilisateur de l’utilisateur courant, pour éviter la resaisie.

Voici le résultat. Il y a encore certainement moyen d’optimiser l’ensemble un peu …

 

-- fonction permettant de tester si une connection internet est ouvert
set testIP to chkUP("http://www.apple.com") or chkUP("http://www.google.com")
if testIP then
	display dialog "Connexion internet détectée." & return & ¬
		"Merci de renseigner vos identifiants de connexion dans les fenêtres qui suivent." with icon 1
	set RESULT_CHECKIP to "0"
else
	display dialog "Vous n'êtes pas connecté à internet." & return & ¬
		"Merci de vous connecter puis de réessayer ultérieurement." with icon 1
	set RESULT_CHECKIP to "1"
end if
to chkUP(theURL)
	return (count (get ((theURL as URL)'s host & {dotted decimal form:""})'s dotted decimal form)) > 0
end chkUP
if RESULT_CHECKIP = "0" then
	-- définition des IP publiques à tester
	set IP_PUBLIQUE to "8.8.8.8"
	set IP_PUBLIQUE2 to "4.4.4.4"
	-- enregistrement de l'adresse IP publique actuelle de la machine dans un fichier temporaire unique
        do shell script "TEMP_IP=$(mktemp /tmp/tempip.XXXXX); basename $TEMP_IP"
	set TEMP_IP to "/tmp/" & result
	do shell script "curl -f http://checkip.dyndns.org >> " & TEMP_IP
	-- test GREP pour vérifier si l'IP publique actuelle contient l'une des valeurs de l'IP publique du réseau
	do shell script "TEST_GREP=$(grep -c \"" & IP_PUBLIQUE & "\" " & TEMP_IP & "); echo $TEST_GREP"
	set TEST_GREP1 to result
	do shell script "TEST_GREP2=$(grep -c \"" & IP_PUBLIQUE2 & "\" " & TEMP_IP & "); echo $TEST_GREP2"
	set TEST_GREP2 to result
	do shell script "rm " & TEMP_IP
	if TEST_GREP1 = "1" then
		set IP_ADRESS to "1"
	else if TEST_GREP2 = "1" then
		set IP_ADRESS to "1"
	else
		set IP_ADRESS to "0"
	end if
	if IP_ADRESS = "0" then
		set CONTINUER to button returned of (display dialog "Vous n'êtes pas connecté au réseau local du bureau. La connexion peut être lente." & return & "Continuer ?" with icon 1 buttons {"Oui", "Non"} default button {"Non"})
	else
		set CONTINUER to "Oui"
	end if
	if CONTINUER = "Non" then
	else
		do shell script "whoami"
		set account to result
		display dialog "Entrez votre nom d'utilisateur :" default answer account
		set account to text returned of result
		set mdp to text returned of (display dialog "Entrez votre mot de passe : " default answer "" with icon 1 with hidden answer)
		do shell script "if [ ! -d \"/Volumes/Volume1\" ]; then echo \"Absent\"; else echo \"OK\"; fi"
		set VOL1 to result
		if VOL1 = "OK" then
			set MOUNT_SERVEUR to button returned of (display dialog "Le volume réseau \"Volume1\" est déjà connecté." & return & "Voulez-vous forcer le montage du volume réseau ?" with icon 1 buttons {"Forcer", "Non"} default button {"Non"})
			if MOUNT_SERVEUR = "Forcer" then
				try
					do shell script "diskutil umount force /Volumes/Volume1"
				end try
				delay 5
				try
					do shell script "rm -R /Volumes/Volume1"
				end try
				delay 1
				try
					mount volume "afp://serveur.mondomaine.com/Volume1" as user name account with password mdp
				on error
					display dialog "Erreur de montage AFP de /Volume1" & return & ¬
						"Vérifier que le serveur est disponible." with icon 1
				end try
			end if
		end if
		if VOL1 = "Absent" then
			try
				mount volume "afp://serveur.mondomaine.com/Volume1" as user name account with password mdp
			on error
				display dialog "Erreur de montage AFP de /Volume1" & return & ¬
					"Vérifier que le serveur est disponible." with icon 1
			end try
		end if
		do shell script "if [ ! -d \"/Volumes/Volume2\" ]; then echo \"Absent\"; else echo \"OK\"; fi"
		set VOL2 to result
		if VOL2 = "OK" then
			set MOUNT_SERVEUR2 to button returned of (display dialog "Le volume réseau \"Volume2\" est déjà connecté." & return & "Voulez-vous forcer le montage du volume réseau ?" with icon 1 buttons {"Forcer", "Non"} default button {"Non"})
			if MOUNT_SERVEUR2 = "Forcer" then
				try
					do shell script "diskutil umount force /Volumes/Volume2"
				end try
				delay 5
				try
					do shell script "rm -R /Volumes/Volume2"
				end try
				delay 1
				try
					mount volume "afp://serveur.mondomaine.com/Volume2" as user name account with password mdp
				on error
					display dialog "Erreur de montage AFP de /Volume2" & return & ¬
						"Vérifier que le serveur est disponible." with icon 1
				end try
			end if
		end if
		if VOL2 = "Absent" then
			try
				mount volume "afp://serveur.mondomaine.com/Volume2" as user name account with password mdp
			on error
				display dialog "Erreur de montage AFP de /Volume2" & return & ¬
					"Vérifier que le serveur est disponible." with icon 1
			end try
		end if
		do shell script "if [ ! -d \"/Volumes/Volume3\" ]; then echo \"Absent\"; else echo \"OK\"; fi"
		set VOL3 to result
		if VOL3 = "OK" then
			set MOUNT_SERVEUR3 to button returned of (display dialog "Le volume réseau \"Volume3\" est déjà connecté." & return & "Voulez-vous forcer le montage du volume réseau ?" with icon 1 buttons {"Forcer", "Non"} default button {"Non"})
			if MOUNT_SERVEUR3 = "Forcer" then
				try
					do shell script "diskutil umount force /Volumes/Volume3"
				end try
				delay 5
				try
					do shell script "rm -R /Volumes/Volume3"
				end try
				delay 1
				try
					mount volume "afp://serveur.mondomaine.com/Volume3" as user name account with password mdp
				on error
					display dialog "Erreur de montage AFP de /Volume3" & return & ¬
						"Vérifier que le serveur est disponible." with icon 1
				end try
			end if
		end if
		if VOL3 = "Absent" then
			try
				mount volume "afp://serveur.mondomaine.com/Volume3" as user name account with password mdp
			on error
				display dialog "Erreur de montage AFP de /Volume3" & return & ¬
					"Vérifier que le serveur est disponible." with icon 1
			end try
		end if
	end if
end if

Evidemment pour utiliser cela, vous devez :

  • personnaliser les variables IP_PUBLIQUE et IP_PUBLIQUE2 avec la ou les adresses IP publiques de votre réseau,
  • personnaliser les adresses des volumes AFP à monter.

 

Posted in Apple et MacintoshTags: