Mac OS X で ネットワークプロファイルをアクセスポイント名で自動切り替え

# Sleepからの解除時、ネットワークプロファイルをアクセスポイント名で自動で切り替える

使用しているMacの環境は OS X El Capitan 10.11.5, Mac book Proです。

## 背景と課題

会社内のネットワークを使うにはProxyの設定が必要です。インフラ部門からは、Proxyの自動設定のためのファイル(?)が用意されていて、通常はこれを Automatic Proxy Configurationに設定しておけばいいのですが、どうもMac対応がうまく行っていないのかわかりませんが、手動でProxyを設定しないとうまくいかないことに多々遭遇していました。Macを自宅に持ち帰り利用する場合にはProxyを外す必要があり、このあたりの操作がメンドウだなぁと感じており、以下のように対応してみました。

## Mac OS X のネットワークプロファイルを設定する

これを始める前はいちいち手でProxiesの設定をぽちぽち変更していたのですが、「Location」という設定があることに気づき、、これを使うことにしました。Locationに'Intra'を作成し、Intraには固定でProxyを設定するようにしました

![NetworkPref.png](https://qiita-image-store.s3.amazonaws.com/0/42712/6928839b-8341-2123-964d-8d8f8453b647.png)

これで従来よりは簡単にネットワーク設定を切り替えられるようになりましたが、案外、この切替までのメニュー操作が深くてメンドウなんです。なんとかならんかなと、スクリプト化してみました。

現在つながっているSSIDの名前を調べて、それに応じて 設定したネットワークプロファイルを切り替えます。切り替えには `scselect` というコマンドを使っています。試しにterminalで`scselect`を実行してみれば動きがわかると思います。

```bash

#!/bin/bash

# set AccessPoint uniqe name for switch profile.
appname=Buffalo

if [ "`networksetup -getairportnetwork  en0  | awk '{print $4}'`" = "$appname" ]; then
    scselect Intra
else
    scselect Automatic
fi
```
https://gist.github.com/kobakou/a54f806bc3550e646a31837eafdab982
appname の部分をIntraで使っているSSIDに変更してください。

## Sleep解除でスクリプトを自動実行して、自動設定変更

こうなると、Sleepからの解除等をトリガにこのスクリプトを動かして自動設定して欲しいですよね。いろいろ探してみたのですがなかなかお手軽な方法が見つからず、、。 [Sleepwatcher](http://www.bernhard-baehr.de/)を使うと良さそうなことがわかりました。（他にももっと楽な方法があれば教えて下さい！）Readme.rtfの手順にしたがって SleepWatcherをインストールして上記のスクリプトを実行するように設定!

[SleepWatcherの導入手順はこの記事](http://good-morning-call.jimdo.com/2011/11/20/%E3%82%B9%E3%83%AA%E3%83%BC%E3%83%97%E6%99%82%E3%81%AB%E5%A4%96%E4%BB%98%E3%81%91hdd%E3%82%92%E8%87%AA%E5%8B%95%E5%88%87%E6%96%AD%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/)が参考になりました。ざっとログを貼ると、

```bash
$ sudo cp ~/Desktop/sleepwatcher_2.2/sleepwatcher /usr/local/sbin
$ sudo cp ~/Desktop/sleepwatcher_2.2/sleepwatcher.8 /usr/local/share/man/man8

$ cp ~/Desktop/sleepwatcher_2.2/config/de.bernhard-baehr.sleepwatcher-20compatibility-localuser.plist ~/Library/LaunchAgents/
$ launchctl  load ~/Library/LaunchAgents/de.bernhard-baehr.sleepwatcher-20compatibility-localuser.plist
$ launchctl list | grep sleepwatcher
```

先ほどのスクリプトを.wakeupで呼べるようにしておく
```
$ ln -s ~/Documents/tools/check-n-select-netprof.sh ./.wakeup
```

これでうまくいきました(^^)

## 運用後の後日談: Sleep解除だと早すぎるので Alfred から実行できるように設定する

実際、運用していて分かったのですが、同じ場所にいるといいのですが案外場所を移動しているとSleep解除時はWiFiがまだ接続されていないことが多く、期待通りのアクセスポイント名(SSID)が取れないことが良く有りました。

仕方なくTerminalを起動して、実行することがあったのですが、せっかくなのでAppleScriptで起動できるようにして、それを Alfred で呼び出すようにしました。

```applescript

do shell script "~/Documents/tools/check-n-select-netprof.sh"
display dialog result

```
こんなScriptを保存しておきます。

Alfredはデフォルトでは AppleScript を探してくれないので、チェックを入れておきます。

![Alfred Preferences 2016-07-22 09-29-18.png](https://qiita-image-store.s3.amazonaws.com/0/42712/ceeb3d52-9493-3ec1-7df6-d7ea564636b6.png)

これで、うまくつながらない際にも、さくっとAlfredからスクリプトを実行できるようになりました。

これだけさくっと実行できるなら、Sleep解除を自動検出する必要はなかったですね。と、いまは気付きました。

## さらに後日談

`.sh` を `.app`としておくとAlfredから呼び出すことがわかり、Alfredからサクッと 自動選択スクリプトを実行するのが一番確実とわかりました。ついでにBannerとしてさらっと実行結果を通知する感じに変更。

<img width="407" alt="banners.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42712/69c19ab6-bc2f-6668-064e-684f3180fd4a.png">

この [Script(Github gist)](https://gist.github.com/kobakou/a54f806bc3550e646a31837eafdab982) を、`.app`にリネームして使えます。

（完全に記事のタイトルからは内容が乖離してしまった...笑）