Ë
    GKÕiy8  ã                   ó  — 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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j2                  «       Z e j6                   ej8                  e«      «      Z G d„ de«      Zd„ Z y)é    N)ÚAnyÚDictÚOptionalÚTuple)	ÚapiÚevent_loggerÚ
exceptionsÚhttpÚ	livepatchÚmessagesÚsnapÚsystemÚutil)ÚEntitlementWithMessageÚ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efd„Zdefd	„Zd
ej8                  defd„Z	 	 dd
ej8                  dededefd„Zd
ej8                  fd„Z dee!e"ejF                     f   fd„Z$deee"ejF                     f   fd„Z%d„ Z&	 	 dde'e(e)f   de'e(e)f   de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   )Úcfg)Útitlec                  ó\   — t        j                  «       xs t        j                  «       dk(  S )NÚwsl)r   Úis_containerÚget_virt_type© r"   r    ú<lambda>z9LivepatchEntitlement.static_affordances.<locals>.<lambda>K   s(   € œ×+Ñ+Ó-ò 3Ü×'Ñ'Ó)¨UÑ2ð r"   Fc                  ó   •— ‰ S ©Nr*   )Úis_fips_enableds   €r    r+   z9LivepatchEntitlement.static_affordances.<locals>.<lambda>Q   s   ø€ ˜€ r"   )r   r   r$   Ú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�   ø€ õ 	?á" t§x¡xÔ0ˆäØ×'Ñ'Ó)¨!Ñ,Ô0A×0IÑ0IÑIó
ˆô ×;Ñ;×BÑBØŸ*™*ð Có ñ3àðô ×:Ñ:Û'Øðð
ð 	
r"   c                  ó   — y)Né   r*   ©r   s    r    Úenable_stepsz!LivepatchEntitlement.enable_stepsV   ó   € Ør"   c                  ó   — y)Né   r*   r9   s    r    Údisable_stepsz"LivepatchEntitlement.disable_stepsY   r;   r"   Úprogressc                 óL  — |j                  t        j                  «       t        j                  «       sD|j                  dt        j                  j                  d¬«      «       t        j                  «        t        j                  «       sF|j                  dt        j                  j                  d¬«      «       	 t        j                  d«       t        j                   |«       	 t        j"                  d«       t)        j*                  d| j,                  j.                  t(        j0                  «      }t)        j*                  d| j,                  j2                  t(        j4                  «      }t        j6                  ||t        j8                  ¬«       t;        j<                  «       sF|j                  dt        j                  j                  d¬«      «       	 t        j                  d«       t;        jB                  ||«       | jE                  |dd¬«      S # t        j                  $ rR}t        j                  d|¬«       |j                  d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        j>                  tA        |«      ¬«      ‚d	}~ww xY w)zYEnable specific entitlement.

        @return: True on success, False otherwise.
        ÚinfoÚ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?   r   ÚINSTALLING_LIVEPATCHr   Úis_snapd_installedÚemitÚINSTALLING_PACKAGESr3   Úinstall_snapdÚis_snapd_installed_as_a_snapÚinstall_snapr	   ÚProcessExecutionErrorÚLOGÚwarningÚEXECUTING_COMMAND_FAILEDÚrun_snapd_wait_cmdÚrefresh_snapÚeventrA   r
   Úvalidate_proxyr$   rI   ÚPROXY_VALIDATION_SNAP_HTTP_URLrJ   ÚPROXY_VALIDATION_SNAP_HTTPS_URLÚconfigure_snap_proxyÚSNAP_INSTALL_RETRIESr   Úis_livepatch_installedÚErrorInstallingLivepatchÚstrÚconfigure_livepatch_proxyÚsetup_livepatch_config)r   r?   ÚerI   rJ   s        r    Ú_perform_enablez$LivepatchEntitlement._perform_enable\   sŒ  € ð
 	×Ñœ(×7Ñ7Ô8ä×&Ñ&Ô(Ø�M‰MØœ×4Ñ4×;Ñ;ÀWÐ;ÓMôô ×ÑÔ ä×0Ñ0Ô2Ø�M‰MØÜ×,Ñ,×3Ñ3¸\Ð3ÓJôð	Ü×!Ñ! 'Ô*ô 	×Ñ Ô)ð	Ü×Ñ˜gÔ&ô ×(Ñ(Ø�D—H‘H×'Ñ'¬×)LÑ)Ló
ˆ
ô ×)Ñ)Ø�T—X‘X×)Ñ)¬4×+OÑ+Oó
ˆô 	×!Ñ!Ø!Ø#Ü×2Ñ2õ	
ô
 ×/Ñ/Ô1Ø�M‰MØÜ×,Ñ,×3Ñ3Ø7ð 4ó ôðLÜ×!Ñ!Ð"7Ô8ô 	×+Ñ+¨J¸ÔDà×*Ñ*Ø¨¸Tð +ó 
ð 	
øô] ×3Ñ3ò Ü—‘Ð?È!�ÔLØ—‘ØÜ×5Ñ5×<Ñ<Ø 4ð =ó ÷ò ûðûô ×/Ñ/ò 	Ü�K‰KÐ6ÀˆKÔCÜ�J‰JÜ×1Ñ1×8Ñ8Ø0ð 9ó ÷ò ûð	ûô8 ×3Ñ3ò LÜ ×9Ñ9ÄCÈÃFÔKÐKûðLúsJ   Â=H Ã(J ÇK, ÈI>È,AI9É9I>ÊK)ÊA
K$Ë$K)Ë,L#Ë?LÌL#rN   rO   c           	      óN  — |j                  t        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	«       |j                  dt        j.                  «       	 t1        j2                  t4        j6                  d
g«       	 t1        j2                  t4        j6                  d|gd¬«       yy# t        j                  $ rc}t        j                  t        |«      |¬«       |j                  d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        j8                  }	t:        j=                  «       D ]  \  }
}|
t        |«      v sŒ|	|z  }	 n |	t        j8                  k(  r|	t        |«      z  }	|j                  d|	«       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.
        rD   rA   rL   NFÚresourceTokenzHNo specific resourceToken present. Using machine token as %s credentialsÚmachineTokenz&Disabling livepatch before re-enablingÚdisableÚenableT©Úcapture)r?   r   ÚSETTING_UP_LIVEPATCHÚmachine_token_fileÚentitlementsÚgetÚnameÚprocess_config_directivesr	   rW   rX   Úerrorre   rR   ÚLIVEPATCH_UNABLE_TO_CONFIGUREr3   Údebugr%   Úmachine_tokenr0   r   ÚDISABLEDrA   ÚLIVEPATCH_DISABLE_REATTACHr   Úsubpr   ÚLIVEPATCH_CMDÚLIVEPATCH_UNABLE_TO_ENABLEÚERROR_MSG_MAPÚitems)r   r?   rN   rO   Úentitlement_cfgrh   Úlivepatch_tokenr0   Ú_detailsÚmsgÚerror_messageÚprint_messages               r    rg   z+LivepatchEntitlement.setup_livepatch_config¢   s7  € ð 	×Ñœ(×7Ñ7Ô8à×1Ñ1×>Ñ>Ó@×DÑDÀTÇYÁYÓOˆÙð
Ü)¨/Ô:ñ Ø-×1Ñ1°/ÓBˆOÙ"Ü—	‘	ð&à—J‘Jôð
 #'×"9Ñ"9×"GÑ"GØ"ñ#�ð ,0×+BÑ+BÓ+DÑ(Ð Ø!Ô%6×%?Ñ%?Ò?Ü—‘ÐAÔBØ—‘˜f¤h×&IÑ&IÔJð!Ü—K‘K¤×!8Ñ!8¸)Ð DÔEðÜ—‘Ü×,Ñ,¨h¸ÐHØ õñ øôY ×3Ñ3ò Ü—	‘	œ#˜a›&¨1�	Ô-Ø—‘ØÜ×:Ñ:×AÑAÜ"% a£&ð Bó ôô ûðûô4 "×7Ñ7ò !Ü—I‘Iœc !›f¨q�IÔ1Ü ûð!ûô ×3Ñ3ò 	Ü×9Ñ9�Ü4A×4GÑ4GÓ4Iò Ñ0�M =Ø$¬¨A«Ò.Ø˜}Ñ,˜Ùðð œ(×=Ñ=Ò=Øœ3˜q›6‘M�CØ—‘˜f cÔ*Üûð	úsO   ÁE Ä%G Ä1(H ÅGÅ.AGÇGÇHÇ' HÈHÈJ$È'7JÉ;JÊJ$c                 óü   — t        j                  «       syt         j                  dg}|j                  t        j
                  j                  dj                  |«      ¬«      «       t        j                  |d¬«       y)zYDisable specific entitlement

        @return: True on success, False otherwise.
        Trm   ú rF   ro   )
r   rc   r~   r?   r   ÚEXECUTING_COMMANDr3   Újoinr   r}   )r   r?   Úcmds      r    Ú_perform_disablez%LivepatchEntitlement._perform_disableã   sc   € ô
 ×/Ñ/Ô1ØÜ×&Ñ&¨	Ð2ˆØ×ÑÜ×&Ñ&×-Ñ-°c·h±h¸s³mÐ-ÓDô	
ô 	�‰�C Õ&Ø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   r1   r   rc   r{   r   ÚLIVEPATCH_NOT_ENABLEDÚstatusr	   rW   ÚWARNINGÚ LIVEPATCH_CLIENT_FAILURE_WARNINGr3   ÚstderrÚ+LIVEPATCH_APPLICATION_STATUS_CLIENT_FAILURE)r   r‘   Úlivepatch_statusrh   s       r    r0   z'LivepatchEntitlement.application_statusñ   sÄ   € ô $×+Ñ+¨TÐ2ˆä×/Ñ/Ô1Ü%×.Ñ.´×0NÑ0NÐOÐOð	Ü(×/Ñ/Ó1Ðð Ð#ô "×*Ñ*Ü×DÑDðð ð ˆøô ×/Ñ/ò 	ä!×)Ñ)Ü×9Ñ9×@Ñ@Ø$%§H¡Hð 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_SUPPORTEDr3   Ú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Ó2ˆKàÜ×7Ñ7×>Ñ>Ø'×5Ñ5Ø$×7Ñ7ð ?ó ðð ð ”i×0Ñ0×;Ñ;Ò;Ü ×0Ñ0Ó2ˆKàÜ×-Ñ-×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_DESCRIPTIONr9   s    r    Ústatus_description_overridez0LivepatchEntitlement.status_description_override+  s=   € ä×)Ñ)Ó+Ü×)Ñ)×5Ñ5ò6ä×'Ñ'Ô)ä×FÑFÐFØr"   Úorig_accessÚdeltasÚallow_enableÚverbosec                 óî  •— t         ‰| �  ||||¬«      ry|j                  di «      }|j                  di «      j                  dd«      }|r(| j                  t	        j
                  «       «      \  }}|S | j                  «       \  }	}|	t        j                  k(  ry|j                  di «      }
t        dd	g«      }t        |j                  |
«      «      }t        |j                  d
d«      «      }t        ||g«      rzt        j                  d«       |r=t        j                  t         j"                  j%                  | j&                  ¬«      «       | j)                  t	        j
                  «       ||¬«      S y)ak  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.
        :param verbose: If True, display output to stdout

        :return: True when delta operations are processed; False when noop.
        )r®   TÚentitlementÚobligationsÚenableByDefaultFÚ
directivesÚcaCertsÚremoteServerrk   zANew livepatch directives or token. running setup_livepatch_config)Úservice)r?   rN   rO   )ÚsuperÚprocess_contract_deltasrt   rn   r   ÚProgressWrapperr0   r   r{   Úsetr/   ÚintersectionÚanyrX   rA   r]   r   Ú#SERVICE_UPDATING_CHANGED_DIRECTIVESr3   ru   rg   )r   r«   r¬   r­   r®   Údelta_entitlementÚprocess_enable_defaultÚenable_successÚ_r0   Údelta_directivesÚsupported_deltasrN   rO   Ú	__class__s                 €r    r¸   z,LivepatchEntitlement.process_contract_deltas4  s|  ø€ ô( ‰7Ñ*Ø˜ °wð +ô 
ð à"ŸJ™J }°bÓ9ÐØ!2×!6Ñ!6°}ÀbÓ!I×!MÑ!MØ˜uó"
Ðñ "Ø $§¡¬C×,?Ñ,?Ó,AÓ BÑˆN˜AØ!Ð!à $× 7Ñ 7Ó 9ÑÐ˜AØÔ!2×!;Ñ!;Ò;ØØ,×0Ñ0°¸rÓBÐÜ 	¨>Ð:Ó;ÐÜ!Ø×)Ñ)Ð*:Ó;ó
Ðô ˜VŸZ™Z¨¸Ó?Ó@ˆÜÐ" MÐ2Ô3Ü�H‰Hð)ôñ
 Ü—
‘
Ü×@Ñ@×GÑGØ $§	¡	ð Hó ôð
 ×.Ñ.Ü×,Ñ,Ó.Ø#5Ø+ð /ó ð ð
 r"   )TT)FT),Ú__name__Ú
__module__Ú__qualname__r   ÚurlsÚLIVEPATCH_HOME_PAGEÚhelp_doc_urlru   Ú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   r6   Úintr:   r>   r   r¹   r/   ri   rg   r�   r   r   ÚNamedMessager0   r§   rª   r   re   r   r¸   Ú__classcell__)rÄ   s   @r    r   r      sº  ø„ Ø—=‘=×4Ñ4€LØ€DØ×$Ñ$€EØ×0Ñ0€KØ×,Ñ,€IØ*/Ð'Ø%*Ð"à"Ðð !Ðàð
 uÐ-CÀSÐ-HÑ'Iò 
ó ð
ð ð
 EÐ*:¸CÐ*?Ñ$@ò 
ó ð
ð4˜có ð˜só ðD
¨×(;Ñ(;ð D
Àó D
ðR $(Ø"ñ	?à×%Ñ%ð?ð !ð?ð ð	?ð
 
ó?ðB¨×)<Ñ)<ó ðà	Ð  (¨8×+@Ñ+@Ñ"AÐAÑ	Bóð4à	ˆt�X˜h×3Ñ3Ñ4Ð4Ñ	5óò@ð #Øñ<à˜#˜s˜(‘^ð<ð �S˜#�X‘ð<ð ð	<ð
 ð<ð 
÷<ñ <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={}Tro   rµ   Ú ú/éÿÿÿÿzremote-server={})rt   r   r}   r   r~   r3   Úendswith)r$   r³   Úca_certsÚremote_servers       r    rv   rv   s  sÌ   € ñ ØØ—‘˜¨Ó+×/Ñ/°¸bÓA€JØ�~‰~˜iÓ(€HÙÜ�‰ä×'Ñ'ØØ×$Ñ$ XÓ.ðð
 õ	
ð —N‘N >°2Ó6€MØ×Ñ˜cÔ"Ø% c rÐ*ˆÙÜ�‰ä×'Ñ'ØØ"×)Ñ)¨-Ó8ðð
 ö	
ð r"   )!ÚloggingÚtypingr   r   r   r   Úuaclientr   r   r	   r
   r   r   r   r   r   Úuaclient.entitlements.baser   r   Ú(uaclient.entitlements.entitlement_statusr   Úuaclient.typesr   ÚLIVEPATCH_RETRIESr€   Úget_event_loggerr]   Ú	getLoggerÚreplace_top_level_logger_namerÅ   rX   r   rv   r*   r"   r    ú<module>rê      s‰   ðÛ ß -Ó -÷
÷ 
õ 
÷ MÝ FÝ +à˜#�JÐ ð FØNñ€ð
 	&ˆ×%Ñ%Ó'€Ø€g×ÑÐ:˜×:Ñ:¸8ÓDÓE€ôR˜=ô Rój
"
r"   