]> git.proxmox.com Git - mirror_ifupdown2.git/blame - ifupdown2/ifupdownaddons/dhclient.py
dhclient: wait to start dhcp if carrier is down
[mirror_ifupdown2.git] / ifupdown2 / ifupdownaddons / dhclient.py
CommitLineData
35681c06 1#!/usr/bin/env python3
15ef32ea 2#
d486dd0d 3# Copyright 2014-2017 Cumulus Networks, Inc. All rights reserved.
15ef32ea
RP
4# Author: Roopa Prabhu, roopa@cumulusnetworks.com
5#
6
15ef32ea 7import os
223ba5af 8import errno
15ef32ea 9
d486dd0d
JF
10try:
11 from ifupdown2.ifupdown.utils import utils
12 from ifupdown2.ifupdownaddons.utilsbase import *
bd441a51 13except (ImportError, ModuleNotFoundError):
d486dd0d
JF
14 from ifupdown.utils import utils
15 from ifupdownaddons.utilsbase import *
16
15ef32ea
RP
17
18class dhclient(utilsBase):
19 """ This class contains helper methods to interact with the dhclient
20 utility """
21
22 def _pid_exists(self, pidfilename):
23 if os.path.exists(pidfilename):
223ba5af
JF
24 try:
25 return os.readlink(
26 "/proc/%s/exe" % self.read_file_oneline(pidfilename)
27 ).endswith("dhclient")
28 except OSError as e:
29 try:
30 if e.errno == errno.EACCES:
31 return os.path.exists("/proc/%s" % self.read_file_oneline(pidfilename))
3218f49d 32 except Exception:
223ba5af 33 return False
3218f49d 34 except Exception:
15ef32ea 35 return False
223ba5af 36 return False
15ef32ea
RP
37
38 def is_running(self, ifacename):
39 return self._pid_exists('/run/dhclient.%s.pid' %ifacename)
40
41 def is_running6(self, ifacename):
42 return self._pid_exists('/run/dhclient6.%s.pid' %ifacename)
43
717cee31
RP
44 def _run_dhclient_cmd(self, cmd, cmd_prefix=None):
45 if not cmd_prefix:
46 cmd_aslist = []
47 else:
48 cmd_aslist = cmd_prefix.split()
49 if cmd_aslist:
50 cmd_aslist.extend(cmd)
51 else:
52 cmd_aslist = cmd
a193d8d1 53 utils.exec_commandl(cmd_aslist, stdout=None, stderr=None)
717cee31
RP
54
55 def stop(self, ifacename, cmd_prefix=None):
15ef32ea
RP
56 if os.path.exists('/sbin/dhclient3'):
57 cmd = ['/sbin/dhclient3', '-x', '-pf',
58 '/run/dhclient.%s.pid' %ifacename, '-lf',
59 '/var/lib/dhcp3/dhclient.%s.leases' %ifacename,
60 '%s' %ifacename]
61 else:
62 cmd = ['/sbin/dhclient', '-x', '-pf',
63 '/run/dhclient.%s.pid' %ifacename,
64 '-lf', '/var/lib/dhcp/dhclient.%s.leases' %ifacename,
65 '%s' %ifacename]
717cee31 66 self._run_dhclient_cmd(cmd, cmd_prefix)
15ef32ea 67
717cee31 68 def start(self, ifacename, wait=True, cmd_prefix=None):
1eacb76b
AR
69 retries = 0
70 out = "0"
71
72 # wait if interface isn't up yet
73 while '1' not in out and retries < 5:
74 path = 'sys/class/net/%s/carrier' %ifacename
75 out = self.read_file_oneline(path)
76 retries += 1
77 time.sleep(1)
78
15ef32ea
RP
79 if os.path.exists('/sbin/dhclient3'):
80 cmd = ['/sbin/dhclient3', '-pf',
81 '/run/dhclient.%s.pid' %ifacename,
82 '-lf', '/var/lib/dhcp3/dhclient.%s.leases' %ifacename,
83 '%s' %ifacename]
84 else:
717cee31
RP
85 cmd = ['/sbin/dhclient', '-pf',
86 '/run/dhclient.%s.pid' %ifacename, '-lf',
87 '/var/lib/dhcp/dhclient.%s.leases' %ifacename,
15ef32ea 88 '%s' %ifacename]
a0a8d7e0 89 if not wait:
6d359159 90 cmd.append('-nw')
717cee31 91 self._run_dhclient_cmd(cmd, cmd_prefix)
15ef32ea 92
717cee31 93 def release(self, ifacename, cmd_prefix=None):
15ef32ea
RP
94 if os.path.exists('/sbin/dhclient3'):
95 cmd = ['/sbin/dhclient3', '-r', '-pf',
96 '/run/dhclient.%s.pid' %ifacename, '-lf',
97 '/var/lib/dhcp3/dhclient.%s.leases' %ifacename,
98 '%s' %ifacename]
99 else:
100 cmd = ['/sbin/dhclient', '-r', '-pf',
101 '/run/dhclient.%s.pid' %ifacename,
102 '-lf', '/var/lib/dhcp/dhclient.%s.leases' %ifacename,
103 '%s' %ifacename]
717cee31 104 self._run_dhclient_cmd(cmd, cmd_prefix)
15ef32ea 105
f62cfb7b 106 def start6(self, ifacename, wait=True, cmd_prefix=None, duid=None):
717cee31 107 cmd = ['/sbin/dhclient', '-6', '-pf',
15ef32ea 108 '/run/dhclient6.%s.pid' %ifacename, '-lf',
004d1e65 109 '/var/lib/dhcp/dhclient6.%s.leases' % ifacename,
6d359159 110 '%s' %ifacename]
a0a8d7e0 111 if not wait:
6d359159 112 cmd.append('-nw')
f62cfb7b
RD
113 if duid is not None:
114 cmd.append('-D')
115 cmd.append(duid)
717cee31 116 self._run_dhclient_cmd(cmd, cmd_prefix)
15ef32ea 117
f62cfb7b 118 def stop6(self, ifacename, cmd_prefix=None, duid=None):
717cee31 119 cmd = ['/sbin/dhclient', '-6', '-x', '-pf',
004d1e65
JF
120 '/run/dhclient6.%s.pid' % ifacename, '-lf',
121 '/var/lib/dhcp/dhclient6.%s.leases' % ifacename,
717cee31 122 '%s' %ifacename]
f62cfb7b
RD
123 if duid is not None:
124 cmd.append('-D')
125 cmd.append(duid)
717cee31 126 self._run_dhclient_cmd(cmd, cmd_prefix)
15ef32ea 127
f62cfb7b 128 def release6(self, ifacename, cmd_prefix=None, duid=None):
717cee31 129 cmd = ['/sbin/dhclient', '-6', '-r', '-pf',
20fd3a06 130 '/run/dhclient6.%s.pid' %ifacename,
de4104b0 131 '-lf', '/var/lib/dhcp/dhclient6.%s.leases' % ifacename,
717cee31 132 '%s' %ifacename]
f62cfb7b
RD
133 if duid is not None:
134 cmd.append('-D')
135 cmd.append(duid)
717cee31 136 self._run_dhclient_cmd(cmd, cmd_prefix)