特定Wifiの時に自動でVPN接続

僕が通っている大学にeduroamが導入されて、VPNプロトコルが普通に通るようになりました。 VPNを併用して常時こっちを使いたいなーと思ったのですが、どうせなら自動でVPN接続したいと考えますよね。 しかも、特定のWifiの時のみ自動接続したいですよね。

ということで、Mac専用になりますが、いくらかサイトを参考にしたり、コードをお借りしながらAppleScriptを書いてみました。

# http://www.showwin.asia/2014/07/30/mac%E3%81%A7vpn%E3%82%92%E7%B9%8B%E3%81%8E%E3%81%A3%E3%81%B1%E3%81%AA%E3%81%97%E3%81%AB%E3%81%99%E3%82%8Bapplescript/
on idle
    tell application "System Events"
        tell current location of network preferences
            set myConnection to the service "VPN"
            set targetWifi to {"eduroam"}
            if myConnection is not null then
                if current configuration of myConnection is not connected then
                    set wifiName to getAirportNetworkName() of me
                    if wifiName is in targetWifi then
                        display notification "Connecting VPN..."
                        connect myConnection
                    end if
                end if
            end if
        end tell
        return 30
    end tell
end idle

# http://piyocast.com/as/archives/2050
# 無線LANで接続中のネットワーク名称を取得
on getAirportNetworkName()
    set v2 to system attribute "sys2"
    if v2 ≤ 6 then
        set hardWareName to "AirPort"
        set aMesStr to "Current AirPort Network: "
    else if v2 ≥ 7 then
        set hardWareName to "Wi-Fi"
        set aMesStr to "Current Wi-Fi Network: "
    end if
    set dName to getHardwareDeviceName(hardWareName) of me
    set sText to "/usr/sbin/networksetup -getairportnetwork " & dName
    set sRes to do shell script sText
    if sRes does not start with "You are not associated with " then
        set sRes2 to repChar(sRes, aMesStr, "") of me
    else
        set sRes2 to ""
    end if
    return sRes2
end getAirportNetworkName

# 指定ハードウェアポートのデバイス名を取得する
on getHardwareDeviceName(targName)
    set sRes to do shell script "/usr/sbin/networksetup -listallhardwareports"
    set sList to paragraphs of sRes
    set s1List to items 2 thru -1 of sList
    set s2List to {}
    repeat with i in s1List
        set j to contents of i
        if j is equal to "VLAN Configurations" then
            exit repeat
        end if
        set the end of s2List to j
    end repeat
    # ネットワークポート関連のレコードを作成
    set s3List to {}
    set aLen to length of s2List
    repeat with i from 1 to aLen by 4
        set a1Item to contents of item i of s2List
        set a1Item to repChar(a1Item, "Hardware Port: ", "") of me
        set a2Item to contents of item (i + 1) of s2List
        set a2Item to repChar(a2Item, "Device: ", "") of me
        set a3Item to contents of item (i + 2) of s2List
        set a3Item to repChar(a3Item, "Ethernet Address: ", "") of me
        set the end of s3List to {hardwarePort:a1Item, device:a2Item, ethernetAddress:a3Item}
    end repeat
    repeat with i in s3List
        set j1 to hardwarePort of i
        set j2 to device of i
        if j1 is equal to targName then
            return j2
        end if
    end repeat
    return ""
end getHardwareDeviceName

# 文字置換ルーチン
on repChar(origText, targStr, repStr)
    set {txdl, AppleScript's text item delimiters} to {AppleScript's text item delimiters, targStr}
    set temp to text items of origText
    set AppleScript's text item delimiters to repStr
    set res to temp as text
    set AppleScript's text item delimiters to txdl
    return res
end repChar

5行目の"VPN"を接続先のVPNの名前、{"eduroam"}は対象のSSIDをリスト形式で指定しています。 処理としては、「VPNが未接続かつ接続中のWifiが対象だったら自動接続」を30秒おきに実行しています。

コードをお借りしたサイト

AppleScriptリファレンス

AppleScriptリファレンス