ó
    x[hƒ$  ã                   ó  • S SK r S SKrS SKrS SKrS SKrS SKrS SKrS SKrS SKJ	r	  S SK
JrJr  SrSr\R                  " \5      r " S S\ R$                  S9r " S	 S
\5      r\/rSS jrS rSS jrS rS rS rSS jrg)é    N)Úutil)Úget_devicelistÚread_sys_net_safez#/run/initramfs/open-iscsi.interfaceÚdisabledc                   óp   • \ rS rSrSr\R                  S\4S j5       r\R                  S\	4S j5       r
Srg)ÚInitramfsNetworkConfigSourceé   zBABC for net config sources that read config written by initramfsesÚreturnc                 ó   • g)zAIs this initramfs config source applicable to the current system?N© ©Úselfs    Ú7/usr/lib/python3/dist-packages/cloudinit/net/cmdline.pyÚis_applicableÚ*InitramfsNetworkConfigSource.is_applicable   ó   � ó    c                 ó   • g)z;Render a v1 network config from the initramfs configurationNr   r   s    r   Úrender_configÚ*InitramfsNetworkConfigSource.render_config"   r   r   r   N)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__ÚabcÚabstractmethodÚboolr   Údictr   Ú__static_attributes__r   r   r   r   r      sK   † ÙLà×ÑðP˜tó Pó ðPð 	×ÑðJ˜tó Jó óJr   r   )Ú	metaclassc                   ó>   • \ rS rSrSrS	S jrS\4S jrS\4S jr	Sr
g)
ÚKlibcNetworkConfigSourceé'   zá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                 ó@  • Xl         X l        X0l        U R                   c  [        5       U l         U R                  c  [        R
                  " 5       U l        U R                  c<  0 U l        [        5        H&  n[        US5      nU(       d  M  XPR                  U'   M(     g g )NÚaddress)Ú_filesÚ
_mac_addrsÚ_cmdlineÚ_get_klibc_net_cfg_filesr   Úget_cmdliner   r   )r   r'   r(   r)   ÚkÚmac_addrs         r   Ú__init__Ú!KlibcNetworkConfigSource.__init__/   s�   € ØŒØ$ŒØ Œð �;‰;ÑÜ2Ó4ˆDŒKØ�=‰=Ñ Ü ×,Ò,Ó.ˆDŒMØ�?‰?Ñ"Ø ˆDŒOÜ#Ö%�Ü,¨Q°	Ó:�ß�8Ø)1—O‘O AÓ&ò &ð #r   r
   c                 óö   • U R                   (       ah  [        R                  " U R                  5       H  nUR	                  S5      (       d  M    g   [
        R                  R                  [        5      (       a  gg)a  
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   Ú&KlibcNetworkConfigSource.is_applicableA   sP   € ð �;�;ÜŸš D§M¡MÖ2�Ø—?‘? ?×3Ó3Ùñ 3ô �w‰w�~‰~Ô8×9Ñ9àØr   c                 ó>   • [        U R                  U R                  S9$ )N)ÚfilesÚ	mac_addrs)Úconfig_from_klibc_net_cfgr'   r(   r   s    r   r   Ú&KlibcNetworkConfigSource.render_configT   s   € Ü(Ø—+‘+Ø—o‘oñ
ð 	
r   )r)   r'   r(   )NNN)r   r   r   r   r   r.   r   r   r   r   r    r   r   r   r#   r#   '   s$   † ñô2ð$˜tô ð&
˜t÷ 
r   r#   c                 óè  • Uc  0 n[         R                  " U 5      n SU;   a  US   OUS   nUR	                  SUR	                  S5      5      nU(       d  UR	                  S5      (       a  SnOS	nUS
;   a  S	nUS;  a  [        SU-  5      eSU/ S.nX1;   a  X   US'   S GH.  nUS-   U;  a  M  UR	                  US-   U5      nUS	:X  a  SnUSS.n	US:X  a
  X'S-      U	S'   S H$  n
Xz-   U;   d  M  X'U
-      XšR                  5       '   M&     / nS HV  nUR	                  X|-   5      nU(       d  M  [        UR                  S5      5      (       d  M@  UR                  X'U-      5        MX     U(       aJ  X¹S'   UR	                  S5      nU(       a.  SU;   a  UR                  S5      U	S'   OUR                  5       U	S'   US   R                  U	5        GM1     X64$ ! [         a  n[        S5      UeSnAff = f)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)rF   rE   Údhcp6zUnexpected value for PROTO: %sÚphysical)ÚtypeÚnameÚsubnetsÚmac_address)ÚIPV4ÚIPV6ÚADDRrG   Úmanual)rK   Úcontrolr&   )ÚNETMASKÚ	BROADCASTÚGATEWAY)ÚDNS0ÚDNS1z:.0Údns_nameserversÚDOMAINSEARCHÚ,Ú
dns_searchrM   )
r   Úload_shell_contentÚKeyErrorÚ
ValueErrorÚgetÚlowerÚlenÚstripÚappendr2   )Úcontentr<   ÚdatarL   ÚeÚprotoÚifaceÚpreÚ	cur_protoÚsubnetÚkeyÚdnsÚnskeyÚnsÚsearchs                  r   Ú_klibc_to_config_entryrr   ^   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ð ÓØ(™ˆˆmÑô  ˆà�‰<˜tÓ#Ùð —H‘H˜S 7™]¨EÓ2ˆ	à˜ÓØ ˆIØ#°Ñ9ˆð ˜Ó Ø $¨6¡\Ñ 2ˆF�9Ñó 7ˆCØ‰y˜DÕ Ø&*°©9¡o�—y‘y“{Ó#ñ 7ð ˆã%ˆEØ—‘˜#™+Ó&ˆBçˆr”c˜"Ÿ(™( 5›/×*Ó*Ø—
‘
˜4 e¡Ñ,Ö-ñ	 &ö
 Ø(+Ð$Ñ%à—X‘X˜nÓ-ˆFÞØ˜&“=Ø+1¯<©<¸Ó+<�F˜<Ò(à+1¯<©<«>�F˜<Ñ(àˆiÑ×Ñ ×'ñO  ðR ˆ;ÐøôK ó JÜÐAÓBÈÐIûðJús   �G Ç
G1Ç G,Ç,G1c                  ó\   • [         R                   " S5      [         R                   " S5      -   $ )Nz/run/net-*.confz/run/net6-*.conf)Úglobr   r   r   r*   r*   ¾   s!   € Ü�9Š9Ð&Ó'¬$¯)ª)Ð4FÓ*GÑGÐGr   c                 ó
  • U c
  [        5       n / n0 nU  Hè  n[        [        R                  " U5      US9u  pVXS;   a§  X5   S   nUR	                  S5      UR	                  S5      :w  aM  [        SR                  USR                  X5   S   5      UR	                  S5      UR	                  S5      S95      eUS   R                  US   5        X5   S   R                  U5        MÏ  U/US	.X5'   UR                  U5        Mê     US
S.$ )N)r<   ÚentryrN   zedevice '{name}' was defined multiple times ({files}) but had differing mac addresses: {old} -> {new}.Ú r;   )rL   r;   ÚoldÚnewrM   )r;   rv   é   )ÚconfigÚversion)
r*   rr   r   Úload_text_filer`   r_   ÚformatÚjoinÚextendrd   )r;   r<   ÚentriesÚnamesÚcfg_filerL   rv   Úprevs           r   r=   r=   Â   s  € Ø�}Ü(Ó*ˆà€GØ€EÛˆÜ,Ü×Ò Ó)°Yñ
‰ˆð ‹=Ø‘;˜wÑ'ˆDØ�x‰x˜Ó&¨%¯)©)°MÓ*BÓBÜ ðHßHNÉØ!Ø!Ÿh™h u¡{°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                  óz   • [          H1  n U " 5       nUR                  5       (       d  M!  UR                  5       s  $    g)zú
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                 ó€  • [         R                  " U 5       nS n [        R                  " SUS9nUR	                  5       U(       a  UR                  5         sS S S 5        $ ! [         a%    U s U(       a  UR                  5         sS S S 5        $ f = f! U(       a  UR                  5         f f = f! , (       d  f       g = f)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                 óž   •  [         R                  " U 5      n[        U5      $ ! [        [        4 a    [        R                  SU 5         gf = f)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Ú	TypeErrorr_   ÚLOGÚerrorr˜   )rf   r•   s     r   Ú_b64dgzr      sS   € ðÜ×Ò Ó%ˆô ˜ÓÐøô ”zÐ"ó Ü�	‰	ð;àô	
ñ
 ðús   ‚# £&AÁAc                 ó4  • U c  [         R                  " 5       n SU ;   az  S nU R                  5        H0  nUR                  S5      (       d  M  UR                  SS5      S   nM2     U(       a-  U[        :X  a  SS0$ [         R
                  " [        U5      5      $ g )Nznetwork-config=Ú=rz   r{   r   )r   r+   r2   r3   Ú&KERNEL_CMDLINE_NETWORK_CONFIG_DISABLEDÚ	load_yamlr    )ÚcmdlineÚdata64Útoks      r   Úread_kernel_cmdline_configr¨     s†   € Ø�Ü×"Ò"Ó$ˆà˜GÓ#ØˆØ—=‘=–?ˆCØ�~‰~Ð/×0Ó0ØŸ™ 3¨Ó*¨1Ñ-’ñ #ö ØÔ?Ó?Ø  *Ð-Ð-Ü—>’>¤'¨&£/Ó2Ð2àr   )N)NN)r   r›   rt   r�   rŽ   Úloggingr4   r1   Ú	cloudinitr   Úcloudinit.netr   r   r7   r£   Ú	getLoggerr   rž   ÚABCMetar   r#   r†   rr   r*   r=   r‰   r˜   r    r¨   r   r   r   Ú<module>r®      s’   ðó Û Û Û Û 	Û Û 	Û å ß ;àBÐ à)3Ð &à×Ò˜Ó!€ô	J¨S¯[©[ò 	Jô1
Ð;ô 1
ðh 6Ð6Ð ô]ò@Hô-ò>ò$òõ&r   