§ WèÄjS—ãó—dZddlZddlZddlZddlZddlZddlZddlZddlZddl Z ddl m Z ddl m Z m Z ddlmZddlmZddlZddlmZddlmZdd lmZmZdd lmZdd lmZdd lmZdd l m!Z!m"Z"ddl#m$Z$ddl%m&Z&ddl'm(Z(ddl)m*Z*ddl+m,Z,m-Z-m.Z.m/Z/m0Z0ddl1m2Z2ddl3m4Z4ddl5m6Z6ddl7m8Z8m9Z9m:Z:ddl;mZ>m?Z?m@Z@ddlAmBZBmCZCmDZDmEZEmFZFmGZGddlHmIZImJZJmKZKmLZLmMZMe jNrddlOmPZPejQd¦«ZRGd„d¦«ZSdS) zX This module contains classes implementing X-Ray Manager behaviour and helper functions éN)ÚIterator)ÚdatetimeÚ timedelta)Úescape)Úglob)Údrop_privileges)ÚFeature)Úget_installed_php_versionsÚis_panel_feature_supported)Úis_litespeed_running)Ú disable_quota)Úgettext)Úis_wpos_supportedÚphp_get_vhost_versionsé)Ú ClWposGetter)Ú get_client)ÚContinuousManager)ÚAdvancedMetrics)Ú XRayAPIErrorÚ XRayErrorÚXRayManagerExitÚXRayManagerExitPHPUnsupportedÚXRayMissingDomain)ÚFPMReloadController)Úopen_local_storage)ÚNginxUserCache)Ú DomainInfoÚTaskÚ url_split)ÚManageUserAgent)Úget_xray_exec_userÚnginx_user_cacheÚuser_mode_restricted)Ú_cagefsctl_remountÚis_file_recently_modifiedÚno_active_tasksÚset_privilegesÚ ssa_disabledÚswitch_schedstats)Úcreate_global_ini_mode_markerÚcreate_ini_filesÚis_global_ini_modeÚremove_global_ini_mode_markerÚremove_ini_files)Ú APIClientz%^[A-Za-z0-9_][A-Za-z0-9@:._-]{0,127}$cóP—eZdZUdZdZddddddd d d d d dddddœZejee e fe d<dide de fd„Z de dzfd„Zdefd„Zde de fd„Zdede fd„Zdede fd „Zdede fd!„Zdede fd"„Zdeddfd#„Zd$„Zejd%¦«Zd&Zd'ejde fd(„Zd)e defd*„Z e!d+e de"ejfd,„¦«Z#d-e ddfd.„Z$d/e defd0„Z%d1e defd2„Z&dede fd3„Z'd4ede fd5„Z(d4eddfd6„Z)e!d)e de*e e ffd7„¦«Z+d8e ddfd9„Z,e!de fd:„¦«Z-de fd;„Z.e/ddd<œd/e d=e d>e d?e d@e dAe de fdB„¦«Z0d/e de fdC„Z1dDdEœd/e d?e de fdF„Z2dGe de fdH„Z3dI„Z4e/dGe de fdJ„¦«Z5dGe de fdK„Z6e!dLede fdM„¦«Z7de fdN„Z8e!djdOe9dPdQdRe dzfdS„¦«Z:dGe de fdT„Z;d/e dUe de fdV„Zd/e de fdY„Z?de fdZ„Z@de fd[„ZAdkd\e d]e dzd^e dzde fd_„ZBd\e de fd`„ZCd\e dae de fdb„ZDde fdc„ZEde fdd„ZFde fde„ZGde fdf„ZHde fdg„ZIde fdh„ZJdS)lÚ BaseManagerz� Basic manager abstract class. Implements methods common for all managers. Requires managers to implement their custom methods. z/var/run/xray-agent.pidz/opt/alt/php54/link/confz/opt/alt/php55/link/confz/opt/alt/php56/link/confz/opt/alt/php70/link/confz/opt/alt/php71/link/confz/opt/alt/php72/link/confz/opt/alt/php73/link/confz/opt/alt/php74/link/confz/opt/alt/php80/link/confz/opt/alt/php81/link/confz/opt/alt/php82/link/confz/opt/alt/php83/link/confz/opt/alt/php84/link/confz/opt/alt/php85/link/confz/opt/alt/php86/link/conf)z alt-php54z alt-php55z alt-php56z alt-php70z alt-php71z alt-php72z alt-php73z alt-php74z alt-php80z alt-php81z alt-php82z alt-php83z alt-php84z alt-php85z alt-php86ÚVERSIONSFÚ system_idÚ phpinfo_modecó —t¦«|_||_tjd¦«|_t ¦«|_t¦«|_ ||_ td¦«|j¬¦«|_ dS)NÚmanagerÚlists©r4) rÚapi_client_classÚsys_idÚloggingÚ getLoggerÚloggerrÚcontinuous_monitoringr!Úmanage_user_agentr5Ú ui_api_client)Úselfr4r5s úH/opt/cloudlinux/venv/lib64/python3.11/site-packages/xray/manager/base.pyÚ__init__zBaseManager.__init__tsr€õ2<±´ˆÔ؈Œ ÝÔ'¨ Ñ2Ô2ˆŒ Ý%6Ñ%8Ô%8ˆÔ"Ý!0Ñ!2Ô!2ˆÔØ(ˆÔØ0�Z¨Ñ0Ô0¸4¼;ÐGÑGÔGˆÔÐÐóÚreturnNcóø— t|j¦«5}t| ¦«¦«cddd¦«S#1swxYwYdS#t$r|j d¦«YdSwxYw)Nz'Unable to read daemon pid from pidfile.)ÚopenÚDAEMON_PIDFILEÚintÚreadÚOSErrorr>Úwarning)rBÚfs rCÚ_get_daemon_pidzBaseManager._get_daemon_pidsÊ€ð KÝ�dÔ)Ñ*Ô*ð %¨aݘ1Ÿ6š6™8œ8‘}”}ð %ð %ð %ð %ñ %ô %ð %ð %ð %ð %ð %ð %øøøð %ð %ð %ð %ð %ð %øåð Kð Kð KØ ŒK× Ò Ð IÑ JÔ JÐ JÐ JÐ JÐ Jð Køøøs3‚A–!A· AÁAÁAÁ AÁ AÁ$A9Á8A9có—|jS)z\ Get supported PHP versions :return: a dict with supported versions )r3©rBs rCÚsupported_versionszBaseManager.supported_versions†s €ð Œ}ÐrEÚ php_versioncó.—|| ¦«vS)z² Check if given PHP version is supported :param php_version: PHP version, e.g. 'alt-phpXY' :return: True if version is supported, False otherwise )rR)rBrSs rCÚis_version_supportedz BaseManager.is_version_supported�s€ð ˜d×5Ò5Ñ7Ô7Ð7Ð7rEÚ domain_infocóZ—| ¦« |j¦«S)zh Get a path to directory for additional ini file for based on panel-set version )rRÚgetÚpanel_php_version©rBrVs rCÚ _ini_pathzBaseManager._ini_path•s'€ð ×&Ò&Ñ(Ô(×,Ò,¨[Ô-JÑKÔKÐKrEcóô—| |¦«} |jr|j}n&| |¦«r|j}n |jp|}n#t $rYnwxYw|j d|¦«|S)zã Resolve a path to directory for additional ini file It depends on version set for domain and on selector :param domain_info: a DomainInfo object :return: path to directory for ini files zIni path resolved as %s)r[Úphp_ini_scan_dirÚis_selector_enabledÚselector_ini_pathÚphpd_location_ini_pathÚ ValueErrorr>Úinfo)rBrVÚini_paths rCÚ get_ini_pathzBaseManager.get_ini_pathœsŸ€ð—>’> +Ñ.Ô.ˆð ØÔ+ð JØ&Ô7��Ø×)Ò)¨+Ñ6Ô6ð JØ&Ô8��à&Ô=ÐIÀ�øøÝð ð ð à ˆDð øøøð Œ ×ÒÐ2°HÑ=Ô=Ð=؈s—5A Á AÁAcóÒ—|js=| |¦«r(|j d|j¦«|j}n|j}|j d|¦«|S)a Get PHP version which serves given domain :param domain_info: a DomainInfo object, including user of domain and PHP version set in control panel environment :return: real php version of domain (selector or panel one) zSelector is enabled for user %szPHP version detected as %s)Úis_selector_appliedr^r>rbÚuserÚselector_php_versionrY)rBrVÚcurrent_versions rCÚget_php_versionzBaseManager.get_php_version±sq€ðÔ.ð <°4×3KÒ3KÈKÑ3XÔ3Xð <Ø ŒK× Ò Ð>À Ô@PÑ QÔ QÐ QØ)Ô>ˆOˆOà)Ô;ˆOØ Œ ×ÒÐ5°ÑGÔGÐGØÐrEcót—ttj¦«sdS|j€dS| |¦«S)a  Is selector enabled for given domain :param domain_info: a DomainInfo object, including user of domain and PHP version set in control panel :return: True if selector is enabled for domain, False otherwise F)r r Ú PHP_SELECTORrhÚpanel_specific_selector_enabledrZs rCr^zBaseManager.is_selector_enabledÀs>€õ*­'Ô*>Ñ?Ô?ð Ø�5Ø Ô +Ð 3Ø�5Ø×3Ò3°KÑ@Ô@Ð@rEcóþ—| |j¦«|jr| |¦«dSt ¦«r| |j¦«dS| |j¦«dS)z… Reload FPM service or kill all *php* processes of user :param domain_info: a ready-to-use DomainInfo object N)Úreset_criu_imgsÚnameÚ panel_fpmÚrestart_fpm_servicer Úgracefully_restart_litespeedrgÚ kill_user_phprZs rCÚphp_procs_reloadzBaseManager.php_procs_reloadÍsˆ€ð ×Ò˜[Ô-Ñ.Ô.Ð.à Ô ð 1Ø × $Ò $ [Ñ 1Ô 1Ð 1Ð 1Ð 1Ý !Ñ #Ô #ð 1Ø × -Ò -¨kÔ.>Ñ ?Ô ?Ð ?Ð ?Ð ?à × Ò ˜{Ô/Ñ 0Ô 0Ð 0Ð 0Ð 0rEcó¾—t|¦«5t¦«5tj|¦«} t t j |jd¦«d¦«  ¦«n3#ttf$r|j   dd¬¦«YnwxYwddd¦«n #1swxYwYddd¦«dS#1swxYwYdS)z— Litespeed's graceful restart. https://www.litespeedtech.com/support/wiki/doku.php/litespeed_wiki:php:detached_mode#for_a_user z.lsphp_restart.txtÚwz$Unable to restart lsws after changesT)Úexc_infoN)rr ÚpwdÚgetpwnamrHÚosÚpathÚjoinÚpw_dirÚcloseÚFileNotFoundErrorÚPermissionErrorr>rM)rBÚusernameÚpws rCrsz(BaseManager.gracefully_restart_litespeedÛs‡€õ ˜XÑ &Ô &ð [ð [­ ©¬ð [ð [Ý”˜hÑ'Ô'ˆBð [Ý•R”W—\’\ "¤)Ð-AÑBÔBÀCÑHÔH×NÒNÑPÔPÐPÐPøÝ%¥Ð7ð [ð [ð [Ø” ×#Ò#Ð$JÐUYÐ#ÑZÔZÐZÐZÐZð [øøøð  [ð [ð [ñ [ô [ð [ð [ð [ð [ð [ð [øøøð [ð [ð [ð [ð [ð [ð [ñ [ô [ð [ð [ð [ð [ð [ð [ð [øøøð [ð [ð [ð [ð [ð [sX�CŸB:µAA;Á:B:Á;-B+Â(B:Â*B+Â+B:Â. CÂ:B> Â>CÃB> ÃCÃCÃCz^php(?:[0-9]+(?:\.[0-9]+)?)?$)ÚhttpdÚapache2Ú litespeedÚlshttpdÚlsphpzphp-fpmÚproccó„—|j |jd¦«sdS | ¦«}t d¦«D]L}|€dS| ¦«}| |j¦«rdS| ¦«}ŒMn&#tj $rYdStj $rYnwxYwdS)aè Whether the process is a web PHP backend that must be signalled to pick up xray.ini changes. CLI PHP processes -- bare `php` comm with no web-server ancestor (wp-cli, composer, user cron scripts) -- do not persist across web requests, so a SIGHUP would only break the user's workload without helping tracing (ZD288595). A process that cannot be classified is treated as a web backend, keeping the historical kill behavior. rpTéNF) Ú _CLI_PHP_COMMÚmatchrbÚparentÚrangerpÚ startswithÚ_WEB_ANCESTOR_COMMSÚpsutilÚ NoSuchProcessÚError)rBr‰rŽÚ_Ú parent_names rCÚ_needs_php_reloadzBaseManager._needs_php_reloadòsâ€ðÔ!×'Ò'¨¬ °&Ô(9Ñ:Ô:ð Ø�4ð Ø—[’[‘]”]ˆFݘ2‘Y”Yð )ð )�Ø�>Ø ˜5˜5Ø$Ÿkšk™mœm� Ø×)Ò)¨$Ô*BÑCÔCð Ø˜4˜4ØŸš™œ��ð  )øõÔ#ð ð ð à�5�5ÝŒ|ð ð ð Ø ˆDð øøøàˆts#©(BÁ/BÂBÂB=Â,B=Â<B=r‚có°—g}g}| |¦«D]ž}d|jdvrŒ| |¦«s!| |jd¦«ŒH | t j¦«n#tj$rYŒzwxYw| |jd¦«ŒŸ|r|j  d|¦«|S)a9 Send SIGHUP to web PHP backends, which belong to given username, so they are respawned with up-to-date xray configuration. CLI PHP processes of the user are left alone (ZD288595) :param username: name of user :return: list of pids of successfully killed processes ÚphprpÚpidz6Skipped CLI php processes not serving web requests: %s) Ú user_procsrbr—ÚappendÚ send_signalÚsignalÚSIGHUPr’r“r>)rBr‚Ú killed_procsÚ skipped_procsr‰s rCrtzBaseManager.kill_user_phpsú€ðˆ ؈ Ø—O’O HÑ-Ô-ð 2ð 2ˆDؘDœI fÔ-Ð-Ð-ØØ×)Ò)¨$Ñ/Ô/ð Ø×$Ò$ T¤Y¨uÔ%5Ñ6Ô6Ð6Øð Ø× Ò ¥¤Ñ/Ô/Ð/Ð/øÝÔ'ð ð ð Ø�ð øøøà × Ò  ¤ ¨%Ô 0Ñ 1Ô 1Ð 1Ð 1Ø ð fØ ŒK× Ò ÐUÐWdÑ eÔ eÐ eØÐsÁ#BÂBÂBÚ user_namec#óÆK—tj|¦«j}gd¢}tj|¦«D],}||jdj|jdjfvr|V—Œ-dS)zÍ Generator yields processes, which belong to given user_name. Processes are checked using UID, not user_name :param user_name: user name :return: a generator object )rpršÚuidsr¤N)ryrzÚpw_uidr’Ú process_iterrbÚrealÚ effective)r¢Ú uid_by_nameÚattrsÚps rCr›zBaseManager.user_procs'suèè€õ”l 9Ñ-Ô-Ô4ˆ Ø'Ð'Ð'ˆÝÔ$ UÑ+Ô+ð ð ˆAؘqœv fœ~Ô2°A´F¸6´NÔ4LÐMÐMÐMØ���øð ð rEÚdomaincóÌ—|sdStdt|¦«›d�¦«}|r=tj|d¦«|j d|d¦«dSdS)zt Reset criu images if any found for given domain in order to enable/disable X Ray correctly Nz/var/run/mod_lsapi/*Ú _criu_imgsrzcriu images in %s dropped)rÚ glob_escapeÚshutilÚrmtreer>rb)rBr¬Ú criu_imgs_dirs rCrozBaseManager.reset_criu_imgs5s€€ð ð Ø ˆFÝÐSµKÀÑ4GÔ4GÐSÐSÐSÑTÔTˆ Ø ð LÝ ŒM˜-¨Ô*Ñ +Ô +Ð +Ø ŒK× Ò Ð8¸-ÈÔ:JÑ KÔ KÐ KÐ KÐ Kð Lð LrEÚurlcóP—t|¦«\}}| |¦«S)z4 DomainInfo retrieving based on url )r Úget_domain_info©rBr³Ú domain_namer•s rCÚ_domain_info_by_urlzBaseManager._domain_info_by_urlAs'€õ# 3™œ‰ˆ �Qà×#Ò# KÑ0Ô0Ð0rEr·có:—ttd¦«¦«‚)zÜ Retrieve information about given domain from control panel environment Required to be implemented by child classes :param domain_name: name of domain :return: a DomainInfo object z0Manager should implement retrieving domain info!©ÚNotImplementedErrorr•)rBr·s rCrµzBaseManager.get_domain_infoIs€õ"¥!Ð$VÑ"WÔ"WÑXÔXÐXrEcó:—ttd¦«¦«‚)z× Check if selector is enabled specifically for panel Required to be implemented by child classes :param domain_info: a DomainInfo object :return: True if yes, False otherwise zCManager should implement specific panel check for selector enabled!rºrZs rCrmz+BaseManager.panel_specific_selector_enabledRs€õ"¥!Ð$iÑ"jÔ"jÑkÔkÐkrEÚdom_infocó:—ttd¦«¦«‚)z‹ Get FPM service name for particular panel :param dom_info: DomainInfo object :return: name of FPM service z5Manager should implement FPM service name retrieving!rº)rBr½s rCÚfpm_service_namezBaseManager.fpm_service_name[s€õ "¥!Ð$[Ñ"\Ô"\Ñ]Ô]Ð]rEcóF—| |¦«}t|t¦«rt |¦«s.|j dt|¦«|dœ¬¦«dS tj d|dgddd¬¦«|j  d |¦«t|¦«  ¦«dS#tttjf$r7}|j d t|¦«|d œ¬¦«Yd}~dSd}~wwxYw) zg Restart FPM service for particular version :param dom_info: DomainInfo object z6Refusing to reload FPM service: name failed validation)Ú fpm_servicerb©ÚextraNz /sbin/serviceÚreloadT)Úcapture_outputÚtextÚcheckzService %s reloadedzFailed to reload FPM service)Úerrrb)r¿Ú isinstanceÚstrÚ_FPM_SERVICE_NAME_REr�r>ÚerrorÚreprÚ subprocessÚrunrbrÚsave_latest_reloadrLraÚSubprocessError)rBr½Úfpm_servÚes rCrrzBaseManager.restart_fpm_servicecsK€ð ×(Ò(¨Ñ2Ô2ˆÝ˜(¥CÑ(Ô(ð Õ0D×0JÒ0JÈ8Ñ0TÔ0Tð ð ŒK× Ò ØHÝ&*¨8¡n¤n¸hÐGÐGð ñ ô ð ð ˆFð ?Ý ŒN˜O¨X°xÐ@ÐQUÐ\`ÐhlÐ mÑ mÔ mÐ mØ ŒK× Ò Ð2°HÑ =Ô =Ð =õ  Ñ )Ô )× <Ò <Ñ >Ô >Ð >Ð >Ð >øõ�¥ZÔ%?Ð@ð gð gð gØ ŒK× Ò Ð<ÍCÐPQÉFÌFÐ\dÐDeÐDeÐ Ñ fÔ fÐ fÐ fÐ fÐ fÐ fÐ fÐ føøøøð gøøøsÁ46C à D Ã),DÄD cóJ—tj|¦«}d|j›d�}tj tj |¦«¦«s@tjtj |¦«¦«t|¦«||j fS)z5Resolve path for user and prepare directory if neededz/var/clwpos/uids/z /info.json) ryrzr¥r{r|ÚisdirÚdirnameÚmakedirsr%Úpw_gid)r‚Ú_upwdÚ_paths rCÚprepare_wpos_info_pathz"BaseManager.prepare_wpos_info_pathys‚€õ” ˜XÑ&Ô&ˆØ< E¤LÐ<Ð<Ð<ˆÝŒw�}Š}�RœWŸ_š_¨UÑ3Ô3Ñ4Ô4ð )Ý ŒK�œŸš¨Ñ.Ô.Ñ /Ô /Ð /Ý ˜xÑ (Ô (Ð (Ø�e”lÐ"Ð"rErgcóÜ—t¦«sdS| |¦«\}}t|¦«r|j d|¦«dS|dz}t |¦«t ¦«dœ}|j d||¦«td|d¬¦«5 t|d ¦«5}tj ||¦«ddd¦«n #1swxYwYtj ||¦«|j d ¦«n?#t$r2}|j d t!|¦«¦«Yd}~nd}~wwxYwddd¦«dS#1swxYwYdS) z9Prepare and write info.json file for WPOS (AWP) utilitiesNz*File %s modified recently, skip generatingz.tmp)Úvhost_versionsÚinstalled_versionszGoing to write file %s with %sré_)Ú target_uidÚ target_gidÚmaskrwzWPOS data written successfullyz'Unable to write info for WPOS due to %s)rrÛr&r>rbrr Údebugr(rHÚjsonÚdumpr°ÚmoverLrÌrÊ)rBrgÚdestÚuser_gidÚ working_destÚto_writeÚ info_jsonrÓs rCÚwrite_wpos_infozBaseManager.write_wpos_infoƒs€å Ñ"Ô"ð Ø ˆFà×4Ò4°TÑ:Ô:‰ˆˆhÝ $ TÑ *Ô *ð Ø ŒK× Ò ÐIÈ4Ñ PÔ PÐ PØ ˆFà˜f‘}ˆ Ý&<¸TÑ&BÔ&BÕZtÑZvÔZvÐwÐwˆØ Œ ×ÒÐ:¸DÀ(ÑKÔKÐKÝ  q°XÀEÐ JÑ JÔ Jð Uð Uð Uݘ,¨Ñ,Ô,ð3° Ý”I˜h¨ Ñ2Ô2Ð2ð3ð3ð3ñ3ô3ð3ð3ð3ð3ð3ð3øøøð3ð3ð3ð3å” ˜L¨$Ñ/Ô/Ð/Ø” × Ò Ð!AÑBÔBÐBÐBøÝð Uð Uð UØ” ×!Ò!Ð"KÍSÐQRÉVÌVÑTÔTÐTÐTÐTÐTÐTÐTøøøøð Uøøøð  Uð Uð Uñ Uô Uð Uð Uð Uð Uð Uð Uð Uøøøð Uð Uð Uð Uð Uð Us`Â&E!Â(DÂ8Cà DÃC ÃDÃ!C Ã"2DÄE!Ä EÄ(E ÅE!Å EÅE!Å!E%Å(E%c ó¸—ddi}|r| |¦«tjtt | ¦«¦«¦«¦«S)z£ Create JSON response message with result field == success and given keyword arguments in other fields :return: json packed string ÚresultÚsuccess)ÚupdateräÚdumpsÚdictÚsortedÚitems)ÚkwargsÚinitials rCÚresponsezBaseManager.response™sP€ð˜YÐ'ˆØ ð #Ø �NŠN˜6Ñ "Ô "Ð "ÝŒz�$�v g§m¢m¡o¤oÑ6Ô6Ñ7Ô7Ñ8Ô8Ð8rEc ób—| d¦«r|d›d�|d<|jdi|¤ŽS)z§ Create JSON response message for continuous actions. Extends action definition with 'continuous' addition :return: json packed string Úactionz continuous©)rXr÷)rBrõs rCÚresponse_continuouszBaseManager.response_continuous¥sI€ð �:Š:�hÑ Ô ð @Ø"(¨Ô"2Ð?Ð?Ð?ˆF�8Ñ ØˆtŒ}Ð&Ð&˜vÐ&Ð&Ð&rE)Ú auto_taskÚ autotracingÚ client_ipÚ tracing_byÚ tracing_countrürýc óÒ—| |¦«}| |j¦«| |¦«}| |¦«r| |¦«} n.|j dd|i¬¦«t||¦«‚|  |j ¬¦«} |rdn t¦«} t||||| || |j¬¦«} |   | ¦«| _ |  |¬¦«n³#t $r¦ |  ¦«n<#t $r/} |j d| d | jid ¬ ¦«Yd } ~ nd } ~ wwxYw |  ¦«n<#t $r/} |j d | d | jid ¬ ¦«Yd } ~ nd } ~ wwxYw‚wxYw|  |j ¬¦«|  | j¦«| |¦«t/d ¬¦« t1¦« |j|j¦«n7#t6$r*} |j d| j¦«Yd } ~ nd } ~ wwxYwt;|j¦« ¦«t?¦«rtA¦«| !d| j¬¦«S)a  Start monitoring of given URL. Arguments are only allowed by keyword :param url: URL to monitor :param client_ip: a client IP address :param tracing_by: time or qty :param tracing_count: a number of minutes|requests to monitor :param auto_task: if a task is an auto created one (x-ray 2.0) :param autotracing: task is an auto created with user marked as *autotracing* :return: JSON encoded result of start action zPHP version is unsupportedÚversionrÂr9z *autotracing*)r³rþrÿrÚ ini_locationrürgÚ domain_owner©rSz3Failed to remove local task after start failure: %sÚtracing_task_idT)rÃrxNz;Failed to remove backend task after local start failure: %s©Úenabledz0Failed to send metadata to Smart Advice with: %sÚstart©rùr)"r¸rìrgrjrUrdr>rMrr:r;r"rÚcreateÚtask_idÚaddÚ ExceptionÚ rollback_addÚdeleteÚ set_cronjobrðÚ starttimerur*rÚ post_metadatarprÚreasonrÚdisabler-r,r÷)rBr³rþrÿrrürýrVÚreal_php_versionÚini_files_locationÚclientrgÚ tracing_taskrÓs rCr zBaseManager.start¯s}€ð0×.Ò.¨sÑ3Ô3ˆ Ø ×Ò˜[Ô-Ñ.Ô.Ð.Ø×/Ò/° Ñ<Ô<ÐØ × $Ò $Ð%5Ñ 6Ô 6ð GØ!%×!2Ò!2°;Ñ!?Ô!?Ð Ð à ŒK× Ò Ð <ÀYÐP`ÐDaÐ Ñ bÔ bÐ bÝ/°Ð5EÑFÔFÐ Fð×&Ò&°´Ð&Ñ=Ô=ˆØ"-ÐGˆˆÕ3EÑ3GÔ3GˆÝØØØ!Ø'Ø+ØØØ$Ô)ð  ñ  ô  ˆ ð &Ÿ}š}¨\Ñ:Ô:ˆ Ôð Ø × Ò Ð)9Ð Ñ :Ô :Ð :Ð :øÝð ð ð ð Ø×)Ò)Ñ+Ô+Ð+Ð+øÝð ð ð Ø” ×#Ò#ØIØØ,¨lÔ.BÐCØ!ð $ñôððððððøøøøð øøøð Ø— ’ ‘”��øÝð ð ð Ø” ×#Ò#ØQØØ,¨lÔ.BÐCØ!ð $ñôððððððøøøøð øøøð ð- øøøð0 × Ò ¨4¬;Ð Ñ7Ô7Ð7ð � Š �lÔ,Ñ-Ô-Ð-à ×Ò˜kÑ*Ô*Ð*Ý $Ð'Ñ'Ô'Ð'ð ^Ý ‰NŒN× (Ò (¨Ô)9¸;Ô;KÑ LÔ LÐ LÐ LøÝð ^ð ^ð ^Ø ŒK× Ò Ð RÐTUÔT\Ñ ]Ô ]Ð ]Ð ]Ð ]Ð ]Ð ]Ð ]øøøøð ^øøøå�{Ô'Ñ(Ô(×0Ò0Ñ2Ô2Ð2õ Ñ Ô ð Ý Ñ Ô Ð à�}Š} G¸\Ô=Qˆ}ÑRÔRÐRsxÄDÄ G Ä$D9Ä8G Ä9 E2Å%E-Å(G Å-E2Å2G Å6F Æ G Æ GÆ%F?Æ:G Æ?GÇG È',IÉ JÉ JÊJcó6—| |dddd¬¦«S)zÍ Start continuous monitoring of given URL (auto task). Arguments are only allowed by keyword :param url: URL to monitor :return: JSON encoded result of start action Ú*Útimei–T)r³rþrÿrrü©r )rBr³s rCÚ start_autozBaseManager.start_auto s"€ð�zŠz˜c¨S¸VÐSWÐcgˆzÑhÔhÐhrEé)rcó8—| |dd|dd¬¦«S)a6 Start monitoring of given URL (autotracing task). Note, user is overridden as *autotracing* Arguments are only allowed by keyword :param url: URL to monitor :param tracing_count: count of requests to capture :return: JSON encoded result of start action rÚ request_qtyT)r³rþrÿrrürýr)rBr³rs rCÚstart_autotracingzBaseManager.start_autotracings1€ð�zŠzØØØ$Ø'ØØð ñ ô ð rErcó—| |j|¬¦«}| ¦«}gd¢}|j|vr1t t d¦«t |j¦«z¦«‚|jdk}|r[| ¦«t|j ¦«5}|  |j ¬¦«ddd¦«n #1swxYwY |  |j ¦«}| |j¦«nm#t $r|j d¦«d}YnEt&$r9}t)|dd ¦«r|j d¦«d}n‚Yd}~nd}~wwxYw| ¦«} | ¦«| ¦«} |r|jnd} | d kr| | | ¬ ¦«n| ||| ¬ ¦«|�?t7|j¦« ¦«|s| r| |¦«t=¦«rt?¦«rtAd ¬ ¦«| !d |j"¬¦«S)zœ Stop monitoring of given task ID :param tracing_task_id: an ID of task to stop :return: JSON encoded result of stop action ©r4r)ÚrunningÚstoppedÚ completedÚholdz!Cannot stop task with status '%s'r%)Únext_request_idNz+Stopping task for an already deleted domainÚ_internal_missing_domainFr©Ú request_countrÚstopr )#r:r;Úget_taskÚstatusrr•rÊÚ_request_daemon_storage_flushrÚfake_idÚupdate_with_local_datar)r¸r³Úset_domain_ownerrgrr>rbrÚgetattrÚremoveÚ drop_cronjobÚrecalculate_countsr,r-Ú _completerÚrestorerur'r)r*r÷r ) rBrrrÚtry_to_complete_statusesÚ was_runningÚstoragerVrÓÚ ini_drainedÚremaining_countÚfinal_request_counts rCr-zBaseManager.stop(s€ð ×&Ò&°´ÈoÐ&Ñ^Ô^ˆØ—’Ñ(Ô(ˆ à#NÐ#NÐ#NÐ à Ô Ð&>Ð >Ð >Ý!¥!Ð$GÑ"HÔ"HÍ3È|ÔObÑKcÔKcÑ"cÑdÔdÐ dà"Ô)¨YÒ6ˆ Ø ð ]ð × .Ò .Ñ 0Ô 0Ð 0Ý# LÔ$8Ñ9Ô9ð ]¸WØ×3Ò3ÀGÔD[Ð3Ñ\Ô\Ð\ð ]ð ]ð ]ñ ]ô ]ð ]ð ]ð ]ð ]ð ]ð ]øøøð ]ð ]ð ]ð ]ð Ø×2Ò2°<Ô3CÑDÔDˆKØ × )Ò )¨+Ô*:Ñ ;Ô ;Ð ;Ð ;øÝ ð ð ð Ø ŒK× Ò ÐJÑ KÔ KÐ K؈KˆKˆKÝð ð ð õ�qÐ4°eÑ<Ô<ð Ø” × Ò Ð!NÑOÔOÐOØ"� � àð� � � � øøøøð øøøð$#×)Ò)Ñ+Ô+ˆ à×!Ò!Ñ#Ô#Ð#ð'×9Ò9Ñ;Ô;ˆð =HÐQ˜lÔ8Ð8ÈTÐØ ˜QÒ Ð Ø �KŠK˜Ð7JˆKÑ KÔ KÐ KÐ Kà �NŠN˜<¨Ð?RˆNÑ SÔ SÐ Sà Ð "Ý ˜;Ô+Ñ ,Ô ,× 4Ò 4Ñ 6Ô 6Ð 6Øð 3˜kð 3ð×%Ò% kÑ2Ô2Ð2Ý Ñ Ô ð -¥¡¤ð -Ý  eÐ ,Ñ ,Ô ,Ð ,Ø�}Š} F¸LÔ/E2Å2E7có—tjtjtjh¦«| ¦«}|rK t j|tj¦«n*#t$r|j  d¦«YnwxYw|j  d¦«tj tjhd¦«}|€|j  d¦«tjtj tjh¦«dS)zá Request daemon to flush it's in-memory storage on disk using SIGUSR2 and wait for getting SIGUSR2 back that daemon sends when it successfully flushed data on disk and we are ready to proceed. zVUnable to send daemon signal. Some stats will not be flushed. Maybe daemon is stopped?z2Waiting for daemon to signal back about flush end.g.@NzUDaemon did not signal back in given timeout. Some stats may not be flushed. Continue.) ržÚpthread_sigmaskÚ SIG_BLOCKÚSIGUSR2rOr{ÚkillrLr>rMrbÚ sigtimedwaitÚSIG_DFL)rBÚ daemon_pidÚsiginfos rCr0z)BaseManager._request_daemon_storage_flush{s€õ Ô�vÔ/µ&´.Ð1AÑBÔBÐBØ×)Ò)Ñ+Ô+ˆ à ð ð Ý”˜ ¥F¤NÑ3Ô3Ð3Ð3øÝð ð ð Ø” ×#Ò#Ølñôðððð øøøð Œ ×ÒÐMÑNÔNÐNÝÔ%¥v¤~Ð&6¸Ñ=Ô=ˆØ ˆ?Ø ŒK× Ò Ð wÑ xÔ xÐ xåÔ�vœ~µ´Ð/?Ñ@Ô@Ð@Ð@Ð@sÁA"Á"$B ÂB cóþ—| |j|¬¦«}| ¦«}|jdvr1t t d¦«t |j¦«z¦«‚| |j¦«}|  |j ¦«d|  ¦«vr|  |¦«}nd}|  |¬¦«| |j¬¦«| |j¦«t#|j ¦« ¦«| |¦«t)d¬ ¦«| d |j¬ ¦«S) z¨ Continue monitoring of given task ID :param tracing_task_id: an ID of task to continue :return: JSON encoded result of continue action r$©r%r'z%Cannot continue task with status '%s'Ú54Nrr9TrÚcontinuer )r:r;r.r/rr•rÊr¸r³r3rgrRrjr rrðrrrrur*r÷r )rBrrrrVrs rCÚ continue_zBaseManager.continue_”sl€ð×&Ò&°´ÈoÐ&Ñ^Ô^ˆØ—’Ñ(Ô(ˆ Ø Ô Ð":Ð :Ð :Ý!¥!Ð$KÑ"LÔ"LÍsÐS_ÔSfÑOgÔOgÑ"gÑhÔhÐ hð×.Ò.¨|Ô/?Ñ@Ô@ˆ Ø×%Ò% kÔ&6Ñ7Ô7Ð7à �4×*Ò*Ñ,Ô,Ð ,Ð ,à#×3Ò3°KÑ@Ô@Ð Ð ð $Ð à×ÒÐ%5ÐÑ6Ô6Ð6à× Ò ¨4¬;Ð Ñ7Ô7Ð7ð � Š �lÔ,Ñ-Ô-Ð-å�{Ô'Ñ(Ô(×0Ò0Ñ2Ô2Ð2Ø ×Ò˜kÑ*Ô*Ð*Ý $Ð'Ñ'Ô'Ð'Ø�}Š} JÀ Ô@Tˆ}ÑUÔUÐUrEcó:—| |j|¬¦«}| ¦«}|jdvr1t t d¦«t |j¦«z¦«‚| ||¦«| d|j ¬¦«S)z™ Complete given tak ID :param tracing_task_id: an ID of task to complete :return: JSON encoded result of complete action r$rJz%Cannot complete task with status '%s'Úcompleter ) r:r;r.r/rr•rÊr8r÷r ©rBrrrs rCrOzBaseManager.complete·s‘€ð ×&Ò&°´ÈoÐ&Ñ^Ô^ˆØ—’Ñ(Ô(ˆ Ø Ô Ð":Ð :Ð :Ý!¥!Ð$KÑ"LÔ"LÍsÐS_ÔSfÑOgÔOgÑ"gÑhÔhÐ hØ �Š�| VÑ,Ô,Ð,Ø�}Š} JÀ Ô@Tˆ}ÑUÔUÐUrEÚtaskcó—|ddvrdStj¦«}|d}|dp|d}tj|¦«}|dkr|td¬ ¦«z|krd S|d ko|t|d ¬ ¦«z|kS)zT Returns True if task should be completed. False otherwise. r/)r&r'FrÿrÚ createtimer!r)ÚdaysTrr)Úminutes)rÚnowÚ fromtimestampr)rQrVrÿÚ inceptionÚtask_start_times rCÚ_is_to_completezBaseManager._is_to_completeÄs«€ð �Œ>Ð5Ð 5Ð 5ð �5ÝŒl‰nŒnˆØ˜,Ô'ˆ ؘÔ%Ð;¨¨lÔ);ˆ Ý"Ô0°Ñ;Ô;ˆØ ˜Ò &Ð &¨?½YÈAÐ=NÑ=NÔ=NÑ+NÐQTÒ+TÐ+TØ�4ؘVÒ#Ðh¨½)ÈDÐQ`ÔLaÐ:bÑ:bÔ:bÑ(bÐehÒ(hÐhrEcó —|j ¦« dg¦«}|j dt |¦«¦«|D]a}| |¦«sŒ|j dt |d¦«¦«| |d¦«Œb| d¬¦«S)zü Gets all server tasks and complete those which match following criteria: - traced_by requests_qty: if task started 2 days ago - complete - traced_by time: if task runs longer than start time + tracing time - complete rîz#Check tasks for autocompleting...%sz"Going to complete task with id: %srzautocomplete-tasks©rù) rAÚ get_task_listrXr>rbrÊrZr-r÷)rBÚall_server_tasksÚ task_items rCÚautocomplete_taskszBaseManager.autocomplete_tasksÙsÊ€ð  Ô-×;Ò;Ñ=Ô=×AÒAÀ(ÈBÑOÔOÐØ Œ ×ÒÐ>ÅÐDTÑ@UÔ@UÑVÔVÐVØ)ð 4ð 4ˆIØ×'Ò'¨ Ñ2Ô2ð ØØ ŒK× Ò ÐAÅ3ÀyÐQbÔGcÑCdÔCdÑ eÔ eÐ eØ �IŠI�iÐ 1Ô2Ñ 3Ô 3Ð 3Ð 3Ø�}Š}Ð$8ˆ}Ñ9Ô9Ð9rEÚt_taskrr0r,có¼—| ¦«| ¦«| |¬¦«|jr| ¦«dSdS)aM Common complete actions: - delete cron job, - erase request id file - send 'complete' status (and the final request_count, if given) to mongo :param t_task: a tracing task object :param client: an APIClient object :param request_count: final request_count of the task r+N)r6Úerase_request_id_storagerOrüÚshare)rarr,s rCr8zBaseManager._completeèsb€ð ×ÒÑÔÐØ×'Ò'Ñ)Ô)Ð)Ø�Š mˆÑ4Ô4Ð4Ø Ô ð Ø �LŠL‰NŒNˆNˆNˆNð ð rEcó:—| |j|¬¦«}| ¦«}|jdkr1t t d¦«t |j¦«z¦«‚| ¦«| d|j ¬¦«S)z” Delete given task ID :param tracing_task_id: an ID of task to delete :return: JSON encoded result of delete action r$r%z#Cannot delete task with status '%s'rr ) r:r;r.r/rr•rÊrr÷r rPs rCrzBaseManager.deleteùs‰€ð ×&Ò&°´ÈoÐ&Ñ^Ô^ˆØ—’Ñ(Ô(ˆ Ø Ô  )Ò +Ð +Ý!¥!Ð$IÑ"JÔ"JÍSÐQ]ÔQdÑMeÔMeÑ"eÑfÔfÐ fØ� Š ‰ŒˆØ�}Š} H¸lÔ>Rˆ}ÑSÔSÐSrEÚemailcóœ—| |¦«}|j |j||¦«| d|¬¦«S)zÄ Enable continuous monitoring for given URL :param url: URL to monitor :param email: email to send reports to :return: JSON encoded result of enable action Úenable©rùr³)r¸r?rhrprû)rBr³rfÚd_infos rCÚenable_continuouszBaseManager.enable_continuoussM€ð×)Ò)¨#Ñ.Ô.ˆà Ô"×)Ò)¨&¬+°s¸EÑBÔBÐBØ×'Ò'¨x¸SÐ'ÑAÔAÐArEcóˆ—t|¦«\}}|j |¦«| d|¬¦«S)z— Disable continuous monitoring for given URL :param url: URL to monitor :return: JSON encoded result of disable action rri)r r?rrûr¶s rCÚdisable_continuouszBaseManager.disable_continuoussC€õ # 3™œ‰ˆ �QØ Ô"×*Ò*¨;Ñ7Ô7Ð7Ø×'Ò'¨y¸cÐ'ÑBÔBÐBrEcóˆ—t|¦«\}}|j |¦«| d|¬¦«S)z“ Start continuous monitoring for given URL :param url: URL to monitor :return: JSON encoded result of start action r ri)r r?r rûr¶s rCÚstart_continuouszBaseManager.start_continuoussC€õ # 3™œ‰ˆ �QØ Ô"×(Ò(¨Ñ5Ô5Ð5Ø×'Ò'¨w¸CÐ'Ñ@Ô@Ð@rEcóˆ—t|¦«\}}|j |¦«| d|¬¦«S)z‘ Stop continuous monitoring for given URL :param url: URL to monitor :return: JSON encoded result of stop action r-ri)r r?r-rûr¶s rCÚstop_continuouszBaseManager.stop_continuous'sC€õ # 3™œ‰ˆ �QØ Ô"×'Ò'¨ Ñ4Ô4Ð4Ø×'Ò'¨v¸3Ð'Ñ?Ô?Ð?rEcób—|j ¦«}| d|¬¦«S)zq Get list of continuous monitoring tasks :return: JSON encoded result of get list action zget continuous list©rùÚdata)r?Úget_tracing_listr÷)rBÚ tracing_lists rCÚcontinuous_tracing_listz#BaseManager.continuous_tracing_list1s/€ð Ô1×BÒBÑDÔDˆ Ø�}Š}Ð$9À ˆ}ÑMÔMÐMrEcó^—| d|j ¦«¬¦«S)z# Get list of tasks z tasks-listrs)r÷rAr]rQs rCÚ tasks_listzBaseManager.tasks_list9s)€ð�}Š} L°tÔ7I×7WÒ7WÑ7YÔ7Yˆ}ÑZÔZÐZrEr Ú time_fromÚtime_tocóÆ—| |j|¬¦«}| ¦«}| d|j |||¬¦«¬¦«S)z@ Get list of requests for given tracing task id r$z requests-list)rzr{rs)r:r;r.r÷rAÚget_request_list)rBr rzr{rr•s rCÚ requests_listzBaseManager.requests_list?sg€ð ×&Ò&°´ÈgÐ&ÑVÔVˆØ �OŠOÑ Ô ˆØ�}Š}Ø"ØÔ#×4Ò4°WÈ Ð[bÐ4ÑcÔcðñ ô ð rEcóÀ—| |j|¬¦«}| ¦«}| d|j |¦«¬¦«S)zE Get hourly requests stats for given tracing task id r$zrequests-stats-by-hourrs)r:r;r.r÷rAÚget_requests_stats_by_hour)rBr rr•s rCÚrequests_stats_by_hourz"BaseManager.requests_stats_by_hourKs_€ð ×&Ò&°´ÈgÐ&ÑVÔVˆØ �OŠOÑ Ô ˆØ�}Š}Ø+°$Ô2D×2_Ò2_Ð`gÑ2hÔ2hðñ ô ð rEÚ request_idcó—| |j|¬¦«}| ¦«}| d|j ||¦«¬¦«S)zO Get collected statistics for request ID of given tracing task r$z request-datars)r:r;r.r÷rAÚget_request_data)rBr r‚rr•s rCÚ request_datazBaseManager.request_dataVsX€ð ×&Ò&°´ÈgÐ&ÑVÔVˆØ �OŠOÑ Ô ˆØ�}Š} N¸Ô9K×9\Ò9\Ð]dÐfpÑ9qÔ9qˆ}ÑrÔrÐrrEcó`—|j ¦«| d¬¦«S)a Enable X-Ray User Agent: start or restart service if it is accidentally already running For systemd systems -- start socket unit only For SysV -- start the entire service :return: JSON encoded result of enable action zenable-user-agentr\)r@rhr÷rQs rCÚenable_user_agentzBaseManager.enable_user_agent_s.€ð Ô×%Ò%Ñ'Ô'Ð'Ø�}Š}Ð$7ˆ}Ñ8Ô8Ð8rEcó`—|j ¦«| d¬¦«S)a7 Disable X-Ray User Agent: stop the entire service or do nothing if it is accidentally not running For systemd systems -- also check if socket unit is running and stop it too :return: JSON encoded result of disable action zdisable-user-agentr\)r@rr÷rQs rCÚdisable_user_agentzBaseManager.disable_user_agentjs.€ð Ô×&Ò&Ñ(Ô(Ð(Ø�}Š}Ð$8ˆ}Ñ9Ô9Ð9rEcó|—|j ¦«}| d|t¦«¬¦«S)zn Get status of X-Ray User Agent service :return: JSON encoded result of status action zuser-agent-status)rùr/Úuser_nginx_cache)r@r/r÷r#)rBÚ agent_statuss rCÚuser_agent_statuszBaseManager.user_agent_statusvs8€ð Ô-×4Ò4Ñ6Ô6ˆ Ø�}Š}Ð$7À Õ_oÑ_qÔ_qˆ}ÑrÔrÐrrEcó*—t¦«}|ddur| ¦«nS|ddur| ¦«n4|ddur*| ¦«}| |¬¦«S| ¦«S)ú] Advanced metrics tool :return: JSON encoded result of status action rhTrr/)r/)rrhrr/r÷)rBÚargsÚamr/s rCÚadvanced_metricszBaseManager.advanced_metrics~s‰€õ Ñ Ô ˆØ �Œ>˜TÐ !Ð !Ø �IŠI‰KŒKˆKˆKØ �)Œ_ Ð $Ð $Ø �JŠJ‰LŒLˆLˆLØ �(Œ^˜tÐ #Ð #Ø—Y’Y‘[”[ˆFØ—=’=¨�=Ñ/Ô/Ð /à�}Š}‰ŒÐrEcób—t¦«t¦«| ¦«S©r�)r+r,r÷©rBr�s rCÚenable_serverwide_modez"BaseManager.enable_serverwide_modeŽs*€õ &Ñ'Ô'Ð'ÝÑÔÐà�}Š}‰ŒÐrEcób—t¦«t¦«| ¦«Sr”)r/r.r÷r•s rCÚdisable_serverwide_modez#BaseManager.disable_serverwide_mode˜s*€õ ÑÔÐÝ%Ñ'Ô'Ð'à�}Š}‰ŒÐrE)F)N)NN)KÚ__name__Ú __module__Ú __qualname__Ú__doc__rIr3ÚtypingÚClassVarròrÊÚ__annotations__ÚboolrDrJrOrRrUrr[rdrjr^rursÚreÚcompilerŒr‘r’ÚProcessr—ÚlistrtÚ staticmethodrr›ror¸rµrmr¿rrÚtuplerÛrìr÷rûr$r rr"r-r0rMrOrZr`rr8rrkrmrorqrwryr~r�r…r‡r‰r�r’r–r˜rúrErCr2r2Ysa€€€€€€ððð /€Nð0Ø/Ø/Ø/Ø/Ø/Ø/Ø/Ø/Ø/Ø/Ø/Ø/Ø/Ø/ð1ð1€HˆfŒo˜d 3¨ 8œnÔ-ððñð$ Hð H #ð H°Tð Hð Hð Hð HðK  t¡ðKðKðKðKð Dððððð8°ð8¸ð8ð8ð8ð8ðL ZðL°CðLðLðLðLð¨ ð°sððððð* ¨:ð ¸#ð ð ð ð ð A¨zð A¸dð Að Að Að Að 1¨Jð 1¸4ð 1ð 1ð 1ð 1ð [ð [ð [ð"�B”JÐ?Ñ@Ô@€Mð[Ðð f¤nð¸ððððð8 cð¨dððððð2ð ˜cð  h¨v¬~Ô&>ð ð ð ñ„\ð ð L cð L¨dð Lð Lð Lð Lð1 sð1¨zð1ð1ð1ð1ðY¨3ðY°:ðYðYðYðYðl¸:ðlÈ$ðlðlðlðlð^¨ð^¸ð^ð^ð^ð^ð?¨Jð?¸4ð?ð?ð?ð?ð,ð#¨ð#°°s¸C°x´ð#ð#ð#ñ„\ð#ðU CðU¨DðUðUðUðUð,ð 9˜cð 9ð 9ð 9ñ„\ð 9ð'¨sð'ð'ð'ð'ðð Ø!ð[Sð[Sð[Sðð[Sðð [Sð ð [Sð ð [Sðð[Sðð[Sð ð[Sð[Sð[SñÔð[Sðzi ði¨ðiðiðiðiðCEð ð ð ¨ð ¸Cð Èð ð ð ð ð$QR CðQR¨CðQRðQRðQRðQRðfAðAðAð2ð V¨ð V°ð Vð Vð VñÔð VðD V¨ð V°ð Vð Vð Vð Vðði˜dði tðiðiðiñ„\ðið( : Cð :ð :ð :ð :ððð˜$ð¨ ðÀCÈ$ÁJðððñ„\ðð T cð T¨cð Tð Tð Tð Tð B Sð B°ð B¸ð Bð Bð Bð BðC cðC¨cðCðCðCðCðA CðA¨CðAðAðAðAð@ 3ð@¨3ð@ð@ð@ð@ðN¨ðNðNðNðNð[˜Cð[ð[ð[ð[ð  ð   Sð  °S¸4±Zð  ÐQTÐW[ÑQ[ð  Ðgjð  ð  ð  ð  ð  ¨cð  °cð  ð  ð  ð  ðs Cðs°Sðs¸Sðsðsðsðsð 9 3ð 9ð 9ð 9ð 9ð : Cð :ð :ð :ð :ðs 3ðsðsðsðsð¨ððððð ¨cððððð¨sððððððrEr2)Trœrär<r{ryr¡r°ržrÎr�Úcollections.abcrrrrrr¯r’Úclcommon.clpwdrÚclcommon.constr Úclcommon.cpapir r Úclcommon.utilsr Úsecureior Úxrayrr•Ú!xray.internal.clwpos_safe_importsrrÚadviser.clwpos_getrÚ apiclientrÚcontinuous.managerrÚinternal.advanced_metricsrÚinternal.exceptionsrrrrrÚinternal.fpm_utilsrÚinternal.local_countersrÚinternal.nginx_utilsrÚinternal.typesrrr Úinternal.user_managerr!Úinternal.user_plugin_utilsr"r#r$Úinternal.utilsr%r&r'r(r)r*Úreconfiguration.global_inir+r,r-r.r/Ú TYPE_CHECKINGÚapiclient.api_clientr0r¢rËr2rúrErCúr¾s`ðð ðð  € € € Ø€€€Ø € € € Ø € € € Ø € € € Ø € € € Ø € € € ØÐÐÐØ € € € Ø$Ð$Ð$Ð$Ð$Ð$Ø(Ð(Ð(Ð(Ð(Ð(Ð(Ð(Ø&Ð&Ð&Ð&Ð&Ð&ØÐÐÐÐÐà € € € Ø*Ð*Ð*Ð*Ð*Ð*Ø"Ð"Ð"Ð"Ð"Ð"ØQÐQÐQÐQÐQÐQÐQÐQØ/Ð/Ð/Ð/Ð/Ð/Ø"Ð"Ð"Ð"Ð"Ð"àÐÐÐÐÐØWÐWÐWÐWÐWÐWÐWÐWà-Ð-Ð-Ð-Ð-Ð-Ø"Ð"Ð"Ð"Ð"Ð"Ø2Ð2Ð2Ð2Ð2Ð2Ø7Ð7Ð7Ð7Ð7Ð7ððððððððððððððð5Ð4Ð4Ð4Ð4Ð4Ø8Ð8Ð8Ð8Ð8Ð8Ø1Ð1Ð1Ð1Ð1Ð1Ø8Ð8Ð8Ð8Ð8Ð8Ð8Ð8Ð8Ð8Ø3Ð3Ð3Ð3Ð3Ð3ØcÐcÐcÐcÐcÐcÐcÐcÐcÐcððððððððððððððððððððððððððððððð Ôð1Ø0Ð0Ð0Ð0Ð0Ð0ð""�r”zÐ"JÑKÔKÐðG ðG ðG ðG ðG ñG ôG ðG ðG ðG rE