mirror of
https://github.com/CumulusNetworks/ifupdown2.git
synced 2024-05-06 15:54:50 +00:00
6d359159c3
Ticket: None Reviewed By: CCR-4058 Testing Done: ifup'd interface with both nowait=0 and nowait=1 and not specified at all. The Mellanox platform, as well as some others probably, has two management interfaces: eth0 and eth1. The customer may plug a cable into either one of these interfaces, and very rarely both of them. If only one cable is plugged in and we don't know which one, then /etc/network/interfaces must be configured by default to automatically bring up both interfaces using DHCP. But when an interface does not have link, it stalls the boot process for 60 seconds while dhclient times out. This patch changes the default dhclient behavior to not wait for DHCP to complete, by using the "-nw" option when calling dhclient. This means that dhclient will immediately return and DHCP will complete in the background. A module attribute has been added for the DHCP addon called "nowait", which defaults to 1. If this attribute is set to 0, then dhclient will revert to its previous behavior and delay up to a minute while DHCP completes. This attribute can be specified in a policy file, e.g. /etc/network/ifupdown2/policy.d/dhcp.json, with contents such as: { "dhcp" : { "nowait" : 0 } }
92 lines
3.3 KiB
Python
92 lines
3.3 KiB
Python
#!/usr/bin/python
|
|
#
|
|
# Copyright 2014 Cumulus Networks, Inc. All rights reserved.
|
|
# Author: Roopa Prabhu, roopa@cumulusnetworks.com
|
|
#
|
|
|
|
from utilsbase import *
|
|
import subprocess
|
|
import os
|
|
|
|
FNULL = open(os.devnull, 'w')
|
|
|
|
class dhclient(utilsBase):
|
|
""" This class contains helper methods to interact with the dhclient
|
|
utility """
|
|
|
|
def _pid_exists(self, pidfilename):
|
|
if os.path.exists(pidfilename):
|
|
pid = self.read_file_oneline(pidfilename)
|
|
if not os.path.exists('/proc/%s' %pid):
|
|
return False
|
|
else:
|
|
return False
|
|
return True
|
|
|
|
def is_running(self, ifacename):
|
|
return self._pid_exists('/run/dhclient.%s.pid' %ifacename)
|
|
|
|
def is_running6(self, ifacename):
|
|
return self._pid_exists('/run/dhclient6.%s.pid' %ifacename)
|
|
|
|
def stop(self, ifacename):
|
|
if os.path.exists('/sbin/dhclient3'):
|
|
cmd = ['/sbin/dhclient3', '-x', '-pf',
|
|
'/run/dhclient.%s.pid' %ifacename, '-lf',
|
|
'/var/lib/dhcp3/dhclient.%s.leases' %ifacename,
|
|
'%s' %ifacename]
|
|
else:
|
|
cmd = ['/sbin/dhclient', '-x', '-pf',
|
|
'/run/dhclient.%s.pid' %ifacename,
|
|
'-lf', '/var/lib/dhcp/dhclient.%s.leases' %ifacename,
|
|
'%s' %ifacename]
|
|
self.subprocess_check_call(cmd)
|
|
|
|
def start(self, ifacename, nowait=False):
|
|
if os.path.exists('/sbin/dhclient3'):
|
|
cmd = ['/sbin/dhclient3', '-pf',
|
|
'/run/dhclient.%s.pid' %ifacename,
|
|
'-lf', '/var/lib/dhcp3/dhclient.%s.leases' %ifacename,
|
|
'%s' %ifacename]
|
|
else:
|
|
cmd = ['/sbin/dhclient', '-pf', '/run/dhclient.%s.pid' %ifacename,
|
|
'-lf', '/var/lib/dhcp/dhclient.%s.leases' %ifacename,
|
|
'%s' %ifacename]
|
|
if nowait:
|
|
cmd.append('-nw')
|
|
self.subprocess_check_call(cmd)
|
|
|
|
def release(self, ifacename):
|
|
if os.path.exists('/sbin/dhclient3'):
|
|
cmd = ['/sbin/dhclient3', '-r', '-pf',
|
|
'/run/dhclient.%s.pid' %ifacename, '-lf',
|
|
'/var/lib/dhcp3/dhclient.%s.leases' %ifacename,
|
|
'%s' %ifacename]
|
|
else:
|
|
cmd = ['/sbin/dhclient', '-r', '-pf',
|
|
'/run/dhclient.%s.pid' %ifacename,
|
|
'-lf', '/var/lib/dhcp/dhclient.%s.leases' %ifacename,
|
|
'%s' %ifacename]
|
|
self.subprocess_check_call(cmd)
|
|
|
|
def start6(self, ifacename, nowait=False):
|
|
cmd = ['dhclient', '-6', '-pf',
|
|
'/run/dhclient6.%s.pid' %ifacename, '-lf',
|
|
'/var/lib/dhcp/dhclient.%s.leases ' %ifacename,
|
|
'%s' %ifacename]
|
|
if nowait:
|
|
cmd.append('-nw')
|
|
self.subprocess_check_call(cmd)
|
|
|
|
def stop6(self, ifacename):
|
|
self.subprocess_check_call(['dhclient', '-6', '-x', '-pf',
|
|
'/run/dhclient.%s.pid' %ifacename, '-lf',
|
|
'/var/lib/dhcp/dhclient.%s.leases ' %ifacename,
|
|
'%s' %ifacename])
|
|
|
|
def release6(self, ifacename):
|
|
self.subprocess_check_call(['dhclient', '-6', '-r', '-pf',
|
|
'/run/dhclient6.%s.pid' %ifacename, '-lf',
|
|
'/var/lib/dhcp/dhclient6.%s.leases' %ifacename,
|
|
'%s' %ifacename])
|