x[h>+ddlZddlZddlZddlmZmZmZmZddlm Z ddl m Z eje ZeZeZGddej&ZGdd eZGd d eZGd d eZy)N)net performancesubputil)ifconfig)Iproute2ceZdZdZdefdZdddeddfdZejde ddfd Z d e fd Z d e fd Zde defd ZdZdddefdZdefdZdefdZd e defdZd e fdZdefdZdefdZd e fdZddd e dedefdZd e defdZd e defdZejd e defd Zd e defd!Zd e defd"Zd e defd#Z d e defd$Z!ejdd%d*d&Z"d'dde deddfd(Z#ejd e defd)Z$y)+ 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. returnc*tjSN)r_get_current_rename_infoselfs >/usr/lib/python3/dist-packages/cloudinit/distros/networking.pyrz#Networking._get_current_rename_infos++--N current_inforenamesc0tj||S)Nr)r_rename_interfaces)rrrs rrzNetworking._rename_interfacess%%gLIIrnetcfgcy)z7Read the network config and rename devices accordingly.Nrrs rapply_network_config_namesz%Networking.apply_network_config_names rdevnamec,tj|Sr )r device_devidrrs 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++rc*tjSr )rfind_fallback_nicrs rr'zNetworking.find_fallback_nic-s$$&&rF config_driverr)c.tj|S)Nr()rgenerate_fallback_config)rr)s rr+z#Networking.generate_fallback_config0s++-HHrc*tjSr )rget_devicelistrs rr-zNetworking.get_devicelist3!!##rc*tjSr )rget_ib_hwaddrs_by_interfacers rr0z&Networking.get_ib_hwaddrs_by_interface6s..00rethernet_formatc.tj||Sr )rget_ib_interface_hwaddr)rrr1s rr3z"Networking.get_ib_interface_hwaddr9s**7ODDrc,tj|Sr )rget_interface_macr!s rr5zNetworking.get_interface_mac>$$W--rc*tjSr )rget_interfacesrs rr8zNetworking.get_interfacesAr.rc*tjSr )rget_interfaces_by_macrs rr:z Networking.get_interfaces_by_macDs((**rc,tj|Sr )r get_masterr!s rr<zNetworking.get_masterG~~g&&rstrictr?c0tj||S)Nr>)rinterface_has_own_mac)rrr?s rrAz Networking.interface_has_own_macJs((@@rc,tj|Sr )ris_bondr!s rrCzNetworking.is_bondO{{7##rc,tj|Sr )r is_bridger!s rrFzNetworking.is_bridgeRs}}W%%rcy)z Is ``devname`` a physical network device? Examples of non-physical network devices: bonds, bridges, tunnels, loopback devices. Nrr!s r is_physicalzNetworking.is_physicalUrrc,tj|Sr )r is_renamedr!s rrJzNetworking.is_renamed^r=rc,tj|Sr )ris_upr!s rrLzNetworking.is_upasyy!!rc,tj|Sr )ris_vlanr!s rrNzNetworking.is_vlandrDrc,tj|Sr )rmaster_is_bridge_or_bondr!s rrPz#Networking.master_is_bridge_or_bondgs++G44rexistscy)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] NrrrRs rsettlezNetworking.settlejrrTc|j|}t|Dcgc] }|d|dfc}}t|j}|j j}t dD]}|j |rtjdy|j|} tjd| | D]J} || } dj| } tj| d 5|j| dddL|j j}d  z} tj| |r t| ycc}w#1swYxYw) 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. rz*net: all expected physical devices presentNz)net: waiting for expected net devices: %szWaiting for settle or {} existsalways)log_moderQz-Not all expected physical devices present: %s)r%dictsetkeysr:rangeissubsetLOGdebug differenceformatrTimedrUwarning RuntimeError) rrr?physdevsifaceexpected_ifaces expected_macs present_macs_missingmacrmsgs rwait_for_physdevszNetworking.wait_for_physdevsvsa((0(Kq58 4KLO0023 11388: q ?A%%l3 FG#..|>wG &&sX>0KKwK/00  0 557<<>L ?">G C s# # ; L*00sE9E##E, cy)z=Try setting the link to up explicitly and return if it is up.Nrr!s rtry_set_link_upzNetworking.try_set_link_uprrr N)%__name__ __module__ __qualname____doc__r[rlistrabcabstractmethod NetworkConfigr DeviceNamer r#r%r'boolr+r-r0r3r5r8r:r<rArCrFrHrJrLrNrPrUrprrrrrr r s-.$.AEJ$JJ FF4FF)J)*Z*,},,'AFII$$1T1E!E48E ..$$+t+'*'6;A!A.2A A $z$d$&&&  : $  '*''"Z"D"$z$d$5 5t5 #    8<0$#0$040$ 0$d LzLdLLrr ) metaclassceZdZdZfdZedefdZdZde ddfdZ d e de fd Z d e de fd Zd e de fd Zd e de fd Zd e de fdZddddZd e de fdZxZS) BSDNetworkingz>Implementation of networking functionality shared across BSDs.cbtj|_i|_t|yr )rIfconfigifc_ifssuper__init__)r __class__s rrzBSDNetworking.__init__s%$$&  rr cR|js|j|jSr )r _update_ifsrs rifszBSDNetworking.ifssyy    yyrctjddg}|dr$|jj|d|_yy)Nrz-ar)rrparser)rifconfs rrzBSDNetworking._update_ifss;J-. !9vay1DI rrNc.tjdy)Nz Cannot rename network interface.)r`rars rrz(BSDNetworking.apply_network_config_namess 45rrc4|j|jSr )rrHr!s rrHzBSDNetworking.is_physicalsxx ,,,rc4|j|jSr )rrCr!s rrCzBSDNetworking.is_bondxx (((rc4|j|jSr )rrFr!s rrFzBSDNetworking.is_bridgesxx ***rc4|j|jSr )rrNr!s rrNzBSDNetworking.is_vlanrrc4|j|jSr )rupr!s rrLzBSDNetworking.is_upsxx ###rrQcy)z0BSD has no equivalent to `udevadm settle`; noop.NrrTs rrUzBSDNetworking.settlerrcTtjd|dg|j|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.rr)rrLr!s rrrzBSDNetworking.try_set_link_ups& :w-.zz'""rrs)rtrurvrwrpropertyr[rrr{rr|r}rHrCrFrNrLrUrr __classcell__)rs@rrrsH T 26646-:-$-)z)d)+++)z)d)$Z$D$ $?#z#d#rrc,eZdZdeddfdZdedefdZy)FreeBSDNetworkingrr Ncyr rrs rrz,FreeBSDNetworking.apply_network_config_namess rrc|j|jsytjdd|gddg\}}|dj|k(ryy) NFdevinfoz-prrW)rcszdevinfo: {}: Not found T)rrHrrc)rrrlerrs rrJzFreeBSDNetworking.is_renamedsTxx ,,ItW5Aq6B3 ,33G< <r)rtrurvr{rr|r}rJrrrrrs(  4 *rrceZdZdZdeddfdZdedefdZdede fdZ dede fd Z dede fd Z dede fd Z dede fd Zdede fd ZddddZdede fdZy)LinuxNetworkingzCImplementation of networking functionality common to Linux distros.rr Nc |j|j|y#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%rf)rres rrz*LinuxNetworking.apply_network_config_namessH   # #D$9$9&$A B :Q>  s # A;Arc,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..w77rc,tj|Sr )ris_netfailoverr!s rrzLinuxNetworking.is_netfailovers!!'**rc,tj|Sr )ris_netfail_masterr!s rrz!LinuxNetworking.is_netfail_masterr6rc,tj|Sr )ris_netfail_primaryr!s rrz"LinuxNetworking.is_netfail_primary%%g..rc,tj|Sr )ris_netfail_standbyr!s rrz"LinuxNetworking.is_netfail_standby!rrchtjjtj|dS)Ndevice)ospathrRr sys_dev_pathr!s rrHzLinuxNetworking.is_physical$s"ww~~c..wABBrrQc^|tj|}tj|y)NrQ)rrrudevadm_settlerTs rrUzLinuxNetworking.settle's&  %%f-F 6*rcNtj||j|S)r)rlink_uprLr!s rrrzLinuxNetworking.try_set_link_up,s! !zz'""rrs)rtrurvrwr{rr|strrr}rrrrrrHrUrrrrrrrsM  4 - -s-8:8$8+j+T+.../*///*//C:C$C $+ #z#d#rr)ryloggingr cloudinitrrrrcloudinit.distros.parsersrcloudinit.net.netops.iproute2r getLoggerrtr`rr|r[r{ABCMetar rrrrrrrss  22.2g!   XL3;;XLv/#J/#d B1#j1#r