Поднятый интерфейс, запускает скрипт.

Обсуждение настройки и работы сервисов, резервирования, сетевых настроек и вопросов безопасности ОС для молодых и начинающих системных администраторов.

Модератор: SLEDopit

vlad001
Сообщения: 44

Поднятый интерфейс, запускает скрипт.

Сообщение vlad001 »

Приветствую!
На маршрутизаторе (ubuntu server 16.04 lts) есть usb-модем. Бывает нужно его перезагрузить (при диагностике), делается это через его вэб-интерфейс. Всё бы ничего, но после этого в системе его как бы не видно. К модему подключаюсь так:

Код: Выделить всё

dhclient $IF
IF - название интерфейса модема. Вот, когда модем перезагружается выше указанным способом, нужно автоматом выполнить переподключение. А пока что приходиться заходить через ssh на маршрутизатор, выполнить

Код: Выделить всё

dhclient -r $IF
а потом снова

Код: Выделить всё

dhclient $IF
что не удобно, хотя бы что нужно дополнительно вмешиваться в процесс. Нужно чтоб в этот момент система сама это выполнила по условию опускания/поднятия интерфейса. Вариант c /etc/network/interfaces не подходит.
Спасибо сказали:

Аватара пользователя
Bizdelnick
Модератор
Сообщения: 17685
Статус: grammatikführer
ОС: Debian GNU/Linux

Re: Поднятый интерфейс, запускает скрипт.

Сообщение Bizdelnick »

vlad001 писал(а):
28.05.2018 23:15
Вариант c /etc/network/interfaces не подходит.
Почему? Зачем вставлять костыли, когда есть готовое решение?
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:

vlad001
Сообщения: 44

Re: Поднятый интерфейс, запускает скрипт.

Сообщение vlad001 »

Bizdelnick писал:
28.05.2018 23:19
Почему? Зачем вставлять костыли, когда есть готовое решение?
Например, там (в interfaces) нужно прописывать статические адреса, но когда подключаешься, адреса меняются (ip, шлюз, сеть модема). Это первое, второе, я использую dhcpcd клиент для получения ipv6, когда я прописываю в interfaces такую строку

Код: Выделить всё

auto $IF
iface $IF inet dhcp
я получаю сообщение от dhcpcd, что используется dhcp в interfaces и dhcpcd прекращает работу.
Спасибо сказали:

Аватара пользователя
Bizdelnick
Модератор
Сообщения: 17685
Статус: grammatikführer
ОС: Debian GNU/Linux

Re: Поднятый интерфейс, запускает скрипт.

Сообщение Bizdelnick »

vlad001 писал(а):
28.05.2018 23:36
Например, там (в interfaces) нужно прописывать статические адреса
Вовсе не обязательно. Там можно и DHCP настроить. Что Вы и проиллюстрировали своим примером.
vlad001 писал(а):
28.05.2018 23:36
я использую dhcpcd клиент для получения ipv6
И получение IPv6 тоже можно там настроить.

Попробуйте сделать так (основываясь на Вашем примере):

Код: Выделить всё

allow-hotplug $IF
iface $IF inet dhcp
iface $IF inet6 auto
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:

vlad001
Сообщения: 44

Re: Поднятый интерфейс, запускает скрипт.

Сообщение vlad001 »

Bizdelnick писал:
29.05.2018 08:20
Что Вы и проиллюстрировали своим примером.
Это были просто разные способы использования. В начале я именно так использовал, когда ip менялся, сейчас да, в модеме включил встроенный dhcp.
Bizdelnick писал:
29.05.2018 08:20
И получение IPv6 тоже можно там настроить.
Где? Prefix Delegation? PD тоже кстати меняется, т.е. динамический. Да, на модеме нет ipv6, только через pppoe (там всё настроено и работает).
Я вот думаю, что ОС может установить факт появление/поднятия интерфейса?
Спасибо сказали:

Аватара пользователя
Bizdelnick
Модератор
Сообщения: 17685
Статус: grammatikführer
ОС: Debian GNU/Linux

Re: Поднятый интерфейс, запускает скрипт.

Сообщение Bizdelnick »

vlad001 писал(а):
29.05.2018 23:34
Я вот думаю, что ОС может установить факт появление/поднятия интерфейса?
Да, может. Именно за это и отвечает allow-hotplug (поднимает интерфейс, когда udev его обнаруживает). Если нужно что-то совсем экзотическое, есть скрипты pre-up, post-up, pre-down и post-down.

Код: Выделить всё

allow-hotplug $IF
iface $IF inet manual
    post-up dhcpcd $IF
и т. п.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:

vlad001
Сообщения: 44

Re: Поднятый интерфейс, запускает скрипт.

Сообщение vlad001 »

Bizdelnick писал:
30.05.2018 08:34
когда udev его обнаруживает
А вот отсюда можно поподробнее? Я пока возился с модемом, в /etc/udev/rules.d/ прописал rules для того чтоб модем после подключения был в правильном состоянии (через usb_modeswitch).
Видимо, это только для съёмных устройств?
Спасибо сказали:

Аватара пользователя
Bizdelnick
Модератор
Сообщения: 17685
Статус: grammatikführer
ОС: Debian GNU/Linux

Re: Поднятый интерфейс, запускает скрипт.

Сообщение Bizdelnick »

Можете посмотреть, отловит ли udev какие-то события при перезагрузке модема, с помощью команды udevadm monitor.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:

vlad001
Сообщения: 44

Re: Поднятый интерфейс, запускает скрипт.

Сообщение vlad001 »

В /etc/udev/rules.d/ у меня есть такой файл 70-modem.rules, а нём такое содержимое:

Код: Выделить всё

ACTION=="add", SUBSYSTEM=="usb", ATTRS{idVendor}=="12d1", ATTRS{idProduct}=="1f01", RUN+="/usr/sbin/usb_modeswitch -v 12d1 -p 1f01 -M '55534243123456780000000000000a11062000000000000100000000000000'"
Я туда добавил второй строкой такое:

Код: Выделить всё

ACTION=="add", SUBSYSTEM=="usb", ATTRS{idVendor}=="12d1", ATTRS{idProduct}=="1f01", RUN+="/bin/systemctl restart modem.service"
modem.service такой:

Код: Выделить всё

[Unit]
Description=Connection to USB modem
After=network.target

[Service]
Type=forking
RemainAfterExit=yes
ExecStart=/usr/local/sbin/modem-start
ExecStop=/usr/local/sbin/modem-stop

[Install]
WantedBy=multi-user.target
modem-start:

Код: Выделить всё

#!/bin/sh
SHELL=/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin

IF=`tail -n 15 /var/lib/dhcp/dhclient.leases | grep -o '".*"' | cut -c2-16`
dhclient $IF
GW_M=`tail -n 15 /var/lib/dhcp/dhclient.leases | grep -o 'option routers.*' | grep -oE '\b[0-9]{1,3}(\.[0-9]{1,3}){3}\b'`
IP_M=`tail -n 15 /var/lib/dhcp/dhclient.leases | grep -o 'fixed-address.*' | grep -oE '\b[0-9]{1,3}(\.[0-9]{1,3}){3}\b'`
IP_NET_M=`tail -n 15 /var/lib/dhcp/dhclient.leases | grep -o 'option routers.*' | grep -oE '\b[0-9]{1,3}(\.[0-9]{1,3}){2}\b'`
ip rule add from $IP_M table modem
ip route add $IP_NET_M.0/24 dev $IF src $IP_M table modem
ip route add default via $GW_M table modem
ip route flush cache
modem-stop:

Код: Выделить всё

#!/bin/sh
SHELL=/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin

dhclient -r `tail -n 15 /var/lib/dhcp/dhclient.leases | grep -o '".*"' | cut -c2-16`
ip route flush table modem
ip rule delete table modem
ip route flush cache
Руками по systemctl start|stop|restart modem.service всё отрабатывает и в том числе при включении/перезагрузке системы. А вот вторая строка в 70-modem.rules работает частично. При перезагрузке/передёргивании модема dhclient не стартует (хотя modem.service перезапускается), сообщая что Cannot find device "enx0c5b8f279a64". То ли не хватает каких-то прав на выполнение 70-modem.rules, то ли dhclient нужно раньше остановить. Вместо строки dhclient -r в modem-stop я указывал killall dhclient, не помогло.
Спасибо сказали:

Аватара пользователя
Bizdelnick
Модератор
Сообщения: 17685
Статус: grammatikführer
ОС: Debian GNU/Linux

Re: Поднятый интерфейс, запускает скрипт.

Сообщение Bizdelnick »

vlad001 писал(а):
01.06.2018 20:55
При перезагрузке/передёргивании модема dhclient не стартует (хотя modem.service перезапускается), сообщая что Cannot find device "enx0c5b8f279a64".
Даже если стартанёт, работать не сможет: udev прибивает все дочерние процессы. Вы выбрали заведомо нерабочий путь решения проблемы.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:

vlad001
Сообщения: 44

Re: Поднятый интерфейс, запускает скрипт.

Сообщение vlad001 »

Bizdelnick писал:
01.06.2018 21:23
Вы выбрали заведомо нерабочий путь решения проблемы.
Другого нет, либо разбираться почему, когда в interfaces для какого-нибудь интерфейса указано dhcp, то это dhcpcd клиенту почему-то категорически не нравиться вплоть до отказа работать.
Bizdelnick писал:
01.06.2018 21:23
udev прибивает все дочерние процессы.
dhclient стартует, только та ошибка возникает. Мне показалось что прибитием процессов управляю я, а правило .rules udev это просто событие, по которому я это делаю? killall dhclient разве их все не прибьёт? Какая разница кто или что это сделает?
Спасибо сказали:

Аватара пользователя
Bizdelnick
Модератор
Сообщения: 17685
Статус: grammatikführer
ОС: Debian GNU/Linux

Re: Поднятый интерфейс, запускает скрипт.

Сообщение Bizdelnick »

vlad001 писал(а):
02.06.2018 11:16
dhclient стартует
Да, стартует. Может быть даже адрес успеет получить, если повезёт. Но продлить аренду уже не сможет.
vlad001 писал(а):
02.06.2018 11:16
Мне показалось что прибитием процессов управляю я, а правило .rules udev это просто событие, по которому я это делаю?
udev сразу по завершении запущенной им программы убивает все процессы, которые она нафоркала. Ещё несколько лет назад он так не делал, но великий Поттеринг решил, что так надо.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:

vlad001
Сообщения: 44

Re: Поднятый интерфейс, запускает скрипт.

Сообщение vlad001 »

Bizdelnick писал:
02.06.2018 13:04
udev сразу по завершении запущенной им программы убивает все процессы, которые она нафоркала.
Т.е. те скрипты, которые я как бы выполнял при помощи udev, перестают работать что ли? Единственный вариант, разобраться с interfaces?
Спасибо сказали:

Аватара пользователя
Bizdelnick
Модератор
Сообщения: 17685
Статус: grammatikführer
ОС: Debian GNU/Linux

Re: Поднятый интерфейс, запускает скрипт.

Сообщение Bizdelnick »

vlad001 писал(а):
02.06.2018 21:16
Т.е. те скрипты, которые я как бы выполнял при помощи udev, перестают работать что ли?
Сам скрипт отработает, но все фоновые процессы, которые он запустит, прибьются.
vlad001 писал(а):
02.06.2018 21:16
Единственный вариант, разобраться с interfaces?
При желании вариантов разной степени извращённости можно придумать много, но я бы использовал interfaces (о чём сразу и написал).
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:

vlad001
Сообщения: 44

Re: Поднятый интерфейс, запускает скрипт.

Сообщение vlad001 »

Попробовал я настроить через interfaces добавив туда запись такого вида:

Код: Выделить всё

auto $IF
allow-hotplug $IF
iface $IF inet dhcp
Всё заработало, но dhcpcd при его перезапуске сообщал

Код: Выделить всё

dhcpcd[23906]:  * Not running dhcpcd because /etc/network/interfaces
dhcpcd[23906]:  * defines some interfaces that will use a DHCP client
Выяснил, эта проверка происходит в скрипте запуска dhcpcd (etc/init.d/dhcpcd), нашёл эту проверку и закомментировал. dhcpcd нормально запустился. Он мне нужен для получения ipv6 через pppoe соединение, но почему-то в скрипте инициализации сделали такую проверку для любого интерфейса. Ну да ладно. Позже я заметил что dhclient слишком разговорчив и пополняет сообщениями файл syslog'а, причём к интерфейсам, к которым я его не прикручивал, сообщения такого вида:

Код: Выделить всё

dhclient[21404]: DHCPDISCOVER on $IF to 255.255.255.255 port 67 interval 3 (xid=0xc3bfd38)
Причём на месте $IF оказываются все физические и логические (мосты, bonding) интерфейсы. Я поступил по другому, может это очередной костыль, но в interfaces я внёс изменения:

Код: Выделить всё

auto $IF
allow-hotplug $IF
iface $IF inet manual
    post-up /sbin/dhclient $IF
    post-down /sbin/dhclient -r $IF
    post-up /usr/local/sbin/m-start
    post-down /usr/local/sbin/m-stop
После этого сообщения в логе были только для одного единственного интерфейса и вероятно запускающий скрипт dhcpcd можно было бы вернуть к прежнему виду.
Ну и ещё одна проблема. У меня два соединения, одно pppoe (основной интернет) и модем (тот самый $IF). Последний мне нужен крайне редко, через него я получаю доступ к паре тройке доменов, потому что через первый я его получить не могу. Вот когда я разрываю соединение pppoe, то демон pppd переписывает маршрут по умолчанию на этот модем, естественно мне это категорически не нужно. Вот здесь я ознакомился с русскоязычной версией мана по pppd. Всё что я понял, мне нужно что-то сделать с defaultroute и особенно с replacedefaultroute. Нужно чтобы не заменялся маршрут последней опцией. Мне не ясно, если я уберу её, то будет ли pppd переписывать уже свой маршрут по умолчанию (вот он мне как раз и нужен). Пока я решил проблему иначе, наверно опять соорудил очередной костыль, но мне это действо показалось более понятным. В каталог /etc/ppp/ip-down.d положил скрипт такого содержания:

Код: Выделить всё

#!/bin/sh

sleep 1
ip ro del default
Смысл которого удалить маршрут по умолчанию, который прописывает pppd после завершения своей работы, как я понял это опция replacedefaultroute.
Спасибо сказали: