
    
yi                         	 d dl Z n# e$ r dZ Y nw xY wd dlZd dlmZmZ d dlmZ  ee          Z	dde
dedefdZdd
ede
defdZdS )    N)ListDict)setup_loggerSIGTERMpidsignal_typereturnc                    t           dS 	 t          j        |           sd|  dS t          j        |           }|                                }t                              d|  d| d|            |dk    r|                                 n|                                 d	| d
|  d| dS # t           j        $ r	 d|  dcY S t          $ r,}t          
                    d|            d| cY d}~S d}~ww xY w)z
    Terminates a process by PID. By default uses SIGTERM (graceful).
    
    Args:
        pid: Process ID.
        signal_type: "SIGTERM" (default) or "SIGKILL" (force).
        
    Returns:
        Status message.
    N0   ⚠️ Error: `psutil` library is not installed.u   ❌ Process with PID z does not exist.zKilling process z (z) with SIGKILLu	   ✅ Sent z to process z).u#   ❌ Access Denied: Cannot kill PID z (Root privileges required?)zKill process failed: u   ❌ Error killing process: )psutil
pid_existsProcessnameloggerinfokill	terminateAccessDenied	Exceptionerror)r   r   pr   es        4/root/projects/butler/slack_bot/tools/process_ops.pykill_processr      sN    ~AA1 %% 	A@3@@@@N3vvxxHsHHdHH;HHIII)##FFHHHHKKMMMC;CCCCC4CCCC W W WVSVVVVVV 1 1 10Q001110Q000000001s)   B+ BB+ +C7	C7!C2,C72C7   filter_namelimitc                    t           dS 	 g }t          j        g d          D ]|}	 |j        }| r/|                                 |d                                         vr;|                    |           Q# t           j        t           j        t           j        f$ r Y yw xY w|                    d d           t          |          }|d|         }d| d	t          |           d
}|ddddddddddddddddd dz  }|dz  }|D ]h}|d         pd d}|d         pddd}|d         pddd         }	|d         dd         }
|d|d          dd|	dd|dd|dd|
dd|d          dz  }i||k    r|d!||z
   d"z  }|S # t          $ r,}t                              d#|            d$| cY d}~S d}~ww xY w)%z9
    Returns a formatted table of running processes.
    Nr   )r   r   usernamecpu_percentmemory_percentstatusr   c                 .    |                      dd          S )Nr!   r   )get)xs    r   <lambda>z"get_process_list.<locals>.<lambda>C   s    155#:#:     T)keyreverseu   📊 **Process List** (z total found, showing top z)
`PIDz<6 USERz<10zCPU%zMEM%STATUSNAMEz`
z=------------------------------------------------------------
r!   r   %r"   z.1fr    unknown
   r#   r   z... and z more.zList processes failed: u   ❌ Error listing processes: )r   process_iterr   lowerappendNoSuchProcessr   ZombieProcesssortlenr   r   r   )r   r   matchesr   p_infocountoutputcpumemuserr#   r   s               r   get_process_listrB   /   s    ~AA%3$%k%k%kll 	 	A !"((**&.2F2F2H2HHH v&&&&(&*=v?ST    	::DIIIG&5&/]5]]CPWLL]]]`e``````f```&```h```U[````/! 	a 	aA}%*---C'(-A4444CjM.Y4Dx["%F`!E(``````3```C```V```RSTZR[````FF5==66666F 3 3 32q223332q222222223sM   F 7A4F A43F 4&BF BC*F 
F>!F93F>9F>)r   )Nr   )r   ImportErrorsignaltypingr   r   health.utils.logging_configr   __name__r   intstrr   rB    r(   r   <module>rK      s   MMMM   FFF          4 4 4 4 4 4	h		"1 "1c "1 "1C "1 "1 "1 "1H,3 ,3# ,3S ,3# ,3 ,3 ,3 ,3 ,3 ,3s    