}Ce >dZddlmZddlmZddlmZddlZddlZddlZddlZddl Z ddl Z ddl Z ddl m Z ddlmZmZmZmZmZddlmZdd lmZdd lmZmZmZmZmZmZdd l m!Z!dd l"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z(dd l)m*Z+ddl,m-Z-m.Z.m/Z/m0Z0ddl1m2Z2m3Z3m4Z4ddl5m6Z6m7Z7dZ8dZ9ej:;e9dZej:;e=dZ?ej:;e9ddZ@dZAdZBej:;e=dZCej:;eCdZDej:;eCdZEejFdejGeAzZHdaIdZJd ZKd!ZLd"ZMd#ZNdEd%ZOdFd'ZPdGd)ZQd*ZRd+ZSd,ZTd-ZUd.ZVd/ZWdHd0ZXd1ZYd2ZZdFd3e[d4ee\e\ffd5Z]d6Z^dId7Z_d8Z*d9Z`d:Zad;Zbd<Zcd=Zdd>Zed?Zfd@ZgdAZhdBZiGdCdDe2ZjdS)Jz. CloudLinux API for DirectAdmin control panel )absolute_import)division)print_functionN) format_exc)ListTupleDictOptionalUnion)urlparse)ClPwd)load load_fastapache_conf_parsernginx_conf_parserWebConfigParsingErrorWebConfigMissing)Feature)NoDBAccessDataCpApiTypeErrorNoDomain ReadFileError ParsingError NoPanelUserget_admin_email)grepget_file_linesfind_module_param_in_configExternalProgramFailed)GeneralPanelPluginV1PHPDescriptionDomainDescription)get_domains_via_custom_binary"_docroot_under_user_via_custom_bin DirectAdminz/usr/local/directadminzconf/directadmin.confdatazconf/mysql.confusers custombuildz options.confz user.confz/etc/virtual/domainownersadminz reseller.list admin.listz .+/(.+)/%sc~tjdptjdS)N"/usr/local/directadmin/directadminz(/usr/local/directadmin/custombuild/build)ospathisfile/builddir/build/BUILDROOT/alt-python27-cllib-3.3.7-2.el7.cloudlinux.x86_64/opt/cloudlinux/venv/lib/python3.11/site-packages/clcommon/cpapi/plugins/directadmin.pydetectr4<s2 7>>> ? ? F 7>>D E EFr2ct} tt}|d|d<|d|d<nQ#t$r$}t dt |zd}~wt $rt dtwxYw|S)Nuserloginpasswdpassz0Can not open file with data to database access; z+Can not get database access data from file )dict loadconfig DA_DB_CONFIOErrorrstrKeyError)access login_dataerrs r3 db_accessrCAs VVF^ ++ $V,w#H-v \\\ORUVYRZRZZ[[[ ^^^nPZPZ\]]]^ Ms*; B A$$%B cdtjtjtdt D}d|D}t |S)NcBg|]}t|Sr1) USER_PATTERNmatch).0r/s r3 zcpusers..Os&nnnt,$$T**nnnr2*c<g|]}||dS))group)rHrGs r3rIzcpusers..Ps'BBBUEB%++a..BBBr2)globr.r/join DA_USERS_PATH USER_CONFtuple) match_list users_lists r3cpusersrUNsTnntym]`bkAlAl7m7mnnnJBBjBBBJ   r2ctt}d|D}|t |S)Nc6g|]}|Sr1striprHitems r3rIzresellers..Vs BBBtdjjllBBBr2)openRESELLERS_LIST readlinescloserR)streamresellers_lists r3 resellersrbTsI . ! !FBBv/?/?/A/ABBBN LLNNN   r2ctt}d|D}|t |S)Nc6g|]}|Sr1rXrZs r3rIzadmins..]s ???D4::<<???r2)r\ ADMINS_LISTr^r_set)r` admins_lists r3adminsrh[sI +  F??F,<,<,>,>???K LLNNN {  r2Fcddlm}t}|||}|r6|tt t z }|S)Nr)_dblogin_cplogin_pairs) cplogin_lstr@) clcommon.cpapi.plugins.universalrjrCrR get_da_userrPitems)rkwith_system_usersrjr@r's r3dblogin_cplogin_pairsrpbseGGGGGG [[F ! !k& I I ID: k-006688999 Kr2Tc i}tj}tj|tjd}|D]}tj|r|dz|zdz} t |}t|dkr|dd}|||<| #t$r'|s"tj d|zYwxYwtj||S)Nz./*/z /domains.listrzNo file )r.getcwdchdirrNr/isdirr\lenreadliner_r=sysstderrwrite) r/quietr(cur_dirdir_listuser_dir file_domainsf user_names r3rmrmks EikkGHTNNNyH @ @ 7== " " @#:0?BL @&&qzz||$$q(( ( I'0E)$  @ @ @@J$$Z,%>??? @ @HW Ls-AC.C65C6cploginpackagemailresellerdnslocalec^ t}t|tr|g}nat|ttfrt|}n5|t }n$t ddt |jddddfdd d d  fd |D}|D]|}tj t|t}tj |r0t| | fd |D}|S)Ncpinfozstr|unicode|list|tuple)funcnamesupportedtypes received_typec|ddkr|dS|dS)Nusertyperusernamecreatorgetconfigs r3 _get_resellerzcpinfo.._get_resellers= ::j ! !Z / /::j)) )zz)$$$r2c,|dS)Nrrrs r3zcpinfo..s :0F0Fr2c,|dS)Nrrrs r3rzcpinfo..s 90E0Er2c,|dS)Nemailrrs r3rzcpinfo..sVZZ-@-@r2c|SNr1)rrs r3rzcpinfo..sv1F1Fr2c,|dS)Ndomainrrs r3rzcpinfo..sFJJx,@,@r2c,|dS)Nlanguagerrs r3rzcpinfo..svzz*/E/Er2rc g|] }| Sr1r1)rHkey_user_conf_maps r3rIzcpinfo..s 3 3 3cnS! 3 3 3r2c&g|] }|Sr1r1)rHr user_configs r3rIzcpinfo..s#@@@#SS--@@@r2)list isinstancer>rRrUrtype__name__r.r/rOrPrQexistsrappend) cpuserkeylssearch_sys_usersreturned cpusers_listkeyls_ruser_conf_filerrrs @@@r3rrshvvH&#Bx FT5M * *BV}} yy h?W+/<<+@BBB B%%% "G!F!E!E@@"F"F"F"F@@ E E GGN 4 3 3 3U 3 3 3F BBmXyII 7>>. ) ) B#N33K OO@@@@@@@ A A A Or2c<d}tttD]/}||ks|d|zrt|}n0|t}nt |}|D]}||vr |d|fcSdS)z Old method for getting doc_root for domain under root Method reads DA config :return: (doc_root, username) cortege Nz.%srL)_load_domains_ownersr_domain_to_user_mapkeysendswith userdomains)rr main_domain domains_listds r3_docroot_under_rootrsI/446677 [ FOOEK4G$H$H +K8I E !vv "9-- ## Q;;Q4? " " " ##r2ct}|tjd}t |j}|D]}|d|kr|d|jfcS dS)z Old method for getting doc_root for domain under user Method parses /home//domains directory :return: (doc_root, username) cortege r server_name document_rootN)r get_pw_by_uidr.getuid_get_domains_list_as_userpw_dirpw_name)rclpwduser_pwlist_domains_and_doc_roots domain_datas r3!_docroot_under_user_old_mechanismrs GGE!!")++..q1G!:7>!J!J1AA } % / //@ @ @ @ 0AAr2cd}|}tj}tj}|dkr|dkrt |}nt |}||St d|z)z Retrieves document root for domain :param domain: Domain to determine doc_root :return: Cortege: (doc_root, domain_user) Nrz*Can't obtain document root for domain '%s')rYr.rgeteuidrr%r)rresuideuids r3docrootrsy C \\^^F )++C :<tj|rtj |}|dks|rst|}|D]_} | ddur | d|vr%| d| d| df<| | d| df`|St\} } | dkr| S| d kr"td |t!d | z) aD Get user's domains list :return list: domain names Example: [('cltest1.com', '/home/cltest1/domains/cltest1.com/public_html'), ('mk.cltest1.com', '/home/cltest1/domains/cltest1.com/public_html/mk'), ('cltest11.com', '/home/cltest1/domains/cltest11.com/public_html') ] ~rrrTrr z!User {} not found in the databasezFailed to get userdomains: %s)rr.r/rOrPrr expanduserislinkrealpathrinsertrr$rformatr ) ras_rootrrrmain_domain_pathr public_pathrrrcrs r3rr!s66L ]F33I :<>) $ $ ""3<00I',,y-88K w~~k""9rw~~k'B'B97++K88 qyyGy.y99   V VFe}$$m$(888##A}(=vo?V'WXXXX##VM%:F?>) $ $ $ww~66H MM( # # #  ??r2cFt|dS)z Return domain's owner :param domain: Domain/sub-domain/add-domain name :return: user name or None if domain not found N)rrrs r3 domain_ownerras ! ! % %fd 3 33r2 use_cachedreturnc|sdatrtS tt}|}|n7#t t f$r#}datt|d}~wwxYwta|D]c}| }|s| d\}}| }| }|t|<dtS)z Get domain<->user map from /etc/virtual/domainowners file ATTENTION: this method uses global variable, so result could be cached within one process use use_cached wherever it is critical to update data w/o re-importing N:) rr\ DOMAINOWNERSr^r_OSErrorr=rr>r:rYsplit)rstream_ domains_linesrline_domain_user_s r3rrjs #"#""$|$$))++   W $$$"CFF###$&& - -   S))--// ',G$$ s.s >>>4$**,,>>>r2)r.r/rOrPr\rr=r ) resellernameusers_list_filerTs r3reseller_usersrs  gll=, MMO / " " j>>:>>>J   l + + +                   W  s4A8#A+ A8+A//A82A/3A88B Bcd|gSt|}tt|dS)z Get pairs user <=> domain for given reseller; Empty list if cannot get or no users found; :type resellername: str :return list[tuple[str, str]]: tuple[username, main_domain] N)rr)r)rr:r)rr(s r3reseller_domainsrs8 < ( (E u$6777 8 88r2ctjtdt}t |}|dtS)Nr*r)r.r/rOrPrQr;runiversal_get_admin_email)admin_user_filecnfs r3rrsAgll='9EEO _ % %C 777577 8 88r2ctjt|t}tj|r7 t |ddkS#t$rtdwxYwdS)z{ Check if given user is reseller; :type username: str :rtype: bool :raise: ParsingError, ReadFileError rrz)User config exists, but no usertype givenF) r.r/rOrPrQrr; IndexErrorr)rrs r3 is_resellerrs',,}h BBK w~~k""L Lk**:6*D D L L LJKK K L 5s A%%A?c.d|S)Nzhttp://{domain}:2222r)rrs r3get_user_login_urlr s ! ( ( ( 7 77r2c`i} tt}n#ttf$rYdSwxYwd}d|d|vrsd|d|vrki|t |<|d|d|t |d<|d|d|t |d<|dz }d|d|vrd|d|vk|S)zJ Return map (PHP_DA_CODE:{PHP_HANDLER, PHP_VERSION}) :return: NrLphp_mode_release handler_typephp_version_id)r; DA_OPT_PATHr=r r>) _php_da_mapphp_cfgis r3_get_da_php_configr+s  K[)) W tt A ...G # #(9a(9(9(9W(D(D CFF.5nAnnn.E CFFN+078Ia8I8I8I0J CFF,- Q ...G # #(9a(9(9(9W(D(D s ..ctjtt |dt |dz} t |}n#t tf$rYdSwxYw|d}||dkrd}|S)z Return php code from domain config :param domain: :param owner: :return: string '1' or '2' - php code in DA rz.conf1 php1_selectN0) r.r/rOrPr>r;r=r r)rownerdomain_config_file domain_config domain_phps r3_get_php_code_info_for_domainr4smSZZCPVKKZaLabb"#566 W ss""=11JZ3.. sAA+*A+ct|}g}|D]:}|d|vr||d;|S)Nr)rrr)mapped_all_domainsr all_domains subdomainsrs r3_get_subdomainsr9scl++KJ%% !9*//11 1 1 &)$$$$ r2c td}i}t}||S|D]\}} t||}n#t$rg}YnwxYwt ||}||vs||ddkrd}||}|g|zD]A}t ||d|dd|dd d  ||<B|S) a Return php version information for each domain :return: domain to php info mapping Example output: {'cltest.com': {'handler_type': 'mod_php', 'php_version_id': '7.1', 'username': 'cltest'}, 'cltest2.com': {'handler_type': 'fastcgi', 'php_version_id': '7.3', 'username': 'kek_2'}, 'cltest3.com': {'handler_type': 'suphp', 'php_version_id': '5.5', 'username': 'cltest3'}, 'omg.kek': {'handler_type': 'php-fpm', 'php_version_id': '5.2', 'username': 'cltest'}} :rtype: dict[str, dict] F)rNr&nor-r%r".r)rr&r%display_version)rr+rnr9 Exceptionr4r#replace) map_domain_user result_map php_da_maprr0r8 php_info_codephp_info domain_entitys r3get_domains_php_inforFsB(+e<<$FF Mm,%X 2  M(9'(89%n5 Sh/?&@&H&Hb&Q&Q S S )))J} % %  sA AAcg}d}tjd}tj|D],}tj||}tj|r||rtj|dr| dd}| td||ddd |dd|d tj|d tj|d tj|d .|S)zs Gets installed alt-phpXY - could be chosen via CloudLinux PHP Selector w/o being compiled via custombuild z /opt/alt/z^php\d+$z /usr/bin/phpr"rzalt-NrLr<rrzusr/lib64/php/modules/z usr/bin/phpzlink/conf/default.ini identifierversiondir modules_dirbinini) recompiler.rr/rOrvrGrr?rr")installed_listalt_phps_directorypatternr[ item_pathrJs r3_get_installed_alt_php_versionsrU-sKN$j%%G -..  GLL!3T::  7== # #  d(;(; R[OiOiOi@j@j ll5"--G  ! !.($=="2A2;6666 OOOGLL4LMMGLLM::GLL,CDD ###    r2cDtj|ddgddjS)Nzbin/php-configz--extension-dirT)textcapture_output) subprocessrunstdout)directadmin_php_dirs r3_get_da_php_extension_dirr]Es9 >1AAACTU/3D J J JJPQr2ct}|tS|}g}|D] }|d}|dkrd|ddd}tj|sLt|}|r|}| td|dd|tj ||tj |d tj |d   |S) zL Gets compiled phpXY - could be chosen via DirectAdmin PHP Selector Nr&r;z/usr/local/phpr<rrrr"zbin/phpz lib/php.inirH) r+rvaluesr?r.r/rr]rYrr"rO)rBinstalled_php_datarQ version_inforJr\modules_dir_paths r3"_get_compiled_custombuild_versionsrcIsP$%%Jvv $**,,N+  /0 d?? JwsB/G/GJJJw~~122  45HII  8/5577 n7W__S"5577 011( 0)<< 0-@@         r2c Ttj|sgSg} t|5}|}dddn #1swxYwYn=#t $r0}t jt jd|d|dYd}~nd}~wwxYwd|DS)z1 Parse user aliases file and return data NzCan`t open file "z " due to : ""chg|]/}|dd0S)=r)rYr )rHrecords r3rIz _get_aliases..s3 < < >$   DV $ZZ !1;;==D ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! VVV f(*Td*T*TPQ*T*T*TUUUUUUUUV < z1PanelPlugin.get_cp_description..s.CC3::d++CCCCCCr2cR|ddS)Nr<r)r?isdigit)xs r3rz0PanelPlugin.get_cp_description..s 3!3!3!;!;!=!=r2rN)namerJadditional_info)rYPopenPIPE communicater nextfilterru)rrpoutrB output_argsis_floatrJs r3get_cp_descriptionzPanelPlugin.get_cp_descriptions   5s;!! A }}HC DCsyy{{CCCK==H6(K88"==G&7tTT T 44s BBBctS)z Getting root access to mysql database. For example {'login': 'root', 'db': 'mysql', 'host': 'localhost', 'pass': '9pJUv38sAqqW'} :return: root access to mysql database :rtype: dict :raises: NoDBAccessData )rCrvs r3rCzPanelPlugin.db_accesss{{r2ctS)z Generates a list of cpusers registered in the control panel :return: list of cpusers registered in the control panel :rtype: tuple )rUrvs r3rUzPanelPlugin.cpuserssyyr2ctS)z Generates a list of resellers in the control panel :return: list of cpusers registered in the control panel :rtype: tuple )rbrvs r3rbzPanelPlugin.resellerss{{r2c t|S)zc Check if given user is reseller; :type username: str :rtype: bool )r)rrrs r3rzPanelPlugin.is_resellers 8$$$r2ctjt|t}tj|sdSt |}|ddkS)z| Return True if username is in admin names :param str username: user to check :return: bool Frr*)r.r/rOrPrQrr)rrrrrs r3is_adminzPanelPlugin.is_adminsS mXyIIw~~n-- 5// :&'11r2NFc"t||S)a  Get mapping between system and DB users @param cplogin_lst :list: list with usernames for generate mapping @param with_system_users :bool: add system users to result list or no. default: False )rp)rrrkros r3rpz!PanelPlugin.dblogin_cplogin_pairss%[2CDDDr2rTc&t|||S)u Retrieves info about panel user(s) :param str|unicode|list|tuple|None cpuser: user login :param keyls: list of data which is necessary to obtain the user, the values​can be: cplogin - name/login user control panel mail - Email users reseller - name reseller/owner users locale - localization of the user account package - User name of the package dns - domain of the user :param bool search_sys_users: search for cpuser in sys_users or in control panel users (e.g. for Plesk) :return: returns a tuple of tuples of data in the same sequence as specified keys in keylst :rtype: tuple )r)r)rrrrrs r3rzPanelPlugin.cpinfos"fe6FGGGGr2ctS)zR Retrieve admin email address :return: Host admin's email rrvs r3rzPanelPlugin.get_admin_emails    r2c t|S)z Return document root for domain :param str|unicode domain: :return Cortege: (document_root, owner) )rrrrs r3rzPanelPlugin.docroots vr2c6d|d|d}t|}|S)z Return aliases from user domain :param str|unicode cpuser: user login :param str|unicode domain: :return list of aliases "/usr/local/directadmin/data/users/z /domains/z .pointers)rk)rrr/r's r3 useraliaseszPanelPlugin.useraliases s/WFVVVVVVD!! r2c t|S)z Return domain and document root pairs for control panel user first domain is main domain :param str|unicode cpuser: user login :return list of tuples (domain_name, documen_root) )r)rrrs r3rzPanelPlugin.userdomainss6"""r2ctS)z Detects and returns list of folders contained the home dirs of users of the cPanel :return: list of folders, which are parent of home dirs of users of the panel )rrvs r3rzPanelPlugin.homedirs!s zzr2c t|S)z Return reseller users :param resellername: reseller name; autodetect name if None :return list[str]: user names list )r)rrrs r3rzPanelPlugin.reseller_users(s l+++r2c t|S)z Get dict[user, domain] :param reseller_name: reseller's name :rtype: dict[str, str|None] :raises DomainException: if cannot obtain domains )r)rr reseller_names r3rzPanelPlugin.reseller_domains0s ...r2c t|S)z` Get login url for current panel; :type domain: str :rtype: str )r rs r3r zPanelPlugin.get_user_login_url9s "&)))r2ctS)z_ List all admins names in given control panel :return: list of strings )rhrvs r3rhzPanelPlugin.adminsAs xxr2c t|S)z Return domain's owner :param domain: Domain/sub-domain/add-domain name :rtype: str :return: user name or None if domain not found )rrs r3rzPanelPlugin.domain_ownerHsF###r2ctS)z Return php version information for each domain :return: domain to php info mapping :rtype: dict[str, dict] )rFrvs r3rFz PanelPlugin.get_domains_php_infoQs $%%%r2ctt}|dd}|dS|ddS)zf Retrieve current DA skin name :return: Current DA skin name. None if unknown docsrootNrr)r;rrr )rrs r3_get_da_skin_namezPanelPlugin._get_da_skin_nameYsFG$$::j$//  4~~c""2&&r2ctjtd}d}t}|dkr%t |}|d|S|S)zZ Retrieve encoding name, used for package/reseller names :return: z,data/skins/enhanced/lang/en/lf_standard.htmlutf8enhanced lang_encoding)r.r/rODA_DIRrmrr;r)enhanced_skin_configdefault_encoding current_skin skin_configs r3get_encoding_namezPanelPlugin.get_encoding_namegsh "w||F4bcc!"4466 : % %%%9::K???4DEE Er2rcNtt|}i|tjdtjdtjdtjdtjdtj dtj dtj dtj dtj di S)NTF)rormget_supported_cl_featuresr PHP_SELECTOR RUBY_SELECTORPYTHON_SELECTORNODEJS_SELECTORLSAPIGOVERNORCAGEFSRESELLER_LIMITSXRAYWPOS)rrsupported_featuresrss r3rz%PanelPlugin.get_supported_cl_featuresxs";55OOQQ      $  !5  #T  #T M4  d ND  #T L$ L$   r2cg} ttj}n#ttf$rYdSwxYwd|D}t ddd|D][} t |dd}||vr||E#ttf$rYXwxYw|s|d |S) zl Retrieves active httpd's ports from httpd's config :return: list of apache's ports Nc6g|]}|Sr1rX)rHlines r3rIz5PanelPlugin.get_apache_ports_list..s 000$000r2ListenFT)match_any_positionmultiple_searchdata_from_file rLP) rrmHTTPD_CONFIG_FILEr r=rrr rr ValueError)_httpd_ports_listlinesrvalues r3get_apache_ports_listz!PanelPlugin.get_apache_ports_lists ";#@AAEE!   44 00%000eTbghhh  D DJJsOOA.// 111%,,U333 +      )  $ $R ( ( (  s33ABB.-B.c rd}d} tt}ttdddd|}|D]Y}|d}|ddkr|d }|dd kr|d }|d krd }Zn#t ttf$rYnwxYw||fS) a Determines active web server from options.conf, directive 'webserver' :return: tuple (active_web_server_name, apache_active_module_name) active_web_server_name: 'apache', 'nginx', 'nginx_apache', 'litespeed', 'openlitespeed', etc apache_active_module_name: 'prefork', 'event', 'worker' (None, None) if DA options.conf read/parse error Nz^apache_mpm|^webserverFT) fixed_stringrrrrgr webserverrL apache_mpmautoworker) rr'rrrYr r r=r)web_server_nameapache_active_module_name options_linesgrep_result_listr line_partss r3_get_active_web_server_paramsz)PanelPlugin._get_active_web_server_paramss$(! +;77M#D)APUjo9=m%]%]%] ^ ^ ) = =!ZZ\\//44 a=K//&0mOa=L000:1 -0F::4<1 =*-    D  999sBBB21B2apache_module_namec t|j|dS#tttt f$rdt fcYSwxYw)a Determine MaxRequestWorkers directive value for specified apache module. Reads config file /etc/httpd/conf/extra/httpd-mpm.conf :param apache_module_name: Current apache's module name: 'prefork', 'event', 'worker' :return: tuple (max_req_num, message) max_req_num - Maximum request apache workers number or 0 if error message - OK/Error message MaxRequestWorkersr)rHTTPD_MPM_CONFIGr r=rrr)rrrs r3#_get_max_request_workers_for_modulez/PanelPlugin._get_max_request_workers_for_modulesa #.t/D/A/BDD D*j9 # # #jll? " " " #s-AAc|\}}||ddtfS|dkrdd|fS||S)z Get current maximum request apache workers from httpd's config :return: tuple (max_req_num, message) max_req_num - Maximum request apache workers number or 0 if error message - OK/Error message NrDThere was error during read/parse {}. Apache collector will not workapache\DA is configured for web server '{}'; but 'apache' is needed. Apache collector will not work)rrr'r)rrrrs r3get_apache_max_request_workersz*PanelPlugin.get_apache_max_request_workerss6:5W5W5Y5Y22  "&?&G\ccdoppp p h & &77=vo7N7NO O778QRRRr2cxd} t|j}d}d}|D]}|}||r|}.|dr@|r>||ddd}nn#t t f$rYnwxYw|S)z Determine apache mod_status URI from /etc/httpd/conf/extra/httpd-info.conf config :return Apache mod_status URI or None if error/not found Nz )rHTTPD_INFO_CONFIGrY startswithr?r r=)rr location_uri info_lineslocation_directive location_liners r3_get_httpd_status_uriz!PanelPlugin._get_httpd_status_uris    ((>??J!,  M"  zz||??#566$(M??#=>>=#0#8#89KR#P#P#X#XY\^`#a#a#g#g#i#iLE!    D sBB##B76B7c|\}}|ddtfS|dkrdd|fS |}|dSd|}t j|d }|jd krdd ||jfS|jd }| d }ttd|}|d dd } t| dfS#dtfcYSxYw)z Retrieves Apache's connections number (from apache's mod_status) :return: tuple (conn_num, message) conn_num - current connections number, 0 if error message - OK/Trace Nrrrr)rz%Can't found mod_status URI in configszhttp://127.0.0.1{}?auto)timeoutzGET {} responce code is {}zutf-8 zTotal Accesses)rrrLOK)rrr'rrequestsr status_codecontentdecoder rrrYrr) rrr_rurlresponce s_responses_response_listout_lists_total_accessess r3get_apache_connections_numberz)PanelPlugin.get_apache_connections_numbers}"??AA  "\ccdoppp p h & &77=vo7N7NO O # 5577L#AA+22<@@C|C333H#s**6==c8CWXXXX!)0099J(..t44OD!1/RRRSSH'{0055a8>>@@ '(($. . #jll? " " "sE,AE?BEE$c<ttzS)a  Returns installed alt-php(s) on the server compiled phpXY via custombuild and alt-phpXY has different paths also user could choose version via PHP selector which was not compiled with custombuild (will be absent in DA configs) )rUrcr1r2r3get_installed_php_versionsz&PanelPlugin.get_installed_php_versionss0114V4X4XXXr2cd}tj|sdSt|5}|}dddn #1swxYwY|sdS|dS)Nz)/usr/local/directadmin/data/admin/ip.listrr)r.r/rr\r^rY)rr ip_list_fileripss r3 get_server_ipzPanelPlugin.get_server_ip)sB w~~l++ 2 ,   1++--C                21v||~~sAAArrcd|d}tj|sdSt|}|ddS)Nrz /user.confrr)r.r/rrr)rr user_confs r3get_user_emails_listz PanelPlugin.get_user_emails_list6sNMMMM w~~i(( 2i(( }}Wb)))r2ctjddd|gddj}t|}|jd|jdS)Nr-z--create-login-urlzuser=T)rXrWz://rr)rYrZr[r schemenetloc)rgenerated_loginparseds r3panel_login_linkzPanelPlugin.panel_login_link?sg$.*N*>@R@R@R*T8<4IIIIO /**-44FM4444r2NFNrTr)0r __module__ __qualname__rrrrprwrrCrUrbrrrprrr staticmethodrrrrrr rhrrFrrr r>rrrrrrrrrrrrrrr  __classcell__)rss@r3rmrms_4=?AAAAA2   %%% 2 2 2EEEE)d $HHHH&!!!  \ ###,,,,////***$$$&&& ' '\ '  \  4T ?      !49!!!\!4:5c?:::\:>#c#eTWY\T\o#### Sc3h S S S Ss8###@YY\Y   *s*C***\*55\55555r2rmr)Tr)Fr)k__doc__ __future__rrrrNr.rOryrirYr tracebackrtypingrrr r r urllib.parser clcommon.clpwdr clcommon.clconfparsrr;rrrrrclcommon.constrclcommon.cpapi.cpapiexceptionsrrrrrrrlrrclcommon.utilsrrrr clcommon.cpapi.GeneralPanelr!r"r#clcommon.cpapi.cpapicustombinr$r%rurr/rOr DA_DATA_DIRr<rPr'rQr rqr]rerPescaperFrr4rCrUrbrhrprmrrrrrrrrrrrr>rrrrr r+r4r9rFrUr]rcrkrmr1r2r3r"sl'&&&&&%%%%%%  55555555555555!!!!!! ,,,,,,,,,,,,,,,,""""""YYYYYYcccccccccccc lkkkkkkk   " ',,v6 7 7gll66** W\\&"3 4 4  ['22 gll6=.AA  * GLLg . . i99gll9l33 rz-)")I*>*>>??  FFF    !!!,@###4 A A A JJJ2RRR*@,K,K,K,K^"444TT#s(^D& 9 9 9 9999    888*&444l0QQQ(((V = = =C5C5C5C5C5&C5C5C5C5C5r2