
    f5                        d dl Z d dlmZmZmZmZ d dlmZmZm	Z	m
Z
mZmZmZmZ d dlmZmZ d dlmZ d dlmZ ddgZd	d
dZ ej0                         Z e j4                   ej6                  e            Z G d de      Zd Zy)    N)AnyDictOptionalTuple)event_logger
exceptionshttp	livepatchmessagessnapsystemutil)IncompatibleServiceUAEntitlement)ApplicationStatus)StaticAffordanceg      ?g      ?z)Invalid Auth-Token provided to livepatch.z2Your running kernel is not supported by Livepatch.)zUnknown Auth-Tokenzunsupported kernelc            	           e Zd Zej                  j
                  ZdZej                  Z	ej                  Zej                  ZdZdZdZdZedeedf   fd       Zedeedf   fd       Zddedefd	Z	 dd
ededefdZddZdeeeej<                     f   fdZdeeeej<                     f   fdZ d Z!	 dde"e#e$f   de"e#e$f   dedef fdZ% xZ&S )LivepatchEntitlementr
   FTreturn.c                     ddl m} ddlm} t	        |t
        j                        t	        |t
        j                        fS )Nr   FIPSEntitlement)RealtimeKernelEntitlement)uaclient.entitlements.fipsr   uaclient.entitlements.realtimer   r   r   LIVEPATCH_INVALIDATES_FIPSREALTIME_LIVEPATCH_INCOMPATIBLE)selfr   r   s      A/usr/lib/python3/dist-packages/uaclient/entitlements/livepatch.pyincompatible_servicesz*LivepatchEntitlement.incompatible_services+   s=    >L  !D!D  )88	
 	
    c                    ddl m}  || j                        }t        |j	                         d   t
        j                  k(        t        j                  j                  | j                        d dft        j                  fddffS )Nr   r   titlec                  *    t        j                         S N)r   is_container r!   r   <lambda>z9LivepatchEntitlement.static_affordances.<locals>.<lambda>J   s    ++- r!   Fc                       S r&   r(   )is_fips_enableds   r   r)   z9LivepatchEntitlement.static_affordances.<locals>.<lambda>O   s     r!   )r   r   cfgboolapplication_statusr   ENABLEDr   "SERVICE_ERROR_INSTALL_ON_CONTAINERformatr$   !LIVEPATCH_ERROR_WHEN_FIPS_ENABLED)r   r   fips_entr+   s      @r   static_affordancesz'LivepatchEntitlement.static_affordances:   s     	?"488,'')!,0A0I0II
 ;;BB** C  . ::'
 	
r!   silentc                 "   t        j                         sGt        j                  t        j
                  j                  d             t        j                          t        j                         sIt        j                  t        j
                  j                  d             	 t        j                  d       t        j                          	 t        j                   d       t#        j$                  d| j&                  j(                  t"        j*                        }t#        j$                  d| j&                  j,                  t"        j.                        }t        j0                  ||t         j2                         t5        j6                         sIt        j                  t        j
                  j                  d             	 t        j                  d       t5        j<                  ||       | j?                  dd      S # t        j                  $ rU}t        j                  d|       t        j                  t        j                  j                  d             Y d}~d}~ww xY w# t        j                  $ rU}t        j                  d	|       t        j                  t        j                  j                  d
             Y d}~d}~ww xY w# t        j                  $ r$}t        j8                  t;        |            d}~ww xY w)zYEnable specific entitlement.

        @return: True on success, False otherwise.
        snapd)packagesz
snapd snapz!Failed to install snapd as a snapexc_infozsnap install snapd)commandNzFailed to refresh snapd snapzsnap refresh snapdr	   https)
http_proxyhttps_proxyretry_sleepszcanonical-livepatch snapzcanonical-livepatch	error_msgTprocess_directivesprocess_token) r   is_snapd_installedeventinfor   INSTALLING_PACKAGESr1   install_snapdis_snapd_installed_as_a_snapinstall_snapr   ProcessExecutionErrorLOGwarningEXECUTING_COMMAND_FAILEDrun_snapd_wait_cmdrefresh_snapr	   validate_proxyr,   r=   PROXY_VALIDATION_SNAP_HTTP_URLr>   PROXY_VALIDATION_SNAP_HTTPS_URLconfigure_snap_proxySNAP_INSTALL_RETRIESr
   is_livepatch_installedErrorInstallingLivepatchstrconfigure_livepatch_proxysetup_livepatch_config)r   r5   er=   r>   s        r   _perform_enablez$LivepatchEntitlement._perform_enableT   sd   
 &&(JJx33::G:LM 002JJ,,33\3J!!'* 	!	g& ((DHH'')L)L

 ))TXX))4+O+O
 	!!!#22	

 //1JJ,,337 4 
L!!"78 	++JD**#4 + 
 	
Y 33 ?!L

55<< 4 =   // 	KK6KCJJ11880 9  	6 33 L 99CFKKLsJ   $H I, K I)A
I$$I),K?A
KKL*L		LrC   rD   c                    | j                   j                  j                  j                  | j                        }|r	 t        |       |r,|j                  d      }|s9t        j!                  d| j"                         | j                   j$                  d   }| j'                         \  }}|t(        j*                  k7  r^t        j                  d       t        j                  t        j,                         	 t/        j0                  t2        j4                  d	g       	 t/        j0                  t2        j4                  d
|gd       t        j                  t        j<                  j                  d             y# t        j                  $ rf}t        j                  t        |      |       t        j                  t        j                  j                  t        |                   Y d}~yd}~ww xY w# t        j                  $ r*}t        j                  t        |      |       Y d}~yd}~ww xY w# t        j                  $ r}t        j6                  }t8        j;                         D ]  \  }	}
|	t        |      v s||
z  } n |t        j6                  k(  r|t        |      z  }t        j                  |       Y d}~yd}~ww xY w)a  Processs configuration setup for livepatch directives.

        :param process_directives: Boolean set True when directives should be
            processsed.
        :param process_token: Boolean set True when token should be
            processsed.
        r9   r@   NFresourceTokenzHNo specific resourceToken present. Using machine token as %s credentialsmachineTokenz&Disabling livepatch before re-enablingdisableenableTcapturezCanonical Livepatchr#   )r,   machine_token_fileentitlementsgetnameprocess_config_directivesr   rL   rM   errorrY   rF   rG   r   LIVEPATCH_UNABLE_TO_CONFIGUREr1   debugr$   machine_tokenr.   r   DISABLEDLIVEPATCH_DISABLE_REATTACHr   subpr
   LIVEPATCH_CMDLIVEPATCH_UNABLE_TO_ENABLEERROR_MSG_MAPitemsENABLED_TMPL)r   rC   rD   entitlement_cfgr\   livepatch_tokenr.   _detailsmsgerror_messageprint_messages              r   r[   z+LivepatchEntitlement.setup_livepatch_config   s@    ((55BBFFII
 	)/: -11/BO"		&JJ
 #'(("8"8"H+/+B+B+D(!%6%?%??AB

8>>?!KK!8!8) DE,,hH  JJ%%,,3H,I Y 33 		#a&1	-

::AA"%a& B 
 . "77 !IIc!fqI1 ! 33 	994A4G4G4I 0M=$A.}, (===3q6MC

3	sN   E8 6%G4 (H4 8G1AG,,G14H1 H,,H14K7K?>KKc                 |    t        j                         syt        j                  t         j                  dgd       y)zYDisable specific entitlement

        @return: True on success, False otherwise.
        Tra   rc   )r
   rW   r   rp   rq   )r   r5   s     r   _perform_disablez%LivepatchEntitlement._perform_disable   s/    
 //1Y,,i8$Gr!   c                    t         j                  d f}t        j                         s t         j                  t
        j                  fS 	 t        j                         }| t         j                  t
        j                  fS |S # t        j                  $ rD}t         j                  t
        j                  j                  |j                        fcY d }~S d }~ww xY w)N)livepatch_error)r   r/   r
   rW   rn   r   LIVEPATCH_NOT_ENABLEDstatusr   rL   WARNING LIVEPATCH_CLIENT_FAILURE_WARNINGr1   stderr+LIVEPATCH_APPLICATION_STATUS_CLIENT_FAILURE)r   r   livepatch_statusr\   s       r   r.   z'LivepatchEntitlement.application_status   s     $++T2//1%..0N0NOO	(//1 # "**DD   // 	!))99@@$%HH A  	s   B   C9CCCc                 *   t        j                         }|t         j                  j                  k(  rKt	        j
                         }dt        j                  j                  |j                  |j                        fS |t         j                  j                  k(  rKt	        j
                         }dt        j                  j                  |j                  |j                        fS |t         j                  j                  k(  rdt        j                  fS y)NT)versionarch)FN)r
   on_supported_kernelLivepatchSupportUNSUPPORTEDr   get_kernel_infor   LIVEPATCH_KERNEL_NOT_SUPPORTEDr1   uname_releaseuname_machine_arch
KERNEL_EOLLIVEPATCH_KERNEL_EOLKERNEL_UPGRADE_REQUIRED!LIVEPATCH_KERNEL_UPGRADE_REQUIRED)r   supportkernel_infos      r   enabled_warning_statusz+LivepatchEntitlement.enabled_warning_status   s     //1i00<<< 002K77>>'55$77 ?   i00;;; 002K--44'55$77 5   i00HHH::  r!   c                     t        j                         t         j                  j                  k(  r$t	        j
                         st        j                  S y r&   )r
   r   r   r   r   r'   r   *LIVEPATCH_KERNEL_NOT_SUPPORTED_DESCRIPTION)r   s    r   status_description_overridez0LivepatchEntitlement.status_description_override  s=    ))+))556'')FFFr!   orig_accessdeltasallow_enablec                    t         |   |||      ry|j                  di       }|j                  di       j                  dd      }|r| j                         \  }}|S | j	                         \  }}|t
        j                  k(  ry|j                  di       }	t        ddg      }
t        |
j                  |	            }t        |j                  d	d            }t        ||g      ret        j                  d
       t        j                  t        j                  j!                  | j"                               | j%                  ||      S y)a1  Process any contract access deltas for this entitlement.

        :param orig_access: Dictionary containing the original
            resourceEntitlement access details.
        :param deltas: Dictionary which contains only the changed access keys
        and values.
        :param allow_enable: Boolean set True if allowed to perform the enable
            operation. When False, a message will be logged to inform the user
            about the recommended enabled service.

        :return: True when delta operations are processed; False when noop.
        TentitlementobligationsenabledByDefaultF
directivescaCertsremoteServerr_   zANew livepatch directives or token. running setup_livepatch_config)servicerB   )superprocess_contract_deltasrg   rb   r.   r   rn   setr-   intersectionanyrM   rG   rF   r   #SERVICE_UPDATING_CHANGED_DIRECTIVESr1   rh   r[   )r   r   r   r   delta_entitlementprocess_enable_defaultenable_success_r.   delta_directivessupported_deltasrC   rD   	__class__s                r   r   z,LivepatchEntitlement.process_contract_deltas  sU   $ 7*;M"JJ}b9!2!6!6}b!I!M!M"
 " $NA!! $ 7 7 9A!2!;!;;,00rB	>:;!))*:;
 VZZ?@"M23HH) JJ<<CC II D 
 ..#5+ /   r!   )F)TT)'__name__
__module____qualname__r   urlsLIVEPATCH_HOME_PAGEhelp_doc_urlrh   LIVEPATCH_TITLEr$   LIVEPATCH_DESCRIPTIONdescriptionLIVEPATCH_HELP_TEXT	help_text#affordance_check_kernel_min_versionaffordance_check_kernel_flavoraffordance_check_seriesaffordance_check_archpropertyr   r   r    r   r4   r-   r]   r[   r}   r   r   NamedMessager.   r   r   r   rY   r   r   __classcell__)r   s   @r   r   r      sj   ==44LD$$E00K,,I*/'%*"" !
u-@#-E'F 
 
 
E*:C*?$@ 
 
2=
d =
t =
@ FJ<"&<>B<	<|	 (8+@+@"AA	B4	tXh3344	5@ #	5#s(^5 S#X5 	5
 
5 5r!   r   c                    | sy| j                  di       j                  di       }|j                  d      }|r7t        j                  t        j                  ddj                  |      gd       |j                  d	d
      }|j                  d      r|dd }|r8t        j                  t        j                  ddj                  |      gd       yy)a  Process livepatch configuration directives.

    We process caCerts before remoteServer because changing remote-server
    in the canonical-livepatch CLI performs a PUT against the new server name.
    If new caCerts were required for the new remoteServer, this
    canonical-livepatch client PUT could fail on unmatched old caCerts.

    @raises: ProcessExecutionError if unable to configure livepatch.
    Nr   r   r   configzca-certs={}Trc   r    /zremote-server={})rg   r   rp   r
   rq   r1   endswith)r,   r   ca_certsremote_servers       r   ri   ri   V  s     +//bAJ~~i(H''$$X.
 	
 NN>26Mc"%cr*''"))-8
 	
 r!   ) loggingtypingr   r   r   r   uaclientr   r   r	   r
   r   r   r   r   uaclient.entitlements.baser   r   (uaclient.entitlements.entitlement_statusr   uaclient.typesr   LIVEPATCH_RETRIESrs   get_event_loggerrF   	getLoggerreplace_top_level_logger_namer   rM   r   ri   r(   r!   r   <module>r      s     - -	 	 	 J F +#J  FN
 	&%%'g:::8DEv= vr	"
r!   