o
    `oi                     @   s   d dl mZ d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dl	m
Z
 d dlmZ d dlmZ ejd  dkr=eneZeeZG dd deZdS )	    )print_functionN)import_module)settings)Settings   c                   @   sd   e Z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d Zdd ZdS )Crontabc                 K   s4   t |dd| _|dd| _g | _tt| _d S )N	verbosity   readonlyF)intgetr   r
   crontab_linesr   r   )selfoptions r   ^/var/www/html/kuke-dev/django-kuke/venv/lib/python3.10/site-packages/django_crontab/crontab.py__init__   s   zCrontab.__init__c                 C   s   |    | S )zH
        Automatically read crontab when used as with statement
        )readr   r   r   r   	__enter__   s   zCrontab.__enter__c                 C   s   | j s	|   dS dS )zc
        Automatically write back crontab when used as with statement if readonly is False
        N)r
   write)r   typevalue	tracebackr   r   r   __exit__%   s   zCrontab.__exit__c                 C   s   t d| jj  | _dS )z8
        Reads the crontab into internal buffer
        z%s -lN)ospopenr   CRONTAB_EXECUTABLE	readlinesr   r   r   r   r   r   ,   s   zCrontab.readc                 C   sZ   t  \}}t|d}| jD ]}|| q|  td| jj	|f  t
| dS )z8
        Writes internal buffer back to crontab
        wz%s %sN)tempfilemkstempr   fdopenr   r   closesystemr   r   unlink)r   fdpathtmpliner   r   r   r   2   s   
zCrontab.writec                 C   s   | j jD ]g}t|dkrt|d tr|d }nt|dkr#|d }nd}| j| j j|d | j jd	t
d| j j| j j| j jdd| || j jrNd	| j j nd|| j jg	d
  | jdkrktd| ||f  qdS )zN
        Adds all jobs defined in CRONJOBS setting to internal buffer
        r       r    NZcrontabrunz--settings=%s)timecommentcommandr	   z  adding cronjob: (%s) -> %s)r   CRONJOBSlen
isinstancestring_typer   appendZCRONTAB_LINE_PATTERNCRONTAB_COMMENTjoinfilterZCOMMAND_PREFIXZPYTHON_EXECUTABLEZDJANGO_MANAGE_PATH_Crontab__hash_jobZDJANGO_SETTINGS_MODULEZCOMMAND_SUFFIXr   print)r   jobZ
job_suffixr   r   r   add_jobs>   s0   



zCrontab.add_jobsc              
   C   s   t d | jdd D ]B}| jj|}|rM|d d | jjkrM| jdkrMt d|d d  d | |d d |d d 	dd	 d  d f  qdS )
z2
        Print the jobs from from crontab
        z!Currently active jobs in crontab:Nr   r*   r	   z%s -> %sr   crontab run   )
r:   r   r   CRONTAB_LINE_REGEXPfindallr6   r   split_Crontab__get_job_by_hashfindr   r)   r;   r   r   r   	show_jobs]   s   
2zCrontab.show_jobsc              
   C   s   | j dd D ]H}| jj|}|rO|d d | jjkrO| j | | jdkrOtd|d d  d | 	|d d |d d 
dd d  d f  qdS )	zS
        Removes all jobs defined in CRONJOBS setting from internal buffer
        Nr   r*   r	   zremoving cronjob: (%s) -> %sr   r=   r>   )r   r   r?   r@   r6   remover   r:   rA   rB   rC   rD   r   r   r   remove_jobsk   s   
2zCrontab.remove_jobsc                 C   sD  |  |}|d }t|dkrt|d ts|d ng }t|dkr&|d ni }d}| jjr\ttj	t
 d| d}|j}zt|tjtjB  W n ty[   td| Y dS w |dd\}}	t|}
t|
|	}z	||i | W n
   td	| Y | jjrz
t|tj W dS  ty   td
| Y dS w dS )zI
        Executes the corresponding function defined in CRONJOBS
        r	   r      Nzdjango_crontab_%s.lockr   z3Tried to start cron job %s that is already running..z Failed to complete cronjob at %szError unlocking %s)rB   r2   r3   r4   r   Z	LOCK_JOBSopenr   r'   r7   r    
gettempdirnamefcntlflockLOCK_EXLOCK_NBIOErrorloggerwarningrsplitr   getattr	exceptionLOCK_UN)r   job_hashr;   Zjob_nameZjob_argsZ
job_kwargsZlock_file_name	lock_filemodule_pathZfunction_namemodulefuncr   r   r   run_jobz   s:   
&
zCrontab.run_jobc                 C   s*   t jdd|}t|d }|S )z9
        Builds an md5 hash representing the job
        T)	sort_keyszutf-8)jsonJSONEncoderencodehashlibmd5	hexdigest)r   r;   jhr   r   r   Z
__hash_job   s   zCrontab.__hash_jobc                 C   s0   | j jD ]}| ||kr|  S qtd| )z-
        Finds the job by given hash
        zNo job with hash %s found. It seems the crontab is out of sync with your settings.CRONJOBS. Run "python manage.py crontab add" again to resolve this issue!)r   r1   r9   RuntimeError)r   rX   r;   r   r   r   Z__get_job_by_hash   s   zCrontab.__get_job_by_hashN)__name__
__module____qualname__r   r   r   r   r   r<   rE   rG   r]   r9   rB   r   r   r   r   r      s    "r   )
__future__r   rM   rb   r_   loggingr   r    sys	importlibr   Zdjango.confr   Zdjango_crontab.app_settingsr   version_info
basestringstrr4   	getLoggerrh   rR   objectr   r   r   r   r   <module>   s    
