#!/usr/bin/env python3 # # Copyright 2023-2025 VyOS maintainers and contributors # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either # version 2.1 of the License, or (at your option) any later version. # # This library is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with this library. If not, see . import sys from time import sleep from vyos.config import Config from vyos.ifconfig import Section from vyos.utils.boot import boot_configuration_complete from vyos.utils.process import cmd from vyos.utils.process import is_systemd_service_active from vyos.utils.commit import commit_in_progress from vyos import airbag airbag.enable() if len(sys.argv) < 3: airbag.noteworthy('Must specify both interface and link status!') sys.exit(1) if not boot_configuration_complete(): airbag.noteworthy('System bootup not yet finished...') sys.exit(1) interface = sys.argv[1] while commit_in_progress(): sleep(0.250) in_out = sys.argv[2] config = Config() interface_path = ['interfaces'] + Section.get_config_path(interface).split() systemdV4_service = f'dhclient@{interface}.service' systemdV6_service = f'dhcp6c@{interface}.service' if in_out == 'out': # Interface moved state to down if is_systemd_service_active(systemdV4_service): cmd(f'systemctl stop {systemdV4_service}') if is_systemd_service_active(systemdV6_service): cmd(f'systemctl stop {systemdV6_service}') elif in_out == 'in': if config.exists_effective(interface_path + ['address']): tmp = config.return_effective_values(interface_path + ['address']) # Always (re-)start the DHCP(v6) client service. If the DHCP(v6) client # is already running - which could happen if the interface is re- # configured in operational down state, it will have a backoff # time increasing while not receiving a DHCP(v6) reply. # # To make the interface instantly available, and as for a DHCP(v6) lease # we will re-start the service and thus cancel the backoff time. if 'dhcp' in tmp: cmd(f'systemctl restart {systemdV4_service}') if 'dhcpv6' in tmp: cmd(f'systemctl restart {systemdV6_service}')