§ ;Š»jQŠãó—ddlZddlZddlmcmZddlZddlZddlm Z ddl m Z m Z m Z ddlmZddlmZddlmZmZGd„d¦«ZGd „d e¦«ZGd „d e¦«ZGd „de¦«Zd„ZGd„d¦«ZdS)éN)Ú ExpatError)ÚTupleÚOptionalÚDict)ÚVersion)ÚFormattedException)Ú run_commandÚExternalProgramFailedcó—eZdZdZdZdZdS)ÚGovernorStatusÚenabledÚerrorÚdisabledN)Ú__name__Ú __module__Ú __qualname__ÚENABLEDÚERRORÚDISABLED©óúŸ/builddir/build/BUILDROOT/alt-python27-cllib-3.4.44-1.el8.cloudlinux.x86_64/opt/cloudlinux/venv/lib/python3.11/site-packages/clcommon/lib/mysql_governor_lib.pyr r s€€€€€Ø€GØ €EØ€H€H€Hrr có—eZdZdS)ÚMySQLGovExceptionN)rrrrrrrrs€€€€€Ø€Drrcó"‡—eZdZdZˆfd„ZˆxZS)ÚMySQLGovernorDisabledz< Exception raised when dbgovernor daemon is offline cóV•—t¦« ddddœdœ¦«dS)NzR%(util)s is disabled in the system. Please, run "%(command)s" to start the servicezMySQL governorzservice db_governor restart)ÚutilÚcommand©ÚmessageÚcontext©ÚsuperÚ__init__©ÚselfÚ __class__s €rr%zMySQLGovernorDisabled.__init__&sKø€Ý ‰Œ×ÒðCð)Ø8ððð  ð ñ ô ð ð ð r©rrrÚ__doc__r%Ú __classcell__©r(s@rrr"sBø€€€€€ððð  ð  ð  ð  ð  ð  ð  ð  ð  rrcó"‡—eZdZdZˆfd„ZˆxZS)ÚMySQLGovernorAbsentz: Exception raised when dbgovernor isn't installed cóT•—t¦« dddidœ¦«dS)Nz%(util)s not present in systemrÚGovernorr r#r&s €rr%zMySQLGovernorAbsent.__init__6s>ø€Ý ‰Œ×ÒØ7Ø  Ð+ð ð ñ ô ð ð ð rr)r,s@rr.r.2sBø€€€€€ððð ð ð ð ð ð ð ð ð rr.có—dd|idœS)NzInvalid %(param)s parameterÚparamr r)r2s rÚ_get_exc_messager3=s€à0ؘUÐ#ð ð ðrc óz—eZdZdZdZdZdZdZdZdZ dZ d Z d Z e jd ¦«Zd „Zd „Zd„Zd>d„Zd„Zd„Zd„Zed„¦«Zd„Zd„Zd„Zed„¦«Zed„¦«Zd„Zd„Zd>de de!e"e"ffd„Z#d„Z$d „Z%d!„Z&d"„Z'd?d$„Z(d%e)e*de+fd&„Z,d'e-d(e-d)e-de!e"e"ffd*„Z.d@d%e)e*de)e/fd+„Z0d,e*d-e-fd.„Z1d%e*d/e)e"d0e)e"fd1„Z2d%e*d/e)e"d0e)e"fd2„Z3 d?d%e*d/e)e"d0e)e"fd3„Z4d4„Z5d5„Z6d6„Z7ed7e*d8e*fd9„¦«Z8d>d:„Z9d;e dØ�s 1™vœvð@ñ.ô.ðððððððøøøøð øøøõ Ô&¨Ð,Ð,s-–8¸ BÁ AÁBÁ BÁ")B BÂBcóÄ—| ¦«} t|dd¬¦«5}tj| ¦«¦«cddd¦«S#1swxYwYdS#t t f$r/}d|_td|t|¦«dœdœ¦«|‚d}~wt$r/}d|_td|t|¦«dœdœ¦«|‚d}~wwxYw) NÚrzutf-8)ÚencodingTzNAn error occured while loading governor config from %(path)s. Error: %(error)s)r=rr zNAn error occured while parsing governor config from %(path)s. Error: %(error)s) Ú_get_config_pathÚopenÚxmlÚ parseStringÚreadÚIOErrorÚOSErrorr;rrbr)r'Ú config_pathÚfrcs rrLzMySQLGovernor._get_xml_config¢sc€à×+Ò+Ñ-Ô-ˆ ð Ý�k 3°Ð9Ñ9Ô9ð 1¸QÝ” q§v¢v¡x¤xÑ0Ô0ð 1ð 1ð 1ð 1ñ 1ô 1ð 1ð 1ð 1ð 1ð 1ð 1øøøð 1ð 1ð 1ð 1ð 1ð 1øå�Ð!ð ð ð Ø&*ˆDÔ #Ý#ðEà%0½3¸q¹6¼6ÐBÐBðDðDñôðð  øøøøõ ð ð ð Ø&*ˆDÔ #Ý#ðEà%0½3¸q¹6¼6ÐBÐBðDðDñôðð  øøøøð øøøsF–A(¨&AÁ A(ÁAÁA(Á"AÁ#A(Á(CÁ9*B#Â# CÂ0*CÃCcóv—g} | d¦«d}n'#t$r}tdddidœ¦«|‚d}~wwxYw| d¦«}|D]Z}| d¦«}|d kr=| d ¦«r(| | d ¦«¦«Œ[|S) z† Loads information about igrored users :type governor_cfg: xml.Document :return: list of ignore users ÚgovernorrzFMalformed mysql-governor config. Unable to find element '%(element)s'.Úelementr NÚuserÚmodeÚignoreÚname)rMrOrrNÚappend)rPÚignore_users_listÚgov_datarcÚusers_data_listÚ user_dataÚ user_modes rÚ_load_ignore_users_from_xmlz)MySQLGovernor._load_ignore_users_from_xml·sý€ðÐð Ø#×8Ò8¸ÑDÔDÀQÔGˆHˆHøÝð ð ð Ý#ðEà% zÐ2ð%ð%ñôðð  øøøøð øøøð #×7Ò7¸Ñ?Ô?ˆØ(ð Mð MˆIØ!×.Ò.¨vÑ6Ô6ˆIؘHÒ$Ð$ð×)Ò)¨&Ñ1Ô1ðMØ%×,Ò,¨Y×-CÒ-CÀFÑ-KÔ-KÑLÔLÐLøØ Ð s„   Aª?¿Acó—| d¦«r|dz}d}n |}|dkrd}d}|| t|dz¦«|j¦«z}|| t|dz¦«|j¦«z}||fS)zµ Calculate db R/W IO limits based on governor version :param io: requested limits in MB/s :return: string values suitable to pass to "dbctl set ..." z1.2-17iz%sb,%sb,%sb,%sbééz %s,%s,%s,%s)Ú_is_governor_newer_thenÚ _percentageÚintÚ IO_PERCENTS)r'ÚioÚ io_limitsÚ limits_tmplrkÚwrites rÚ_calc_rw_io_limitsz MySQLGovernor._calc_rw_io_limitsÑs´€ð × 'Ò '¨Ñ 1Ô 1ð (ؘW™ ˆIØ+ˆKˆKàˆIؘAŠ~ˆ~ð� Ø'ˆKà˜T×-Ò-­c°)¸q±.Ñ.AÔ.AØ.2Ô.>ñ@ô@ñ@ˆà˜d×.Ò.­s°9À±>Ñ/BÔ/BØ/3Ô/?ñAôAñAˆà�Uˆ{Ðrcó—| ¦«sdS tj|jdgd¬¦«}| ¦« d¦«d}|S#tjtf$rYdSwxYw)Nz --versionT)Útextú r€)r`Ú subprocessÚ check_outputÚ_GOVERNOR_BINARY_PATHÚstripÚsplitÚCalledProcessErrorrm)r'ÚresÚversions rrCz"MySQLGovernor.get_governor_versionês�€Ø×'Ò'Ñ)Ô)ð Ø�4ð ÝÔ)¨4Ô+EÀ{Ð*SÐZ^Ð_Ñ_Ô_ˆCð—i’i‘k”k×'Ò'¨Ñ,Ô,¨QÔ/ˆG؈NøÝÔ-­wÐ7ð ð ð Ø�4�4ð øøøs˜A A$Á$A>Á=A>cóX—|j}|sdSt|¦«t|¦«kSr8)rDr)r'r”Úcurrents rr�z%MySQLGovernor._is_governor_newer_thenös2€ØÔ(ˆØð Ø�5Ý�wÑÔ¥'¨'Ñ"2Ô"2Ò2Ð2rcó>—d„| ¦«D¦«S)aÒ Convert data line from dbctl to list :param line: Data line could be like: "default 400/380/350/300 953/791/724/562 953/791/724/562" or: "default 400/380/350/300 1000/830/760/590 1000/830/760/590" depending on --kb/mb/bb option passed to dbctl :return: list: ['default', '400/380/350/300', '953/791/724/562', '953/791/724/562'] có—g|]}|¯|‘ŒSrr)Ú.0Úparts rú z-MySQLGovernor._parse_line..s€Ð6Ð6Ð6˜°Ð6�Ð6Ð6Ð6r©r‘)Úlines rÚ _parse_linezMySQLGovernor._parse_lineüs €ð7Ð6 §¢¡¤Ð6Ñ6Ô6Ð6rcóz—|g}|D]'}| t||z¦«¦«Œ(t|¦«S)zX Calculate full list of governor limits by one value and percents koeff )rwrƒÚtuple)ÚvalueÚpercentsr“Úks rr‚zMySQLGovernor._percentage sE€ð ˆgˆØð %ð %ˆAØ �JŠJ•s˜5 ™7‘|”|Ñ $Ô $Ð $Ð $Ý�S‰zŒzÐrcó—|jS)z= Get governor presence flag :return: )r@rEs rr`z!MySQLGovernor.is_governor_presents €ð Ô(Ð(rcóD—| ¦«||jvrdSdS)zµ Get MySQL governor status for supplied user :param username: Username for get status :return: Governor status: "watched"/"ignored" or None if error ÚignoredÚwatched)rar9©r'Úusernames rÚget_governor_status_by_usernamez-MySQLGovernor.get_governor_status_by_usernames,€ð �ŠÑÔÐØ �tÔ3Ð 3Ð 3Ø�9؈yrÚwith_package_markÚreturncó —| ¦«||jvr|j|\}}}}n|jd\}}}}|r||f}n||f}|S)a Get MySQL governor limits for supplied user :param username: Username for read limits :param with_package_mark: False - without package limits difference mark (for compatibility with non-package governor, used in cloudlinux-top/cloudlinux-statistics), True - with package limits difference mark :return: Tuple (CPU limit, IO limit). Examples: (150, 3072) - with_package_mark == False ('*150', '3072') - with_package_mark == True ('*150', '*4096') - with_package_mark == True * - user has individual limits, differ from package limit MySQLGovException will be thrown if governor not present or error Údefault)rar:)r'r©r«Úuser_cpu_limitÚuser_io_limit_kbÚuser_cpu_limit_markedÚuser_io_limit_markedÚlimits_for_returns rÚget_limits_by_userz MySQLGovernor.get_limits_by_user's‰€ð �ŠÑÔÐØ �tÔ,Ð ,Ð ,àÔ% hÔ/ñ ZˆNÐ,Ð.CÐEYÐEYðÔ% iÔ0ñ ZˆNÐ,Ð.CÐEYà ð CØ!6Ð8LÐ MÐ Ð à!/Ð1AÐ BÐ Ø Ð rcóª—| ¦«|rdnd}| ||g¦«\}}}|s|rd||p|dœdœ}t|¦«‚dS)zé Set MySQLGovernor status for single user :param: `str` username: Username for set status :param: `bool` status: True for "monitor", False for "ignore" :return: `bool`: operation status result Úmonitorruz.Set governor status error(%(ret)s): %(output)s©ÚretrTr r©rar[r©r'r©ÚstatusÚ status_cmdr¸rYrZÚ exc_messages rÚset_governor_status_for_userz*MySQLGovernor.set_governor_status_for_userDs„€ð �ŠÑÔÐØ"(Ð6�Y�Y¨hˆ Ø $× 9Ò 9¸:ÀxÐ:PÑ QÔ QшˆW�gØ ð 1�cð 1Ø&VØ.1¸WÐ=OÈÐ&PÐ&PðRðRˆKå# KÑ0Ô0Ð 0؈qrcó¶—| ¦«|rdnd}|dvrd}| ||g¦«\}}}|s|rd||p|dœdœ}t|¦«‚dS) zû Set user restricted with dbctl utility :param: `str` username: Username for set restricted status :param: `bool` status: True for "restricted", False for "unrestricted" :return: `bool`: operation status result ÚrestrictÚ unrestrict©ÚrootÚadminr®z,Set user restrict error(%(ret)s): %(output)sr·r rr¹rºs rÚset_restricted_status_for_userz,MySQLGovernor.set_restricted_status_for_userTs•€ð �ŠÑÔÐØ#)Ð;�Z�Z¨|ˆ Ø Ð(Ð (Ð (Ø ˆHØ $× 9Ò 9¸:ÀxÐ:PÑ QÔ QшˆW�gØ ð 1�cð 1Ø&TØ.1¸WÐ=OÈÐ&PÐ&PðRðRˆKå# KÑ0Ô0Ð 0؈qrcóœ—| ¦«| dg¦«\}}}|s|rd||p|dœdœ}t|¦«‚dS)zi Set user restricted with dbctl utility :return: `bool`: operation status result zunrestrict-allú:Set all users unrestrict status error(%(ret)s): %(output)sr·r rr¹)r'r¸rYrZr½s rÚ%set_unrestricted_status_for_all_usersz3MySQLGovernor.set_unrestricted_status_for_all_usersfsu€ð �ŠÑÔÐØ $× 9Ò 9Ð;KÐ:LÑ MÔ MшˆW�gØ ð 1�cð 1Ø&bØ.1¸WÐ=OÈÐ&PÐ&PðRðRˆKå# KÑ0Ô0Ð 0؈qrcóP—| ¦«|dvrd}||jvrdSdS)z· Get MySQL governor status for supplied user :param username: Username for get status :return: Governor restricted status: "restricted"/"unrestricted" rÂr®Ú restrictedÚ unrestricted)raÚ_governor_restricted_usersr¨s rÚget_restrict_status_by_usernamez-MySQLGovernor.get_restrict_status_by_usernamess=€ð �ŠÑÔÐØ Ð(Ð (Ð (Ø ˆHØ �tÔ6Ð 6Ð 6Ø�<؈~rNc ó0—|€|€dS| ¦«d|g}|�‹t|t¦«rBd t t | ||j¦«¦«¦«}nttd¦«¦«‚|  d|›�¦«|�zt|t¦«r|  |¦«\}}nttd¦«¦«‚|  d|›�¦«|  d |›�¦« |  |¦«\}}} n/#t$r"} tt | ¦«¦«| ‚d} ~ wwxYw| s|rd || p|d œd œ} t| ¦«‚d|_dS) aÀ Set MySQLGovernor limits for user :param: username `str`: username for set limits :param: `int`|`list` cpu: governor cpu limit. when it param int - calculate by percentage other params :param: `int`|`list` io: io value means that read and write limits similar :param: `int`|`list` read: read limit :param: `int`|`list` write: write limit :return: 0 NrÚsetú,Úcpuú--cpu=r…ú--read=ú--write=rÇr·r )raÚ isinstancerƒÚjoinÚmaprbr‚Ú CPU_PERCENTSrr3rwr‰r[r r:) r'r©rÑr…Úcmdrkrˆr¸rYrZrcr½s rÚset_limits_for_userz!MySQLGovernor.set_limits_for_user�sÈ€ð ˆ;˜2˜:Ø�1à �ŠÑÔÐà�hÐˆØ ˆ?ݘ#�sÑ#Ô#ð AØ—h’h�s¥3¨×(8Ò(8¸¸dÔ>OÑ(PÔ(PÑQÔQÑRÔR��å'Õ(8¸Ñ(?Ô(?Ñ@Ô@Ð@ð �JŠJ�~ �~�~Ñ &Ô &Ð &à ˆ>õ˜"�cÑ"Ô"ð @Ø"×5Ò5°bÑ9Ô9‘ ��e�eå'Õ(8¸Ñ(>Ô(>Ñ?Ô?Ð?ð �JŠJÐ' Ð'Ð'Ñ (Ô (Ð (Ø �JŠJÐ) %Ð)Ð)Ñ *Ô *Ð *ð 3Ø$(×$=Ò$=¸cÑ$BÔ$BÑ !ˆC�˜'˜'øÝ$ð 3ð 3ð 3Ý#¥C¨¡F¤FÑ+Ô+°Ð 2øøøøð 3øøøà ð 1�cð 1Ø&bØ.1¸WÐ=OÈÐ&PÐ&PðRðRˆKå# KÑ0Ô0Ð 0à $ˆÔ؈qsÄ)EÅ E/Å E*Å*E/Ú package_namecó¾—|r4|jdd| ¦« d¦«›�dg}n |jdddg}t|d¬¦«\}}}|dks|r(t d d  |¦«|d œd œ¦«‚ t j|¦«}n@#t jf$r-}t d |jt|¦«dœd œ¦«|‚d}~wwxYw|S)úÿ Retrieve MySQL Governor package limits :param package_name: Package name. If None, get all packages name :return: Dict with limits. Example: {'pack1': {'cpu': 100, 'io': 900}, 'pack2': {'cpu': 100, 'io': 900}} Úgetz --package=zunicode-escapez --format=kbz--allTrRrz''%(cmd)s' failed, stderr is: %(stderr)srŒ©rÙÚstderrr z,%(util)s output invalid, error is: %(error)s)rrN) Ú_PACKAGE_UTILITY_PATHÚencodeÚdecoder rrÖÚjsonÚloadsÚJSONDecodeErrorrb)r'rÛÚcmd_listrXrYrZÚpackage_data_from_utilrcs rÚ$_get_package_raw_limits_from_utilityz2MySQLGovernor._get_package_raw_limits_from_utilityÅs3€ð ð SØÔ2°EØU \×%8Ò%8Ñ%:Ô%:×%AÒ%AÐBRÑ%SÔ%SÐUÐUØ%ð'ˆHˆHðÔ2°E¸7ÀMÐRˆHÝ%0°ÈdÐ%SÑ%SÔ%SÑ"ˆ�'˜7Ø �qŠ=ˆ=˜Gˆ=Ý#ØDØ#&§8¢8¨HÑ#5Ô#5ÀÐIÐIð%ð%ñôð ð Ý%)¤Z°Ñ%8Ô%8Ð "Ð "øÝÔ$Ð'ð ð ð Ý#ØIØ$(Ô$>ÍÈQÉÌÐPÐPð%ð%ñôðð øøøøð øøøð &Ð%sÂBÂCÂ-(CÃCÚcpu_limits_listÚread_limits_listÚwrite_limits_listcó¤—t|d¦«| t|d¦«t|d¦«¦«fS)a Calculate package limits from raw governor limits :param cpu_limits_list: CPU limits list :param read_limits_list: Read limits list :param write_limits_list: Write limits list :return: Tuple: (cpu_limit, io_limit) r)rƒÚ_get_user_io_limitrb)r'rêrërìs rÚ_calc_package_limits_from_rawz+MySQLGovernor._calc_package_limits_from_rawásK€õ�? 1Ô%Ñ&Ô&¨×(?Ò(?ÅÐDTÐUVÔDWÑ@XÔ@XÕZ]Ð^oÐpqÔ^rÑZsÔZsÑ(tÔ(tÐtÐtrcóò— | |¦«}n#t$r‚wxYwi}| ¦«D]9\}}| |d|d|d¦«\}}||dœ||<Œ:|S)rÝrÑrkrˆ)rÑr…)rérÚitemsrï)r'rÛrèÚ packages_dataÚ pack_nameÚ pack_limitsÚ cpu_limitÚio_limits rÚget_package_limitsz MySQLGovernor.get_package_limitsìs¶€ð Ø%)×%NÒ%NÈ|Ñ%\Ô%\Ð "Ð "øÝ ð ð ð Ø ð øøøðˆ Ø&<×&BÒ&BÑ&DÔ&Dð Jð JÑ "ˆI�{Ø"&×"DÒ"DÀ[ÐQVÔEWÐYdÐekÔYlØEPÐQXÔEYñ#[ô#[Ñ ˆI�xà/8ÀÐ'IÐ'IˆM˜)Ñ $Ð $ØÐs‚˜ $r©Ú limit_namescóÜ—d |¦«}|jdd|›�d|›�g}t|d¬¦«\}}}|dks|r(tdd  |¦«|d œd œ¦«‚d S) z˜ Reset users limits to default :param username: User name ro reset limits :param limit_names: Limit names list to reset rÐÚreset_individualz--user=z --limits=TrRrz*'%(cmd)s' is failed, stderr is: %(stderr)srŒrßr N)rÖrár r)r'r©røÚ limits_stringrçrXÚ_rZs rÚreset_user_limits_to_defaultsz+MySQLGovernor.reset_user_limits_to_defaultsÿsž€ðŸš Ñ-Ô-ˆ ØÔ.Ð0BÐDXÈhÐDXÐDXØ/  Ð/Ð/ð1ˆå*¨8ÈÐMÑMÔMш�!�Wà �qŠ=ˆ=˜Gˆ=Ý#ØGØ#&§8¢8¨HÑ#5Ô#5ÀÐIÐIð%ð%ñôð ð ˆ=rrõröcó—ddlm}m}|j |¦«sdSt j |j|¦«}t j  t j  |¦«¦«|jkrdS ||¦«}n#ttf$rYdSwxYwt|¦«dkrdSg}d} |D�]£} |  d¦«r¯|�­|  ¦« d¦«} t| ¦«dkrŒU|dkr|j} nt%|¦«} | d ¦«} | | kr| d | ›d �¦«d } Œ®| | ›d �¦«ŒÇ|  d ¦«r²|�°|dkr|j}nt%|¦«}|  ¦« d¦«} t| ¦«dkr�Œ7| d ¦«}||kr| d |›d �¦«d } �Œt| | ›d �¦«�ŒŽ| | ¦«�Œ¥| r|||d¦«dSdS)zþ Set MySQL Governor to cPanel package file. If limits not changed, package file will not be written :param package_name: Package name :param cpu_limit: MySQL CPU limit to set :param io_limit: MySQL IO limit to set r)Úget_file_linesÚwrite_file_linesNFÚ lve_mysql_cpuú=r€rzlve_mysql_cpu=ú TÚ lve_mysql_ioz lve_mysql_io=Úw)Úclcommon.utilsrÿrÚ_PACKAGE_NAME_REÚmatchr<r=rÖÚ_CPANEL_PACKAGES_DIRÚdirnameÚrealpathrmrlÚlenÚ startswithr�r‘Ú _S_DEFAULTrbrw)r'rÛrõrörÿrÚ package_pathÚcpanel_package_linesÚlines_to_writeÚis_change_mader�ÚpartsÚ s_cpu_limitÚs_old_cpu_limitÚ s_io_limitr¡s rÚ&_set_governor_limits_to_cpanel_packagez4MySQLGovernor._set_governor_limits_to_cpanel_packages΀ð DÐCÐCÐCÐCÐCÐCÐCðÔ$×*Ò*¨<Ñ8Ô8ð Ø ˆFÝ”w—|’| DÔ$=¸|ÑLÔLˆ Ý Œ7�?Š?�2œ7×+Ò+¨LÑ9Ô9Ñ :Ô :¸dÔ>WÒ WÐ WØ ˆFð Ø#1 >°,Ñ#?Ô#?Ð Ð øÝ�Ð#ð ð ð Ø ˆFˆFð øøøå Ð#Ñ $Ô $¨Ò )Ð )Ø ˆF؈؈ð)ð ,ñ ,ˆDØ�Š˜Ñ/Ô/ð ,°IÐ4IØŸ š ™ œ ×*Ò*¨3Ñ/Ô/�Ý�u‘:”: ’?�?ØØ ’>�>Ø"&¤/�K�Kå"% i¡.¤.�KØ"'¨¤(§.¢.Ñ"2Ô"2�Ø" kÒ1Ð1Ø"×)Ò)Ð*J¸;Ð*JÐ*JÐ*JÑKÔKÐKØ%)�N�Nð#×)Ò)¨T¨+¨+¨+Ñ6Ô6Ð6Ð6Ø—’ Ñ0Ô0ð ,°XÐ5Iؘq’=�=Ø!%¤�J�Jå!$ X¡¤�JØŸ š ™ œ ×*Ò*¨3Ñ/Ô/�Ý�u‘:”: ’?�?ÙØ˜aœŸšÑ(Ô(�ؘJÒ&Ð&Ø"×)Ò)Ð*H¸*Ð*HÐ*HÐ*HÑIÔIÐIØ%)�N‘Nð#×)Ò)¨T¨+¨+¨+Ñ6Ô6Ð6Ñ6à×%Ò% dÑ+Ô+Ð+Ñ+Ø ð @Ø Ð ˜\¨>¸3Ñ ?Ô ?Ð ?Ð ?Ð ?ð @ð @s BÂB3Â2B3có`—ddlm}|¦«dkrdS| |||¦«dS)a& Apply all MySQL Governor packages limits to cpanel package file. In not cPanel, do nothing :param package_name: Package name to update :param cpu_limit: MySQL CPU limit to set, None - not change :param io_limit: MySQL IO limit to set, None - not change r)Ú getCPNameÚcPanelN)Úclcommon.cpapirr)r'rÛrõrörs rÚ_apply_package_limits_to_cpanelz-MySQLGovernor._apply_package_limits_to_cpanelVsJ€ð -Ð,Ð,Ð,Ð,Ð,Ø ˆ9‰;Œ;˜(Ò "Ð "Ø ˆFØ ×3Ò3°LÀ)ÈXÑVÔVÐVÐVÐVrc ó&—|�|€|€td|›d|›d|›d�¦«‚|jdd|g}|�‹t|t¦«rBd t t | ||j¦«¦«¦«}nttd ¦«¦«‚|  d |›�¦«|�zt|t¦«r|  |¦«\}}nttd ¦«¦«‚|  d |›�¦«|  d |›�¦«t|d¬¦«\}} } |dks| r)tdd |¦«| | dœdœ¦«‚|  |||¦«dS)zÄ Set limits for Governor package :param package_name: Package name for set :param cpu_limit: MySQL CPU limit to set :param io_limit: MySQL CPU limit to set Nz‹MySQLGovernor.set_package_limits arguments error: Package name and at least one limit should be provided. Current arguments: package name: z; cpu limit is z; IO limit is ú;rÏz --packagerÐrõrÒrörÓrÔTrRrzI'%(command)s' is failed, stdout is: '%(stdout)s', stderr is: '%(stderr)s'rŒ)rÚstdoutràr )rrárÕrƒrÖr×rbr‚rØr3rwr‰r r) r'rÛrõrörçrÑrkrˆrXrYrZs rÚset_package_limitsz MySQLGovernor.set_package_limitsbsñ€ð Ð  9Ð#4¸Ð9IÝ#ð%Yà\hð%Yð%Yð5>ð%Yð%YðNVð%Yð%Yð%YñZôZð Zð Ô.°°{ÀLÐQˆà Рݘ)¥SÑ)Ô)ð GØ—h’h�s¥3¨×(8Ò(8¸ÀDÔDUÑ(VÔ(VÑWÔWÑXÔX��å'Õ(8¸Ñ(EÔ(EÑFÔFÐFØ �OŠO˜N S˜N˜NÑ +Ô +Ð +à Рݘ(¥CÑ(Ô(ð FØ"×5Ò5°hÑ?Ô?‘ ��e�eå'Õ(8¸Ñ(DÔ(DÑEÔEÐEØ �OŠOÐ, dÐ,Ð,Ñ -Ô -Ð -Ø �OŠOÐ. uÐ.Ð.Ñ /Ô /Ð /Ý%0°ÈdÐ%SÑ%SÔ%SÑ"ˆ�'˜7Ø �qŠ=ˆ=˜Gˆ=Ý#ØfØ'*§x¢x°Ñ'9Ô'9ÀWÐX_Ð`Ð`ð%ð%ñôð ð ×,Ò,¨\¸9ÀhÑOÔOÐOÐOÐOrcóf—tj |j¦«r|jS|jS)zN Get config path for mysql-governor; :rtype: str|None )r<r=r>Ú_CONTAINER_PATH_V2Ú_CONTAINER_PATHrEs rrgzMySQLGovernor._get_config_pathŒs/€õ Œ7�>Š>˜$Ô1Ñ 2Ô 2ð +ØÔ*Ð *ØÔ#Ð#rcóž— | ¦«}| |¦«|_dS#t$rd|_d|_‚wxYw)z*Load ignore users list from container fileN)rLr}r9rr:)r'Ú governor_xmls rÚ_read_ignore_usersz MySQLGovernor._read_ignore_users•se€ð Ø×/Ò/Ñ1Ô1ˆLà×0Ò0°Ñ>Ô>ð Ô (Ð (Ð (øå ð ð ð Ø$(ˆDÔ !Ø+/ˆDÔ (Ø ð øøøs ‚.2²A có\—|j� |j�dS|jsd|_t ¦«‚dd|jidœ}| ¦«| ¦«\}}| dgd¬¦«\}}}d„|  ¦«  d ¦«d d…D¦«|_ |  d ¦«}|  |||¦«|_d |jvr4d|_d|_d|_d d |j›d�dœdœ}t|¦«‚dS)zL Loads users info from MySQL governor :return: None NTz%(utility)s output is invalidÚutilityr zlist-restricted©rWcóB—g|]}| ¦«d‘ŒS)rrœ)r™r�s rr›z,MySQLGovernor._load_info..¸s1€ð+ ð+ ð+ Ø $ˆD�JŠJ‰LŒL˜ŒOð+ ð+ ð+ rrrr®z'There is no %(what)s found in %(where)szdefault settingsz output)ÚwhatÚwhere)r9r:r@r;r.r?r&Ú_run_dbctl_listr[r�r‘rÌÚ_parse_dbctl_data_linesr)r'Úutility_exc_messageÚis_kb_limits_okÚ gov_data_strrüÚgov_restricted_strÚgov_data_linesr½s rrazMySQLGovernor._load_info s‚€ð Ô 'Ð 3¸Ô8MÐ8YØ ˆFðÔ(ð (Ø&*ˆDÔ #Ý%Ñ'Ô'Ð 'à*IØ+4°dÔ6HÐ*IðKðKÐð ×ÒÑ!Ô!Ð!ð)-×(<Ò(<Ñ(>Ô(>Ñ%ˆ˜à × %Ò %Ð'8Ð&9È4Ð %Ñ PÔ Pñ !ˆÐ ˜qð+ ð+ Ø(:×(@Ò(@Ñ(BÔ(B×(HÒ(HÈÑ(NÔ(NÈqÈrÈrÔ(Rð+ ñ+ ô+ ˆÔ'ð&×+Ò+¨DÑ1Ô1ˆØ $× <Ò <¸^È_Ð^qÑ rÔ rˆÔà ˜DÔ1Ð 1Ð 1Ø&*ˆDÔ #Ø$(ˆDÔ !Ø+/ˆDÔ (àDØ$6ÀDÔDVÐA_ÐA_ÐA_Ð`Ð`ððˆKõ$ KÑ0Ô0Ð 0ð 2Ð 1rÚ read_limitÚ write_limitcóØ— t|¦«t|¦«z}nH#t$r;||cxkrdkrnnd}n%|dkrt|¦«}nt|¦«}YnwxYw|S)zå Calculates the io limit. Handles the situation when user's write or read io limit is less than 1mb/s (PTCLLIB-85). :type write_limit: str :type read_limit: str :rtype: int z<1r)rƒÚ ValueError)r4r5Ú user_io_limits rrîz MySQLGovernor._get_user_io_limitÉs”€ð 1Ý  ™OœO­c°+Ñ.>Ô.>Ñ>ˆMˆMøÝð 1ð 1ð 1ؘ[Ð0Ð0Ò0Ð0¨DÒ0Ð0Ð0Ð0Ð0Ø !� � Ø Ò$Ð$Ý # J¡¤� � å # KÑ 0Ô 0� øøð  1øøøðÐs‚"¢AA'Á&A'có�—| ddgd¬¦«\}}}d}|sd|vr| dgd¬¦«\}}}d}||fS)aW Executes dbctl list-marked --kb or dbctl list-marked :param _is_incorrect_syntax: True is emulate dbctl error. Only for testing! :return: Cortege (is_kb_limits_ok, stdout_str), where is_kb_limits_ok == True, if dbctl returned limits in KB, else - False stdout_str - dbctl stdout string z list-markedz--kbTr)zIncorrect syntaxrUF)r[)r'Ú_is_incorrect_syntaxrXr1rür0s rr-zMySQLGovernor._run_dbctl_listÝs�€ð%)×$=Ò$=Ø ˜FÐ #°Tð%>ñ%;ô%;Ñ!ˆ�, ðˆØ ð $Ð#5¸Ð#EÐ#Eà!%×!:Ò!:Ø�¨$ð";ñ"0ô"0Ñ ˆAˆ|˜Qà#ˆOØ  Ð,Ð,rr0r/có²—i}|D�]Ð}| ¦«}|rd|vrŒt |¦«}t|¦«dkst|d¦«dkr$d|_d|_d|_t|¦«‚|d d¦«}|d d¦«}|d  d¦«} t|¦«dks&t|¦«dkst| ¦«dkr$d|_d|_d|_t|¦«‚|d } t|d ¦«} |  |d | d ¦«} |r| n| d z} |d}|d d kr d |d ›�}n|d }|dd krd | ›�}nt| ¦«}| | ||f|| <�ŒÒ|S)aÄ Converts data lines from dbctl stdout to dictionary :param data_lines_list: List of lines from dbctl stdout :param is_kb_limits_ok: Is limits already in KB/s :param utility_exc_message: Message dict for exception :return: Tuple(dict, dict) dbctl data dictionary. Example: {'default': (400, 1953124, '400', '1953124'), 'cltest1': (350, 2025138, '*350', '2025138') } zcpu(%)éér€TNrú/ériú+Ú*) r�r5ržr r;r:r9rr‘rƒrîrb)r'Údata_lines_listr0r/Úgovernor_limitsr�Úuser_limits_listrêrërìÚ user_namer¯r8r°Úmarksr±r²s rr.z%MySQLGovernor._parse_dbctl_data_linesðs(€ðˆØ#ð, yñ, yˆDØ—:’:‘<”<ˆDàð ˜8 tÐ+Ð+Øå,×8Ò8¸Ñ>Ô>Ð åÐ#Ñ$Ô$¨Ò)Ð)­SÐ1AÀ!Ô1DÑ-EÔ-EÈÒ-JÐ-JØ*.�Ô'Ø(,�Ô%Ø/3�Ô,Ý'Ð(;Ñ<Ô<Ð<Ø.¨qÔ1×7Ò7¸Ñ<Ô<ˆOØ/°Ô2×8Ò8¸Ñ=Ô=Ð Ø 0°Ô 3× 9Ò 9¸#Ñ >Ô >Ð Ý�?Ñ#Ô# qÒ(Ð(­CÐ0@Ñ,AÔ,AÀQÒ,FÐ,FÍ#ÐN_ÑJ`ÔJ`ÐdeÒJeÐJeØ*.�Ô'Ø(,�Ô%Ø/3�Ô,Ý'Ð(;Ñ<Ô<Ð<Ø(¨Ô+ˆIå  °Ô!3Ñ4Ô4ˆNà ×3Ò3Ð4DÀQÔ4GÐIZÐ[\ÔI]Ñ^Ô^ˆMà0?ÐW˜}˜}À]ÐSWÑEWÐ ð% QÔ'ˆEØ�QŒx˜3ŠˆØ(@¨O¸AÔ,>Ð(@Ð(@Ð%Ð%à(7¸Ô(:Ð%Ø�QŒx˜3ŠˆØ'=Ð+;Ð'=Ð'=Ð$Ð$å'*Ð+;Ñ'<Ô'<Ð$à*8Ð:JÐLaÐcwÐ)xˆO˜IÑ &Ñ &ØÐr)F)NNrG);rrrr*r„rØr?rár�r#r"rr ÚreÚcompilerr%rHrAr[r^r]rLÚ staticmethodr}r‰rCr�ržr‚r`rªÚboolrrƒr´r¾rÅrÈrÍrÚrrbÚdictrérUrïrr÷rýrrr rgr&rarîr-r.rrrr5r5Ds€€€€€ððð%€KØ%€LØ%€MØUÐØ3ÐØ9€OØ=ÐØ€JØ1ÐØ!�r”zÐ"6Ñ7Ô7Ðð=ð=ð=ð$#ð#ð#ðððð*ð*ð*ð*ð,.ð.ð.ð -ð -ð -ðððð*ð!ð!ñ„\ð!ð2ððð2 ð ð ð3ð3ð3ð ð 7ð 7ñ„\ð 7ðððñ„\ðð)ð)ð)ð ð ð ð!ð!¸dð!ÈuÐUXÐZ]ÐU]Ìð!ð!ð!ð!ð:ððð ððð$ ð ð ð ð ð ðBðBðBðBðH&ÀÈ#Äð&ÐSWð&ð&ð&ð&ð8 u¸Tð uÐUYð uØ9=ð uØBGÈÈSÈÄ/ð uð uð uð uðð¨x¸¬}ðÈÐQUÌððððð&°cðÈððððð&B@àðB@ð˜C”=ðB@ð˜3”-ð B@ðB@ðB@ðB@ðH W¸Cð WÈHÐUXÌMð WÐemÐnqÔerð Wð Wð Wð WðPTØ59ð(Pð(P¨sð(P¸xȼ}ð(PØ%-¨c¤]ð(Pð(Pð(Pð(PðT$ð$ð$ð ð ð ð'1ð'1ð'1ðRð sð¸ðððñ„\ðð&-ð-ð-ð-ð&9Èð9Ðcgð9Ðlpð9ð9ð9ð9ð9ð9rr5)r<rGÚxml.dom.minidomÚdomÚminidomrir�räÚxml.parsers.expatrÚtypingrrrÚpackaging.versionrÚclcommon.clexceptionrÚclcommon.utils_cmdr r r rrr.r3r5rrrúrTs©ðð € € € Ø € € € ØÐÐÐÐÐÐÐÐØÐÐÐØ € € € Ø(Ð(Ð(Ð(Ð(Ð(Ø(Ð(Ð(Ð(Ð(Ð(Ð(Ð(Ð(Ð(à%Ð%Ð%Ð%Ð%Ð%à3Ð3Ð3Ð3Ð3Ð3ØAÐAÐAÐAÐAÐAÐAÐAðððððñôðð  ð ð ð ð Ð*ñ ô ð ð  ð  ð  ð  ð  Ð-ñ  ô  ð  ð  ð ð ð ð Ð+ñ ô ð ððððe ðe ðe ðe ðe ñe ôe ðe ðe ðe r