
­­­­­­­­­­­­­­­­­­
<!DOCTYPE html>
<html>
3
;j4                 @   sp   d dl Z d dlZd dlZd dlZddlmZmZ ejdddZddd	Z	dd
dZ
dd Zdd Zdd ZdS )    N   )	log_utilsutilsTc             C   sR   |pd}x*|D ]"}t jj|| }t jj|r|S qW |rJtdj| |nd S d S )N	/usr/sbin/sbin/usr/bin/binz{0} could not be found at {1})r   r   r   r   )ospathjoinisfile	Exceptionformat)namepathsZ	raise_excitfname r   3/usr/libexec/kcare/python/kcarectl/process_utils.pyfind_cmd   s    
r   Fc             C   s   |r
t jnd }|rt jnd }t j| |||d}|j \}}	|j}
|d k	rRtj|}|d k	rdtj|	}	tjt	j
dj|j||	dj| d |r|
rt j|
| }||_|	|_||
||	fS )N)stdoutstderrshellz
       Call result for `{cmd}`:
       exit code {exit_code}
       === STDOUT ===
       {stdout}
       === STDERR ===
       {stderr}
       === END ===
     )Z	exit_coder   r   cmd)
subprocessPIPEPopencommunicate
returncoder   nstrr   logdebugtextwrapdedentr   r   CalledProcessErroroutputr   )commandcatch_stdoutcatch_stderrr   checkr   r   pZstdout_capturedZstderr_capturedcodeexcr   r   r   run_command   s&    

	r-   c             C   s   t | d|d\}}}|S )NT)r'   r)   )r-   )argsr)   _r   r   r   r   check_outputD   s    r0   c       	      C   s   ydddddt | g}t|dd\}}}|rFtjdj| d	d
d dS |j }dddddt | g}t|dd\}}}|rtjdj| d	d
d dS |j }t||fS  tk
r } ztjdj| |dd
d dS d }~X nX d S )Npsz--no-headersz-oppidz-pT)r'   z3Could not retrieve process parent PID for PID {pid})pidF)	print_msgZcommz-Could not retrieve process name for PID {pid}zJCould not retrieve process name and parent PID for PID {pid}, error: {err})r3   err)NN)NN)NN)strr-   r   loginfor   stripintr   )	r3   Zcmd_ppidr+   r   r/   r2   Zcmd_commr   er   r   r    _get_parent_pid_and_process_nameI   s$    r;   c                s   t j  fdd}|S )zMDecorator that logs parent process chain before calling the wrapped function.c                 s   t    | |S )N)_log_all_parent_processes)r.   kwargs)funcr   r   wrapperf   s    z)log_all_parent_processes.<locals>.wrapper)	functoolswraps)r>   r?   r   )r>   r   log_all_parent_processesc   s    rB   c              C   s   g } t j }x<|dkrH|dkrHt|\}}| j||f |d krBP |}qW tjddd xJtt| D ]:\}\}}d| d }tjdj||pd	|pd	d
dd qfW d S )Nr   r   zAgent parent processes chain:F)r4   -z->z{prefix} "{name}" (pid: {pid})unknown)prefixr   r3   )	r	   getpidr;   appendr   r7   	enumeratereversedr   )Zprocess_chainZcurrent_pidr2   Zprocess_namelevelr3   r   rE   r   r   r   r<   n   s    r<   )NT)FFFF)F)r@   r	   r   r"    r   r   cachedr   r-   r0   r;   rB   r<   r   r   r   r   <module>   s   
%
