§ WèÄjßÏãóv—dZddlZddlZddlZddlZddlZddlZddlZddlm Z ddl m Z m Z ddl mZmZmZmZmZddlmZddlmZddlmZmZmZmZmZmZmZmZmZm Z m!Z!dd l"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z(dd l)m*Z*dd l+m,Z,dd l-m.Z.dd l/m0Z1ddl2m3Z3ddl4m5Z5ddl6m7Z7m8Z8ddl9m:Z:m;Z;mm?Z?m@Z@ddlAmBZBmCZCddlDmEZEmFZFmGZGddlHmIZImJZJmKZKmLZLddlMmNZNddlOmPZPddlQmRZRmSZSddlTmUZUmVZVddlWmXZXddlYmZZZm[Z[ddl\m]Z]dZ^d Z_d!e`fd"„ZaGd#„d$e¦«Zbe Gd%„d&¦«¦«ZcGd'„d(¦«ZddS))zB This module contains X Ray Smart Advice local utility main class éN)Úcontextmanager)ÚasdictÚ dataclass)ÚAnyÚTupleÚOptionalÚListÚDict)ÚEnum)ÚLicenseApproveStatus) Úis_feature_allowedÚis_subscription_pendingÚget_subscription_upgrade_urlÚget_license_approve_statusÚapprove_license_agreementÚget_license_agreement_textÚget_subscriptions_infoÚget_user_auth_keyÚ2is_smart_advice_notifications_disabled_server_wideÚ.is_smart_advice_reminders_disabled_server_wideÚ5is_smart_advice_wordpress_plugin_disabled_server_wide)ÚdocrootÚis_panel_feature_supportedÚget_user_emails_listÚpanel_awp_linkÚ getCPNameÚ userdomains)Ú is_wp_path)Údrop_privileges)ÚFeature)Úgettexté)Úget_advice_instance)ÚSmartAdviceProgressé)Ú get_clientÚ api_client)Úadvice_pending_storageÚadvice_processed_storageÚadvice_list_cacheÚadvice_reason_max_len)Úget_lve_limitsÚ get_lve_usage)Ú XRayErrorÚSmartAdvicePluginError)Úuser_mode_advice_verificationÚusername_verificationÚget_xray_exec_user)Ú timestampÚ safe_moveÚget_user_php_versionÚfilelock)Úreport_usage_action_or_error)Ú ClWposGetter)Úget_mu_directoryÚ"create_mu_plugins_dir_if_not_exist)Úplugin_installedÚprepare_system_analytics_data)Úreport_analytics)ÚImunifyManagerÚADV_TYPE)Úvalidate_system_userú;zE/opt/cloudlinux/flags/enabled-flags.d/xray-smart-advice-disabled.flagÚreturncóJ—tj t¦«S©N)ÚosÚpathÚexistsÚSMART_ADVICE_DISABLED_FLAG©óúK/opt/cloudlinux/venv/lib64/python3.11/site-packages/xray/adviser/cli_api.pyÚ _sa_disabledrLOs€Ý Œ7�>Š>Õ4Ñ 5Ô 5Ð5rJcó—eZdZdZdZdS)Ú AdviceActionsÚapplyÚrollbackN)Ú__name__Ú __module__Ú __qualname__ÚAPPLYÚROLLBACKrIrJrKrNrNSs€€€€€Ø €EØ€H€H€HrJrNcóV—eZdZUeed<eed<eed<eed<eed<eed<eed<dS) ÚSmartAdviceOptionsÚ panel_typeÚ panel_urlÚ panel_emailsÚ upgrade_urlÚupgrade_url_cdnÚ subscriptionÚ notificationsN)rQrRrSÚstrÚ__annotations__ÚdictrIrJrKrWrWXs`€€€€€€à€O€O�OØ€N€N�NØÐÐÑØÐÐÑØÐÐÑØÐÐÑØÐÐÑÐÐrJrWcóú—eZdZdZd„Zededdfd„¦«Zedefd„¦«Zede defd „¦«Z de de e fd „Z ede defd „¦«Zd e defd „Zde defd„Zd„Zed e deeeffd„¦«ZedNdede deddfd„¦«Zd e dedefd„Zde dededeeeffd„ZdNdefd„Zedefd„¦«ZdOd„Zd„Z d „Z!d e defd!„Z" dPd e d#ed$ed%ed&ed'ed(ede efd)„Z# dQd*ed e d#ed$ed%ed&ed'ede efd+„Z$defd,„Z%d e defd-„Z&d.„Z'd/„Z(d0„Z)e dRd1„¦«Z*ed2„¦«Z+ed3„¦«Z,ed4„¦«Z-dSd6„Z.d7„Z/dTd8„Z0ed9efd:„¦«Z1defd;„Z2ed<„¦«Z3ed=„¦«Z4de5eeffd>„Z6ed?„¦«Z7d@„Z8dA„Z9dB„Z:dC„Z;dTdD„Z< dUdFe=edGede=efdH„Z>edIedJe=ede=efdK„¦«Z?dL„Z@dM„ZAdS)VÚSmartAdviceUtilz%Main Smart Advice local utility classcóæ—tjd¦«|_ttfD]}| |¦«Œt d¦«}|¦«|_t¦«|_ dS)NÚ smart_adviceÚadviser) ÚloggingÚ getLoggerÚloggerr(r)Ú create_dirr&Úadviser_clientr>Úimunify_manager)ÚselfÚstorÚadviser_client_objects rKÚ__init__zSmartAdviceUtil.__init__fsq€ÝÔ'¨Ñ7Ô7ˆŒ å+Õ-EÐFð "ð "ˆDØ �OŠO˜DÑ !Ô !Ð !Ð !å *¨9Ñ 5Ô 5ÐØ?TÐ?TÑ?VÔ?VˆÔÝ-Ñ/Ô/ˆÔÐÐrJÚdpathrBNcó’— tj|¦«dS#t$r$tj |¦«s‚YdSwxYw)zCreate dir if missingN)rEÚmkdirÚFileExistsErrorrFÚisdir)rqs rKrjzSmartAdviceUtil.create_dirps[€ð Ý ŒH�U‰OŒOˆOˆOˆOøÝð ð ð Ý”7—=’= Ñ'Ô'ð Øð ð ð ð øøøs‚˜*AÁAc óÒ—dt¦«dœ}|r| |¦«tjt t | ¦«¦«¦«¦«S)z£ Create JSON response message with result field == success and given keyword arguments in other fields :return: json packed string Úsuccess)Úresultr3)r3ÚupdateÚjsonÚdumpsraÚsortedÚitems)ÚkwargsÚinitials rKÚresponsezSmartAdviceUtil.responseysW€ð'µY±[´[ÐAÐAˆØ ð #Ø �NŠN˜6Ñ "Ô "Ð "ÝŒz�$�v g§m¢m¡o¤oÑ6Ô6Ñ7Ô7Ñ8Ô8Ð8rJÚa_idcó8—t|¦«}t›d|›�S)z%Per-advice file with results of applyú/)Úintr)©r�s rKÚ_apply_datafilezSmartAdviceUtil._apply_datafile…s#€õ�4‰yŒyˆÝ*Ð3Ð3¨TÐ3Ð3Ð3rJcóê—| |¦«} tj|tjtjz¦«}nC#t $rYdSt $r* tj|¦«n#t $rYnwxYwYdSwxYw tj|d¦«} |5tj |¦«}ddd¦«n #1swxYwYnV#tj t f$rd}YnÑ?Ô?ˆBˆBøÝ ð ð ð Ø�4�4Ýð ð ð ð Ý” ˜(Ñ#Ô#Ð#Ð#øÝð ð ð Ø�ð øøøà�4�4ð  øøøð Ý”˜2˜sÑ#Ô#ˆBð Øð)ð)Ýœ9 R™=œ=�Dð)ð)ð)ñ)ô)ð)ð)ð)ð)ð)ð)øøøð)ð)ð)ð)øøåÔ(­'Ð2ð ð ð Ø���ð øøøøõð ð ð ð Ý”˜‘ ” � � øÝð ð ð Ø�ð øøøàˆDˆDˆDð  øøøð Ý” ˜(Ñ#Ô#Ð#Ð#øÝð ð ð Ø�ð øøøøð Ý” ˜(Ñ#Ô#Ð#Ð#øÝð ð ð Ø�ð øøøøøøàˆ s—,AÁ BÁ BÁA0Á/BÁ0 A=Á:BÁ<A=Á=BÂBÂC+ÂC  CÂ5 C ÃCÃC ÃCà C à E à C(Ã%E Ã'C(Ã(E Ã+ D Ã6D Ä D Ä DÄD ÄDÄD ÄE ÄD Ä E Ä$D9Ä9 EÅEÅ E0Å E ÅE0Å E-Å*E0Å,E-Å-E0có8—t|¦«}t›d|›�S)zPer-advice pending flagrƒ)r„r(r…s rKÚ _pending_flagzSmartAdviceUtil._pending_flag±s#€õ�4‰yŒyˆÝ(Ð1Ð1¨4Ð1Ð1Ð1rJÚ advice_idcóf—tj | |¦«¦«S)zIs advice in pending state)rErFrGr™)rmršs rKÚis_advice_pendingz!SmartAdviceUtil.is_advice_pending¸s$€åŒw�~Š~˜d×0Ò0°Ñ;Ô;Ñ<Ô<Ð.resolve_progressæsÉøèè€ð ŒK× Ò Ð:¸GÑ DÔ DÐ DØ×.Ò.¨yÑ9Ô9ˆLð 4å˜,Ñ'Ô'ðI¨4Ý"5Ð"HÐ"H½¼ À$¹¼Ð"HÐ"H�KðIðIðIñIôIðIðIðIðIðIðIøøøðIðIðIðIøøå�TÔ1Ð2ð 4ð 4ð 4Ø” ×!Ò!Ð"IÍ3ÈqÉ6Ì6ÑRÔRÐRå1Ñ3Ô3� � � � � � øøøøð 4øøøð ŒK× Ò Ð9¸;Ñ GÔ GÐ GØ$ {Ò2Ð2�'�'¸ Ð CÐ CÐ Cà×%Ò% iÑ0Ô0ð O°W¸{Ò5JÐ5Jà” ×!Ò!Ð"@À'ÑJÔJÐJØ×!Ò! ,µ°w±´ÈÐ!ÑNÔNÐNÐNÐNð Oð OÐ5JÐ5Js;µA;ÁA/Á# A;Á/A3Á3A;Á6A3Á7A;Á;CÂ6C à C)rr$)rmršr³r»s``` rKÚprogresszSmartAdviceUtil.progressÞs[øøø€õ ð OÕ"5ð Oð Oð Oð Oð Oð Oð Oñ Œð Oð0 ÐÑ!Ô!Ð!rJÚ_idÚ advice_objÚ advice_datacó*—| |¦«rRd}| || |dd¦«¦«5}|}ddd¦«n #1swxYwYn|dd}t¦«}|t |¦«fS)z± Resolve if advice is in pending status. Progress is retrieved for pending advice only. Dummy result (0, 0) is returned for other advice states. ÚpendingÚmetadatar£Nr¦Ústatus)rœr¼Ú get_progressr$r)rmr½r¾r¿rÃÚpÚstagess rKÚget_current_statusz"SmartAdviceUtil.get_current_statussÒ€ð × !Ò ! #Ñ &Ô &ð +؈FØ—’˜s J×$;Ò$;¸KÈ Ôz/SmartAdviceUtil.advice_list..sHø€ð$ð$ð$ظ¿ºÀ*ÈbÑ9QÔ9Q×9UÒ9UÐV`Ñ9aÔ9aÐenÒ9nÐ9n�Ð9nÐ9nÐ9nrJrÂr¦r£ÚdomainÚwebsiterÃÚoutdatedrzDUnable to sync cl-smart-advice plugin during getting list of advices)rLr€rkÚ advice_listÚprepare_advices_responser2ÚsetrÎÚaddrr9r;Ú _sync_advicer¡rir¢)rmrËÚ api_responseÚresponse_advice_listÚall_user_sitesÚsites_with_active_advicesrÐÚmetar¦ÚkeyÚsites_with_pluginrÓrÔÚfull_website_pathÚ mu_plugin_dirÚ sites_to_syncrÑs @rKrÖzSmartAdviceUtil.advice_liststø€õ ‰>Œ>ð *Ø—=’= b�=Ñ)Ô)Ð )àÔ*×6Ò6Ñ8Ô8ˆ à#×<Ò<¸\ÐT\Ð<Ñ]Ô]Ðõ'Ñ(Ô(ˆ Ø Ð ð$ð$ð$ð$Ø!5ð$ñ$ô$Ð ð  jØñ Bõ"%¡¤�Ý,/©E¬EÐ)à(ð;ð;�DØŸ8š8 J°Ñ3Ô3�DØ!ŸXšX h°Ñ3Ô3�FØ—x’x  Ñ+Ô+¨yÒ8Ð8Ø ØŸ8š8 HÑ-Ô-¨t¯xªx¸ Ñ/BÔ/BÐC�CØ"×&Ò& sÑ+Ô+Ð+Ø—z’z (Ñ+Ô+¨zÒ9Ð9Ø1×5Ò5°cÑ:Ô:Ð:øõ%(¡E¤EÐ!Ø'5Ð8QÑ'QðAðA‘O�F˜GÝ(/°©¬¸Ô(:¸WÑ(DÐ%Ý$4°YÐ@QÑ$RÔ$R�MØ$ðAÕ)9¸-Ñ)HÔ)HðAØ)×-Ò-¨v°wÐ.?Ñ@Ô@Ð@øà 9Ð.Vs%€ÐnÐnÐnÑ?O¸vÀx˜V°Ð:Ð:ÐnÐnÐnrJrÉ)rkÚ site_infoÚappendÚlenr×r}r€)rmr£rÛÚsite_statuses_datarÔrÓrxs rKÚget_site_statusesz!SmartAdviceUtil.get_site_statusesGsÞ€àÔ*×4Ò4°XÑ>Ô>ˆ ØÐØ#ð ð ˆGؘXÔ&ˆFØÐ/Ð/Ð/Ø-/Ð" 6Ñ*Ø ˜vÔ &× -Ò -à& yÔ1Ý$'¨°¬Ñ$8Ô$8Ø#×<Ò<¸WÀYÔ=OÑPÔPððñ ô ð ð ðoÐnÐSe×SkÒSkÑSmÔSmÐnÑnÔnˆØ�}Š} &ˆ}Ñ)Ô)Ð)rJc ó—| ¦«}g}|D�]f}|d}|d}| t¦«r| |¦«ŒCt |¦«} | j|d<|r|d} dddœ} n | |d| |¦«\} } |r | j|d<| |d<| j|d <| j |d <t| j |d d ¦«j |d <|d rZ|  | j |d d ¦«} t| t| j |d d ¦«¬¦«|d<| | ¦«| |¦«�Œh|S)Nr¦r§Ú descriptionrÃr)Ú total_stagesÚcompleted_stagesÚidÚdetailed_descriptionÚ is_premiumÚ module_namerÂr£Úlicense_status)rÃr[r])ÚcopyÚ startswithr?rìr#Úshort_descriptionrÇrõÚis_premium_featurer÷rÚnameÚ_get_subscription_statusrarry) rmÚfrom_apiÚstatus_from_microservicerËrçÚvisible_advicesrÐÚ advice_itselfÚ advice_typeÚadvice_instancerÃrÆÚsubscription_statuss rKr×z(SmartAdviceUtil.prepare_advices_responseYsӀؗ-’-‘/”/ˆàˆØð) )ñ) )ˆDð! œNˆMØ'¨Ô/ˆKð×%Ò%¥hÑ/Ô/ð Ø×&Ò& tÑ,Ô,Ð,Øå1°+Ñ>Ô>ˆOØ+:Ô+LˆM˜-Ñ (ð(ð eØ& xÔ0�Ø*+ÀÐCÐC��à!%×!8Ò!8¸ÀtÔ9LÈoÐ_cÑ!dÔ!d‘�˜Øð ]Ø8GÔ8\� Ð4Ñ5à&,ˆM˜(Ñ #Ø*9Ô*LˆM˜,Ñ 'Ø+:Ô+FˆM˜-Ñ (å.HØÔ+¨T°*Ô-=¸jÔ-Iñ/ô/äð Ð*Ñ +ð˜\Ô*ð Ø&*×&CÒ&CØ#Ô/°°jÔ1AÀ*Ô1Mñ'ô'Ð#õ15Ø.Ý <¸_Ô=XÐZ^Ð_iÔZjÐkuÔZvÑ wÔ wð1ñ1ô1� ˜nÑ-ð × Ò  Ñ (Ô (Ð (à × "Ò " 4Ñ (Ô (Ð (Ñ (ØÐrJcó(‡‡‡—ˆˆˆfd„|D¦«S)Ncó|•—g|]¸}| di¦« d¦«‰kr‰| di¦« d¦«‰kr\| di¦« d¦«‰kr/| di¦« d¦«dk¯¶|‘Œ¹S)rÂrÓr£rÔr¦rÃrÕrÍ)rÏr¦rÓr£rÔs €€€rKrÒz9SmartAdviceUtil.filter_plugin_advices..ŠsÂø€ð ð ð àØ�zŠz˜* bÑ)Ô)×-Ò-¨hÑ7Ô7¸6ÒAÐAØ— ’ ˜: rÑ*Ô*×.Ò.¨zÑ:Ô:¸hÒFÐFØ— ’ ˜: rÑ*Ô*×.Ò.¨yÑ9Ô9¸WÒDÐDØ— ’ ˜8 RÑ(Ô(×,Ò,¨XÑ6Ô6¸*ÒDÐDð ð EÐDÐDrJrI)rmr£rÔrÓrÖs ``` rKÚfilter_plugin_advicesz%SmartAdviceUtil.filter_plugin_advices‰s:øøø€ð ð ð ð ð ð à%ð ñ ô ð rJcóR—d}t||¦«rd}t||¦«rd}|S)zQ Determines current subscription status based on feature status. ÚnoÚactiverÁ)r r)rmr÷r£rs rKrþz(SmartAdviceUtil._get_subscription_status“s@€ð#ÐÝ ˜k¨8Ñ 4Ô 4ð +Ø"*Ð Ý " ;°Ñ 9Ô 9ð ,Ø"+Ð Ø"Ð"rJcóî—| |¦«\}}|d} |dr |d|d<n |j|d<|dr |d|d<n |j|d<|d=| |¬¦«S)z¨Ô(=Ð(vÐ(vÀ ÈZÔ@XÐ(vÐ(vÐhuÐ(vÐ(vÐ(vÑ%� ˜vØ ð lØ”K×%Ò%Ð&<Ñ=Ô=Ð=ØÔ'×5Ò5À ÐR[ÐdjÐ5ÑkÔkÐkðlØ×)Ò)Ø(¨Ô4°ZÔ@Ø(¨Ô4°XÔ>Ø(¨Ô4°YÔ?ñôðñøõ %ðlðlðlØœ ×-Ò-Ð.jÑkÔkÐkÐkÑkðløøøñ lð�=Ô1Ô7Ò7Ð7Ø(@¨Ô(@Ð(\Ð(\À<ÐPZÔC[Ð(\Ð(\Ñ%� ˜vØ ðoØ”K×%Ò%Ð&=Ñ>Ô>Ð>ØðoØÔ+×9Ò9Ø&/¸ÈÐX^Ð_uÕ`uÐ_uÔXvð:ñôðððÔ+×9Ò9ÀIÐV^ÐgmÐ9ÑnÔnÐnðoØ×)Ò)Ø(¨Ô4°ZÔ@Ø(¨Ô4°XÔ>Ø(¨Ô4°YÔ?ñôððøõ %ðoðoðoØœ ×-Ò-Ð.mÑnÔnÐnÐnÐnðoøøøðoõ$!¥Ð#VÑ!WÔ!WÕZ]Ð^dÑZeÔZeÑ!eÑfÔfÐfõŒw�~Š~˜d×0Ò0°Ñ;Ô;Ñ<Ô<ð 9Ý” ˜$×,Ò,¨YÑ7Ô7Ñ8Ô8Ð8øøõŒw�~Š~˜d×0Ò0°Ñ;Ô;Ñ<Ô<ð 9Ý” ˜$×,Ò,¨YÑ7Ô7Ñ8Ô8Ð8Ð8ð 9øøøð ð à × Ò ˜d×2Ò2°9Ñ=Ô=¸vÑ FÔ FÐ FàˆMðˆMs]‚B#L>ÄAL>Å;FÆL>Æ$F9Æ5L>Æ8F9Æ9BL>É;J Ê L>Ê $J4Ê1L>Ê3J4Ê40L>Ì>ANcó(— |j ¦«}tt|¦«td„|D¦«¦«¬¦«}n-#t$r t ddgd¦«}YnwxYw| |¬¦«S)z#Return advice counters for a servercó6—g|]}|dddk¯|‘ŒS)r¦rÃr rI)rÏr¦s rKrÒz3SmartAdviceUtil.advice_counters..2s.€ÐjÐjÐj¨À&ÈÔBRÐS[ÔB\Ð`iÒBiÐBi˜VÐBiÐBiÐBirJ)Útotalr r+r NrÉ)rkrÖrarír.Úfromkeysr€)rmrÛrxs rKÚadvice_counterszSmartAdviceUtil.advice_counters's©€ð ØÔ.×:Ò:Ñ<Ô<ˆLõ ݘ,Ñ'Ô'ÝÐjÐj°,ÐjÑjÔjÑkÔkðñôˆFˆFøõ ð ?ð ?ð ?õ—]’] G¨YÐ#7¸Ñ>Ô>ˆFˆFˆFð ?øøøð�}Š} &ˆ}Ñ)Ô)Ð)s‚AÁ'A;Á:A;c ó~—| |¦«\}}| |||¦«\}}| |j|dd¦«}|dkr¡| |¦«}| |¦«}t j |¦«rt j |¦«|rB|j d|t|¬¦«t|j|dd¦«dœ|¤d|i¤ŽS|j d|t|¬¦«t|j|dd¦«dœ|¤ŽS)zS Return current status and progress of managing particular advice. rÂr£rÁ)Ú object_cache)rÃr]r[r–rI) r©rÇrþr÷r—ržrErFr%rŽr€rar) rmršrÛrrÃrÆrrxÚ _progresss rKrz$SmartAdviceUtil.manage_advice_status6sŠ€ð)-×(@Ò(@ÀÑ(KÔ(KÑ%ˆ �oØ×0Ò0°¸OÈ\ÑZÔZ‰ˆ�à"×;Ò;Ø Ô '¨°jÔ)AÀ*Ô)Mñ ô Ðð �YÒ Ð à×(Ò(¨Ñ3Ô3ˆFà×+Ò+¨IÑ6Ô6ˆIÝŒw�~Š~˜iÑ(Ô(ð %Ý” ˜)Ñ$Ô$Ð$àð Ø$�t”}ðØ!Ý!%Ð3FÐ!GÑ!GÔ!GÝ <Ø'Ô3°\À*Ô5MÈjÔ5Yñ!ô!ððð ð ðð ðððððˆtŒ}ð ØÝÐ+>Ð?Ñ?Ô?Ý4°_Ô5PÐR^Ð_iÔRjÐkuÔRvÑwÔwð ð ðð  ð ð rJcóB—t¦«r#| td¦«¬¦«S|j dd¬¦«}t ¦«}i}|D]Ü}| d¦«}| d¦«pi}|s)|j dt|¦«¦«ŒY| d ¦«d krŒs| d ¦«| d ¦«}}t||g¦«s)|j d t|¦«¦«Œ×|||<ŒÝ|s#| td¦«¬¦«S|  ¦«D]‡\} } |  | | |¦«} | s#tjdt| ¦«¦«ŒB| | ¦«ŒX#t $r#} tjd| d| i¬¦«Yd} ~ Œ€d} ~ wwxYw| td¦«¬¦«S)z§ Updates incompatibilities only, but could be extended to more magic how to make microservice know that users/domains/websites no longer exist ú$Smart Advice is disabled server-widerÉFT)ÚfilteredÚshow_allrÂr¦z9Malformed advice metadata, does not have metadata key: %srÃrÕr£rÓzNMalformed advice metadata, does not have required username or domain field: %sz)No valid (non-outdated) advices to updatez.Updated metadata for user: %s will not be sentz6Failed to update advice metadata with Smart Advice: %sÚ fingerprint©ÚextraNz Advices metadata update finished)rLr€r$rkrÖr8rÎriÚerrorr_Úallr}Úget_updated_extended_metadatargÚwarningÚsendr¡) rmÚcurrent_advicesÚgetterÚuser_domain_pairsÚ advice_objectÚcurrent_adv_metadatar¿r£rÓÚuserÚ user_domainÚupdated_metadatarºs rKÚupdate_advices_metadataz'SmartAdviceUtil.update_advices_metadata[sn€õ ‰>Œ>ð QØ—=’=¥aÐ(NÑ&OÔ&O�=ÑPÔPÐ PØÔ-×9Ò9À5ÐSWÐ9ÑXÔXˆÝ‘”ˆàÐà,ð 1ð 1ˆMØ#0×#4Ò#4°ZÑ#@Ô#@Ð Ø'×+Ò+¨HÑ5Ô5Ð;¸ˆKà'ð Ø” ×!Ò!Ð"]Õ_bÐcpÑ_qÔ_qÑrÔrÐrØð�Š˜xÑ(Ô(¨JÒ6Ð6Øà3×7Ò7¸ ÑCÔCÐEY×E]ÒE]Ð^fÑEgÔEg�fˆH嘠Ð)Ñ*Ô*ð Ø” ×!Ò!ØdÝÐ,Ñ-Ô-ñôððà*0Ð ˜hÑ 'Ð 'ð!ð VØ—=’=¥aÐ(SÑ&TÔ&T�=ÑUÔUÐ Uà!2×!8Ò!8Ñ!:Ô!:ð ð Ñ ˆD�+ð Ø#)×#GÒ#GÈÈkÐ[jÑ#kÔ#kÐ à'ðÝ”OÐ$TÕVYÐZ^ÑV_ÔV_Ñ`Ô`Ð`Øà— ’ Ð,Ñ-Ô-Ð-Ð-øÝð ð ð Ý” ØLØà% qððñôðð����øøøøð øøøð�}Š}¥!Ð$FÑ"GÔ"Gˆ}ÑHÔHÐHsÅ<;GÆ8GÇ G;ÇG6Ç6G;cón—|j ¦«}|j d¬¦«}| |¦«| |¦«} | |dd¬¦«}| ||||¦«}| ||||¦«n9#t$r,|j   dt|¦«¦«YdSwxYw|  ¦«}|›t›|›t›|›�} | |vri|| <|| || <| |¦«dS)NT©Ú cache_only)rrËz/Smart Advice plugin sync failed for website: %s)rkrÖrlÚ im360_adviceÚextendÚget_advice_hash_mapr×rÚ_run_smart_advice_scriptr¡rir¢r_Ú_read_advices_cacheÚadvice_cache_separatorÚ_update_advices_cache) rmr£rÓrÔr=Úim360_advice_listÚadvice_hash_mapÚfiltered_advice_listÚcached_advices_by_siteràs rKrÚzSmartAdviceUtil._sync_advice—s{€ØÔ-×9Ò9Ñ;Ô;ˆð!Ô0×=Ò=ÈÐ=ÑNÔNÐØ×ÒÐ0Ñ1Ô1Ð1à×2Ò2°?ÑCÔCˆð Ø#'×#@Ò#@ظ$Èð$Añ$ô$Ð ð$(×#=Ò#=¸hÈÐQWÐYmÑ#nÔ#nÐ Ø × )Ò )¨(°G¸VÐEYÑ ZÔ ZÐ ZÐ ZøÝð ð ð Ø ŒK× !Ò !Ð"SÕUXÐY`ÑUaÔUaÑ bÔ bÐ bØ ˆFˆFð øøøð"&×!9Ò!9Ñ!;Ô!;ÐØÐ\Õ/Ð\°Ð\Õ;QÐ\ÐSZÐ\Ð\ˆØ Ð,Ð ,Ð ,Ø*,Ð " 3Ñ 'Ø&5°cÔ&:ИsÑ#Ø ×"Ò"Ð#9Ñ:Ô:Ð:Ð:Ð:sÁ AB)Â)2CÃCcót—ddlm}t|¦«}|¦«j |¦«}|S)Nr)ÚAWPProvisionAPI)Úxray.adviser.awp_provision_apirUrÚawp_client_apiÚ get_usage)rmr£rUÚacc_idÚ cdn_usages rKÚ_get_cdn_usage_statisticsz)SmartAdviceUtil._get_cdn_usage_statistics°sE€ØBÐBÐBÐBÐBÐBå" 8Ñ,Ô,ˆØ#�OÑ%Ô%Ô4×>Ò>¸vÑFÔFˆ ØÐrJc ó¸—t|||¦«} t| || ¦«|||¬¦«| t d¦«¬¦«S)N)r–ršrÚeventÚfeatureÚ variant_idzAnalytics sentrÉ)r<r=Úlowerr€r$) rmr£r^rr]ršÚ journey_idÚ user_hashr_rs rKÚanalytics_reportz SmartAdviceUtil.analytics_report·se€õ7°xÀÈJÑWÔWˆÝØØØ—<’<‘>”>ØØØ!ð  ñ ô ð ð�}Š}¥!Ð$4Ñ"5Ô"5ˆ}Ñ6Ô6Ð6rJcóÖ— t|¦«dd}t||¦«}n,#t$r|j d¦«d}YnwxYw t |¦«}n,#t$r|j d¦«i}YnwxYw |j ¦« d¦«}n,#t$r|j d¦«d}YnwxYw |j  |¦«durd nd }n,#t$r|j d ¦«d }YnwxYwd |i|d <tt¦«durdndt¦«durdnd|durdnd¬¦«}|j dittt!¦«| |¦«|t%d|¦«t%d|¦«||¬¦«¦«¤ŽS)ad gets options: "panel_type": "cpanel", "panel_url": "https:/cpanel-foo.com/", # or https://plesk-bar.com/ "panel_emails": "root@hosting.com,manager@hostring.com,foo@bar.com", "upgrade_url": "https://...", "upgrade_url_cdn": "https://...", "subscription": dict, "notifications": dict, rúUnable to get user emailsr zCannot obtain subscription infoÚadvice_email_notificationz/Cannot obtain im360 advice notification settingFTr r z%Cannot obtain im360 protection statusrÃÚ protectionÚdisabled_serverÚenabled)Ú email_statusÚreminders_statusÚimunify_email_statusr/Úcdn)rXrYrZr[r\r]r^rI)rrr¡rir¢rrlÚget_im360_settingsrÎÚget_im360_protection_statusrarrr€rrWrr¤r)rmr£rÓÚemailr]Úim360_advice_notificationÚprotection_statusr^s rKÚ get_optionszSmartAdviceUtil.get_optionsÆs}€ð å  Ñ*Ô*¨1Ô-¨aÔ0ˆFÝ(¨°6Ñ:Ô:ˆEˆEøÝð ð ð Ø ŒK× !Ò !Ð"=Ñ >Ô >Ð >؈EˆEˆEð øøøð Ý1°(Ñ;Ô;ˆLˆLøÝð ð ð Ø ŒK× !Ò !Ð"CÑ DÔ DÐ D؈LˆLˆLð øøøð .Ø(,Ô(<×(OÒ(OÑ(QÔ(Q×(UÒ(UÐVqÑ(rÔ(rÐ %Ð %øÝð .ð .ð .Ø ŒK× !Ò !Ð"SÑ TÔ TÐ TØ(-Ð %Ð %Ð %ð .øøøð %Ø,0Ô,@×,\Ò,\Ð]eÑ,fÔ,fÐjnÐ,nÐ,n  ÐtxÐ Ð øÝð %ð %ð %Ø ŒK× !Ò !Ð"IÑ JÔ JÐ JØ $Ð Ð Ð ð %øøøð'/Ð0AÐ%Bˆ �\Ñ"ååAÑCÔCÀtÐKÐKð+Ð*àå=Ñ?Ô?À4ÐGÐGð/Ð.àØ.GÈ4Ð.OÐ.O  ÐUfð ñ ô ˆ ðˆtŒ}ð  ð  ÝÝ"Ý(™{œ{Ø"×5Ò5°hÑ?Ô?Ø!&Ý <¸^ÈXÑ VÔ VÝ$@ÀÈÑ$QÔ$QØ!-Ø"/ðñôñ ô ð  ð  ð sE‚+.®&AÁAÁA+Á+&BÂBÂ,CÃ&C.Ã-C.Ã2 DÄ&D<Ä;D<cóL—t|¦«}tj|d¬¦«S)a, Retrieves the LVE limits for a specified user. { "lve_cpu": { "limit": int }, "lve_ep": { "limit": int }, "lve_pmem": { "limit": int }, "lve_iops": { "limit": int }, "lve_io": { "limit": int }, "lve_nproc": { "limit": int }, } or { "error": str } r%©Úindent)r,rzr{©rmr£rxs rKÚ get_limitszSmartAdviceUtil.get_limitss&€õ:  Ñ)Ô)ˆÝŒz˜&¨Ð+Ñ+Ô+Ð+rJcóL—t|¦«}tj|d¬¦«S)a/ Retrieves the current usage for a specified user. { "lve_cpu": { "usage": int }, "lve_ep": { "usage": int }, "lve_pmem": { "usage": int }, "lve_iops": { "usage": int }, "lve_io": { "usage": int }, "lve_nproc": { "usage": int }, } or { "error": str } r%ru)r-rzr{rws rKrXzSmartAdviceUtil.get_usage%s&€õ:˜xÑ(Ô(ˆÝŒz˜&¨Ð+Ñ+Ô+Ð+rJTcóp—t¦«r#| td¦«¬¦«S|s|j ¦«}|j |¬¦«}| |¦«| |¦«}|  ¦«}|s|s| d¬¦«St¦«  ¦«|  |||  |d¬¦«¬¦«}| |¦«| d¬¦«S) Nr2rÉrGzNo advices found on the serverTrÊ)Úcurrent_advices_jsonzPlugin installed)rLr€r$rkrÖrlrIrJrKrMr8Úsave_clwpos_infoÚ_sync_sa_pluginr×rO)rmr=Ú im360_cachedrPÚnew_hash_cache_by_siteÚexisting_hash_cache_by_siteÚ updated_caches rKÚsync_advices_wordpress_pluginz-SmartAdviceUtil.sync_advices_wordpress_pluginEs?€Ý ‰>Œ>ð QØ—=’=¥aÐ(NÑ&OÔ&O�=ÑPÔPÐ Pàð @Ø"Ô1×=Ò=Ñ?Ô?ˆOð!Ô0×=Ò=ÈÐ=ÑVÔVÐØ×ÒÐ0Ñ1Ô1Ð1à!%×!9Ò!9¸/Ñ!JÔ!JÐØ&*×&>Ò&>Ñ&@Ô&@Ð#à%ð HÐ.Ið HØ—=’=Ð&F�=ÑGÔGÐ G剌×'Ò'Ñ)Ô)Ð)Ø×,Ò,Ø "Ø 'Ø!%×!>Ò!>¸ÐY]Ð!>Ñ!^Ô!^ð-ñ ô ˆ ð ×"Ò" =Ñ1Ô1Ð1Ø�}Š}Ð"4ˆ}Ñ5Ô5Ð5rJcó—| ¦«}|s#| td¦«¬¦«St¦« ¦«|D]s}| t d¦«\}}} | |||d¬¦«Œ<#t$r+|j   dt|¦«¦«YŒpwxYw|  i¬¦«| td¦«¬¦«S) zJ Uninstalls all Smart Advice WordPress plugins on server. zNo plugins found on the serverrÉr%N©Ú advices_jsonz2Smart advice plugin removal failed for website: %s)Únew_cached_adviceszPlugin uninstalled) rMr€r$r8r|ÚsplitrNrLr¡rir¢r_rO)rmr€ràrÓr£rÔs rKÚuninstall_wordpress_pluginsz+SmartAdviceUtil.uninstall_wordpress_plugins_s€ð'+×&>Ò&>Ñ&@Ô&@Ð#à*ð KØ—=’=¥aÐ(HÑ&IÔ&I�=ÑJÔJÐ J剌×'Ò'Ñ)Ô)Ð)à.ð ð ˆCà*-¯)ª)Õ4JÈAÑ*NÔ*NÑ 'ˆV�X˜wð Ø×-Ò-¨h¸ÀÐVZÐ-Ñ[Ô[Ð[Ð[øÝð ð ð Ø” ×%Ò%Ð&ZÕ\_Ð`gÑ\hÔ\hÑiÔiÐiØ�ð øøøð ×"Ò"°bÐ"Ñ9Ô9Ð9Ø�}Š}¥!Ð$8Ñ"9Ô"9ˆ}Ñ:Ô:Ð:sÁ>BÂ2C à C c ó"—tjd¦«i}| ¦«D�]"\}}| td¦«\}}} | ||| || |¦«¦«stjd|¦«|||<Œl|r| || ||¦«} nd} t|¦«d| z} t|| ¦«} | s| rt| ¦«s|||<ŒÊ |  || || ¦«n9#t$r,|j dt!| ¦«¦«Y�ŒwxYw|||<�Œ$t#|¦«t#|¦«z } | rŸtjd¦«| D]ˆ}| td¦«\}}} tjd|¦« |  || |d¬¦«ŒQ#t$r+|j dt!| ¦«¦«YŒ…wxYw|S) Nz,Synchronization of smart advice plugin beginr%z:Website %s does not need update because cache hash matchesrz/Smart advice plugin sync failed for website: %szNFound outdated records in cache, removing wordpress plugins for those websitesz!Removing outdated cache record %sr„)rgÚinfor}r‡rNÚ_should_sync_websiterÎr¶rrr9r;rLr¡rir¢r_rØ)rmÚnew_hash_advice_cacheÚexisting_hash_advice_cacher{Úupdated_advicesràÚid_status_hashrÓr£rÔrRrârãÚorphan_hash_recordss rKr}zSmartAdviceUtil._sync_sa_pluginws‰€ÝŒ ÐCÑDÔDÐDàˆà#8×#>Ò#>Ñ#@Ô#@ð 2ñ 2Ñ ˆC�à*-¯)ª)Õ4JÈAÑ*NÔ*NÑ 'ˆV�X˜wØ×,Ò,ؘ '¨>Ð;U×;YÒ;YÐZ]Ñ;^Ô;^ñôð õ” ÐZÐ\_Ñ`Ô`Ð`Ø'5� Ñ$Øð$ð ,Ø'+×'AÒ'AÀ(ÈGÐU[Ð]qÑ'rÔ'rÐ$Ð$à'+Ð$õ!(¨¡¤°Ô 2°WÑ <Ð Ý,¨XÐ7HÑIÔIˆMØ'ð ¨Mð ÕBRÐS`ÑBaÔBað Ø'5� Ñ$Øð Ø×-Ò-¨h¸ÀÐI]Ñ^Ô^Ð^Ð^øÝð ð ð Ø” ×%Ò%Ð&WÕY\Ð]dÑYeÔYeÑfÔfÐfØ‘ð øøøð$2ˆO˜CÑ Ñ õ"Ð"<Ñ=Ô=ÅÐDYÑ@ZÔ@ZÑZÐØ ð å ŒLÐiÑ jÔ jÐ jØ*ð ð �à.1¯iªiÕ8NÐPQÑ.RÔ.RÑ+�˜ 7å” Ð@À#ÑFÔFÐFðØ×1Ò1°(¸GÀVÐZ^Ð1Ñ_Ô_Ð_Ð_øÝ ðððØ”K×)Ò)Ð*[Õ]`ÐahÑ]iÔ]iÑjÔjÐjØ�HðøøøðÐs$Ã6DÄ2EÅEÆ=GÇ2H È H r†cóh—tt›d�d¦«5}t|¦«5ttd¦«5}tjd|¦«t j||d¬¦«ddd¦«n #1swxYwYddd¦«n #1swxYwYddd¦«dS#1swxYwYdS)Nz.lockza+r­z-Updating advice hash map cache with values %sr%ru)r‰r*r6rgr¶rzr®)r†Úlock_fdÚfs rKrOz%SmartAdviceUtil._update_advices_cache­sp€å Õ&Ð-Ð-Ð-¨tÑ 4Ô 4ð 7¸ÅÈ'ÑARÔARð 7ð 7ÕTXÕYjÐloÑTpÔTpð 7ÐtuÝ ŒMÐIÐK]Ñ ^Ô ^Ð ^Ý ŒIÐ(¨!°AÐ 6Ñ 6Ô 6Ð 6ð 7ð 7ð 7ñ 7ô 7ð 7ð 7ð 7ð 7ð 7ð 7øøøð 7ð 7ð 7ð 7ð 7ð 7ð 7ñ 7ô 7ð 7ð 7ð 7ð 7ð 7ð 7øøøð 7ð 7ð 7ð 7ð 7ð 7ð 7ñ 7ô 7ð 7ð 7ð 7ð 7ð 7ð 7ð 7øøøð 7ð 7ð 7ð 7ð 7ð 7sW™B'©B¿-A8Á, BÁ8A< Á<BÁ?A< ÂB B'ÂB ÂB'ÂB ÂB'Â'B+Â.B+có.—i}tj t¦«rn t t¦«5}t j|¦«}ddd¦«n #1swxYwYn,#t$r|j  d¦«i}YnwxYw|S)Nz!Unable to read advices cache json) rErFrGr*r‰rzr�r¡rir¢)rmrSr“s rKrMz#SmartAdviceUtil._read_advices_cache³sÚ€Ø!#ÐÝ Œ7�>Š>Õ+Ñ ,Ô ,ð ,ð ,ÝÕ+Ñ,Ô,ð:°Ý-1¬Y°q©\¬\Ð*ð:ð:ð:ñ:ô:ð:ð:ð:ð:ð:ð:øøøð:ð:ð:ð:øøåð ,ð ,ð ,Ø” ×%Ò%Ð&IÑJÔJÐJØ)+Ð&Ð&Ð&ð ,øøøð&Ð%s4¨A)¼AÁ A)ÁA!Á!A)Á$A!Á%A)Á)&BÂBcóˆ—||krdSt|¦«d|z}t||¦«}t|¦«sdSdS)NTrF)rr9r;)rÓr£rÔÚ current_hashÚ cached_hashrârãs rKr‹z$SmartAdviceUtil._should_sync_website¾sR€à ˜;Ò &Ð &Ø�4å# F™OœO¨AÔ.°Ñ8ÐÝ(¨Ð3DÑEÔEˆ å  Ñ.Ô.ð Ø�4àˆurJcó—tj¦«}|D]`\}}| t|¦« ¦«¦«| | ¦«¦«Œa| ¦«SrD)ÚhashlibÚmd5ryr_ÚencodeÚ hexdigest)Úid_status_pairsÚhršrÃs rKÚ make_hashzSmartAdviceUtil.make_hashËsp€å ŒK‰MŒMˆØ!0ð &ð &Ñ ˆI�vØ �HŠH•S˜‘^”^×*Ò*Ñ,Ô,Ñ -Ô -Ð -Ø �HŠH�V—]’]‘_”_Ñ %Ô %Ð %Ð %Ø�{Š{‰}Œ}ÐrJcó&‡—i}|D]l}|d}|d}|d›t›|d›t›|d›�}||vrg||<|| |d|df¦«Œmˆfd„| ¦«D¦«S) a” Prepare fingerprints for each of the advices generated, grouped by the website that advice is assigned to. Result example: { "demo-10-194-0-9.traefik.me;demowp;/": "f43c7bcdccc28fc1ac92b2384f35f9dd" } Key is combination of domain, usernane and webiste path and value is hash against list of advices and their current statuses. rÂr¦rÓr£rÔrôrÃc ó|•—i|]8\}}|‰ tt|d„¬¦«¦«¦«“Œ9S)có,—t|d¦«S)Nr)r_)rÐs rKúz@SmartAdviceUtil.get_advice_hash_map...îs€ÍsÐSWÐXYÔSZÉ|Ì|€rJ)rà)rŸÚtupler|)rÏràr�rms €rKú z7SmartAdviceUtil.get_advice_hash_map..ísTø€ð ð ð á$��_ð �—’¥¥f¨_ÐB[ÐB[Ð&\Ñ&\Ô&\Ñ ]Ô ]Ñ^Ô^ð ð ð rJ)rNrìr})rmrçrêr¦rÂr¿ràs` rKrKz#SmartAdviceUtil.get_advice_hash_mapÓsìø€ðˆØð Mð MˆFؘjÔ)ˆHØ  Ô*ˆKð˜HÔ%ðAÕ'=ðA¸xÈ Ô?SðAÝ)ðAØ+3°IÔ+>ðAðAð ð˜(Ð"Ð"Ø "�˜‘ Ø �SŒM× Ò  +¨dÔ"3°[ÀÔ5JÐ!KÑ LÔ LÐ LÐ Lð ð ð ð à(0¯ªÑ(8Ô(8ð ñ ô ð rJcó—tj|tjtjztjztjzd¦«}tj|d¦«5}| |¦«ddd¦«dS#1swxYwYdS)z" For easy mocking i€r­N)rEr‰ÚO_WRONLYÚO_CREATÚO_TRUNCr‹r�r°)rFÚcontentr”r“s rKÚ_save_custom_phpz SmartAdviceUtil._save_custom_phpòs´€õ ŒW�T�2œ;­¬Ñ3µb´jÑ@Å2Ä=ÑPÐRWÑ XÔ XˆÝ ŒY�r˜3Ñ Ô ð  1Ø �GŠG�GÑ Ô Ð ð ð ð ñ ô ð ð ð ð ð ð ð øøøð ð ð ð ð ð sÁBÂBÂBc ó–—tj|¦«j›d�}d}tj ||¦«}gd¢}d}t jdddd|gdd¬ ¦«}|jd kr#|j   d ||j ¦«dSt jd d g|j dd¬¦«} | j   dd¦«  dd¦« ¦«} |j  dt!| j ¦«¦«t#| ¦«d krd}n£t#| ¦«d kr�| dkrŠd|  d¦«vrd}np|  d¦«rdd |¦«z}nBg} |D] } | | j vr|  | ¦«Œ!| rd| ›dd | ¦«›�}|�rq|j  d||¦«t+|¦«5tj |¦«s5tj |¦«stj|d¬¦«| ||¦«ddd¦«n #1swxYwYt jdddd|d|gdd¬ ¦«} | jd kr#|j   d|| j ¦«dS|j  dt!| j ¦«¦«|j   dt!|¦«t!| j ¦«t!|¦«¦«dSdS) Nz/.clwposz.php-ini)z/opt/alt/php-xray/z)/opt/cloudlinux-site-optimization-module/z/opt/cloudlinux/z/usr/sbin/pleskÚbinÚsitez--show-php-settingsT©rÚcapture_outputrz+Plesk --show-php-settings failed for %s: %sz /usr/bin/grepÚ open_basedir)Úinputrr°zopen_basedir =r z open_basedir=z!Current open_basedir settings: %sÚnoneú:zopen_basedir = nonez,open_basedir = {WEBSPACEROOT}{/}{:}{TMP}{/}:zopen_basedir = z0Updating open_basedir setting: %s for domain: %siÀ)Úmodez--update-php-settingsz -settingsz-Plesk --update-php-settings failed for %s: %sz Plesk settings update result: %sz>open_basedir setting updated for domain "%s" from "%s" to "%s")ÚpwdÚgetpwnamÚpw_dirrErFÚjoinÚ subprocessÚrunÚ returncoderir8ÚstderrÚstdoutÚreplaceÚstriprŠr_rír‡rúrìrrGrursr«)rmr£rÓÚ clwpos_dirÚ custom_phpÚcustom_php_fullÚ extra_pathsÚupdated_settingÚ plesk_resultÚopen_basedir_settingÚopen_basedir_setting_sanitizedÚ missing_pathsÚ extra_pathrxs rKÚ_prepare_php_for_pleskz&SmartAdviceUtil._prepare_php_for_pleskûsü€Ýœ  XÑ.Ô.Ô5Ð?Ð?Ð?ˆ ؈ Ýœ'Ÿ,š, z°:Ñ>Ô>ˆØmÐmÐmˆ ؈å!”~Ø   vÐ/DÀfÐ MÐTXÐimð ñ ô ˆ ð Ô " aÒ 'Ð 'Ø ŒK× Ò ÐKÈVÐUaÔUhÑ iÔ iÐ iØ ˆFÝ)œ~Ø ˜nÐ -°\Ô5HÈtÐdhð ñ ô Ðð !Ô '× /Ò /Ð0@À"Ñ EÔ E× MÒ MÈoÐ_aÑ bÔ b× hÒ hÑ jÔ jð 'ð Œ ×ÒÐ<½cÐBVÔB]Ñ>^Ô>^Ñ_Ô_Ð_õ Ð-Ñ .Ô .°!Ò 3Ð 3Ø.ˆOˆOå Ð/Ñ 0Ô 0°1Ò 4Ð 4Ð9WÐ[aÒ9aÐ9aàÐ7×=Ò=¸cÑBÔBÐBÐBØ"7��Ø/×:Ò:¸3Ñ?Ô?ð sØ"PÐSV×S[ÒS[Ð\gÑShÔShÑ"h��ð!#� Ø"-ð9ð9�Jà!Ð)=Ô)DÐDÐDØ%×,Ò,¨ZÑ8Ô8Ð8øà ðsØ&rÐ8VÐ&rÐ&rÐY\×YaÒYaÐboÑYpÔYpÐ&rÐ&r�Oà ñ Ø ŒK× Ò ÐOÐQ`ÐbhÑ iÔ iÐ iõ! Ñ*Ô*ð Hð HÝ”w—~’~ oÑ6Ô6ð9Ýœ7Ÿ=š=¨Ñ4Ô4ð9Ýœ °%Ð8Ñ8Ô8Ð8Ø×%Ò% o°ÑGÔGÐGð  Hð Hð Hñ Hô Hð Hð Hð Hð Hð Hð Høøøð Hð Hð Hð Hõ  ”^Ø" E¨6Ð3JÈFÐT_ÐapÐqØØ#ðñôˆFð Ô  AÒ%Ð%Ø” ×!Ò!Ð"QÐSYÐ[aÔ[hÑiÔiÐiØ�Ø ŒK× Ò Ð?ÅÀVÄ]ÑASÔASÑ TÔ TÐ TØ ŒK× Ò ØPÝ�F‘ ” ÝÐ(Ô/Ñ0Ô0Ý�OÑ$Ô$ñ  ô ð ð ð ð' ð sÈA+I:É:I>ÊI>c ó— | g¬¦«}| ||||d¦«}| ||¦«}n#t$rYdSwxYwt jd||¦«t j|dd¬¦«}|jdkr{|j   dt|j¦«t|j ¦«t|j ¦«d d |j›�i¬ ¦«ttd ¦«¦«‚dS) z9 Uninstall WordPress SmartAdvice plugin. rÉÚtrueNz@Uninstalling Smart Advice plugin for website %s with advices: %sTr¯rzRSmart advice plugin uninstalling failed with exit code: %s, stdout: %s, stderr: %sr5ú"smart-advice-plugin-sh-returncode-r6z'Smart Advice plugin uninstalling failed)r€Ú!_prepare_smart_advice_script_argsÚ_get_smart_advice_script_cmdr'rgr¶rºr»r¼rir8r_r¾r½r/r$)rmr£rÔrÓÚ json_stringÚattrsÚcommandrxs rKÚ_uninstall_wordpress_pluginz+SmartAdviceUtil._uninstall_wordpress_plugin@s.€ð ØŸ-š-¨R˜-Ñ0Ô0ˆKØ×:Ò:¸8ÀWÈfÐVaÐciÑjÔjˆEØ×7Ò7¸À%ÑHÔHˆGˆGøÝð ð ð à ˆFˆFð øøøõ Œ ÐXÐZaÐcnÑoÔoÐoÝ” ¨dÀ4ÐHÑHÔHˆØ Ô  Ò !Ð !Ø ŒK× Ò ØdÝ�FÔ%Ñ&Ô&Ý�F”MÑ"Ô"Ý�F”MÑ"Ô"à!Ð#[ÈÔHYÐ#[Ð#[ðð ñ ô ð õ)­Ð+TÑ)UÔ)UÑVÔVÐ Vð "Ð !ó‚AAÁ AÁAc óv— | |¬¦«}| ||||d¦«}| ||¦«}n#t$rYdSwxYwt jd||¦«t j|dd¬¦«}|jdkr{|j   dt|j¦«t|j ¦«t|j ¦«d d |j›�i¬ ¦«ttd ¦«¦«‚|j  d t|j ¦«¦«dS)z| Install plugin and sync advice plugin creation is part of main process -> to handle quota exceeded rÉÚfalseNz._filter_by_advice_type..‡óA€Ð rÐ rÐ r¨$À4Ç8Â8ÈHÐVXÑCYÔCY×C]ÒC]Ð^dÑCeÔCeÕiqÒCqÐCq ÐCqÐCqÐCqrJz-AccelerateWP advices are filtered, advices=%scóv—g|]6}| di¦« d¦«tk¯4|‘Œ7Srárârãs rKrÒz\SmartAdviceUtil._run_smart_advice_script.._filter_by_advice_type..ŒrärJz&IM360 advices are filtered, advices=%sz4Filtered advices for Smart Advice plugin, advices=%s)rrirŠr_rlrÚ)Ú advices_dataÚ filtered_datarms €rKÚ_filter_by_advice_typezHSmartAdviceUtil._run_smart_advice_script.._filter_by_advice_type€sÐø€Øð $Ø#Ð#à(ˆMÝDÑFÔFð fà rÐ r°-Ð rÑ rÔ r� Ø” × Ò Ð!PÕRUÐVcÑRdÔRdÑeÔeÐeàÔ#×KÒKÑMÔMð _à rÐ r°-Ð rÑ rÔ r� Ø” × Ò Ð!IÍ3È}ÑK]ÔK]Ñ^Ô^Ð^Ø ŒK× Ò ÐSÕUXÐYfÑUgÔUgÑ hÔ hÐ hØ Ð rJzÔ >Ð >؈EˆEˆEð øøøõ$ F™OœO¨AÔ.°Ñ8ÐåÐ+Ñ,Ô,ð ?Ø ŒK× Ò Ð[Ð]nÑ oÔ oÐ oÝ�QÐ<Ñ=Ô=Ñ>Ô>Ð >å'¨Ñ1Ô1ˆà ð `ð `ˆHØ�|Š|˜GÑ$Ô$¨Ò.Ð.Ø"*§,¢,¨|Ñ"<Ô"<�Ø�ð/ð ŒK× Ò ÐJÈFÕTWÐX`ÑTaÔTaÑ bÔ bÐ bÝ(­Ð+TÑ)UÔ)UÐX^Ñ)^Ñ_Ô_Ð _àð dØ ŒK× Ò ÐIÈ8Ñ TÔ TÐ TÝ(­Ð+XÑ)YÔ)YÐ\bÑ)bÑcÔcÐ cà �GÒ Ð ð WØ×+Ò+¨H°fÑ=Ô=Ð=Ð=øÝð Wð Wð WØ” ×%Ò%Ð&UÑVÔVÐVÐVÐVð Wøøøõ)¨Ð3DÑEÔEˆ àð TÝ(­Ð+QÑ)RÔ)RÑSÔSÐ Sõ +¨8°]ÑCÔCÐCð Ø Ø Ø Ø Ø Ø Ø ð  ˆðˆ s$ÁAÁ&BÂBÆ1GÇ$G/Ç.G/r£rÒcóÚ—t|¦«ttj¦«rd|g}| |¦«n(d d„|D¦«¦«}dd|ddd|g}|S) Nz/sbin/cagefs_enter_userú c3óXK—|]%}tjt|¦«¦«V—Œ&dSrD)ÚshlexÚquoter_)rÏÚas rKú z?SmartAdviceUtil._get_smart_advice_script_cmd..ás2èè€Ð"FÐ"F¸1¥5¤;­s°1©v¬vÑ#6Ô#6Ð"FÐ"FÐ"FÐ"FÐ"FÐ"FrJÚsudoz-uz-sz /bin/bashz-c)r@rr ÚCAGEFSrJr¹)r£rÒrõÚ command_strs rKrÐz,SmartAdviceUtil._get_smart_advice_script_cmdÙs}€å˜XÑ&Ô&Ð&Ý %¥g¤nÑ 5Ô 5ð QØ,¨hÐ7ˆCØ �JŠJ�uÑ Ô Ð Ð ðŸ(š(Ð"FÐ"FÀÐ"FÑ"FÔ"FÑFÔFˆKؘ4 ¨4°¸dÀKÐPˆC؈ rJcó¾—t¦«}|sttd¦«¦«‚tjdt ¦«t ||¦«dœ¦«S)z; Method with handles work with agreements. ú)This command can only be executed as userrw)rxr3r)r2r/r$rzr{r3r)rmr^Ú user_contexts rKÚget_agreement_textz"SmartAdviceUtil.get_agreement_textåsa€õ*Ñ+Ô+ˆ Øð YÝ(­Ð+VÑ)WÔ)WÑXÔXÐ XåŒzØ ­y©{¬{ÕD^Ð_fÐhtÑDuÔDuÐ vÐ vñ ô ð rJc ó(—t¦«}|sttd¦«¦«‚| |¦«\}}t jddt |¦«dddt |¦«d|jg dd¬ ¦«}|jd krƒ|j   d t |j¦«t |j ¦«t |j ¦«d d |j›�i¬¦«ttd¦«|j z¦«‚dS)z† Proxy method to AWP which creates subscription listening for the status of module and automatic advice appy. rzcloudlinux-awp-userz--userr]z--listenz --advice-idz --featureTr¯rzYCreate subscription smart advice plugin failed with exit code: %s, stdout: %s, stderr: %sr5z,smart-advice-plugin-subscription-returncode-r6z"cloudlinux-awp-user call failed %sN) r2r/r$r©rºr»r_r÷r¼rir8r¾r½)rmršrÚresprrxs rKÚcreate_subscriptionz#SmartAdviceUtil.create_subscriptionñs1€õ *Ñ+Ô+ˆ Øð YÝ(­Ð+VÑ)WÔ)WÑXÔXÐ Xà $× 8Ò 8¸Ñ CÔ Cшˆoå”à%ØÝ�LÑ!Ô!ØØØÝ�I‘”ØØÔ+ð ðØð ñ ô ˆð Ô  Ò !Ð !Ø ŒK× Ò ØkÝ�FÔ%Ñ&Ô&Ý�F”MÑ"Ô"Ý�F”MÑ"Ô"à!Ð#eÐRXÔRcÐ#eÐ#eðð ñ ô ð õ)­Ð+OÑ)PÔ)PÐSYÔS`Ñ)`ÑaÔaÐ að "Ð !rJ)F)FF)FFrNFN)FFrNF)NNNN)NTrD)r×)BrQrRrSÚ__doc__rpÚ staticmethodr_rjr€r„r†rrr—r™Úboolrœržr¤r0rraÚobjectr©r²r$r¼rÇrÖr1rïr×rrþr¨rrr-rrErÚr[rcrsrxrXr‚rˆr}rOrMr‹rŸr rKr«rËrÔrØrÝrLr rÏrÐrrrIrJrKrcrccs¿€€€€€Ø/Ð/ð0ð0ð0ðð˜#ð $ðððñ„\ððð 9˜cð 9ð 9ð 9ñ„\ð 9ðð4˜cð4 cð4ð4ð4ñ„\ð4ð # 3ð#¨8°C¬=ð#ð#ð#ð#ðJð2˜Cð2 Cð2ð2ð2ñ„\ð2ð =¨3ð=°4ð=ð=ð=ð=ð6 3ð6¨3ð6ð6ð6ð6ðððð#ðI¨SðI°U¸4À¸<Ô5HðIðIðIñ#Ô"ðIðð !ð !˜#ð ! Sð !°4ð !ÀDð !ð !ð !ñ„\ð !ð!" #ð!"Ð0Cð!"ÐH[ð!"ð!"ð!"ð!"ðF & cð &°vð &ÈDð &ÐUZÐ[^Ð`dÐ[dÔUeð &ð &ð &ð &ð58ð58¨Sð58ð58ð58ð58ðnð*¨Sð*ð*ð*ñÔð*ð".ð.ð.ð.ð` ð ð ð #ð #ð #ð0¨ð0°ð0ð0ð0ð0ð@$Ø Ø%ØØ"Ø"ðððððð ð ð ð ð ððððððð �#Œððððð@$Ø Ø%ØØ"ðOðOàðOððOðð Oð ð Oð ð OððOððOð �#ŒðOðOðOðOðb * ð *ð *ð *ð *ð# ¨cð# °cð# ð# ð# ð# ðJ:Ið:Ið:Iðx;ð;ð;ð2ðððàlpð 7ð 7ð 7ñÔð 7ðð< ð< ñÔð< ð|ð,ð,ñÔð,ð>ð,ð,ñÔð,ð>6ð6ð6ð6ð4;ð;ð;ð04ð4ð4ð4ðlð7°$ð7ð7ð7ñ„\ð7ð & Tð &ð &ð &ð &ðð ð ñ„\ð ðððñ„\ðð ¨d°3¸°8¬nð ð ð ð ð>ððñ„\ððCðCðCðJWðWðWð4iðiðið6HðHðHðPðPðPðPð8RYð=ð=Ø)-¨c¬ð=ØBEð=à ˆcŒð=ð=ð=ð=ð~ð ¨sð ¸4À¼9ð ÈÈcÌð ð ð ñ„\ð ð  ð  ð  ð%bð%bð%bð%bð%brJrc)errzrgrEr™r¶rùrºÚ contextlibrÚ dataclassesrrÚtypingrrrr r Úenumr Ú!xray.internal.clwpos_safe_importsr r rrrrrrrrrrÚclcommon.cpapirrrrrrÚclcommon.clwpos_librÚclcommon.clpwdrÚclcommon.constr Úxrayr!r$Ú advice_typesr#r¼r$Ú apiclientr&r'Úinternal.constantsr(r)r*r+Úinternal.user_limitsr,r-Úinternal.exceptionsr.r/Úinternal.user_plugin_utilsr0r1r2Úinternal.utilsr3r4r5r6Úanalytics.utilsr7Úxray.adviser.clwpos_getr8Ú xray.smart_advice_plugin_helpersr9r:Ú xray.smart_advice_plugin_managerr;r<Úxray.analyticsr=Úxray.imunify_managerr>r?Úxray.internal.utilsr@rNrHr rLrNrWrcrIrJrKúr#s2ðððð € € € Ø€€€Ø € € € Ø€€€Ø € € € Ø € € € ØÐÐÐØ%Ð%Ð%Ð%Ð%Ð%Ø)Ð)Ð)Ð)Ð)Ð)Ð)Ð)Ø3Ð3Ð3Ð3Ð3Ð3Ð3Ð3Ð3Ð3Ð3Ð3Ð3Ð3ØÐÐÐÐÐàBÐBÐBÐBÐBÐBð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ððððððððððððððððð+Ð*Ð*Ð*Ð*Ð*Ø*Ð*Ð*Ð*Ð*Ð*Ø"Ð"Ð"Ð"Ð"Ð"ØÐÐÐÐÐØ-Ð-Ð-Ð-Ð-Ð-Ø)Ð)Ð)Ð)Ð)Ð)Ø.Ð.Ð.Ð.Ð.Ð.Ð.Ð.ððððððððððððð AÐ@Ð@Ð@Ð@Ð@Ð@Ð@ØCÐCÐCÐCÐCÐCÐCÐCØqÐqÐqÐqÐqÐqÐqÐqÐqÐqØQÐQÐQÐQÐQÐQÐQÐQÐQÐQÐQÐQØ:Ð:Ð:Ð:Ð:Ð:Ø0Ð0Ð0Ð0Ð0Ð0ØaÐaÐaÐaÐaÐaÐaÐaØ\Ð\Ð\Ð\Ð\Ð\Ð\Ð\Ø+Ð+Ð+Ð+Ð+Ð+Ø9Ð9Ð9Ð9Ð9Ð9Ð9Ð9Ø4Ð4Ð4Ð4Ð4Ð4àÐðeÐð6�dð6ð6ð6ð6ððððð�Dñôðð  ðððððñôñ „ððsbðsbðsbðsbðsbñsbôsbðsbðsbðsbrJ