Estou escrevendo um script python que executará uma função quando a VPN for desconectada. E posso criar uma unidade systemd que me notificará se a interface tun0 (vpn) estiver inativa, em vez de fazer ifconfig tun0 a cada segundo? Quero dizer, desligar de repente, porque vejo muitos exemplos de notificações quando a interface está ativada.
Quero uma solução sem precisar consultar ifconfig a cada segundo
UPD: Eu tento escrever unidade, como
[Unit]
Description=Listen when interface is down
After=network.target
After=sys-devices-virtual-net-tun0.device
[Service]
Type=simple
Restart=on-failure
ExecStart=/path/to/run.sh
[Install]
WantedBy=multi-user.target
Mas esse script inicia somente quando a interface de rede está UP. E eu preciso de uma solução quando essa interface está DOWN. Não verificar se tun0 está DOWN no momento, mas esperar pelo evento se estiver DOWN e fazer o trabalho
O Systemd só mantém o controle da aparência ou desaparecimento do dispositivo, mas não dos eventos de ativação/desativação da interface de rede. O
After=
será satisfeito quando a interface existir, não quando ela for ativada ou quando for configurada.Se você quiser que um serviço seja iniciado em reação ao aparecimento de uma unidade .device, você pode vinculá-lo a partir do Wants= dessa unidade (por exemplo, por meio de um link simbólico em
sys-devices-[...].device.wants/
, ou usando udev para definirSYSTEMD_WANTS+="foo.service"
). Não há uma maneira equivalente de iniciar algo em reação ao desaparecimento da unidade .device, embora isso possa ser alcançado usando regras brutas do udev – por exemplo, uma regra pode corresponder aACTION=="remove", [...]
e invocarRUN+="/bin/something"
.O estado ativo/inativo não é rastreado pelas unidades .device e é algo que o systemd-networkd manipularia (o que pode ser criado com script usando networkd-broker ou networkd-dispatcher).
Os programas podem receber notificações de interface up/down via Netlink (especificamente rtnetlink). Você pode ver eventos rtnl em
ip monitor
e acessá-los do Python usando opyroute2
módulo.O
ifplugd
serviço também pode ser usado para executar scripts em mudança de estado de interface, mas é antigo e não usa Netlink; em vez disso, ele pesquisa o estado da interface via ioctl() legado a cada segundo. No entanto, ele foi escrito pelo mesmo Lennart Poettering que o systemd, então pode ser a coisa mais próxima de um recurso "systemd built-in" (para interfaces que não são manipuladas pelo systemd-networkd).