Ë
    x[hæ5  ã            
       ó  — U d Z ddlZddlZddlmZmZ ddlZddlmZm	Z	 ddl
mZ ddlmZ ddlmZ ddlmZ  ej$                  e«      Zd	Zd
dgedgdœZeed<   d„ Zd„ Zdededededdf
d„Zd„ Zd„ Zd„ Z	 dd„Z de!dedee   fd„Z"y)z>LXD: configure lxd with ``lxd init`` and optionally lxd-bridgeé    N)ÚListÚTuple)ÚsubpÚutil)ÚCloud)ÚConfig)Ú
MetaSchema)ÚPER_INSTANCEÚlxdbr0Úcc_lxdÚubuntuÚlxd)ÚidÚdistrosÚ	frequencyÚactivate_by_schema_keysÚmetac                 ó  — g }t        | t        «      s(|j                  dt        | «      j                  › d�«       t        |t        «      s(|j                  dt        |«      j                  › d�«       t        |t
        «      s(|j                  dt        |«      j                  › d�«       |r8| s|r4| rdgng }||rdgng z  }|j                  ddj                  |«      › �«       |rt        d	j                  |«      «      ‚y
)z…Validate user-provided lxd network and bridge config option values.

    @raises: ValueError describing invalid values provided.
    z/lxd.init config must be a dictionary. found a 'ú'z1lxd.bridge config must be a dictionary. found a 'z.lxd.preseed config must be a string. found a 'zlxd.initz
lxd.bridgezMUnable to configure LXD. lxd.preseed config can not be provided with key(s): z, z. N)Ú
isinstanceÚdictÚappendÚtypeÚ__name__ÚstrÚjoinÚ
ValueError)Úinit_cfgÚ
bridge_cfgÚpreseed_strÚerrorsÚincompat_cfgs        ú9/usr/lib/python3/dist-packages/cloudinit/config/cc_lxd.pyÚsupplemental_schema_validationr$   !   s  € ð
 €FÜ�h¤Ô%Ø�‰ðÜ�h“×(Ñ(Ð)¨ð,ô	
ô
 �j¤$Ô'Ø�‰ðÜ�jÓ!×*Ñ*Ð+¨1ð.ô	
ô
 �k¤3Ô'Ø�‰ðÜ�kÓ"×+Ñ+Ð,¨Að/ô	
ñ ™¡JÙ'/˜
‘|°RˆØ©*˜™¸"Ñ<ˆà�‰ðØ!ŸY™Y |Ó4Ð5ð7ô	
ñ Ü˜Ÿ™ 6Ó*Ó+Ð+ð ó    c           
      óê  — d}g d¢}|D ]H  }| j                  |«      sŒ|j                  d|j                  dd«      ›dt        | |   «      ›�g«       ŒJ 	 t	        j                  |«       y# t        j
                  $ rt | d   dk7  r‚ t        j                  d	«       t	        j                  g d
¢«       |D �cg c]  }|j                  d«      rŒ|‘Œ nc c}w }}t	        j                  |«       Y yw xY w)z�Set up lxd if init config is given.

    :param init_cfg: dict of lxd init configuration options to provide
        to `lxd init --auto`
    )Únetwork_addressÚnetwork_portÚstorage_backendÚstorage_create_deviceÚstorage_create_loopÚstorage_poolÚtrust_password)r   Úinitz--autoz--Ú_ú-ú=r)   ÚlvmzqCloud-init doesn't use thinpool by default on Ubuntu due to LP #1982780. This behavior will change in the future.)ÚlxcÚstorageÚcreateÚdefaultr2   zlvm.use_thinpool=falsez--storage-backendN)	ÚgetÚextendÚreplacer   r   ÚProcessExecutionErrorÚLOGÚinfoÚ
startswith)r   Ú	init_keysÚcmdÚkÚxÚnew_cmds         r#   Úhandle_init_cfgrC   D   sá   € ð"€Iò $€CØò NˆØ�<‰<˜�?Ø�JŠJ Q§Y¡Y¨s°CÕ%8¼#¸hÀq¹kÔ:JÐKÐLÕMðNðÜ�	‰	�#�øÜ×%Ñ%ò ØÐ%Ñ&¨%Ò/ØÜ�‰ðDô	
ô 	�	‰	òô		
ð "ÖK˜¨¯©Ð6IÕ)J’1ÑKùÒKˆÐKô 	�	‰	�'Öð3ús%   ÁA+ Á+AC2Â7CÃCÃC2Ã1C2ÚnameÚcfgÚcloudÚargsÚreturnc           
      ó<  — |j                  d«      }|st        j                  d| «       y t        |t        «      s"t        dt        |«      j                  › d�«      ‚t        j                  |«       |j                  di «      }|j                  dd«      }|j                  di «      }t        |||«       t        j                  d«      s	 t        j                  g d	¢«       t        ||«      }	t!        |	«      r	 |j"                  j%                  |	«       t        j                  g d¢«       |rt        j                  g d¢|¬«       y |rt)        |«       d}|�rŸ|j                  dt*        «      }t,        j.                  j1                  d«      rÌt        j                  |«      r·t3        |«      }	 t        j                  d|«       dj5                  |j7                  «       D ��cg c]  \  }}d|›d|›�‘Œ c}}«      dz   }t        j                  dg|¬«       t        j<                  d«       t        j                  d«       t        j                  g d¢«       y t?        |«      \  }}tA        |tC        |«      tC        |«      tC        |«      ¬«       |r0t        j                  ddj5                  |«      «       tE        |«       |r1t        j                  ddj5                  |«      «       tE        |«       y y |rt        d|z   «      ‚y # t        j                  $ r}t        d
|z  «      |‚d }~ww xY w# t        j                  $ r!}
t        j'                  d|	|
«       Y d }
~
y d }
~
ww xY wc c}}w # t8        $ r! t        j:                  t        d|z  «       Y �Œ�w xY w)Nr   z8Skipping module named %s, not present or disabled by cfgz*lxd config must be a dictionary. found a 'r   r.   ÚpreseedÚ Úbridge)ÚsnapÚinstallr   z#Failed to install lxd from snap: %sz!failed to install packages %s: %s)r   Ú	waitreadyz--timeout=300)r   r.   z	--preseed)Údatazdebconf-communicaterD   z/etc/default/lxd-bridgezSetting lxd debconf via %sú
zset ú zFailed to run '%s' for lxd withz Running dpkg-reconfigure for lxd)zdpkg-reconfigurer   z--frontend=noninteractive)Únet_nameÚdid_initr5   ÚattachzCreating lxd bridge: %sz!Setting up default lxd bridge: %sz*Unable to configure lxd bridge without %s.)#r7   r;   Údebugr   r   r   r   r   r   Úwait_for_snap_seededr$   r   Úwhichr:   ÚRuntimeErrorÚget_required_packagesÚlenÚdistroÚinstall_packagesÚwarningrC   Ú_DEFAULT_NETWORK_NAMEÚosÚpathÚexistsÚbridge_to_debconfr   ÚitemsÚ	ExceptionÚlogexcÚdel_fileÚbridge_to_cmdÚmaybe_cleanup_defaultÚboolÚ_lxc)rD   rE   rF   rG   Úlxd_cfgr   r    r   ÚeÚpackagesÚexcÚ
dconf_commrS   Údebconfr@   ÚvrP   Ú
cmd_createÚ
cmd_attachs                      r#   Úhandleru   x   s  € à�g‰g�e‹n€GÙÜ�	‰	ØFÈô	
ð 	Ü�gœtÔ$ÜðÜ�g“×'Ñ'Ð(¨ð+ó
ð 	
ô
 	×Ñ˜eÔ$à�{‰{˜6 2Ó&€HØ—+‘+˜i¨Ó,€KØ—‘˜X rÓ*€JÜ" 8¨Z¸ÔEä�:‰:�eÔð	Ü�I‰IÒ0Ô1ô
 % X¨{Ó;€HÜ
ˆ8„}ð	Ø�L‰L×)Ñ)¨(Ô3ô
 	‡I�IÒ3Ô4ÙÜ�	‰	Ò.°[ÕAØáÜ˜Ô!ð '€JÚØ—>‘> &Ô*?Ó@ˆÜ�7‰7�>‰>Ð3Ô4¼¿¹Øô:
ô
 (¨
Ó3ˆGðÜ—	‘	Ð6¸
ÔCà—I‘IØ:A¿-¹-»/×J±$°!±Qª©1Ò-ÓJóð ñð ô —	‘	Ð0Ð1¸Õ=ô �M‰MÐ3Ô4ô �I‰IÐ8Ô9Ü�I‰IÒNÕOô &3°:Ó%>Ñ"ˆJ˜
Ü!Ø!Ü˜h›Ü˜JÓ'Ü˜JÓ'õ	ñ Ü—	‘	Ð3°S·X±X¸jÓ5IÔJÜ�ZÔ áÜ—	‘	Ø7¸¿¹À*Ó9Môô �ZÕ ð	 ñ 
ÜØ8¸:ÑEó
ð 	
ð 
øôO ×)Ñ)ò 	ÜØ5¸Ñ9óàðûð	ûô ×)Ñ)ò 	Ü�K‰KÐ;¸XÀsÔKÜûð	üó8 Køô
 ò Ü—‘ÜÐ:¸ZÑG÷ðúsT   ÃL
 Ã:L4 Æ04M1 Ç$M+
Ç6#M1 Ì
L1ÌL,Ì,L1Ì4M(ÍM#Í#M(Í+M1 Í1&NÎNc                 óx  — i }| j                  d«      dk(  rd|d<   d|d<   |S | j                  d«      dk(  r d|d<   d|d	<   | j                  d
«      |d<   |S | j                  d«      dk(  �r3d|d<   | j                  d
«      r| j                  d
«      |d<   | j                  d«      r~d|d<   | j                  d«      |d<   | j                  d«      |d<   | j                  d«      |d<   | j                  d«      |d<   | j                  d«      |d<   | j                  dd«      |d<   | j                  d«      rBd|d<   | j                  d«      |d<   | j                  d«      |d<   | j                  dd«      |d<   | j                  d «      r| j                  d «      |d!<   |S t        d"| j                  d«      z  «      ‚)#NÚmodeÚnoneÚfalsezlxd/setup-bridgerK   zlxd/bridge-nameÚexistingÚtruezlxd/use-existing-bridgerD   ÚnewÚipv4_addresszlxd/bridge-ipv4zlxd/bridge-ipv4-addressÚipv4_netmaskzlxd/bridge-ipv4-netmaskÚipv4_dhcp_firstzlxd/bridge-ipv4-dhcp-firstÚipv4_dhcp_lastzlxd/bridge-ipv4-dhcp-lastÚipv4_dhcp_leaseszlxd/bridge-ipv4-dhcp-leasesÚipv4_natzlxd/bridge-ipv4-natÚipv6_addresszlxd/bridge-ipv6zlxd/bridge-ipv6-addressÚipv6_netmaskzlxd/bridge-ipv6-netmaskÚipv6_natzlxd/bridge-ipv6-natÚdomainzlxd/bridge-domainúinvalid bridge mode "%s")r7   rY   )r   rq   s     r#   rc   rc   Ý   sù  € Ø€Gà‡~�~�fÓ Ò'Ø&-ˆÐ"Ñ#Ø%'ˆÐ!Ñ"ðR €NðO 
�‰˜Ó	 :Ò	-Ø&-ˆÐ"Ñ#Ø-3ˆÐ)Ñ*Ø%/§^¡^°FÓ%;ˆÐ!Ñ"ðH €NðE 
�‰˜Ó	 5Ó	(Ø&,ˆÐ"Ñ#Ø�>‰>˜&Ô!Ø)3¯©¸Ó)?ˆGÐ%Ñ&à�>‰>˜.Ô)Ø)/ˆGÐ%Ñ&Ø1;·±ÀÓ1OˆGÐ-Ñ.Ø1;·±ÀÓ1OˆGÐ-Ñ.Ø4>·N±NØ!ó5ˆGÐ0Ñ1ð 4>·>±>Ø ó4ˆGÐ/Ñ0ð 6@·^±^Ø"ó6ˆGÐ1Ñ2ð .8¯^©^¸JÈÓ-OˆGÐ)Ñ*à�>‰>˜.Ô)Ø)/ˆGÐ%Ñ&Ø1;·±ÀÓ1OˆGÐ-Ñ.Ø1;·±ÀÓ1OˆGÐ-Ñ.Ø-7¯^©^Ø˜Gó.ˆGÐ)Ñ*ð �>‰>˜(Ô#Ø+5¯>©>¸(Ó+CˆGÐ'Ñ(ð
 €Nô Ð5¸
¿¹ÀvÓ8NÑNÓOÐOr%   c                 ó¼  — | j                  d«      dk(  ry| j                  dt        «      }g }dd|ddg}| j                  d«      d	k(  rd |fS | j                  d«      d
k7  rt        d| j                  d«      z  «      ‚dd|g}| j                  d«      rÈ| j                  d«      r·|j                  d| j                  d«      ›d| j                  d«      ›�«       | j                  dd«      dk(  r|j                  d«       | j                  d«      r\| j                  d«      rK| j                  d«      ›d| j                  d«      ›�}|j                  d|z  «       n|j                  d«       | j                  d«      rl| j                  d«      r[|j                  d| j                  d«      ›d| j                  d«      ›�«       | j                  d«      dk(  r#|j                  d«       n|j                  d«       | j                  d«      r#|j                  d | j                  d«      z  «       | j                  d!d"«      }|d"k7  r|j                  d#|› �«       ||fS )$Nrw   rx   )NNrD   Únetworkzattach-profiler6   Úeth0rz   r|   r‡   r5   r}   r~   zipv4.address=ú/r‚   r{   zipv4.nat=truer   r€   r0   zipv4.dhcp.ranges=%szipv4.address=nonerƒ   r„   zipv6.address=r…   zipv6.nat=truezipv6.address=noner†   zdns.domain=%sÚmtuéÿÿÿÿzbridge.mtu=)r7   r_   rY   r   )r   Úbridge_namers   rt   Ú
dhcp_rangerŒ   s         r#   rh   rh     s-  € Ø‡~�~�fÓ Ò'Øà—.‘. Ô)>Ó?€KØ€JØÐ-¨{¸IÀvÐN€Jà‡~�~�fÓ Ò+Ø�ZÐÐà‡~�~�fÓ Ò&ÜÐ5¸
¿¹ÀvÓ8NÑNÓOÐOà˜X {Ð3€Jà‡~�~�nÔ%¨*¯.©.¸Ô*HØ×Òà�~‰~˜nÕ-¨z¯~©~¸nÔ/MðOô	
ð
 �>‰>˜* fÓ-°Ò7Ø×Ñ˜oÔ.à�>‰>Ð+Ô,°·±Øô2
ð —‘Ð0Õ1Ø—‘Ð/Ô0ðˆJð ×ÑÐ3°jÑ@ÕAà×ÑÐ-Ô.à‡~�~�nÔ%¨*¯.©.¸Ô*HØ×Òà�~‰~˜nÕ-¨z¯~©~¸nÔ/MðOô	
ð
 �>‰>˜*Ó%¨Ò/Ø×Ñ˜oÕ.ð 	×ÑÐ-Ô.à‡~�~�hÔØ×Ñ˜/¨J¯N©N¸8Ó,DÑDÔEð �.‰.˜ Ó
#€CØ
ˆb‚yØ×Ñ˜K¨ uÐ-Ô.à�zÐ!Ð!r%   c                 óØ   — dt         j                  j                  dd«      t         j                  j                  dd«      dœ}t        j                  dgt	        | «      z   dgz   |¬	«       y )
NÚCÚHOMEz/rootÚUSERÚroot)ÚLC_ALLr’   r“   r3   z--force-local)Ú
update_env)r`   Úenvironr7   r   Úlist)r?   Úenvs     r#   rk   rk   J  sS   € àÜ—
‘
—‘˜v wÓ/Ü—
‘
—‘˜v vÓ.ñ€Cô
 	‡I�Iˆuˆgœ˜S›	Ñ! _Ð$5Ñ5À#ÖFr%   c                 óJ  — | t         k7  s|syd}d}|rQd}	 t        dd| |g«       t        j                  || ||«       d}t        dd| g«       t        j                  || |«       |r,d
}	 t        ddd||g«       t        j                  ||||«       yy# t        j
                  $ r3}	|	j                  d	k7  r|	‚t        j                  || ||«       Y d}	~	Œpd}	~	ww xY w# t        j
                  $ r3}	|	j                  d	k7  r|	‚t        j                  ||||«       Y d}	~	yd}	~	ww xY w)a   Newer versions of lxc (3.0.1+) create a lxdbr0 network when
    'lxd init --auto' is run.  Older versions did not.

    By removing any that lxd-init created, we simply leave the add/attach
    code intact.

    https://github.com/canonical/lxd/issues/4649Nz"failed. Assuming it did not exist.z
succeeded.z/Detach of lxd network '%s' from profile '%s' %sr‰   zdetach-profilezDeletion of lxd network '%s' %sÚdeleteé   z+Removal of device '%s' from profile '%s' %sÚprofileÚdeviceÚremove)r_   rk   r;   rV   r   r:   Ú	exit_code)
rS   rT   r5   rU   r�   Únic_nameÚfail_assume_enoentÚ	succeededÚmsgrm   s
             r#   ri   ri   S  s-  € ð Ô(Ò(±Øà=ÐØ€IÙØ?ˆð
	0Ü�)Ð-¨x¸ÐAÔBÜ�I‰I�c˜8 W¨iÔ8ð 4ˆCÜ�)˜X xÐ0Ô1Ü�I‰I�c˜8 YÔ/áØ;ˆð	BÜ�)˜X x°¸(ÐCÔDÜ�I‰I�c˜8 W¨iÕ8ð	 øô ×)Ñ)ò 	BØ�{‰{˜aÒØ�Ü�I‰I�c˜8 WÐ.@×AÑAûð	Bûô ×)Ñ)ò 	BØ�{‰{˜aÒØ�Ü�I‰I�c˜8 WÐ.@×AÑAûð	Bús/   –'B Á)(C ÂCÂ&)CÃCÃD"Ã/)DÄD"r   r    c                 ób  — g }g }i }d| v r|j                  | d   «       |rd|v r	 t        j                  |«      }|j                  dg «      D ](  }|j                  d«      sŒ|j                  |d   «       Œ* d|v r&t        j                  d«      s|j                  d«       d|v r&t        j                  d«      s|j                  d	«       d
|v r&t        j                  d«      s|j                  d«       |S # t        j                  t        t
        f$ r t        j                  d«       Y Œòw xY w)z&identify required packages for installr)   Ústorage_poolsz|lxd.preseed string value is not YAML.  Unable to determine required storage driver packages to support storage_pools config.ÚdriverÚzfszzfsutils-linuxr2   ÚlvcreateÚlvm2Úbtrfsz
mkfs.btrfszbtrfs-progs)r   ÚyamlÚ	safe_loadÚ	YAMLErrorÚ	TypeErrorr   r;   r^   r7   r   rX   )r   r    rn   Ústorage_driversÚpreseed_cfgr,   s         r#   rZ   rZ   {  s  € à€Hð "$€OØ€KØ˜HÑ$Ø×Ñ˜xÐ(9Ñ:Ô;Ù�¨+Ñ5ð	ÜŸ.™.¨Ó5ˆKð $Ÿ™¨¸Ó<ò ;ˆØ×Ñ˜HÕ%Ø×"Ñ" <°Ñ#9Õ:ð;ð �Ñ¬¯
©
°5Ô(9Ø�‰Ð(Ô)Ø�Ñ¬¯
©
°:Ô(>Ø�‰˜ÔØ�/Ñ!¬$¯*©*°\Ô*BØ�‰˜Ô&Ø€Oøô —‘¤	¬:Ð6ò 	Ü�K‰Kð1öð	ús   ¦C8 Ã83D.Ä-D.)r6   rŠ   )#Ú__doc__Úloggingr`   Útypingr   r   r¬   Ú	cloudinitr   r   Úcloudinit.cloudr   Úcloudinit.configr   Úcloudinit.config.schemar	   Úcloudinit.settingsr
   Ú	getLoggerr   r;   r_   r   Ú__annotations__r$   rC   r   r˜   ru   rc   rh   rk   ri   r   rZ   © r%   r#   ú<module>r½      s×   ðò Eã Û 	ß ã ç  Ý !Ý #Ý .Ý +à€g×Ñ˜Ó!€à Ð ð ØˆzØØ %˜wñ	€€jó ò ,òF1ðhb
�ð b
˜6ð b
¨%ð b
°tð b
Àó b
òJ.òb9"òxGð EKó%BðP Dð °sð ¸tÀC¹yô r%   