3 cj/@s6ddlZddlZddlZddlZddlZddlZddlmZmZddl m Z m Z ddl m Z mZddlmZmZmZmZmZddlmZejeZddd d d d d dddddddgZd,ddZddZddZGdddZGdddeZGd d!d!eZ Gd"d#d#ej!Z!d$d%Z"d-d&d'Z#d.d(d)Z$d/d*d+Z%dS)0N)MappingOptional)subputil)networkmanager_conf resolv_conf)IPV6_DYNAMIC_TYPESis_ipv6_addressnet_prefix_to_ipv4_maskrenderersubnet_is_ipv6) NetworkStateZ almalinuxZcentosZ cloudlinuxZ eurolinuxZfedoraZ miraclelinuxZ openeulerZ OpenCloudOSZ openmandrivarhelZrockysuseZ TencentOSZ virtuozzo#cCsPddg}xt|j|j|j|j}|jj|_|j|_|j|_|j |_ |S)N) rKrQrRrSrTr-copyrNrOrP)r.rrrrrYs z Route.copycCs|j|j|jdS)N)basename)rSrRrQ)r.rrr path_ipv4szRoute.path_ipv4cCs|j|j|jdS)N)r[r\)rTrRrQ)r.rrr path_ipv6szRoute.path_ipv6cCsd|kS)N:r)r.addressrrr is_ipv6_routeszRoute.is_ipv6_routeipv4c Cs|dkrtdt|tj}|jt|jr<|jdd}xt|jjD]t}d|krbqR|j dd}t|j|}t|jd|}|dko|j | r^t|jd |}|d}|jd dt|t |f|jd dt|t |f|jd d t|t |fd |} | |jkrt|jd |} |jd d t|t | fqR|dkrR|j |rRt|jd |} d ||jkrd t|jd |nd} |jd|| || |j fqRW|j S)Nrbipv6zUnknown protocol '%s'rrLADDRESSrGATEWAYNETMASKz%s=%s METRICPREFIXzmetric z%s/%s via %s %s dev %s )rbrc) ValueErrorrBr:r;r<rr-r=r>replacerar)rQrC) r.protorDZreindexr0indexZ address_valueZ gateway_valueZ netmask_valueZ metric_keyZ metric_valueZ prefix_valuerrrrEsV    &zRoute.to_string)rb) rGrHrIrJr/rYpropertyr]r^rarE __classcell__rr)rXrrK|s   rKcseZdZdZddddddZdfd d Zed d Zejd d ZeddZ e jddZ eddZ dddZ ddZ Z S) NetInterfacezERepresents a sysconfig/networking-script (and its config + children).ZEthernetZBondZBridgeZ InfiniBandVlan)ethernetbondbridge infinibandvlanrrcsrtt|jg|_||_|jjd}t|||jd|jdd|_|jjd|_||_ ||_ ||j d<||_ dS)Nroute_templatesrbrc)rVrWiface_templatesDEVICE) rMrpr/children templatesr3rKroutes iface_fn_tplkind _iface_namer-rR)r. iface_namerUr{r~Z route_tpl)rXrrr/s  zNetInterface.__init__cCs|jS)N)r)r.rrrr\ szNetInterface.namecCs||_||jd<dS)Nry)rr-)r.rrrrr\ scCs|jS)N)_kind)r.rrrr~szNetInterface.kindcCs,||jkrt|||_|j||jd<dS)NTYPE) iface_typesrjrr-)r.r~rrrr~s cCs|j|j|jdS)N)r[r\)r}rRr\)r.rrrpathszNetInterface.pathFcCsHt|j|j|j|jd}|jj|_|r4t|j|_|rD|j j|_ |S)N)r~) rpr\rRr{rr-rYlistrzr|)r.Z copy_childrenZ copy_routescrrrrY#s   zNetInterface.copycCs|dkr|dkrdSdS)NrrqTFr)r.r0r8rrrr9.szNetInterface.skip_key_value)rr)FF)rGrHrIrJrr/rnr\setterr~rrYr9rorr)rXrrps    rpc@s4eZdZUdZdddddddd Zd d d d dddddddddd ZedRdSdTdUdVdWdXdYdZd[d\d]d^d_d`gZiZe dad5d6Z e d7d8Z e d9d:Z e d;d<Ze d=d>Ze d?d@Ze dAdBZe dCdDZedbdEdFZedcdGdHZe dIdJZe dKdLZe dddMdNZdeeee d4dOdPdQZd4S)fRendererz7Renders network information in a /etc/sysconfig format.TFnone)ONBOOTZUSERCTL BOOTPROTOstaticauto)r STARTMODE)rrIPV6_FORCE_ACCEPT_RAZSTPZAGEINGZPRIOZHWADDRMTU)z accept-ra bridge_stp bridge_ageingbridge_bridgeprio mac_addressmtu BRIDGE_STPZBRIDGE_AGEINGTIMEZBRIDGE_PRIORITYLLADDR)rrrrr bond_modemode=%sbond_xmit_hash_policyxmit_hash_policy=%s bond_miimon miimon=%sbond_min_links min_links=%sbond_arp_intervalarp_interval=%sbond_arp_ip_targetarp_ip_target=%sbond_arp_validatearp_validate=%sbond_ad_select ad_select=%sbond_num_grat_arpnum_grat_arp=%sbond_downdelay downdelay=%s bond_updelay updelay=%sbond_lacp_rate lacp_rate=%sbond_fail_over_macfail_over_mac=%s bond_primary primary=%sbond_primary_reselectprimary_reselect=%sNcCsv|si}|jdd|_|jdd|_|jdd|_d}|jd||_|jd |jd |jd d |_|jd d|_dS)N sysconf_dirz etc/sysconfig netrules_pathz(etc/udev/rules.d/70-persistent-net.rulesdns_pathzetc/resolv.confz,etc/NetworkManager/conf.d/99-cloud-init.confnetworkmanager_conf_pathcontrolrxrw)rrxrwflavorr)r3rrrrr{r)r.config nm_conf_pathrrrr/ps  zRenderer.__init__cCstj|jj|i}|j|xPd D]H}|j|}|dk r$|dkrP|dd krPq$|j|j|}|r$|||<q$Wd|kr|dr|ddkrd|d <dS) Nrr accept-ratypephysicalruZ wakeonlanzwol gZ ETHTOOL_OPTS)rrr)rru)rYdeepcopyiface_defaultsr3rF cfg_key_maps)clsiface iface_cfgrZflavor_defaultsold_keyZ old_valuenew_keyrrr_render_iface_shareds      zRenderer._render_iface_sharedcCs|dkr,d|d<d|kr4d|d<|jdnd|d<xt|t|jdD]\}}d}|jd }|d ksr|d kr|dkr|ddAkrd|d<nd |d<d |d<nB|dkr|d krd|d<d|d<d|d<d|d<nd|d<d|d<n|dkrJ|dkr&|ddBkrd|d<nd |d<d|d<n d|d<d|d<d|d<d|d<n|dkr|dkr|ddCkrvd|d<nd |d<d|d<nd|d<d|d<nD|dDkr|d} d|d<|dkr| dEkrd |d<n |dFkrt|r|dkrd}d|d<d|krxt||ko$|d||k} | rHtjd|j |||dt|rl|dkr^n |d||<n |d||<t|r|dkrd|d<d|d<nB|d kr|dkrtj d!|n ||k|d"<nt d#||j f|jd$d krJ|dkrd |d%<qJd|d"<qJWdG} dH} xdt|t|jdD]L\}}|jd }d'|kr`|dkr`|d'|d(<|dIkr|dkr,|r,|ddkr,d|d)<q,q,|t krq,q,|dJkr,t|rX| d&} d*|d+|d,f} | d-kr|dkr| |d.<n| |d/<nT| d&kr*|dkr | |d0<n| |d1<n,|dkrB| |d2| <n|d1d3| 7<nB| d&} | d-krnd4nt | }|d+|d5|<t|d,|d6|<d7|kr|dkrd|d8<t|d7r|d7|d9<n |d7|d:<d;|kr|dkrd3j|d;|d<<d=|kr,|dkr,t|d=d>krBtj d?|j t|d=x4t|d=dd>d&D]\}}||d@t |<qZWq,WdS)KNrrrBRIDGEdhcpr)startrrdhcp6zipv6_dhcpv6-statefuldhcp4ZmanagedZDHCLIENT6_MODErTZDHCPV6CZIPV6INITFZ IPV6_AUTOCONFZIPV6_FAILURE_FATALzipv6_dhcpv6-statelessinfoz-SZDHCPV6C_OPTIONSZ ipv6_slaacstatic6ZIPV6_MTUrzZNetwork config: ignoring %s device-level mtu:%s because ipv4 subnet-level mtu:%s provided.rZmanualz Unknown subnet type setting "%s"rz1Unknown subnet type '%s' found for interface '%s'rrrLmetricrgDHCLIENT_SET_DEFAULT_ROUTEz%s/%sr`rrZIPADDR6ZIPV6ADDRZ IPADDR6_1ZIPV6ADDR_SECONDARIESz IPADDR6_%drrZIPADDRrfgatewayDEFROUTEIPV6_DEFAULTGWre dns_searchZDOMAINdns_nameserversz6%s has %d entries in dns_nameservers. Only 3 are used.ZDNS)rr)rr)rr)rr)rr)rrriri)rr)rr)r6 enumeraterrzr3r r@LOGZwarningr\debugrjrrBr r r)rrsubnetshas_default_routerrsubnetZmtu_key subnet_typeZ bootproto_inZ mtu_mismatchZ ipv4_indexZ ipv6_indexZ ipv6_cidrZsuffkrrr_render_subnetss                                                        zRenderer._render_subnetsc CsZ|dkr dSxFt|t|jdD].\}}|jd}x|jdgD]}|jdp`t|d} t|op|tkr|jdr|js|jdr|jrt d|j d |d <|d dkrd |d<d|kr| r|d|d<d |_n|d|d<d |_d|krN|d|d<qFx6d D].\} } | |kr| |j } || || <qW|j d7_ qFWq"WdS)!Nr)rrr|rcrrbz?Duplicate declaration of default route found for interface '%s'Trrrrrrrerrgrrhnetmaskrfr rdrL)rrrrerrgrrhrrfr rd)rrrrr) rrrzr3r r"rrOrPrjr\rN) rr route_cfgrr_rrr!Zis_ipv6rnew_namerrrr_render_subnet_routesesF            zRenderer._render_subnet_routesc Csg}xh|jD]^\}}||jddg}xD|D]<}||kr*||}t|ttfrVdj|}|j||Pq*Wq W|r|dkrdj||d<ndj||d<dS)Nr-rrZBONDING_MODULE_OPTSZ BONDING_OPTS) bond_tpl_optsrkr?tuplerrappend) rrrrZ bond_optsZbond_keyZ value_tplZ bond_keysZ bond_valuerrr_render_bonding_optss   zRenderer._render_bonding_optsc Csbtj}xV|j|D]H}|d}|jdg}||}|j} |j|||j||j|| ||qWdS)Nr\r)r Zfilter_by_physicaliter_interfacesr3r|rrr) r network_stateiface_contentsrZphysical_filterrr iface_subnetsrrrrr_render_physical_interfacess z$Renderer._render_physical_interfacescsttjd}tjd}xX|j|D]H}|d|}|j||||g}|j|jx"|D]} d| d<|dkr^d| _q^W|jdr|dkr|jd|d<n|jd|d <|jd g} |j } |j || |j ||j || | |t fd d |j|D} xnt| D]b\} }|dkr"d | }nd| }|||<||}|dkrVd|d<d|d<n|d<d|d<qWq"WdS)Nrsz bond-masterr\TZBONDING_MASTERrrrMACADDRrcs g|]}|dkr|dqS)z bond-masterr\r).0Z slave_iface)rrr sz4Renderer._render_bond_interfaces..zBONDING_SLAVE_%szBONDING_SLAVE%srrZhotplugrZMASTERZSLAVE)r filter_by_typeZfilter_by_attrrrextendrzr~r3r|rrrr=r)rrrrZ bond_filterZ slave_filterrrZ master_cfgsZ master_cfgrrZ bond_slavesrmZ bond_slaveZslavestrZ slave_cfgr)rr_render_bond_interfacessP              z Renderer._render_bond_interfacesc Cstjd}x|j|D]}|d}||}|dkr`|jd}|rH||d<|d|jd|d<nJd|d <d|_|d } t| |d} || krtjd || d j | | |d <|jdg} |j } |j || |j ||j || | |qWdS)Nrvr\rvlan_idZVLAN_ID.Z ETHERDEVICETZVLANzvlan-raw-devicezIName '%s' for vlan '%s' is not officially supportedby RHEL. Supported: %srZPHYSDEVr)r rrr3rfindr~_supported_vlan_namesrrrr|rrr) rrrrZ vlan_filterrrrrrdevZ supportedrrrrr_render_vlan_interfacess:    z Renderer._render_vlan_interfacesc s~ggx|jD]}x<|dD]0}d|kr:j|dd|kr j|dq Wd|krfdd|ddD7fdd|dd D7qW|jrfd d|jD7|jr؈fd d|jD7tttgsdStjd }|rtj j |rtjt j |}xD]}|j |q$WxD]}|j|q>Wtd }t|}|j|sz|d|}|S)Nrrrdnscsg|]}|kr|qSrr)rr)found_nameserversrrrJsz(Renderer._render_dns..Z nameserverscsg|]}|kr|qSrr)rr%)found_dns_searchrrrOsr%csg|]}|kr|qSrr)r nameserver)rrrrZscsg|]}|kr|qSrr)rr%)rrrr`sr;r)rrrZdns_searchdomainsanyrrZ ResolvConfosrisfiler load_fileZadd_nameserverZadd_search_domainrrBr&) rexisting_dns_pathrrcontentrZ searchdomainheaderZ content_strr)rrr _render_dns9sN            zRenderer._render_dnscCsPtjd}|jr|jdddt|dkr.dSdjtddj|jdg}|S)Nrmainrrrr)rZNetworkManagerConfrZset_section_keypairrrrr<)rr{r outrrr_render_networkmanager_confzs  z$Renderer._render_networkmanager_confcCsdd|j|jD}tjd}xl|j|D]\}|d}||}|dkrTd|_x(|jD]\} } | |kr^|| || <q^W|dkrd|kr|jdrd|d<nd|d<|jd rd } |dkrd } |jd || <|dkr|jd grd dj|jd |d<xZ|jd gD]J} || } | g}|j| j x(|D] }|}|dkrFd}||d<q0Wq W|jdg}|j }|j |||j ||j ||||q0WdS)NcSs i|]\}}|jdr||qS)rt)r&)rZold_kZnew_krrr sz6Renderer._render_bridge_interfaces..rtr\rrZonZoffrrZ LLADDRESSZ bridge_portsz%srZ BRIDGE_PORTSr+rr)ritemsr rrr~r3rrrzr|rrr)rrrrZbridge_key_mapZ bridge_filterrrrrrr0Zbridged_iface_nameZ bridged_cfgZ bridged_cfgsZ bridge_cfgZ bridge_valuerrrrr_render_bridge_interfacessV         z"Renderer._render_bridge_interfacesc Csltjd}x\|j|D]N}|d}||}d|_|jdg}|j} |j|||j||j|| ||qWdS)Nrur\r) r rrr~r3r|rrr) rrrrZ ib_filterrrrrrrrr_render_ib_interfacess  zRenderer._render_ib_interfacesc Cs^|s |j}i}xd|jD]X}|ddkr*q|d}t|||}|dkrZ|jd|jd|j||||||<qW|j||||j||||j||||j||||j |||i} x|j D]\}}|s|j r |j | |j <x |j D]}|r|j | |j <qW|jrxBt|jj|jjgddgD]$\} } | | kr.|jj | | | <q.WqW| S) z3Given state, return /etc/sysconfig files + contentsrZloopbackr\rryrrbrc)r{rrpr6rrrrrrrrzrErr|zipr]r^) rrUrrr{rrrrcontentsZcpathrlrrr_render_sysconfigs@        zRenderer._render_sysconfig)rr{returncCs|s |j}d}tj||j}x2|j|||j|djD]\}}tj|||q6W|j rtj||j }|j ||d} | rtj|| ||j rtj||j } |j ||} | rtj| | ||j r|j|} tj||j } tj| | |ddtj||jd}|jdrtjtjj|g}x@tj|ddjd D](}d |kr@P|jds0|j|q0W|jtdg|jr|jd|jdtj|d j|d |dS)Ni)r{)r T)r modeZ preserve_moderr )quietrz cloud-init NETWORKING=IPV6_AUTOCONF=NETWORKING_IPV6=zNETWORKING=yeszNETWORKING_IPV6=yeszIPV6_AUTOCONF=no)rrr)r{r target_pathrrrrrZ write_filerrrrrZ_render_persistent_netr3r'Z ensure_dirrrdirnamer splitr&rrrZuse_ipv6r)r.rr{targetZ file_moderUrdatarZresolv_contentrZnm_conf_contentZnetrules_contentrZsysconfig_pathZnetcfglinerrrrender_network_statesX       zRenderer.render_network_state)rr)rr)rr)rr)rr)rr)rr)rr)rr)rr)rr)rr)rr)rr)rr)N)N)N)N)NN)rGrHrIrJrrrrr{dictr/ classmethodrrrrrrr staticmethodrrrrrr rr%rrrrr4sj      I >   ? ' @  =  ) rcsfdddDS)ziReturn list of supported names for vlan devices per RHEL doc 11.5. Naming Scheme for VLAN Interfaces.csg|]}|jtdqS))rvid)formatint)rv)rr)rrrHsz)_supported_vlan_names..{rdev}{vid:04} {rdev}{vid}{rdev}.{vid:04} {rdev}.{vid})r-r.r/r0r)rr)r)rr)rrDs  rcCs0tjdtkrdSt|r dSt|r,dSdS)NZvariantFT)rZ system_info KNOWN_DISTROSavailable_sysconfigavailable_nm_ifcfg_rh)r"rrr availableRsr4cCstjtj|dS)Nz;usr/lib*/NetworkManager/*/libnm-settings-plugin-ifcfg-rh.so)globrr)r"rrrr3\sr3cCsdddg}ddg}x |D]}tj|||dsdSqWddg}x$|D]}tjjtj||r@d Sq@WdS) NZifupZifdownz/sbinz /usr/sbin)r%r"Fz/etc/sysconfig/network-scripts/network-functionszetc/sysconfig/configT)rZwhichrrr r)r"Zexpectedr%pZexpected_pathsrrrr2gs  r2)r)N)N)N)&rYr5r:Zloggingrr$ZtypingrrZ cloudinitrrZcloudinit.distros.parsersrrZ cloudinit.netrr r r r Zcloudinit.net.network_stater Z getLoggerrGrr1rr"r)r*rKrprrr4r3r2rrrrsT    6nJ