Ë
    x[hƒ$  ã                   ó  — d dl Z d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlm	Z	 d dl
mZmZ dZdZ ej                  e«      Z G d„ de j$                  ¬«      Z G d	„ d
e«      ZegZdd„Zd„ Zdd„Zd„ Zd„ Zd„ Zdd„Zy)é    N)Úutil)Úget_devicelistÚread_sys_net_safez#/run/initramfs/open-iscsi.interfaceÚdisabledc                   ód   — e Zd ZdZej
                  defd„«       Zej
                  defd„«       Z	y)ÚInitramfsNetworkConfigSourcezBABC for net config sources that read config written by initramfsesÚreturnc                  ó   — y)zAIs this initramfs config source applicable to the current system?N© ©Úselfs    ú7/usr/lib/python3/dist-packages/cloudinit/net/cmdline.pyÚis_applicablez*InitramfsNetworkConfigSource.is_applicable   ó   � ó    c                  ó   — y)z;Render a v1 network config from the initramfs configurationNr   r   s    r   Úrender_configz*InitramfsNetworkConfigSource.render_config"   r   r   N)
Ú__name__Ú
__module__Ú__qualname__Ú__doc__ÚabcÚabstractmethodÚboolr   Údictr   r   r   r   r   r      sK   „ ÙLà×ÑðP˜tò Pó ðPð 	×ÑðJ˜tò Jó ñJr   r   )Ú	metaclassc                   ó0   — e Zd ZdZdd„Zdefd„Zdefd„Zy)ÚKlibcNetworkConfigSourcezñInitramfsNetworkConfigSource for klibc initramfs (i.e. Debian/Ubuntu)

    Has three parameters, but they are intended to make testing simpler, _not_
    for use in production code.  (This is indicated by the prepended
    underscores.)
    Nc                 ó0  — || _         || _        || _        | j                   €t        «       | _         | j                  €t	        j
                  «       | _        | j                  €5i | _        t        «       D ]   }t        |d«      }|sŒ|| j                  |<   Œ" y y )NÚaddress)Ú_filesÚ
_mac_addrsÚ_cmdlineÚ_get_klibc_net_cfg_filesr   Úget_cmdliner   r   )r   r!   r"   r#   ÚkÚmac_addrs         r   Ú__init__z!KlibcNetworkConfigSource.__init__/   sŒ   € ØˆŒØ$ˆŒØ ˆŒð �;‰;ÐÜ2Ó4ˆDŒKØ�=‰=Ð Ü ×,Ñ,Ó.ˆDŒMØ�?‰?Ð"Ø ˆDŒOÜ#Ó%ò 2�Ü,¨Q°	Ó:�ÚØ)1�D—O‘O AÒ&ñ2ð #r   r	   c                 óÒ   — | j                   r[t        j                  | j                  «      D ]  }|j	                  d«      sŒ y t
        j                  j                  t        «      ryy)aD  
        Return whether this system has klibc initramfs network config or not

        Will return True if:
            (a) klibc files exist in /run, AND
            (b) either:
                (i) ip= or ip6= are on the kernel cmdline, OR
                (ii) an open-iscsi interface file is present in the system
        )zip=zip6=TF)	r!   ÚshlexÚsplitr#   Ú
startswithÚosÚpathÚexistsÚ_OPEN_ISCSI_INTERFACE_FILE)r   Úitems     r   r   z&KlibcNetworkConfigSource.is_applicableA   sO   € ð �;Š;ÜŸ™ D§M¡MÓ2ò  �Ø—?‘? ?Õ3Ùð ô �w‰w�~‰~Ô8Ô9àØr   c                 óD   — t        | j                  | j                  ¬«      S )N)ÚfilesÚ	mac_addrs)Úconfig_from_klibc_net_cfgr!   r"   r   s    r   r   z&KlibcNetworkConfigSource.render_configT   s   € Ü(Ø—+‘+Ø—o‘oô
ð 	
r   )NNN)	r   r   r   r   r(   r   r   r   r   r   r   r   r   r   '   s$   „ ñó2ð$˜tó ð&
˜tô 
r   r   c                 ó†  — |€i }t        j                  | «      }	 d|v r|d   n|d   }|j	                  d|j	                  d«      «      }|s|j	                  d«      rd}nd	}|d
v rd	}|dvrt        d|z  «      ‚d|g dœ}||v r||   |d<   dD �]  }|dz   |vrŒ|j	                  |dz   |«      }|d	k(  rd}|ddœ}	|dk(  r||dz      |	d<   dD ]#  }
||
z   |v sŒ|||
z      |	|
j                  «       <   Œ% g }dD ]K  }|j	                  ||z   «      }|sŒt        |j                  d«      «      sŒ5|j                  |||z      «       ŒM |rD||	d<   |j	                  d«      }|r,d|v r|j                  d«      |	d<   n|j                  «       |	d<   |d   j                  |	«       �Œ ||fS # t        $ r}t        d«      |‚d}~ww xY w)a  Convert a klibc written shell content file to a 'config' entry
    When ip= is seen on the kernel command line in debian initramfs
    and networking is brought up, ipconfig will populate
    /run/net-<name>.cfg.

    The files are shell style syntax, and examples are in the tests
    provided here.  There is no good documentation on this unfortunately.

    DEVICE=<name> is expected/required and PROTO should indicate if
    this is 'none' (static) or 'dhcp' or 'dhcp6' (LP: #1621507) or 'static'
    or 'off' (LP: 2065787). Note that IPV6PROTO is also written to address
    the possibility of both ipv4 and ipv6 getting addresses.

    Full syntax is documented at:
    https://git.kernel.org/pub/scm/libs/klibc/klibc.git/plain/usr/kinit/ipconfig/README.ipconfig
    NÚDEVICEÚDEVICE6z&no 'DEVICE' or 'DEVICE6' entry in dataÚPROTOÚ	IPV6PROTOÚfilenameÚdhcpÚnone)ÚstaticÚoff)r=   r<   Údhcp6zUnexpected value for PROTO: %sÚphysical)ÚtypeÚnameÚsubnetsÚmac_address)ÚIPV4ÚIPV6ÚADDRr>   Úmanual)rB   Úcontrolr    )ÚNETMASKÚ	BROADCASTÚGATEWAY)ÚDNS0ÚDNS1z:.0Údns_nameserversÚDOMAINSEARCHú,Ú
dns_searchrD   )
r   Úload_shell_contentÚKeyErrorÚ
ValueErrorÚgetÚlowerÚlenÚstripÚappendr+   )Úcontentr4   ÚdatarC   ÚeÚprotoÚifaceÚpreÚ	cur_protoÚsubnetÚkeyÚdnsÚnskeyÚnsÚsearchs                  r   Ú_klibc_to_config_entryri   ^   s>  € ð$ ÐØˆ	ä×"Ñ" 7Ó+€DðJØ!)¨TÑ!1ˆt�HŠ~°t¸I±ˆð �H‰H�W˜dŸh™h {Ó3Ó4€EÙØ�8‰8�JÔØ‰EàˆEàÐ!Ñ!ØˆàÐ-Ñ-ÜÐ9¸EÑAÓBÐBð ØØñ€Eð ˆyÑØ(¨™ˆˆmÑð  ó '(ˆà�‰<˜tÑ#Øð —H‘H˜S 7™]¨EÓ2ˆ	à˜ÒØ ˆIØ#°Ñ9ˆð ˜Ò Ø $ S¨6¡\Ñ 2ˆF�9Ñð 7ò 	6ˆCØ�S‰y˜DÒ Ø&*¨3°©9¡o��s—y‘y“{Ò#ð	6ð ˆà%ò 	.ˆEØ—‘˜# ™+Ó&ˆBâ”c˜"Ÿ(™( 5›/Õ*Ø—
‘
˜4  e¡Ñ,Õ-ð		.ñ
 Ø(+ˆFÐ$Ñ%à—X‘X˜nÓ-ˆFÙØ˜&‘=Ø+1¯<©<¸Ó+<�F˜<Ò(à+1¯<©<«>�F˜<Ñ(àˆiÑ×Ñ Ö'ðO'(ðR �ˆ;ÐøôK ò JÜÐAÓBÈÐIûðJús   ›F& Æ&	G Æ/F;Æ;G c                  óX   — t        j                   d«      t        j                   d«      z   S )Nz/run/net-*.confz/run/net6-*.conf)Úglobr   r   r   r$   r$   ¾   s!   € Ü�9‰9Ð&Ó'¬$¯)©)Ð4FÓ*GÑGÐGr   c                 ó  — | €
t        «       } g }i }| D ]î  }t        t        j                  |«      |¬«      \  }}||v r«||   d   }|j	                  d«      |j	                  d«      k7  rQt        dj                  |dj                  ||   d   «      |j	                  d«      |j	                  d«      ¬«      «      ‚|d   j                  |d   «       ||   d   j                  |«       ŒÕ|g|d	œ||<   |j                  |«       Œð |d
dœS )N)r4   ÚentryrE   zedevice '{name}' was defined multiple times ({files}) but had differing mac addresses: {old} -> {new}.ú r3   )rC   r3   ÚoldÚnewrD   )r3   rm   é   )ÚconfigÚversion)
r$   ri   r   Úload_text_filerW   rV   ÚformatÚjoinÚextendr[   )r3   r4   ÚentriesÚnamesÚcfg_filerC   rm   Úprevs           r   r5   r5   Â   s%  € Ø€}Ü(Ó*ˆà€GØ€EØò "ˆÜ,Ü×Ñ Ó)°Yô
‰ˆˆeð �5‰=Ø˜‘;˜wÑ'ˆDØ�x‰x˜Ó&¨%¯)©)°MÓ*BÒBÜ ðHßHNÉØ!Ø!Ÿh™h u¨T¡{°7Ñ';Ó<Ø ŸH™H ]Ó3Ø!ŸI™I mÓ4ð	 IOó Ióð ð �‰O×"Ñ" 5¨Ñ#3Ô4Ø�$‰K˜Ñ ×'Ñ'¨Õ1à%- J¸Ñ?ˆE�$‰KØ�N‰N˜5Õ!ð)"ð, ¨!Ñ,Ð,r   c                  ól   — t         D ]+  }  | «       }|j                  «       sŒ|j                  «       c S  y)a  
    Return v1 network config for initramfs-configured networking (or None)

    This will consider each _INITRAMFS_CONFIG_SOURCES entry in turn, and return
    v1 network configuration for the first one that is applicable.  If none are
    applicable, return None.
    N)Ú_INITRAMFS_CONFIG_SOURCESr   r   )Úsrc_clsÚ
cfg_sources     r   Úread_initramfs_configr€   á   s=   € ô -ò *ˆÙ“Yˆ
à×'Ñ'Ô)Øà×'Ñ'Ó)Ò)ð*ð r   c                 óX  — t        j                  | «      5 }d }	 t        j                  d|¬«      }|j	                  «       |r|j                  «        cd d d «       S # t        $ r  | cY |r|j                  «        cd d d «       S w xY w# |r|j                  «        w w xY w# 1 sw Y   y xY w)NÚrb)ÚmodeÚfileobj)ÚioÚBytesIOÚgzipÚGzipFileÚreadÚcloseÚIOError)ÚblobÚiobufÚgzfps      r   Ú_decomp_gzipr�   ó   s›   € ä	�‰�DÓ	ð 	˜UØˆð	Ü—=‘= d°EÔ:ˆDØ—9‘9“;ñ Ø—
‘
”÷	ñ 	øô
 ò 	Ø‰KáØ—
‘
”÷	ñ 	ð
	ûñ Ø—
‘
•ð ú÷	ð 	ús@   –B š&AÁ B ÁBÁ'BÁ(B ÂBÂBÂBÂB Â B)c                 óš   — 	 t        j                  | «      }t        |«      S # t        t        f$ r t        j                  d| «       Y yw xY w)z¦Decode a string base64 encoding, if gzipped, uncompress as well

    :return: decompressed unencoded string of the data or empty string on
       unencoded data.
    zaExpected base64 encoded kernel command line parameter network-config. Ignoring network-config=%s.Ú )Úbase64Ú	b64decodeÚ	TypeErrorrV   ÚLOGÚerrorr�   )r]   rŒ   s     r   Ú_b64dgzr—     sS   € ðÜ×Ñ Ó%ˆô ˜ÓÐøô ”zÐ"ò Ü�	‰	ð;àô	
ñ
 ðús   ‚" ¢%A
Á	A
c                 ó  — | €t        j                  «       } d| v rkd }| j                  «       D ])  }|j                  d«      sŒ|j                  dd«      d   }Œ+ |r+|t        k(  rddiS t        j
                  t        |«      «      S y )Nznetwork-config=ú=rq   rr   r   )r   r%   r+   r,   Ú&KERNEL_CMDLINE_NETWORK_CONFIG_DISABLEDÚ	load_yamlr—   )ÚcmdlineÚdata64Útoks      r   Úread_kernel_cmdline_configrŸ     sˆ   € Ø€Ü×"Ñ"Ó$ˆà˜GÑ#ØˆØ—=‘=“?ò 	.ˆCØ�~‰~Ð/Õ0ØŸ™ 3¨Ó*¨1Ñ-‘ð	.ñ ØÔ?Ò?Ø  *Ð-Ð-Ü—>‘>¤'¨&£/Ó2Ð2àr   )N)NN)r   r’   rk   r‡   r…   Úloggingr-   r*   Ú	cloudinitr   Úcloudinit.netr   r   r0   rš   Ú	getLoggerr   r•   ÚABCMetar   r   r}   ri   r$   r5   r€   r�   r—   rŸ   r   r   r   ú<module>r¥      s”   ðó Û Û Û Û 	Û Û 	Û å ß ;àBÐ à)3Ð &à€g×Ñ˜Ó!€ô	J¨S¯[©[õ 	Jô1
Ð;ô 1
ðh 6Ð6Ð ó]ò@Hó-ò>ò$òô&r   