Peut être vous le savez déjà mais depuis Lolipop sur Android il y a une feature bien sympa qui a fais son apparition. C’est le fais de pouvoir choisir des réseaux wifi de confiances et donc quand nous somme sur ses réseau, le déverrouillage de l’appareil est désactivée et c’est super pratique surtout quand on est chez sois !

J’ai cherché s’il n’existais pas une solution identique sur OSX mais je n’ai rien trouver de simple ou de gratuit. Alors je me suis dit que j’allais faire quelque chose de similaire quand j’avais bidouillé avec le wifi sur Archlinux. J’ai cependant opté pour du Ruby par ce que le ruby c’est cool, mais c’est vraiment par flemingite par ce que c’est largement possible en bash.

EDIT: J’ai finalement créé une version bash, fortement inspiré du script Archlinux. C’est sur ce Gist.https://gist.github.com/yadomi/b7dfa16f2316a77db72d

Sur Archlinux, le script se lançais au démarage. Ça marchais dans 90% des cas, sauf que depuis que j’ai un mac, je le met souvent en veille juste en fermant l’écran donc forcément le script ne se lancera pas à nouveau. C’est là qu’intervient launchd.

Launchd

Launchd c’est un peu le grand patron qui régi un peu tout sur OSX. Il peut controler les démons, il remplace cron et surtout il peut lancer des scripts en fonction d’évenements. C’est ça qui nous intéresse.

On va donc executer un script à chaque fois qu’un évenement sur le wifi est trigger. Pour cela on va dire à launchd de monitorer ce fichier plist:

/Library/Preferences/SystemConfiguration/com.apple.airport.preferences.plist

Car oui ce fichier contient toute les informations sur le Wifi (AirPort) du mac. Il contient par exemple la date de dernière connexion. Donc forcément à chaque fois qu’on se connecte à un réseau, ce fichier va être modifier par OSX et launchd va alors executer notre script.

Comment ?

Comment dire à launchd de lancer des scripts ? C’est simple, c’est aussi avec un fichier plist. Ces fichiers sont des simple fichier XML contenant un liste de propriétés (clef, valeur). Voila à quoi va ressembler notre fichier plist:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>

    <key>Label</key>
    <string>sleepmodewifi</string>

    <key>ProgramArguments</key>
    <array>
        <string>/usr/local/bin/sleepmodewifi</string>
    </array>

    <key>WatchPaths</key>
    <array>
        <string>/Library/Preferences/SystemConfiguration/com.apple.airport.preferences.plist</string>
    </array>

</dict>
</plist>

On vois bien ici la clef WatchPaths qui permet à launchd de monitorer la liste des fichiers et donc le fichier contenant les informations AirPort.

Maintenant, il nous reste plus qu’a créer le script executable /usr/local/bin/sleepmodewifi et le tour est joué. Pour cela on deux commande à notre disposition, la fameuse commande defaults et aussi systemsetup.

J’ai tout mis sur Github, avec un script d’installation pour ceux que ça intéresse, et le script sleepmodewifi ce trouve ici.