Ë
    GKÕih3  ã                   ó.  — 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	m
Z
 d dlmZmZmZmZmZ d dlmZmZmZmZmZmZ d dlmZ d dlmZ dZd	Zd
ZdZ ej@                  «       Z! ejD                   ejF                  e$«      «      Z%ejL                   G d„ dejN                  «      «       Z( G d„ de«      Z) G d„ de«      Z* G d„ de«      Z+ G d„ de«      Z,de	e+   fd„Z-de	e.   de	e(   fd„Z/ G d„ dej`                  «      Z1de	e(   fd„Z2de.de.de.d e.de
e3e	e3   f   f
d!„Z4de.de.de.d e.d"e	e j                      de	e(   fd#„Z5 ed¬$«      de(fd%„«       Z6	 d/d&e.d'e	ee7      ddfd(„Z8	 	 	 d0d)e	e.   d*e	e.   d'e	ee7      ddfd+„Z9d,e.de	e.   fd-„Z:de3fd.„Z;y)1é    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                   óR   — e Zd Z e«       Z e«       Z e«       Z e«       Z e«       Zy)ÚLivepatchSupportN)	Ú__name__Ú
__module__Ú__qualname__ÚobjectÚ	SUPPORTEDÚKERNEL_UPGRADE_REQUIREDÚ
KERNEL_EOLÚUNSUPPORTEDÚUNKNOWN© ó    ú4/usr/lib/python3/dist-packages/uaclient/livepatch.pyr   r       s&   „ á“€IÙ$›hÐÙ“€JÙ“(€KÙ‹h�Gr    r   c                   óX   — e Zd Z ededd¬«       ededd¬«      gZdee   dee	   fd„Z
y)	ÚLivepatchPatchFixStatusÚnameFÚName©ÚrequiredÚdict_keyÚpatchedÚPatchedc                 ó    — || _         || _        y ©N)r$   r)   )Úselfr$   r)   s      r!   Ú__init__z LivepatchPatchFixStatus.__init__/   s   € ð
 ˆŒ	Øˆ�r    N)r   r   r   r   r   r   Úfieldsr   ÚstrÚboolr.   r   r    r!   r#   r#   )   sD   „ áˆf�o°ÀÔGÙˆi˜°ÀÔKð€Fð
à�s‰mðð ˜$‘ôr    r#   c                   óŠ   — e Zd Z ededd¬«       ed ee«      dd¬«       ededd¬«      gZdee	   dee
e      dee	   fd	„Zy
)ÚLivepatchPatchStatusÚstateFÚStater&   ÚfixesÚFixesÚversionÚVersionc                 ó.   — || _         || _        || _        y r,   )r4   r6   r8   )r-   r4   r6   r8   s       r!   r.   zLivepatchPatchStatus.__init__D   s   € ð ˆŒ
ØˆŒ
Øˆ�r    N)r   r   r   r   r   r   r#   r/   r   r0   r   r.   r   r    r!   r3   r3   8   su   „ áˆg�°ÀÔIÙØÙÐ-Ó.ØØô		
ñ 	ˆi˜°5À9ÔMð	€Fðà˜‰}ðð ˜Ð4Ñ5Ñ6ðð ˜#‘ô	r    r3   c                   óx   — e Zd Z ededd¬«       ededd¬«       ededd¬«      gZdee   dee   dee   fd	„Z	y
)ÚLivepatchStatusStatusÚkernelFÚKernelr&   Ú	livepatchÚ	LivepatchÚ	supportedÚ	Supportedc                 ó.   — || _         || _        || _        y r,   )r=   r?   rA   )r-   r=   r?   rA   s       r!   r.   zLivepatchStatusStatus.__init__`   s   € ð ˆŒØ"ˆŒØ"ˆ�r    N)
r   r   r   r   r   r3   r/   r   r0   r.   r   r    r!   r<   r<   O   sp   „ áˆh˜°%À(ÔKÙØØ ØØ ô		
ñ 	ØØØØ ô		
ð€Fð #à˜‘ð#ð Ð0Ñ1ð#ð ˜C‘=ô	#r    r<   c                   óJ   — e Zd Z ed ee«      dd¬«      gZdeee      fd„Z	y)ÚLivepatchStatusÚstatusFÚStatusr&   c                 ó   — || _         y r,   )rF   )r-   rF   s     r!   r.   zLivepatchStatus.__init__u   s   € ð ˆ�r    N)
r   r   r   r   r   r<   r/   r   r   r.   r   r    r!   rE   rE   k   s;   „ áØÙÐ+Ó,ØØô		
ð€Fðà˜Ð3Ñ4Ñ5ôr    rE   Úreturnc                  óö  — t        «       st        j                  d«       y 	 t        j                  t
        ddddg«      \  } }	 t        j                  | «      }	 t        j                  |«      }|j                   �t#        |j                   «      dk  rt        j                  d«       y |j                   d   S # t        j                  $ rP}d|j                  v r$t        j                  |j                  «       Y d }~y t        j                  d|¬«       |‚d }~ww xY w# t        j                  $ r"}t        j                  d	| |¬«       Y d }~y d }~ww xY w# t        $ r t        j                  d
| «       Y y w xY w)Nz$canonical-livepatch is not installedrF   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: %sé   z!canonical-livepatch has no statusr   )Úis_livepatch_installedÚLOGÚdebugr
   ÚsubpÚLIVEPATCH_CMDr   ÚProcessExecutionErrorÚstderrÚwarningrK   ÚloadsÚJSONDecodeErrorrE   Ú	from_dictr   rF   Úlen)ÚoutÚ_ÚeÚstatus_jsonÚstatus_roots        r!   rF   rF   |   s\  € Ü!Ô#Ü�	‰	Ð8Ô9ØðÜ—‘Ü˜H k°:¸vÐFó
‰ˆˆQð	Ü—j‘j “oˆðÜ%×/Ñ/°Ó<ˆð ×ÑÐ!¤S¨×);Ñ);Ó%<¸qÒ%@Ü�	‰	Ð5Ô6Øà×Ñ˜aÑ Ð øôI ×+Ñ+ò 
ð $ q§x¡xÑ/Ü�K‰K˜Ÿ™Ô!ÜÜ�‰ØJØð 	ô 	
ð ˆûð
ûô ×Ñò Ü�‰ðàØð	 	ô 	
ô ûðûô ò Ü�‰ØJØô	
ñ ðúsG   ¢!B8 ÁD ÁE Â8DÃ-DÃ=DÄDÄEÄ1EÅEÅE8Å7E8Ú
status_strc                 óÖ   — | dk(  rt         j                  S | dk(  rt         j                  S | dk(  rt         j                  S | dk(  rt         j                  S | dk(  rt         j
                  S y )NrA   zkernel-upgrade-requiredzkernel-end-of-lifeÚunsupportedÚunknown)r   r   r   r   r   r   )r_   s    r!   Ú(_convert_str_to_livepatch_support_statusrc   ¬   sm   € ð �[Ò Ü×)Ñ)Ð)ØÐ.Ò.Ü×7Ñ7Ð7ØÐ)Ò)Ü×*Ñ*Ð*Ø�]Ò"Ü×+Ñ+Ð+Ø�YÒÜ×'Ñ'Ð'Ør    c                   óP   — e Zd ZdZdededededeej                     dee   fd„Zy	)
ÚUALivepatchClientÚlivepatch_urlr8   ÚflavorÚarchÚcodenameÚ
build_daterI   c                 óD  — |||||�|j                  «       nddœ}| j                  «       }	 | j                  t        ||¬«      }|j                  dk7  r5t
        j                  d«       t
        j                  |j                  «       y |j                  j                  d«      }
|
�t        |
t        «      r"|
rt        j                  S t        j                  S t!        |
«      S # t        $ r4}	t
        j                  d«       t
        j                  |	«       Y d }	~	y d }	~	ww xY w)Nrb   )zkernel-versionÚflavourÚarchitectureri   z
build-date)Úquery_paramsÚheadersz4error while checking livepatch supported kernels APIéÈ   z0livepatch supported kernels API was unsuccessfulrB   )Ú	isoformatro   Úrequest_urlÚ"LIVEPATCH_API_V1_KERNELS_SUPPORTEDÚ	ExceptionrO   rU   ÚcodeÚbodyÚ	json_dictÚgetÚ
isinstancer1   r   r   r   rc   )r-   r8   rg   rh   ri   rj   rn   ro   Úresponser\   Úapi_supported_vals              r!   Úis_kernel_supportedz%UALivepatchClient.is_kernel_supported¿   s  € ð &ØØ Ø à*4Ð*@�
×$Ñ$Ô&Àiñ
ˆð —,‘,“.ˆð		Ø×'Ñ'Ü2Ø)Øð (ó ˆHð �=‰=˜CÒÜ�K‰KÐJÔKÜ�K‰K˜Ÿ™Ô&Øà$×.Ñ.×2Ñ2°;Ó?ÐØÐ$¬
Ð3DÄdÔ(Ká Ü'×1Ñ1Ð1Ü#×/Ñ/Ð/ä7Ð8IÓJÐJøô# ò 	Ü�K‰KÐNÔOÜ�K‰K˜ŒNÜûð	ús   ¬C" Ã"	DÃ+*DÄDN)	r   r   r   Úcfg_url_base_attrr0   r   Údatetimer   r|   r   r    r!   re   re   ¼   s_   „ Ø'Ðð)Kàð)Kð ð)Kð ð	)Kð
 ð)Kð ˜X×.Ñ.Ñ/ð)Kð 
Ð"Ñ	#ô)Kr    re   c                  óz   — 	 t        «       } | €y t        | j                  «      S # t        j                  $ r Y y w xY wr,   )rF   r   rS   rc   rA   )Ú	lp_statuss    r!   Ú_on_supported_kernel_clir�   ë   sD   € ðÜ“Hˆ	ð ÐØÜ3°I×4GÑ4GÓHÐHøô ×+Ñ+ò Ùðús   ‚
$ ¤:¹:r8   rg   rh   ri   c                 ó  — 	 t         j                  j                  «       }|�Ît        j                  j                  t        j                  j                  «      t	        j                  d¬«      z
  }t        |j                  |kD  |j                  | k(  |j                  |k(  |j                  |k(  |j                  |k(  g«      r/|j                  €t         j#                  d«       d|j                  fS y# t        $ r d}Y ŒÞw xY w)zOCheck local cache of kernel support

    :return: (is_cache_valid, result)
    Né   )Údaysz-livepatch kernel support cache has None valueT)FN)r   Úlivepatch_support_cacheÚreadrt   r~   ÚnowÚtimezoneÚutcÚ	timedeltaÚallÚ	cached_atr8   rg   rh   ri   rA   rO   rU   )r8   rg   rh   ri   Ú
cache_dataÚone_week_agos         r!   Ú_on_supported_kernel_cacher�   ö   só   € ðÜ ×8Ñ8×=Ñ=Ó?ˆ
ð ÐÜ×(Ñ(×,Ñ,Ü×Ñ×!Ñ!ó
ä×Ñ AÔ&ñ'ˆô à×$Ñ$ |Ñ3Ø×"Ñ" gÑ-Ø×!Ñ! VÑ+Ø—‘ 4Ñ'Ø×#Ñ# xÑ/ðô
ð ×#Ñ#Ð+Ü—‘ÐKÔLØ˜*×.Ñ.Ð/Ð/Øøô' ò ØŠ
ðús   ‚C1 Ã1C?Ã>C?rj   c                 ó¤  — t        «       j                  | ||||¬«      }d }|t        j                  k(  rd}n|t        j                  k(  rd}t
        j                  j                  t        j                  | ||||t        j                  j                  t        j                  j                  «      ¬«      «       |€t        j                  d«       |S )N)r8   rg   rh   ri   rj   TF)r8   rg   rh   ri   rA   rŒ   z3livepatch kernel support API response was ambiguous)re   r|   r   r   r   r   r…   ÚwriteÚLivepatchSupportCacheDatar~   r‡   rˆ   r‰   rO   rU   )r8   rg   rh   ri   rj   rA   Úcache_supporteds          r!   Ú_on_supported_kernel_apir”     sÆ   € ô "Ó#×7Ñ7ØØØØØð 8ó €Ið €OØÔ$×.Ñ.Ò.Ø‰Ø	Ô&×2Ñ2Ò	2ØˆÜ×'Ñ'×-Ñ-Ü×-Ñ-ØØØØØ%Ü×'Ñ'×+Ñ+¬H×,=Ñ,=×,AÑ,AÓBô	
ô	ð ÐÜ�‰ÐIÔJØÐr    )Úmaxsizec                  ó2  — t        «       } | �t        j                  d«       | S t        j                  «       }|j
                  �|j                  �|j                  €%t        j                  d«       t        j                  S t        j                  |j                  «      }t        j                  «       j                  }dj!                  |j                  |j                  ¬«      }t#        ||j
                  ||«      \  }}|rKt        j                  d«       |€t        j                  S |rt        j$                  S |st        j&                  S t        j                  d«       t)        ||j
                  |||j*                  «      }|€t        j                  S |S )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�   rO   rP   r
   Úget_kernel_inforg   r—   r˜   rU   r   r   r   Ústandardize_arch_nameÚuname_machine_archÚget_release_infoÚseriesÚformatr�   r   r   r”   rj   )Úcli_saysÚkernel_inforh   ri   Úlp_api_kernel_verÚis_cache_validÚ
cache_saysÚapi_sayss           r!   Úon_supported_kernelr¥   :  sw  € ô (Ó)€HØÐÜ�	‰	Ð3Ô4Øˆô ×(Ñ(Ó*€Kà×ÑÐ"Ø×ÑÐ$Ø×ÑÐ$ä�‰ð&ô	
ô  ×'Ñ'Ð'ä×%Ñ% k×&DÑ&DÓE€DÜ×&Ñ&Ó(×/Ñ/€Hà)×0Ñ0Ø×Ñ {×'8Ñ'8ð 1ó Ðô
 "<Ø˜;×-Ñ-¨t°Xó"Ñ€N�Jñ Ü�	‰	Ð1Ô2ØÐÜ#×+Ñ+Ð+ÙÜ#×-Ñ-Ð-ÙÜ#×/Ñ/Ð/ô ‡I�IÐ+Ô,Ü'ØØ×ÑØØØ×Ñó€Hð ÐÜ×'Ñ'Ð'Ø€Or    Úprotocol_typeÚretry_sleepsc                 ót   — t        «       syt        j                  t        ddj	                  | «      g|¬«       y)a…  
    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§   )rN   r
   rQ   rR   rž   )r¦   r§   s     r!   Úunconfigure_livepatch_proxyr«   v  s1   € ô "Ô#ØÜ
‡K�KÜ	˜ +×"4Ñ"4°]Ó"CÐDØ!ör    Ú
http_proxyÚhttps_proxyc                 óP  — ddl m} | s|r=t        j                  t        j
                  j                  |j                  ¬«      «       | r-t        j                  t        ddj                  | «      g|¬«       |r.t        j                  t        ddj                  |«      g|¬«       yy)	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
    r   )ÚLivepatchEntitlement)Úservicer©   zhttp-proxy={}rª   zhttps-proxy={}N)Úuaclient.entitlementsr¯   ÚeventÚinfor	   ÚSETTING_SERVICE_PROXYrž   Útitler
   rQ   rR   )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    Úkeyc                 ó*  — t        j                  t        dg«      \  }}t        j                  dj                  | «      |t        j                  «      }|r|j                  d«      nd}|rt        j                  dd|«      }|r|j                  «       S dS )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
^{}: (.*)$rM   Nz\"(.*)\"z\g<1>)
r
   rQ   rR   ÚreÚsearchrž   Ú	MULTILINEÚgroupÚsubÚstrip)r·   rZ   r[   ÚmatchÚvalues        r!   Úget_config_option_valuerÁ   ¯  su   € ô �[‰[œ-¨Ð2Ó3�F€CˆÜ�I‰I�l×)Ñ)¨#Ó.°´R·\±\ÓB€EÙ#ˆE�K‰K˜ŒN¨€EÙä—‘�{ H¨eÓ4ˆÙ!ˆ5�;‰;‹=Ð+ tÐ+r    c                  ó8   — t        j                  t        «      d uS r,   )r
   ÚwhichrR   r   r    r!   rN   rN   ¾  s   € Ü�<‰<œÓ&¨dÐ2Ð2r    r,   )NNN)<r~   ÚenumrK   Ú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_OPTIONrR   rs   Úget_event_loggerr²   Ú	getLoggerÚreplace_top_level_logger_namer   rO   ÚuniqueÚEnumr   r#   r3   r<   rE   rF   r0   rc   ÚUAServiceClientre   r�   r1   r�   r”   r¥   Úfloatr«   r¶   rÁ   rN   r   r    r!   ú<module>rÕ      sk  ðÛ Û Û Û Û 	Ý ß (Ñ (ç EÕ E÷÷ õ 'Ý 'à Ð Ø"Ð à/€à%@Ð "à%ˆ×%Ñ%Ó'€Ø€g×ÑÐ:˜×:Ñ:¸8ÓDÓE€ð ‡�ô�t—y‘yó ó ðô˜jô ô˜:ô ô.#˜Jô #ô8�jô ð"-!�Ð.Ñ/ó -!ð`Ø˜‘ðàÐÑóô ,K˜×5Ñ5ô ,Kð^I (Ð+;Ñ"<ó IðØðØðØ%(ðØ47ðà
ˆ4�˜$‘ÐÑ óð>"Øð"àð"ð ð"ð ð	"ð
 ˜×*Ñ*Ñ+ð"ð ÐÑó"ñJ �4Ôð8Ð-ò 8ó ð8ðx ?CñØðØ&.¨t°E©{Ñ&;ðà	óð* !%Ø!%Ø*.ñ"
Ø˜‘ð"
à˜#‘ð"
ð ˜4 ™;Ñ'ð"
ð 
ó	"
ðJ, ð ,¨°#©ó ,ð3 ô 3r    