Ë
    *Càe¿!  ã                   ó¨   — d dl Z d dlZd dlZd dlZddlmZmZ dZdZdddœZ	dd	d
dœZ
 G d„ de«      Z G d„ de«      Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zy)é    Né   )Úsystemctl_is_activeÚsystemctl_is_installedz/usr/bin/ovs-vsctlzovsdb-server.serviceÚfalse)Úmcast_snooping_enableÚrstp_enable)údel-sslzget-ssl)zdel-fail-modezget-fail-mode)zdel-controllerzget-controller)zset-sslzset-fail-modezset-controllerc                   ó   — e Zd Zy)ÚOvsDbServerNotRunningN©Ú__name__Ú
__module__Ú__qualname__© ó    ú)/usr/share/netplan/netplan_cli/cli/ovs.pyr   r   *   ó   „ Ør   r   c                   ó   — e Zd Zy)ÚOvsDbServerNotInstalledNr   r   r   r   r   r   .   r   r   r   c           	      óÊ   — t         j                  |«      }|€ t        j                  t        d| |||g«       y|r*||k7  r$t        j                  t        d| ||›d|›�g«       yyy)z2Cleanup values from a column (i.e. "column=value")NÚremoveÚsetú=)ÚDEFAULTSÚgetÚ
subprocessÚ
check_callÚOPENVSWITCH_OVS_VSCTL)ÚtypeÚifaceÚcolumnÚvalueÚdefaults        r   Ú_del_colr$   2   sd   € ä�l‰l˜6Ó"€GØ€ä×ÑÔ4°hÀÀeÈVÐUZÐ[Õ\Ù	�W Ò%ä×ÑÔ4°e¸TÀ5ÒU[Ñ]dÐJeÐfÕgð &ˆr   c                 óV   — t        j                  t        d| |||t        |«      g«       y)z:Cleanup values from a dictionary (i.e. "column:key=value")r   N)r   r   r   Ú_escape_colon)r   r    r!   Úkeyr"   s        r   Ú	_del_dictr(   =   s*   € ô ×ÑÔ0°(¸DÀ%ÈÐQTÔVcÐdiÓVjÐkÕlr   c                 ó0   — t        j                  dd| «      S )Nz([^\\]):z\g<1>\:)ÚreÚsub)Úliterals    r   r&   r&   D   s   € Ü�6‰6�+˜z¨7Ó3Ð3r   c                 ój  ‡— t         j                  |d«      \  }}|dk(  rd}|r…t        |g}t        |g}|r"|j                  |«       |j                  |«       t	        j
                  |d¬«      Št        ˆfd„|j                  d«      D «       «      rt	        j                  |«       yyt        d|«      ‚)	z*Cleanup commands from the global namespace)NNr	   NT©Útextc              3   ó&   •K  — | ]  }|‰v –— Œ
 y ­w)Nr   )Ú.0ÚitemÚouts     €r   ú	<genexpr>z_del_global.<locals>.<genexpr>b   s   øè ø€ Ò8˜tˆt�sŒ{Ñ8ùs   ƒú,zReset command unknown for:)
ÚGLOBALSr   r   Úappendr   Úcheck_outputÚallÚsplitr   Ú	Exception)	r   r    r'   r"   Údel_cmdÚget_cmdÚargs_getÚargs_delr3   s	           @r   Ú_del_globalr@   H   s§   ø€ ä—{‘{ 3¨Ó5Ñ€GˆWØ�)ÒØˆáÜ)¨7Ð3ˆÜ)¨7Ð3ˆÙØ�O‰O˜EÔ"Ø�O‰O˜EÔ"ô ×%Ñ% h°TÔ:ˆô Ó8 u§{¡{°3Ó'7Ô8Ô8Ü×!Ñ! (Õ+ð 9ô Ð4°cÓ:Ð:r   c                 ó$  — |j                  dd«      }|d   }|dk(  r t        |«      dkD  rt        | ||d   |«       n5t        |«      dkD  rt        | ||d   |d   |«       nt	        | ||d   |«       t        j                  t        d| |d|g«       y)zDCheck if this setting is in a dict or a colum and delete accordinglyú/é   r   Úglobalr   úexternal-idsN)r:   Úlenr@   r(   r$   r   r   r   )r   r    Úsettingr"   r:   Úcols         r   Úclear_settingrI   h   s�   € à�M‰M˜#˜qÓ!€EØ
�‰(€CØ
ˆh‚œ3˜u›:¨š>Ü�D˜%  q¡¨5Õ1Ü	ˆU‹�aŠÜ�$˜˜u Q™x¨¨q©°5Õ9ä��u˜e A™h¨Ô.ä×ÑÔ0°(¸DÀ%ÈÐY`ÐaÕbr   c                 óp   — t        |t        «      sJ ‚|j                  | d «      }|xr |j                  dk(  S )NÚOpenVSwitch)Ú
isinstanceÚdictr   Úbackend)r    Únp_interface_dictÚnp_defs      r   Úis_ovs_interfacerQ   v   s9   € ÜÐ'¬Ô.Ð.Ð.Ø×"Ñ" 5¨$Ó/€FØÒ5�f—n‘n¨Ñ5Ð5r   c                 ó,  — t        t        «      st        dt        z  «      ‚t        t        «      st	        dj                  t        «      «      ‚| j                  «        t        «       }| j                  j                  «       D ]*  }t        || j                  «      sŒ|j                  |«       Œ, t        j                  j                  t        «      �r§dD ]Ë  }t!        j"                  t        dddddd	d
|d   g	d¬«      }|j%                  «       D ]�  }d|v sŒ|j'                  d«      d   }||v rŒ!|d   dk(  rGt!        j(                  t        d|g«      j*                  dkD  rt!        j,                  t        dd|g«       Œpt!        j,                  t        d|d   |g«       Œ‘ ŒÍ dD ]Ñ  }d}	|dk(  rd}	n|dk(  rd}	t!        j"                  t        d|	z  ddddd	d
|g	d¬«      }|j%                  «       D ]„  }d|v sŒd}|}
|dk7  r|j'                  dd«      \  }}
|
j/                  d«      j'                  d«      D ]<  }|j1                  d«      sŒd |v sŒ|j'                  d d«      \  }}t3        ||||«       Œ> Œ† ŒÓ y"|s|rt5        j6                  d!«       y"y")#aQ  
    Query OpenVSwitch state through 'ovs-vsctl' and filter for netplan=true
    tagged ports/bonds and bridges. Delete interfaces which are not defined
    in the current configuration.
    Also filter for individual settings tagged netplan/<column>[/<key]=value
    in external-ids and clear them if they have been set by netplan.
    z+Cannot apply OVS cleanup: %s is 'not-found'z{} is not running))ÚPortzdel-port)ÚBridgeúdel-br)Ú	InterfacerU   z--columns=name,external-idsz-fÚcsvz-dÚbarez--no-headingsÚlistr   Tr.   znetplan=truer5   rV   z	br-existsz--if-existszdel-bond-ifacer   )rS   rT   rV   ÚOpen_vSwitchÚ
Controllerzname,external-idsrZ   rE   r[   z_uuid,external-idsz--columns=%sznetplan/ú.ú"ú r   zAovs-vsctl is missing, cannot tear down old OpenVSwitch interfacesN)r   ÚOPENVSWITCH_OVSDB_SERVER_UNITr   r   r   ÚformatÚparser   ÚnetdefsÚkeysrQ   ÚaddÚosÚpathÚisfiler   r   r8   Ú
splitlinesr:   ÚrunÚ
returncoder   ÚstripÚ
startswithrI   ÚloggingÚwarning)Úconfig_managerÚovs_oldÚovs_currentÚ
ovs_ifacesÚiÚtr3   Úliner    ÚcolsÚextidsÚentryrG   Úvals                 r   Úapply_ovs_cleanuprz   |   s¼  € ô "Ô"?Ô@Ü%Ð&SÜ&Cñ'Dó Eð 	EäÔ<Ô=Ü#Ð$7×$>Ñ$>Ô?\Ó$]Ó^Ð^à×ÑÔÜ“€JØ×#Ñ#×(Ñ(Ó*ò ˆÜ˜Q × 6Ñ 6Õ7Ø�N‰N˜1Õðô 
‡w�w‡~�~Ô+Õ,àVò 	cˆAÜ×)Ñ)Ô+@ÐB_Ø+/°¸¸fÀoÐW]Ð_`ÐabÑ_cð+eà/3ô5ˆCð Ÿ™Ó(ò 	c�Ø! TÒ)Ø ŸJ™J s›O¨AÑ.�Eà 
Ñ*Ø Ø˜‘t˜{Ò*¬z¯~©~Ô?TÐVaÐchÐ>iÓ/j×/uÑ/uÐxyÒ/yÜ"×-Ñ-Ô/DÀmÐUeÐglÐ.mÕnä"×-Ñ-Ô/DÀmÐUVÐWXÑUYÐ[`Ð.aÕbñ	cð		cð  Oò 	BˆAØ&ˆDØ�NÒ"Ø%‘Ø�lÒ"Ø+�Ü×)Ñ)Ô+@À.ÐSWÑBWØ+/°¸¸fÀoÐW]Ð_`ð+bà/3ô5ˆCð Ÿ™Ó(ò B�Ø Ò%Ø�EØ!�FØ˜NÒ*Ø(,¯
©
°3¸Ó(:™˜˜vð "(§¡¨cÓ!2×!8Ñ!8¸Ó!=ò B˜Ø ×+Ñ+¨JÕ7¸CÀ5ºLØ+0¯;©;°s¸AÓ+>™L˜G SÜ)¨!¨U°G¸SÕAñBñBñ	Bñ0 
‘KÜ�‰Ð[Õ\ð  r   )rm   re   r   r*   Úutilsr   r   r   r_   r   r6   r;   r   r   r$   r(   r&   r@   rI   rQ   rz   r   r   r   ú<module>r|      s„   ðó$ Û 	Û Û 	ç >à,Ð Ø 6Ð ð
 %Øñ€ð &Ø7Ø:ñ	€ô	˜Iô 	ô	˜iô 	òhòmò4ò;ò@cò6óB]r   