PNG  IHDR* pHYs+ IDATx]n#; cdLb Ǚ[at¤_:uP}>!Usă cag޿ ֵNu`ݼTâabO7uL&y^wFٝA"l[|ŲHLN밪4*sG3|Dv}?+y߉{OuOAt4Jj.u]Gz*҉sP'VQKbA1u\`& Af;HWj hsO;ogTu uj7S3/QzUr&wS`M$X_L7r2;aE+ώ%vikDA:dR+%KzƉo>eOth$z%: :{WwaQ:wz%4foɹE[9<]#ERINƻv溂E%P1i01 |Jvҗ&{b?9g=^wζXn/lK::90KwrюO\!ջ3uzuGv^;騢wq<Iatv09:tt~hEG`v;3@MNZD.1]L:{ծI3`L(÷ba")Y.iljCɄae#I"1 `3*Bdz>j<fU40⨬%O$3cGt]j%Fߠ_twJ;ABU8vP3uEԑwQ V:h%))LfraqX-ۿX]v-\9I gl8tzX ]ecm)-cgʒ#Uw=Wlێn(0hPP/ӨtQ“&J35 $=]r1{tLuǮ*i0_;NƝ8;-vݏr8+U-kruȕYr0RnC]*ެ(M:]gE;{]tg(#ZJ9y>utRDRMdr9㪩̞zֹb<ģ&wzJM"iI( .ꮅX)Qw:9,i좜\Ԛi7&N0:asϓc];=ΗOӣ APqz93 y $)A*kVHZwBƺnWNaby>XMN*45~ղM6Nvm;A=jֲ.~1}(9`KJ/V F9[=`~[;sRuk]rєT!)iQO)Y$V ی ۤmzWz5IM Zb )ˆC`6 rRa}qNmUfDsWuˤV{ Pݝ'=Kֳbg,UҘVz2ﴻnjNgBb{? ߮tcsͻQuxVCIY۠:(V뺕 ٥2;t`@Fo{Z9`;]wMzU~%UA蛚dI vGq\r82iu +St`cR.6U/M9IENDB`# This file is part of cloud-init. See LICENSE file for license information. import logging import cloudinit.net.bsd from cloudinit import distros, net, subp, util LOG = logging.getLogger(__name__) class Renderer(cloudinit.net.bsd.BSDRenderer): def __init__(self, config=None): self._route_cpt = 0 super(Renderer, self).__init__() def rename_interface(self, cur_name, device_name): self.set_rc_config_value("ifconfig_%s_name" % cur_name, device_name) def write_config(self): for device_name, v in self.interface_configurations.items(): if isinstance(v, dict): net_config = "inet %s netmask %s" % ( v.get("address"), v.get("netmask"), ) mtu = v.get("mtu") if mtu: net_config += " mtu %d" % mtu elif v == "DHCP": net_config = "DHCP" self.set_rc_config_value("ifconfig_" + device_name, net_config) for device_name, v in self.interface_configurations_ipv6.items(): if isinstance(v, dict): net_config = "inet6 %s/%d" % ( v.get("address"), v.get("prefix"), ) mtu = v.get("mtu") if mtu: net_config += " mtu %d" % mtu self.set_rc_config_value( "ifconfig_%s_ipv6" % device_name, net_config ) def start_services(self, run=False): if not run: LOG.debug("freebsd generate postcmd disabled") return for dhcp_interface in self.dhcp_interfaces(): # Observed on DragonFlyBSD 6. If we use the "restart" parameter, # the routes are not recreated. net.dhcp.IscDhclient.stop_service( dhcp_interface, distros.freebsd.Distro ) subp.subp(["service", "netif", "restart"], capture=True) # On FreeBSD 10, the restart of routing and dhclient is likely to fail # because # - routing: it cannot remove the loopback route, but it will still set # up the default route as expected. # - dhclient: it cannot stop the dhclient started by the netif service. # In both case, the situation is ok, and we can proceed. subp.subp(["service", "routing", "restart"], capture=True, rcs=[0, 1]) for dhcp_interface in self.dhcp_interfaces(): net.dhcp.IscDhclient.start_service( dhcp_interface, distros.freebsd.Distro ) def set_route(self, network, netmask, gateway): if network == "0.0.0.0": self.set_rc_config_value("defaultrouter", gateway) elif network == "::": self.set_rc_config_value("ipv6_defaultrouter", gateway) else: route_name = f"net{self._route_cpt}" route_cmd = f"-net {network} -netmask {netmask} {gateway}" self.set_rc_config_value("route_" + route_name, route_cmd) self.route_names = f"{self.route_names} {route_name}" self.set_rc_config_value("static_routes", self.route_names.strip()) self._route_cpt += 1 def available(target=None): return util.is_FreeBSD() or util.is_DragonFlyBSD()