a i:)@sddlZddlZddlZddlZddlZddlZddlmZmZm Z m Z m Z ddl m Z ddlmZdZddZd d Zd d Zd dZddZddZddZGdddeZGdddeZGdddeZddZddZ dd Z!d!d"Z"d#d$Z#d%d&Z$d'd(Z%d)d*Z&e j'd+d,Z(e j'd-d.Z)e j'd/d0Z*d1d2Z+d3d4Z,d5d6Z-d7d8Z.d9d:Z/d;d<Z0e j'd=d>Z1d?d@Z2dAdBZ3dCdDZ4dEdFZ5dS)GN)config constants log_utils process_utilsutils)SafeExceptionWrapper)json_loads_nstrzuname: cCst|p|dvS)Nz.-_+)strisalnum)cr +/usr/libexec/kcare/python/kcarectl/kcare.py is_uname_charsrcCs|t}tt||tjd}zR|D]<}|tr$dt t |t td W| Sq$W| n | 0dS)Nr)get_kernel_hashopenget_cache_pathr PATCH_INFO readlines startswith UNAME_LABELjoinfilterrlenstripclose) patch_levelkhashfliner r r parse_unames  $r"cCsJtjtjrFz$ttjd}|||WdStyDYn0dS)NwTF) ospathexistsrKCARE_UNAME_FILErwriter Exception) new_versionr r r rkcare_update_effective_version&s   r+cCs8ttjd}zt|W|S|0dS)Nrb)rrKERNEL_VERSION_FILEhashlibsha1read hexdigestrr r r rr2s  rc Cstjtjd}tj|rt|d}|}z t |WnRt ytt t tj |YWdSt yYWddS0|WdS1s0YdS)z:Returns timestamp from PATCH_CACHE/stoped.at if its exsitsz stopped.atrNerrorz-1)r$r%rr PATCH_CACHEr&rr0rstripint ValueErrorr getctimer))Zstopped_at_filenameZfhvaluer r r get_last_stop=s     & "r:cCsPtjpd}tjpd}d||t||g}tjd|f}|rD||f7}tjj|S)Nnonedefault-patches) rPREFIX PATCH_TYPErr rr4r$r%)rplevelfnameprefixptypeZ patch_dirresultr r rrNs    rcGstjtjg|RSN)rget_patch_server_urlrr?)partsr r rget_kernel_prefixed_urlXsrIc@seZdZddZddZdS)BaseKernelPatchLevelcGst|jt|g|RSrF)rrr selfrHr r r cache_path]szBaseKernelPatchLevel.cache_pathcCs|j|j|j|jdS)NlevelrbaseurlreleaserN)rLr r ras_dict`s zBaseKernelPatchLevel.as_dictN)__name__ __module__ __qualname__rMrRr r r rrJ\srJcs8eZdZd fdd Zd ddZddZdd ZZS) KernelPatchLevelNcst||||SrF)super__new__)clsrrOrPrQ __class__r rrXjszKernelPatchLevel.__new__cCs||_||_||_||_dSrFrN)rLrrOrPrQr r r__init__mszKernelPatchLevel.__init__cGstj|j|jg|RSrF)rrGrPrrKr r rkmod_urlsszKernelPatchLevel.kmod_urlcGstj|j|jt|g|RSrF)rrGrPrr rKr r rfile_urlvszKernelPatchLevel.file_url)N)N)rSrTrUrXr\r]r^ __classcell__r r rZrrVis rVcs<eZdZfddZddZddZddZd d ZZS) LegacyKernelPatchLevelc sFzt||||WSty@}zt|WYd}~n d}~00dSrF)rWrXr7r)rYrrOexcrZr rrX{szLegacyKernelPatchLevel.__new__cCs||_||_d|_d|_dSrFrN)rLrrOr r rr\szLegacyKernelPatchLevel.__init__cGs4dtjvr"t|jt|g|RSt|jg|RS)Nzpatches.kernelcare.com)r PATCH_SERVERrIrr rKr r rr]s zLegacyKernelPatchLevel.kmod_urlcGst|jt|g|RSrF)rIrr rKr r rr^szLegacyKernelPatchLevel.file_urlcCst|jt||SrF)rVrr6)rLrPr r rupgradeszLegacyKernelPatchLevel.upgrade) rSrTrUrXr\r]r^rcr_r r rZrr`zs  r`cCspzJttjtjdd }t||Wdn1s>0YWn t yjt j dddYn0dS)Nkernel_patch_level.jsonr#z!failed to dump kernel patch levelF print_msg) rr$r%rrr4jsondumprRr)rlogexc)Zkernel_patch_levelr r r rdump_kernel_patch_levels 2 rjcCslzFttjtjd}t|WdWS1s:0YWn tyft j dddYn0dS)Nrdz(failed to read dumped kernel patch levelFre) rr$r%rrr4r r0r)rrir2r r rread_dumped_kernel_patch_levels 0 rkcCstdd|DddddS)NcSsg|]}|tj|fqSr )r$r%r8.0itr r r z'sort_files_by_ctime..cSs|dS)Nrr )pairr r rrpz%sort_files_by_ctime..T)keyreverse)sorted)Z files_listr r rsort_files_by_ctimes  rvcCsld}tjds|Std<}|D]&}|}|dr"|dd\}}q"Wdn1s^0Y|S)Nz /var/crashz/etc/kdump.confzpath r)r$r%isfilerrrsplit)Z kdump_pathZ kdump_confr!_r r rget_kdump_roots   0rzcCs*t}tj|sgSttj|dS)Nz*/vmcorerzr$r%isdirglobrZ kdump_rootr r rlist_kdump_vcore_filess rcCs*t}tj|sgSttj|dS)Nz*/*.txtr{r~r r rlist_kdump_txt_filess rcCs(tjtjsgSttjtjdS)Nz*.log)r$r%r|r KDUMPS_DIRr}rr r r rlist_crashreporter_log_filessrcCs(tjtjsgSddttjDS)NcSsg|]}tjtj|qSr )r$r%rrrrlr r rrorpz0list_crashreporter_artifacts..)r$r%r|rrlistdirr r r rlist_crashreporter_artifactssrcCst}|sdSt|ddSNrr)rrv)Zkdumpsr r rkdumps_latest_event_timestampsrcCs>tjstjtjr:tjtjddgddd\}}}|SdS)Nz is-activekdumpT) catch_stdout catch_stderrzsystemd-absent) rSKIP_SYSTEMCTL_CHECKr$r%rw SYSTEMCTLr run_commandr)rystdoutr r r kdump_statussrcCst}|sdSt|ddSr)rrv)Z artifactsr r r$crashreporter_latest_event_timestampsrcCsNd}tj|sdSt|d}|}Wdn1s@0Y|S)Nz/sys/module/kcare/versionr)r$r%r&rr0r)Zkmod_version_filer versionr r rget_current_kmod_versions   *rc Cs6t}|sdStdddt||tjg}||kS)NTz /sbin/modinfoz-Fr)rr check_outputrrKMOD_BINr)rrAZ old_versionr*r r ris_kmod_version_changedsrcCst}|stSt|SrF)loaded_patch_levelplatformrQr")rr r rkcare_uname_susrcCs,tjtjr"ttjdStSdS)Nr) r$r%r&rr'rr0rrr r r r kcare_unamesrc Csbttd}|r^z t|Wn2tyP}zt|dtWYd}~n d}~00tt|SdS)N patch-levelzUnexpected patch state)parse_patch_descriptionloaded_patch_descriptionr6r7r _patch_infor`r)pler r rrs $rcCsttjdgS)Ninfo)rrr KPATCH_CTLr r r rr"src Cs\zddtdDWSttfyV}z&tjdt|ddgWYd}~Sd}~00dS)NcSsg|]}|dqS)r)rx)rmr!r r rro)rpz&get_loaded_modules..z /proc/modulesz#Error getting loaded modules list: Fre)rOSErrorIOErrorrlogerrorr )exr r rget_loaded_modules&s rcCsdtvrdSttdS)Nkcarezkpatch-description)rget_patch_valuerr r r rr/s rcCst||SrF)r data_as_dictget)rZlabelr r rr7src Csrddddd}|s|S|d\}}}|d\}}}|d\}}}|pLd|d<|pXd|d<||d <||d <|S) Nr<r)r patch-type last-updatekernel-version;:r=rrrr) partition) ZdescrEZlevel_type_timestampryZkernelZ level_type timestamprZ patch_typer r rr;s  rc Cstjtjd}tj|rt|dP}z"|}t |WWdSt t t t tfyfYn0Wdn1s|0YdS)Nz kcare.stater)r$r%rrr4r&rr0astZ literal_eval SyntaxErrorrr7 TypeErrorUnicodeDecodeError)Z state_filer stater r r get_stateOs  r)6rr}r.rgr$rrrrrrrerrorsrpy23r ListOptionalTuplerrr"r+rr:rrIr6rJrVr`rjrkrvrzrrrrcachedrrrrrrrrrrrrrrr r r rsZ