Ë
    ‚­KjS;  ã                   ó–  — d dl Z d dlZ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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 d dl
mZm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  d d	l!m"Z"m#Z# d d
l$m%Z%m&Z&m'Z'm(Z(m)Z)  ejT                  «       Z+ ejX                   ejZ                  e.«      «      Z/dZ0dZ1dejd                  dejf                  de j                   fd„Z4	 d-dejd                  deejj                     dejf                  de j                   de6f
d„Z7	 d-dejd                  de8de6de6ddf
d„Z9	 d.dejd                  dejt                  ddfd„Z;dddddœdejd                  de8de6de8de6d e	ee8      fd!„Z<ddd"œdejd                  d#e	e8   d$e6fd%„Zd&e8ddfd'„Z=	 d/d&e8d(e	ee>      ddfd)„Z?dejd                  fd*„Z@dejd                  d+e8fd,„ZAy)0é    N)ÚListÚOptional)ÚapiÚcloudsÚconfigÚcontractÚentitlementsÚevent_loggerÚ
exceptionsÚ	livepatch)Úlog)ÚmessagesÚsecret_manager)Ústatus)ÚsystemÚtimerÚutil)ÚAPPARMOR_PROFILESÚCLOUD_BUILD_INFOÚDEFAULT_CONFIG_FILEÚDEFAULT_LOG_PREFIX)Úmachine_tokenÚnotices)ÚAttachmentDataÚattachment_data_fileÚmachine_id_fileÚonly_series_check_marker_fileÚtimer_jobs_state_file)zapt-news.servicezesm-cache.servicezua-timer.servicezua-timer.timerzua-auto-attach.pathzua-auto-attach.servicezua-reboot-cmds.servicezubuntu-advantage.serviceé
   ÚcfgÚcontract_clientÚattached_atc                 óª   — ddl m} t        j                  t	        |¬«      «       t        j                  | ¬«        || «       |j                  «        y )Nr   ©Úupdate_motd_messages©r"   ©r    )Úuaclient.timer.update_messagingr%   r   Úwriter   Ú	ua_statusr   Úupdate_activity_token)r    r!   r"   r%   s       ú2/usr/lib/python3/dist-packages/uaclient/actions.pyÚ_handle_partial_attachr-   9   s=   € õ
 Eä×Ñœ~¸+ÔFÔGÜ×Ñ˜ÕÙ˜ÔØ×)Ñ)Õ+ó    FÚservices_to_be_enabledÚsilentc                 ó  — d}g }g }	 |D ]k  }t        | |j                  |j                  |¬«      \  }	}
||	z  }|	s|j                  |j                  «       ŒLt        j                  |j                  ¬«       Œm 	 |sÇt        | ||«       t        j                  |«       |rot        j                  t        ||«      D ��cg c]C  \  }}|t        j                   j#                  t%        |«      t'        j(                  «       ¬«      f‘ŒE c}}¬«      ‚t        j*                  |D �cg c]  }|t        j,                  f‘Œ c}¬«      ‚y # t        j                  $ r3}t        j                  j                  «       t        | ||«       |‚d }~wt        j                  $ r! |j                  j                  «       d}Y �ŒAt        $ r9}d}|j                  j                  «       |j                  |«       Y d }~�Œ}d }~ww xY wc c}}w c c}w )NT)r    ÚnameÚvariantr0   )ÚserviceF)Ú	error_msgÚlog_path)Úfailed_services)Úenable_entitlement_by_namer2   r3   ÚappendÚeventÚservice_processedr   ÚConnectivityErrorÚservice_failedr-   ÚUbuntuProErrorÚ	ExceptionÚservices_failedÚAttachFailureUnknownErrorÚzipr   ÚUNEXPECTED_ERRORÚformatÚstrÚpro_logÚget_user_or_root_log_file_pathÚAttachFailureDefaultServicesÚ!E_ATTACH_FAILURE_DEFAULT_SERVICES)r    r/   r!   r"   r0   Úretr7   Úunexpected_errorsÚenable_by_default_serviceÚent_retÚreasonÚexcÚer2   Ú	exceptions                  r,   Ú_enable_default_servicesrR   F   sû  € ð €CØ€OØÐð$Ø)?ò 	PÐ%Ü8ØØ.×3Ñ3Ø1×9Ñ9Øô	‰OˆG�Vð �7‰NˆCáØ×&Ñ&Ð'@×'EÑ'EÕFä×'Ñ'Ð0I×0NÑ0NÐ'ÕOñ	Pñ2 ä˜s O°[ÔAÜ×Ñ˜oÔ.áÜ×6Ñ6ô ,/Ø'Ð):ó,÷!ñ (˜˜ið Ü ×1Ñ1×8Ñ8Ü&)¨)£nÜ%,×%KÑ%KÓ%Mð 9ó òó!ôð ô ×9Ñ9ð !0ö!àð œ8×EÑEÒFò!ôð ð+ øô ×'Ñ'ò Ü×ÑÐ6×;Ñ;Ô<Ü˜s O°[ÔAØˆ	ûÜ×$Ñ$ò Ø×ÑÐ8×=Ñ=Ô>Ø‹Üò $ØˆØ×ÑÐ8×=Ñ=Ô>Ø× Ñ  ×#Ò#ûð$üó!ùò!s7   ˆA0E Â=AG>
Ä!HÅG;Å.FÆ3G;Æ:G;Ç.G6Ç6G;ÚtokenÚallow_enableÚreturnc                 ót  — ddl m} ddlm} t        j
                  j                  |«       t        j                  | «      }t        j                  | «      }t        j                  j                  t        j                  j                  ¬«      }|j                  ||¬«      }	t!        j"                  «       j$                  }
|	j'                  di «      j'                  di «      }t)        d„ |j'                  d	g «      D «       «      }|j'                  d
i «      j'                  di «      j'                  dd«      }|rÈ	 t!        j*                  |«      }t!        j*                  |
«      }|j,                  |j,                  kD  r+t/        j0                  |j2                  |j4                  ¬«      ‚t7        j8                  t6        j:                  j<                  |j2                  |j4                  ¬«       t?        j@                  |«       |jA                  |	«       	  || «       t         jH                  jK                  «        |	j'                  di «      j'                  dt!        jH                  | «      «      }tM        j@                  |«       |r4t        jN                  | |jQ                  «       «      }tS        | ||||¬«       tU        j@                  tW        |¬«      «        || «       tY        jZ                  «        y# t.        jB                  $ r Y �Œ
w xY w# t.        jD                  $ r}|jG                  «        |‚d}~ww xY w)aC  
    Common functionality to take a token and attach via contract backend
    :raise ConnectivityError: On unexpected connectivity issues to contract
        server or inability to access identity doc from metadata service.
    :raise ContractAPIError: On unexpected errors when talking to the contract
        server.
    r   )Ú+check_entitlement_apt_directives_are_uniquer$   )Útz)Úcontract_tokenÚattachment_dtÚmachineTokenInfoÚcontractInfoc              3   ój   K  — | ]+  }|j                  d «      dk(  r|j                  d «      |f–— Œ- y­w)ÚtypeÚsupportN)Úget)Ú.0rP   s     r,   ú	<genexpr>z$attach_with_token.<locals>.<genexpr>¦   s5   è ø€ ò àØ�5‰5�‹=˜IÒ%ð 
�‰ˆv‹˜Ôñùs   ‚13ÚresourceEntitlementsr_   ÚaffordancesÚ
onlySeriesN)ÚreleaseÚseries_codenameÚ	machineId)r    r/   r!   r"   r0   r&   ).Úuaclient.entitlementsrW   r(   r%   r   ÚsecretsÚ
add_secretr   Úget_machine_token_filer   ÚUAContractClientÚdatetimeÚnowÚtimezoneÚutcÚadd_contract_machiner   Úget_release_infoÚseriesr`   ÚdictÚget_distro_infoÚeolr   ÚAttachFailureRestrictedReleaserf   rg   r   ÚaddÚNoticeÚLIMITED_TO_RELEASEr   r)   ÚMissingSeriesInDistroInfoFileÚ%EntitlementsAPTDirectivesAreNotUniqueÚdeleteÚget_machine_idÚcache_clearr   Úget_enabled_by_default_servicesr	   rR   r   r   r   Ústart)r    rS   rT   r0   rW   r%   Úmachine_token_filer!   r"   Únew_machine_tokenÚcurrent_seriesr\   Úsupport_resourceÚonly_seriesÚallowed_releaseÚcurrent_releaserP   Ú
machine_idr/   s                      r,   Úattach_with_tokenr‹   ˆ   sÉ  € õõ Eä×Ñ×%Ñ% eÔ,Ü&×=Ñ=¸cÓBÐÜ×/Ñ/°Ó4€OÜ×#Ñ#×'Ñ'¬8×+<Ñ+<×+@Ñ+@Ð'ÓA€KØ'×<Ñ<Ø¨Kð =ó Ðô ×,Ñ,Ó.×5Ñ5€Nà$×(Ñ(Ð);¸RÓ@×DÑDØ˜ó€Lô ñ à×!Ñ!Ð"8¸"Ó=ôó Ðð 	×Ñ˜Y¨Ó+ß	‰ˆ]˜BÓ	ß	‰ˆ\˜4Ó	 ð ñ ð	=Ü$×4Ñ4°[ÓAˆOô %×4Ñ4°^ÓDˆOØ×"Ñ" _×%8Ñ%8Ò8Ü ×?Ñ?Ø+×3Ñ3Ø$3×$CÑ$Côð ô
 �K‰KÜ—‘×1Ñ1Ø'×/Ñ/Ø /× ?Ñ ?õô
 *×/Ñ/°Ô<à×ÑÐ.Ô/ðÙ3°CÔ8ô
 ×Ñ×%Ñ%Ô'Ø"×&Ñ&Ð'9¸2Ó>×BÑBØ”V×*Ñ*¨3Ó/ó€Jô ×Ñ˜*Ô%áÜ!)×!IÑ!IØÐ#×0Ñ0Ó2ó"
Ðô 	!ØØ#9Ø+Ø#Øõ	
ô ×Ñœ~¸+ÔFÔGÙ˜ÔÜ	‡K�K…Møô] ×7Ñ7ò 	ò ð	ûô, ×;Ñ;ò Ø×!Ñ!Ô#Øˆûðús*   Ä8K3 ÈL Ë3L
Ì	L
ÌL7Ì L2Ì2L7Úcloudc                 óB   — |j                  | «      }t        | ||¬«       y)a\  
    :raise ConnectivityError: On unexpected connectivity issues to contract
        server or inability to access identity doc from metadata service.
    :raise ContractAPIError: On unexpected errors when talking to the contract
        server.
    :raise NonAutoAttachImageError: If this cloud type does not have
        auto-attach support.
    )rS   rT   N)Úacquire_pro_tokenr‹   )r    rŒ   rT   rS   s       r,   Úauto_attachr�   ç   s    € ð ×#Ñ# CÓ(€EÜ�c °\ÖBr.   Ú )Úaccess_onlyr3   r0   Ú
extra_argsr2   r‘   r3   r’   c                óŠ  — t        j                  | ||||¬«      }|s=t        j                  t        j
                  j                  |j                  ¬«      «       |j                  t        j                  «       «      \  }}|r?|s=t        j                  t        j                  j                  |j                  ¬«      «       ||fS )zè
    Constructs an entitlement based on the name provided. Passes kwargs onto
    the entitlement constructor.
    :raise EntitlementNotFoundError: If no entitlement with the given name is
        found, then raises this error.
    )r    r2   r3   r‘   r’   )Útitle)r	   Úentitlement_factoryr:   Úinfor   ÚENABLING_TMPLrD   r”   Úenabler   ÚProgressWrapperÚENABLED_TMPL)	r    r2   r‘   r3   r0   r’   ÚentitlementrM   rN   s	            r,   r8   r8   ø   s    € ô ×2Ñ2ØØØØØô€Kñ Ü�
‰
”8×)Ñ)×0Ñ0°{×7HÑ7HÐ0ÓIÔJà!×(Ñ(¬×)<Ñ)<Ó)>Ó?�O€GˆVá‘vÜ�
‰
”8×(Ñ(×/Ñ/°k×6GÑ6GÐ/ÓHÔIà�Fˆ?Ðr.   )Úsimulate_with_tokenÚshow_allrœ   r�   c                ó~   — |rt        j                  | ||¬«      \  }}||fS t        j                  | |¬«      }d}||fS )z6
    Construct the current Pro status dictionary.
    )r    rS   r�   ©r    r�   r   )r*   Úsimulate_statusr   )r    rœ   r�   r   rJ   s        r,   r   r     sS   € ñ Ü×/Ñ/ØØ%Øô
‰ˆ�ð �3ˆ;Ðô ×!Ñ! c°HÔ=ˆØˆà�3ˆ;Ðr.   Úfilenamec                 óð  — g d¢}d}d}	 t        j                  |«      \  }}|rfg }|j                  d«      D ]*  }t        j                  ||«      sŒ|j                  |«       Œ, t        j                  | dj                  |«      «       yy# t        j                  $ rW}t        j                  dt        |«      «       t        j                  dj                  | «      t        |«      «       Y d}~yd}~ww xY w)z…
    Helper which gets ubuntu_pro apparmor logs from the kernel from the last
    day and writes them to the specified filename.
    )Ú
journalctlz-bz-kz--since=1 day agoz7apparmor=\".*(profile=\"ubuntu_pro_|name=\"ubuntu_pro_)Nú
z!Failed to collect kernel logs:
%sú{}-error)r   ÚsubpÚsplitÚreÚsearchr9   Ú
write_fileÚjoinr   ÚProcessExecutionErrorÚLOGÚwarningrE   rD   )r¡   ÚcmdÚapparmor_reÚkernel_logsÚ_Úapparmor_logsÚkernel_linerP   s           r,   Ú_write_apparmor_logs_to_filerµ   0  sØ   € ò :€CàL€KØ€KðBÜŸ™ SÓ)‰ˆ�Qñ
 ØˆMà*×0Ñ0°Ó6ò 6�Ü—9‘9˜[¨+Õ6Ø!×(Ñ(¨Õ5ð6ô ×Ñ˜h¨¯	©	°-Ó(@ÕAð øô	 ×+Ñ+ò ?Ü�‰Ð8¼#¸a»&ÔAÜ×Ñ˜*×+Ñ+¨HÓ5´s¸1³v×>Ñ>ûð?ús   ŠB ÂC5ÂAC0Ã0C5Úreturn_codesc                 ó>  — 	 t        j                  | j                  «       |¬«      \  }}t        j                  |dj	                  ||«      «       y# t
        j                  $ r8}t        j                  dj	                  |«      t        |«      «       Y d}~yd}~ww xY w)zCHelper which runs a command and writes output or error to filename.)Úrcszstdout:
{}

stderr:
{}r¥   N)r   r¦   r§   rª   rD   r   r¬   rE   )r¯   r¡   r¶   ÚoutÚerrrP   s         r,   Ú_write_command_output_to_filer»   I  s~   € ð
Ü—;‘;˜sŸy™y›{°Ô=‰ˆˆSô 	×ÑØÐ2×9Ñ9¸#¸sÓCõ	
øô ×+Ñ+ò ?Ü×Ñ˜*×+Ñ+¨HÓ5´s¸1³v×>Ñ>ûð?ús   ‚(A ÁBÁ$.BÂBc                 ó²   ‡ — ‰ j                   xs t        ‰ j                  t        j                  j
                  t        gˆ fd„t        j                  D «       ¢S )Nc              3   óŠ   •K  — | ]:  }t        |t        j                  j                  «      r |‰«      j                  –— Œ< y ­w©N)Ú
issubclassr	   ÚrepoÚRepoEntitlementÚ	repo_file)ra   Úentitlement_clsr    s     €r,   rb   z#_get_state_files.<locals>.<genexpr>^  s:   øè ø€ ò 

àÜ˜/¬<×+<Ñ+<×+LÑ+LÔMñ ˜CÓ ×*Õ*ñ

ùs   ƒA A)	Úcfg_pathr   Úlog_filer   Úua_fileÚpathr   r	   ÚENTITLEMENT_CLASSESr'   s   `r,   Ú_get_state_filesrÉ   W  sM   ø€ ð 	�‰Ò+Ô+Ø�‰Ü×%Ñ%×*Ñ*Üð	
ó


ä#/×#CÑ#Cô

ð
ð 
r.   Ú
output_dirc                 óv	  — t        ddj                  |«      «       t        dj                  t        j                  «      dj                  |«      «       t        ddj                  |«      «       t        ddj                  |«      «       t        d	j                  d
j	                  t
        D �cg c]  }d|v sŒdj                  |«      ‘Œ c}«      «      dj                  |«      «       t
        D ]1  }t        dj                  |«      dj                  ||«      ddg¬«       Œ3 t        | d¬«      \  }}t        j                  dj                  |«      t        j                  |t        j                  ¬«      «       t        j                  «       }t        j                  dj                  |«      t        j                  |«      «       t        | «      }t        j                  «       rt!        j"                  «       dt$         nt!        j&                  «       g}t)        |«      D ]§  \  }	}
t*        j,                  j/                  |
«      rt0        j3                  d|
«       Œ<	 t        j4                  t        j6                  |
«      «      }t        j                  t*        j,                  j	                  |dj                  |	«      «      |«       Œ© |t=        j<                  t>        dz   «      z   D ]È  }t*        j,                  jA                  |«      sŒ#	 t        j6                  |«      }t        j4                  |«      }t        j                  «       rt        j                  ||«       t        j                  t*        j,                  j	                  |t*        j,                  jC                  |«      «      |«       ŒÊ tE        dj                  |«      «       tF        D ]9  }t*        j,                  jA                  |«      sŒ#	 tI        jJ                  ||«       Œ; yc c}w # t8        $ r+}t0        j3                  d|
t;        |«      «       Y d}~�Œ%d}~ww xY w# t8        $ r+}t0        j3                  d|t;        |«      «       Y d}~�Œ“d}~ww xY w# t8        $ r*}t0        j3                  d|t;        |«      «       Y d}~ŒÞd}~ww xY w) zG
    Write all relevant Ubuntu Pro logs to the specified directory
    zcloud-idz{}/cloud-id.txtz	{} statusz{}/livepatch-status.txtzsystemctl list-timers --allz{}/systemd-timers.txtzujournalctl --boot=0 -o short-precise -u cloud-init-local.service -u cloud-init-config.service -u cloud-config.servicez{}/cloud-init-journal.txtzjournalctl -o short-precise {}ú z.servicez-u {}z{}/pro-journal.txtzsystemctl status {}z	{}/{}.txtr   é   )r¶   FrŸ   z{}/pro-status.json)Úclsz{}/environment_vars.jsonNz$Skipping symlinked user log file: %sz
user{}.logz&Failed to collect user log file: %s
%sÚ*zFailed to load file: %s
%sz{}/apparmor_logs.txtzFailed to copy file: %s
%s)&r»   rD   r   ÚLIVEPATCH_CMDr«   ÚUA_SERVICESr   r   rª   ÚjsonÚdumpsr   ÚDatetimeAwareJSONEncoderÚget_pro_environmentrÉ   Úwe_are_currently_rootrF   Úget_all_user_log_filesÚUSER_LOG_COLLECTED_LIMITÚget_user_log_fileÚ	enumerateÚosrÇ   Úislinkr­   r®   Úredact_sensitive_logsÚ	load_filer?   rE   Úglobr   ÚisfileÚbasenamerµ   r   ÚshutilÚcopy)r    rÊ   Úsr4   Ú
pro_statusr²   Úenv_varsÚstate_filesÚuser_log_filesÚlog_file_idxrÅ   ÚcontentrP   Úfs                 r,   Úcollect_logsrì   f  sÙ  € ô "ØÐ%×,Ñ,¨ZÓ8ôô "Ø×Ñœ9×2Ñ2Ó3Ø!×(Ñ(¨Ó4ôô "Ø%Ø×&Ñ& zÓ2ôô "ð&ð
 	$×*Ñ*¨:Ó6ôô "Ø	,×4Ñ4Ø�H‰HÜ,7ÖK q¸:Èº?�—‘ Õ"ÒKóó	
ð
 	×#Ñ# JÓ/ôô ò 
ˆÜ%Ø!×(Ñ(¨Ó1Ø×Ñ˜z¨7Ó3Ø˜Q˜ö	
ð
ô ˜s¨UÔ3�M€J�Ü
×ÑØ×#Ñ# JÓ/Ü�
‰
�:¤4×#@Ñ#@ÔAôô ×'Ñ'Ó)€HÜ
×ÑØ"×)Ñ)¨*Ó5Ü�
‰
�8Óôô
 # 3Ó'€Kô ×%Ñ%Ô'ô 	×&Ñ&Ó(Ð)BÔ*BÑCä×'Ñ'Ó)Ð*ð ô #,¨NÓ";ò Ñˆ�hä�7‰7�>‰>˜(Ô#Ü�K‰KÐ>ÀÔIØð		Ü×0Ñ0´×1AÑ1AÀ(Ó1KÓLˆGÜ×ÑÜ—‘—‘˜Z¨×)<Ñ)<¸\Ó)JÓKØõðð" œ4Ÿ9™9Ô%7¸#Ñ%=Ó>Ñ>ò ˆÜ�7‰7�>‰>˜!ÕðÜ ×*Ñ*¨1Ó-�ô ×0Ñ0°Ó9ˆGÜ×)Ñ)Ô+ä×!Ñ! ! WÔ-ä×ÑÜ—‘—‘˜Z¬¯©×)9Ñ)9¸!Ó)<Ó=¸wõðô( !Ð!7×!>Ñ!>¸zÓ!JÔKô ò ˆÜ�7‰7�>‰>˜!ÕðÜ—‘˜A˜zÕ*ñùòK LøôP ò 	Ü�K‰KØ9¸8ÄSÈÃV÷ò ûð	ûô ò ô —‘Ð9¸1¼cÀ!»fÔEÝûðûô. ò Ü—‘Ð9¸1¼cÀ!»fÔEÜûðúsU   Â-	PÂ7PÉA+PÌQÏ9RÐ	QÐ  QÑQÑ	RÑ Q=Ñ=RÒ	R8Ò R3Ò3R8)F)Tr¾   )Brn   rß   rÒ   ÚloggingrÛ   r¨   râ   Útypingr   r   Úuaclientr   r   r   r   r	   r
   r   r   r   rF   r   r   r   r*   r   r   r   Úuaclient.defaultsr   r   r   r   Úuaclient.filesr   r   Úuaclient.files.state_filesr   r   r   r   r   Úget_event_loggerr:   Ú	getLoggerÚreplace_top_level_logger_nameÚ__name__r­   rÑ   rØ   ÚUAConfigrm   r-   ÚEnableByDefaultServiceÚboolrR   rE   r‹   ÚAutoAttachInstancer�   r8   rµ   Úintr»   rÉ   rì   © r.   r,   ú<module>rý      s…  ðÛ Û Û Û Û 	Û 	Û ß !÷	÷ 	ó 	õ $ß -Ý (ß (Ñ (÷ó ÷ 2÷õ ð 	&ˆ×%Ñ%Ó'€Ø€g×ÑÐ:˜×:Ñ:¸8ÓDÓE€ð	€ð Ð ð
,Ø	�‰ð
,à×.Ñ.ð
,ð ×"Ñ"ó
,ð$ ñ?Ø	�‰ð?à  ×!@Ñ!@ÑAð?ð ×.Ñ.ð?ð ×"Ñ"ð	?ð
 ó?ðL ñ	\Ø	�‰ð\àð\ð ð\ð ð	\ð
 
ó\ðD ñCØ	�‰ðCà×$Ñ$ðCð 
ó	Cð* ØØØ&*òØ	�‰ðà
ðð ð	ð
 ðð ðð ˜˜c™Ñ#óðJ *.Øò	Ø	�‰ðð " #™ðð ó	ð,B¨3ð B°4ó Bð4 =Añ
Øð
Ø&.¨t°C©yÑ&9ð
à	ó
ð˜&Ÿ/™/ó ðf�f—o‘oð f°3ô fr.   