o
    f                     @   sh   d Z ddlZddlZddlZddlZddlmZ dZG dd de	Z
G dd de
ZG d	d
 d
e	ZdS )z@
Access logs in known locations to find information about them.
    N)parserzl(?P<date>\w+ +\d+ +\d\d:\d\d:\d\d) (?P<host>\w+) CRON\[(?P<pid>\d+)\]: \((?P<user>\w+)\) CMD \((?P<cmd>.*)\)c                   @   s<   e Zd ZdZdddZdd Zdd Zd	d
 ZdddZdS )	LogReaderz<Opens a Log file, reading backwards and watching for changes   c                 C   s"   || _ || _d| _d| _d | _d S )N)filenamemasssizereadpipe)selfr   r    r   :/var/www/html/venv/lib/python3.10/site-packages/cronlog.py__init__    s
   
zLogReader.__init__c                 C   s*   t | jd | _tj| jddd| _| S )N   rzutf-8)encoding)osstatr   r   codecsopenr
   )r   r   r   r   	__enter__'   s   zLogReader.__enter__c                 C   s   | j   d S N)r
   close)r   
error_typevalue	tracebackr   r   r   __exit__,   s   zLogReader.__exit__c                 c   sj    | j d u r'| }| D ]\}}|V  qW d    d S 1 s w   Y  d S |  D ]\}}|V  q+d S r   )r
   	readlines)r   readeroffsetliner   r   r   __iter__/   s   
"zLogReader.__iter__r   c                 c   s    | j r| j jrtd| j}d}||kri|| j8 }| j}|dk r(| j| }d}| j | | j || }|d}|dkrD|d}|| }|	  |D ]}|
 dkrWqN||fV  |t|8 }qN||ksdS dS )z0Iterator for reading lines from a file backwardszCan't readline, no opened file. r   
N)r
   closedIOErrorr   r   seekr	   splitpopreversestriplen)r   untillocationhalfliner   r    datalocr   r   r   r   8   s0   




zLogReader.readlinesN)r   )r   )	__name__
__module____qualname____doc__r   r   r   r!   r   r   r   r   r   r      s    
	r   c                       s2   e Zd ZdZd
ddZdd Z fdd	Z  ZS )CronLogz4Use the LogReader to make a Cron specific log reader/var/log/syslogNc                 C   s   t | | || _d S r   )r   r   user)r   r   r7   r   r   r   r   X   s   
zCronLog.__init__c                 C   s
   t | |S )z1Return log entries for this specific command name)
ProgramLog)r   commandr   r   r   for_program\   s   
zCronLog.for_programc                 #   sf    t t|  D ](}ttt|}|o| }|r0| jr$|d | jkr0t	
|d |d< |V  qd S )Nr7   date)superr5   r!   rematchMATCHERstr	groupdictr7   	dateparseparse)r   r    r>   datum	__class__r   r   r!   `   s   zCronLog.__iter__)r6   N)r1   r2   r3   r4   r   r:   r!   __classcell__r   r   rE   r   r5   V   s
    
r5   c                   @   s    e Zd ZdZdd Zdd ZdS )r8   z1Specific log control for a single command/programc                 C   s   || _ || _d S r   )logr9   )r   rH   r9   r   r   r   r   k   s   
zProgramLog.__init__c                 c   s*    | j D ]}|d t| jkr|V  qd S )Ncmd)rH   r@   r9   )r   entryr   r   r   r!   o   s   
zProgramLog.__iter__N)r1   r2   r3   r4   r   r!   r   r   r   r   r8   i   s    r8   )r4   r   r=   r   platformdateutilr   rB   r?   objectr   r5   r8   r   r   r   r   <module>   s   8