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.