gddlZddlZddlZddlZddlZddlZddlmZmZm Z ddl Z ddl m Z mZddlmZddlmZddlmZmZmZmZdZGdd eZd ZGd d ZGd deZGddeZGddeZGddeZ GddeZ!GddeZ"GddeZ#GddeZ$dS)N)TupleOptionalList)ClPwd mysql_lib)ProcLve)grep)cpanel directadmin ispmanagerplesk0ceZdZdZdS)ConfigDataErrorz Should be raised when something went wrong during user's config data loading/parsing. Supposed to be used when we want to skip some user with broken configuration files N)__name__ __module__ __qualname____doc__py/clcontrollib.pyrrs  DrrctjtjdkrtStjdkrt Stjdkrt Stjdkrt StjdkrtStjdkrtStS)NPleskcPanel InterWorx ISPManager DirectAdmin HostingNG) detect getCPNameCP_NAMErCpanelrrrrUnknownrrrdetect_panelclassr$#s  ~  ww ~!!xx ~$${{ ~%%|| ~&&}} ~$${{ 99rceZdZdZddZdZdZedZ dd Z ed Z edd Z dd Z ddZ ddZddZddZddZddZddZddZddZddZdS) GeneralPanelc4t|_|jj|_t j|_|j|jkr td|jd|jdd|_ dS)NzClass "z" not should be used on panel "") r users_data __class__r class_namerr current_panel_namelower UserWarning cpapi_plugin)selfs r__init__zGeneralPanel.__init__6s''.1"("2"4"4 ? " "d&=&C&C&E&E E Ed$/dd$Jaddd !rFc4|jS)z List all admins names in given control panel :param bool debug: Do produce debug output or don't :return: list of strings )r/adminsr0debugs r list_adminszGeneralPanel.list_adminsAs  '')))rc6|j|S)z| Return True if username is in admin names :param str username: user to check :return: bool )r/is_admin)r0usernames rr8zGeneralPanel.is_adminIs  ))(333rcl|r1tj|d|jjddSdS)Nz is not implemented for  )sysstderrwriter*rr0r5 method_names r_warningzGeneralPanel._warningQsI  b J   ``T^E\``` a a a a a b brcJtjtjd|dS)NzCL_CONTROLLIB: )syslog LOG_WARNING)msgs r _slog_warningzGeneralPanel._slog_warningUs& f(*AC*A*ABBBBBrNTc>||td||td|d |j|S#tj$r7}|rt ||r|d|dYd}~dSd}~wwxYw |jt|dS#tj$r7}|rt ||r|d|dYd}~dSd}~wt$rt dYdSwxYw) aH Check that provided user is really exists in system and return it as: - uid if username was provided - username if uid was provided - None if user doesn't exists Produce syslog/debug output depending on flags if user isn't exists. This helper function is mostly needed because it's possible that user is already deleted in system but his entity is still present in control panel files (like DA_USERS_DIR) so we should do additional checks to skip such users. :return: (uid | username) or None NzIThis function accepts either uid or username, but not both simultaneouslyz0Incorrect call: uid or username is not specifiedzUser with username="z" is not present in the systemrzUser with uid="Incorrect user id) ValueErrorr)get_uidrNoSuchUserExceptionprintrF get_namesint)r0uidr9r5syslog_es r_check_and_get_userz GeneralPanel._check_and_get_userYs ?x3;<< < ;8+OPP P   ..x888,   !HHH&&WxWWWttttt  ?,,SXX66q9 9(    a ""IcIII44444    % & & &44 s5AB ,BB ,B;;D ,C<<DDct|dd5}|}dddn #1swxYwY|S) Safely read file content and close it before return the content string. No exceptions will have caught! :param string file_name: Absolute or relative path to file :rtype: string :return: Content of given file path rutf-8encodingN)open readlines) file_namefcontents rget_file_lineszGeneralPanel.get_file_liness})S7 3 3 3 $qkkmmG $ $ $ $ $ $ $ $ $ $ $ $ $ $ $s 488wct||d5}||ddddS#1swxYwYdS)a= Safely write to file and close it before the function end. No exceptions will have caught! :param string file_name: Absolute or relative path to file :param string content: What to write there :param string open_method: Either "w" or "a" or "b" :return: None rVrWN)rY writelines)r[r] open_methodr\s rwrite_file_lineszGeneralPanel.write_file_liness)[7 ; ; ; "q LL ! ! ! " " " " " " " " " " " " " " " " " "s 6::c2||ddS)a Implements /usr/bin/getcontrolpaneluserspackages and /usr/bin/getcontrolpaneluserspackages --list-all commands Result is stdout output: uid package name :param bool debug: Do produce debug output or don't :return: None zList allNrAr4s rlist_allzGeneralPanel.list_alls eZ(((((rc2||ddS)a  Implements /usr/bin/getcontrolpaneluserspackages --package=package_name Result is stdout output: uid :param string package: Package name :param bool debug: Do produce debug output or don't :return: None zList users in given packageNre)r0packager5s rlist_users_in_packagez"GeneralPanel.list_users_in_packages e:;;;;;rc2||ddS)aX Implements /usr/bin/getcontrolpaneluserspackages --package=package_name --reseller=reseller_name Result is stdout output: uid :param string package: Package name :param string reseller: Reseller name :param bool debug: Do produce debug output or don't :return: None z&List users in given reseller's packageNre)r0rhresellerr5s rlist_users_in_reseller_packagez+GeneralPanel.list_users_in_reseller_packages eEFFFFFrc2||ddS)z Implements /usr/bin/getcontrolpaneluserspackages --userid=id Result is stdout output: uid package name :param int uid: User ID :param bool debug: Do produce debug output or don't :return: None zList given user's packageNrer0rOr5s rlist_user_packagezGeneralPanel.list_user_packages e899999rc2||ddS)z Implements /usr/bin/getcontrolpaneluserspackages --list-packages Result is stdout output: package name :param bool debug: Do produce debug output or don't :return: None zList all packagesNrer4s r list_packageszGeneralPanel.list_packagess e011111rc2||ddS)z Implements /usr/bin/getcontrolpaneluserspackages --list-resellers-packages Result is stdout output: reseller_name package name :param bool debug: Do produce debug output or don't :return: None z!List packages belong to resellersNrer4s rlist_resellers_packagesz$GeneralPanel.list_resellers_packagess e@AAAAArc2||ddS)a' Implements /usr/bin/getcontrolpaneluserspackages --list-reseller-packages=reseller Result is stdout output: package name :param string reseller: Reseller name :param bool debug: Do produce debug output or don't :return: None z&List packages belong to given resellerNrer0rkr5s rlist_reseller_packagesz#GeneralPanel.list_reseller_packagess eEFFFFFrc2||ddS)z Implements /usr/bin/getcontrolpaneluserspackages --list-users Result is stdout output: uid,package name,reseller_name :param bool debug: Do produce debug output or don't :return: None z List usersNrer4s r list_userszGeneralPanel.list_userss e\*****rc#>K||ddVdS)a( Generate triple with uid, it's package, it's reseller :param bool debug: Do produce debug output or don't :param string reseller_name: filter by this reseller :rtype: generator of (int, string, string) :return: (uid, package name, reseller name) zList reseler's users)rrzNre)r0r5 reseller_names r_get_user_packageszGeneralPanel._get_user_packagess* e3444rc|jdkrG||rtddS|||D]\}}}t|d|dSdS)z Print uid and package for defined reseller :param bool debug: Do produce debug output or don't :param reseller: username of reseller :return: None r&NzReseller is not defined)r5r{,)r+rLr|)r0r5rkrOrh_s rlist_reseller_usersz GeneralPanel.list_reseller_userss ?n , ,53444#'#:#:V^#:#_#_ * *Wa((w(()))) - ,  * *rc2||ddS)z Determine user's reseller :param string uid: uid of user :param bool debug: Do produce debug output or don't :rtype: string :return: reseller name zGet user's resellerNrerns r get_resellerzGeneralPanel.get_reseller#s e233333rF)NNFT)r_FN)rrrr1r6r8rA staticmethodrFrRr^rcrfrirlrorqrsrvrxr|rrrrrr&r&4s ! ! !****444bbbCC\CBG$(1111f  \  " " "\ " ) ) ) ) < < < < G G G G : : : : 2 2 2 2 B B B B G G G G + + + +     * * * *444444rr&ceZdZdZdZdZdZdZfdZdZ dZ d Z d Z dd Z dd ZdZddZddZddZddZddZddZddZddZddZxZS)r"z/var/cpanel/usersz/var/cpanel/packagesz/var/cpanel/resellersz/etc/trueuserownersNct|j|_t j|_dSN)superr1r)get_sys_min_uidmin_uidr PanelPluginr/r0r*s rr1zCpanel.__init__6sE 6688 ".00rcd} t|dd5}|}dddn #1swxYwYn#t$r~}d|d|d}||jr|d |z }t |t j ||t j tYd}~nd}~wwxYw|S) rTz]http://kb.cloudlinux.com/2017/08/how-to-fix-the-issue-with-non-utf-symbols-in-packages-names/rUrVrWNUnable to read file 'z ', error is: z-. It looks like you use not an UTF-8 charset.z Please read the instruction: )file) rYrZUnicodeDecodeError startswithUSERDIRrLr<r=rFexitBAD_CODING_ERROR_CODE)r0r[ ENCODING_LINKr\r]rQmessages rr^zCpanel.get_file_lines;sIB  ,iw777 (1++-- ( ( ( ( ( ( ( ( ( ( ( ( ( ( (! , , ,EiEEaEEEG##DL11 ML]LLL ' + + + +   w ' ' ' H* + + + + + + + + ,s3A7 A;A;A C  A4CC cfi}tjd}tj|jrv||j}|D]Y}|}tj||}|.| d|| d<Z|S)z~ Get dict, where keys - user's names, values - reseller's names :return: dict {user1: reseller1, ...} z!^(?P\w+):\s*(?P\w+)$Nownername) recompileospathisfileRESELLERS_AND_USERSr^stripmatchgroup)r0resultpattern file_contentlinestrippedrs r_get_users_resellers_dictz Cpanel._get_users_resellers_dictSs *ABB 7>>$2 3 3 C..t/GHHL$ C C::<<(33=.3kk'.B.Bu{{6**++ rcg}tj|jr&||j}d|D}|S)zw Get resellers list from RESELLERS_PATH :rtype: list :return: list of resellers names cjg|]0}|ddd1S):r)rsplit.0rs r z)Cpanel._get_resellers..xs5PPP4++C33A6PPPr)rrrRESELLERS_PATHr^)r0 resellersrs r_get_resellerszCpanel._get_resellersnsR 7>>$- . . Q..t/BCCLPP<PPPIrc d}tj|rk||}t t dddd|}|r3|ddd}|S)z Get package name from user's config file :param string path: Path to file contains info about cPanel user :rtype: string :return: Package name rzz PLAN\=.*$F fixed_stringmatch_any_positionmultiple_searchdata_from_filer=r)rrrr^listr rr)r0rrhrrs r get_packagezCpanel.get_package{s 7>>$   :..t44L$"#( %+ F : )//++11#66q9rFc d}|||}|rtj|j|}tj|rk||}ttdddd|}|r3|d dd}|r|| vr|ndS) Determine user's reseller based on `owner` field from user's config :param string uid: uid of user :param bool debug: Do produce debug output or don't :rtype: string :return: reseller name rzrOr5z OWNER\=.*$Frrrr) rRrrjoinrrr^rr rrr)r0rOr5rkr9rrrs r _get_resellerzCpanel._get_resellers++5+AA  ?7<< h77Dw~~d## ?#22488 d!!&',$)#/ ?%ay0066s;;A>H#QD4G4G4I4I(I(IxxrQrcNt|||dS)rr5N)rLrrns rrzCpanel.get_resellers+ d  E 2233333rc#rKtj|jrtj|jD]v}tjtj|j|r|dfVKtj|j|dfVudSdS)z Generate list of packages in current panel :rtype: generator of (string, bool) :return: (name of package, True) for normal files and (/path/to/wrang/file, False) otherwise TFN)rrisdir PACKAGEDIRlistdirrr)r0filenames r _get_packageszCpanel._get_packagess 7== ) ) KJt77 K K7>>"',,t"I"IJJK#T*****7<<BBEJJJJJ  K K K Krc|}|D]O\}}|r3d|vr|ddd|vr*t|:|rtd|dPdS)Nrrr Warning:  is not a file.rrrrL)r0r5rris_files rrqzCpanel.list_packagess'')) !%!3!3!5!5 = = Hg =(??x~~c1'='=a'@I'M'Mh =;(;;;<<<  = =rc#~K|}|sdStj|jrtj|jD]} |j|}||jkr) tj |j|}| || ||}| |rdn|}|||kr|| ||fV#tj$r}|rt!|Yd}~d}~wwxYwdSdS)ao Generate triple with uid, it's package and it's reseller for every user in USERDIR which uid is greater than MIN_UID :param bool debug: Do produce debug output or don't :param string reseller_name: filter by this reseller :rtype: generator of (int, string, string) :return: (uid, package name, reseller name) Nrz)rrrrrrr)rJrrgetrr8rrrKrL) r0r5r{users_resellers_dictrrOrrkrQs rr|zCpanel._get_user_packagesst $==??$  F 7== & & BJt|44 B B B/11(;;CT\)) * 7<< h??D377$BTBTUXZ_B`B`aaH%)]]8%<%<Jrr(H$0X5N5N  0 0 6 6AAAAA0!!!!a!  B B B Bs%DD8D33D8c|||D]4\}}}|dkr(|t||||krt|5dS)Nr{rzr|rL)r0rhr5rkrO self_package self_resellers rrfzCpanel.list_allsp040G0G]e0G0f0f   ,C}r!!?#|,,,, ,,#JJJ   rc |jt|}|D]X}|jdz|z}tj|r*||}|dkrt|YdS#tj $r|rtdYdSYdSt$rtdYdSwxYw)N/rzz,getcontrolpaneluserspackages: User not foundrH) r)rMrNrrrrrrLrrKrI)r0rOr5usersuserrrhs rrozCpanel.list_user_packages  'O--c#hh77E ' '|c)D07>>$'''"..t44G"}}g  ' ' ( F F F FDEEEEEE F F F ' ' ' % & & & & & & 's'B C,CCc|}|D]a\}}|rCd|vr?|ddd}||vr,|||kr5t|d|J|s|rtd|dbdS)Nrrr rrr)r0r5rkrrrres_names rrszCpanel.list_resellers_packagess'')) !%!3!3!5!5 = = Hg =3(??#>>#q11!49,,'H,@,@..H..//// = =;(;;;<<< = =rc|}||vr|rtd|ddS|||dS)NzError: z is not resellerr5rk)rrLrs)r0rkr5rs rrvzCpanel.list_reseller_packagessd'')) 9 $ $ <::::;;; F $$58$DDDDDrc .|d|vrN|dtfdtdt DrdS|||dS|rt ddSdS)Nrc3VK|]#}dd|vV$dS)rN)r)ripartsrs r z/Cpanel.list_users_in_package..!s<RR388E"1"I&&)3RRRRRRrrz/getcontrolpaneluserspackages: Undefined package)rranyrangelenrfrL)r0rhr5rrs @@rrizCpanel.list_users_in_packages'')) '>>MM#&&ERRRRRU1c%jj=Q=QRRRRR    MM' " " " " "  E C D D D D D E Erc|}||vr||||dS|rtddSdS)Nrz8getcontrolpaneluserspackages: Undefined reseller package)rrfrL)r0rhrkr5rs rrlz%Cpanel.list_users_in_reseller_package(sf'')) y MM'M B B B B B  N L M M M M M N Nrcl||D]\}}}t|d|d|dSNr~r)r0r5rOrrks rrxzCpanel.list_users/sW+/+B+B5+I+I 6 6 'Cx S44<44(44 5 5 5 5 6 6rrr)NFN)rrrrrrrr)r1r^rrrrrrrqr|rfrorsrvrirlrx __classcell__r*s@rr"r".s!G'J,N/J11111 06   ,RRRR4 4 4 4 4 K K K====BBBBB'''' = = = =EEEE E E E ENNNN66666666rr"c$eZdZdZdZdZdZdZdZdZ dZ e Z fdZ d Zd Zd Zd Zd%d edeeedefdZd&dZd&dZd'dZdZdZdZd'dZd'dZdZd'dZd'dZ d'dZ!d'dZ"d'dZ#d'd Z$d!Z%d"Z&d'd#Z'd'd$Z(xZ)S)(rz"/usr/local/directadmin/data/users/z,/usr/local/directadmin/conf/directadmin.confz,/usr/local/directadmin/data/admin/admin.listz//usr/local/directadmin/data/admin/reseller.listz//usr/local/directadmin/data/admin/packages.listrzNcttj|_t j|_|j|_ dSr) rr1rdetect_DA_adminDA_ADMINr rr/get_encoding_nameENCODINGrs rr1zDirectAdmin.__init__?sT .00 '355);;== rc& t|d|j5}|}dddn #1swxYwY|S#t$r?}d|d|jd}||d|dzt ||d}~wwxYw)NrUrWrz '. It looks like you use not an z charset.z Error is: .)rYrrZrrF RuntimeError)r0r[r\r]rQrs rr^zDirectAdmin.get_file_linesFs /it}=== (++-- ( ( ( ( ( ( ( ( ( ( ( ( ( ( (N! / / /OiOO6:mOOOG   w);q);););; < < <w''Q .  /s4A: A>A>A B:B  Bc ||S#t$r?}d}||||t |d}~wwxYw)zU Just a wrapper around _get_user_info_inner to send errors to syslog z;Skipping user '{}' with bad configuration files due to '{}'N)_get_user_info_inner ExceptionrFformatr)r0r9rQtpls r_get_user_infozDirectAdmin._get_user_infoQsq +,,X66 6 + + +OC   szz(A66 7 7 7!## *  +s A :AA c tj|j|d} ||}n#t $rd}YnwxYw|st dttdddd|}ttdddd|} |d d d }n"#t$r}t d |d}~wwxYw |d d d }n"#t$r}t d |d}~wwxYw| ||} |d kr5d}|j |} || rd} |}|j |} | | |fS)zG Return uid, package name and owner of user (reseller) user.confN&Unable to read any data from user.conf usertype\=.*$Frz creator\=.*$rrrz#No "usertype" record in user configz"No "creator" record in user configrkrzDEFAULT)rrr DA_USERS_DIRr^rrIrr rr IndexError_get_user_packager)rJ_is_reseller_limits_enabled) r0r9 userprofileuserprofile_contentresult_usertyperesult_creatorusertyperQrkrhlvp_idrOs rrz DirectAdmin._get_user_info_inneras, gll4#4h LL  '"&"5"5k"B"B   ' ' '"&    '" GEFF Ft $!.      d $!.       K&q)//1177<HH J J JABB I J((3FGG z ! !H_,,X66F//77 $##o%%h//GX%%s?> A  A $3C C7"C22C7;3D// E9E  Ec6|j|Sr)proc_lve exist_lvp)r0r s rrz'DirectAdmin._is_reseller_limits_enableds}&&v...rr9rreturnc |s`tj|j|d} ||}n#t $rd}YnwxYw|st dttdddd|}ttdddd|} |d d d }n"#t$r}t d |d}~wwxYw|d krY|rW |d d d }n"#t$r}t d |d}~wwxYw|S)z Reads user's package just as in the `_get_user_info_inner` function, but without masking to DEFAULT package Be aware that it may return different package than the `_get_user_info_inner` function rNrz package\=.*$Frzoriginal_package\=.*$rrrz"No "package" record in user configcustomz+No "original_package" record in user config) rrrrr^rrIrr rrr)r0r9rrresult_packageresult_original_packagerhrQs rrzDirectAdmin._get_user_packages # K',,t'8(KPPK +&*&9&9+&F&F## + + +&*### +& K !IJJJd $!.      #'t $$!. ( ( ( # #  J$Q'--//55c::1=GG J J JABB I J h  #:  W1!4::<<BB3GGJ W W W !NOOUVV WsAA AA&3C C9$C44C93D99 EEEFc#4Kt|}tj|jD]Z}||vr||| ||\}}}n#t$rYFwxYw|||krS|||fV[dS)a' Generate triple with uid, it's package, it's reseller :param bool debug: Do produce debug output or don't :param string reseller_name: filter by this reseller :rtype: generator of (int, string, string) :return: (uid, package name, reseller name) r9r5N)setr6rrrrRrr)r0r5r{r6r9rOrhrks rr|zDirectAdmin._get_user_packagess$**,,--  4#455 ) )H;&&'''GGO )-)<)!>1hh"     (OOOOO   5 AAc,||S)z Check login_name is da admin. Backward compatibility wrapper :param login_name: Admin name :return: )r8)r0 login_names r is_da_adminzDirectAdmin.is_da_admins }}Z(((rc zd}tj|j|d}tj|rs||}t tdddd|}|r;|d dd}|dkrd }|S) z Check login_name is da admin for using in hook return True - if login_name is admin False - otherwise FrrrrrradminT) rrrrrr^rr rr)r0rrrrrr s ris_da_admin_for_hookz DirectAdmin.is_da_admin_for_hooksw||D-z;GG 7>>$   "..t44L"4 "#( %+ $$$O "*1-3355;;C@@Cw&&!F rc( ddlm}m}m}m}n3#t $r&t dtjdYnwxYw| }|D]9} t|#|||f$r}t |dYd}~2d}~wwxYwdS)z Add all DA admins to sudoers. Now calls only from CageFS plugin installer :param s_cmd: String such as "Clsudo.add_cagefs_user(user)" :return: r)Clsudo NoSuchUserUnableToReadFileUnableToWriteFilezDCannot import Clsudo. Check if alt-python27-cllib package installed rr;N) clsudor%r&r'r( ImportErrorrLr<rr6eval) r0s_cmdr%r&r'r( da_adminsrrQs radd_all_da_admins_to_sudoersz(DirectAdmin.add_all_da_admins_to_sudoers5s   Y X X X X X X X X X X X X    Y Z Z Z HQKKKKK $$&&   D U  02CD   hhh   s$ -??A++B3B  Bc,||S)z< Wrapper for compatibility with old code )r6r4s rget_all_da_adminszDirectAdmin.get_all_da_adminsIs&&&rcg}tj|jr&||j}d|D}|S)zr Get all DA admins list :rtype: list of strings :return: List of DA admins names c8g|]}|dS)r;rrs rrz+DirectAdmin.list_admins..Ys$DDDtT**DDDr)rrr DA_ADMIN_LISTr^)r0r5r-rs rr6zDirectAdmin.list_adminsOsR 7>>$, - - E..t/ABBLDD|DDDIrc#vK||j}|D]}|dVdSNr;)r^DA_ADMINS_PACKAGESr)r0rrs rrzDirectAdmin._get_packages\sP**4+BCC   $ $D++d## # # # # $ $rcR|D]}t|dSr)rrL)r0r5rs rrqzDirectAdmin.list_packagesas4&&((  D $KKKK  rc\|D]\}}}t||dSrr)r0r5rOrhrs rrfzDirectAdmin.list_alles@#6688  OC! #w      rcj|D]\}}}t|d|d|dSrr)r0r5rOrhrks rrxzDirectAdmin.list_usersisU&*&=&=&?&? 1 1 "C( S//7//X// 0 0 0 0 1 1rc|||}|r= ||\}}}n#t$rYdSwxYwt|dSdS)Nrr)r0rOr5r9rrhs rrozDirectAdmin.list_user_packagems}++5+AA    $ 3 3H = = 7AA"     'NNNNN   rcj|dD]\}}}||krt|dS)Nrzrr)r0rhr5rOpackage_rks rriz!DirectAdmin.list_users_in_packagevsL''b'99   #C87""c   rcj||D]\}}}||krt|dS)Nrr)r0rhrkr5rOr=rs rrlz*DirectAdmin.list_users_in_reseller_package}sL''h'??   C17""c   rc g}tj|jr&||j}d|D}||tt|S)z0 Return list of resellers names c^g|]*}||+Srr3rs rrz.DirectAdmin._get_resellers..s-VVV VdkkmmVVVr) rrrDA_RESELLERS_LISTr^extendr6rr)r0resellers_listrs rrzDirectAdmin._get_resellerss 7>>$0 1 1 W..t/EFFLVV VVVNd..00111C''(((rcg}tj|j|d}tj|r!||}d|D}|S)z Get all packages for giver reseller :param string reseller: Reseller name :rtype: list of strings :return: List of packages names that belongs to given reseller z packages.listc^g|]*}||+Srr3rs rrz6DirectAdmin._get_reseller_packages..s-UUUtt{{}}UT[[]]UUUr)rrrrrr^)r0rk packages_list package_pathrs r_get_reseller_packagesz"DirectAdmin._get_reseller_packagessf w||D$5xQQ 7>>, ' ' V..|<z5DirectAdmin.list_resellers_packages..sV2JS2J2J32J2J2Jrrz)rrHr functoolsreducerrL)r0r5first_exceptionrkpackagesrQ out_strings rrsz#DirectAdmin.list_resellers_packagess++--  H 66x@@   "*&'O  #)(0JJJegg  *      &! ! ' &s0 AAAcptd||dSr6)rLrrHrus rrvz"DirectAdmin.list_reseller_packagess0 dii33H==>>?????rrrr)*rrrrDA_CONFr4rAr7rrr)rr r1r^rrrstrrrrr|rrr r#r.r0r6rrqrfrxrorirlrrHrsrvrrs@rrr4sJ7L>>>> / / /+++ 8&8&8&t///''#'HTRUYDW'cf''''R))))8&&&&8 )))<   (''''    $$$     1111 ) ) )   """"(@@@@@@@@rrceZdZdZdS)ISPManagerGetPackagesExceptionc<t||dSr)rr1)r0rs rr1z'ISPManagerGetPackagesException.__init__s4)))))rN)rrrr1rrrrWrWs#*****rrWcpeZdZdZdZdZfdZdZed dZ d dZ d d Z d d Z d d Z d d ZxZS)rz!/usr/local/ispmgr/etc/ispmgr.confN mgrsecurec@ttjtjd}t |d|_tj|_ tj |_ dS)Nrr) rr1rgetCP CP_VERSIONrrN isp_major_verispmanager5_is_masterisp5_is_masterr rr/)r0 ver_partsr*s rr1zISPManager.__init__sv  %++C00  1..$:<<&244rc i}|jdkrtj|jst d|j t |jdd5}|}dddn #1swxYwY|d}| d|D]}|d}t|j | d d }|d }|D]}|d rvd |dd}||vr||d zt#|z||<t#|||<n#t$t&f$r-}t d|jdt#||d}~wwxYw t)j|jj} | D]7} |j | }d||<##t0j$rY4wxYwn#t4$rYnwxYw|S)z Retrives list of pairs "uid - package" :return: Dictionary: uid -> package_name Example: {512: 'custom', 513: 'test1'} Case 2: (Error): (1, "error message") zERROR: Can't read rUrVrWNAccountrr(rzr;Presetrrz - default)r^rrr ISP4_CONFrWrYreadrpoprNr)rJreplacerrrrUOSErrorIOErrorgrpgetgrnamISP5_GRPgr_memrrKKeyError) r0dict_uid_packager\linesrrOline1pkg_namerQ panel_usersrs r_get_user_packages_dictz"ISPManager._get_user_packages_dicts   " "7>>$.11 \45Z$.5Z5Z[[[ $.#@@@%AFFHHE%%%%%%%%%%%%%%% I.. ! ! F FD**,,q/Cdo55ckk$6K6KLLMMC::d++D!%FF ;;==33H==F'*xx 0C0C0E0Eabb0I'J'JH"&6668H8MPS8SVYZbVcVc8c 0 5 58;H 0 5 F FW%   4DDDCFFDD  !l4=99@ 'D"o55d;;09(-- 4      ss G "B7 G BG B EG H (HH "I'1II'I# I'"I##I'' I43I4Fc(d}t|dS)z Get reseller name from user's config file :param string uid: uid of user :param bool debug: Do produce debug output or don't :rtype: string :return: reseller name r"N)rL)clsrOr5rks rrzISPManager.get_resellers hrc  |}t|D]}t|dS#t$r.}t|t jdYd}~dSd}~wwxYwNr)rwrvaluesrLrWr<r)r0r5rrrhrQs rrqzISPManager.list_packagess #;;== /668899  g  -    !HHH HQKKKKKKKKK sAA B#A>>Bc |}|D]'\}}tt|dz|z(dS#t$r.}t|t jdYd}~dSd}~wwxYw)NrrrwitemsrLrUrWr<rr0r5rrrOrhrQs rrfzISPManager.list_alls #;;==  0 6 6 8 8 0 0 Wc#hhnw.//// 0 0-    !HHH HQKKKKKKKKK AA B #BB c0 t|}|}||vrt||dSdS#t$r.}t|t jdYd}~dSd}~wt $rtdYdSwxYw)NrrH)rNrwrLrWr<rrI)r0rOr5rrrQs rrozISPManager.list_user_packages 'c((C#;;== &&&&s+,,,,,'&-    !HHH HQKKKKKKKKK ' ' ' % & & & & & & 's>N> +9 >>>E ,,UE)4D4DEEF (!!9Q< H''bbX66666rcl||}|D]\}}}t|d|dS)z Print info about user's packages (include resellers) :param bool debug: Do produce debug output or don't :return: pairs "uid package", where uid - unique id of user package - name of user's package rrNr)r0r5rrOrhrs rrfzPlesk.list_allsY''e'44!& & & S'1 S$$7$$ % % % % & &rcr||}|D]\}}}t|d|d|dS)aF Print info about user's packages (include resellers) and thouse resellers :param bool debug: Do produce debug output or don't :return: triples "uid,package,reseller", where uid - unique id of user package - name of user's package reseller - name of package's reseller rr~Nr)r0r5rrOrhrks rrxzPlesk.list_userssa''e'44(- 1 1 $S'8 S//7//X// 0 0 0 0 1 1rcg} |jt|}|D]8}|||}|d|D9nG#t j$r}|rt|Yd}~n"d}~wt$rtdYnwxYw|D]}t|dS)z Print all packages for user's uid :param uid: user's unique id :param bool debug: Do produce debug output or don't :return: package name for user's uid )r5r9cg|] }|d S)rrrs rrz+Plesk.list_user_package..s < < O--c#hh77E > >00ut0LL < (    a ' ' ' % & & & & & '    G 'NNNN  s'A''B+6B  B+*B+cd|d|jd}||D]/}t|j|d0dS)z Print all users in package :param package: name of package :param bool debug: Do produce debug output or don't :return: user's uid a SELECT t5.login FROM psa.Templates AS t1 JOIN psa.PlansSubscriptions AS t2 ON t2.plan_id = t1.id JOIN psa.Subscriptions AS t3 ON t3.id = t2.subscription_id JOIN psa.domains AS t4 ON t4.id = t3.object_id JOIN psa.hosting AS t6 ON t6.dom_id = t4.id RIGHT JOIN psa.sys_users AS t5 ON t6.sys_user_id = t5.id WHERE t1.name = 'z' AND t1.owner_id = z! AND t1.type = 'domain'; rN)rrrLr)rJ)r0rhr5rlogins rrizPlesk.list_users_in_packages|  "   8<}    ,,U33 5 5E $/))%(33 4 4 4 4 5 5rcd|d}||}t|dkrdSt|dd}d|d|d}||}|D]l} |j|d} t t | @#tj$r} |rt | Yd} ~ ed} ~ wwxYwdS) z Print info about users in resellers package :param package: package name :param reseller: name of package's reseller :param bool debug: Do produce debug output or don't :return: users uids z@SELECT id FROM psa.clients WHERE type = 'reseller' AND login = ''rNra SELECT t5.login FROM psa.Templates AS t1 JOIN psa.PlansSubscriptions AS t2 ON t2.plan_id = t1.id JOIN psa.Subscriptions AS t3 ON t3.id = t2.subscription_id JOIN psa.domains AS t4 ON t4.id = t3.object_id JOIN psa.hosting AS t6 ON t6.dom_id = t4.id RIGHT JOIN psa.sys_users AS t5 ON t6.sys_user_id = t5.id WHERE t1.type = 'domain' AND t1.name = 'z' AND t1.owner_id = 'z '; ) rrrNr)rJrLrUrrK) r0rhrkr5reseller_query reseller_idrrrluidrQs rrlz$Plesk.list_users_in_reseller_packages$l^fkkk--n== {  q F+a.+,,   6=   T_    ((// ! !D !..tAw77 c$ii    ,   !HHH  ! !s/ B,,C;CCcd|jd}||D]4}|d}|ddkrdn|d}t|d|5dS) z Print list of resellers packages :param bool debug: Do produce debug output or don't :return: pairs "reseller package", where package - package name reseller - package's reseller zSELECT t2.login, t1.name FROM (SELECT name, owner_id, type FROM psa.Templates) AS t1 JOIN psa.clients AS t2 ON t1.owner_id = t2.id WHERE t1.owner_id != z AND t1.type = 'domain';rrr"rootrNr)r0r5rrrhrks rrszPlesk.list_resellers_packagessH#mHHH++E22 + +D1gG!%aG!3!3vvaH X)))) * * * * + +rrcg}d}||D]M}|d}|ddkrdn|d}|d}|||t|fN|S)z Return list of non-reseller packages with the plesk DB id [(reseller, package, plesk_id), (None, package, plesk_id)] zSELECT t2.login, t1.name, t1.id FROM (SELECT id, name, owner_id, type FROM psa.Templates) AS t1 JOIN psa.clients AS t2 ON t1.owner_id = t2.id WHERE t1.type = 'domain';rrr"r)rappendrN)r0rLrrrhrk_ids rlist_domain_packages_with_idz"Plesk.list_domain_packages_with_id2s %++E22 6 6D1gG!%aG!3!3vvaHq'C JJ'3s884 5 5 5 5 r package_idcPd}|||f}|ddS)z8 Return package name by the plesk DB id z7SELECT id, name, type FROM psa.Templates WHERE id = %s;rrr)r0rrrs r$get_package_name_by_id_from_plesk_dbz*Plesk.get_package_name_by_id_from_plesk_dbCs/J&&uzm<<Awqzr package_namecPd}|||f}|ddS)z8 Return package id by the plesk DB name z9SELECT id, name, type FROM psa.Templates WHERE name = %s;rr)r0rrrs r$get_package_id_by_name_from_plesk_dbz*Plesk.get_package_id_by_name_from_plesk_dbKs/L&&u|o>>Awqzrc|dkrd}tjd|sdSd|d|jd}||D]}t |ddS) z Print list reseller's packages :param reseller: name of reseller :param bool debug: Do produce debug output or don't :return: packages names rr"z^[\w_]*$NzSELECT t1.name FROM (SELECT name, owner_id, type FROM psa.Templates) as t1 JOIN psa.clients as t2 ON t1.owner_id = t2.id AND t2.login = 'z6' WHERE t1.type = 'domain' AND t1.owner_id != ;r)rrrrrL)r0rkr5rrs rrvzPlesk.list_reseller_packagesSs v  Hx X.. 4HGOHH6:]HHH++E22  D $q'NNNN  rcdgS)Nr"rr4s rr6zPlesk.list_adminsgs yrr)FNNr)rrrrrrrr)r1rr|rqrUboolrrfrxrorirlrsrrrrNrrrrvr6rrs@rrr:s(JHJJ00000 4 4 4 43-3-3-3-j"777D7777. & & & & 1 1 1 125555.!!!!!!!!F++++&d5#S9P3Q.R"ss(rrceZdZdZdS)rcp|rtjdtjddS)Nz"Doesn't support InterWorx anymore r)r<r=r>rr?s rrAzInterWorx._warningls3  D J  B C C C  rNrrrrArrrrrks#rrceZdZdZdS)r#c&t|d)Nz% wasn't implemented for Unknown panelNotImplementedErrorr?s rrAzUnknown._warningss!["W"W"WXXXrNrrrrr#r#rs(YYYYYrr#ceZdZdZdS)rc&t|d)Nz' wasn't implemented for HostingNG panelrr?s rrAzHostingNG._warningxs!["Y"Y"YZZZrNrrrrrrws([[[[[rr)%rmrrr<rCrNtypingrrr cldetectlibrclcommonrrclcommon.clprocrclcommon.utilsr clcommon.cpapi.pluginsr r r r rrrr$r&r"rrWrrrr#rrrrrs ((((((((((%%%%%%%%######IIIIIIIIIIII     i   "w4w4w4w4w4w4w4w4tC6C6C6C6C6\C6C6C6L@@@@@,@@@D *****Y*** ||||||||~nnnnnLnnnb  YYYYYlYYY [[[[[ [[[[[r