+
    =l jh3  ã                   óz  € ^ RI t ^ RIt^ RIt^ RIt^ RIt^ RIHt ^ RIHtH	t	H
t
 ^ RIHtHtHtHtHt ^ RIHtHtHtHtHtHt ^ RIHt ^ RIHt RtR	tR
tRt]P@                  ! 4       t!]PD                  ! ]PF                  ! ]$4      4      t%]PL                   ! R R]PN                  4      4       t( ! R R]4      t) ! R R]4      t* ! R R]4      t+ ! R R]4      t,R R lt-R R lt. ! R R]P^                  4      t0R R lt1R R lt2R  R! lt3]! RR"7      R# R$ l4       t4R-R% R& llt5R.R' R( llt6R) R* lt7R+ R, lt8R# )/é    N)Ú	lru_cache)ÚListÚOptionalÚTuple)Úevent_loggerÚ
exceptionsÚmessagesÚsystemÚutil)ÚBoolDataValueÚ
DataObjectÚFieldÚIncorrectTypeErrorÚStringDataValueÚ	data_list)Ústate_files)Úserviceclientz
http-proxyzhttps-proxyz/snap/bin/canonical-livepatchz/v1/api/kernels/supportedc                   ó\   € ] tR t^ t]! 4       t]! 4       t]! 4       t]! 4       t]! 4       t	Rt
R# )ÚLivepatchSupport© N)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__ÚobjectÚ	SUPPORTEDÚKERNEL_UPGRADE_REQUIREDÚ
KERNEL_EOLÚUNSUPPORTEDÚUNKNOWNÚ__static_attributes__r   ó    Ú4/usr/lib/python3/dist-packages/uaclient/livepatch.pyr   r       s&   † á“€IÙ$›hÐÙ“€JÙ“(€KÙ‹h„Gr"   r   c                   ób   a € ] tR t^)t o ]! R]RRR7      ]! R]RRR7      .tV 3R lR ltR	t	V t
R
# )ÚLivepatchPatchFixStatusÚnameFÚName©ÚrequiredÚdict_keyÚpatchedÚPatchedc                óF   <€ V ^8„  d   QhRS[ S[,          RS[ S[,          /# )é   r&   r+   )r   ÚstrÚbool)ÚformatÚ__classdict__s   "€r#   Ú__annotate__Ú$LivepatchPatchFixStatus.__annotate__/   s'   ø€ ÷ ñ á‘s�mðñ ™$•ñr"   c                ó   € Wn         W n        R # ©N©r&   r+   )Úselfr&   r+   s   &&&r#   Ú__init__Ú LivepatchPatchFixStatus.__init__/   s   € ð
 Œ	ØŽr"   r7   N)r   r   r   r   r   r   r   Úfieldsr9   r!   Ú__classdictcell__©r2   s   @r#   r%   r%   )   s2   ø‡ € áˆf�o°ÀÔGÙˆi˜°ÀÔKð€F÷
ö r"   r%   c            	       ó„   a € ] tR t^8t o ]! R]RRR7      ]! R]! ]4      RRR7      ]! R]RRR7      .tV 3R	 lR
 lt	Rt
V tR# )ÚLivepatchPatchStatusÚstateFÚStater(   ÚfixesÚFixesÚversionÚVersionc                ól   <€ V ^8„  d   QhRS[ S[,          RS[ S[S[,          ,          RS[ S[,          /# )r.   r@   rB   rD   )r   r/   r   r%   )r1   r2   s   "€r#   r3   Ú!LivepatchPatchStatus.__annotate__D   s<   ø€ ÷ ñ á™�}ðñ ™Ñ4Õ5Õ6ðñ ™#•ñ	r"   c                ó*   € Wn         W n        W0n        R # r6   )r@   rB   rD   )r8   r@   rB   rD   s   &&&&r#   r9   ÚLivepatchPatchStatus.__init__D   s   € ð Œ
ØŒ
ØŽr"   )rB   r@   rD   N)r   r   r   r   r   r   r   r%   r;   r9   r!   r<   r=   s   @r#   r?   r?   8   sN   ø‡ € áˆg�°ÀÔIÙØÙÐ-Ó.ØØô		
ñ 	ˆi˜°5À9ÔMð	€F÷ö r"   r?   c            	       óx   a € ] tR t^Ot o ]! R]RRR7      ]! R]RRR7      ]! R]RRR7      .tV 3R	 lR
 ltRt	V t
R# )ÚLivepatchStatusStatusÚkernelFÚKernelr(   Ú	livepatchÚ	LivepatchÚ	supportedÚ	Supportedc                ó\   <€ V ^8„  d   QhRS[ S[,          RS[ S[,          RS[ S[,          /# )r.   rL   rN   rP   )r   r/   r?   )r1   r2   s   "€r#   r3   Ú"LivepatchStatusStatus.__annotate__`   s7   ø€ ÷ #ñ #á™•ð#ñ Ñ0Õ1ð#ñ ™C•=ñ	#r"   c                ó*   € Wn         W n        W0n        R # r6   ©rL   rN   rP   )r8   rL   rN   rP   s   &&&&r#   r9   ÚLivepatchStatusStatus.__init__`   s   € ð ŒØ"ŒØ"Žr"   rU   N)r   r   r   r   r   r   r?   r;   r9   r!   r<   r=   s   @r#   rK   rK   O   sN   ø‡ € áˆh˜°%À(ÔKÙØØ ØØ ô		
ñ 	ØØØØ ô		
ð€F÷ #ö #r"   rK   c                   óX   a € ] tR t^kt o ]! R]! ]4      RRR7      .tV 3R lR ltRt	V t
R# )	ÚLivepatchStatusÚstatusFÚStatusr(   c                ó@   <€ V ^8„  d   QhRS[ S[S[,          ,          /# )r.   rY   )r   r   rK   )r1   r2   s   "€r#   r3   ÚLivepatchStatus.__annotate__u   s    ø€ ÷ ñ á™Ñ3Õ4Õ5ñr"   c                ó   € Wn         R # r6   ©rY   )r8   rY   s   &&r#   r9   ÚLivepatchStatus.__init__u   s	   € ð Žr"   r^   N)r   r   r   r   r   r   rK   r;   r9   r!   r<   r=   s   @r#   rX   rX   k   s0   ø‡ € áØÙÐ+Ó,ØØô		
ð€F÷ö r"   rX   c                ó:   € V ^8„  d   QhR\         \        ,          /# ©r.   Úreturn)r   rK   )r1   s   "r#   r3   r3   |   s   € ÷ -!ñ -!”Ô.Õ/ñ -!r"   c                  ó0  € \        4       '       g   \        P                  R 4       R#  \        P                  ! \
        RRRR.4      w  r \        P                  ! T 4      p \        P                  T4      pTP                   e   \#        TP                   4      ^8  d   \        P                  R4       R# TP                   ^ ,          #   \        P                   dU   pRTP                  9   d&   \        P                  TP                  4        Rp?R# \        P                  RTR7       ThRp?ii ; i  \        P                   d$   p\        P                  R	T TR7        Rp?R# Rp?ii ; i  \         d    \        P                  R
T 4        R# i ; i)z$canonical-livepatch is not installedNrY   z	--verbosez--formatÚjsonzMachine is not enabledz;canonical-livepatch returned error when checking status:
%s)Úexc_infozPJSONDecodeError while parsing livepatch status, returning None. output was: "%s"z<canonical-livepatch status returned unexpected structure: %sz!canonical-livepatch has no status)Úis_livepatch_installedÚLOGÚdebugr
   ÚsubpÚLIVEPATCH_CMDr   ÚProcessExecutionErrorÚstderrÚwarningrd   ÚloadsÚJSONDecodeErrorrX   Ú	from_dictr   rY   Úlen)ÚoutÚ_ÚeÚstatus_jsonÚstatus_roots        r#   rY   rY   |   s]  € Ü!×#Ò#Ü�	‰	Ð8Ô9ÙðÜ—’Ü˜H k°:¸vÐFó
‰ˆð	Ü—j’j “oˆðÜ%×/Ñ/°Ó<ˆð ×ÑÒ!¤S¨×);Ñ);Ó%<¸qÔ%@Ü�	‰	Ð5Ô6Ùà×Ñ˜aÕ Ð øôI ×+Ñ+ô 
ð $ q§x¡xÔ/Ü�K‰K˜Ÿ™Ô!ÝÜ�‰ØJØð 	ô 	
ð ˆûð
ûô ×Ñô Ü�‰ðàØð	 	ô 	
õ ûðûô ô Ü�‰ØJØô	
ò ðúsG   ©!C	 ÁD5 Á"E0 Ã	D2Ã0D-ÄD-Ä-D2Ä5E-Å
E(Å(E-Å0!FÆFc                ó\   € V ^8„  d   QhR\         \        ,          R\         \        ,          /# )r.   Ú
status_strrb   )r   r/   r   )r1   s   "r#   r3   r3   ¬   s&   € ÷ ñ Üœ•ðäÔÕñr"   c                 óì   € V R 8X  d   \         P                  # V R8X  d   \         P                  # V R8X  d   \         P                  # V R8X  d   \         P                  # V R8X  d   \         P
                  # R# )rP   zkernel-upgrade-requiredzkernel-end-of-lifeÚunsupportedÚunknownN)r   r   r   r   r   r    )rx   s   &r#   Ú(_convert_str_to_livepatch_support_statusr|   ¬   sm   € ð �[Ô Ü×)Ñ)Ð)ØÐ.Ô.Ü×7Ñ7Ð7ØÐ)Ô)Ü×*Ñ*Ð*Ø�]Ô"Ü×+Ñ+Ð+Ø�YÔÜ×'Ñ'Ð'Ùr"   c                   ó6   a € ] tR t^¼t o RtV 3R lR ltRtV tR# )ÚUALivepatchClientÚlivepatch_urlc                ór   <€ V ^8„  d   QhRS[ RS[ RS[ RS[ RS[S[P                  ,          RS[S[,          /# ©r.   rD   ÚflavorÚarchÚcodenameÚ
build_daterb   ©r/   r   Údatetimer   )r1   r2   s   "€r#   r3   ÚUALivepatchClient.__annotate__¿   s`   ø€ ÷ )Kñ )Káð)Kñ ð)Kñ ð	)Kñ
 ð)Kñ ™X×.Ñ.Õ/ð)Kñ 
Ñ"Õ	#ñ)Kr"   c                óx  € R TRTRTRTRVe   VP                  4       MR/pV P                  4       p V P                  \        VVR7      pTP                  ^È8w  d7   \
        P                  R	4       \
        P                  TP                  4       R# TP                  P                  R
4      p
T
e   \        T
\        4      '       d)   T
'       d   \        P                  # \        P                  # \!        T
4      #   \         d6   p	\
        P                  R4       \
        P                  T	4        Rp	?	R# Rp	?	ii ; i)zkernel-versionÚflavourÚarchitecturer„   z
build-dateNr{   )Úquery_paramsÚheadersz4error while checking livepatch supported kernels APIz0livepatch supported kernels API was unsuccessfulrQ   )Ú	isoformatr�   Úrequest_urlÚ"LIVEPATCH_API_V1_KERNELS_SUPPORTEDÚ	Exceptionrg   rm   ÚcodeÚbodyÚ	json_dictÚgetÚ
isinstancer0   r   r   r   r|   )r8   rD   r‚   rƒ   r„   r…   rŒ   r�   Úresponsert   Úapi_supported_vals   &&&&&&     r#   Úis_kernel_supportedÚ%UALivepatchClient.is_kernel_supported¿   s  € ð ˜gØ�vØ˜DØ˜ØØ*4Ò*@�
×$Ñ$Ô&Àið
ˆð —,‘,“.ˆð		Ø×'Ñ'Ü2Ø)Øð (ó ˆHð �=‰=˜CÔÜ�K‰KÐJÔKÜ�K‰K˜Ÿ™Ô&Ùà$×.Ñ.×2Ñ2°;Ó?ÐØÒ$¬
Ð3DÄd×(KÒ(Kç Ü'×1Ñ1Ð1Ü#×/Ñ/Ð/ä7Ð8IÓJÐJøô# ô 	Ü�K‰KÐNÔOÜ�K‰K˜ŒNÝûð	ús   ²C9 Ã9D9Ä*D4Ä4D9r   N)r   r   r   r   Úcfg_url_base_attrr™   r!   r<   r=   s   @r#   r~   r~   ¼   s   ø‡ € Ø'Ð÷)Kö )Kr"   r~   c                ó:   € V ^8„  d   QhR\         \        ,          /# ra   )r   r   )r1   s   "r#   r3   r3   ë   s   € ÷ Iñ I¤(Ô+;Õ"<ñ Ir"   c                  ó†   €  \        4       p T f   R # \        T P                  4      #   \        P                   d     R # i ; ir6   )rY   r   rk   r|   rP   )Ú	lp_statuss    r#   Ú_on_supported_kernel_clirŸ   ë   sD   € ðÜ“Hˆ	ð ÒÙÜ3°I×4GÑ4GÓHÐHøô ×+Ñ+ô Úðús   ‚
' §A ¿A c                óŒ   € V ^8„  d   QhR\         R\         R\         R\         R\        \        \        \        ,          3,          /# )r.   rD   r‚   rƒ   r„   rb   )r/   r   r0   r   )r1   s   "r#   r3   r3   ö   sB   € ÷ ñ ÜðÜðÜ%(ðÜ47ðä
Œ4”œ$•ÐÕ ñr"   c                ó(  €  \         P                  P                  4       pVeÜ   \        P                  P                  \        P                  P                  4      \        P                  ! ^R7      ,
          p\        VP                  V8„  VP                  V 8H  VP                  V8H  VP                  V8H  VP                  V8H  .4      '       d2   VP                  f   \         P#                  R4       RVP                  3# R#   \         d    Rp Lði ; i)zGCheck local cache of kernel support

:return: (is_cache_valid, result)
N)Údaysz-livepatch kernel support cache has None valueT)FN)r   Úlivepatch_support_cacheÚreadr‘   r‡   ÚnowÚtimezoneÚutcÚ	timedeltaÚallÚ	cached_atrD   r‚   rƒ   r„   rP   rg   rm   )rD   r‚   rƒ   r„   Ú
cache_dataÚone_week_agos   &&&&  r#   Ú_on_supported_kernel_cacher­   ö   sû   € ðÜ ×8Ñ8×=Ñ=Ó?ˆ
ð ÒÜ×(Ñ(×,Ñ,Ü×Ñ×!Ñ!ó
ä×Ò AÔ&õ'ˆô à×$Ñ$ |Ñ3Ø×"Ñ" gÑ-Ø×!Ñ! VÑ+Ø—‘ 4Ñ'Ø×#Ñ# xÑ/ð÷
ò 
ð ×#Ñ#Ò+Ü—‘ÐKÔLØ˜*×.Ñ.Ð/Ð/ØÐøô' ô ØŠ
ðús   ‚D ÄDÄDc                ó    € V ^8„  d   QhR\         R\         R\         R\         R\        \        P                  ,          R\        \        ,          /# r�   r†   )r1   s   "r#   r3   r3     sU   € ÷ "ñ "Üð"äð"ô ð"ô ð	"ô
 œ×*Ñ*Õ+ð"ô ÔÕñ"r"   c                 ó²  € \        4       P                  V VVVVR 7      pRpV\        P                  8X  d   RpMV\        P                  8X  d   Rp\
        P                  P                  \
        P                  ! V VVVV\        P                  P                  \        P                  P                  4      R7      4       Vf   \        P                  R4       V# ))rD   r‚   rƒ   r„   r…   NTF)rD   r‚   rƒ   r„   rP   rª   z3livepatch kernel support API response was ambiguous)r~   r™   r   r   r   r   r£   ÚwriteÚLivepatchSupportCacheDatar‡   r¥   r¦   r§   rg   rm   )rD   r‚   rƒ   r„   r…   rP   Úcache_supporteds   &&&&&  r#   Ú_on_supported_kernel_apir³     sÆ   € ô "Ó#×7Ñ7ØØØØØð 8ó €Ið €OØÔ$×.Ñ.Ô.Ø‰Ø	Ô&×2Ñ2Ô	2ØˆÜ×'Ñ'×-Ñ-Ü×-Ò-ØØØØØ%Ü×'Ñ'×+Ñ+¬H×,=Ñ,=×,AÑ,AÓBô	
ô	ð ÒÜ�‰ÐIÔJØÐr"   )Úmaxsizec                ó$   € V ^8„  d   QhR\         /# ra   )r   )r1   s   "r#   r3   r3   ;  s   € ÷ 8ñ 8Ô-ñ 8r"   c                 ón  € \        4       p V e   \        P                  R4       V # \        P                  ! 4       pVP
                  e   VP                  e   VP                  f&   \        P                  R4       \        P                  # \        P                  ! VP                  4      p\        P                  ! 4       P                  pRP!                  VP                  VP                  R7      p\#        WAP
                  W#4      w  rVV'       dZ   \        P                  R4       Vf   \        P                  # V'       d   \        P$                  # V'       g   \        P&                  # \        P                  R4       \)        VVP
                  VVVP*                  4      pVf   \        P                  # V# )zˆ
Checks CLI, local cache, and API in that order for kernel support
If all checks fail to return an authoritative answer, we return None
zusing livepatch cli for supportzHunable to determine enough kernel information to check livepatch supportz{major}.{minor})ÚmajorÚminorzusing livepatch support cachezusing livepatch support api)rŸ   rg   rh   r
   Úget_kernel_infor‚   r·   r¸   rm   r   r    r   Ústandardize_arch_nameÚuname_machine_archÚget_release_infoÚseriesr1   r­   r   r   r³   r…   )Úcli_saysÚkernel_inforƒ   r„   Úlp_api_kernel_verÚis_cache_validÚ
cache_saysÚapi_sayss           r#   Úon_supported_kernelrÄ   :  sq  € ô (Ó)€HØÒÜ�	‰	Ð3Ô4Øˆô ×(Ò(Ó*€Kà×ÑÒ"Ø×ÑÒ$Ø×ÑÒ$ä�‰ð&ô	
ô  ×'Ñ'Ð'ä×%Ò% k×&DÑ&DÓE€DÜ×&Ò&Ó(×/Ñ/€Hà)×0Ñ0Ø×Ñ {×'8Ñ'8ð 1ó Ðô
 "<Ø×-Ñ-¨tó"Ñ€N÷ Ü�	‰	Ð1Ô2ØÒÜ#×+Ñ+Ð+ßÜ#×-Ñ-Ð-ßÜ#×/Ñ/Ð/ô ‡I�IÐ+Ô,Ü'ØØ×ÑØØØ×Ñó€Hð ÒÜ×'Ñ'Ð'Ø€Or"   c                ó`   € V ^8„  d   QhR\         R\        \        \        ,          ,          RR/# )r.   Úprotocol_typeÚretry_sleepsrb   N)r/   r   r   Úfloat)r1   s   "r#   r3   r3   v  s-   € ÷ ñ ÜðÜ&.¬t´E­{Õ&;ðà	ñr"   c                ó†   € \        4       '       g   R# \        P                  ! \        RRP	                  V 4      .VR7       R# )ai  
Unset livepatch configuration settings for http and https proxies.

:param protocol_type: String either http or https
:param retry_sleeps: Optional list of sleep lengths to apply between
    retries. Specifying a list of [0.5, 1] tells subp to retry twice
    on failure; sleeping half a second before the first retry and 1 second
    before the second retry.
NÚconfigz	{}-proxy=©rÇ   )rf   r
   ri   rj   r1   )rÆ   rÇ   s   &&r#   Úunconfigure_livepatch_proxyrÌ   v  s4   € ô "×#Ò#ÙÜ
‡K‚KÜ	˜ +×"4Ñ"4°]Ó"CÐDØ!÷r"   c                ó˜   € V ^8„  d   QhR\         \        ,          R\         \        ,          R\         \        \        ,          ,          RR/# )r.   Ú
http_proxyÚhttps_proxyrÇ   rb   N)r   r/   r   rÈ   )r1   s   "r#   r3   r3   Š  sA   € ÷ "
ñ "
Üœ•ð"
äœ#•ð"
ô œ4¤�;Õ'ð"
ð 
ñ	"
r"   c                óˆ  € ^ RI Hp V '       g	   V'       d>   \        P                  \        P
                  P                  VP                  R7      4       V '       d/   \        P                  ! \        RRP                  V 4      .VR7       V'       d1   \        P                  ! \        RRP                  V4      .VR7       R# R# )a~  
Configure livepatch to use http and https proxies.

:param http_proxy: http proxy to be used by livepatch. If None, it will
                   not be configured
:param https_proxy: https proxy to be used by livepatch. If None, it will
                    not be configured
:@param retry_sleeps: Optional list of sleep lengths to apply between
                           snap calls
)ÚLivepatchEntitlement)ÚservicerÊ   zhttp-proxy={}rË   zhttps-proxy={}N)Úuaclient.entitlementsrÑ   ÚeventÚinfor	   ÚSETTING_SERVICE_PROXYr1   Útitler
   ri   rj   )rÎ   rÏ   rÇ   rÑ   s   &&& r#   Úconfigure_livepatch_proxyrØ   Š  s’   € õ ;ç—[Ü�
‰
Ü×*Ñ*×1Ñ1Ø,×2Ñ2ð 2ó ô	
÷ Ü�ŠÜ˜H o×&<Ñ&<¸ZÓ&HÐIØ%õ	
÷
 Ü�ŠÜ˜HÐ&6×&=Ñ&=¸kÓ&JÐKØ%÷	
ñ r"   c                óF   € V ^8„  d   QhR\         R\        \         ,          /# )r.   Úkeyrb   )r/   r   )r1   s   "r#   r3   r3   ¯  s   € ÷ ,ñ ,¤ð ,¬´#­ñ ,r"   c                óR  € \         P                  ! \        R.4      w  r\        P                  ! RP                  V 4      V\        P                  4      pV'       d   VP                  ^4      MRpV'       d   \        P                  ! RRV4      pV'       d   VP                  4       # R# )z¢
Gets the config value from livepatch.
:param key: can be any valid livepatch config option
:return: the value of the livepatch config option, or None if not set
rÊ   z
^{}: (.*)$Nz\"(.*)\"z\g<1>)
r
   ri   rj   ÚreÚsearchr1   Ú	MULTILINEÚgroupÚsubÚstrip)rÚ   rr   rs   ÚmatchÚvalues   &    r#   Úget_config_option_valuerä   ¯  ss   € ô �[Š[œ-¨Ð2Ó3�F€CÜ�IŠI�l×)Ñ)¨#Ó.°´R·\±\ÓB€Eß#ˆE�K‰K˜ŒN¨€Eßä—’�{ H¨eÓ4ˆß!ˆ5�;‰;‹=Ð+ tÐ+r"   c                ó$   € V ^8„  d   QhR\         /# ra   )r0   )r1   s   "r#   r3   r3   ¾  s   € ÷ 3ñ 3¤ñ 3r"   c                  ó:   € \         P                  ! \        4      R J# r6   )r
   Úwhichrj   r   r"   r#   rf   rf   ¾  s   € Ü�<Š<œÓ&¨dÐ2Ð2r"   r6   )NNN)9r‡   Úenumrd   ÚloggingrÜ   Ú	functoolsr   Útypingr   r   r   Úuaclientr   r   r	   r
   r   Úuaclient.data_typesr   r   r   r   r   r   Úuaclient.filesr   Úuaclient.httpr   ÚHTTP_PROXY_OPTIONÚHTTPS_PROXY_OPTIONrj   r�   Úget_event_loggerrÔ   Ú	getLoggerÚreplace_top_level_logger_namer   rg   ÚuniqueÚEnumr   r%   r?   rK   rX   rY   r|   ÚUAServiceClientr~   rŸ   r­   r³   rÄ   rÌ   rØ   rä   rf   r   r"   r#   Ú<module>rø      s(  ðÛ Û Û Û Û 	Ý ß (Ñ (ç EÕ E÷÷ õ 'Ý 'à Ð Ø"Ð à/€à%@Ð "à×%Ò%Ó'€Ø×Ò˜×:Ò:¸8ÓDÓE€ð ‡�ô�t—y‘yó ó ðô˜jô ô˜:ô ô.#˜Jô #ô8�jô õ"-!õ`ô ,K˜×5Ñ5ô ,Kõ^Iõõ>"ñJ �4Ôô8ó ð8÷v÷("
õJ,÷3r"   