܍~c=4ddlZddlZddlZddlZddlZddlmZddlmZ ddlm Z m Z ddl m Z mZmZddlmZdZdZd Ze jeZGd d ZGd d ejZddZddZdS)N)Optional)log)subputil)is_ipv6_addressrenderersubnet_is_ipv6) NetworkStatez/etc/NetworkManagerz/usr/lib/NetworkManagerz'/etc/NetworkManager/NetworkManager.confcpeZdZdZdZdZdZdZdZdZ dZ d Z d Z d Z ed Zd ZdZdS) NMConnectionz/Represents a NetworkManager connection profile.ctjd}tj|_t |j_d|t tj||d|jd<ddi|jd<dS) z Initializes the connection with some very basic properties, notably the UUID so that the connection can be referred to. z$a3924cb8-09e0-43e9-890b-77972a800108z cloud-init )iduuid connectionz%org.freedesktop.NetworkManager.originz cloud-inituserN)rUUID configparser ConfigParserconfigstr optionxformuuid5)selfcon_id CI_NM_UUIDs ?/usr/lib/python3/dist-packages/cloudinit/net/network_manager.py__init__zNMConnection.__init__sYEFF "/11 "% )(( :v6677% %  L! 4\  Fc|j|s i|j|<|j||s||j||<dSdS)z_ Sets a property unless it's already set, ensuring the section exists. N)r has_section has_option)rsectionoptionvalues r _set_defaultzNMConnection._set_default5sc {&&w// &#%DK {%%gv66 1+0DK  ( ( ( 1 1rc^dddddddd}||dd ||}n"#t$rd}d|j|d<YnwxYw|j|ddkrd S|j|ddkr|dkrd S||j|d<||dd d S) z} Ensures there's appropriate [ipv4]/[ipv6] for given family appropriate for given configuration type manualauto)staticdhcp6 ipv6_slaaczipv6_dhcpv6-statelesszipv6_dhcpv6-statefuldhcp4dhcpmethoddisabledtruezmay-failr-Nfalse)r%KeyErrorr)rfamily subnet_type method_mapr.s r_set_ip_methodzNMConnection._set_ip_method@s %+$*   &(J777 5 ,FF 5 5 5F.4DK  + + + 5 ;v x (F 2 2 F ;v x (F 2 2v7I7I F(. FH% &*g66666s,A  A ctjdD]6}||}|j||s||j||<dS7dS)z Adds a numbered property, such as address or route, ensuring the appropriate value gets used for . N) itertoolscountrr!)rr" key_prefixr$indexkeys r _add_numberedzNMConnection._add_numbereddsn _Q''  E(((C;))'377 ,1 G$S)   rcv|ddzt|dz}||d|dS)z5 Adds an ipv[46]address property. address/prefixNrr>)rr3subnetr$s r _add_addresszNMConnection._add_addresspsC y!C'#fX.>*?*?? 69e44444rc|ddzt|dz}d|vr|dz|dz}||d|dS)z3 Adds a ipv[46].route property. networkrArBgateway,routeNrC)rr3rJr$s r _add_routezNMConnection._add_routexs` i 3&U8_)=)==   CK% "22E 67E22222rct|rdnd}||dd||dd|j|d|zdz|j|d<dS) zF Extends the ipv[46].dns property with a name server. ipv6ipv4r.r/dns;N)rr%r)rrOr3s r_add_nameserverzNMConnection._add_nameserversw+3//;V &(J777 &%,,,%)[%8%?#%E%K FE"""rc||dd|j|dd|zdz|j|d<dS)zM Extends the ipv[46].dns-search property with a name server. z dns-searchrPrQN)r%rjoin)rr3 dns_searchs r_add_dns_searchzNMConnection._add_dns_searchsX &,333 K  -0D0D Ds J FL)))rc(|jddS)z- Returns the connection UUID rr)rrs rcon_uuidzNMConnection.con_uuids{<(00rc8|jddS)zN Can this be serialized into a meaningful connection profile? rtype)rr!rXs rvalidzNMConnection.valids{%%lF;;;rcR|ddS)z) Sanitize a MAC address. -:)replaceupper)addrs rmac_addrzNMConnection.mac_addrs$ ||C%%++---rc  ddddddd}||d}|dSd |vrd}nd}||jd d<|7||jd d <|j||d z|jd d <i|j|<dddddddddd dddddiiid}|d}d}|dD]} t| rd nd!} || | dd"| vr|| | d#| vr| d#|j| d#<| d$D]} || | d%| vr | d%D]} || d&| vr|| | d&| d!kr d| vr| d}||}||ks#t d'|d(|||| D]l\} }||vr ||t||tr||rd)nd*|j|| <It|||j|| <m|dkrw|d+d,urtd-|jdd.<|t||jdd<|d/)||d/|jdd0<|dkr(d1|vr$|j|d1|jdd2<|dkr|d3D]R}|j|}|d d d|d d |S|d/)||d/|jdd0<|dkr`|^d4|jdd5<t||jdd<|d/)||d/|jdd0<|dks|j|d0s|d(|jd d6<dSdS)7z Integrate information from network state interface information into the connection. Most of the work is done here. ethernetvlanbondbridge infinibandN)physicalrfrgrhriloopbackr[z bond-masterrz slave-typez-mastermasterz bond-mode bond_miimonzbond-xmit-hash-policyzbond-num-grat-arpzbond-downdelayz bond-updelayzbond-fail-over-maczbond-primary-reselectz bond-primary) modemiimonxmit_hash_policy num_grat_arp downdelayupdelay fail_over_macprimary_reselectprimary bridge_stpbridge_bridgeprio)stppriorityrvlan_id)rgrhrfrerimtusubnetsrMrNr@rHroutesdns_nameserversrUzZNetwork config: ignoring %s device-level mtu:%s because ipv4 subnet-level mtu:%s provided.namer0r1 wakeonlanT@z wake-on-lan mac_addressz mac-addresszvlan-raw-deviceparent bridge_portsdatagramztransport-modezinterface-name)rcon_refr r6rErKrRrVLOGwarningitems isinstanceboolrrcget_connr%rYr!)rifacer _type_mapif_type slave_type _prop_map device_mtuipv4_mturDr3rJ nameservernm_propr=ports rrender_interfacezNMConnection.render_interfacesK#&   E&M* ? F E ! !JJJ,3 L!&)  !6@DK %l 32B(2Bj9,-33DK %h / " G $'$; 3-)!5$;)  $/ i)  .5\ I& ) )F-f55AVV6F   v 7 7 7F""!!&&111F""17 1B F#I.) / /.... F**"():";55J((4444v%%$$VVL-ABBBEVOO!%=  !H:%% KK>f     &g.4466 @ @LGS%Sz!%*d++ @#Cj5FFg G$W--14E#J G$W-- j [!T))9sB kmm #u===G &&rN)__name__ __module__ __qualname____doc__rr%r6r>rErKrRrVrYr\ staticmethodrcrrrrr r s99   . 1 1 1"7"7"7H   555333 L L L   111 <<< ..\. NHNHNH`'''''rr cLeZdZdZd dZdZdZ d dedee ddfd Z dS) Rendererz?Renders network information in a NetworkManager keyfile format.Nci|_dSN connections)rrs rrzRenderer.__init__Lsrc|j|Srrrrs rrzRenderer.get_connOs''rcV||jvr|j|S|Sr)rrYrs rrzRenderer.con_refRs1 T% % %#F+4466 6Mr network_state templatesreturnc|D]%}t|d|j|d<&|D]+}|j|d}|||,|jD]R\}}|st ||}tj|| dSdS)Nri) iter_interfacesr rrrr\ conn_filenamer write_filer)rrrtargetrconnrrs rrender_network_statezRenderer.render_network_stateYs#2244 J JE.:5=.I.ID U6] + +#2244 / /E#E&M2D  ! !% . . . .!,2244 6 6LFD::<<  00D OD$))++u 5 5 5 5  6 6rr)NN) rrrrrrrr rdictrrrrrrIsII(((%) 66#6D>6  666666rrcPtj|t}d|d}|d|S)Nz cloud-init-z .nmconnectionz/system-connections/)r target_path NM_RUN_DIR)rrtarget_con_dircon_files rrrrs8%fj99N2V222H < <( < <rs^  $$$$$$ CCCCCCCCCC444444 " & 7 g!!k'k'k'k'k'k'k'k'\ &6&6&6&6&6x &6&6&6R==== EEEEEEr