Я внес некоторые изменения в предоставленный ответ, потому что если что-то стоит делать, это стоит делать в землю. Я хотел переподключиться, если VPN был сброшен, но НЕ переподключаться, если VPN был преднамеренно отключен. Решение, которое я придумал, было эффективным и не элегантным.
Сначала я добавил хуки для запуска и завершения работы pppd, чтобы отслеживать желаемое состояние VPN. Эти файлы должны принадлежать пользователю root и иметь мировые разрешения на чтение / выполнение ( sudo chmod 755 /etc/ppp/ip-*
).
/ И т.д. / ррр / ф-до:
#!/bin/sh
echo true > /var/run/reconnect_vpn
chmod 644 /var/run/reconnect_vpn
/ etc / ppp / ip-down: для OS X 10.9.5 и ниже
#!/bin/sh
tail /var/log/ppp.log | grep '\[DISCONNECT\]'
if [ $? == 0 ] ; then
echo false > /var/run/reconnect_vpn
fi
/ etc / ppp / ip-down: для OS X 10.10 и выше
#!/bin/sh
tail /var/log/ppp.log | grep '\[TERMINATE\]'
if [ $? == 0 ] ; then
echo false > /var/run/reconnect_vpn
fi
Затем, изменив вышеприведенный AppleScript, я смог проверить переменную состояния '/ var / run / reconnect_vpn', чтобы определить, нужно ли восстановить VPN:
on idle
tell application "System Events"
tell current location of network preferences
set myConnection to the service "VPN"
set startOnLogin to true
local doReconnect
try
set doReconnect to (do shell script "cat /var/run/reconnect_vpn")
on error errMsg
set doReconnect to startOnLogin
end try
if myConnection is not null and doReconnect then
if current configuration of myConnection is not connected then
connect myConnection
end if
end if
end tell
return 120
end tell
end idle
Как и прежде, измените линию set myConnection to the service "VPN"
на имя вашей VPN. Кроме того, при запуске файл «connect_vpn» не существует, поэтому я добавил логическое значение (startOnLogin), которое будет использоваться по умолчанию, когда файл не может быть найден. Мне нравится начинать немедленно, но если вы этого не сделаете, измените его на false.
У меня есть ощущение, что если вы относитесь именно к поведению VPN, то вы также относитесь к тому, кто любит возиться, пока не найдет решение, и поэтому у этого ответа нет аудитории. Но на всякий случай вот оно. Надеюсь, это кому-нибудь поможет.
Can’t get «class svce» "MyVPN" of «class locc» of «class netp» of application "System Events".
System Events got an error: Can’t get service "MyVPN" of current location of network preferences. (-1728)