+
     gh3                     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hGr"   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'      sm $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     fo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59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Hk:vF
	jjo%//< !S););%<q%@		56a  I ++ 
 $qxx/KK!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KKJKKK&$..22;?$
3Dd(K(K '111#///78IJJ#  	KKNOKK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	 3I4G4G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 Li ; 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ED&&(//H)00{'8'8 1 
 "<--t"N 		12#+++#---#/// II+,'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-      &.tE{&;	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     "##
KK	+"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 	
 Ho&<&<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3FCIIl))#.R\\BE#EKKNE{He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 tyy  j : .#J #8j "-!` ,K55 ,K^I>"J 48 8v("
J,3r"   