܍~c;,ddlZddlZddlZddlmZmZddlmZmZm Z ddl m Z ej e ZeZeZGddejZGdd eZGd d eZGd d eZdS)N)ListOptional)netsubputil)ifconfigceZdZdZdZdefdZdddeddfdZe j d e ddfd Z d e fd Zd e fd Zd e defdZdddZddddefdZdefdZdefdZd e defdZd e fdZdefdZdefdZd e fdZddd e dedefdZd e defd Zd e defd!Ze j d e defd"Zd e defd#Zd e defd$Z d e defd%Z!d e defd&Z"e j dd'd,d(Z#d)dd e deddfd*Z$e j d e defd+Z%dS)- NetworkingaThe root of the Networking hierarchy in cloud-init. This is part of an ongoing refactor in the cloud-init codebase, for more details see "``cloudinit.net`` -> ``cloudinit.distros.networking`` Hierarchy" in CONTRIBUTING.rst for full details. cd|_dSNblacklist_driversselfs >/usr/lib/python3/dist-packages/cloudinit/distros/networking.py__init__zNetworking.__init__s6:returnc(tjSr )r_get_current_rename_infors rrz#Networking._get_current_rename_infos+---rN current_inforenamesc.tj||S)Nr)r_rename_interfaces)rrrs rrzNetworking._rename_interfaces s%gLIIIIrnetcfgcdS)z7Read the network config and rename devices accordingly.Nrrs rapply_network_config_namesz%Networking.apply_network_config_names#rdevnamec*tj|Sr )r device_devidrr"s rr$zNetworking.device_devid's(((rc*tj|Sr )r device_driverr%s rr'zNetworking.device_driver*s )))rc*tj|Sr )rextract_physdevsrs rr)zNetworking.extract_physdevs-s#F+++rr c,tj|SNr )rfind_fallback_nic)rrs rr,zNetworking.find_fallback_nic0s$7HIIIIrFr config_driverr.c.tj||S)Nr-)rgenerate_fallback_config)rrr.s rr0z#Networking.generate_fallback_config3s#+/}    rc(tjSr )rget_devicelistrs rr2zNetworking.get_devicelist:!###rc(tjSr )rget_ib_hwaddrs_by_interfacers rr5z&Networking.get_ib_hwaddrs_by_interface=s.000rethernet_formatc,tj||Sr )rget_ib_interface_hwaddr)rr"r6s rr8z"Networking.get_ib_interface_hwaddr@s*7ODDDrc*tj|Sr )rget_interface_macr%s rr:zNetworking.get_interface_macE$W---rc(tjSr )rget_interfacesrs rr=zNetworking.get_interfacesHr3rc6tj|jSr+)rget_interfaces_by_macrrs rr?z Networking.get_interfaces_by_macKs"("4    rc*tj|Sr )r get_masterr%s rrAzNetworking.get_masterP~g&&&rstrictrDc.tj||S)NrC)rinterface_has_own_mac)rr"rDs rrFz Networking.interface_has_own_macSs(@@@@rc*tj|Sr )ris_bondr%s rrHzNetworking.is_bondX{7###rc*tj|Sr )r is_bridger%s rrKzNetworking.is_bridge[s}W%%%rcdS)z Is ``devname`` a physical network device? Examples of non-physical network devices: bonds, bridges, tunnels, loopback devices. Nrr%s r is_physicalzNetworking.is_physical^r!rc*tj|Sr )r is_renamedr%s rrOzNetworking.is_renamedgrBrc*tj|Sr )ris_upr%s rrQzNetworking.is_upjsy!!!rc*tj|Sr )ris_vlanr%s rrSzNetworking.is_vlanmrIrc*tj|Sr )rmaster_is_bridge_or_bondr%s rrUz#Networking.master_is_bridge_or_bondps+G444rexistscdS)aWait for device population in the system to complete. :param exists: An optional optimisation. If given, only perform as much of the settle process as is required for the given DeviceName to be present in the system. (This may include skipping the settle process entirely, if the device already exists.) :type exists: Optional[DeviceName] NrrrWs rsettlezNetworking.settlesr!rTc ||}td|D}t|}|}t ddD]}||rtddS| |}td||D]H} || } d | } tj tj| |j d| i I|}d |z} t| |rt| dS) aWait for all the physical devices in `netcfg` to exist on the system Specifically, this will call `self.settle` 5 times, and check after each one if the physical devices are now present in the system. :param netcfg: The NetworkConfig from which to extract physical devices to wait for. :param strict: Raise a `RuntimeError` if any physical devices are not present after waiting. c.g|]}|d|dfS)rr).0ifaces r z0Networking.wait_for_physdevs..s%KKKq58 4KKKrrz*net: all expected physical devices presentNz)net: waiting for expected net devices: %szWaiting for settle or {} existsrW)funckwargsz-Not all expected physical devices present: %s)r)dictsetkeysr?rangeissubsetLOGdebug differenceformatrlog_timerZwarning RuntimeError) rrrDphysdevsexpected_ifaces expected_macs present_macs_missingmacr"msgs rwait_for_physdevszNetworking.wait_for_physdevss((00KK(KKKLLO002233 113388:: q! ? ?A%%l33  FGGG#..|<>wGG I$g.  5577<<>>LL=G C  $s## # $ $rcdS)z=Try setting the link to up explicitly and return if it is up.Nrr%s rtry_set_link_upzNetworking.try_set_link_upr!rrN)&__name__ __module__ __qualname____doc__rrdrlistrabcabstractmethod NetworkConfigr DeviceNamer$r'r)r,boolr0r2r5r8r:r=r?rArFrHrKrMrOrQrSrUrZrxrzrrrr r s;;;.$....AEJJJ$JJJJJ FF4FFFF)J))))*Z****,},,,,,6:JJJJJ$(u   8<    $$$$$1T1111E!E48EEEE .....$$$$$ t    '*''''6;AAA!A.2A AAAA $z$d$$$$&&&&&&  : $    '*'''''"Z"D""""$z$d$$$$5 5t5555 #        8<4$4$4$#4$044$ 4$4$4$4$l LzLdLLLLLLrr ) metaclassceZdZdZdZdZdeddfdZdede fd Z dede fd Z dede fd Z dede fd Z dede fd ZddddZdede fdZdS) BSDNetworkingz>Implementation of networking functionality shared across BSDs.cltj|_i|_|dSr )rIfconfigifcifs _update_ifsrs rrzBSDNetworking.__init__s1$&& rctjddg}|dr'|j|d|_dSdS)Nrz-ar)rrparser)rifconfs rrzBSDNetworking._update_ifssKJ-.. !9 1x~~fQi00DHHH 1 1rrrNc:tddS)Nz Cannot rename network interface.)rirjrs rr z(BSDNetworking.apply_network_config_namess 455555rr"c&|j|jSr )rrMr%s rrMzBSDNetworking.is_physicalsx ,,rc&|j|jSr )rrHr%s rrHzBSDNetworking.is_bondx ((rc&|j|jSr )rrKr%s rrKzBSDNetworking.is_bridgesx **rc&|j|jSr )rrSr%s rrSzBSDNetworking.is_vlanrrc&|j|jSr )rupr%s rrQzBSDNetworking.is_upsx ##rrVcdS)z0BSD has no equivalent to `udevadm settle`; noop.NrrYs rrZzBSDNetworking.settler!rcZtjd|dg||S)Try setting the link to up explicitly and return if it is up. Not guaranteed to bring the interface up. The caller is expected to add wait times before retrying.rrrrQr%s rrzzBSDNetworking.try_set_link_ups- :w-...zz'"""rr{)r|r}r~rrrrr rrrMrHrKrSrQrZrzrrrrrsIHH 1116646666-:-$----)z)d))))++++++)z)d))))$Z$D$$$$ $??????#z#d######rrc.eZdZdeddfdZdedefdZdS)FreeBSDNetworkingrrNcdSr rrs rr z,FreeBSDNetworking.apply_network_config_namess rr"c|j|jsdStjdd|gddg\}}|d|krdSdS) NFdevinfoz-prr])rcszdevinfo: {}: Not found T)rrMrrl)rr"rterrs rrOzFreeBSDNetworking.is_renamedsdx , 5ItW5Aq6BBB3 ,33G<< < <4ur)r|r}r~rr rrrOrrrrrsX  4    *rrceZdZdZdeddfdZdedefdZdede fdZ dede fd Z dede fd Z dede fd Z dede fd Zdede fd ZddddZdede fdZdS)LinuxNetworkingzCImplementation of networking functionality common to Linux distros.rrNc |||dS#t$r}td|z|d}~wwxYw)zRead the network config and rename devices accordingly. Renames are only attempted for interfaces of type 'physical'. It is expected that the network system will create other devices with the correct name in place. z(Failed to apply network config names: %sN)rr)ro)rres rr z*LinuxNetworking.apply_network_config_names sk   # #D$9$9&$A$A B B B B B   :Q>  s(, AA  Ar"c*tj|Sr )rget_dev_featuresr%s rrz LinuxNetworking.get_dev_featuress#G,,,rc*tj|Sr )rhas_netfail_standby_featurer%s rrz+LinuxNetworking.has_netfail_standby_features.w777rc*tj|Sr )ris_netfailoverr%s rrzLinuxNetworking.is_netfailovers!'***rc*tj|Sr )ris_netfail_masterr%s rrz!LinuxNetworking.is_netfail_master"r;rc*tj|Sr )ris_netfail_primaryr%s rrz"LinuxNetworking.is_netfail_primary%%g...rc*tj|Sr )ris_netfail_standbyr%s rrz"LinuxNetworking.is_netfail_standby(rrcftjtj|dS)Ndevice)ospathrWr sys_dev_pathr%s rrMzLinuxNetworking.is_physical+s#w~~c.wAABBBrrVc\|tj|}tj|dS)NrV)rrrudevadm_settlerYs rrZzLinuxNetworking.settle.s2  %f--F 6******rc^tjddd|dg||S)riplinkrerrr%s rrzzLinuxNetworking.try_set_link_up3s1 46777zz'"""rr{)r|r}r~rrr rstrrrrrrrrrMrZrzrrrrrsuMM  4    - -s----8:8$8888+j+T++++....../*//////*/////C:C$CCCC $++++++ #z#d######rr)rloggingrtypingrr cloudinitrrrcloudinit.distros.parsersr getLoggerr|rirrrdrABCMetar rrrrrrrsT  !!!!!!!!%%%%%%%%%%......g!!   eLeLeLeLeL3;eLeLeLeLP)#)#)#)#)#J)#)#)#X B1#1#1#1#1#j1#1#1#1#1#r