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 :
- Vérifier si l’utilisateur dispose d’une connection réseau (c’est mieux !).
- 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.
- 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.