k1j)/ dZddlZddlmZmZddlmZddlmZddlm Z ddl m Z m Z m Z mZmZmZddl mZdd lmZdd lmZmZdd lmZdd lmZdd lmZddlmZddl m!Z!ddl"m#Z#m$Z$ddl%m&Z&ddl'm(Z(m)Z)ddl*m+Z+ee,Z-ej.ej/ej0ej1gZ2ej.ej1gZ3dZ4e dZ5edz Z6dZ7e dZ8edZ9dZ:de;dededS)!u  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 N)datetime timedelta)cache) getLogger)Path)ANTIVIRUS_MODEMalwareMalwareScanSchedule SystemConfig UserConfigeffective_user_config)MalwareScanScheduleInterval) LicenseCLN) MessageSink MessageSource)register_lock_file)recurring_check) check_lock)HOUR)MalwareScanQueuePut)MalwareScanResourceTypeMalwareScanType) get_crontab)reset_malware_schedule user_list)CronTabz 0 0 31 2 0z$/var/imunify360/last_check_dttm.jsonschedule_watcherz-/var/imunify360/premium_revisium_license.flagcVtjjS)zGet the local timezone.)rnow astimezonetzinfo]/opt/imunify360/venv/lib/python3.11/site-packages/imav/malwarelib/plugins/schedule_watcher.py_get_local_timezoner&Ss <>> $ $ & & --r$ctj}t}t p|p|}|rt nt SN)ris_valid_av_plusREVISIUM_PREMIUM_MARKERexistsrAVAILABLE_INTERVALS AVP_INTERVALS) valid_avprevisium_license_exists conditions r%allowed_schedule_intervalr1YsF+--I5<<>>##L L5LI"+ >  >r$user admin_configreturncvt|t|}|di}|dtj}|dtj}|dtj}|dtj}||||fS)a Get schedule configuration for a given user. Returns a tuple of (interval, hour, day_of_month, day_of_week). Falls back to system defaults if user config is incomplete or missing. Args: user: Username to get schedule configuration for admin_config: System configuration object Returns: Tuple of (interval, hour, day_of_month, day_of_week) )usernameMALWARE_SCAN_SCHEDULEintervalhour day_of_month day_of_week)r r getr INTERVALr DAY_OF_MONTH DAY_OF_WEEK)r2r3eff schedule_cfgr8r9r:r;s r%get_user_schedule_configrB`s j$.G.G.G H HC772B77L ,?,HIIH   F$7$< = =D##+8L""*6K T< 44r$c eZdZedefdeezdedefdZdZ dZ dZ dd ed ed zd ed zd ed zdef dZ de fdZde dd fdZedede de defdZddZde de defdZ ddeedeed zdd fdZd S)ScheduleWatcherr check_filecheck_interval lock_filec~t||_|pt|_t ||j|_dSr()r _check_file!_DEFAULT_RECURRING_CHECK_INTERVAL_check_intervalrSCOPE _lock_file)selfrErFrGs r%__init__zScheduleWatcher.__init__s>  ++  ?? -Y CCr$c KdSr(r#)rNloops r% create_sinkzScheduleWatcher.create_sinks  r$c K||_||_|ttd|j|j|j|_dS)NT)check_period_firstcheck_lock_periodrG) _loop_sink create_taskrrrKrM schedule_scan_task)rNrQsinks r% create_sourcezScheduleWatcher.create_sourcesw  %% " O#'"&"6/       " " $ $   r$cVK|j|jd{VdSr()rZcancel)rNs r%shutdownzScheduleWatcher.shutdowns: jr$Nr8r9r:r;r4c~|tjkrtS|tvr"td|tS|t x}vr#td||tS|pd}|pd}|pd}|tjkr|ddf}n|tj kr|d|f}n||df}dj |S)NzUnsupported interval value: %szEMalware schedule is not in allowed intervals: schedule=%s, allowed=%s01*z 0 {} {} * {}) IntervalNONENEVER_SCHEDULEr,loggererrorr1infoDAYWEEKformat)rNr8r9r:r; intervals cron_argss r%create_schedulezScheduleWatcher.create_schedules x} $ $! ! 0 0 0 LL98 D D D! ! +D+F+FFi G G KK     " !{s#*s !(S x| # #c3II  & &c;.IIlC/I$~$i00r$c` tjtj|j}|j"|t}|S#t$r9tj tt|j z cYSwxYw)zARead last check datetime from file, ensuring it's timezone-aware.Nr")seconds) r fromisoformatjsonloadsrI read_textr"replacer&FileNotFoundErrorr rrKrNdttms r%_read_last_check_dttmz%ScheduleWatcher._read_last_check_dttms ) 4+557788D{"||+>+@+@|AAK    < 3 5 566,:::    sA'A**AB-,B-rzc|j"|t}|jt j|dS)z@Write last check datetime to file, ensuring it's timezone-aware.Nrq)r"rwr&rI write_textrtdumps isoformatrys r%_write_last_check_dttmz&ScheduleWatcher._write_last_check_dttmsU ; <<':'<'<<==D ##DJt~~/?/?$@$@AAAAAr$scheduler last_checkc|tkrdS|jr|dn|}|jr|dn|}t||dd}|duo||kS)NFrqT)return_datetime default_utc)rfr"rwrnext)rr rlast_check_naive now_naive next_run_dttms r% _is_it_timezScheduleWatcher._is_it_times ~ % %5   J  d  + + +  14 CCKKtK,,, )0):):)?)? d*@* * D(F]Y-FFr$cK|}tjt}|||d{V}|r||dSdSr()r{rr r&_schedule_scanr)rNrr scheduleds r%rYzScheduleWatcher.schedule_scans//11 l.0011--c:>>>>>>>>   -  ' ' , , , , , - -r$cKtjtvr(tdt t jd{V}t}g}g}|D]}t|d|\}} } } | || | | } | | ||rt| |dtjrMt|dx} r6t!| r| | |r(||t&jgd{V|rgt+t-|}tdd|||d{VdStdd S) Nz4Malware schedule interval is being reset to defaultsr2home)modesz7Trigger scheduled background malware scan for paths: %sz, Tz6No paths to scan in scheduled background malware scan.F)r r=r1rgrirr panel_usersr rBrorappendr CRONTABS_SCAN_ENABLEDrrr+trigger_malware_scanrFILElistsetjoin)rNr rusersr3to_scan crontabs_scanur8r9r:r;rpaths r%rzScheduleWatcher._schedule_scans.  '/H/J/J J J KKN O O O " $ $ $+--------#~~ #%  / /A )6LAA  ++$ kH#z:: /qy)))1/!,QvY!7!77/T ))++/ "((...  ++&=&B%C,         3w<<((G KKI '""   ++G44 4 4 4 4 4 4 44 KKH   5r$pathsrcK|sdS|tjtjg}ts`tjrTtj|vrF|jt|tjtj dd{Vtj|vrH|jt|tjtj dd{VdSdS)N) resource_type scan_type)r scan_args) rDBrrr DATABASE_SCAN_ENABLEDrWprocess_messagerr BACKGROUND)rNrrs r%rz$ScheduleWatcher.trigger_malware_scan*s8   F =,/1H1MNE - (*e33*,,#)@)C%4%?        # '5 0 0*,,#)@)E%4%?          1 0r$)NNN)r4Nr()__name__ __module__ __qualname___DEFAULT_LAST_CHECK_FILE_DEFAULT_LOCK_FILE_NAMEstrrfloatrOrRr\r_rorr{r staticmethodboolrrYrrrrr#r$r%rDrDs": !0 D D$J D D D D D D        #'"& 111Dj1Dj 1 4Z 1 1111B x    B8BBBBB GG$G2:G GGG\G(----55)15 5555t7;##Cy#+,t3#  ######r$rD)?__doc__rtrr functoolsrloggingrpathlibr defence360agent.contracts.configrr r r r r rrd!defence360agent.contracts.licenser!defence360agent.contracts.pluginsrr'defence360agent.subsys.persistent_staterdefence360agent.utilsr defence360agent.utils.check_lockrdefence360agent.utils.commonrimav.contracts.messagesrimav.malwarelib.configrrimav.malwarelib.scan.crontabrimav.malwarelib.utilsrrimav.malwarelib.utils.crontabr__file__rgrerjrkMONTHr,r-rfrrJrr*r&r1rtuplerBrDr#r$r%rs* ((((((((988888GFFFFF111111777777------777777544444CCCCCCCC111111 8   M L M N  M N 4 FGG$(1H!, $NOO... ???5 5)5 3S# 5555>NNNNNk=NNNNNr$