Выполнить скрипт при подключении/отключении Ethernet с помощью systemd

Вопрос или проблема

У меня есть встроенное устройство, которое будет подключаться к серверу DHCP через systemd-networkd, если оно подключено к локальной сети, и вернется в режим DHCP-сервера, если нет. Я еще не реализовал это, но планирую использовать ответ, описанный здесь.

Этот ответ указывает на использование скрипта, который будет запущен при загрузке. Я задумался, что произойдет, если пользователь отключит сетевой кабель и подключит его к ПК во время работы, ему нужно будет перезагрузить плату, чтобы скрипт запустился. Итак, вопрос: есть ли способ запустить скрипт при изменении интерфейса с помощью systemd?

Я пробовал использовать networkd-dispatcher без успеха. Я пытался перезапустить службу systemd-networkd, отключил Ethernet-кабель, но скрипт, который я написал и который находится в /usr/lib/networkd-dispatcher, не выполняется.

Этот ответ объясняет, что можно сделать с systemd, когда происходят изменения сети…

Существует много альтернативных решений, но прямое простое решение только с использованием systemd не реализовано на момент 06/2019.

Вы можете адаптировать мой скрипт net-o-matic, который в настоящее время следит за DOWN, чтобы следить за UP. Запустите его из записи @reboot в root crontab.

Я написал bash-скрипт, чтобы помочь с этим: https://github.com/waltinator/net-o-matic. Он следит за соединением, и когда соединение теряется, выполняет действия, заданные пользователем, чтобы попытаться восстановить соединение.

Ответ или решение

Для решения задачи выполнения сценария при изменении состояния Ethernet-соединения с использованием systemd, можно воспользоваться встроенным функционалом systemd, таким как systemd-networkd и systemd.service. Вот пошаговая инструкция, чтобы достичь этой цели, обеспечивая необходимую гибкость при подключении и отключении Ethernet-кабеля.

1. Настройка systemd-networkd

Прежде всего, убедитесь, что systemd-networkd активирован и используется для управления сетевыми интерфейсами. Вам понадобится создать файл конфигурации для вашего сетевого интерфейса.

Пример: /etc/systemd/network/10-ethernet.network

[Match]
Name=eth0  # Замените eth0 на имя вашего интерфейса

[Network]
DHCP=yes  # Использование DHCP для получения IP-адреса

# Конфигурация для работы в режиме DHCP-сервера при отсутствии соединения с DHCP-клиентом
# Для этого добавьте необходимые настройки для IPv4 или IPv6

2. Создание сцепления для наблюдения за состоянием интерфейса

Мы можем создать юнит-файл для systemd, который будет реагировать на состояния сети. Это позволит выполнять сценарий при изменении состояния интерфейса.

Пример: /etc/systemd/system/network-watcher.service

[Unit]
Description=Watch Ethernet connection changes
Wants=network-online.target
After=network-online.target

[Service]
Type=simple
ExecStart=/usr/local/bin/network-watcher.sh
Restart=on-failure

[Install]
WantedBy=multi-user.target

3. Создание скрипта для отслеживания состояния сети

Теперь создайте сам скрипт, который будет выполнять необходимые действия при изменении состояния ethernet-соединения.

Пример: /usr/local/bin/network-watcher.sh

#!/bin/bash

while true; do
    if ip link show eth0 | grep -q "state UP"; then
        # Действие при подключении
        echo "Ethernet cable is connected. Performing actions..."
        # Здесь добавьте считывание DHCP, дополнительные команды и т.д.
    else
        # Действие при отключении
        echo "Ethernet cable is disconnected. Performing fallback actions..."
        # Включение режима DHCP-сервера или другие действия
    fi
    sleep 5  # Проверяйте состояние каждые 5 секунд
done

4. Установка прав на исполнение

Не забудьте сделать ваш скрипт исполняемым:

sudo chmod +x /usr/local/bin/network-watcher.sh

5. Включение и запуск service unit

Теперь включите и запустите ваш сервис:

sudo systemctl enable network-watcher.service
sudo systemctl start network-watcher.service

Заключение

Эта настройка позволит вашему скрипту автоматически реагировать на изменения в состоянии Ethernet-соединения без необходимости перезагрузки устройства. Таким образом, ваш embedded device будет обладать необходимой гибкостью для работы как в среде с доступом к DHCP, так и в роли DHCP-сервера.

Подобный подход гарантирует, что система будет легко адаптироваться к изменениям в сети, обеспечивая максимально эффективную и безотказную работу в разнообразных условиях.

Оцените материал
Добавить комментарий

Капча загружается...