
Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­
<!DOCTYPE html>
<html>
3
èhj™*  ã               @   sB   d dl Z d dlZd dlmZ d dlmZ ejƒ ZG dd„ dƒZdS )é    N)ÚSubparsersAction)ÚOptionc               @   s®   e Zd ZdZdZg ZeddedƒeddeƒgZedd	e	ƒed
deƒeddeƒeddeƒgZ
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd „ Zd!d"„ ZdS )#ÚRequestAnalyzerz‚
    A request analyzer module, handles request tracking logic
    and analysis. Parses input generated from a source Reader.
    Nz	--verbosezVerbose outputz-vz--pamzFilter only PAM requestsÚcidzTrack request with this IDz--childzInclude child process logsz--mergez'Merge logs together sorted by timestampzTrack only PAM requestsc             C   s   | j jƒ  dS )z|
        Print the module parser help output

        Args:
            args (Namespace): argparse parsed arguments
        N)Úmodule_parserZ
print_help)ÚselfÚargs© r	   ú/usr/lib/python3.6/request.pyÚprint_module_help   s    z!RequestAnalyzer.print_module_helpc             C   sv   d}|j d|dd�| _| jjddtdd�}|jd	ƒ}|j|d
d| j| jƒ |j|dd| j| j	ƒ | jj
| jd� | jS )z¹
        Setup module parser, subcommands, and options

        Args:
            parser_grp (argparse.Action): Parser group to nest
               module and subcommands under
        zAnalyze request tracking moduleZrequestzRequest tracking)ÚdescriptionÚhelpNÚ	subparserZCOMMANDS)ÚtitleÚdestÚactionÚmetavarzOperation ModesÚlistzList recent requestsZshowzTrack individual request ID)Úfunc)Z
add_parserr   Zadd_subparsersr   Zadd_parser_groupZadd_subcommandÚlist_requestsÚ	list_optsÚtrack_requestÚ	show_optsZset_defaultsr   )r   Z
parser_grpZcliZdescr   Z
subcmd_grpr	   r	   r
   Ú
setup_args&   s    



zRequestAnalyzer.setup_argsc             C   s8   |j dkrddlm} |ƒ }nddlm} ||jƒ}|S )zµ
        Load the appropriate source reader.

        Args:
            args (Namespace): argparse parsed arguments

        Returns:
            Instantiated source object
        Zjournaldr   )ÚJournald)ÚFiles)ÚsourceZsssd.source_journaldr   Zsssd.source_filesr   Zlogdir)r   r   r   r   r   r	   r	   r
   ÚloadB   s    


zRequestAnalyzer.loadc             c   sF   x@|D ]8}x2|D ]*}t j|ƒ}|j|ƒr|jdƒr4q|V  qW qW dS )zì
        Yield lines which match any number of patterns (OR) in
        provided patterns list.

        Args:
            source (Reader): source Reader object
        Yields:
            lines matching the provided pattern(s)
        z   *  N)ÚreÚcompileÚsearchÚ
startswith)r   r   ÚpatternsÚlineÚpatternZre_objr	   r	   r
   Úmatched_lineT   s    





zRequestAnalyzer.matched_linec             C   sJ   g }x@| j ||ƒD ]0}tj|ƒ}|j|ƒ}|r|jdƒ}|j|ƒ qW |S )aË  
        Retrieve list of associated REQ_TRACE ids. Filter
        only source lines by pattern, then parse out the
        linked id with the provided regex.

        Args:
            source (Reader): source Reader object
            pattern (list of str): regex pattern(s) used for finding
                 linked ids
            regex (str): regular expression used to extract linked id

        Returns:
            List of linked ids discovered
        r   )r%   r   r   r    ÚgroupÚappend)r   r   r$   ZregexZ
linked_idsÚmatchZid_reÚfoundr	   r	   r
   Úget_linked_idsf   s    


zRequestAnalyzer.get_linked_idsc             C   sH   d}|r | j j|j|d ƒƒ n$t|ƒjdkr<t|dd� nt|ƒ |S )a–  
        Print or consume a line, if merge cli option is provided then consume
        boolean is set to True

        Args:
            line (str): line to process
            source (Reader): source Reader object
            consume (bool): If True, line is added to consume_logs
               list, otherwise print line

        Returns:
            True if line was processed, otherwise False
        Té   r   Ú )Úendéÿÿÿÿ)Úconsumed_logsr'   ÚrstripÚtypeÚ__name__Úprint)r   r#   r   ZconsumeZfound_resultsr	   r	   r
   Úconsume_line~   s    zRequestAnalyzer.consume_linec             C   s$  i }x||D ]t}d|krq
|j dƒ}|d dd… }tjd|d ƒ}|jdƒ}||f|jƒ krr|||f  |7  < q
||||f< q
W �xš|jƒ D �]Œ\}}	g }
g }�xx|	jƒ D �]j}d}d}d}|j dƒ}|d d	d… }|j d
ƒd dd… }tjd|ƒ�r| j|ƒ tjd|ƒ�r\|j dƒd }|jƒ  |j dƒ}|d d	d… }|j d
ƒd dd… }n8tjd|ƒ�rz|j	dƒd }ntjd|ƒ�r”|j	ƒ d }|�r¦t
d| ƒ |�rÔ||
k�rÔt
d|dd…  ƒ |
j|ƒ |r¬d|k�sêd|kr¬||kr¬ttjd|ƒƒr¬t
d| ƒ |j|ƒ q¬W qŽW dS )z’
        Parse log file and print formatted verbose list_requests output

        Args:
            source (Reader): source Reader object
        zCID#ú[r   Né   z
CID#[0-9]*é   r,   é   ú:é   z\[cmdZcache_req_sendú'r+   Zcache_req_process_inputZcache_req_search_sendz   - z	       - ZUIDZGIDz\dr.   r.   r.   )Úsplitr   r    r&   ÚkeysÚitemsÚ
splitlinesÚprint_formattedÚclearÚrsplitr3   r'   Úbool)r   r   Údatar#   ÚfieldsÚtsÚresultr   ÚkÚvZcr_doneZid_doneZcidlineZpluginÚnameÚidZcr_fieldZcrr	   r	   r
   Úprint_formatted_verbose—   sV    







z'RequestAnalyzer.print_formatted_verbosec             C   s¨   |j dƒrdS d|krdS |jdƒd }|dd… }|jdƒ}|d d	d… }|d	 d	d… }|d d	d… }|jƒ s†|d d	d… }t|› d|› d|› d|› �ƒ |S )zÀ
        Parse line and print formatted list_requests output

        Args:
            line (str): line to parse
        Returns:
            Client ID from printed line, 0 otherwise
        z   *  r   Z	refreshedú)r+   Nr5   r7   r:   é	   é   é   z: [uid z] CID #z: i÷ÿÿÿr.   r.   r.   )r!   r<   Ú	isnumericr3   )r   r#   rF   rE   r   ÚcmdZuidr	   r	   r
   r@   Ý   s    


zRequestAnalyzer.print_formattedc             C   sš   | j |ƒ}|jj}d}dg}|jr.|jj}d}tjd|› d�ƒ |j|dƒ |jr^| j	|ƒ n8x6| j
||ƒD ]&}t|ƒjdkrˆt|ƒ ql| j|ƒ qlW dS )	z�
        List component (default: NSS) responder requests

        Args:
            args (Namespace):  populated argparse namespace
        Únssz\[cmdÚpamz******** Listing z client requests ********Fr   N)r   Ú	ComponentÚNSSrT   ÚPAMÚloggerÚinfoÚset_componentÚverboserL   r%   r1   r2   r3   r@   )r   r   r   Ú	componentÚrespr"   r#   r	   r	   r
   r   ö   s    

zRequestAnalyzer.list_requestsc                st  | j |ƒ}|j}d}d}|jj}d}d|› d�g‰ |jrD|jj}d}tjd|› d|› d�ƒ |j||j	ƒ x$| j
|ˆ ƒD ]}| j|||jƒ}qxW tjd	|› d
�ƒ d|› d|› d�g‰ |j|jj|j	ƒ d}	| j|ˆ |	ƒ}
ˆ jƒ  ‡ fdd„|
D ƒ x&| j
|ˆ ƒD ]}| j|||jƒ}�qW |j�rNt| jdd„ d�}x|D ]}t|ƒ �q<W | �rp| �rptjd|› d�ƒ dS )z”
        Print Logs pertaining to individual SSSD client request

        Args:
            args (Namespace):  populated argparse namespace
        FrS   z\[CID#z\]rT   z******** Checking z responder for Client ID z *******z)********* Checking Backend for Client ID z	 ********zREQ_TRACE.*\[sssd.z CID #z\[RID#[0-9]+\]c                s   g | ]}ˆ j d |› �ƒ‘qS )ú\)r'   )Ú.0rK   )r$   r	   r
   ú
<listcomp>4  s    z1RequestAnalyzer.track_request.<locals>.<listcomp>c             S   s   | j dƒd S )NrM   r   )r<   )Úsr	   r	   r
   Ú<lambda><  s    z/RequestAnalyzer.track_request.<locals>.<lambda>)ÚkeyzID z not found in logs!N)r   r   rU   rV   rT   rW   rX   rY   rZ   Zchildr%   r4   ÚmergeZBEr*   rA   Úsortedr/   r3   Úwarn)r   r   r   r   Zresp_resultsZ
be_resultsr\   r]   r(   Zbe_id_regexZbe_idsZsorted_listÚentryr	   )r$   r
   r     s<    

zRequestAnalyzer.track_request)r2   Ú
__module__Ú__qualname__Ú__doc__r   r/   r   rC   r   Úintr   r   r   r   r%   r*   r4   rL   r@   r   r   r	   r	   r	   r
   r   
   s&   


	Fr   )r   ZloggingZsssd.parserr   r   Z	getLoggerrX   r   r	   r	   r	   r
   Ú<module>   s
   