После 3-х месячного чтения и разбора примеров по этой книге
https://www.programmer-books.com/wp-con ... rd-way.pdf
Я состряпал код на PHP, чему несказанно рад т.к. изучал Python! если кто "допилит" мое "творение" буду благодарен хотя, он и в таком виде у меня работает на 5-ку!
Мои требования к коду такие:
1. Клиент, он же "MD" на Rasspberry подключаться к "OpenVPN" если тот в сети! А так как "OpenVPN" у меня дома на Synology то, нужно пинговать как внешний "IP" Synology так и его "port"!
2. Если "OpenVPN" не в сети то, убиваем все возможно запущенные сервисы в названии которых есть "openvpn". Это нужно, что бы могли подключиться если "OpenVPN" появится в сети! Мы не подключимся если у нас будут висеть "мертвые" сервисы "openvpn".
3. Если "OpenVPN" в сети то, пингуем внутреннюю сеть OpenVPN т.к. возможно, что OpenVPN пингуется но, клиент не подключен!
4. Если пингуется "OpenVPN" и нет сети то, подключаемся!
5. Если пингуется "OpenVPN" и внутренняя сеть "OpenVPN" тоже пингуется то, ничего не делаем.
И так в бесконечном цикле. А бесконечный цикл у меня это "crone" на "MD" c такими параметрами
*/1 * * * * т.е. раз в минуту.
Код
Код: Выделить всё
$host = 'X.X.X.X'; // Впиши сюда свой белый "IP"
$port = XXXX; // Впиши сюда номер порта
$waitTimeoutInSeconds = 1;
function runVPN() {
//echo 'Запускаю OpenVPN! '.date("H:i").'<br>';
exec('/usr/bin/sudo /home/pi/.ovpn/symple_run_ovpn.sh');
}
function killVPN() {
//echo 'Отключаю OpenVPN! '.date("H:i").'<br>';
exec('/usr/bin/sudo /home/pi/scripts/stop_service_vpn.sh');
}
function ping_vpn() {
$waitTimeoutInSeconds = 1;
$vpn_host = "X.X.X.X"; // Впиши сюда "IP" внутренней сети OpenVPN
$vpn_port = 22; // Впиши сюда номер порта
if($fp = fsockopen($vpn_host,$vpn_port,$errCode,$errStr,$waitTimeoutInSeconds)){
//echo 'OpenVPN в сети! '.date("H:i").'<br>';
} else {
//echo 'OpenVPN НЕ в сети, перезапускаю openVPN! '.date("H:i").'<br>';
killVPN();
sleep(3);
runVPN();
}
fclose($fp);
}
// -----------------BODY OF CODE---------------------
if($fp = fsockopen($host,$port,$errCode,$errStr,$waitTimeoutInSeconds)){
//echo 'Synology в сети, проверка связи с VPN! '.date("H:i").'<br>';
ping_vpn();
} else {
//echo 'Synology НЕ в сети: '.date("H:i").'<br>';
killVPN();
}
fclose($fp);
Код в 7-й строке ссылается на "Bash" скрипт "symple_run_ovpn.sh" который лежит у меня на "Rasspberry"
код "symple_run_ovpn.sh". Это просто команда для запуска клиента "openvpn" на linux.
Код: Выделить всё
#!/bin/bash
openvpn --config /home/pi/.ovpn/Raspberry.ovpn
А так же в 12-й строке тоже ссылка на "Bash" скрипт "stop_service_vpn.sh" который тоже лежит у меня на "Rasspberry"
код stop_service_vpn.sh Скрипт просто находит все запущенные сервисы которые имеют в названии "openvpn" и убивает их.
Код: Выделить всё
#!/bin/bash
PID=`ps -eaf | grep openvpn | grep -v grep | awk '{print $2}'`
if [[ "" != "$PID" ]]; then
echo "killing $PID"
kill -9 $PID
fi
Что мне не нравиться в этом коде:
a) Не нравиться то, что код написан на PHP а запускает "Bash" скрипты! Правильно было бы все написать на PHP но, я еще только учусь...
б) Переменные функции "ping_vpn" грамотнее было бы, перечислить непосредственно в названии функции в скобках а не так как это сделал я! Я конечно пробовал указать правильно но, то ли синтаксис нарушал то ли в не правильной последовательности писал, писало ошибку! Я и забил, нужно изучать PHP!
PS - Клиент "MD" в селе а cсервер "OpenVPN" в городе.