
Ke2                 @   s  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 d i Z e j   Z e  j e j e   Z Gd d   d e  Z d d   Z d S)    N)AnyDictOptionalTuple)event_logger
exceptionshttp	livepatchmessagessnapsystemutil)IncompatibleServiceUAEntitlement)ApplicationStatus)StaticAffordanceg      ?g      ?zUnknown Auth-Tokenz)Invalid Auth-Token provided to livepatch.zunsupported kernelz2Your running kernel is not supported by Livepatch.c            	       s}  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 e e d f d d d     Z e e e d f d d d	     Z d e e d
 d d   Z d d e e e d d d   Z d d d  Z e e e e j f d d d    Z e e e e j f d d d    Z  d d   Z! d e" e# e$ f e" e# e$ f e e d   f d d   Z%   S)LivepatchEntitlementr	   FT.)returnc             C   sB   d d l  m } d d l m } t | t j  t | t j  f S)Nr   )FIPSEntitlement)RealtimeKernelEntitlement)uaclient.entitlements.fipsr   Zuaclient.entitlements.realtimer   r   r
   ZLIVEPATCH_INVALIDATES_FIPSZREALTIME_LIVEPATCH_INCOMPATIBLE)selfr   r    r   A/usr/lib/python3/dist-packages/uaclient/entitlements/livepatch.pyincompatible_services+   s    z*LivepatchEntitlement.incompatible_servicesc                s   d d l  m } | |  j  } t | j   d t j k    t j j	 d |  j
  d d   d f t j   f d d   d f f S)Nr   )r   titlec               S   s
   t  j   S)N)r   is_containerr   r   r   r   <lambda>J   s    z9LivepatchEntitlement.static_affordances.<locals>.<lambda>Fc                  s     S)Nr   r   )is_fips_enabledr   r   r   O   s    )r   r   cfgboolapplication_statusr   ENABLEDr
   Z"SERVICE_ERROR_INSTALL_ON_CONTAINERformatr   Z!LIVEPATCH_ERROR_WHEN_FIPS_ENABLED)r   r   Zfips_entr   )r   r   static_affordances:   s    		z'LivepatchEntitlement.static_affordances)silentr   c          !   C   s  t  j   s2 t j t j j d d   t  j   t  j   s t j t j j d d   y t  j	 d  WnW t
 j k
 r } z4 t j d d | t j t j j d d   WYd d } ~ Xn Xt  j   t j d	 |  j j t j  } t j d
 |  j j t j  } t  j d | d | d t  j  t j   st j t j j d d   y t  j	 d  Wn@ t
 j k
 r} z t
 j d t |    WYd d } ~ Xn Xt j | |  |  j d d d d  S)zYEnable specific entitlement.

        @return: True on success, False otherwise.
        ZpackagesZsnapdz
snapd snapz!Failed to install snapd as a snapexc_infoZcommandzsnap install snapdNr   Zhttps
http_proxyhttps_proxyZretry_sleepszcanonical-livepatch snapzcanonical-livepatch	error_msgprocess_directivesTprocess_token)r   Zis_snapd_installedeventinfor
   ZINSTALLING_PACKAGESr#   Zinstall_snapdZis_snapd_installed_as_a_snapZinstall_snapr   ProcessExecutionErrorLOGZwarningZEXECUTING_COMMAND_FAILEDZrun_snapd_wait_cmdr   Zvalidate_proxyr   r'   ZPROXY_VALIDATION_SNAP_HTTP_URLr(   ZPROXY_VALIDATION_SNAP_HTTPS_URLZconfigure_snap_proxyZSNAP_INSTALL_RETRIESr	   is_livepatch_installedZErrorInstallingLivepatchstrZconfigure_livepatch_proxysetup_livepatch_config)r   r%   er'   r(   r   r   r   _perform_enableT   sB    

	

+	z$LivepatchEntitlement._perform_enable)r*   r+   r   c          .   C   sX  |  j  j j j |  j  } | r y t |  Wng t j k
 r } zD t j	 t
 |  d | t j t j j d t
 |    d SWYd d } ~ Xn X| rT| j d  } | s t j d |  j  |  j  j d } |  j   \ } } | t j k rwt j d  t j t j  y t j t j d	 g  WnE t j k
 rv} z" t j	 t
 |  d | d SWYd d } ~ Xn Xy# t j t j d
 | g d d Wn t j k
 r7} zx t j } x7 t j   D]) \ }	 }
 |	 t
 |  k r| |
 7} PqW| t j k r| t
 |  7} t j |  d SWYd d } ~ Xn Xt j t j j d d   d S)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.
        r&   r)   FNresourceTokenzHNo specific resourceToken present. Using machine token as %s credentialsZmachineTokenz&Disabling livepatch before re-enablingdisableenablecaptureTr   zCanonical Livepatch)r   Zmachine_token_fileZentitlementsgetnameprocess_config_directivesr   r.   r/   errorr1   r,   r-   r
   ZLIVEPATCH_UNABLE_TO_CONFIGUREr#   debugr   Zmachine_tokenr!   r   DISABLEDZLIVEPATCH_DISABLE_REATTACHr   subpr	   LIVEPATCH_CMDZLIVEPATCH_UNABLE_TO_ENABLEERROR_MSG_MAPitemsZENABLED_TMPL)r   r*   r+   Zentitlement_cfgr3   Zlivepatch_tokenr!   Z_detailsmsgZerror_messageZprint_messager   r   r   r2      sX    

	
z+LivepatchEntitlement.setup_livepatch_configc             C   s0   t  j   s d St j t  j d g d d d S)zYDisable specific entitlement

        @return: True on success, False otherwise.
        Tr6   r8   )r	   r0   r   r?   r@   )r   r%   r   r   r   _perform_disable   s    z%LivepatchEntitlement._perform_disablec             C   sQ   t  j d  f } t j   s+ t  j t j f St j   d  k rM t  j t j f S| S)N)	r   r"   r	   r0   r>   r
   ZLIVEPATCH_NOT_ENABLEDstatusZ+LIVEPATCH_APPLICATION_STATUS_CLIENT_FAILURE)r   rE   r   r   r   r!      s    
z'LivepatchEntitlement.application_statusc             C   s   t  j   } | t  j j k rO t j   } d t j j d | j	 d | j
  f S| t  j j k r t j   } d t j j d | j	 d | j
  f S| t  j j k r d t j f Sd S)NTversionZarchF)FN)r	   on_supported_kernelLivepatchSupportUNSUPPORTEDr   Zget_kernel_infor
   ZLIVEPATCH_KERNEL_NOT_SUPPORTEDr#   Zuname_releaseZuname_machine_archZ
KERNEL_EOLZLIVEPATCH_KERNEL_EOLZKERNEL_UPGRADE_REQUIREDZ!LIVEPATCH_KERNEL_UPGRADE_REQUIRED)r   ZsupportZkernel_infor   r   r   enabled_warning_status   s"    		
z+LivepatchEntitlement.enabled_warning_statusc             C   s0   t  j   t  j j k r, t j   r, t j Sd  S)N)r	   rG   rH   rI   r   r   r
   Z*LIVEPATCH_KERNEL_NOT_SUPPORTED_DESCRIPTION)r   r   r   r   status_description_override   s
    	z0LivepatchEntitlement.status_description_override)orig_accessdeltasallow_enabler   c                s6  t    j | | |  r d S| j d i   } | j d i   j d d  } | rh |  j   \ } } | S|  j   \ } } | t j k r d S| j d i   }	 t d d g  }
 t |
 j	 |	   } t | j d	 d   } t
 | | g  r2t j d
  t j t j j d |  j   |  j d | d |  Sd S)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entitlementZobligationsZenabledByDefaultF
directivescaCertsremoteServerr5   zANew livepatch directives or token. running setup_livepatch_configservicer*   r+   )superprocess_contract_deltasr9   r7   r!   r   r>   setr    intersectionanyr/   r-   r,   r
   Z#SERVICE_UPDATING_CHANGED_DIRECTIVESr#   r:   r2   )r   rL   rM   rN   Zdelta_entitlementZprocess_enable_defaultZenable_success_r!   Zdelta_directivesZsupported_deltasr*   r+   )	__class__r   r   rU   	  s4    	z,LivepatchEntitlement.process_contract_deltas)&__name__
__module____qualname__r
   ZurlsZLIVEPATCH_HOME_PAGEZhelp_doc_urlr:   ZLIVEPATCH_TITLEr   ZLIVEPATCH_DESCRIPTIONZdescriptionZLIVEPATCH_HELP_TEXTZ	help_textZ#affordance_check_kernel_min_versionZaffordance_check_kernel_flavorZaffordance_check_seriesZaffordance_check_archpropertyr   r   r   r   r$   r    r4   r2   rD   r   r   ZNamedMessager!   rJ   rK   r   r1   r   rU   r   r   )rZ   r   r      s,   			""6<&& r   c             C   s   |  s
 d S|  j  d i   j  d i   } | j  d  } | re t j t j d d j |  g d d | j  d	 d
  } | j d  r | d d  } | r t j t j d d j |  g d d d S)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.
    NrO   rP   rQ   configzca-certs={}r8   TrR    /   zremote-server={})r9   r   r?   r	   r@   r#   endswith)r   rP   Zca_certsZremote_serverr   r   r   r;   A  s&    
r;   ) ZloggingZtypingr   r   r   r   Zuaclientr   r   r   r	   r
   r   r   r   Zuaclient.entitlements.baser   r   Z(uaclient.entitlements.entitlement_statusr   Zuaclient.typesr   ZLIVEPATCH_RETRIESrA   Zget_event_loggerr,   Z	getLoggerZreplace_top_level_logger_namer[   r/   r   r;   r   r   r   r   <module>   s   ":
 %