o
    ͜i?                     @   sh   d 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dd 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)datetimezl(?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   B/var/www/html/philips/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                 C   s    |  dt  j }t |dS )N z%b %d %H:%M:%S %Y)r   nowyearstrptime)cron_str	with_yearr   r   r   cron_date_to_datetimeU   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   r>   r   r   r   r   \   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                 #   sd    t t|  D ]'}ttt|}|o| }|r/| jr$|d | jkr/t	|d |d< |V  qd S )Nr>   date)
superr<   r!   rematchMATCHERstr	groupdictr>   r;   )r   r    rE   datum	__class__r   r   r!   d   s   zCronLog.__iter__)r=   N)r1   r2   r3   r4   r   rA   r!   __classcell__r   r   rJ   r   r<   Z   s
    
r<   c                   @   s    e Zd ZdZdd Zdd ZdS )r?   z1Specific log control for a single command/programc                 C   s   || _ || _d S r   )logr@   )r   rM   r@   r   r   r   r   o   s   
zProgramLog.__init__c                 c   s*    | j D ]}|d t| jkr|V  qd S )Ncmd)rM   rG   r@   )r   entryr   r   r   r!   s   s   
zProgramLog.__iter__N)r1   r2   r3   r4   r   r!   r   r   r   r   r?   m   s    r?   )r4   r   rD   r   r   rF   objectr   r;   r<   r?   r   r   r   r   <module>   s   7