a ƒ¬ i,ã@sìddlZddlZddlZddlZddlZddlZddlZddlmZddl m Z m Z m Z m Z mZmZmZddlmZGdd„deƒZejejddd „ƒZd d „Zd d „Zejejddd„ƒZejejdddd„ƒZ e!dkrèeiƒdS)éN)ÚNamedTemporaryFile)ÚauthÚconfigÚ http_utilsÚ ipv6_supportÚkcareÚ log_utilsÚutils)Ú run_commandc@s„eZdZdZdd„Zedd„ƒZdd„Zdd d „Zd d „Z dd„Z dd„Z dd„Z dd„Z dd„Zejejddd„ƒZdd„ZdS)Ú DataPackagez!based on DataPackage from eportalcCsd|_g|_d|_dS)Nr)Ú_tarÚ_errors_bufferÚ_total_payload_size©Úself©rú-/usr/libexec/kcare/python/kcarectl/anomaly.pyÚ__init__szDataPackage.__init__cCs| ¡}t|jƒS©N)Ú_ensure_tar_createdÚstrÚname)rÚtarrrrÚ archive_path szDataPackage.archive_pathc CsŽd}d}ztt |¡ddd\}}}Wn,tyR}zt|ƒ}WYd}~n d}~00|rj| d ||¡¡|durŠ|j|tj |ddddS)NT)Ú catch_stdoutÚ catch_stderrz!failed to dump stdout of {0}: {1}úutf-8©Úencoding©Ú data_bytes) r ÚshlexÚsplitÚ ExceptionrÚ log_errorÚformatÚadd_filer Úbstr)rÚarcnameÚcmdÚstdoutÚstderrÚ_ÚerrrÚ add_stdout&szDataPackage.add_stdoutNFc Cs(|dur|durtdƒ‚| ¡}d}|durZtj |¡sL| d |¡¡dStj |¡}nt|ƒ}|  |¡s€| d |¡¡dS|s¢|  |¡s¢| d |¡¡dSzH|r¸|j ||dn"t   |¡}||_| |t |¡¡|j|7_Wn8ty"}z| d ||¡¡WYd}~n d}~00dS)Nz"No src_path or data_bytes providedrzfile not found: {0}z no available space to store: {0}z)skip due to total payload size limit: {0})r(zfailed to store {0}: {1})Ú ValueErrorrÚosÚpathÚexistsr$r%ÚgetsizeÚlenÚ_check_required_spaceÚ_check_total_payload_limitÚaddÚtarfileZTarInfoÚsizeZaddfileÚioÚBytesIOrr#) rr(Úsrc_pathr Úskip_limit_checkrÚ entry_sizeÚinfor-rrrr&6s2   zDataPackage.add_filec Cshztjtj|dddd}Wn8tyT}z | d ||¡¡WYd}~dSd}~00|j||ddS)Né)Úindentrrzfailed to dump {0}: {1}r)r r'ÚjsonÚdumpsÚ TypeErrorr$r%r&)rr(Údatar r-rrrÚadd_jsonZs zDataPackage.add_jsoncCst |j¡}|j|j|kSr)r0ÚstatvfsrÚf_frsizeÚf_bfree)rr>rGrrrr5ds z!DataPackage._check_required_spacecCstj|j|kSr)rZ$KERNEL_ANOMALY_REPORT_MAX_SIZE_BYTESr)rr>rrrr6jsz&DataPackage._check_total_payload_limitcCs&| ¡}tj|dd|j |¡dS)NF©Ú print_msg)ÚstriprÚlogerrorr Úappend)rZ error_msgrrrr$oszDataPackage.log_errorc CsÀdD]¬}td |dd…¡dd}| ¡z2tjd |j¡ddtj|j|d|_|WSt y®}z:t j   |j¡r†t   |j¡d|_t|tjƒsš‚WYd}~qd}~00qt d ¡‚dS) N)zw:xzzw:bz2zw:gzz.tar.{0}éF)ÚsuffixÚdeletezCreating DataPackage: {0}rJ)rÚmodez%No supported compression method found)rr%ÚcloserÚloginforr8Úopenr r#r0r1r2ÚunlinkÚ isinstanceZCompressionError)rZcompression_modeZtmpfileÚerrrrrÚ __enter__us   zDataPackage.__enter__cCsP|jr,d |j¡d}|jdt |¡dd|jrL|j ¡|rL| ¡dSdS)NÚ z errors.logT)r r=F)r Újoinr&r r'r rSÚremove_archive)rÚexc_typeZexc_valZexc_tbÚerrorsrrrÚ__exit__ˆs zDataPackage.__exit__©ÚloggercCs$|jr tj |j¡r t |j¡dSr)r r0r1r2rrVrrrrr\–szDataPackage.remove_archivecCs|jstdƒ‚|jS)Nz/DataPackage should be used as a context manager)r Ú RuntimeErrorrrrrrœszDataPackage._ensure_tar_created)NNF)Ú__name__Ú __module__Ú __qualname__Ú__doc__rÚpropertyrr.r&rFr5r6r$rYr_r Ú catch_errorsrÚlogwarnr\rrrrrr s  $   r r`cCsftj |j¡}d|vr(|| d¡d…nd}tt ¡ƒ|}t  ¡d|}t j |j|t   ¡d|S)z›Send the DataPackage archive to the patch server. :param data_package: DataPackage instance to send :return: Upload name (package identifier) Ú.NÚz/upload/kernel-anomaly/)Ú upload_urlZ auth_string)r0r1ÚbasenamerÚfindrÚuuidZuuid4rÚget_patch_serverrZ upload_filerÚget_http_auth_string)Ú data_packagermÚextÚ upload_namerlrrrÚsend_data_package£s ýrucCsddtt ¡ƒdœS)Nézkernel-anomaly)Zschema_versionÚtypeZ time_created)ÚintÚtimerrrrÚmake_manifest_json»s ýrzcCsRt ¡}t |¡D]:\}}||dkr*qNd || dd¡¡}|j||dqdS)zZadds recent files for the last hour to the given data package starting from the newest oneiz{0}/{1}ú/r,©r<N)ryrZsort_files_by_ctimer%Úreplacer&)ÚfilesrrZarchive_prefixÚnowr1Úctimer(rrrÚcopy_recent_filesÄs  rc Cs:tƒ}|tj d¡r&| dd¡tj d¡r>| dd¡| dd¡| d d ¡| d d ¡tj d ¡sztj d ¡r€d}n$tj d¡r d}|jdddnd}| d|¡tdƒ(}|jdt |  ¡¡dWdƒn1sæ0Ytdƒ(}|jdt |  ¡¡dWdƒn1s(0Y|jddd|  d|¡|  dt ƒ¡|jdd d| d!d"  t  ¡¡¡ztt  ¡|d#ƒWn6tyÈ}z| d$  |¡¡WYd}~n d}~00ztt  ¡|d%ƒWn6ty}z| d&  |¡¡WYd}~n d}~00Wdƒn1s,0Y|S)'Nz/var/log/messagesÚmessagesztail -n10000 /var/log/messagesz/var/log/syslogZsyslogztail -n10000 /var/log/syslogz kcarectl.logz"tail -n10000 /var/log/kcarectl.logZdmesgZls_var_cache_kcarezls -lR /var/cache/kcare/z /usr/bin/rpmz/bin/rpmzFrpm -q -a --queryformat="%{N}|%{V}-%{R}|%{arch}|%{INSTALLTIME:date}\n"z /usr/bin/dpkgzJ/usr/bin/dpkg-query -W -f "${binary:Package}|${Version}|${Architecture}\n"zdpkg.logz/var/log/dpkg.logr|zecho "unknown package manager"z packages.listz /proc/versionZ proc_versionrz /proc/modulesZ proc_modulesz kcare.confz/etc/sysconfig/kcare/kcare.confzserver_info.jsonz manifest.jsonz kdump.confz/etc/kdump.confZls_kdumpz ls -lR {0}Zkdumpzfailed to copy kdumps: {0}Z crashreporterz+failed to copy crashreporter artifacts: {0})r r0r1r2r.r&rUr r'ÚreadrFrzr%rZget_kdump_rootrZlist_kdump_txt_filesr#r$Zlist_crashreporter_log_files)Ú server_inforrZ packages_cmdÚfr-rrrÚprepare_kernel_anomaly_reportÑsD          6 8 &Fr†F)raZdefault_returnc Cs|d}t|dƒ}t| d¡p"dƒ}t|dƒ}|d}zt|ddƒ}Wntttfyjd}Yn0||||||g}t|ƒsˆd Sd }d } d } |d kr¨|d kr¨d }|||krÈ||d krØnn |dkrØd } ||kräd } || | g} t| ƒr t d |¡¡d Sd S)z3taken from eportal - anomalies::detect_agent_rebootÚreasonÚuptimeÚ patch_levelz-1Ú last_stopÚtsÚstaterFi,éÿÿÿÿTiÚupdatezAgent anomaly detected: {0}) rxÚgetÚKeyErrorrDr/ÚallrrTr%) r„r‡rˆr‰rŠr‹Zstate_tsÚfieldsZ first_update_after_reboot_markerZcrash_soon_after_update_markerZno_proper_shutdown_markerÚmarkersrrrÚdetect_anomalys:   ,ý r”Ú__main__)"r:rBr0r!r8ryroÚtempfilerÚkcarectlrrrrrrr Zkcarectl.process_utilsr ÚAnyÚDictÚListÚOptionalZSelfÚobjectr rhrirurzrr†r”rcrrrrÚs* $      5 ,