o Hcf(@sddlZddlZddlZddlmZddlmZmZmZddlm Z m Z m Z m Z m Z mZddlmZe ZeeeZGdddZGdd d ZGd d d eZGd d d ZdS)N)datetime)AnyDictOptional)defaults event_logger exceptionssecret_managersystemutil)PublicMachineTokenDatac@seZdZejdfdededefddZedefdd Z edefd d Z ed d Z defddZ de efddZddZdS)UAFileTname directoryprivatecCs*||_||_||_tj|j|j|_dSN) _directory _file_name _is_privateospathjoin_path)selfrrrr6/usr/lib/python3/dist-packages/uaclient/files/files.py__init__szUAFile.__init__returncC|jSr)rrrrrr!z UAFile.pathcCrr)rrrrr is_private%r zUAFile.is_privatecCstj|jSr)rrexistsrrrr is_present)szUAFile.is_presentcontentcCsp|jrtjntj}ztj|jtjkrtj |jddnt |jWn t y-Ynwt |j||dS)Ni)mode) r!rROOT_READABLE_MODEWORLD_READABLE_MODErrbasenamerPRIVATE_SUBDIRmakedirsOSErrorr write_file)rr$ file_moderrrwrite-s  z UAFile.writecCs:d}z t|j}W|Stytd|jY|Sw)Nz(Tried to load %s but file does not exist)r load_filerFileNotFoundErrorLOGdebugrr$rrrread>s z UAFile.readcCst|jdSr)r ensure_file_absentrrrrrdeleteFsz UAFile.deleteN)__name__ __module__ __qualname__rDEFAULT_DATA_DIRstrboolrpropertyrr!r#r.rr4r6rrrrr s&    r c@s^eZdZdefddZdeeeffddZde eeeffdd Z d d Z e d d Z dS) ProJSONFilepro_filecCs ||_dSrr?)rr?rrrrKs zProJSONFile.__init__r$cCs|jjtj|tjdddS)Ncls)r$)r?r.jsondumpsr DatetimeAwareJSONEncoderr3rrrr.Qs zProJSONFile.writerc CsZ|j}|r+z tj|tjdWStjy*}z tj|jj dt |dd}~wwdS)NrA )sourceout) r?r4rCloadsr DatetimeAwareJSONDecoderJSONDecodeErrorr InvalidJsonrr;)rr$errrr4Vs zProJSONFile.readcCs |jSr)r?r6rrrrr6cs zProJSONFile.deletecCs|jjSr)r?r#rrrrr#fszProJSONFile.is_presentN)r7r8r9r rrr;rr.rr4r6r=r#rrrrr>Js  r>cs"eZdZdeffdd ZZS) UserCacheFilercstj|tdddS)NF)rr)superrr get_user_cache_dir)rr __class__rrrls  zUserCacheFile.__init__)r7r8r9r;r __classcell__rrrQrrNksrNc@s(eZdZejdfdedeefddZdeee ffddZ d d Z d ee fd d Z eddZeddZddZed ee fddZeddZedefddZed eefddZeddZed eefdd Zed-d"d#Zed-d$d%Zed.d'd(Zed)d*Zed+d,ZdS)/MachineTokenFileNrmachine_token_overlay_pathcCsTtj}tt|tj|tjd|_tt||dd|_ ||_ d|_ d|_ d|_ dS)Nr@F)rMACHINE_TOKEN_FILEr>r rrrr) private_file public_filerU_machine_token _entitlements_contract_expiry_datetime)rrrU file_namerrrrss  zMachineTokenFile.__init__private_contentcCsPtr$|j|t|jdd}|j|d|_d|_ d|_ dSt )z8Update the machine_token file for both pub/private filesF) keep_noneN) r we_are_currently_rootrWr.r from_dictto_dictrXrYrZr[rNonRootUserError)rr]public_contentrrrr.s   zMachineTokenFile.writecCs:tr|j|jd|_d|_d|_dSt )z!Delete both pub and private filesN) r r_rXr6rWrYrZr[rrbrrrrr6s   zMachineTokenFile.deletercCs`tr|j}n|j}|}|r.tj|dd|dgD] }tj|ddq!|S)N machineTokenresourceTokenstoken) r r_rWrXr4r secrets add_secretget)r file_handlerr$rgrrrr4szMachineTokenFile.readcCs tr |jjo |jjS|jjSr)r r_rXr#rWrrrrr#szMachineTokenFile.is_presentcCsB|js|}|r|jr||j}|rtj||d||_|jS)zAReturn the machine-token if cached in the machine token response.) base_dict overlay_dict)rYr4rUparse_machine_token_overlayr depth_first_merge_overlay_dict)rr$machine_token_overlayrrr machine_tokens zMachineTokenFile.machine_tokencCst|}tj|tjdS)NrA)r r/rCrIr rJ)rrUmachine_token_overlay_contentrrrrnsz,MachineTokenFile.parse_machine_token_overlaycCst|jr |jddSdS)NmachineTokenInfo accountInfor<rqrrrraccounts zMachineTokenFile.accountcCs*|jr|jS|js iS||j|_|jS)z9Return configured entitlements keyed by entitlement named)rZrqget_entitlements_from_tokenrrrr entitlementsszMachineTokenFile.entitlementsrqc Csddlm}|s iSi}|did}|siStdd|dgD}tdd|d gD}|D]\}}d |i}||vrI|||d <|||||<q7|S) zReturn a dictionary of entitlements keyed by entitlement name. Return an empty dict if no entitlements are present. r)apply_contract_overridesrs contractInfocss$|] }|d|dfVqdS)typergNrj.0rMrrr s  z?MachineTokenFile.get_entitlements_from_token..rfcss|] }|d|fVqdS)r{Nr|r}rrrrs  resourceEntitlements entitlement resourceToken)uaclient.contractryrjdictitems) rqryrxrztokens_by_name ent_by_nameentitlement_name ent_valueentitlement_cfgrrrrws0     z,MachineTokenFile.get_entitlements_from_tokencCs,|js|jdididd|_|jS)z6Return a datetime of the attached contract expiration.rsrz effectiveToN)r[rqrjrrrrcontract_expiry_datetimes  z)MachineTokenFile.contract_expiry_datetimecCs t|jS)zrNrTrrrrs   5!