<3BxdZ ddlmZddlmZmZddlZddlZddlZgdZe eZ e e \Z Z ZZZZZgdZeddd d d d d dddddd edddd d d d diZdddddddZdZejdkreefZe ZneeefZedZedZedZed Z ed Z!ed! Z"ed" Z#e$Z%d#Z&d$Z'd%Z(d&d'd(d)e'd*e(d+d,d-d.d/d0g Z)d1Z*d2Z+d3Z,d4Z-d5d6d7e*e+d8e,d9d:d;e-d<d=e,gZ.ed>d?Z/d@Z0GdAdBe$Z1dCZ2GdDdEe$Z3edfdFZ4dS)Gu  This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program.  If not, see . Copyright © 2019 Cloud Linux Software Inc. This software is also available under ImunifyAV commercial license, see ) namedtuple)datetime timedeltaN)r;r)r))r )r)i3)secondminutehourdaymonth isoweekdayyearr r  r ) janfebmaraprmayjunjulaugsepoctnovdec)sunmontuewedthufrisatz 0 0 1 1 *z 0 0 1 * *z 0 0 * * 0z 0 0 * * *z 0 * * * *)z@yearlyz @annuallyz@monthlyz@weeklyz@dailyz@hourlyaVersion 0.22.0+ of crontab will use datetime.utcnow() and datetime.utcfromtimestamp() instead of datetime.now() and datetime.fromtimestamp() as was previous. This had been a bug, which will be remedied. If you would like to keep the *old* behavior: `ct.next(..., default_utc=False)` . If you want to use the new behavior *now*: `ct.next(..., default_utc=True)`. If you pass a datetime object with a tzinfo attribute that is not None, timezones will *just work* to the best of their ability. There are tests...)rr)seconds)minutes)hours)daysimc|tz}|j|jkr|tz }|j|jk|dtz SNr )r)DAYrreplace)dtndts R/opt/imunify360/venv/lib/python3.11/site-packages/imav/malwarelib/utils/crontab.py _end_of_monthr=sM s(C (ci   s  (ci   ;;1;   ##c|}|tz }|j|jkr|tz }|j|jk|d}||z Sr7)MONTHrr8r9r:modts r< _month_incrrDsW C%KB (ci   c  (ci     B 8Or>c|jdz}|dkr!|j|jfdkrttzS|dkr!|j|jfdkrttzStS)NrrrrrrrYEARr8r:rBmods r< _year_incrrLs^ 'A+C axxRXrv&00cz axxRXrv&00cz Kr>ctSNSECONDas r<rSvr>ctSrNMINUTErQs r<rSrSrTr>ctSrNHOURrQs r<rSrSstr>ctSrNr8rQs r<rSrSsr>ctSrNr\rQs r<rSrSr]r>c.|dS)Nrrr9r:xs r<rSrS"**A*&&r>c.|dS)Nrrrarbs r<rSrSrdr>c.|dS)Nrrrarbs r<rSrSs"**!*$$r>cH|tkr|dn|Sr7r8r9rbs r<rSrSs!q3ww"***###Br>cH|tkr|dn|S)Nr rrjrbs r<rSrSs!S"**1*%%%br>c|SrNrbs r<rSrS"r>c|jjdkrt S|}|tz x}}|j|jkr|tz}|j|jk||z S)Nl)rinputr8r)r:rBrCr;s r< _day_decrrss]u{ct CCxC" (ci   c  (ci   8Or>cL|}|dtz }||z Sr7)r9r8rAs r< _month_decrrus( C   S B 8Or>c|jdz}|dkr"|j|jfdkrttz S|dkr"|j|jfdkrttz St S)NrrrFr rHrJs r< _year_decrrwsd 'A+C axxRXrv&00} axxRXrv&00} 5Lr>c|t kr|S|j}|j|kr|tz }|j|k|tz SrN)r8r)r:rccurs r<_day_decr_resetrzsCSDyy (C (c// c  (c// 8Or>ct SrNrOrQs r<rSrSwr>ct SrNrVrQs r<rSrSr|r>ct SrNrYrQs r<rSrSsur>ct SrNr\rQs r<rSrSstr>c.|dS)Nrr`rarbs r<rSrS"**B*''r>c.|dS)Nrrfrarbs r<rSrSrr>c.|dS)Nrrhrarbs r<rSrSs"**"*%%r>cJ|t kr|dn|S)Nr rlrjrbs r<rSrSs#!sd(("**2*&&&r>c|SrNrnrbs r<rSrSror>Matcherz/second, minute, hour, day, month, weekday, yearc.|st||zdSrN) ValueError) conditionmessageargss r<_assertrs& )4((())r>c>eZdZdZd dZdZdZdZdZdZ d Z d S) _Matcher)allowedendanyrrwhichsplitloopFcLtd|cxko tkncd||_|jd|_||_t |_d|_d|jvpd|jv|_ ||_ |jD]>}| ||\}}||j |||_?t|jdud|t|j|_dS)a. input: `which` - index into the increment / validation lookup tables `entry` - the value of the column `loop` - do we loop when we validate / construct counts (turning 55-5,1 -> 0,1,2,3,4,5,55,56,57,58,59 in a "minutes" column) rz)improper number of cron entries specified,N*?zimproper item specification: %r)r YEAR_OFFSETlowerrrrrsetrrrr_parse_crontabupdate frozenset)selfrentryritalens r<__init__z_Matcher.__init__s)   % % % %+ % % % % 7   [[]] Z%%c**  uu $*$9tz(9 *  B((33FB~ ##B'''DHH HD - KKMM   !.. r>c t|jD]\}}|dkr|t|jkrdS(|dr|j|t zjkrV|dd}|r"|dkrt|dnd}||krdSd| dddd D\}}tt||dz}d |vr| d||vrdS|d r|dd}t|j|rt|d}|z |kcSd | dddd D\}}|tfd t||dzDvrdS|j p||jvS)NrqTr 7rrc36K|]}t|dVdSrNint.0is r< z$_Matcher.__call__..&*HHQc!RjjHHHHHHr>-rrzc36K|]}t|dVdSrrrs r<rz$_Matcher.__call__..4rr>c3"K|] }|z V dSrNrn)rreoms r<rz$_Matcher.__call__..5s'CCC!GCCCCCCr>) enumeraterr=r startswithrWEEKisdigitr partitionrrangeaddrr) rvr:rrcstartrrrs @r<__call__z_Matcher.__call__sdj))" " DAqCxx b))---44.c"" 8T 000abbE99;;&'3hhAr AAAvv#ttHH!++c2B2B33Q32GHHH seE373344<<KKNNN<<44 c"" abbE#B''+99;;*Ar A!G>)))HH!++c2B2B33Q32GHHH sCCCCU5#'-B-BCCCCCCC44x,1 ,,r>ch|jr |jkStfd|jDS)Nc3$K|] }|kV dSrNrnritemothers r<rz"_Matcher.__lt__..='99D4%<999999r>)rrallrrrs `r<__lt__z_Matcher.__lt__:s? 8 $8e# #9999DL999999r>c|jrt|jdkStfd|jDS)Nrc3$K|] }|kV dSrNrnrs r<rz"_Matcher.__gt__..Brr>)r_rangesrrrrs `r<__gt__z_Matcher.__gt__?sI 8 24:&q)E1 19999DL999999r>c>|jr|jS|j|jkSrN)rrrs r<__eq__z_Matcher.__eq__Ds# 8 9 |u},,r>c8t|j|jfSrN)hashrr)rs r<__hash__z_Matcher.__hash__IsTXt|,---r>c fd  fd}t\  dvr4dkr*tttfvdtdfSdkrttkddfSd rttkd d dd \}}}td drd t|dcxkodkncpk|oi|oU|oAd t|dcxkodknco#d t|dcxkodknco||kddfSdrttkdd dd \}}}td drd t|dcxkodkncpe|oc|oO|o;d t|dcxkodkncod t|dcxkodkncddfStkrd d dvrS d\ t d t d kd t kd |}tkr.d|vr*| d| d |fS)z This parses a single crontab field and returns the data necessary for this matcher to accept the proper values. See the README for information about what is accepted. c0tvr6|s"|tvrt|St|d|t|d}t|cxkokncd||S)Nz invalid range specifier: %r (%r)rz#item value %r out of range [%r, %r]) _alternaterrr)r _end_limit_startrrs r<_fixz%_Matcher._parse_crontab.._fixUs ""2::<<"E***%e,R00  @"e   RB "**** ****5    Ir>cDd|vr?t|d\}} ttfvr|dkrd}n*|dkr }}n|}} t |gSt |cxkokncdt | t |cxkokncdt |  js"t ||kdt || r# js| z}t |kd||||kr#t t||d z pd St t|d z pd }t|| pd z z}t t||d z pd |zS) Nrrrrz-%s range start value %r out of range [%r, %r]z+%s range end value %r out of range [%r, %r]z&%s range start value %r > end value %rz,first next value %r is out of range [%r, %r]r )default) mapr DAY_OFFSET WEEK_OFFSETrr _attributerrmax) rrr next_valuerightfirst_endrrr incrementrrs r< _parse_piecez-_Matcher._parse_crontab.._parse_piecegsbyy rxx}}55 sZ555#((CsR$w<<' %----:----?5!     #++++++++=5!    9 SL<u%   "Y. *,B ||5aa@@AAAc:>9>BBCCEsin1'=>>>KEuUEAIy~A>>??%G Gr>)rrrzcannot use '?' in the %r fieldNrqz2you can only specify a bare 'L' in the 'day' fieldrz5you can only specify a leading 'Z' in the 'day' fieldr rrrrzZ specifier must include a day number or range 0..7 in the 'day' field, you entered %rz9you can only specify a leading 'L' in the 'weekday' fieldzclast specifier must include a day number or range 0..7 in the 'weekday' field, you entered %r/z;you can only use positive increment values, you provided %rz5increment value must be less than %r, you provided %r) rrrrrrrrrrdiscardr) rrrres_eegoodrrrrrs ``` @@@@@r<rz_Matcher._parse_crontabLsp        $7 H7 H7 H7 H7 H7 H7 H7 H7 H7 H7 Hru~  J  ||j+664u% :  C<< #D   :   c " "*  #G   abb ++C00IB2 qrr""$$>c"bkk)>)>)>)>Q)>)>)>)>! ! !SR[[----A----!SR[[----A---- ! b3   :   c " "  $K   abb ++C00IB2 qrr""$$>c"bkk)>)>)>)>Q)>)>)>)>. . .SR[[----A----.SR[[----A----:   :  K  J %<<${{3// E9Ir**I A M    Z'G    |E"" K  AII LLOOO HHQKKKTzr>N)F) __name__ __module__ __qualname__ __slots__rrrrrrrrnr>r<rrsJI////@%-%-%-N::: ::: --- ...rrrrrr>rcDttjdS)N<)strrandom randrangernr>r<rSrSsc&"2&&''r>cTeZdZdZd dZdZdZdZdede dfd Z dde dfd Z d Z dS) CronTab)matchersrsFcL||_|||||_dS)aM inputs: `crontab` - crontab specification of "[S=0] Mi H D Mo DOW [Y=*]" `loop` - do we loop when we validate / construct counts (turning 55-5,1 -> 0,1,2,3,4,5,55,56,57,58,59 in a "minutes" column) `random_seconds` - randomly select starting second for tasks N)r_make_matchersr)rcrontabrrandom_secondss r<rzCronTab.__init__s(!++GT>JJ r>ct|tsdS|jdd|jddk}|o9|jr|jp+|j o#|j o|jd|jdkS)NFr r) isinstancerrr)rr match_lasts r<rzCronTab.__eq__s%)) 5]122&%.*<<  W ! G :L:M!$q(99  r>ct||}|}t|dkr<|d|rt nd|dn9t|dkr&|d|rt ndtt|dkdt|zfdt|D}t|S) z: This constructs the full matcher struct. rr0rr rz=improper number of cron entries specified; got %i need 5 to 7c8g|]\}}t||Srn)r)rrrrs r< z*CronTab._make_matchers..5s6   -9UEHUE4 ( (   r>) _aliasesgetrleninsert_gvappendrrr)rrrrctrs ` r<rzCronTab._make_matcherss,,w00 ]]__ r77a<< IIa.9c : : : IIcNNNN WW\\ IIa.9c : : : GGqL K        =Fr]]   !!r>ct|}t||}|tkr |dz}|j|||S)zt This tests the given field for whether it matches with the current datetime object passed. r)rgetattrrr)rindexr:atattrs r< _test_matchzCronTab._test_match;sN  r2 K  466A:D#t}U#D"---r>NTc|turBt|ts |r|jr|"t jt tdd}|p0|r|turtj ntj }t|tr*|rtj |ntj |}|| d}}|j}| d|dz|kr$fd}|jr| dnfd}td z } | dkr| s|| j} | z t%d| D]} |t| z|  |rdSn1#t't)t)| xYwtd z } | d z} | dkfd t%tD} t+t-| d d d jD||r |S|stdd d x}}|z } |r| t1|z } t5|dr8| t1|z} n8| t1 |z} | jdz| jz| jdz zS)ze How long to wait in seconds before this crontab entry can next be executed. NrF)tzinfor) microsecondc.jjjkSrN)rrfuturersr<rSzCronTab.next..msFK$-*<<r>c.jjjkSrN)rrrsr<rSzCronTab.next..rsDM.<r>r c<g|]}|Srn)r)rrrrs r<rz CronTab.next..s)FFF!!!V,,FFFr>zu You have discovered a bug with crontab, please notify the author with the following information: crontab: %r now: %r c3$K|] }|jV dSrN)rr)rrBs r<rzCronTab.next..s$44QW444444r>r localizeiQg.A) WARN_CHANGEr _number_typesrwarningswarnWARNING_CHANGE_MESSAGE FutureWarningrutcnownowutcfromtimestamp fromtimestampr9rENTRIESrrxrangeprinttyperrjoin _fix_none utcoffsethasattrrr4r1 microseconds)rr! incrementsdelta default_utcreturn_datetimeonowtz_testto_testincrmatchdelayrs` @r<nextz CronTab.nextFs + % % sM * * & &J &{ M0- C C CK  *+== O    c= ) ) 1)#...+C00 D11c [++mjmoo= C<<<<<<>>,, , .!$1-- -D3   J Yt~~//00 0Er:&& J2;;v#6#6#@#@#B#BCCC6>>>#<#<#F#F#H#HIII J  .1Ci1O O s & F33.G!c>||t|||SrN)r8 _decrements)rr!r.r/r0s r<previouszCronTab.previoussyyk5+OOOr>ct|trtj|}t t D]}|||sdSdS)NFT)rrrr"r%r$r)rrr s r<testz CronTab.testsb e] + + 5-e44EG__  E##E511 uu tr>)FF) rrrrrrrr _incrementsrr8r;r=rnr>r<rrs I K K K K    """8 . . .  ` ` ` ` H  PPPPr>rc||S|SrNrn)drs r<r)r)sy Hr>)5__doc__ collectionsrrrrsysrrrr$r SECOND_OFFSET MINUTE_OFFSET HOUR_OFFSETr MONTH_OFFSETrrrrrr version_inforfloatrr%longrPrWrZr8rr@rIobjectrr=rDrLr>rsrurwrzr:rrrrrr)rnr>r<rLs4 #"""""((((((((     #g,, E'NNP O O    4   v%LM FF$&M 1    1   yqiQya rycfhh $$$ONN&&&&$$6688 $ O''''%%:: " * @   ))) NNNNNvNNNb('sssssfsssl9Q<<      r>