Прошу сильно не пинать так как это мой первый скрипт. Уверен что можно все было сделать в три раза проще, но увы...
И так:
Предположим что Network Manager вы удалили, поставили и настроили xl2tpd пакет, и интернет у вас работает.
Часто бывает что при загрузке системы демон xl2tpd не поднимает соединение с интернетом и потом приходиться в ручную перезапускать его, это связано с тем что на момент попытки соединения с сервером система еще не получила от DHCP свой IP и DNS, но возможны и другие причины.
Я предлагаю удалить xl2tpd из авто запуска и оставить эту задачу для скрипта:
sudo update-rc.d -f xl2tpd remove
Скрипт работает в несколько этапов:
1. При загрузке системы пингует сервер провайдера и только после этого запускает демон.
2. После установки соединения с интернетом каждых 10 секунд проверяет пинги на тестовый адрес(я использую гугл).
3. В случает отсутствия ответов от тестового сервера проверяет физический линк, наличие локального IP, пинги на сервер провайдера, наличие процессов xl2tpd и pppd и в зависимости от ситуации принимает меры.
Я храню скрипт в /etc/init.d
sudo nano /etc/init.d/check-inet
И запускаю его из rc.local
sudo nano /etc/rc.local
Добавляем путь к скрипту до "exit 0"
Пример:
#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.
/etc/init.d/check-inet
exit 0
Не забываем дать скрипту право на исполнение.Сам скрипт :
#!/bin/bash
DIP=tp.kyivstar.ua # IP или домен провайдера для l2tp подключения
TIP=google.com # IP или домен для проверки интернета
IFACE=eth0 # Физический интерфейс
path=/var/log/ # Путь к логам
name=check_internet # Имя лога
LOGFILE=$path/$name/$name.log
log(){
message="$(date +"%y-%m-%d %T") $@"
echo $message
echo $message >>$LOGFILE
}
while eval ! "ping -c 1 -W 1 $DIP" > /dev/null
do
log "Нету пинга на $DIP"
sleep 1
done
if eval "ping -c 1 -W 1 $DIP" > /dev/null; then
log "Связь с $DIP установлена"
/etc/init.d/xl2tpd start
log "Демон xl2tpd стартует"
else
log "Нету пинга на $DIP"
fi
while true
do
if eval "ping -c 1 -W 1 $TIP" > /dev/null; then
echo "Интернет работает!"
else
if eval "ping -c 1 -W 1 $TIP" > /dev/null; then
log "Интернет работает!"
else
log "Интернет пропал"
sleep 2
ip addr show $IFACE | grep "state DOWN" > /dev/null
if [ $? -eq 0 ]; then
log "Упал линк на $IFACE"
while eval "ip addr show $IFACE | grep DOWN > /dev/null"
do
log "Нету линка"
sleep 5
done
log "Линк поднялся на $IFACE"
sleep 5
if eval "ip addr show $IFACE | grep inet > /dev/null"; then
log "Адрес присвоен на $IFACE"
else
log "Нету адреса"
dhclient $IFACE
sleep 3
ip addr show $IFACE | grep inet | awk '{print $2}' > /dev/null
if [ $? -eq 0 ]; then
log "Получен адрес по DHCP"
sleep 1
else
log "Проблема с DHCP клиентом"
killall dhclient
sleep 1
dhclient $IFACE
log "Повторная попытка получить адрес по DHCP"
if eval "ip addr show $IFACE | grep inet > /dev/null"; then
log "Адрес присвоен на $IFACE"
else
log "Остановка скрипта проблема с получение DHCP"
halt
fi
fi
fi
else
log "Линк поднят на $IFACE"
if eval "ip addr show $IFACE | grep inet > /dev/null"; then
log "Адрес присвоен на $IFACE"
else
log "Нету адреса"
dhclient $IFACE
sleep 3
ip addr show $IFACE | grep inet | awk '{print $2}' > /dev/null
if [ $? -eq 0 ]; then
log "Получен адрес по DHCP"
sleep 1
else
log "Проблема с DHCP клиентом"
killall dhclient
sleep 1
dhclient $IFACE
log "Повторная попытка получить адрес по DHCP"
if eval "ip addr show $IFACE | grep inet > /dev/null"; then
log "Адрес присвоен на $IFACE"
else
log "Остановка скрипта проблема с получение DHCP"
halt
fi
fi
fi
fi
if eval "pgrep xl2tpd > /dev/null"; then
log "Демон xl2tpd уже запущен"
if eval "pgrep pppd > /dev/null"; then
log "Демон pppd уже запущен"
if eval "ping -c 1 -W 1 $DIP" > /dev/null; then
log "Связь с $DIP установлена"
killall pppd
sleep 1
/etc/init.d/xl2tpd restart > /dev/null
log "Рестарт xl2tpd демона"
sleep 3
if eval "ping -c 1 -W 1 $TIP" > /dev/null; then
log "Интернет заработал!"
fi
else
log "Нету пинга на $DIP"
killall dhclient > /dev/null
sleep 1
dhclient $IFACE > /dev/null
log "Повторная попытка получить адрес по DHCP"
sleep 3
if eval "ping -c 1 -W 1 $DIP" > /dev/null; then
log "Связь с $DIP установлена"
killall pppd
sleep 1
/etc/init.d/xl2tpd restart > /dev/null
log "Рестарт xl2tpd демона"
sleep 3
if eval "ping -c 1 -W 1 $TIP" > /dev/null; then
log "Интернет заработал!"
fi
else
log "Нету пинга на $DIP"
fi
fi
else
log "Не запущен pppd демон"
killall xl2tpd > /dev/null
killall pppd > /dev/null
sleep 1
if eval "ping -c 1 -W 1 $DIP" > /dev/null; then
log "Связь с $DIP установлена"
/etc/init.d/xl2tpd start > /dev/null
log "Cтарт xl2tpd демона"
sleep 3
if eval "ping -c 1 -W 1 $TIP" > /dev/null; then
log "Интернет заработал!"
fi
else
log "Нету пинга на $DIP"
killall dhclient > /dev/null
sleep 1
dhclient $IFACE > /dev/null
log "Повторная попытка получить адрес по DHCP"
sleep 3
if eval "ping -c 1 -W 1 $DIP" > /dev/null; then
log "Связь с $DIP установлена"
/etc/init.d/xl2tpd start > /dev/null
log "Старт xl2tpd демона"
sleep 3
if eval "ping -c 1 -W 1 $TIP" > /dev/null; then
log "Интернет заработал!"
fi
else
log "Нету пинга на $DIP"
fi
fi
fi
else
log "Не запущен xl2tpd демон"
killall xl2tpd > /dev/null
killall pppd > /dev/null
sleep 1
if eval "ping -c 1 -W 1 $DIP" > /dev/null; then
log "Связь с $DIP установлена"
/etc/init.d/xl2tpd start > /dev/null
log "Cтарт xl2tpd демона"
sleep 3
if eval "ping -c 1 -W 1 $TIP" > /dev/null; then
log "Интернет заработал!"
fi
else
log "Нету пинга на $DIP"
killall dhclient > /dev/null
sleep 1
dhclient $IFACE > /dev/null
log "Повторная попытка получить адрес по DHCP"
sleep 3
if eval "ping -c 1 -W 1 $DIP" > /dev/null; then
log "Связь с $DIP установлена"
/etc/init.d/xl2tpd start > /dev/null
log "Старт xl2tpd демона"
sleep 3
if eval "ping -c 1 -W 1 $TIP" > /dev/null; then
log "Интернет заработал!"
fi
else
log "Нету пинга на $DIP"
fi
fi
fi
fi
fi
sleep 10
done