g< ddlZddlZddlmZddlmZddlmZddlm Z ddl m Z m Z m Z mZGdd eZd d d d d d dddd d d dd ddd ddd ZdZdZd"dZdZdZdZdZdZd"dZdZd Zd!ZdS)#N)Optional)etree)FormattedException) MySQLGovernor)boolean_to_on_offstr_to_booleantime_convertor_to_dicttime_unit_to_letterceZdZdS)DBGovernorExceptionN)__name__ __module__ __qualname__py/clconfig/db_governor_lib.pyr r sDrr offonlimit60smodeunlimitkilllogPathtimeoutLONGrformatERROR) modeOfOperationgatherDataForDetailedStatssave_uidlogRestrictedUsersQueries scriptPathuserMaxConnections restrictType slowQueries restrictLogerrorLogz!/etc/container/mysql-governor.xmlc$t|dS)Nzutf-8)encoding)open) file_names r_openr3>s  G , , ,,rc dt|zdzt|z}||d}n#ttf$r|cYSwxYw|S)a Gets data from specified node and attribute :param x: Parent node object :param node: Node name to extract data :param attrib: Attribute name to extract data :param default: Default value to return if specified node/attribute not found :return: Value ///@r)strxpathAttributeError IndexError)xnodeattribdefaultpathdatas rget_data_from_xmlrABskc$ii$&V4wwt}}Q J ' KsAAAAct|}|drt|dddz}n|drt|dddzdz}nr|dr!t|dddzdzdz}n<|drt|dd}nt|}|S) z~ Convert value in minutes, hours, days to seconds :param value: value of slow limit :return: value in seconds mN<hds)r7lowerendswithint)valueresults rconvert_time_value_to_secondsrOSs JJ    E ~~c U3B3Z2%   U3B3Z2%*   U3B3Z2%*R/   U3B3ZU Mrc |dd}t|}t|S#ttt f$r|cYSwxYw)z Gets slow queries timeout :param x: Root node :param default: Default value to return if timeout not found :return: Timeout z$default/limit[@name='slow']/@currentr)r8rOrLr9r: ValueError)r;r>r@s rget_slow_queries_timeoutrRhsbww=>>qA,T224yy J 3s8;AAcd}||}t|dkr|d}t|dkr)tjd}|||dd}tjd}|||ddn|d}|dt |dS) z{ Sets slow queries timeout :param node: Root node :param slow_timeout: new timeout value :return: None zdefault/limit[@name='slow']rr>rnameslowcurrentN)r8lenrElementappendsetr7)r< slow_timeoutr?tag_list node_listnew_node default_node tag_to_sets rset_slow_queries_timeoutraws )Dzz$H 8}}JJy)) y>>Q  }Y//H KK ! ! !zz),,Q/ ]7++ J'''vv&&&&a[ NN9c,//00000rc2dt|z}||}t|dkr>tj|}||||}|d}|||dS)z Sets value to specified node/attribute :param x: Parent node :param node_name: Node name :param attribute_name: Attribute name :param value: Value to set :return: None r5rN)r7r8rWrrXrYrZ)r; node_nameattribute_namerMr?r\r^tags rset_data_to_xmlrfs #i.. Dwwt}}H 8}}=++ 774== 1+CGGNE"""""rct|||} t|S#t$r"}ttd|d||d}~wwxYw)z Get time from specified tag/attribute as seconds :param x: XML object :param tag_name: XML tag name :param attr_name: XML object name :return: Number of seconds. Throws DBGovernorException if any error z has invalid value in governer/r6N)rAr Exceptionr DbGovConfig)r;tag_name attr_namerMes r_get_timedict_from_xmlrmsu a9 5 5E%e,,, ! R R8 R Ry R R   s" AA  ActjtsdS|;t t}t j|}n|}t|ddtdS)z Get MySQL Governor mode. We return None if governor config isn't exists All exceptions will be catched in top level functions :param parsed_xml_tree: parsed governor config Nlveuser%) osr?existsrir3rparsegetrootrA DEFAULTS_DICT)parsed_xml_treefr;s rget_gov_mode_operationrxsl 7>>+ & &t +   KNN " " $ $  Qumu>u/v/v1B1nV[CPQ^C_`iCj2l2l1I!][hMijsMt1u1u &(&( M")J}]?[\e?fgg':x}A]^fAghh& & M"/@5&R_`jRkluRv.w.w,=aP]^hPijrPs,t,t#%#% J /11222"K00 We2E4M  "5 7QQQ!["H"HQ"H"HIIqPQs%K;KK;;8M3M  McT tjtsdSt t}t j|}|dddtfdddtfdd d tfd dd tfd ddtfdddtfdddtfdddtfddd tfdddtfdddtfdddtfg }|D]G} |\}}}}td|} t||||| 8#t$rYDwxYwgd} | D]a}|\} } }} td| } ttd| }t|||| |R#t$rY^wxYw |dd}t||n#t$rYnwxYwt j|}t#td 5}|d!|zdddn #1swxYwYnd#t&t(t jt jt jf$r/}t1d"t|zd#tid$|d}~wwxYwt3jd%d&d'd()dS)*a% Set MySQL governer config :param parameters_dict: Parameters to set dictionary. For example: { u'modeOfOperation': u'abusers', u'scriptPath': u'', u'gatherDataForDetailedStats': True, u'userMaxConnections': 30, u'logRestrictedUsersQueries': False, u'restrictLog': {u'logPath': u'/var/log/dbgovernor-restrict.log', u'format': u'LONG'}, u'restrictedTimePeriods': {u'level1': {u'unitOfTime': u'seconds', u'period': 60}, u'level2': {u'unitOfTime': u'minutes', u'period': 15}, u'level3': {u'unitOfTime': u'hours', u'period': 1}, u'level4': {u'unitOfTime': u'days', u'period': 1}, u'timeout': {u'unitOfTime': u'hours', u'period': 1}}, u'errorLog': {u'logPath': u'/var/log/dbgovernor-error-my.log', u'level': u'DEBUG'}, u'slowQueries': {u'logPath': u'/var/log/dbgovernor-kill.log', u'kill': True, u'timeout': 30}, u'restrictType': {u'mode': u'limit', u'unlimit': {u'unitOfTime': u'seconds', u'period': 60}} } Any key in dictionary can absent, appropriate MySQL Governor parameter will not changed :return: None. Throws DBGovernorException if error Nz['modeOfOperation']rorpz['scriptPath']r|r}z['gatherDataForDetailedStats']rzrz['userMaxConnections']r~z['logRestrictedUsersQueries']r{z['restrictLog']['logPath']rz['restrictLog']['format']r#z['errorLog']['logPath']rz['errorLog']['level']z['slowQueries']['logPath']rz['slowQueries']['kill']rz['restrictType']['mode']rparameters_dict))z%['restrictType']['unlimit']['period']z)['restrictType']['unlimit']['unitOfTime']rr)z-['restrictedTimePeriods']['level1']['period']z1['restrictedTimePeriods']['level1']['unitOfTime']r|r)z-['restrictedTimePeriods']['level2']['period']z1['restrictedTimePeriods']['level2']['unitOfTime']r|r)z-['restrictedTimePeriods']['level3']['period']z1['restrictedTimePeriods']['level3']['unitOfTime']r|r)z-['restrictedTimePeriods']['level4']['period']z1['restrictedTimePeriods']['level4']['unitOfTime']r|r)z.['restrictedTimePeriods']['timeout']['period']z2['restrictedTimePeriods']['timeout']['unitOfTime']r|r r,r wbs %s z%(dbgov_cfg)s error: dbgov_cfg)messagecontextz//sbin/service db_governor restart &>/dev/null &Tz /bin/bashF)shell executablecheck)rqr?rrrir3rrsrtcloser7revalrfKeyErrorr ratostringr1writerrrrrr subprocessr)rrwr;control_data_listcontrol_data_iteminput_dict_keys xml_tag_namexml_attribute_namefunc_convertervalcontrol_data_pairs_listperiod_indexesperiod_unit_of_time_indexes period_valperiod_unit_of_timeslow_queries_timeouts_xmlrls rset_db_gov_configrs.LRw~~k**  F +   KNN " " $ $  #E5# 6 z8S 9 -{FDU V %z3I3 O ,lECT U ):uc B (*h D &vs ; $eVS 9 )>5# F &?P Q '% E  "3    TeQ/A>>_>>??<1C^^TWEXEXYYYY     # # # "9   \m YN7GY ""DN"D"DEE &9$?nQl?n?n:o:o&p&p#<1C EiTgEiEijjjj      #2=#A)#L $Q(< = = = =    D q!! +t $ $ = GG3e; < < < = = = = = = = = = = = = = = = We2E4MuOc dRRR!.EA.N/:K.H#J#JKKPQ RRND+UDDDDDDs$H,C H,54D*)H,* D74H,6D77H, AFH, FH,FH,#GH, G H,G,H,;H  H, H$$H,'H$(H,,2J *JJ ct}|\}}||t|dS)z Get db_governor status and version info :return: dict( 'dbGovVersion': , 'dbGovStatus': enabled|error|disabled, 'dbGovError': error details ) ) dbGovVersion dbGovStatus dbGovError)rget_governor_statusget_governor_versionr7)db_govstatuserrors rrrlsL__F..00MFE3355%jj  r)N)rqrtypingrlxmlrclcommon.clexceptionrclcommon.lib.mysql_governor_librclconfig_utilsrr r r r rurir3rArOrRrarfrmrxrrrrrrrs 333333999999     ,   "&!&   ) 42 ---"*   1118###*"PPPP"3Q3Q3QliDiDiDXr