Qb* ddlZddlZddlZddlZddlZddlZddlZddlZddlm Z ddlm Z ddl m Z ddlmZddlmZmZddlmZddlmZdd lmZdd lmZmZdd lmZdd l m!Z!dd l"m#Z#ddl$m%Z%m&Z&m'Z'ddl(m)Z)m*Z*ddl+m,Z,m-Z-da.dZ/dZ0dZ1dZ2dZ3dZ4dCdZ5Gdde6Z7e/fdZ8dDdZ9dZ:dZ;Gdd eZdEd$Z?dEd%Z@d&ZAd'ZBdFd)ZCdEd*ZDd+ZEdDd,ZFdDd-ZGdDd.ZHdDd/ZId0ZJd1ZKd2ZLGd3d4eMZNd5ZOd6ZPd7ZQd8ZRdEd9ZSd:ZTd;eUdeXeXe d?eXeUdzd@eYdAeYdi}|D]}|||S)z >>> merge_dicts({1: 2}, {3: 4}) {1: 2, 3: 4} >>> merge_dicts({1: '1', 2: '2'}, {2: 'two', 3: 'three'}) {1: '1', 2: 'two', 3: 'three'} )update)dicts dic_mergeddic_s r merge_dictsr)=s5J  $ rc#jKtdt||D]}||||zVdS)zS :type chunk_length: int :type _list: list :rtype: Generator[list] rN)rangelen)_list chunk_lengthis r get_chunksr1JsQ 1c%jj, / /((Aa,&&'''''((rceZdZddZdS)LVEVersionErrorcBt|d|dS)NzCan't detect LVE version; ) Exception__init__)selfmessages rr7zLVEVersionError.__init__Us'4!Gg!G!GHHHHHrN)r4)__name__ __module__ __qualname__r7rrrr3r3Ts.IIIIIIrr3c t|dd5}|d} t|ddcdddS#tt t f$r}td|d ||d}~wwxYw#1swxYwYdS#ttf$r}t||d}~wwxYw) z0 :param str _lve_file: :return int: rutf-8encoding:rNzerror parsing line 'z ' from file ) openreadintsplit TypeError IndexError ValueErrorr3OSErrorIOError) _lve_filelve_file_stream lve_ver_stres rget_lve_versionrQYs9 ( )S7 3 3 3 )..q11K ;,,S11!455        z:6   %O;OOIOO             W (((a  a'(sWB!B'A B!B6B  BBBB!BB!!C2CCcz|p t} |}n#t$rd}YnwxYw|pdS)a Parse governor config file and return governor mode :type governor: MySQLGovernor :rtype: str :return: if file exists and correct: "on", "single", "off", "abusers" or "all" if governor is not installed or error occurs: "none" Nnone)rget_governor_moder)governor governor_modes rrTrTksY*=??H 2244    "F"s ' 66ctjdsdStjtrt}nt}|S)z :rtype: str|None z/usr/sbin/db_governorN)ospathexistsGOVERNOR_CONFIGGOVERNOR_CONFIG_OLD)governor_config_paths rget_governor_config_pathr^|sK 7>>1 2 2t w~~o&&3.2 rcdt}|dS tj|}|dD]S} |jdj|kr*|jdjdkcSD#t$rYPwxYwn#tttf$rYdSwxYwdS)z3 :rtype: bool|None :type username: str NusernamemodeignoreF) r^rparsegetElementsByTagName attributesvaluelowerKeyErrorrLr r)usernamer]governor_configr`s rget_governor_ignore_for_userrls 455#t !-(<==#88@@  D ?6*0H<<?628>>@@HLLLL=       Z .tt 5s;+B=B=BB B B BBB-,B-ceZdZdS)DomainExceptionN)r:r;r<rrrrnrnsDrrncFt}|S)z/ :rtype: (str, MySQLGovException|None) )rget_governor_status)mysql_governors rrprps#__N  - - / //rcj tj|S#tttf$ricYSwxYw)z Get dict[user, domain], empty if cannot obtain. :param reseller_name: reseller's name :rtype: dict[str, str|None] )r reseller_domainsrrAttributeError) reseller_names rget_reseller_domainsrvsC %m444 & n E s 22Tc tj||}|S#ttttjjtjjtf$r+}|rtt||gcYd}~Sd}~wwxYw)z Get list of aliases for specified user's domain, or empty list. :type username: str :type domain: str :type raise_exception: bool :raises DomainException: if cannot obtain domains :rtype: list[str]|None N) r useraliasesrirLrHcpapiexceptionsr NoPanelUserrrnstr)rjdomainraise_exception user_aliasesrPs r get_aliasesrs(6::  gy%*?*L  ! -| =  1!#a&&))q 0 s=B A<6B<Bc tj|}d|DS#ttttjjtjjtf$r+}|rtt||gcYd}~Sd}~wwxYw)z Get list of domains for specified user, or None. :type username: str :type raise_exception: bool :raises DomainException: if cannot obtain domains :rtype: list[str]|None cg|] }|d S)rr).0r|s r zget_domains..s555fq 555rN) r userdomainsrirLrHryrrzrrnr{)rjr} user_domainsrPs r get_domainsrs6(22 65 5555 gy%*?*L  ! -| =  1!#a&&))q 0 s"=B  B?B B cZt|}t|dkrdS|dS)z :param username: user name string :return: if not supported in CP, or domain name is not set: None if we can find it: domain name string :rtype: str|None :type username: str rN)rr-)rjrs r get_domainrs3x((L <At ?rc|}|d|d||dS)zP Create database :param db_engine: :param db_name: :return: COMMITzCREATE DATABASE N)connectexecuteclose) db_enginedb_nameconns r init_databasersS     DLLLL-G--...JJLLLLLr tmp_unittest_c||ttjddz}t|||S)z Create database with random prefix in name Using for unittests :param db_engine: :param str prefix: :return str: r)r{uuiduuid4r)rprefixrs rinit_database_rndrs:s4:<<((1--G)W%%% Nrc(t|}|jdd}|r|jdkrtj|dSt j|jdz|jz}|}|rd|j vr| d|d| d  d d }| d d }ttt | d d dgkr| d|dn{| d|dna|r_d|j vrV| d}| D],}|d|kr| d|d -| d| d||dSdS)z Drop database (support MySQL and PostgresSQL) :param uri: :param force: kill all connection and locked session before drop database :return: NsqliteTz:// postgresqlz?UPDATE pg_database SET datallowconn = 'false' where datname = ''zSHOW server_versionr . zLSELECT pg_terminate_backend(procpid) FROM pg_stat_activity WHERE datname = 'zHSELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE datname = 'mysqlzSHOW PROCESSLISTzKILL rzDROP DATABASE )rrYschemerXunlinksqlalchemy_engine create_enginenetlocrrarfetchallstriprGlistmaprFr) uriforceuri_rrrpg_vercursorfetcheds r drop_databaser s C==DimG ;( " " Ig   4%3DK%4G$+4UVV   ""  7\Y^33 LLe[beee f f f\\"788AACCAFqIF\\^^))#..q1FCV\\#..//00Aq699 vlsvvvwwww rhorrrssss  7w).00\\"455F!??,, 7 71:((LL!5!5!5666 X /g//000 t9rcd}tj|sdSt|d5}|cdddS#1swxYwYdS)Nz/etc/redhat-releaser4r?r@)rXrYrZrDreadline)rY release_files r _release_liner1s D 7>>$  r dW % % %'$$&&''''''''''''''''''sAAAc6|t}|}d|vr|ddz}ngS||}g}|dD]5} |t |&#t $rY2wxYw|S)a Return CloudLinux version as list [major, minor] or [] if can't obtain version :param str release_line: :return list: splited version >>> cl_ver('CloudLinux Server release 5.11 (Vladislav Volkov)') [5, 11] >>> cl_ver('CloudLinux Server release 6.8 (Oleg Makarov)') [6, 8] >>> cl_ver('CloudLinux release 7.2 (Valeri Kubasov)') [7, 2] >>> cl_ver('Incorrect release line') [] Nreleaserr)rrGindexappendrFrJ) release_linerelease_line_splitedver_indxver_strverss rcl_verr9s$ '--//((('--i881< "8,G C ]]3    JJs1vv        D  Js&"B  BBcJtjd}fd|DS)N)cploginreseller)keylsc&g|] \}}|k |Srr)rr reseller_rs rrz#_reseller_users..[s( Y Y Y*8yCXCXGCXCXCXr)r cpinfo)rcplogin_reseller_s` r_reseller_usersrYs2 +BCCC Y Y Y Y.? Y Y YYrcttdt} ||S#tjj$rgcYSwxYw)Nreseller_users)getattrr rryCPAPIException)rrs rget_users_for_resellerr^sSU$4oFFN~h'''  / s (AAct|dd5tj||dddn #1swxYwYtj|ddS)z The equivalent console touch command :param str fname: path to file :param None| tuple times: (atime, mtime) if None atime and mtime are default r!r?r@N)rDrXutimechmod)fnametimess rtouchrfs eS7 + + + HUEs 599c2fd}t||dS)z2 :type data: list :type filename: str cZtj|}|dS)z:type csv_file: fileN)csvwriter writerows)csv_filerdatas r csv_writez#atomic_write_csv..csv_writevs,H%%rN _atomic_write)filenamerrs ` ratomic_write_csvrqs4 (I&&&&&rc2fd}t||dS)z1 :type data: str :type filename: str c2|dS)z:type str_file: fileN)write)str_filers r str_writez#atomic_write_str..str_writestrNr)rrrs ` ratomic_write_strr}s4 (I&&&&&rc d\}}d}tjddtj|5}|j}|||t|D]W} tj| n/#t$r }|}tj |Yd}~Pd}~wwxYw| dddn #1swxYwYtj |dtj||dS)zF :type write_function: (file) -> None :type filename: str )rg333333?NwF)deletedirr)tempfileNamedTemporaryFilerXrYdirnameraflushr,fsyncfilenorKtimesleeprrename) rwrite_function retry_countretry_intervalexcf tmp_filename_rPs rrrso #)K C  $S,1)+)B)B D D DGHv q  {##  A +$$$ + + + >******** +I  H\5!!!IlH%%%%%s;8C5&BC C'C=CCCC Cc8eZdZddZedZdZdZdS) reboot_lockNc||_|t|_n||_t j|jtjtjzd|_dS)Ni) timeoutr_build_lock_filenamerrXrDO_WRONLYO_CREATlock)r8rrs rr7zreboot_lock.__init__sN =$99;;DJJDJGDJ bj(@%HH rcd}tj|st|tj|dS)Nz/var/lvez lvestats.lock)rXrYrZmkdir_pjoin) lock_file_dirs rrz reboot_lock._build_lock_filenamesA" w~~m,, # M " " "w||M?;;;rcntj} tj|jtjtjzdS#t $r`}|jtjkr|j %tj|z |j krYd}~dStj dYd}~nd}~wwxYw)NTg?) rfcntlflockrLOCK_EXLOCK_NBrLerrnoEAGAINrr)r8 start_timerPs r __enter__zreboot_lock.__enter__sY[[  $ $ DIu}u}'DEEE $ $ $7el**|/DIKK*4Lt|4[4[JsOOOOOOOO $ $s1A B3rVs  ((((((!!!!!!))))))))((((((222222######........//////######(((((( :9999999MMMMMMMM  69      ((((IIIIIiIII '(((($####"    ,     (   000   (6666&          %%%%P'''@ZZZZ  ' ' ''''&&&8&&&&&&&&&R # # #       ( ( ( (K#K$KKKK04())*$tCy/ I,"%$'03r