つくったもの
背景
なんだか無線の調子が悪くてプチプチ切れるようになったので AirStation ルーターを再起動してみたら症状が収まったので、自動で定期的に再起動してほしくなった。
使ったもの
AppleScript
前提として、 AirStation には Web API のような便利なものは備わっていないため、再起動させるにはブラウザから管理画面に入って操作するしかない。
この操作を curl
でエミュレートするなども考えたが、今回は常に稼働しているmacOSから出来ればそれでよかったので、一番かんたんに出来そうなAppleScriptを使うことにした。
launchd
AppleScriptで自動再起動できるようになったので、これを定期的に実行するためにlaunchdを使った。
ハマったところ
ページロードを待ちたい
ブラウザを自動で操作するだけなので、ページのロードが完了していないと意図通りに動作しない。
applescript wait for page to load
で検索すると 色々やり方はあるようだったが、デファクトなやり方がなさそうだったのと、今回は厳密さをそこまで要求しないので、単に delay
を各所に挟むだけにした。
アカウント情報を外から与えたい
アカウント情報をスクリプトにハードコードしたくなかったので、環境変数から与えることにした。
AppleScript では system attribute "HOGE"
で環境変数を取得できる。
LaunchAgentで環境変数を与えるには、EnvironmentVariables
を使って以下のように指定する:
<key>EnvironmentVariables</key>
<dict>
<key>HOGE</key>
<string>hoge</string>
</dict>
LaunchAgent は ~
や $HOME
を展開できない
bash を噛ますなどの回避方法もある のだけれど、今回はこの他にアカウント情報なども埋め込む必要があったので、 plist のテンプレートを元に環境変数の値を埋め込んだファイルを生成して配置するスクリプトを作った。
この配置スクリプトを実行した環境の $HOME
の値を埋め込んでフルパスに直したものを使用することで回避した。
参考にしたもの
- Baffaloルータの自動再起動スクリプト - hishidoの日記 temp
- cygnan/reboot-airstation: An ash script to reboot a Buffalo AirStation router
- How to Open a Website with Applescript – CubeMG
- applescript - How to wait for webpage to fully load before proceeding script? - Stack Overflow
- AS Hole(AppleScriptの穴) By Piyomaru Software » AppleScriptでwaitを入れる » Blog Archive
- how do I get the value of an environment variable in Applescript? - Stack Overflow
- launchdで定期的にスクリプトを実行 - Qiita
- launchd/launchctl に困った時 - ばかもりだし