LINUX.ORG.RU

Post-up pre-down в systemd

 , ,


0

2

Помогите понять как это сделать на подобии того как это делается в ifupdown. У меня в interfaces скрипты срабатывают в post-up и pre-down. Решил убрать управление сетью в systemd-networkd. А вот как этими скриптами управлять вроде понимаю, но не полностью. Написал сервис

Discription=iproute2 (%i)
Wants=network-online.target
BindsTo=sys-subsystem-net-devices-%i.device
After=sys-subsystem-net-devices-%i.device

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/etc/conf.d/iproute2/%i/route up
ExecStop=/etc/conf.d/iproute2/%i/route down

[Install]
WantedBy=sys-subsystem-net-devices-%i.device

Руками он отрабатывает верно, таблицы маршрутизации заполняются. Но если добавить в автозагрузку, то получается бардак. По логу видно что интерфейс не успевает получить настройки, а сервис с маршрутами уже стартует. Конечно же никакие маршруты не прописываются. Как добавить таймаут или же условие, чтоб проверялось наличие ip адреса у интерфейса? Таймаут типа sleep 5 можно конечно в скрипт route добавить, но по мне колхозно это выглядит

У меня в interfaces скрипты срабатывают в post-up и pre-down. Решил убрать управление сетью в systemd-networkd.

Ничего не понятно. Ты хочешь избавиться от interfaces и перейти на systemd-networkd?

anonymous-angler ★☆
()

Попробуй network-online.target переместить в «After».

А что ты такого пытаешься с помощью iproute сделать, чего не получится через network-файл? Там вроде опций вагон и маленькая тележка.

Radjah ★★★★★
()
Ответ на: комментарий от Radjah

Почитал раздел из мана, но есть вопросы. Скрипт выглядит так

#!/bin/bash

# LTE
IF1=wwan0
IF1_IP=`ip addr | grep $IF1 | awk -F"/" '/inet/{ print gensub (/.* /,"","g",$1)}'`
IF1_GW_IP=`ip route | awk '/default.*'$IF1'/ { print $3 }'`
IF1_NET=`ip route | grep kernel | awk '/'$IF1_IP'/ { print $1 }'`

# Local net
IF3=eth0
IF3_IP=`ip addr | grep $IF3 | awk -F"/" '/inet/{ print gensub (/.* /,"","g",$1)}'`
IF3_GW_IP=`ip route | awk '/'$IF3'/ { print $9 }'`
IF3_NET=`ip route | awk '/'$IF3'/ { print $1 }'`

case "$1" in
        "ifup")
        ip route add $IF1_NET dev $IF1 src $IF1_IP table LTE
        ip route add default via $IF1_GW_IP table LTE
        ip route add $IF1_NET dev $IF1 src $IF1_IP
        ip route add default via $IF1_GW_IP
        ip route add $IF3_NET dev $IF3 table LTE
        ip route add $IF3_NET dev $IF3 table WG
        ip route add $IF1_NET dev $IF1 table WG
        ip route add 127.0.0.0/8 dev lo table LTE
        ip route add 127.0.0.0/8 dev lo table WG
        ip rule add from $IF1_IP table LTE
        ip rule add from all fwmark 400 table WG
        ;;
        "ifdown")
        ip route delete $IF1_NET dev $IF1 src $IF1_IP table LTE
        ip route delete default via $IF1_GW_IP table LTE
        ip route delete $IF1_NET dev $IF1 src $IF1_IP
        ip route delete default via $IF1_GW_IP
        ip route delete $IF3_NET dev $IF3 table LTE
        ip route delete $IF3_NET dev $IF3 table WG
        ip route delete $IF1_NET dev $IF1 table WG
        ip route delete 127.0.0.0/8 dev lo table LTE
        ip route delete 127.0.0.0/8 dev lo table WG
        ip rule delete from $IF1_IP table LTE
        ip rule delete from all fwmark 400 table WG
	    ;;
        *)
        echo "Failed"
        exit 1
        ;;
esac
LTE интерфейс получается настройки по dhcp, потому приходится парсить данные. С локальным интерфейсом в принципе можно не заморачиваться. В network-файле такое реализовать возможно? Я понял что там можно сколько угодно секций роутов указать, для статики самое то

achilles_85
() автор топика
Последнее исправление: achilles_85 (всего исправлений: 1)
Ответ на: комментарий от Radjah

Попробуй network-online.target переместить в «After».

Помогло, добавил этот же таргет к имеющемуся в After

achilles_85
() автор топика
Ответ на: комментарий от Radjah

А как сделать так, чтобы при рестарте

systemd-networkd
сначала останавливался мой сервис, после рестарт основного и старт моего?

achilles_85
() автор топика
Ответ на: комментарий от achilles_85

Это вот хз. У них там свои механизмы проверки интерфейсов. Без лишней нужды настройки обычно не меняются.

Или кастани intelfx. Он в этой теме шарит.

Radjah ★★★★★
()

Ты творишь дичь. Создай файл foo.network в /etc/systemd/network и там прописывай все свои маршруты. Почитай man systemd.network сперва. Баш портянки выкинь или иди с ними на devuan.

eternal_sorrow ★★★★★
()
Последнее исправление: eternal_sorrow (всего исправлений: 1)
Ответ на: комментарий от eternal_sorrow

Я ж написал для чего мне баш портянка. Как я в

foo.network
укажу адрес интерфейса, если он у меня динамический? Файл и так лежит там, в нем указано получать настройки по dhcp
ip route add $IF1_NET dev $IF1 src $IF1_IP table LTE
$IF1_NET и $IF1_IP не статичны, отсюда весь колхоз

achilles_85
() автор топика
Последнее исправление: achilles_85 (всего исправлений: 1)
Ответ на: комментарий от eternal_sorrow

Сеть провайдера

# LTE
IF1=wwan0
IF1_IP=`ip addr | grep $IF1 | awk -F"/" '/inet/{ print gensub (/.* /,"","g",$1)}'`
IF1_GW_IP=`ip route | awk '/default.*'$IF1'/ { print $3 }'`
IF1_NET=`ip route | grep kernel | awk '/'$IF1_IP'/ { print $1 }'`

achilles_85
() автор топика
Ответ на: комментарий от eternal_sorrow

Соединение модема с провом поднимаю так

[Unit]
Description=Huawei USB modem auto-connect
BindsTo=dev-huawei_mobile_tty.device
After=dev-huawei_mobile_tty.device

[Service]
Type=oneshot
StandardOutput=file:/dev/huawei_mobile_tty
StandardError=journal
EnvironmentFile=/etc/huawei-mobile-helper.conf
ExecStart=/usr/bin/huawei-mobile-helper --ndisdup
RemainAfterExit=false

[Install]
WantedBy=dev-huawei_mobile_tty.device

Настраиваю интерфейс так

cat /etc/systemd/network/wwan0.network 
[Match]
Name = wwan0

[Network]
DHCP = ipv4

wwan0 это LTE модем, в зависимости от базовой станции получает адрес то из 10.0.0.0/8, то 100.0.0.0/8, может еще что, это то что я видел. У меня задача стоит такая: если поменяется диапазон, то удалить-добавить маршруты из скрипта

#!/bin/bash

# LTE
IF1=wwan0
IF1_IP=`ip addr | grep $IF1 | awk -F"/" '/inet/{ print gensub (/.* /,"","g",$1)}'`
IF1_GW_IP=`ip route | awk '/default.*'$IF1'/ { print $3 }'`
IF1_NET=`ip route | grep kernel | awk '/'$IF1_IP'/ { print $1 }'`

# Local net
IF3=eth0
IF3_IP=`ip addr | grep $IF3 | awk -F"/" '/inet/{ print gensub (/.* /,"","g",$1)}'`
IF3_GW_IP=`ip route | awk '/'$IF3'/ { print $9 }'`
IF3_NET=`ip route | awk '/'$IF3'/ { print $1 }'`

case "$1" in
        "ifup")
        ip route add $IF1_NET dev $IF1 src $IF1_IP table LTE
        ip route add default via $IF1_GW_IP table LTE
        ip route add $IF1_NET dev $IF1 src $IF1_IP
        ip route add default via $IF1_GW_IP
        ip route add $IF3_NET dev $IF3 table LTE
        ip route add $IF3_NET dev $IF3 table WG
        ip route add $IF1_NET dev $IF1 table WG
        ip route add 127.0.0.0/8 dev lo table LTE
        ip route add 127.0.0.0/8 dev lo table WG
        ip rule add from $IF1_IP table LTE
        ip rule add from all fwmark 400 table WG
        ;;
        "ifdown")
        ip route delete $IF1_NET dev $IF1 src $IF1_IP table LTE
        ip route delete default via $IF1_GW_IP table LTE
        ip route delete $IF1_NET dev $IF1 src $IF1_IP
        ip route delete default via $IF1_GW_IP
        ip route delete $IF3_NET dev $IF3 table LTE
        ip route delete $IF3_NET dev $IF3 table WG
        ip route delete $IF1_NET dev $IF1 table WG
        ip route delete 127.0.0.0/8 dev lo table LTE
        ip route delete 127.0.0.0/8 dev lo table WG
        ip rule delete from $IF1_IP table LTE
        ip rule delete from all fwmark 400 table WG
	;;
        *)
        echo "Failed"
        exit 1
        ;;
esac
Скрипт дергается сервисом
cat /etc/systemd/system/iproute2@.service 
[Unit]
Description=iproute2 (%i)
BindsTo=sys-subsystem-net-devices-%i.device
After=sys-subsystem-net-devices-%i.device network-online.target

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/etc/conf.d/iproute2/%i/route ifup
ExecStop=/etc/conf.d/iproute2/%i/route ifdown

[Install]
WantedBy=sys-subsystem-net-devices-%i.device
Как правильно все разрулить не знаю. Как я понимаю, во время загрузки оси мне нужно заполнять таблицу (start iproute2@wwan0) после получения адреса интерфейсом. Во время работы, если пришлось перезапустить systemd-networkd, то сначала сделать
stop iproute2@wwan0
-->получаю адрес на wwan0-->
start iproute2@wwan0
Сейчас работает все, кроме «если пришлось перезапустить systemd-networkd....»

achilles_85
() автор топика
Последнее исправление: achilles_85 (всего исправлений: 2)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.