@@ -16,7 +16,7 @@ def getTextOrNone(nodelist):
1616 rc = rc + node .data
1717 return rc == "" and None or rc .strip ().encode ()
1818
19- class NetInterface :
19+ class NetInterface ( object ) :
2020 """ Represents the configuration of a network interface. """
2121
2222 Static = 1
@@ -25,7 +25,7 @@ class NetInterface:
2525
2626 def __init__ (self , mode , hwaddr , ipaddr = None , netmask = None , gateway = None ,
2727 dns = None , domain = None , vlan = None ):
28- assert mode is None or mode == self .Static or mode == self .DHCP
28+ assert mode in [ None , self .Static , self .DHCP , self . Autoconf ]
2929 if ipaddr == '' :
3030 ipaddr = None
3131 if netmask == '' :
@@ -36,31 +36,25 @@ def __init__(self, mode, hwaddr, ipaddr=None, netmask=None, gateway=None,
3636 dns = None
3737 elif isinstance (dns , str ):
3838 dns = [ dns ]
39- if mode == self .Static :
40- assert ipaddr
41- assert netmask
39+ is_static = mode == self .Static
40+ if is_static :
41+ assert ipaddr and netmask
4242
43- self .mode = mode
4443 self .hwaddr = hwaddr
45- if mode == self .Static :
46- self .ipaddr = ipaddr
47- self .netmask = netmask
48- self .gateway = gateway
49- self .dns = dns
50- self .domain = domain
51- else :
52- self .ipaddr = None
53- self .netmask = None
54- self .gateway = None
55- self .dns = None
56- self .domain = None
57- self .vlan = vlan
5844
59- # Initialise IPv6 to None.
6045 self .modev6 = None
6146 self .ipv6addr = None
6247 self .ipv6_gateway = None
6348
49+ self .mode = mode
50+ self .ipaddr = ipaddr if is_static else None
51+ self .netmask = netmask if is_static else None
52+ self .gateway = gateway if is_static else None
53+
54+ self .dns = dns if is_static else None
55+ self .domain = domain if is_static else None
56+ self .vlan = vlan
57+
6458 def __repr__ (self ):
6559 hw = "hwaddr = '%s' " % self .hwaddr
6660
@@ -124,7 +118,10 @@ def valid(self):
124118
125119 def isStatic (self ):
126120 """ Returns true if a static interface configuration is represented. """
127- return self .mode == self .Static
121+ return self .mode == self .Static or (self .mode == None and self .modev6 == self .Static )
122+
123+ def isDHCP (self ):
124+ return self .mode == self .DHCP or (self .mode == None and self .modev6 == self .DHCP )
128125
129126 def isVlan (self ):
130127 return self .vlan is not None
@@ -143,13 +140,12 @@ def writeDebStyleInterface(self, iface, f):
143140
144141 # Debian style interfaces are only used for the installer; dom0 only uses CentOS style
145142 # IPv6 is only enabled through answerfiles and so is not supported here.
146- assert self .modev6 is None
147- assert self .mode
143+ assert self .modev6 or self .mode
148144 iface_vlan = self .getInterfaceName (iface )
149145
150146 if self .mode == self .DHCP :
151147 f .write ("iface %s inet dhcp\n " % iface_vlan )
152- else :
148+ elif self . mode == self . Static :
153149 # CA-11825: broadcast needs to be determined for non-standard networks
154150 bcast = self .getBroadcast ()
155151 f .write ("iface %s inet static\n " % iface_vlan )
@@ -160,12 +156,21 @@ def writeDebStyleInterface(self, iface, f):
160156 if self .gateway :
161157 f .write (" gateway %s\n " % self .gateway )
162158
159+ if self .modev6 == self .DHCP :
160+ f .write ("iface %s inet6 dhcp\n " % iface_vlan )
161+ if self .modev6 == self .Autoconf :
162+ f .write ("iface %s inet6 auto\n " % iface_vlan )
163+ elif self .modev6 == self .Static :
164+ f .write ("iface %s inet6 static\n " % iface_vlan )
165+ f .write (" address %s\n " % self .ipv6addr )
166+ if self .ipv6_gateway :
167+ f .write (" gateway %s\n " % self .ipv6_gateway )
168+
163169 def writeRHStyleInterface (self , iface ):
164170 """ Write a RedHat-style configuration entry for this interface to
165171 file object f using interface name iface. """
166172
167- assert self .modev6 is None
168- assert self .mode
173+ assert self .modev6 or self .mode
169174 iface_vlan = self .getInterfaceName (iface )
170175
171176 f = open ('/etc/sysconfig/network-scripts/ifcfg-%s' % iface_vlan , 'w' )
@@ -175,17 +180,38 @@ def writeRHStyleInterface(self, iface):
175180 f .write ("BOOTPROTO=dhcp\n " )
176181 f .write ("PERSISTENT_DHCLIENT=1\n " )
177182 else :
183+ f .write ("BOOTPROTO=none\n " )
184+
185+ if self .mode == self .Static :
178186 # CA-11825: broadcast needs to be determined for non-standard networks
179187 bcast = self .getBroadcast ()
180- f .write ("BOOTPROTO=none\n " )
181188 f .write ("IPADDR=%s\n " % self .ipaddr )
182189 if bcast is not None :
183190 f .write ("BROADCAST=%s\n " % bcast )
184191 f .write ("NETMASK=%s\n " % self .netmask )
185192 if self .gateway :
186193 f .write ("GATEWAY=%s\n " % self .gateway )
194+
195+ if self .modev6 :
196+ with open ('/etc/sysconfig/network' , 'w' ) as net_conf :
197+ net_conf .write ("NETWORKING_IPV6=yes\n " )
198+ f .write ("IPV6INIT=yes\n " )
199+ f .write ("IPV6_DEFROUTE=yes\n " )
200+ f .write ("IPV6_DEFAULTDEV=%s\n " % iface_vlan )
201+ f .write ("IPV6_AUTOCONF=yes\n " if self .modev6 == self .Autoconf else "IPV6_AUTOCONF=no\n " )
202+
203+ if self .modev6 == self .DHCP :
204+ f .write ("DHCPV6C=yes\n " )
205+ f .write ("PERSISTENT_DHCLIENT_IPV6=yes\n " )
206+ f .write ("IPV6_FORCE_ACCEPT_RA=yes\n " )
207+ elif self .modev6 == self .Static :
208+ f .write ("IPV6ADDR=%s\n " % self .ipv6addr )
209+ if self .ipv6_gateway :
210+ f .write ("IPV6_DEFAULTGW=%s\n " % (self .ipv6_gateway ))
211+
187212 if self .vlan :
188213 f .write ("VLAN=yes\n " )
214+
189215 f .close ()
190216
191217
@@ -348,3 +374,21 @@ def loadFromNetDb(jdata, hwaddr):
348374
349375 nic .addIPv6 (modev6 , ipv6addr , gatewayv6 )
350376 return nic
377+
378+ class NetInterfaceV6 (NetInterface ):
379+ def __init__ (self , mode , hwaddr , ipaddr = None , netmask = None , gateway = None , dns = None , domain = None , vlan = None ):
380+ super (NetInterfaceV6 , self ).__init__ (None , hwaddr , None , None , None , None , None , vlan )
381+
382+ is_static = mode == self .Static
383+ ipv6addr = None
384+ if is_static :
385+ assert ipaddr and netmask
386+ ipv6addr = ipaddr + "/" + netmask
387+ if dns == '' :
388+ dns = None
389+ elif isinstance (dns , str ):
390+ dns = [ dns ]
391+ self .dns = dns
392+ self .domain = domain
393+
394+ self .addIPv6 (mode , ipv6addr = ipv6addr , ipv6gw = gateway )
0 commit comments