HEX
Server: Apache
System: Linux server2.voipitup.com.au 4.18.0-553.109.1.lve.el8.x86_64 #1 SMP Thu Mar 5 20:23:46 UTC 2026 x86_64
User: posscale (1027)
PHP: 8.2.30
Disabled: exec,passthru,shell_exec,system
Upload Files
File: //opt/saltstack/salt/lib/python3.10/site-packages/salt/utils/__pycache__/schedule.cpython-310.pyc
o

�N�gH�@s�dZddlZddlZddlZddlZddlZddlZddlZddlZddl	Z	ddl
Z
ddlZddlZddl
ZddlZddlZddlZddlZddlZddlZddlZddlZddlZddlZddlZddlZddlZddlZddlZddlZddlZddl Zddlm!Z!ddl"m#Z#zddl$m%Z&dZ'dZ(Wn
e)y�dZ'dZ(Ynwzddl*Z*dZ+Wne)y�dZ+Ynwe�,e-�Z.Gdd�d�Z/d	d
�Z0dS)a\
Scheduling routines are located here. To activate the scheduler make the
``schedule`` option available to the master or minion configurations (master
config file or for the minion via config or pillar).

Detailed tutorial about scheduling jobs can be found :ref:`here
<scheduling-jobs>`.

Requires that python-dateutil is installed on the minion.
�N)�SaltInvocationError)�OrderedDictTFc@sVeZdZdZdZ								d@dd�Z								d@dd�Z							dAdd	�Zd
d�Zdd
�Z		dBdd�Z
dd�Zdd�ZdCdd�Z
dd�ZdCdd�ZdCdd�ZdCdd�ZdCdd �ZdCd!d"�Zd#d$�ZdCd%d&�ZdCd'd(�Zd)d*�ZdDd+d,�ZdDd-d.�ZdDd/d0�ZdDd1d2�ZdEd4d5�ZdFd6d7�ZdGd8d9�ZdGd:d;�ZdGd<d=�Z d>d?�Z!dS)H�SchedulezR
    Create a Schedule object, pass in the opts and the functions dict to use
    NFcCsj|jdus	|dur-t�d�t�|�}|j||||||||	|
d�	|dur'|S||_|jSt�d�|jS)z6
        Only create one instance of Schedule
        NTzInitializing new Schedule)�	returners�	intervals�cleanup�proxy�
standalone�utils�_subprocess_listzRe-using Schedule)�instance�log�debug�object�__new__�__singleton_init__)�cls�opts�	functionsrrrrr	�new_instancer
rr�r�G/opt/saltstack/salt/lib/python3.10/site-packages/salt/utils/schedule.pyrMs(

�
�zSchedule.__new__cCsdS�Nr)�selfrrrrrrr	rr
rrrr�__init__vs
zSchedule.__init__c
Cs ||_||_||_|ptj�|�|_||_d|_d|_d|_	d|_
t|t�r*||_
ni|_
|js?t|d�r9||_n|j��|_z
|j�ddd���|_Wnty`tjdtjd�d|_Ynw|�d	�|_tj|_|jsrt|�|r~|D]}
|�|
�qv|	dur�tjj� �|_!dS|	|_!dS)
NT�__getitem__ztimezone.get_offsetcSsdS)N�0000rrrrr�<lambda>�sz-Schedule.__singleton_init__.<locals>.<lambda>z<Unable to obtain correct timezone offset, defaulting to 0000�Zexc_info_on_loglevelr�schedule_returner)"rrr�salt�loaderr
r	�
skip_function�skip_during_range�splay�enabled�
isinstance�dictr�hasattrrZ
gen_functions�get�time_offset�	Exceptionr
�warning�logging�DEBUG�optionr�sys�maxsize�
loop_interval�clean_proc_dir�delete_job_prefix�processZSubprocessListr)rrrrrrrr	r
r�prefixrrrr�sJ

��
�
zSchedule.__singleton_init__cCs|j|j|j|jdfSr)rrrr�rrrr�__getnewargs__�szSchedule.__getnewargs__cCs,d|jvr|jd|idd�S|j�|i�S)z>
        Return options merged from config and pillar
        zconfig.mergeT)Zomit_master)rrr))r�optrrrr/�s
zSchedule.optionTc
Cs�i}|r|j�di��di�}t|t�std��|�|�|r4|j�di�}t|t�s/td��|�|�|rZt�|�}|D]}t||t�rW||D]}	|	�d�rV|||	=qJq=|S|S)�4
        Return the schedule data structure
        �pillar�schedule�Schedule must be of type dict.�_)	rr)r&r'�
ValueError�update�copy�deepcopy�
startswith)
r�include_opts�include_pillar�
remove_hiddenr<Zpillar_scheduleZ
opts_scheduleZ	_schedule�job�itemrrr�
_get_schedule�s*






�zSchedule._get_schedulecCsd|vs|ds
|Sd|vs|drd}|jddkr$tjj�|j�}ntjj�|j�}|D]P}d|vr~t�d||�|d|dkr~tjj	�
|d	�r~|d
7}t�d||d�||dkr~t�d
|d|d�d|d<d|d<||d<d|d<|Sq.|S)r:�run�jid_includer�__role�masterr<z5schedule.handle_func: Checking job against fun %s: %s�name�pid�zEschedule.handle_func: Incrementing jobcount, now %s, maxrunning is %s�
maxrunningzNschedule.handle_func: The scheduled job %s was not started, %s already running�_skip_reasonT�_skipped�
_skipped_timeF)rr r
rMZget_running_jobs�minionZrunningr
rr5�
os_is_running)r�func�datar�nowZjobcountZcurrent_jobsrGrrr�_check_max_running�sL������zSchedule._check_max_runningc
Cs(|j�dd�}|durd|jvrtj�|jd�}|dur!tjj}tj�|tj�|j�dtj	j
d���}tj�|�s@t�|�tj�|d�}t
�d�|jddd	�}z.tjj�|d
��}|�tjj�tjj�d|i���Wd�WdS1szwYWdSty�t
jdtjd
�YdSw)ze
        Persist the modified schedule into <<configdir>>/<<default_include>>/_schedule.conf
        Zconf_dirNZ	conf_fileZdefault_includez_schedule.confzPersisting scheduleFT)rErFzwb+r<z&Failed to persist the updated scheduler)rr)�os�path�dirnamer ZsyspathsZ
CONFIG_DIR�joinZconfigZDEFAULT_MINION_OPTS�isdir�makedirsr
rrIr
�files�fopen�writeZstringutils�to_bytesZyamlZ	safe_dump�OSError�errorr-r.)rZ
config_dirZminion_d_dirZ
schedule_confZ
schedule_data�fp_rrr�persistsB
���


��&���zSchedule.persistcCs�||jdvr|jd|=n||jdd�vrt�d|�|rEtjjjd|jdd��}|jd|��d�d	d
�Wd�n1s@wY||j	vrN|j	|=|rV|�
�dSdS)zK
        Deletes a job from the scheduler. Ignore jobs from pillar
        r<F�rD�)Cannot delete job %s, it's in the pillar!rU�r�listenT��completer<�,/salt/minion/minion_schedule_delete_complete��tagN)rrIr
r,r r
�event�	get_event�
fire_eventrrh�rrNrhrt�evtrrr�
delete_job>s&���
	�zSchedule.delete_jobcCs&d|_d|_d|_d|_i|jd<dS)z1
        Reset the scheduler to defaults
        NTr<)r"r#r%r$rr7rrr�resetYs
zSchedule.resetcCs�t|jd���D]
}|�|�r|jd|=q	|jdd�D]
}|�|�r*t�d|�q|rTtjj	j
d|jdd��}|jd|��d�d	d
�Wd�n1sOwYt|j���D]}|�|�rf|j|=q[|ro|�
�dSdS)zL
        Deletes a job from the scheduler. Ignores jobs from pillar
        r<FrirjrUrkTrmrorpN)�listr�keysrCrIr
r,r r
rrrsrtrrh)rrNrhrtrGrvrrrr4cs2
�
����	
��zSchedule.delete_job_prefixcCs$t|t�s	td��t|�dkstd��|D]}d||vr#d||d<qtt|����}||jdd�vr;t�	d|�n$||j
d	vrQt�d
|�|j
d	�|�nt�d|�|j
d	�|�|r�t
jjjd|j
dd
��}|jd|��d�dd�Wd�n1s�wY|r�|��dSdS)z�
        Adds a new job to the scheduler. The format is the same as required in
        the configuration file. See the docs on how YAML is interpreted into
        python data-structures to make sure, you pass correct dictionaries.
        z'Scheduled jobs have to be of type dict.rPz,You can only schedule one new job at a time.r%TFriz)Cannot update job %s, it's in the pillar!r<z+Updating job settings for scheduled job: %szAdded new job %s to schedulerrUrkrmz)/salt/minion/minion_schedule_add_completerpN)r&r'r?�len�next�iterrzrIr
r,r�infor@r r
rrrsrtrh)rrXrhrtrGZnew_jobrvrrr�add_job�s:
	�����zSchedule.add_jobcCs�||jdvrd|jd|d<t�d|�n||jdd�vr%t�d|�|rNtjjjd|jdd	��}|j	d|��d
�dd�Wd
�n1sIwY|rV|�
�d
Sd
S)zI
        Enable a job in the scheduler. Ignores jobs from pillar
        r<Tr%zEnabling job %s in schedulerFri�)Cannot modify job %s, it's in the pillar!rUrkrmz1/salt/minion/minion_schedule_enabled_job_completerpN�rr
r~rIr,r r
rrrsrtrhrurrr�
enable_job�s$����zSchedule.enable_jobcCs�||jdvrd|jd|d<t�d|�n||jdd�vr%t�d|�|rNtjjjd|jdd��}|j	d	|��d
�dd�Wd
�n1sIwY|rV|�
�d
Sd
S)zJ
        Disable a job in the scheduler. Ignores jobs from pillar
        r<Fr%zDisabling job %s in schedulerrir�rUrkTrmz2/salt/minion/minion_schedule_disabled_job_completerpNr�rurrr�disable_job�s$���	�zSchedule.disable_jobcCs`||jdvr|�|||�n||jdd�vrt�d|�dS||jd|<|r.|��dSdS)zI
        Modify a job in the scheduler. Ignores jobs from pillar
        r<Frir�N)rrwrIr
r,rh)rrNr<rhrtrrr�
modify_job�s�zSchedule.modify_jobcCs�|���|i�}d|vr|d}nd|vr|d}nd|vr#|d}nd}||jvr1t�d||�d|vr9||d<d|vrAd|d<|jsP|�|||jtj�	��}|�d�rct�d	|�|�
||�dSdS)
z(
        Run a schedule job now
        �functionrW�funN�)Invalid function: %s in scheduled job %s.rNrJTzRunning Job: %s)rIr)rr
r~r	rZr�datetimerY�_run_job)rrNrXrWrrr�run_job�s,



�
�zSchedule.run_jobcCstd|jdd<|r0tjjjd|jdd��}|jd|��d�dd	�Wd
�n1s+wY|r8|��d
Sd
S)z'
        Enable the scheduler.
        Tr<r%rUFrkrmz-/salt/minion/minion_schedule_enabled_completerpN�rr r
rrrsrtrIrh�rrhrtrvrrr�enable_schedule�����zSchedule.enable_schedulecCstd|jdd<|r0tjjjd|jdd��}|jd|��d�dd	�Wd
�n1s+wY|r8|��d
Sd
S)z(
        Disable the scheduler.
        Fr<r%rUrkTrmz./salt/minion/minion_schedule_disabled_completerpNr�r�rrr�disable_schedule$r�zSchedule.disable_schedulecCs.i|_d|vr|d}|j�di��|�dS)z?
        Reload the schedule from saved schedule file.
        r<N)rr�
setdefaultr@)rr<rrr�reload7szSchedule.reloadcCs�|dkr|jdd�}n|dkr|jdd�}n|��}|rDtjjjd|jdd��}|jd|d	�d
d�Wd�dS1s=wYdSdS)
z1
        List the current schedule items
        r;Frir)rErUrkTrmz*/salt/minion/minion_schedule_list_completerpN)rIr r
rrrsrrt)r�wherertr<rvrrrryBs ��"��z
Schedule.listcCs^|��|r-tjjjd|jdd��}|jddidd�Wd�dS1s&wYdSdS)	z+
        Save the current schedule
        rUFrkrnTz"/salt/minion/minion_schedule_savedrpN)rhr r
rrrsrrt)rrtrvrrr�
save_scheduleWs��"��zSchedule.save_schedulecCs(|d}|d}|�dd�}||jdvrXd|jd|vr'g|jd|d<|jd|d�||d��d|jd|vrHg|jd|d<|jd|d�||d��n||jd	d
�vrft�d|�|r�tjjj	d|jd	d
��}|j
d|��d�dd�Wd�dS1s�wYdSdS)zS
        Postpone a job in the scheduler.
        Ignores jobs from pillar
        �time�new_time�time_fmt�%Y-%m-%dT%H:%M:%Sr<�
skip_explicit�r�r��run_explicitFrir�rUrkTrmz2/salt/minion/minion_schedule_postpone_job_completerpN�r)r�appendrIr
r,r r
rrrsrt)rrNrXrtr�r�r�rvrrr�postpone_jobfs6����"��zSchedule.postpone_jobcCs�|d}|�dd�}||jdvr3d|jd|vr#g|jd|d<|jd|d�||d��n||jdd�vrAt�d	|�|rmtjjj	d
|jdd��}|j
d|��d
�dd�Wd�dS1sfwYdSdS)zb
        Skip a job at a specific time in the scheduler.
        Ignores jobs from pillar
        r�r�r�r<r�r�Frir�rUrkTrmz./salt/minion/minion_schedule_skip_job_completerpNr�)rrNrXrtr�r�rvrrr�skip_job�s*���"��zSchedule.skip_jobr�cCs�|��}d}|r|�|i��dd�}|r|�|�}|rCtjjjd|jdd��}|jd|d�dd	�Wd�dS1s<wYdSdS)
zA
        Return the next fire time for the specified job
        N�_next_fire_timerUFrkT)rnZnext_fire_timez4/salt/minion/minion_schedule_next_fire_time_completerp)	rIr)�strftimer r
rrrsrrt)rrN�fmtrtr<r�rvrrr�get_next_fire_time�s"
��"��zSchedule.get_next_fire_timecCs||r4|��}|�|i�}tjjjd|jdd��}|jd|d�dd�Wd�dS1s-wYdS|��}|�|i�S)	z4
        Return the specified schedule item
        rUFrkT)rnrXz0/salt/minion/minion_schedule_job_status_completerpN)rIr)r r
rrrsrrt)rrNrtr<rXrvrrr�
job_status�s��"�zSchedule.job_statusc!Cs
tjj��s|j�d�dkrCtj�|j�|_|jddkr)tjj|j|jd�|_n
tjj	|j|j
|jd�|_tjj|j|j|j
d�|_|durOtjj�
|j�}|j�d	d�|g|d
|d�}d|vr�t|dt�r�|d|d<|j|dd
<t��|dd<t�dt���|dd<nt�d�|�dd�}|js�tj�tj�|jd�|d�}�zP�zd}|j�di��dd�r�|j�di��dg�}	|dkr�||	vr�d}n |j�di��dd�r�|j�di��dg�}	|dkr�||	vr�d}|r�td��t��|d<t�}
d|v�rt �!|d�}
|d�"|d�i}d |v�r,t �!|d �}|d�#t �!|��||jv�rF|j�$|�|d!<tjj%j&|j�$|�d"�|j�s|d#|v�sT|d#�r|t�'d$|�tjj(�)|d%��}|�*tj+�,|��Wd�n	1�swwYtjj-�.|j|�}
|
j/�r�|�0�D]\}}|d k�r�t �!|�|d&|��<�q�|jddk�r)tjj�
|j�}tjj1j2|d'd(�}tjj1j3tjj1j4|jd|jd)|jdd*�|dd+�}|tjj5�6�|t7�
|�d,�}t � |j�}tjj8�9||�g}|�:�D]0}d-|v�r�q�|�;d-d.�\}}||v�r�q�|�#|�|�0�D]
\}}||j|j<|<�q�q�d/|jj=d0d1<|j||
i|��|d!<|j�s�d1|jj=d0v�rT|jj=d0d1|d1<d|d2<|�s_|j>�r�d3|v�rj|d3|d4<d5|v�ru|d5|d6<g}||j>fD]}t|t?��r�|�#|��q|t|t@��r�|�"|��q|tA�B|�D]}|�d7�}||jv�r�|j||��q�t�Cd8||��q�Wn(tD�y�t�Ed9|d:�d!|v�r�d;�F|d:�|d!<d|d2<d<|d1<YnwWd|jv�r�|jdd=v�r�d>|v�r|d>�sn�|� �}|�s|j>�sd?|d<|�d>�d@k�rd@|d<dA|jd	dB�}|�0�D]	\}}|||<�q'd|jv�rK|jddCk�rKtjj1j4dC|jdd*�}nd|jv�re|jddk�retjj1�G|j|jd)�}z'z|�H|dD�WntD�y�} zt�EdE�WYd} ~ nd} ~ wwW|�I�n|�I�w|jddk�r�|�I�|j�s�t�'dF|�zCzt�J|�Wn+tK�y�} z| jLtLjMk�s�| jLtLjNk�r�n	t�%dG|| jL��WYd} ~ nd} ~ wwW|�r�tO�PtjQjRjS�dSdS|�r�tO�PtjQjRjS�wwdSd|jv�r�|jdd=v�r�d>|v�r|d>�sn�|� �}|�s/|j>�s/d?|d<|�d>�d@k�r/d@|d<dA|jd	dB�}|�0�D]	\}}|||<�q;d|jv�r_|jddCk�r_tjj1j4dC|jdd*�}nd|jv�ry|jddk�rytjj1�G|j|jd)�}z'z|�H|dD�WntD�y�} zt�EdE�WYd} ~ nd} ~ wwW|�I�n|�I�w|jddk�r�|�I�|j�st�'dF|�zAzt�J|�Wn+tK�y�} z| jLtLjMk�s�| jLtLjNk�r�n	t�%dG|| jL��WYd} ~ nd} ~ wwW|�r�tO�PtjQjRjS�ww|�r
tO�PtjQjRjS�www)HzA
        Execute this method in a multiprocess or thread
        Z	transportZzeromqrLrM)r
)rr
)rN�idrN)r�r��fun_argsr<�jid�metadataZ_TOSZ_TSz%Y %B %d %a %H %mZ_TTzNschedule: The metadata parameter must be specified as a dictionary.  Ignoring.�returner�cachedirr�Fr;Zminion_blackoutZminion_blackout_whitelistzsaltutil.refresh_pillarT�grainsz�Minion in blackout mode. Set 'minion_blackout' to False in pillar or grains to resume operations. Only saltutil.refresh_pillar allowed in blackout mode.rO�argsr��kwargs�return)�messagerKzBschedule.handle_func: adding this job to the jobcache with data %szw+bZ__pub_zsalt/scheduler/)r6Zsock_dirrk)Z
print_func)Z__jid__Z__user__Z__tag__Z
__jid_event__�.rPr�__context__�retcode�successZ
return_configZ
ret_configZ
return_kwargsZ
ret_kwargsz	.returnerz,Job %s using invalid returner: %s. Ignoring.zUnhandled exception running %sr�zUnhandled exception running {}�)rMrUZ
return_jobZreqZnocacheZ_return)�cmdr�rUZ__schedule_returnz2Unhandled exception firing __schedule_return eventz!schedule.handle_func: Removing %szFailed to delete '%s': %s)Tr r
�platform�spawning_platformrr)r!ZrunnerrZminion_modsrrr��gen_jidr&r'r*r��ctimer��gmtimer
r,r	r[r\r^rU�get_proc_dirr�getpid�tuplerArB�extendr�Zmissing_fun_stringrfZraise_errorrrarbrc�payload�dumpsr�Zget_function_argspec�keywords�itemsrrZtagifyZNamespacedEventrs�userZget_user�weakrefZlazyZ
verify_funrz�split�__globals__�packr�strryr�fromkeysr~r+�	exception�formatZget_master_eventrtZdestroy�unlinkre�errnoZEEXIST�ENOENTr0�exit�defaultsZ	exitcodesZ
EX_GENERIC)!r�multiprocessing_enabledrWrXr��retZ
data_returnerZproc_fnZminion_blackout_violationZ	whitelistr�r�rgZargspec�key�valrqZnamespaced_eventZfunc_globalsZself_functionsZcompleted_funcs�mod_name�modr>Z
global_key�valueZretsr�Zret_strZmret�loadrr�excrrr�handle_func�s�
�����������


���
���
�


�


�
��
������������
�����������������zSchedule.handle_funccsd	t�d��g}�jd}t|tj�stj|d�}dd�}��fdd�}�fdd	�}���fd
d�}��fdd
�}�fdd�}	��fdd�}
��fdd�}��fdd�}�fdd�}
�fdd�}dd�}���}t|t�sqtd��d|vrz|d�_	d|vr�|d�_
d|vr�|d�_d |vr�|d �_gd!�}|�
�D�]\}�||vr�q�d"D]	}|�vr��|=q�d#�d$�vr��d$}n|}�d$<t�t�s�t�d%|t���q�d&�vr܈d&}nd'�vr�d'}nd(�vr�d(}nd)}|�jvr�t�d*||�d+�v�rd)�d+<d,�v�rd)�d,<d-�v�r!�d-�r!d.�v�r!d/�d.<��s)tj���t�����d0}d1}d2d3�t�|d4�D�}t�fd5d6�|D���rTt�d7d8�|��q�g}|D]}t�|g|�}|�tt�|d4����qXt�fd9d6�|D���r�t�d:d8�|�d8�|��q�d;�v�r�|	�|��d<�d/�fd=d3�|D�v�r�|��n"d>�v�r�|�|�nd?�v�r�|�|�nd@�v�r�|�|�nq�dA�v�rԈdA�r�q�dB�v�r߈dB�r�q�t|�d+�|�����}d �v�r��j�d <d �v�rO�d �rO�d,�s7|�d �}��d+tj|d�k�r5t�dC|��d+tj|d��d,<d?�v�r4d/�dD<nd/��d,�rO�d,���}d?�v�rO�d,�d+<dE�v�r\|dFk�r[d/�nYd?�v�r��dD�r��d+�k�rx�d+|k�r�nn;d#�dD<d/�n4d@�v�r�|dFk�r�d)�d+<d/�n#d>�v�r��d+�k�r��d+|k�r�nn
d/�n|dFk�r�d/�d.�v�rƈd.�r�d/�d#�d.<n���rqdG�v�r�|��dB�v�r݈dB�r�q��d<�d'�v�r�d'}d�v�r��j
�r��j
�d<d�v�r�d�r|�|�dB�v�r�dB�rq��d<�d'�v�r�d'}dH�v�rA|
�|�dB�v�r4�dB�r4q��d<�d'�v�rA�d'}dI�v�rY|��dB�v�rU�dB�rUq��d<�dJ�v�rq|
��dB�v�rm�dB�rmq��d<�dA�v�r}�dA�r}d#��j�r���dd/��s�t�dK|�dL�dM<��dN<d/�dO<d#�dP}|dFk�r�dQt|��dR�}z���r�dS�v�s��dS�r�d/�dS<t�dT|�dU�v�r�t�dV|�dU�n
t�dW|�dX�dU<�j �s��d<<��!|��j����d<���rt"j#j$�%�j�}|�|�t�dY|||��j&|�|dZ�W��r��d[<d)�d,<dE�v�r`�j �r3�tj�dEd��d+<q�dO�v�rQ�dO�rQ�d+�k�rP�tj�dEd��d+<q���r`�tj�dEd��d+<q���rl��d[<d)�d,<dE�v�r��j �r��tj�dEd��d+<wdO�v�r��dO�r��d+�k�r��tj�dEd��d+<w��r��tj�dEd��d+<w|S)\z�
        Evaluate and execute the schedule

        :param datetime now: Override current time with a datetime object instance``

        z%==== evaluating schedule now %s =====r2��secondscSsTd}t|t�r"|d|dkrt�|d|d�}|St�d�|St�d|�}|S)z-
            Calculate splaytime
            N�end�startzSschedule.handle_func: Invalid Splay, end must be larger than start. Ignoring splay.rP)r&r'�random�randintr
rf)Z	splaytimeZsplay_rrr�_splay�s
���zSchedule.eval.<locals>._splaycs�d|vrZt|�dd��}|t|�dd��d7}|t|�dd��d7}|t|�dd��d	7}||d<|d
sD�tj|dd�|d
<|�jkrL|�_�tj|dd�|d<d
Sd
S)zk
            Handle schedule item with time elements
            seconds, minutes, hours, days
            �_secondsr�r�minutes�<�hoursi�daysi�Qr�r��_next_scheduled_fire_timeN)�intr)r��	timedeltar2)rX�interval�rYrrr�_handle_time_elements�s �
��z,Schedule.eval.<locals>._handle_time_elementsc	s�|dr|d�|ks|d�kr|dsd|d<|dsr|dst|d}t|tj�s^|�dd�}ztj�|d|�}Wn ttfy]d�|d||d	�|d
<t�|d
�YdSw||d<||d<|�|krvd|d<dSdSdSdS)
z8
            Handle schedule item with once
            r�r�T�	_continue�once�once_fmtr�z9Date string could not be parsed: {}, {}. Ignoring job {}.rN�_errorNr�)	r&r�r)�strptime�	TypeErrorr?r�r
rf)rXr2r�r��rYrr�_handle_onces6����
�z#Schedule.eval.<locals>._handle_oncec	s�tsd�|d�|d<t�|d�dSt|dt�s!|dg}n|d}g}|D]�}d�jvrgd�jdvrg|�jddvrgt�jddt�s]d�|d�|d<t�|d�dS�jdd|}n>d	�jvr�d�jd	vr�|�jd	dvr�t�jd	dt�s�d
�|d�|d<t�|d�dS�jd	d|}n|}t|tj�s�zt	�
|�}Wnty�d�||d�|d<t�|d�YdSw|�|�q)|dr�|�|d�|�
�t�|�D]}t|�d
kr�|�|kr�|�|�q�|�r_|d}|�|k�r$|�dd��s$��s$|d�s$d|d<d|d<dSd|v�r3t|�|k�|d<|d�s<||d<||d<|d|k�rY��s[|d�s]||d<d|d<dSdSdSdS|�dd��spd|d<d|d<dSdS)z8
            Handle schedule item with when
            �)Missing python-dateutil. Ignoring job {}.rNr�N�whenr;Zwhensz4Pillar item "whens" must be a dict. Ignoring job {}.r�z.Grain "whens" must be a dict. Ignoring job {}.z(Invalid date string {}. Ignoring job {}.r�rPr�_runFr�Tr�r�)�_WHEN_SUPPORTEDr�r
rfr&ryrr'r��dateutil_parser�parser?r��sortrArBr{�remover)�bool)rXr2Z
_when_dataZ_when�iZwhen_r�)rYrJrrr�_handle_when1s��

�
�����	
�
���

��z#Schedule.eval.<locals>._handle_whenc	s�tsd�|d�|d<t�|d�dS|ddurkzt�|d���tj�|d<t�|d���tj�|d<WnttfyTd�|d�|d<t�|d�YdSw�|d�	�}|d	krm|�j
kro|�_
dSdSdSdS)
z8
            Handle schedule item with cron
            z)Missing python-croniter. Ignoring job {}.rNr�Nr��cronr�z%Invalid cron string. Ignoring job {}.r�)�_CRON_SUPPORTEDr�r
rf�croniterZget_nextr�r?�KeyError�
total_secondsr2)rXr2r�r�rr�_handle_cron�s<����
���
�z#Schedule.eval.<locals>._handle_croncs�g}|dD]}t|tj�r|�|�q|�tj�|d|d��qd|d<t�|�D]}t|�dkr?|�|kr?|�|�q,|ra|d�krR|d|krcnd
Sd|d<|d|d	<d
Sd
Sd
S)z@
            Handle schedule item with run_explicit
            r�r�r�FrJrPrTr�N)r&r�r�r�rArBr{r�)rXr2Z
_run_explicitZ	_run_timer�r�rr�_handle_run_explicit�s*��
�&�z+Schedule.eval.<locals>._handle_run_explicitcs�d|d<g}|dD]}t|tj�r|�|�q
|�tj�|d|d��q
t�|�D]
}|�|kr9|�|�q,|rq|d�krL|d|krondS�jr]d|d<�j|d<dSd|d	<�|d
<d|d<d|d<dSdSd|d<dS)
�A
            Handle schedule item with skip_explicit
            FrJr�r�r�rTrWrRrTrSN)r&r�r�r�rArBr�r")rXr2Z_skip_explicitZ
_skip_timer�r�rr�_handle_skip_explicit�s2��
�&�
z,Schedule.eval.<locals>._handle_skip_explicitcs�tsd�|d�|d<t�|d�dSt|dt�s-d�|d�|d<t�|d�dS|dd}|dd}t|tj�sazt�|�}Wnt	y`d	�|d�|d<t�|d�YdSwt|tj�s�zt�|�}Wnt	y�d
�|d�|d<t�|d�YdSwd|vr�|dr�d|vr�g|d<||�
d
�}||dvr�|d�|d
d��||kr�|�kr�|kr�nn �jr�d|d<�j|d<dSd|d<�|d<d|d<d|d<dSd|d<dSd�|d�|d<t�|d�dS)rr�rNr�Nr#zXschedule.handle_func: Invalid, range must be specified as a dictionary. Ignoring job {}.r�r�zDInvalid date string for start in skip_during_range. Ignoring job {}.zBInvalid date string for end in skip_during_range. Ignoring job {}.Zrun_after_skip_ranger�r�r�TrJrW�
in_skip_rangerRrTrSF�Tschedule.handle_func: Invalid range, end must be larger than start. Ignoring job {}.)
�_RANGE_SUPPORTEDr�r
rfr&r'r�r�r�r?r�r�r")rXr2r�r�Z_run_immediater�rr�_handle_skip_during_rangesp�
�
��	
���
�z0Schedule.eval.<locals>._handle_skip_during_rangecs�tsd�|d�|d<t�|d�dSt|dt�s-d�|d�|d<t�|d�dS|dd}|dd}t|tj�sazt�|�}Wnt	y`d	�|d�|d<t�|d�YdSwt|tj�s�zt�|�}Wnt	y�d
�|d�|d<t�|d�YdSw||kr�d|dvr�|ddr��|ks��|kr�d|d
<dSd|d<d|d
<dS|�kr�|kr�nnd|d
<dS�j
r�d|d
<�j
|d<dSd|d<d|d
<dSd�|d�|d<t�|d�dS)r�(Missing python-dateutil. Ignoring job {}rNr�N�rangezWschedule.handle_func: Invalid, range must be specified as a dictionary.Ignoring job {}.r�r�z/Invalid date string for start. Ignoring job {}.z-Invalid date string for end. Ignoring job {}.�invertTrJrrRFrWZnot_in_ranger	)r
r�r
rfr&r'r�r�r�r?r")rXr�r�r�rr�
_handle_rangeOsj�
����	���	
�z$Schedule.eval.<locals>._handle_rangecs�tsd�|d�|d<t�|d�dS|d}t|tj�s#t�|�}|�krAt�d|d�d|d<�|d	<d
|d<d|d
<dSd
|d
<dS)z9
            Handle schedule item with after
            rrNr�N�afterz+After time has not passed skipping job: %s.Zafter_not_passedrRrTTrSFrJ�	r�r�r
rfr&r�r�r�r)rXrr�rr�
_handle_after�� �
z$Schedule.eval.<locals>._handle_aftercs�tsd�|d�|d<t�|d�dS|d}t|tj�s#t�|�}|�krAt�d|d�d|d<�|d	<d
|d<d|d
<dSd
|d
<dS)z9
            Handle schedule item with until
            rrNr�N�untilz'Until time has passed skipping job: %s.Zuntil_passedrRrTTrSFrJr)rXrr�rr�
_handle_until�rz$Schedule.eval.<locals>._handle_untilcSs|tj|jd�S)zH
            Remove the microseconds from a datetime object
            )�microseconds)r�r��microsecond)�dtrrr�_chop_ms�szSchedule.eval.<locals>._chop_msr=r"r#r%r$)r%r"r#r$)r�r�Z_enabledrSrRrTFrNz3Scheduled job "%s" should have a dict value, not %sr�rWr�Nr�r�r�Zrun_on_startZ
_run_on_startT)r�r�r�r�)r�r�r�cSsg|]}t|��qSr��set��.0r�rrr�
<listcomp>s�z!Schedule.eval.<locals>.<listcomp>�c3s�|]}|�kVqdSrrr��
schedule_keysrr�	<genexpr> s�z Schedule.eval.<locals>.<genexpr>z.Unable to use "%s" options together. Ignoring.z", "c3s�|]	}t|��kVqdSrr)r�xr rrr",s�z.Unable to use "%s" with "%s" options. Ignoringr�rJcsg|]}|�vrd�qS�Tr)rrH)rXrrr8sr�r�r�r�r�z=schedule.handle_func: Adding splay of %s seconds to next run.r�r�rr
r�rrzJob: %s is disabled�disabledrRrTrS�z (runtime missed by z	 seconds)rKz_schedule: Job %s was scheduled with jid_include, adding to cache (jid_include defaults to True)rQz6schedule: Job %s was scheduled with a max number of %szMschedule: maxrunning parameter was not specified for job %s, defaulting to 1.rPz'Running scheduled job: %s%s with jid %s)r�Z	_last_run)'r
Ztracerr&r�r�rIr'r?r"r#r%r$r�rf�typerr~rYrrz�	itertools�combinations�anyr^�chainr�r�rrr)�absr	rZr r
r�r�r�)rrYZjidsr2r�r�r�r�rrrrrrrrr<Z_hiddenrGrHZjob_namerWZ
time_elementsZscheduling_elementsZinvalid_sched_combosZinvalid_time_combosZ	all_itemsr�r$Zmiss_msgr�r)rXrYrJr!rr�eval�s2
"m$#OG




�

�






�


���





�


��
�
�



�
�
��

�

�
��












�
��
��
������
�	����z
Schedule.evalc
Cs�|�dd�}|rt�d|d�dS|j�dd�}|j�dd�}|dur.|�d|||�dS|rHtjj��rH|j	}i|_	|j
}i|_
|j}	i|_zt|rQtjjj}
nt
j}
d�|d|�}|r�tjj�tjtj��|
|j||||f|d	�}|��|j�|�Wd�n1s�wYn|
|j||||f|d	�}|��|j�|�W|r�tjj��r�||_	||_
|	|_dSdSdS|r�tjj��r�||_	||_
|	|_w)
N�dry_runFz1Job %s has 'dry_run' set to True. Not running it.rN�multiprocessingT�run_schedule_jobs_in_backgroundzSchedule(name={}, jid={}))�targetr�rN)r)r
rrr�r r
r�r�rrr5ZSignalHandlingProcess�	threading�Threadr�Zdefault_signals�signal�SIGINT�SIGTERMr�r�add)
rrWrXr�Zjob_dry_runr�r0rrr
Z
thread_clsrN�procrrrr�sd�
���
��
�zSchedule._run_jobcCs|j��dSr)rrr7rrr�cleanup_subprocessesYszSchedule.cleanup_subprocesses)NNNNFFNN)NNNNFNN)TTF)TTr$)r�T)Fr)"�__name__�
__module__�__qualname__�__doc__rrrrr8r/rIrZrhrwrxr4rr�r�r�r�r�r�r�ryr�r�r�r�r�r�r-r�r9rrrrrFs�
�-
�
�7	
�3
'



.


"




$




M<rc
CsVt�tj�|d��D]�}tj�tj�|d�|�}tjj�	|d��~}d}ztj
�|�}Wn0ty]tjj
��r>|��zt�|�WYWd�qty\YYWd�qwwt�d|�|dur�d|vr�tjj�|d�r~t�d|d�ntjj
��r�|��zt�|�Wn	ty�YnwWd�n1s�wYqdS)z�
    Loop through jid files in the minion proc directory (default /var/cache/salt/minion/proc)
    and remove any that refer to processes that no longer exist
    r��rbNz>schedule.clean_proc_dir: checking job %s for process existencerOz@schedule.clean_proc_dir: Cleaning proc dir, pid %s still exists.)r[�listdirr rUr�r\r^r
rarbr�r�r+r�Z
is_windows�closer�rer
rr5rV)rZbasefilenameZfn_rgrGrrrr3]sL
���
�������r3)1r=rAr�r�r(r-r[r�r4r0r2r�r�Zsalt.configr Zsalt.defaults.exitcodesZsalt.exceptionsZsalt.loaderZsalt.minionZsalt.payloadZ
salt.syspathsZsalt.utils.argsZsalt.utils.errorZsalt.utils.eventZsalt.utils.filesZsalt.utils.jidZsalt.utils.masterZsalt.utils.minionZsalt.utils.platformZsalt.utils.processZsalt.utils.stringutilsZsalt.utils.userZsalt.utils.yamlrZsalt.utils.odictrZdateutil.parser�parserr�r�r
�ImportErrorrr�	getLoggerr:r
rr3rrrr�<module>s���
%