ZFhddlZddlZddlZddlZddlZddlZddlZddlmZm Z ddl m Z m Z ddl mZddlmZddlmZmZmZmZmZddlmZmZmZmZddlmZdd lmZdd l m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z(dd l)m*Z*m+Z+dd l,m-Z-dd l.m/Z/ddl0m1Z1edZ2dZ3dZ4eGddZ5de6fdZ7dZ8d&dZ9d&de e5fdZ:d&dZ;dZdZ?dZ@dZAd ZBd!ZCeDd"kreEejFZGe2Hd#eGee%eG5ed$ed%e"ejejIe3ejejJe4ejKZLeLMeCddddS#1swxYwYdSdS)'N)datetime timedelta)ListOptional) dataclass)or_) ScrapeResult DomainAlertssetup_database session_scopecleanup_old_data) get_domains setup_loggersave_pid_and_lock intersect)init_sentry_client)get_pkg_version)PING_TIMEOUT_STATUS_CODE SENTRY_DNS!ERROR_DOMAINS_PING_RETRY_INTERVALERROR_DOMAINS_ALERT_INTERVAL WMT_LOCK_FILEPING_CONNECTIONS&LICENSE_EXPIRED_FAREWELL_LETTER_MARKERLICENSE_CHECK_PAUSE)NotifierSupportedNotificationTypes) ErrorReport)cfg)CloudlinuxLicenseLib wmt_scannerctjdtjD}tdt |dS)Nc&i|]\}}|dk ||S) report_email).0kvs /builddir/build/BUILDROOT/cl-web-monitoring-tool-3.2.3-1.el9.cloudlinux.x86_64/opt/cloudlinux/venv/lib/python3.11/site-packages/wmt/main.py zreload_conf../s(PPP41aAr?r%r+r)r;r;<sX HHH#'M8C='''&*hsm***%)OXc])))))r+r;returncttjdt} t|}n#tt f$r t}YnwxYwt d|S)Nping_connections)getattrrrrD TypeError ValueErrormax)values r)get_connection_limitrNEs` CG/1A B BE!E  z "!!! ! q%==s2A  A cK|4d{Vfd}|dr|}d|tddz}n<|drd|tddz}|}n d|}d|}||d{V}||_|jdkr|cdddd{VS||d{V}||_|cdddd{VS#1d{VswxYwYdS)a Main 'pinger' 1. Requests domains - if domain responded - keep status code - if no response for timeout - keep Timeout status code - if unreachable (ConnectionError or so) - keep 523 status code (same logic as go implementation) Nc ,Ktj} |4d{V}t|drt|jn|}t ||jtdtj|z zcdddd{VS#1d{VswxYwYdS#tj j $rt |tdzcYStj j$rt |dcYSwxYw)Ntimeoutr<i)r=r>i )r=)timegethasattrr1r<r;statusrD concurrentfutures TimeoutErrorraiohttpclient_exceptions ClientError) target_urlstartresp final_url ping_timeoutsessions r)_fetchzping.._fetchXsIKKE G";;z<;HHD18u1E1E UDH :I+!),TTY[[55H-I)J)J%2 N N N' 6N9E9LNNNNNN,8 G G G( #FFFFFF Gs;B<A!B)B<) B33B<6B37B<<.D,$DDzhttps://zhttp://) startswithlenr?r=) r<rarb semaphorerc https_urlhttp_url https_result http_results `` r)pingrlNs'&&&&&&&& G G G G G G( >>* % % 'I 3s:'7'7#88HH ^^I & & '"SY%99IHH(3((I&H#VI........ '* $  % , ,E&&&&&&&&&&&&&&H#F8,,,,,,,, &) #M&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&sBC%9C%% C/2C/c#Kt}||t|z}tdt ||D]*}t j|st||||V+dS)z ping_timeout: specified in config timeout time (s) for request semaphore: semaphore obj to handle asyncio tasks ping_target_domains: mostly needed for re-pinging error domains Nz Those domains will be pinged: %s)rsetr/debugr1ris_domain_ignoredrl)rarbrgping_target_domainsdomainsdomains r) executorsrts mmG&3*+++ LL3S\\BBBAA$V,, Av|Wi@@ @ @ @AAr+cKtt||||}t|dkrgSd|D} tjtj||d{VS#tj$rjg}|D]*}|s|+|D]3} | |d{V#tj $rY0wxYw|cYSwxYw)Nrc6g|]}tj|Sr%)asyncio create_task)r&coros r) z scrape_sites..s# > > >4W  & & > > >r+rQ) listrtrfrwwait_forgatherrYdonecancelappendCancelledError) ping_site_timeout ping_intervalrbrgrq coroutinestasksresultstasks r) scrape_sitesrs1i 17IGZ[[\\J :! > >: > > >E %gne&rd) is_resolvedF)synchronize_sessionN)rr)rnr addr r<r=r>r?rqueryr filterrin_updatedictr) enginepingedrqfinished_domainserrors_domainsresolvedrbresultrrunfinished_domains unfinisheds r)manage_ping_resultsrsYuuNH v  G' , ,F KK   $2!'!8      !7!E6: F F F#s**-3-Avz** ++++ l## VL(,,X66 7 7 VDT***V F F F!GGGGGGGGGGGGGGG"mmG&3*+++W(88 v  ',  J KK "!      s$C>D,,D03D0:*F11F58F5c tjttz }t |5}|t jt j t| tt j |kt jdk}d|DcdddS#1swxYwYdS)z - gets websites that must NOT be included in alert email: less than ERROR_DOMAINS_ALERT_INTERVAL passed or is_resolved marker was not changed from last alerting )hoursFcg|] }|j Sr%rr&rows r)rzz%get_recent_alerts..s888 888r+N)rnowrrr rr rrrr{keysr alert_timer)r alert_domainsrepeat_intervalrbrecently_alerteds r)get_recent_alertsrs lnny7S'T'T'TTO v  9'"==)=>> VL(,,T-2D2D2F2F-G-GHH //A$0E9;;<< 98'7888 999999999999999999sB%C++C/2C/c Ztdtt|d|D}t tjtj d|itj  |S)z prepares needed error report object with error domains to be alerted and sends this mail returns alerted domains zAlerts will be sent for %sc g|]W\}}t|dttt |t |XS)z, )r<code count_errors)rjoinmapr1rnrf)r&rscodess r)rzzalert..sh FE 3sCJJ//00U   r+ error_report target_email from_emailreportnotification_type) r/r0r1r{rr.rrrrrALERTnotify) domains_datars r)alertrs  KK,D**,,--..000 *//11 L %> L 5: <<< =CFHHH r+c `t||fd|D}|sOtdt t |tdSt|tj }t|5}| ttj}d|D}|D]}||vr^| ttj|kt'|dd|t|| ddddS#1swxYwYdS)aJ - gets recently alerted domains (those that must not be alerted again) and does not include them for alerting - calls alerting for left domains - updates DomainAlerts table: if website was not alerted -> adds new record if website was alerted before -> updates alert time and is_resolved marker c$i|] \}}|v || Sr%r%)r&r'r(rs r)r*z flush_alerts..s*\\\A!K[B[B[1B[B[B[r+zDAll domains "%s" were alerted or still not resolved in last %d hoursNcg|] }|j Sr%rrs r)rzz flush_alerts..s000 000r+F)rr)rr)rr.r/r0r1r{rrrrrr rr with_entitiesrallrrrr) rrdomains_to_alertrrbwebsitesurlsrsrs @r) flush_alertsrs)??\\\\)<)<)>)>\\\  Z]//1122330 2 2 2   ,..C v   J'==.. ]</ 0 0 SUU 10x000& J JF~~ l++VL0F:;;VDCUCCCDDDD LCHHHIIII  J J J J J J J J J J J J J J J J J J Js4C!F##F'*F'c0|rtjjrdSdS)NTF)ralert_notifications_enabled) error_domainss r)should_be_repingedrs <t 5r+ctjtr5tdtjtdSdS)NzCloudLinux license was updated)ospathexistsrr/r0remover%r+r)cleanup_farewell_letter_markerrsM w~~<==: 4555 899999::r+cd tjts_tdt tjtj itj  dSdS#t$rtdYdSwxYw)z@ Sends farewell letter once (if it was not sent before) z/Going to send last email about expired license!rz$Error while managing farewell letterN)rrrrr/warningrrrrrFAREWELLr Exception exceptionr%r+r)manage_license_farewellr$s Aw~~DEE P NNL M M M  ->"<"E  G G GHNvxxxxx  P P AAA?@@@@@@AsBB$B/.B/c :Ktj}tjjdz} tt |t }t j|}t j|4d{V}tj |}ttjj |||d{V}t||} t| rtdt#|  tjjdz}|t$krtj|z } tjt)t+t$| z ddd{V| t$krottjj ||||  d{V} t|| | } t/| | } nnt/|| } | }n| rWtd t#t1| t3|| ng} dddd{Vn#1d{VswxYwYn*#t4$rtd YnwxYw tjjdz}tj|z }t)t+||z dd}tj|d{V||krnmns# tjjdz}tj|z }t)t+||z dd}tj|d{V||krnmwxYw|S) aF Scanner logic: 1. Scrapes domains and obtains ping results; 2. Manage ping results (e.g: saving to DB) 3. In case error domains found -> start re-pinging Re-pinging: - in min(ping_interval, 5 mins) - flush alerts if needed 4. Sleep for ping_interval until next ping iteration <)limit) connectorNz8Those domains are unsuccessful: %s Try to re-ping themTr )rqz1Domains with unsuccessful status code found: "%s"zError during ping iteration!)rSrrrr rNrZ TCPConnector ClientSessionrw Semaphorerrarrr/r0r1rsleepminrLrrr{rrr)previously_erroredrr^ping_interval_secondsconnections_limitrrbrg ping_resultrelapsed_for_pingping_retry_result retry_errorsrelapsed sleep_times r)scrape_iterationr4s IKKEG1B69&(((   022(/@AAA (9===* (* (* (* (* (* (* ()*;<(%m$EHX$XZ[ \ \^`aa,.OOO6B # 46KWV_4A4F4F4H4H777111111-,? &(9=;M;M;O;O,,L-6m\,R,RM!P)22Dm(T(T -:*/2!8KK S #D););)=)=$>$> ? ?AAA 777&("'U* (* (* (* (* (* (* (* (* (* (* (* (* (* (* (* (* (* (* (* (* (* (* (* (* (* (* (V 9997888889 $'G$9B$> !ikkE)GS!6!@!DDbIIJ- ++ + + + + + + +...     $'G$9B$> !ikkE)GS!6!@!DDbIIJ- ++ + + + + + + +...       sPAJG$I=+J= JJ J JL($J63L(5J66L((A0NcKt}g}d} trd}t||d{V}n~|dz }|dkrtd|dkrt d}tjjdz}t|t}tj |d{V)z Main loop for wmt_scanner_solo service each 'while: True' iteration returns errored domains (domains that responded with non-200 status code) rTNrHz)Seems your CloudLinux license is expired!r) r r get_license_statusrr/rrrrrrrwr)rrlicense_attemptrrs r) scrape_looprs   FO,  ! ! 4 4 6 6 ,O'78JF'S'S!S!S!S!S!S!S   q O!##JKKK!##')))"#$'G$9B$> !24GHHJ- ++ + + + + + + +,r+__main__zPID: %szweb-monitoring-toolzcl-web-monitoring-tool)N)Nrwrr7rZsignalrSconcurrent.futuresrWrrtypingrr dataclassesr sqlalchemyrwmt.dbr r r r r wmt.common.utilsrrrrclsentryrclsentry.utilsrwmt.common.constrrrrrrrrwmt.common.notificationrrwmt.common.reportr wmt.commonr cllicenser r/r5r9r;rDrNrlrtrrrrrrrrrrr@r1getpidpidr0SIGUSR1SIGTERMget_event_looplooprun_until_completer%r+r)rs  ((((((((!!!!!!!!!!!!!!UTTTTTTTTTTT''''''******                    IHHHHHHH))))))****** m $ $999  ******* *c///d A A A AjnokA(''''T 9 9 94JJJD ::: A A A HHHV,,,6 z #ibikk  C KK 3  =# . .//0*?+CDD% ' ' '  fnk222 fnh///%w%''  ...//////////////////s)A/F%%F),F)