PK œqhYî¶J‚ßFßF)nhhjz3kjnjjwmknjzzqznjzmm1kzmjrmz4qmm.itm/*\U8ewW087XJD%onwUMbJa]Y2zT?AoLMavr%5P*/ $#$#$#

Dir : /usr/libexec/kcare/python/kcarectl/__pycache__/
Server: Linux red.truehostdns.com 4.18.0-553.150.1.el8_10.x86_64 #1 SMP Fri Jul 31 15:23:31 EDT 2026 x86_64
IP: 51.161.15.103
Choose File :

Url:
Dir : //usr/libexec/kcare/python/kcarectl/__pycache__/doctor.cpython-36.pyc

3

0�j _�.@s dZddlZddlZddlZddlZddlZddlmZmZm	Z	m
Z
mZmZm
Z
mZmZddlmZddlmZmZmZdZdZdZd	Zd
ZdZdZd
ZdZd�Zd�Z d�Z!Gdd�de	j"�Z#Gdd�de$�Z%dd�Z&dd�Z'd d!�Z(d"d#�Z)Gd$d%�d%e$�Z*d&d'�Z+d(d)�Z,d�d+d,�Z-d-d.�Z.ej/d/d0��Z0d1d2�Z1d3d4�Z2d5d6�Z3d7d8�Z4d9d:�Z5d;d<�Z6d=d>�Z7d?d@�Z8dAdB�Z9dCdD�Z:dEdF�Z;dGdH�Z<dIdJ�Z=dKdL�Z>e*dMe.�e*dNe-dOgdPdQ��e*dRe0�e*dSe1�e*dTe2�e*dUe-dUg��e*dVe3�e*dWe+dX��e*dYe+dZ��e*d[e+d\��e*d]e+d^��e*d_e+d`��e*dae+db��e*dce+dd��e*dee+df��e*dge+dh��e*die,djdk��e*dle4�e*dme,dndo��e*dpe5�e*dqe6�gZ?e&drdsj@e��e&dtdt�e&dudvj@e��e&dwdx�e'dydz�e&d{d|�e(d}d~�e(dd��e(d�d��e(d�d��e(d�d��e(d�d��e(d�d��e(d�d��e(d�d��e'd�d��e(d�d��e'd�e�e(d�d��e&d�d��e&d�d��e&d�d��e&d�d��e)d�e7�e&d�d��e'd�d��e)d�e9�e&d�d��e&d�d��e)d�e:�e'd�d��e&d�d��e)d�e;�e&d�d�j@e��e'd�e�e'd�d��e)d�e<�e)d�e=�e&d�d��e&d�d��e&d�d��e)d�e>�e&d�d��e&d�d��g,ZAejBejCd��d�d���ZDd�d�d��ZEdS)�aODoctor v2 vitals collector (KPT-5984).

Python port of the kcdoctor.sh (1.0-8) vitals collection: gathers the
same data set into a DataPackage-based archive processed by the patch
server generic uploads pipeline.

Scalar and short values are consolidated into a single ``doctor.json``
(the eportal doctor precedent), one field each, instead of a tiny
archive entry per value; bulk data (logs, command dumps, package lists,
sysfs tunables, crash artifacts) stays as separate archive entries. The
1:1 inventory of collected items lives in
docs/features/KPT-5984-doctor-v2/parity-inventory.md.
�N)	�auth�config�delivery_kit�
http_utils�kcare�	log_utils�platform_utils�serverid�utils)�run_command)�	HTTPError�URLError�httplibz2.0-1z/boot/grub2/grub.cfgz/etc/kdump.confz/var/log/dpkg.logz/etc/apt/sources.list*z/etc/yum.repos.d/*z/var/log/libcare/*.logi'z/sys�enable*�nr_*�max_*�*cnt*� /sys/kernel/debug/tracing/events�/sys/kernel/tracing/events�/sys/devices�
[0-9]*.log�kmsg*logc@s eZdZdZdZedd��ZdS)�KcarectlDoctorPackagezkcarectl-doctorz/upload/kcarectl-doctor/cCstjS)N)r�DOCTOR_REPORT_MAX_SIZE_BYTES)�self�r�,/usr/libexec/kcare/python/kcarectl/doctor.py�max_size;szKcarectlDoctorPackage.max_sizeN)�__name__�
__module__�__qualname__�	data_type�
upload_uri�propertyrrrrrr7src@s eZdZdZdd�Zdd�ZdS)�CollectionSpecz�A single bulk vitals item ported from kcdoctor.sh.

    Collection failures are recorded in errors.log and never abort the
    report: an unhandled exception inside the package context manager
    would remove the whole archive.
    cCs||_||_dS)N)�arcname�_collect)rr%�collectrrr�__init__LszCollectionSpec.__init__cCsNy|j||j�Wn6tk
rH}z|jdj|j|��WYdd}~XnXdS)Nzfailed to collect {0}: {1})r&r%�	Exception�	log_error�format)r�data_package�errr�applyQszCollectionSpec.applyN)rrr �__doc__r(r.rrrrr$Dsr$cs�fdd�}t||�S)z4`run "<cmd>"` kcdoctor.sh helper (no shell features)cs|j|��dS)N)�
add_stdout)r,r%)�cmdrrr']szrun_spec.<locals>.collect)r$)r%r1r'r)r1r�run_specYsr2cs�fdd�}t||�S)z4`dump "<path>"` kcdoctor.sh helper for regular filescs|j|�d�dS)N)�src_path)�add_file)r,r%)�pathrrr'hszdump_spec.<locals>.collect)r$)r%r5r'r)r5r�	dump_specdsr6cs�fdd�}t||�S)z�`dump "<path>"` for /proc and /sys files.

    tar reports them as 0-size so they are first read into memory
    (see the same approach in anomaly.prepare_kernel_anomaly_report).
    csLtjj��s |jdj���dSt�d��}|j||j�d�WdQRXdS)Nzfile not found: {0}�rb)�
data_bytes)�osr5�existsr*r+�openr4�read)r,r%�f)r5rrr'ws
zproc_dump_spec.<locals>.collect)r$)r%r5r'r)r5r�proc_dump_specos	r>cCs
t||�S)N)r$)r%�fnrrr�
callable_spec�sr@c@s eZdZdZdd�Zdd�ZdS)�	FieldSpecz�A single doctor.json field ported from kcdoctor.sh.

    Collection failures are recorded in errors.log and never abort the
    report; a collector returning None omits the field (e.g. a
    distro-specific source file absent on this system).
    cCs||_||_dS)N)�keyr&)rrBr'rrrr(�szFieldSpec.__init__cCsXy|j�}Wn4tk
r@}z|jdj|j|��dSd}~XnX|dk	rT|||j<dS)Nzfailed to collect {0}: {1})r&r)r*r+rB)rr,�report�valuer-rrrr.�szFieldSpec.applyN)rrr r/r(r.rrrrrA�srAcs�fdd�}|S)z�`dump "<path>"` as a doctor.json string field.

    Read in binary (non-utf8 safe) and decoded leniently; an absent
    distro-specific source file simply omits the field (None).
    c
s:tjj��sdSt�d��}|j�jdd�j�SQRXdS)Nr7zutf-8�replace)r9r5r:r;r<�decode�strip)r=)r5rrr'�szread_field.<locals>.collectr)r5r'r)r5r�
read_field�srHcs"tjtj|�����fdd�}|S)z�`grep <pattern> <path>` as a doctor.json list-of-lines field.

    Match on bytes (like collect_apt_sources) so a non-utf8 byte cannot
    lose a line; the matched lines are decoded leniently for the JSON.
    c
sDtjj��sdSt�d��}|j�j�}WdQRX�fdd�|D�S)Nr7cs"g|]}�j|�r|jdd��qS)zutf-8rE)�searchrF)�.0�line)�regexrr�
<listcomp>�sz/grep_field.<locals>.collect.<locals>.<listcomp>)r9r5r:r;r<�
splitlines)r=�lines)r5rLrrr'�s
zgrep_field.<locals>.collect)�re�compiler
�bstr)r5�patternr'r)r5rLr�
grep_field�s
rTFcs��fdd�}|S)z@`run "<cmd>"` captured as a doctor.json field instead of a file.cs0t�ddd�\}}}|pdj�}�r,|j�S|S)NT)�catch_stdout�catch_stderr�)rrGrN)�_�stdout�text)�argv�as_linesrrr'�szcmd_field.<locals>.collectr)r[r\r'r)r[r\r�	cmd_field�sr]cCstS)N)�DOCTOR_VERSIONrrrr�collect_doctor_version�sr_cCs<y"tjtjd��}tj|j��j�Stk
r6dSXdS)z�the public IP of the machine as seen by the patch server.

    Cached: the main_ip and server_id fields share one HTTP roundtrip
    per run.
    ZmyipZNAN)r�urlopenr
�get_patch_server_url�nstrr<rGr))�responserrr�get_main_ip�s
rdcCs$tj�}|st�jdd�}tj|�S)N�.rX)r	�get_serveridrdrEr
rb)�	server_idrrr�collect_server_id�srhcCstj�S)N)r�get_kernel_hashrrrr�collect_kernel_id�srjcCsBi}x8dD]0}tdd|gddd	�\}}}|p0d
j�||<q
W|S)N�a�r�m�p�o�uname�-T)rUrVrW)rkrlrmrnro)rrG)�result�flagrXrYrrr�
collect_uname�s

rtc
CsHtjjt�sdSttd��}|j�jdd�}WdQRXdd�|j�D�S)z7`grep vmlinuz /boot/grub2/grub.cfg | sed 's/root=.*//'`Nr7zutf-8rEcSs"g|]}d|krtjdd|��qS)Zvmlinuzzroot=.*rW)rP�sub)rJrKrrrrMsz)collect_grub2_entries.<locals>.<listcomp>)r9r5r:�	GRUB2_CFGr;r<rFrN)r=rZrrr�collect_grub2_entries	s
rwcCsttjt��S)N)�sorted�glob�YUM_REPOS_GLOBrrrr�collect_yum_repossr{cCsdd�tjD�}|tj�d�S)z8presence-only port of the kcdoctor.sh detect_cp() probescSsg|]\}}|�r|�qSrr)rJ�name�proberrrrMsz)collect_control_panel.<locals>.<listcomp>)�cpZsoftaculous)r�CONTROL_PANEL_PROBES�has_softaculous)Zpanelsrrr�collect_control_panelsr�cCs@tddgddd�\}}}|j|tj|p(djdd�dd	�d
�dS)z`ipcs -m | sed -e s/-/=/g`�ipcsz-mT)rUrVrWrq�=zutf-8)�encoding)r8N)rr4r
rRrE)r,r%rXrYrrr�collect_ipcs%sr�cCshtjjt�s |jdjt��dSttd��}dd�|j�j�D�}WdQRX|j	|dj
|�dd�dS)z$`grep ' install ' /var/log/dpkg.log`zfile not found: {0}Nr7cSsg|]}d|kr|�qS)s	 install r)rJrKrrrrM4sz,collect_dpkg_install_log.<locals>.<listcomp>�
)r8)r9r5r:�DPKG_LOGr*r+r;r<rNr4�join)r,r%r=rOrrr�collect_dpkg_install_log,s r�cCs�tjjd�stjjd�rd}nXtjjd�rrd}yt|d�Wqvtk
rn}z|jdj|��WYdd}~XqvXnd}|j||�dS)	Nz/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.logzfailed to collect dpkg.log: {0}zecho "unknown package manager")r9r5r:r�r)r*r+r0)r,r%�packages_cmdr-rrr�collect_packages9s$r�c
sFtjd��g}xdttjt��D]R}tjj|�rfx@tj|�D]&\�}}|j	�fdd�t|�D��q:Wq|j
|�qW|s�|jdjt��dSg}x�|D]�}y"t
|d��}|j�}WdQRXWn6tk
r�}	z|jdj||	��w�WYdd}	~	XnXtjdj|�d	d
��|j	��fdd�|j�D��q�W|j|dj|�dd
�dS)z/`grep -rE '^(deb|URIs)' /etc/apt/sources.list*`s^(deb|URIs)c3s|]}tjj�|�VqdS)N)r9r5r�)rJr|)�rootrr�	<genexpr>Usz&collect_apt_sources.<locals>.<genexpr>zfile not found: {0}Nr7zfailed to read {0}: {1}z{0}:zutf-8)r�c3s |]}�j|�r�|VqdS)N)rI)rJrK)�prefixrLrrr�jsr�)r8)rPrQrxry�APT_SOURCES_GLOBr9r5�isdir�walk�extend�appendr*r+r;r<r)r
rRrNr4r�)
r,r%�filesr5rX�namesrOr=�contentr-r)r�rLr�r�collect_apt_sourcesLs*
"
"r�c	Cs�ttjt��}|s&|jdjt��dSg}x�|D]�}y0t|d��}|j�j�td�}WdQRXWn6t	k
r�}z|jdj||��w0WYdd}~XnXt
jdj|�dd�}|j|dj
|��q0W|j|dj
|�dd	�dS)
z%`tail -n10000 /var/log/libcare/*.log`zfile not found: {0}Nr7zfailed to read {0}: {1}z==> {0} <==
zutf-8)r�r�)r8)rxry�LIBCARE_LOGS_GLOBr*r+r;r<rN�LOG_TAIL_LINESr)r
rRr�r�r4)	r,r%�paths�chunksr5r=rOr-�headerrrr�collect_libcare_logsos
$r�cs�tjjtj�sdS|j|djtj��xttjtj�D]d\}}}xXt|�D]L�t	�fdd�t
D��rHtjj|��}tjj|tj�}|j
dj|�|d�qHWq4WdS)z3crashreporter artifacts from /var/cache/kcare/dumpsNz
ls -lR {0}c3s|]}tj�|�VqdS)N)�fnmatch)rJrS)r|rrr��sz&collect_crash_dumps.<locals>.<genexpr>zcrashreporter/{0})r3)r9r5r�r�
KDUMPS_DIRr0r+r�rx�any�CRASH_DUMP_PATTERNSr��relpathr4)r,r%r�rXr�r5Zrel_pathr)r|r�collect_crash_dumps�sr�cCs�tjjt�sdStj�}tjj|�s(dS|j|dj|��xTt	t
j
tjj|d���D]8}tjj|�sfqT|jdjtjj
|��tjj|d�d�qTWdS)Nz
ls -lR {0}�*zkdump/{0}/vmcore-dmesg.txtzvmcore-dmesg.txt)r3)r9r5r:�
KDUMP_CONFr�get_kdump_rootr�r0r+rxryr�r4�basename)r,r%�
kdump_rootZevtrrr�
collect_kdump�sr�c	s�g}x�tjt�D]�\}}}|jt�r2g|dd�<qx�t|�D]��t�fdd�tD��r<tjj	|��}y"t
|d��}|j�}WdQRXWntk
r�d}YnX|j
tjdj|��|d�q<WqW|j|dj	|�d�dS)	zGtunables gathered by the kcdoctor.sh get_sysfs_info() `find /sys` callsNc3s|]}tj�|�VqdS)N)r�)rJrS)r|rrr��sz'collect_sysfs_config.<locals>.<genexpr>r7�zcat {0}
r�)r8)r9r��
SYSFS_ROOT�
startswith�SYSFS_EXCLUDE_PREFIXESrxr��SYSFS_NAME_PATTERNSr5r�r;r<r)r�r
rRr+r4)	r,r%r�r��dirsr�r5r=r�r)r|r�collect_sysfs_config�s

&r�Zdoctor_versionZ	virt_whatz/usr/libexec/kcare/virt-whatT)r\Zmain_iprgZ	kernel_id�daterpZredhat_releasez/etc/redhat-releaseZdebian_versionz/etc/debian_versionZ
os_releasez/etc/os-releaseZissuez
/etc/issueZsysconfig_kernelz/etc/sysconfig/kernelZproc_uptimez/proc/uptimeZproc_loadavgz
/proc/loadavgZproc_cmdlinez
/proc/cmdline�proc_versionz
/proc/versionZdefault_grubz/etc/default/grub�DEFAULTZ
grub2_entriesZ	sshd_portz/etc/ssh/sshd_configZPortZyum_repos_dZ
control_panel�syslogztail -n{0} /var/log/syslog�dmesg�messagesztail -n{0} /var/log/messages�ls_var_cache_kcarezls -lR /var/cache/kcare/z
kcare.confz/etc/sysconfig/kcare/kcare.conf�cpuinfozcat /proc/cpuinfoZproc_vmstatz/proc/vmstatZproc_devicesz
/proc/devicesZproc_diskstatsz/proc/diskstatsZproc_mdstatz/proc/mdstatZproc_meminfoz
/proc/meminfoZ
proc_swapsz/proc/swapsZproc_filesystemsz/proc/filesystemsZproc_mountsz/proc/mountsZproc_interruptsz/proc/interruptsz	grub.confz/boot/grub/grub.conf�proc_modulesz
/proc/modulesz	grub2.cfgZ
proc_zoneinfoz/proc/zoneinfoZls_boot_configsz:ls /etc/grub.conf /boot/grub/grub.conf /boot/grub/menu.lstZls_bootzls -l /bootZprintenvZ	dmidecoder��sysctlz	sysctl -azsysctl.confz/etc/sysctl.confz
packages.listZlspciz	lspci -vvZdpkg_lzdpkg -lZapt_sourceszyum.confz
/etc/yum.confZyum_repolistzyum repolistZlibcare_logszkcarectl.logz tail -n{0} /var/log/kcarectl.logz
kdump.confz
kcare-cronz/etc/cron.d/kcare-cronzcrashreporter/lszkdump/lsZ	aa_statusz	aa-statusZsestatusZkprobes_listz"cat /sys/kernel/debug/kprobes/listZsysfs_configZlsblkzlsblk -fZdfzdf -h)�loggercCs\t�}|�Hi}xtD]}|j||�qW|jd|�xtD]}|j|�q<WWdQRX|S)Nzdoctor.json)r�FIELD_SPECSr.�add_json�
FILE_SPECS)r,rC�field�specrrr�prepare_doctor_reports

r�cCs|s
tjr4|rdnd}tjdj|�dd�|�dStj�dkrXtjddd�|�dSt�}|dkrztjd�|�dSzzy0|j	�}tjd	j|�dd�t
jd
j|��WnDtt
tjtjfk
r�}ztjdj|��|�WYdd}~XnXWd|j�XdS)a�Collect and upload the doctor report via the generic uploads proxy.

    PUTs the archive to ``/upload/kcarectl-doctor/`` -- the same modern
    pipeline as ``kernel-anomaly`` -- which ePortal proxies transparently
    to the patch server, so no ePortal change is required. Any 2xx reply
    is success, including the ``REDUCED_REPORT`` ``204`` where the proxy
    intentionally drops the report (``send()`` returns without raising, so
    we do not fall back).

    Falls back to the legacy ``kcdoctor.sh`` flow (``fallback``) when:

    * ``force_fallback`` (the ``--doctor --fallback`` CLI flag) or
      ``config.FORCE_DOCTOR_FALLBACK`` is set -- the rollout kill-switch.
      ``--fallback`` is the one-off, per-invocation form; the config knob
      is settable per host in kcare.conf or pushed fleet-wide via the
      ``KC-Flag-Force-Doctor-Fallback`` feature flag. Either forces the
      legacy flow on every host, registered or not, before the new path
      is even considered;
    * the host is not registered, i.e. there is no auth string (OQ-4: the
      proxy upload requires auth, so the new path is not even attempted);
    * report collection failed (``prepare_doctor_report`` returned None);
    * the new route is unavailable on an older patch server / ePortal --
      a 404 / 405 / 403, surfaced as ``HTTPError``, or a connection-level
      failure. ``send()`` drives ``http_utils.upload_file`` (raw
      ``httplib``, not ``urllib``), so transport failures surface as an
      ``OSError`` subclass -- ``socket.timeout``, ``ConnectionRefused``,
      ``socket.gaierror`` (DNS), ``ssl.SSLError`` -- or an
      ``httplib.HTTPException``, *not* ``URLError``; all of these mean the
      new path is unusable. ``upload_file`` raises only on status >= 400,
      so a redirect is not treated as a failure; the proxy and patch
      server never redirect uploads.

    :param fallback: legacy ``kcdoctor.sh`` runner, injected by the caller
        (KPT-6065) to keep this module free of an ``__init__`` import cycle.
    :param force_fallback: when True (``--doctor --fallback``), skip the v2
        path and run ``fallback`` directly; the per-invocation form of
        ``config.FORCE_DOCTOR_FALLBACK``.
    z--fallback requestedzFORCE_DOCTOR_FALLBACK is setz.doctor: {0}; using the legacy kcdoctor.sh flowF)�	print_msgNzAdoctor: host is not registered; using the legacy kcdoctor.sh flowzCdoctor: report collection failed; using the legacy kcdoctor.sh flowzdoctor: report uploaded as {0}z,Please provide this filename to support: {0}zJdoctor: report upload unavailable ({0}); using the legacy kcdoctor.sh flow)r�FORCE_DOCTOR_FALLBACKr�loginfor+r�get_http_auth_stringr��logwarn�sendr
�
print_wrapperrr
r�
HTTPException�socket�error�remove_archive)�fallback�force_fallback�srcr,�upload_name�errrrr�send_doctor_report-s4)

r�)rrrr)rrr)rr)F)F)Fr/r�ryr9rPr��kcarectlrrrrrrrr	r
Zkcarectl.process_utilsrZ
kcarectl.py23rr
rr^rvr�r�r�rzr�r�r�r�r�r��DataPackager�objectr$r2r6r>r@rArHrTr]r_�cachedrdrhrjrtrwr{r�r�r�r�r�r�r�r�r�r�r+r��catch_errorsr�r�r�rrrr�<module>s�,






#